PDA

Просмотр полной версии : [Вопрос] Спидометр с системой топлива и повреждений



SteveStage
25.01.2020, 15:19
Я переписал спидометра, добавив систему повреждений авто и переписав систему топлива (пару недель вообще ничего не писал, т.к. надоело)

@_UpdateSpeed(playerid, vehicleid);
@_UpdateSpeed(playerid, vehicleid)
{
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
{
for(new i; i < 4; i++) PlayerTextDrawDestroy(playerid, td_speed[i]);
return false;
}
new
getspeed = GetVehicleSpeed(vehicleid),
Float:carhp,
engine,
lights,
alarm,
bonnet,
boot,
objective,
doors;
GetVehicleHealth(vehicleid, carhp);
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if(carhp <= 300.0)
{
if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
SetVehicleHealth(vehicleid, 300.0);
SCM(playerid, COLOR_RED, !"[SERVER] Ваше транспортное средство повреждено!");
}
if(veh[vehicleid][v_fuel] > 0 && engine == VEHICLE_PARAMS_ON)
{
if(getspeed == 0) used_fuel_veh[vehicleid] += 1;
else if(getspeed >= 1)
{
if(getspeed <= GetVehicleSpeed(vehicleid))
{
getspeed = GetVehicleSpeed(vehicleid);
if(getspeed >= 1 && getspeed <= 20) used_fuel_veh[vehicleid] += 4;
else if(getspeed >= 21 && getspeed <= 50) used_fuel_veh[vehicleid] += 6;
else if(getspeed >= 51 && getspeed <= 70) used_fuel_veh[vehicleid] += 10;
else if(getspeed >= 71 && getspeed <= 120) used_fuel_veh[vehicleid] += 14;
else if(getspeed >= 121 && getspeed <= 300) used_fuel_veh[vehicleid] += 18;
}
else used_fuel_veh[vehicleid] += 1;
}
}
if(used_fuel_veh[vehicleid] >= 250 && veh[vehicleid][v_fuel] > 0)
{
veh[vehicleid][v_fuel] -= 1;
used_fuel_veh[vehicleid] = 0;
if(veh[vehicleid][v_fuel] == 0)
{
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
SCM(playerid, COLOR_RED, !"[SERVER] В вашем транспортном средстве кончилось топливо!");
}
if(IsPlayerConnected(veh[vehicleid][v_ownerid]))
{
new
str[128+1];
format(str, sizeof(str), "UPDATE `vehicles` SET `fuel` = '%d' WHERE `tableid` = '%d'", veh[vehicleid][v_fuel], veh[vehicleid][v_tableid]);
mysql_function_query(connect_mysql, str, false, "", "");
}
}
new
string[16];
format(string, sizeof(string), "SPEED: %d KM/H", getspeed);
PlayerTextDrawSetString(playerid, td_speed[1], string);
format(string, sizeof(string), "FUEL: %d", veh[vehicleid][v_fuel]);
PlayerTextDrawSetString(playerid, td_speed[2], string);
format(string, sizeof(string), "LOCK: %s", (lock_veh{vehicleid} == true) ? ("LOCKED") : ("UNLOCKED"));
PlayerTextDrawSetString(playerid, td_speed[3], string);
for(new i = 1; i < 4; i++) PlayerTextDrawShow(playerid, td_speed[i]);
speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "dd", playerid, vehicleid);
return true;
}

Хороша ли система и можно ли ускорить ее скорость, не потеряв работоспособности? Если да, то привидите пример.

execution
25.01.2020, 16:58
(пару недель вообще ничего не писал, т.к. надоело)
Важная информация.

Хм..
1.
new
getspeed = GetVehicleSpeed(vehicleid),
2. if(getspeed <= GetVehicleSpeed(vehicleid))
3. getspeed = GetVehicleSpeed(vehicleid);

tnc
25.01.2020, 17:23
В циклах лучше использовать sizeof, а не магические числа (https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)).

SteveStage
25.01.2020, 17:39
Хм..
1.
new
getspeed = GetVehicleSpeed(vehicleid),
2. if(getspeed <= GetVehicleSpeed(vehicleid))
3. getspeed = GetVehicleSpeed(vehicleid);

