cell AMX_NATIVE_CALL Natives::SetDynamicVehicleZAngle(AMX *amx, cell *params)
{
	CHECK_PARAMS(2, "SetDynamicVehicleZAngle");
	boost::unordered_map<int, Item::SharedVehicle>::iterator v = core->getData()->vehicles.find(static_cast<int>(params[1]));
	if (v != core->getData()->vehicles.end())
	{
		float angle = amx_ctof(params[2]);
		boost::unordered_map<int, int>::iterator i = core->getData()->internalVehicles.find(v->first);
		if (i != core->getData()->internalVehicles.end())
		{
			SetVehicleZAngle(i->second, angle);
		}
		else
		{
			v->second->angle = angle;
		}
		return 1;
	}
	return 0;
}
Exemple #2
0
	bool SetZAngle(float z_angle) const
		{ return SetVehicleZAngle(id_, z_angle); }
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;
}