PDA

Просмотр полной версии : [Вопрос] Снимаем бензин по километрам



Сергей
25.08.2016, 20:31
Доброго времени суток пользователи портала.
Столкнулся с проблемой по расходу бензина за 1км

Делаю вот так:

new Float:sp = SpeedVehicle(playerid);
new Float:l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
Fuell[veh] -= l;
И когда этот код срабатывает, вместо количества бензина показывает скорость автомобиля...

vovandolg
26.08.2016, 09:35
А ещё больше кода нельзя выложить?

_lizard
26.08.2016, 10:00
new Float:sp = SpeedVehicle(playerid);


Что это за функция такая?

HarrWe
26.08.2016, 10:39
Что это за функция такая?

Скорее всего что то в роде этого

stock SpeedVehicle(playerid)
{
new Float:ST[4];
if(IsPlayerInAnyVehicle(playerid))
GetVehicleVelocity(GetPlayerVehicleID(playerid),ST[0],ST[1],ST[2]);
else GetPlayerVelocity(playerid,ST[0],ST[1],ST[2]);
ST[3] = floatsqroot(floatpower(floatabs(ST[0]), 2.0) + floatpower(floatabs(ST[1]), 2.0) + floatpower(floatabs(ST[2]), 2.0)) * 100.3;
return floatround(ST[3]);
}

ziggi
26.08.2016, 14:02
Зачем использовать floatabs, если число возводится в квадрат? Более того, для вычисления длины вектора есть функция VectorSize, которая на порядок быстрее.

stock SpeedVehicle(playerid)
{
new
Float:x,
Float:y,
Float:z,
vehicleid;

vehicleid = GetPlayerVehicleID(playerid);
if (vehicleid != 0) {
GetVehicleVelocity(vehicleid, x, y, z);
} else {
GetPlayerVelocity(playerid, x, y, z);
}

return floatround(VectorSize(x, y, z) * 100.0);
}

Sp1ke
26.08.2016, 15:16
Зачем использовать floatabs, если число возводится в квадрат? Более того, для вычисления длины вектора есть функция VectorSize, которая на порядок быстрее.

stock SpeedVehicle(playerid)
{
new
Float:z,
Float:y,
Float:z,
vehicleid;

vehicleid = GetPlayerVehicleID(playerid);
if (vehicleid != 0) {
GetVehicleVelocity(vehicleid, x, y, z);
} else {
GetPlayerVelocity(playerid, x, y, z);
}

return floatround(VectorSize(x, y, z)) * 100;
}

2 раза z объявил, поправь
UP: проверил, функция работает неправильно, когда еду на машине не показывает скорость больше 100, или 0 или 100

ziggi
26.08.2016, 16:38
проверил, функция работает неправильно, когда еду на машине не показывает скорость больше 100, или 0 или 100
Исправил, просто обычно я не округляю скорость, а выдаю значение в виде Float числа, немного перепутал.

vovandolg
26.08.2016, 19:19
Зачем использовать floatabs, если число возводится в квадрат? Более того, для вычисления длины вектора есть функция VectorSize, которая на порядок быстрее.

stock SpeedVehicle(playerid)
{
new
Float:x,
Float:y,
Float:z,
vehicleid;

vehicleid = GetPlayerVehicleID(playerid);
if (vehicleid != 0) {
GetVehicleVelocity(vehicleid, x, y, z);
} else {
GetPlayerVelocity(playerid, x, y, z);
}

return floatround(VectorSize(x, y, z) * 100.0);
}

имхо, я так бы не назвал функцию, так как она вычисляет не только в авто, но и пешком)

Sp1ke
26.08.2016, 19:22
имхо, я так бы не назвал функцию, так как она вычисляет не только в авто, но и пешком)

Претензию к автору темы

ziggi
26.08.2016, 19:41
имхо, я так бы не назвал функцию, так как она вычисляет не только в авто, но и пешком)

Я бы тоже, название GetSpeed больше подходит (хотя я бы не объединял две функции в одну, а разделил бы на GetPlayerSpeed и GetVehicleSpeed).