Сначала в getspeed записывается скорость автомобиля, потом если она меньше свежеполученной, значит авто ускоряется, а соответственно потребление топлива увеличивается. а приравнивание в конце для того, чтобы в getspeed была актуальная скорость.


В циклах лучше использовать sizeof, а не магические числа (https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)).

Это не магические числа, а количества текстдравов. Да и чем эти варианты лучше?

for(new i; i < sizeof(td_speed); i++) PlayerTextDrawDestroy(playerid, td_speed[i]);
for(new i = 1; i < sizeof(td_speed); i++) PlayerTextDrawShow(playerid, td_speed[i]);

Pa4enka
25.01.2020, 18:22
Это не магические числа, а количества текстдравов. Да и чем эти варианты лучше?

Тем, что если ты захочешь изменить количество текстдравов, то тебе не придётся лезть в каждый цикл и менять эти магические цифры. Да и я бы вообще воспользовался дополнительной константой для обозначение индекса каждого изменяемого текстдрава : TEXTDRAW_SPEED_INDEX, TEXTDRAW_LOCKED_INDEX. Но это уже субъективные предпочтение.

SteveStage
25.01.2020, 18:25
Тем, что если ты захочешь изменить количество текстдравов, то тебе не придётся лезть в каждый цикл и менять эти магические цифры. Да и я бы вообще воспользовался дополнительной константой для обозначение индекса каждого изменяемого текстдрава : TEXTDRAW_SPEED_INDEX, TEXTDRAW_LOCKED_INDEX. Но это уже субъективные предпочтение.

Сам говорит про удобство изменения количества текстдравов и потом говорит про константы -_-
Если удобство - sizeof, и никакие константы менять не придется.

Pa4enka
25.01.2020, 20:31
Сам говорит про удобство изменения количества текстдравов и потом говорит про константы -_-
Если удобство - sizeof, и никакие константы менять не придется.

О константе это уже моё мнение, то как я это делаю в основном. А sizeof это удобно, практично и более информативно, нежели магические числа. А вообще, открой какой нибудь серьёзный скрипт не на павн, и поймёшь, что там не встречаются никакие лишние числа. И как не странно, оно читается каждым человеком, который базово знаком с основами программирования.

execution
25.01.2020, 21:27
Сначала в getspeed записывается скорость автомобиля, потом если она меньше свежеполученной, значит авто ускоряется, а соответственно потребление топлива увеличивается. а приравнивание в конце для того, чтобы в getspeed была актуальная скорость

Это всё конечно хорошо, но в каждом срабатывании этого паблика - локальные переменные будут заново создаваться, и с чем ты теперь будешь сравнивать?)

DeimoS
26.01.2020, 03:33
Сам говорит про удобство изменения количества текстдравов и потом говорит про константы -_-
Если удобство - sizeof, и никакие константы менять не придется.

Константы и sizeof никак друг с другом не связаны.

Именными константами ты помечаешь каждый конкретный текстдрав, чтоб вот тут:
PlayerTextDrawSetString(playerid, td_speed[1], string);
вместо непонятной единицы словами было написано, что это текстдрав, отображающий скорость. Так же и с остальными текстдравами. Использовать удобнее enum, а не отдельно константы объявлять.
Только я бы не чистым капсом их называл, а вперемешку со строчными буквами или вообще смесью lowerCamelCase и snake_case, по типу "td_Speedometr_SpeedText" (а для PlayerText, соответственно, "ptd_..."). Ибо чисто заглавными обычно обозначают какие-либо константы, хранящие размер чего-то и т.п. Ну это моё ИМХО.

А sizeof уже прописываешь в циклах. И, как уже писали, чтоб, в случае увеличения числа текстдравов, не пришлось изменять значения вручную. И чтоб если решишь уменьшить число текстдравов, не словить выход за пределы массива. Написав на несколько символов больше, ты обезопасишь себя от проблем в будущем. Так что лениться не стоит.


Сначала в getspeed записывается скорость автомобиля, потом если она меньше свежеполученной, значит авто ускоряется, а соответственно потребление топлива увеличивается. а приравнивание в конце для того, чтобы в getspeed была актуальная скорость.

Между вызовами двух getspeed даже пары тиков, скорее всего, не пройдёт, так что скорость 100% не будет отличаться. Смысла в этой проверке нет никакого.

