Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info
  • Новые темы в этом разделе публикуются автоматически при добавлении файла в менеджер ресурсов.
    Ручное создание новых тем невозможно.

Fuel System

Mathian

Мастер

Автор: rootcause

PHP:
#define 	FILTERSCRIPT
#include 	<a_samp>        // SA-MP Team
#include    <evf>           // http://forum.wiki.pawno-info.ru/showthread.php?t=486060 - Emmet_
#include    <evi>           // http://forum.wiki.pawno-info.ru/showthread.php?t=438678 - Vince
#include    <progress2>     // http://forum.wiki.pawno-info.ru/showthread.php?t=537468 - [HLF]Southclaw
#include    <streamer>      // http://forum.wiki.pawno-info.ru/showthread.php?t=102865 - Incognito
#include    <zcmd>          // http://forum.wiki.pawno-info.ru/showthread.php?t=91354  - Zeex

#define     MAX_GAS_PUMPS       (78)
#define     UPDATE_RATE     	(1000)      // Fuel consume rate in milliseconds. (Default: 1000)
#define     LITRE_PRICE         (3)         // Pretty obvious I guess. (Default: 3)

enum    e_pump
{
	Float: pumpX,
	Float: pumpY,
	Float: pumpZ,
	pumpUser,
	Text3D: pumpLabel
}

new
	Float: PumpData[MAX_GAS_PUMPS][e_pump] = {
		{-85.2422, -1165.0312, 2.6328},
		{-90.1406, -1176.6250, 2.6328},
		{-92.1016, -1161.7891, 2.9609},
		{-97.0703, -1173.7500, 3.0312},
		{1941.6562, -1767.2891, 14.1406},
		{1941.6562, -1771.3438, 14.1406},
		{1941.6562, -1774.3125, 14.1406},
		{1941.6562, -1778.4531, 14.1406},
		{-1327.0312, 2685.5938, 49.4531},
		{-1327.7969, 2680.1250, 49.4531},
		{-1328.5859, 2674.7109, 49.4531},
		{-1329.2031, 2669.2812, 49.4531},
		{-1464.9375, 1860.5625, 31.8203},
		{-1465.4766, 1868.2734, 31.8203},
		{-1477.6562, 1859.7344, 31.8203},
		{-1477.8516, 1867.3125, 31.8203},
		{-1600.6719, -2707.8047, 47.9297},
		{-1603.9922, -2712.2031, 47.9297},
		{-1607.3047, -2716.6016, 47.9297},
		{-1610.6172, -2721.0000, 47.9297},
		{-1665.5234, 416.9141, 6.3828},
		{-1669.9062, 412.5312, 6.3828},
		{-1672.1328, 423.5000, 6.3828},
		{-1675.2188, 407.1953, 6.3828},
		{-1676.5156, 419.1172, 6.3828},
		{-1679.3594, 403.0547, 6.3828},
		{-1681.8281, 413.7812, 6.3828},
		{-1685.9688, 409.6406, 6.3828},
		{-2241.7188, -2562.2891, 31.0625},
		{-2246.7031, -2559.7109, 31.0625},
		{-2410.8047, 970.8516, 44.4844},
		{-2410.8047, 976.1875, 44.4844},
		{-2410.8047, 981.5234, 44.4844},
		{1378.9609, 461.0391, 19.3281},
		{1380.6328, 460.2734, 19.3281},
		{1383.3984, 459.0703, 19.3281},
		{1385.0781, 458.2969, 19.3281},
		{603.4844, 1707.2344, 6.1797},
		{606.8984, 1702.2188, 6.1797},
		{610.2500, 1697.2656, 6.1797},
		{613.7188, 1692.2656, 6.1797},
		{617.1250, 1687.4531, 6.1797},
		{620.5312, 1682.4609, 6.1797},
		{624.0469, 1677.6016, 6.1797},
		{655.6641, -558.9297, 15.3594},
		{655.6641, -560.5469, 15.3594},
		{655.6641, -569.6016, 15.3594},
		{655.6641, -571.2109, 15.3594},
		{1590.3516, 2193.7109, 11.3125},
		{1590.3516, 2204.5000, 11.3125},
		{1596.1328, 2193.7109, 11.3125},
		{1596.1328, 2204.5000, 11.3125},
		{1602.0000, 2193.7109, 11.3125},
		{1602.0000, 2204.5000, 11.3125},
		{2109.0469, 914.7188, 11.2578},
		{2109.0469, 925.5078, 11.2578},
		{2114.9062, 914.7188, 11.2578},
		{2114.9062, 925.5078, 11.2578},
		{2120.8203, 914.7188, 11.2578},
		{2120.8203, 925.5078, 11.2578},
		{2141.6719, 2742.5234, 11.2734},
		{2141.6719, 2753.3203, 11.2734},
		{2147.5312, 2742.5234, 11.2734},
		{2147.5312, 2753.3203, 11.2734},
		{2153.3125, 2742.5234, 11.2734},
		{2153.3125, 2753.3203, 11.2734},
		{2196.8984, 2470.2500, 11.3125},
		{2196.8984, 2474.6875, 11.3125},
		{2196.8984, 2480.3281, 11.3125},
		{2207.6953, 2470.2500, 11.3125},
		{2207.6953, 2474.6875, 11.3125},
		{2207.6953, 2480.3281, 11.3125},
		{2634.6406, 1100.9453, 11.2500},
		{2634.6406, 1111.7500, 11.2500},
		{2639.8750, 1100.9609, 11.2500},
		{2639.8750, 1111.7500, 11.2500},
		{2645.2500, 1100.9609, 11.2500},
		{2645.2500, 1111.7500, 11.2500}
	};