_lizard
26.08.2016, 21:26
Всегда интересовался, существенная разница есть?


Float:stock GetPlayerSpeed(playerid)
{
new Float:speed;
// тра ля ля
return speed;
}

stock GetPlayerSpeed(playerid, &Float:speed)
{
// ...
}

ziggi
26.08.2016, 23:02
Всегда интересовался, существенная разница есть?


Float:stock GetPlayerSpeed(playerid)
{
new Float:speed;
// тра ля ля
return speed;
}

stock GetPlayerSpeed(playerid, &Float:speed)
{
// ...
}


Как по мне, разница существенная - первая функция не скомпилируется, вторая скомпилируется.

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

_lizard
26.08.2016, 23:05
Но стандартные функции SA-MP придерживаются второго варианта, поэтому имеет смысл использовать его (для сохранения общего стиля).

Не все, например VectorSize(), поэтому и спросил, спасибо.

Сергей
27.08.2016, 00:28
Сама функция:



stock SpeedVehicle(playerid)
{
if(!IsPlayerInAnyVehicle(playerid)) return 1;
new Float:X, Float:Y, Float:Z;
GetVehicleVelocity(GetPlayerVehicleID(playerid),X,Y,Z);
return floatround(VectorSize(X, Y, Z) * 100.3);
}
Капец вы в теме раздули. Я даже сказать ничего не могу....
Проблема вот в чём, не онемает бензин по километрам...

Sp1ke
27.08.2016, 00:30
Сама функция:



stock SpeedVehicle(playerid)
{
if(!IsPlayerInAnyVehicle(playerid)) return 1;
new Float:X, Float:Y, Float:Z;
GetVehicleVelocity(GetPlayerVehicleID(playerid),X,Y,Z);
return floatround(VectorSize(X, Y, Z) * 100.3);
}
Капец вы в теме раздули. Я даже сказать ничего не могу....
Проблема вот в чём, не онемает бензин по километрам...

Зачем вызывать IsPlayerInAnyVehicle, если GetPlayerVehicleID вернет 0, если игрок не в авто? Покажи показ бензина, ты же на ТД делаешь спидометр? Скорее всего ты ошибся текстдравом

Сергей
27.08.2016, 00:44
Зачем вызывать IsPlayerInAnyVehicle, если GetPlayerVehicleID вернет 0, если игрок не в авто? Покажи показ бензина, ты же на ТД делаешь спидометр? Скорее всего ты ошибся текстдравом

Да не ошибся я текстдравом, ты просто по смотри на код, который я показал выше, просто суть проблемы мне не ясна, и я не могу её решить в одиночку, по этому я решил поделиться проблемой со всеми.
Когда сработает хоть один раз:


new Float:sp = SpeedVehicle(playerid);
new Float:l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
Fuell[veh] -= l;
То бензин на спидометре убирается, полностью, и в графе там где литраж автомобиля, начинается показывать скорость автомобиля...

Зачем вызывать IsPlayerInAnyVehicle, если GetPlayerVehicleID вернет 0
Захотелось, и сделал так.

Sp1ke
27.08.2016, 00:53
Да не ошибся я текстдравом, ты просто по смотри на код, который я показал выше, просто суть проблемы мне не ясна, и я не могу её решить в одиночку, по этому я решил поделиться проблемой со всеми.
Когда сработает хоть один раз:


new Float:sp = SpeedVehicle(playerid);
new Float:l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
Fuell[veh] -= l;
То бензин на спидометре убирается, полностью, и в графе там где литраж автомобиля, начинается показывать скорость автомобиля...

Зачем вызывать IsPlayerInAnyVehicle, если GetPlayerVehicleID вернет 0
Захотелось, и сделал так.


new Float:sp = SpeedVehicle(playerid);
new Float:l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
printf("%d %f %f", veh, l, Fuell[veh]);
Fuell[veh] -= l;
printf("%f", Fuell[veh]);
Скинь лог

Сергей
27.08.2016, 01:05
new Float:sp = SpeedVehicle(playerid);
new Float:l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
printf("%d %f %f", veh, l, Fuell[veh]);
Fuell[veh] -= l;
printf("%f", Fuell[veh]);
Скинь лог