SteveStage
26.01.2020, 18:38
Между вызовами двух getspeed даже пары тиков, скорее всего, не пройдёт, так что скорость 100% не будет отличаться. Смысла в этой проверке нет никакого.

А как тогда узнать, ускоряется ли автомобиль? Создать еще одну переменную oldspeed и хранить в ней скорость предыдущего обновления?

Это нормальная реализация?

@_UpdateSpeed(playerid, vehicleid);
@_UpdateSpeed(playerid, vehicleid)
{
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
{
for(new i; i < sizeof(td_speed); i++) PlayerTextDrawDestroy(playerid, td_speed[i]);
return false;
}
new
getspeed = GetVehicleSpeed(vehicleid),
oldspeed = GetPVarInt(playerid, "OldSpeed"),
Float:carhp,
engine,
lights,
alarm,
bonnet,
boot,
objective,
doors;
GetVehicleHealth(vehicleid, carhp);
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if(carhp < 300.0)
{
if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
SetVehicleHealth(vehicleid, 300.0);
if(is_veh_dmg_first_time{vehicleid} == true)
{
SCM(playerid, COLOR_RED, !"[SERVER] Ваше транспортное средство повреждено!");
is_veh_dmg_first_time{vehicleid} = false;
}
}
if(veh[vehicleid][v_fuel] > 0 && engine == VEHICLE_PARAMS_ON)
{
if(getspeed == 0) used_fuel_veh[vehicleid] += 1;
else if(getspeed >= 1)
{
if(getspeed <= oldspeed)
{
if(getspeed >= 1 && getspeed <= 20) used_fuel_veh[vehicleid] += 4;
else if(getspeed >= 21 && getspeed <= 50) used_fuel_veh[vehicleid] += 6;
else if(getspeed >= 51 && getspeed <= 70) used_fuel_veh[vehicleid] += 10;
else if(getspeed >= 71 && getspeed <= 120) used_fuel_veh[vehicleid] += 14;
else if(getspeed >= 121 && getspeed <= 300) used_fuel_veh[vehicleid] += 18;
}
else used_fuel_veh[vehicleid] += 1;
}
}
if(used_fuel_veh[vehicleid] >= 250 && veh[vehicleid][v_fuel] > 0)
{
veh[vehicleid][v_fuel] -= 1;
used_fuel_veh[vehicleid] = 0;
if(veh[vehicleid][v_fuel] == 0)
{
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
SCM(playerid, COLOR_RED, !"[SERVER] В вашем транспортном средстве кончилось топливо!");
}
if(IsPlayerConnected(veh[vehicleid][v_ownerid]))
{
new
str[128+1];
format(str, sizeof(str), "UPDATE `vehicles` SET `fuel` = '%d' WHERE `tableid` = '%d'", veh[vehicleid][v_fuel], veh[vehicleid][v_tableid]);
mysql_function_query(connect_mysql, str, false, "", "");
}
}
new
string[16];
format(string, sizeof(string), "SPEED: %d KM/H", getspeed);
PlayerTextDrawSetString(playerid, td_speed[1], string);
format(string, sizeof(string), "FUEL: %d", veh[vehicleid][v_fuel]);
PlayerTextDrawSetString(playerid, td_speed[2], string);
format(string, sizeof(string), "LOCK: %s", (lock_veh{vehicleid} == true) ? ("LOCKED") : ("UNLOCKED"));
PlayerTextDrawSetString(playerid, td_speed[3], string);
for(new i = 1; i < sizeof(td_speed); i++) PlayerTextDrawShow(playerid, td_speed[i]);
SetPVarInt(playerid, "OldSpeed", getspeed);
speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "dd", playerid, vehicleid);
return true;
}

execution
26.01.2020, 20:32
А как тогда узнать, ускоряется ли автомобиль? Создать еще одну переменную oldspeed и хранить в ней скорость предыдущего обновления?

Это нормальная реализация?

