Esempio n. 1
1
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_);
}
Esempio n. 2
1
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;
}
Esempio n. 3
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;
}
Esempio n. 4
0
	bool LinkToInterior(int interiorid) const
		{ return LinkVehicleToInterior(id_, interiorid); }
Esempio n. 5
0
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;
}