[00:05:05] 387 0.020999 1318926976.000000 || LOG
[00:05:05] 1318926976.000000 || LOG

Переменная Fuell у меня объявлена не как Float;

ziggi
27.08.2016, 01:59
Сама функция:



stock SpeedVehicle(playerid)
{
if(!IsPlayerInAnyVehicle(playerid)) return 1;
new Float:X, Float:Y, Float:Z;
GetVehicleVelocity(GetPlayerVehicleID(playerid),X,Y,Z);
return floatround(VectorSize(X, Y, Z) * 100.3);
}
Капец вы в теме раздули. Я даже сказать ничего не могу....
Проблема вот в чём, не онемает бензин по километрам...

SpeedVehicle возвращает целое число, а ты записываешь его в переменную с тегом Float, в этом и проблема.

Сергей
27.08.2016, 08:34
SpeedVehicle возвращает целое число, а ты записываешь его в переменную с тегом Float, в этом и проблема.


new sp = SpeedVehicle(playerid);
new l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
Fuell[veh] -= l;
Сделал по другому, километры не идут...
Лог:

[00:32:24] 387 0 50 || LOG
[00:32:24] 50 || LOG

Saibot
27.08.2016, 19:03
А если попробовать уменьшать количество топлива, оператором переопределения тегов?

new sp = SpeedVehicle(playerid);
new Float: l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
Fuell[veh] -= _:l;

Или с помощью функции floatround

new sp = SpeedVehicle(playerid);
new Float: l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
Fuell[veh] -= floatround(l);

Сергей
27.08.2016, 20:06
А если попробовать уменьшать количество топлива, оператором переопределения тегов?

new sp = SpeedVehicle(playerid);
new Float: l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
Fuell[veh] -= _:l;

Или с помощью функции floatround

new sp = SpeedVehicle(playerid);
new Float: l = (sp/2)/1000;
new veh = GetPlayerVehicleID(playerid);
Fuell[veh] -= floatround(l);

Второй вариант отнимает, но теперь прийдеться настраивать
new Float: l = (sp/2)/1000;
Но вот и следующий вопрос, если объявить
Fuell как Float
Тогда как мне быть с этим диалогом?