new
	UsingPumpID[MAX_PLAYERS] = {-1, ...},
	RefuelTimer[MAX_PLAYERS] = {-1, ...},
	Float: FuelBought[MAX_PLAYERS],
	PlayerText: FuelText[MAX_PLAYERS],
	PlayerBar: FuelBar[MAX_PLAYERS] = {INVALID_PLAYER_BAR_ID, ...};

new
	Float: Fuel[MAX_VEHICLES] = {100.0, ...},
	Float: VehicleLastCoords[MAX_VEHICLES][3];

Pump_Update(id)
{
    new string[96];
	format(string, sizeof(string), "Gas Pump\n\n{2ECC71}$%d / Litre\n%s/refuel", LITRE_PRICE, (IsPlayerConnected(PumpData[id][pumpUser])) ? ("{E74C3C}") : ("{FFFFFF}"));
	return UpdateDynamic3DTextLabelText(PumpData[id][pumpLabel], 0xF1C40FFF, string);
}

Pump_Closest(playerid, Float: range = 6.0)
{
	new id = -1, Float: dist = range, Float: tempdist;
	for(new i; i < MAX_GAS_PUMPS; i++)
	{
	    tempdist = GetPlayerDistanceFromPoint(playerid, PumpData[i][pumpX], PumpData[i][pumpY], PumpData[i][pumpZ]);

	    if(tempdist > range) continue;
		if(tempdist <= dist)
		{
			dist = tempdist;
			id = i;
		}
	}

	return id;
}

Fuel_InitPlayer(playerid)
{
	UsingPumpID[playerid] = -1;
	RefuelTimer[playerid] = -1;
	FuelBought[playerid] = 0.0;

	FuelText[playerid] = CreatePlayerTextDraw(playerid, 40.000000, 305.000000, "~b~~h~Refueling...~n~~n~~w~Price: ~g~~h~$0 ~y~~h~(0.00L)");
	PlayerTextDrawBackgroundColor(playerid, FuelText[playerid], 255);
	PlayerTextDrawFont(playerid, FuelText[playerid], 1);
	PlayerTextDrawLetterSize(playerid, FuelText[playerid], 0.240000, 1.100000);
	PlayerTextDrawColor(playerid, FuelText[playerid], -1);
	PlayerTextDrawSetOutline(playerid, FuelText[playerid], 1);
	PlayerTextDrawSetProportional(playerid, FuelText[playerid], 1);
	PlayerTextDrawSetSelectable(playerid, FuelText[playerid], 0);

	FuelBar[playerid] = CreatePlayerProgressBar(playerid, 498.0, 104.0, 113.0, 6.2, 0xF1C40FFF, 100.0, 0);
	return 1;
}

Fuel_ResetPlayer(playerid)
{
	if(UsingPumpID[playerid] != -1)
	{
	    PumpData[ UsingPumpID[playerid] ][pumpUser] = INVALID_PLAYER_ID;
	    Pump_Update(UsingPumpID[playerid]);
	}

	if(RefuelTimer[playerid] != -1)
	{
	    KillTimer(RefuelTimer[playerid]);
	    RefuelTimer[playerid] = -1;

	    PlayerTextDrawHide(playerid, FuelText[playerid]);
	}

    UsingPumpID[playerid] = -1;
 	FuelBought[playerid] = 0.0;
	return 1;
}

Vehicle_StartEngine(vehicleid)
{
	if(Fuel[vehicleid] < 0.1) return 0;
	SetVehicleParams(vehicleid, VEHICLE_TYPE_ENGINE, 1);
	return 1;
}