@_UpdateSpeed(playerid, vehicleid);
@_UpdateSpeed(playerid, vehicleid)
{
if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
{
for(new i; i < sizeof(td_speed); i++) PlayerTextDrawDestroy(playerid, td_speed[i]);
return false;
}
new
getspeed = GetVehicleSpeed(vehicleid),
oldspeed = GetPVarInt(playerid, "OldSpeed"),
Float:carhp,
engine,
lights,
alarm,
bonnet,
boot,
objective,
doors;
GetVehicleHealth(vehicleid, carhp);
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if(carhp < 300.0)
{
if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
SetVehicleHealth(vehicleid, 300.0);
if(is_veh_dmg_first_time{vehicleid} == true)
{
SCM(playerid, COLOR_RED, !"[SERVER] Ваше транспортное средство повреждено!");
is_veh_dmg_first_time{vehicleid} = false;
}
}
if(veh[vehicleid][v_fuel] > 0 && engine == VEHICLE_PARAMS_ON)
{
if(getspeed == 0) used_fuel_veh[vehicleid] += 1;
else if(getspeed >= 1)
{
if(getspeed <= oldspeed)
{
if(getspeed >= 1 && getspeed <= 20) used_fuel_veh[vehicleid] += 4;
else if(getspeed >= 21 && getspeed <= 50) used_fuel_veh[vehicleid] += 6;
else if(getspeed >= 51 && getspeed <= 70) used_fuel_veh[vehicleid] += 10;
else if(getspeed >= 71 && getspeed <= 120) used_fuel_veh[vehicleid] += 14;
else if(getspeed >= 121 && getspeed <= 300) used_fuel_veh[vehicleid] += 18;
}
else used_fuel_veh[vehicleid] += 1;
}
}
if(used_fuel_veh[vehicleid] >= 250 && veh[vehicleid][v_fuel] > 0)
{
veh[vehicleid][v_fuel] -= 1;
used_fuel_veh[vehicleid] = 0;
if(veh[vehicleid][v_fuel] == 0)
{
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
SCM(playerid, COLOR_RED, !"[SERVER] В вашем транспортном средстве кончилось топливо!");
}
if(IsPlayerConnected(veh[vehicleid][v_ownerid]))
{
new
str[128+1];
format(str, sizeof(str), "UPDATE `vehicles` SET `fuel` = '%d' WHERE `tableid` = '%d'", veh[vehicleid][v_fuel], veh[vehicleid][v_tableid]);
mysql_function_query(connect_mysql, str, false, "", "");
}
}
new
string[16];
format(string, sizeof(string), "SPEED: %d KM/H", getspeed);
PlayerTextDrawSetString(playerid, td_speed[1], string);
format(string, sizeof(string), "FUEL: %d", veh[vehicleid][v_fuel]);
PlayerTextDrawSetString(playerid, td_speed[2], string);
format(string, sizeof(string), "LOCK: %s", (lock_veh{vehicleid} == true) ? ("LOCKED") : ("UNLOCKED"));
PlayerTextDrawSetString(playerid, td_speed[3], string);
for(new i = 1; i < sizeof(td_speed); i++) PlayerTextDrawShow(playerid, td_speed[i]);
SetPVarInt(playerid, "OldSpeed", getspeed);
speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "dd", playerid, vehicleid);
return true;
}

Можно просто передавать в параметр @_UpdateSpeed скорость...
Да и вообще, зачем тебе знать старую скорость? Смысла никакого нет.

SteveStage
26.01.2020, 21:06
Да и вообще, зачем тебе знать старую скорость? Смысла никакого нет.

Чтобы знать, ускоряется/держит скорость ли авто, или останавливается. Если авто стоит/останавливается, потребление бензина ниже, чем при разгоне/движении. Да и с коробкой передач это сочетается (в плане реализма).

execution
27.01.2020, 10:20
Чтобы знать, ускоряется/держит скорость ли авто, или останавливается. Если авто стоит/останавливается, потребление бензина ниже, чем при разгоне/движении. Да и с коробкой передач это сочетается (в плане реализма).

Далеко не идеальный вариант, но как-то так:

@_UpdateSpeed(playerid, vehicleid, oldspeed);
@_UpdateSpeed(playerid, vehicleid, oldspeed)
{
static
string[128 + 1],
getspeed = GetVehicleSpeed(vehicleid),
Float:carhp,
engine,
lights,
alarm,
bonnet,
boot,
objective,
doors;
GetVehicleHealth(vehicleid, carhp);
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if(carhp < 300.0)
{
if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
SetVehicleHealth(vehicleid, 300.0);
if(is_veh_dmg_first_time{vehicleid} == true)
{
SCM(playerid, COLOR_RED, !"[SERVER] Ваше транспортное средство повреждено!");
is_veh_dmg_first_time{vehicleid} = false;
}
}
if(veh[vehicleid][v_fuel] > 0 && engine == VEHICLE_PARAMS_ON)
{
if(getspeed == 0) used_fuel_veh[vehicleid] += 1;
else if(getspeed >= 1)
{
if(getspeed <= oldspeed)
{
if(getspeed >= 1 && getspeed <= 20) used_fuel_veh[vehicleid] += 4;
else if(getspeed >= 21 && getspeed <= 50) used_fuel_veh[vehicleid] += 6;
else if(getspeed >= 51 && getspeed <= 70) used_fuel_veh[vehicleid] += 10;
else if(getspeed >= 71 && getspeed <= 120) used_fuel_veh[vehicleid] += 14;
else if(getspeed >= 121 && getspeed <= 300) used_fuel_veh[vehicleid] += 18;
}
else used_fuel_veh[vehicleid] += 1;
}
}

if(used_fuel_veh[vehicleid] >= 250 && veh[vehicleid][v_fuel] > 0)
{
veh[vehicleid][v_fuel] -= 1;
used_fuel_veh[vehicleid] = 0;
if(veh[vehicleid][v_fuel] == 0)
{
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
SCM(playerid, COLOR_RED, !"[SERVER] В вашем транспортном средстве кончилось топливо!");
}
}

static const
status_doors[][] =
{
"UNLOCKED",
"LOCKED"
};

format(string, sizeof(string), "SPEED: %d KM/H", getspeed);
PlayerTextDrawSetString(playerid, td_speed[1], string);
format(string, sizeof(string), "FUEL: %d", veh[vehicleid][v_fuel]);
PlayerTextDrawSetString(playerid, td_speed[2], string);
format(string, sizeof(string), "LOCK: %s", status_doors[_:lock_veh{vehicleid}]);
PlayerTextDrawSetString(playerid, td_speed[3], string);

for(new i = 1; i < sizeof(td_speed); i++) PlayerTextDrawShow(playerid, td_speed[i]);

speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "dd", playerid, vehicleid, getspeed);
return true;
}

Это, мне кажется, можно при удалении автомобиля запихнуть:
if(IsPlayerConnected(veh[vehicleid][v_ownerid]))
{
new
str[128+1];
format(str, sizeof(str), "UPDATE `vehicles` SET `fuel` = '%d' WHERE `tableid` = '%d'", veh[vehicleid][v_fuel], veh[vehicleid][v_tableid]);
mysql_function_query(connect_mysql, str, false, "", "");
}

Это можно поместить в OnPlayerState, если oldstate == PLAYER_STATE_DRIVER

if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
{
for(new i; i < sizeof(td_speed); i++) PlayerTextDrawDestroy(playerid, td_speed[i]);
return false;
}

- - - Добавлено - - -

У тебя есть массив с хранением данных автомобиля, но используешь другие массивы для хранения отдельной информации, которые могли спокойно фигурировать в основном.

SteveStage
27.01.2020, 23:31
Ну начнем с того, что у меня уже есть такой вариант, и я просто забыл обновить:

@_UpdateSpeed(playerid, vehicleid, oldspeed);
@_UpdateSpeed(playerid, vehicleid, oldspeed)
{
new
getspeed = GetVehicleSpeed(vehicleid),
Float:carhp,
string[16],
engine,
lights,
alarm,
bonnet,
boot,
objective,
doors;
GetVehicleHealth(vehicleid, carhp);
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if(carhp <= 300.0)
{
if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
SetVehicleHealth(vehicleid, 300.0);
if(is_veh_dmg_first_time{vehicleid} == true)
{
SCM(playerid, COLOR_RED, !"[SERVER] Ваше транспортное средство повреждено!");
is_veh_dmg_first_time{vehicleid} = false;
}
}
if(veh[vehicleid][v_fuel] > 0 && engine == VEHICLE_PARAMS_ON)
{
if(getspeed == 0) used_fuel_veh[vehicleid] += 1;
else if(getspeed >= 1)
{
if(getspeed <= oldspeed)
{
if(getspeed >= 1 && getspeed <= 20) used_fuel_veh[vehicleid] += 4;
else if(getspeed >= 21 && getspeed <= 50) used_fuel_veh[vehicleid] += 6;
else if(getspeed >= 51 && getspeed <= 70) used_fuel_veh[vehicleid] += 10;
else if(getspeed >= 71 && getspeed <= 120) used_fuel_veh[vehicleid] += 14;
else if(getspeed >= 121 && getspeed <= 300) used_fuel_veh[vehicleid] += 18;
}
else used_fuel_veh[vehicleid] += 1;
}
}
if(used_fuel_veh[vehicleid] >= 250 && veh[vehicleid][v_fuel] > 0)
{
veh[vehicleid][v_fuel] -= 1;
used_fuel_veh[vehicleid] = 0;
if(veh[vehicleid][v_fuel] == 0)
{
GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
if(engine == VEHICLE_PARAMS_ON) SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_OFF, lights, alarm, doors, bonnet, boot, objective);
SCM(playerid, COLOR_RED, !"[SERVER] В вашем транспортном средстве кончилось топливо!");
}
}
format(string, sizeof(string), "SPEED: %d KM/H", getspeed);
PlayerTextDrawSetString(playerid, td_speed[1], string);
format(string, sizeof(string), "FUEL: %d", veh[vehicleid][v_fuel]);
PlayerTextDrawSetString(playerid, td_speed[2], string);
format(string, sizeof(string), "LOCK: %s", (lock_veh{vehicleid} == true) ? ("LOCKED") : ("UNLOCKED"));
PlayerTextDrawSetString(playerid, td_speed[3], string);
for(new i = 1; i < sizeof(td_speed); i++) PlayerTextDrawShow(playerid, td_speed[i]);
speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "ddd", playerid, vehicleid, getspeed);
return true;
}

P.S. Подредактировал свою версию, учтя все замечания execution


speed_timer[vehicleid] = SetTimerEx("@_UpdateSpeed", 500, false, "dd", playerid, vehicleid, getspeed);

Ошибочка у тебя вышла, тут должно быть "ddd", т.к. передаваемых аргументов в паблик не два, а три.


У тебя есть массив с хранением данных автомобиля, но используешь другие массивы для хранения отдельной информации, которые могли спокойно фигурировать в основном.

Приведи пример.

execution
28.01.2020, 20:40
Ошибочка у тебя вышла, тут должно быть "ddd", т.к. передаваемых аргументов в паблик не два, а три.



Приведи пример.
lock_veh{vehicleid}

SteveStage
28.01.2020, 23:03
Всем спасибо за помощь) Если появятся какие-либо недочеты и вопросы - отпишу сюда.

DeimoS
30.01.2020, 19:18
Чтобы знать, ускоряется/держит скорость ли авто, или останавливается. Если авто стоит/останавливается, потребление бензина ниже, чем при разгоне/движении. Да и с коробкой передач это сочетается (в плане реализма).