case 652:
{
if(response)
{
new veh = GetPlayerVehicleID(playerid);
new zaprakas = 0;
for(new i = 0; i < sizeof(SBI); i++)
{
if(sscanf(inputtext,"d",zaprakas))
{
new str[80];
format(str,70,"{00ffff}Заправочная станция - {21BD4B}%s",SBI[i][sbMessage]);
SPD(playerid, 652, DIALOG_STYLE_INPUT, str, "Вы хотите заправить автомобиль топливом\nдля этого вам нужно ввести количество топлива в данном окне.\nПомните: Вводите количество топлива которое вместится в ваш бак\n\nВвод количества топлива:\n", "Ввод", "Отмена");
return 1;
}
if(SBI[i][sbProducts] <=0 && SBI[i][sbOwned] == 1)
{
new str[80];
format(str,70,"{00ffff}Заправочная станция - {21BD4B}%s",SBI[i][sbMessage]);
SPD(playerid, 652, DIALOG_STYLE_INPUT, str, "Вы хотите заправить автомобиль топливом\nдля этого вам нужно ввести количество топлива в данном окне.\nПомните: Вводите количество топлива которое вместится в ваш бак\n\n{FF0000}На заправке отсутствует бензин.\n", "Ввод", "Отмена");
return 1;
}
if(zaprakas > GetCarBak(veh))
{
new str[80];
format(str,70,"{00ffff}Заправочная станция - {21BD4B}%s",SBI[i][sbMessage]);
SPD(playerid, 652, DIALOG_STYLE_INPUT, str, "Вы хотите заправить автомобиль топливом\nдля этого вам нужно ввести количество топлива в данном окне.\nПомните: Вводите количество топлива которое вместится в ваш бак\n\n{FF0000}Количество заливаемого бензина не вместится в бак автомобиля.\n", "Ввод", "Отмена");
return 1;
}
if(Fuell[veh] == GetCarBak(veh))
{
new str[80];
format(str,70,"{00ffff}Заправочная станция - {21BD4B}%s",SBI[i][sbMessage]);
SPD(playerid, 652, DIALOG_STYLE_INPUT, str, "Вы хотите заправить автомобиль топливом\nдля этого вам нужно ввести количество топлива в данном окне.\nПомните: Вводите количество топлива которое вместится в ваш бак\n\n{FF0000}Бак автомобиля заполнен.\n", "Ввод", "Отмена");
return 1;
}
if(Fuell[veh] + zaprakas > GetCarBak(veh))
{
new str[80];
format(str,70,"{00ffff}Заправочная станция - {21BD4B}%s",SBI[i][sbMessage]);
if(IsACarA(veh)) return SPD(playerid, 652, DIALOG_STYLE_INPUT, str, "Вы хотите заправить мотоцикл топливом\nдля этого вам нужно ввести количество топлива в данном окне.\nПомните: Вводите количество топлива которое вместится в ваш бак\n\n{FF0000}В бак мотоцикла нельзя заправить больше.\n", "Ввод", "Отмена");
if(IsACarB(veh)) return SPD(playerid, 652, DIALOG_STYLE_INPUT, str, "Вы хотите заправить автомобиль топливом\nдля этого вам нужно ввести количество топлива в данном окне.\nПомните: Вводите количество топлива которое вместится в ваш бак\n\n{FF0000}В бак автомобиля нельзя заправить больше.\n", "Ввод", "Отмена");
if(IsACarC(veh)) return SPD(playerid, 652, DIALOG_STYLE_INPUT, str, "Вы хотите заправить автомобиль топливом\nдля этого вам нужно ввести количество топлива в данном окне.\nПомните: Вводите количество топлива которое вместится в ваш бак\n\n{FF0000}В бак автомобиля нельзя заправить больше.\n", "Ввод", "Отмена");
return 1;
}
SetTimerEx("FillingCar", 2000, false, "iid",playerid,i,zaprakas);
GameTextForPlayer(playerid,"Please Wait",2000,3);
}
}else return 1;
}

Пример
GetCarBak

forward GetCarBak(vehicleid);
public GetCarBak(vehicleid)
{
new model = GetVehicleModel(vehicleid);
switch(model)
{
case 400:return 77;
default:return 50;
}
return 0;
}


case 400: ID автомобиля. return 77; - Кол-во бензина для транспорта.

Saibot
27.08.2016, 20:18
Вместо целочисленного числа укажи вещественное число.

forward GetCarBak(vehicleid);
public GetCarBak(vehicleid)
{
switch(GetVehicleModel(vehicleid))
{
case 400: return 77.0;
default: return 50.0;
}
return 0;
}

ziggi
27.08.2016, 21:40
Какая у тебя жесть с типами (тегами) творится, используй для бензина везде Float и не придумывай себе проблем.

Сергей
28.08.2016, 02:59
Какая у тебя жесть с типами (тегами) творится, используй для бензина везде Float и не придумывай себе проблем.

А с диалогом моим как быть?

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


Вместо целочисленного числа укажи вещественное число.

forward GetCarBak(vehicleid);
public GetCarBak(vehicleid)
{
switch(GetVehicleModel(vehicleid))
{
case 400: return 77.0;
default: return 50.0;
}
return 0;
}


warning 213: несовпадение типов

Saibot
28.08.2016, 03:57
forward GetCarBak(vehicleid);
public GetCarBak(vehicleid)
{
switch(GetVehicleModel(vehicleid))
{
case 400: return _:77.0;
default: return _:50.0;
}
return 0;
}
Честно говоря, это уже какой то вздор получается.

ziggi
28.08.2016, 11:23
stock Float:GetCarBak(vehicleid)
{
switch (GetVehicleModel(vehicleid))
{
case 400: return 77.0;
default: return 50.0;
}
return 0.0;
}

Сергей
28.08.2016, 13:23
Очень большое всем спасибо!
Сделал систему бензина на Float, и переделал заправки, переделана система отнимания бензина.