Vehicle_IsANoFuelVehicle(model)
{
	switch(model)
	{
		case 481, 509, 510: return 1;
		default: return 0;
	}

	return 0;
}

Float: Vehicle_GetSpeed(vehicleid)
{
    new Float: vx, Float: vy, Float: vz, Float: vel;
	vel = GetVehicleVelocity(vehicleid, vx, vy, vz);
	vel = (floatsqroot(((vx*vx)+(vy*vy))+(vz*vz)) * 181.5);
	return vel;
}

public OnFilterScriptInit()
{
	ManualVehicleEngineAndLights();

	for(new i; i < MAX_GAS_PUMPS; i++)
	{
	    PumpData[i][pumpUser] = INVALID_PLAYER_ID;
	    PumpData[i][pumpLabel] = CreateDynamic3DTextLabel("Gas Pump", 0xF1C40FFF, PumpData[i][pumpX], PumpData[i][pumpY], PumpData[i][pumpZ] + 0.75, 7.5);
	    Pump_Update(i);
	}

	for(new i, p = GetPlayerPoolSize(); i <= p; i++)
	{
	    if(!IsPlayerConnected(i)) continue;
	    Fuel_InitPlayer(i);
	}

	for(new i, v = GetVehiclePoolSize(); i <= v; i++)
	{
	    if(!IsValidVehicle(i)) continue;
		if(Vehicle_IsANoFuelVehicle( GetVehicleModel(i) )) SetVehicleParams(i, VEHICLE_TYPE_ENGINE, 1);
	}

	SetTimer("ConsumeFuel", UPDATE_RATE, true);
	return 1;
}

public OnFilterScriptExit()
{
	for(new i, p = GetPlayerPoolSize(); i <= p; i++)
	{
	    if(!IsPlayerConnected(i)) continue;
	    Fuel_ResetPlayer(i);
	    HidePlayerProgressBar(i, FuelBar[i]);
	}

	return 1;
}

public OnPlayerConnect(playerid)
{
	Fuel_InitPlayer(playerid);
	return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
	Fuel_ResetPlayer(playerid);
	return 1;
}

public OnVehicleSpawn(vehicleid)
{
	Fuel[vehicleid] = 100.0;
	return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
	if(newstate == PLAYER_STATE_DRIVER)
	{
	    new id = GetPlayerVehicleID(playerid);
	    if(Vehicle_IsANoFuelVehicle( GetVehicleModel(id) )) return SetVehicleParams(id, VEHICLE_TYPE_ENGINE, 1);
	    SendClientMessage(playerid, -1, "You can start/stop the engine by pressing N.");
		ShowPlayerProgressBar(playerid, FuelBar[playerid]);
		SetPlayerProgressBarValue(playerid, FuelBar[playerid], Fuel[id]);
		GetVehiclePos(GetPlayerVehicleID(playerid), VehicleLastCoords[id][0], VehicleLastCoords[id][1], VehicleLastCoords[id][2]);
	}

	if(oldstate == PLAYER_STATE_DRIVER)
	{
	    Fuel_ResetPlayer(playerid);
		HidePlayerProgressBar(playerid, FuelBar[playerid]);
	}

	return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
	if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER && (newkeys & KEY_NO))
	{
	    new id = GetPlayerVehicleID(playerid);
	    if(Vehicle_IsANoFuelVehicle( GetVehicleModel(id) )) return 1;

	    if(GetVehicleParams(id, VEHICLE_TYPE_ENGINE)) {
	        SetVehicleParams(id, VEHICLE_TYPE_ENGINE, 0);
	    }else{
	        Vehicle_StartEngine(id);

	        if(UsingPumpID[playerid] != -1)
	        {
	            new Float: x, Float: y, Float: z;
	            GetPlayerPos(playerid, x, y, z);
	            CreateExplosionForPlayer(playerid, x, y, z, 6, 8.0);
			}
	    }
	}

	return 1;
}

public OnPlayerUpdate(playerid)
{
	if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
	{
		new vid = GetPlayerVehicleID(playerid);
	    if(GetPVarInt(playerid, "FuelLastUpdate") < GetTickCount() && UsingPumpID[playerid] == -1 && !Vehicle_IsANoFuelVehicle( GetVehicleModel(vid) ))
	    {
	        SetPlayerProgressBarValue(playerid, FuelBar[playerid], Fuel[vid]);
	        SetPVarInt(playerid, "FuelLastUpdate", GetTickCount() + (UPDATE_RATE + 50));
	    }
	}

	return 1;
}