Тебе стоит получше почитать про то, как работают автомобили, если ты действительно хочешь реалистичную систему :) Не хочу сам расписывать всё, поэтому вот тебе первая статья из гугла на тему потребления топлива при разгоне (https://1gai.ru/baza-znaniy/521209-pochemu-bolee-bystryy-razgon-avtomobilya-inogda-privodit-k-umensheniyu-rashoda-topliva.html) :)

SteveStage
30.01.2020, 22:38
Тебе стоит получше почитать про то, как работают автомобили, если ты действительно хочешь реалистичную систему :) Не хочу сам расписывать всё, поэтому вот тебе первая статья из гугла на тему потребления топлива при разгоне (https://1gai.ru/baza-znaniy/521209-pochemu-bolee-bystryy-razgon-avtomobilya-inogda-privodit-k-umensheniyu-rashoda-topliva.html) :)

Ууу, так это еще большая пища для размышлений. Тогда получается, что надо судить потребление по разности новой скорости и старой скорости, в зависимости от количества. Чем разность больше, чем меньше потребление.

Пока что додумался до такого, что думаете насчет такой реализации?

if(veh[vehicleid][v_fuel] > 0 && engine == VEHICLE_PARAMS_ON)
{
if(getspeed == 0) used_fuel_veh[vehicleid] += 1;
else if(getspeed >= 1)
{
if(getspeed >= oldspeed)
{
new
diff = getspeed - oldspeed;
if(diff >= 1 && diff <= 10) used_fuel_veh[vehicleid] += 8;
else if(diff >= 11 && diff <= 20) used_fuel_veh[vehicleid] += 6;
else if(diff >= 21 && diff <= 25) used_fuel_veh[vehicleid] += 4;
else if(diff >= 26 && diff <= 30) used_fuel_veh[vehicleid] += 2;
else used_fuel_veh[vehicleid] += 1;
}
else used_fuel_veh[vehicleid] += 1;
}
}

DeimoS
31.01.2020, 00:00
Ууу, так это еще большая пища для размышлений. Тогда получается, что надо судить потребление по разности новой скорости и старой скорости, в зависимости от количества. Чем разность больше, чем меньше потребление.

Пока что додумался до такого, что думаете насчет такой реализации?

if(veh[vehicleid][v_fuel] > 0 && engine == VEHICLE_PARAMS_ON)
{
if(getspeed == 0) used_fuel_veh[vehicleid] += 1;
else if(getspeed >= 1)
{
if(getspeed >= oldspeed)
{
new
diff = getspeed - oldspeed;
if(diff >= 1 && diff <= 10) used_fuel_veh[vehicleid] += 8;
else if(diff >= 11 && diff <= 20) used_fuel_veh[vehicleid] += 6;
else if(diff >= 21 && diff <= 25) used_fuel_veh[vehicleid] += 4;
else if(diff >= 26 && diff <= 30) used_fuel_veh[vehicleid] += 2;
else used_fuel_veh[vehicleid] += 1;
}
else used_fuel_veh[vehicleid] += 1;
}
}

И вновь не совсем так :) Дело не в разгоне, а в набранной скорости, ибо, грубо говоря, энергия вращение колёс начинает передаваться двигателю, помогая компенсировать механическое трение, которое при более меньшей скорости компенсируется путём горения топлива.
Повторюсь, что тема оптимизации потребления топлива гораздо более сложная и тут нужно не по одной краткой статье делать выводы, а вникать в тему более подробно. Как минимум, потому что у разных моделей автомобилей эти системы работают по разному. Так же есть разные виды двигателей, которые по разному обогащают топливо кислородом, из-за чего и разнится количество потребления топлива. И есть ещё множество подобных мелких деталей, которые нужно учитывать, если ты хочешь прямо реализм.

Только, опять же, не уверен, что кто-то из игроков обратит на это внимание и оценит. Точнее, оценить-то могут, но вот в геймплейном плане это не сделает игру интереснее (особенно с учётом того, какая в игре физика автомобилей). Так что сомневаюсь, что все эти трудозатраты хоть как-то окупятся.

SteveStage
31.01.2020, 00:16
И вновь не совсем так :) Дело не в разгоне, а в набранной скорости, ибо, грубо говоря, энергия вращение колёс начинает передаваться двигателю, помогая компенсировать механическое трение, которое при более меньшей скорости компенсируется путём горения топлива.
Повторюсь, что тема оптимизации потребления топлива гораздо более сложная и тут нужно не по одной краткой статье делать выводы, а вникать в тему более подробно. Как минимум, потому что у разных моделей автомобилей эти системы работают по разному. Так же есть разные виды двигателей, которые по разному обогащают топливо кислородом, из-за чего и разнится количество потребления топлива. И есть ещё множество подобных мелких деталей, которые нужно учитывать, если ты хочешь прямо реализм.

Только, опять же, не уверен, что кто-то из игроков обратит на это внимание и оценит. Точнее, оценить-то могут, но вот в геймплейном плане это не сделает игру интереснее (особенно с учётом того, какая в игре физика автомобилей). Так что сомневаюсь, что все эти трудозатраты хоть как-то окупятся.

Я понял - не стоят нюансы своего. Это как те же мелкие детали в сингле, например закрывающийся магазин на ночь - никто не заметил, никто не оценил. Или тема с майками OG Loc'а/Mad Dog'а и изменение их цен по ходу продвижения сюжета (дада, поляк) - это заметили только через 13-15 лет после выхода игры, и на это почти никто во время игры не обращал внимания.