void PlayerHandler::TeleportPlayer(int playerid, WorldPositionObject pos) { SetPlayerVirtualWorld(playerid, pos.virtualWorld_); SetPlayerInterior(playerid, pos.sampInteriorId_); SetPlayerPos(playerid, pos.x_, pos.y_, pos.z_); if (GetPlayerState(playerid) == 2) { int vehicleId = GetPlayerVehicleID(playerid); LinkVehicleToInterior(vehicleId, pos.sampInteriorId_); SetVehicleVirtualWorld(vehicleId, pos.virtualWorld_); SetVehiclePos(vehicleId, pos.x_, pos.y_, pos.z_); PutPlayerInVehicle(playerid, vehicleId, 0); } SetPVarInt(playerid, "oldinterior", GetPVarInt(playerid, "currentinterior")); SetPVarInt(playerid, "currentinterior", pos.interiorId_); }
cell AMX_NATIVE_CALL Natives::PutPlayerInDynamicVehicle(AMX *amx, cell *params) { CHECK_PARAMS(3, "PutPlayerInDynamicVehicle"); int playerid = static_cast<int>(params[1]); int vehicleid = static_cast<int>(params[2]); int seatid = static_cast<int>(params[3]); boost::unordered_map<int, Player>::iterator p = core->getData()->players.find(playerid); if (p != core->getData()->players.end()) { boost::unordered_map<int, Item::SharedVehicle>::iterator v = core->getData()->vehicles.find(vehicleid); if (v != core->getData()->vehicles.end()) { boost::unordered_map<int, int>::iterator i = core->getData()->internalVehicles.find(v->first); if (i == core->getData()->internalVehicles.end()) { int internalID = INVALID_VEHICLE_ID; switch(v->second->modelID) { case 537: case 538: { //internalID = AddStaticVehicle(v->second->modelID, v->second->position[0], v->second->position[1], v->second->position[2], v->second->angle, v->second->color1, v->second->color2); // TODO - This won't work properly without modifing train handling in samp server // If you create train, then you create 4 vehicle - the base model ID has been returned, but the last 3 trailer not and you can't get these IDs - only when these ids are in sequence // but these IDs won't be in sequence when server randomly destroy and create vehicles at different ids - for more info: http://pastebin.com/wZsiVHBr break; } default: { internalID = CreateVehicle(v->second->modelID, v->second->position[0], v->second->position[1], v->second->position[2], v->second->angle, v->second->color1, v->second->color2, -1, v->second->spawn.addsiren); break; } } if (internalID == INVALID_VEHICLE_ID) { return 0; } if (!v->second->numberplate.empty()) { SetVehicleNumberPlate(internalID, v->second->numberplate.c_str()); } if(v->second->interior) { LinkVehicleToInterior(internalID, v->second->interior); } if(v->second->worldID) { SetVehicleVirtualWorld(internalID, v->second->worldID); } if (!v->second->carmods.empty()) { for (std::vector<int>::iterator c = v->second->carmods.begin(); c != v->second->carmods.end(); c++) { AddVehicleComponent(internalID, *c); } } if (v->second->paintjob != 4) { ChangeVehiclePaintjob(internalID, v->second->paintjob); } if(v->second->panels != 0 || v->second->doors != 0 || v->second->lights != 0|| v->second->tires != 0) { UpdateVehicleDamageStatus(internalID, v->second->panels, v->second->doors, v->second->lights, v->second->tires); } if (v->second->health != 1000.0f) { SetVehicleHealth(internalID, v->second->health); } if(v->second->params.engine != VEHICLE_PARAMS_UNSET || v->second->params.lights != VEHICLE_PARAMS_UNSET || v->second->params.alarm != VEHICLE_PARAMS_UNSET || v->second->params.doors != VEHICLE_PARAMS_UNSET || v->second->params.bonnet != VEHICLE_PARAMS_UNSET || v->second->params.boot != VEHICLE_PARAMS_UNSET || v->second->params.objective != VEHICLE_PARAMS_UNSET) { SetVehicleParamsEx(internalID, v->second->params.engine, v->second->params.lights, v->second->params.alarm, v->second->params.doors, v->second->params.bonnet, v->second->params.boot, v->second->params.objective); } if(v->second->params.cardoors.driver != VEHICLE_PARAMS_UNSET || v->second->params.cardoors.passenger != VEHICLE_PARAMS_UNSET || v->second->params.cardoors.backleft != VEHICLE_PARAMS_UNSET || v->second->params.cardoors.backright != VEHICLE_PARAMS_UNSET) { SetVehicleParamsCarDoors(internalID, v->second->params.cardoors.driver, v->second->params.cardoors.passenger, v->second->params.cardoors.backleft, v->second->params.cardoors.backright); } if(v->second->params.carwindows.driver != VEHICLE_PARAMS_UNSET || v->second->params.carwindows.passenger != VEHICLE_PARAMS_UNSET || v->second->params.carwindows.backleft != VEHICLE_PARAMS_UNSET || v->second->params.carwindows.backright != VEHICLE_PARAMS_UNSET) { SetVehicleParamsCarWindows(internalID, v->second->params.carwindows.driver, v->second->params.carwindows.passenger, v->second->params.carwindows.backleft, v->second->params.carwindows.backright); } if(internalID != INVALID_VEHICLE_ID) { PutPlayerInVehicle(playerid, internalID, seatid); core->getData()->internalVehicles.insert(std::make_pair(v->first, internalID)); } else { return 0; } } else { PutPlayerInVehicle(playerid, i->second, seatid); } if (!v->second->touched) { v->second->touched = true; v->second->used = true; core->getStreamer()->movingVehicles.insert(v->second); } v->second->lastUpdatedTick = GetTickCount(); return 1; } } return 0; }
cell AMX_NATIVE_CALL Natives::LinkDynamicVehicleToInterior(AMX *amx, cell *params) { CHECK_PARAMS(2, "LinkDynamicVehicleToInterior"); boost::unordered_map<int, Item::SharedVehicle>::iterator v = core->getData()->vehicles.find(static_cast<int>(params[1])); if (v != core->getData()->vehicles.end()) { v->second->interior = static_cast<int>(params[2]); boost::unordered_map<int, int>::iterator i = core->getData()->internalVehicles.find(v->first); if (i != core->getData()->internalVehicles.end()) { LinkVehicleToInterior(i->second, v->second->interior); } return 1; } return 0; }
bool LinkToInterior(int interiorid) const { return LinkVehicleToInterior(id_, interiorid); }
cell AMX_NATIVE_CALL Natives::SetDynamicVehicleToRespawn(AMX *amx, cell *params) { CHECK_PARAMS(1, "SetDynamicVehicleToRespawn"); boost::unordered_map<int, Item::SharedVehicle>::iterator v = core->getData()->vehicles.find(static_cast<int>(params[1])); if (v != core->getData()->vehicles.end()) { Eigen::Vector3f position = v->second->position; v->second->position = v->second->spawn.position; v->second->angle = v->second->spawn.angle; v->second->color1 = v->second->spawn.color1; v->second->color2 = v->second->spawn.color2; v->second->paintjob = 4; // In GTA, you can use 0 - 3 IDs for paintjobs, 4 is invalid v->second->health = 1000.0f; v->second->carmods.clear(); if (v->second->touched) { v->second->touched = false; v->second->used = true; core->getStreamer()->movingVehicles.erase(v->second); } v->second->spawnedTick = GetTickCount(); // Reset vehicle damage v->second->panels = 0; v->second->doors = 0; v->second->lights = 0; v->second->tires = 0; // Set vehicle parameters as unset v->second->params.engine = VEHICLE_PARAMS_UNSET; v->second->params.lights = VEHICLE_PARAMS_UNSET; v->second->params.alarm = VEHICLE_PARAMS_UNSET; v->second->params.doors = VEHICLE_PARAMS_UNSET; v->second->params.bonnet = VEHICLE_PARAMS_UNSET; v->second->params.boot = VEHICLE_PARAMS_UNSET; v->second->params.objective = VEHICLE_PARAMS_UNSET; v->second->params.siren = VEHICLE_PARAMS_UNSET; v->second->params.cardoors.driver = VEHICLE_PARAMS_UNSET; v->second->params.cardoors.passenger = VEHICLE_PARAMS_UNSET; v->second->params.cardoors.backleft = VEHICLE_PARAMS_UNSET; v->second->params.cardoors.backright = VEHICLE_PARAMS_UNSET; v->second->params.carwindows.driver = VEHICLE_PARAMS_UNSET; v->second->params.carwindows.passenger = VEHICLE_PARAMS_UNSET; v->second->params.carwindows.backleft = VEHICLE_PARAMS_UNSET; v->second->params.carwindows.backright = VEHICLE_PARAMS_UNSET; boost::unordered_map<int, int>::iterator i = core->getData()->internalVehicles.find(v->first); if (i != core->getData()->internalVehicles.end()) { SetVehicleToRespawn(i->second); SetVehiclePos(i->second, v->second->position[0], v->second->position[1], v->second->position[2]); SetVehicleZAngle(i->second, v->second->angle); LinkVehicleToInterior(i->second, v->second->interior); SetVehicleVirtualWorld(i->second, v->second->worldID); } else { for (std::set<AMX*>::iterator a = core->getData()->interfaces.begin(); a != core->getData()->interfaces.end(); ++a) { int amxIndex = 0; if (!amx_FindPublic(*a, "OnDynamicVehicleSpawn", &amxIndex)) { amx_Push(*a, static_cast<cell>(v->first)); amx_Exec(*a, NULL, amxIndex); } } } if (position[0] != v->second->position[0] || position[1] != v->second->position[1]) { if (v->second->cell) { core->getGrid()->removeVehicle(v->second, true); } } return 1; } return 0; }