forward ConsumeFuel();
public ConsumeFuel()
{
    new Float: mass, Float: speed, Float: dist;
    for(new i = 1, ps = GetVehiclePoolSize(); i <= ps; i++)
    {
        if(!IsValidVehicle(i)) continue;
        if(Vehicle_IsANoFuelVehicle( GetVehicleModel(i) )) continue;
		if(!GetVehicleParams(i, VEHICLE_TYPE_ENGINE)) continue;
		dist = GetVehicleDistanceFromPoint(i, VehicleLastCoords[i][0], VehicleLastCoords[i][1], VehicleLastCoords[i][2]);
		mass = GetVehicleModelInfoAsFloat(GetVehicleModel(i), "fMass");
		speed = Vehicle_GetSpeed(i) + 0.001;
		Fuel[i] -= ((mass / (mass * 4.5)) * ((speed / 60) + 0.015) / 30) * ((dist / 10) + 0.001);
		if(Fuel[i] < 0.1) SetVehicleParams(i, VEHICLE_TYPE_ENGINE, 0);
		GetVehiclePos(i, VehicleLastCoords[i][0], VehicleLastCoords[i][1], VehicleLastCoords[i][2]);
    }

	return 1;
}

forward Refuel(playerid, vehicleid);
public Refuel(playerid, vehicleid)
{
    new price = floatround(0.5 * LITRE_PRICE);
    if(GetPlayerMoney(playerid) < price)
	{
		SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You don't have enough money.");
		Fuel_ResetPlayer(playerid);
		Vehicle_StartEngine(vehicleid);
		return 1;
	}

    FuelBought[playerid] += 0.5;
	Fuel[vehicleid] += 0.5;

	new string[64];
	format(string, sizeof(string), "~b~~h~Refueling...~n~~n~~w~Price: ~g~~h~$%d ~y~~h~(%.2fL)", floatround(FuelBought[playerid] * LITRE_PRICE), FuelBought[playerid]);
	PlayerTextDrawSetString(playerid, FuelText[playerid], string);
	SetPlayerProgressBarValue(playerid, FuelBar[playerid], Fuel[vehicleid]);
	GivePlayerMoney(playerid, -price);

	if(Fuel[vehicleid] > 100.0)
	{
		Fuel[vehicleid] = 100.0;
		Fuel_ResetPlayer(playerid);
		Vehicle_StartEngine(vehicleid);
	}

	return 1;
}

CMD:refuel(playerid, params[])
{
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You can't use this command if you're not a driver.");
	if(UsingPumpID[playerid] == -1) {
	    if(GetPlayerMoney(playerid) < 1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You don't have enough money.");
	    if(Fuel[ GetPlayerVehicleID(playerid) ] > 99.0) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Your vehicle doesn't need a refuel.");
		new id = Pump_Closest(playerid);
		if(id == -1) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You're not near a gas pump.");
		if(IsPlayerConnected(PumpData[id][pumpUser])) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}The pump you want to use is not available.");
		UsingPumpID[playerid] = id;
		PumpData[id][pumpUser] = playerid;
		Pump_Update(id);

		new vid = GetPlayerVehicleID(playerid);
		SetVehicleParams(vid, VEHICLE_TYPE_ENGINE, 0);
		PlayerTextDrawSetString(playerid, FuelText[playerid], "~b~~h~Refueling...~n~~n~~w~Price: ~g~~h~$0 ~y~~h~(0.00L)");
		PlayerTextDrawShow(playerid, FuelText[playerid]);
		RefuelTimer[playerid] = SetTimerEx("Refuel", 350, true, "ii", playerid, vid);

		SendClientMessage(playerid, -1, "You can write /refuel again to stop refueling.");
	}else{
	    Fuel_ResetPlayer(playerid);
	    Vehicle_StartEngine( GetPlayerVehicleID(playerid) );
	}

	return 1;
}

CMD:arefuel(playerid, params[])
{
	if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
	new id = GetPlayerVehicleID(playerid);
	if(!IsValidVehicle(id)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}You're not in a vehicle.");
	Fuel[id] = 100.0;
	SendClientMessage(playerid, -1, "Vehicle refueled.");
	return 1;
}

CMD:arefuelall(playerid, params[])
{
	if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, 0xE74C3CFF, "ERROR: {FFFFFF}Only RCON admins can use this command.");
	for(new i, v = GetVehiclePoolSize(); i <= v; i++) if(IsValidVehicle(i)) Fuel[i] = 100.0;
	SendClientMessageToAll(-1, "A RCON admin has refueled all vehicles.");
	return 1;
}
 
Последнее редактирование:
  • Нравится
Реакции: 022R
Сверху Снизу