PDA

Просмотр полной версии : [Прочее] Завод двигателя исходя из здоровье транспорта



Geebrox
10.11.2016, 23:20
Описание:


Функция, которая позволяет завести двигатель исходя из здоровья транспорта. Чем больше здоровья транспорта, тем больше шансов завести её.


Функция:



forward OnVehicleEngineStarts(vehicleid, playerid);
public OnVehicleEngineStarts(vehicleid, playerid)
{
if(!vehicleid)
return 0;
new Float:health;
GetVehicleHealth(vehicleid, health);
new percent = floatround(health)/10;
if(25 >= percent)
return SendClientMessage(playerid, -1, !"{CD0000}\
Двигатель вышел из строя, вызовите механика!");
new g_en_lights, g_en_alarm, g_en_doors,
g_en_bonnet, g_en_boot, g_en_objective;
GetVehicleParamsEx(vehicleid, g_en_lights, g_en_lights,
g_en_alarm, g_en_doors, g_en_bonnet, g_en_boot, g_en_objective);
return (random(100) > percent) ?
(SendClientMessage(playerid, -1, !"{CD0000}Не удалось завести \
двигатель, повторите попытку!")) :
(SetVehicleParamsEx(vehicleid, VEHICLE_PARAM_ON, g_en_lights, g_en_alarm, g_en_doors,
g_en_bonnet, g_en_boot, g_en_objective));
}


Пример использование:



CMD:en(playerid)
{
//всякие проверки...
new vehicleid = GetPlayerVehicleID(playerid);
SetTimerEx("OnVehicleEngineStarts", 3000, 0, "ii", vehicleid, playerid);
SendClientMessage(playerid, -1, !"{3498db}Зажигание двигателя в \
процессе, ждите!");
return 1;
}


Автор: Я

Saibot
11.11.2016, 00:29
return (random(100) >= percent) ?
(SetVehicleParamsEx(vehicleid, 1, lights, alarm, doors,
bonnet, boot, objective);) :
(SendClientMessage(playerid, -1, !"{CD0000}Не удалось завести \
двигатель, повторите попытку!"));

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

KrutoyKrosch
11.11.2016, 01:13
по мне

new lights, alarm, doors, bonnet, boot, objective;

лучше объявить глобально, они много где используются и легче один раз глобально чем во всех пабликах локально

Geebrox
11.11.2016, 18:44
То, что во втором операнде поставь в первый, ибо у тебя больше шансов будет не завести двигатель, когда будет больше здоровья нежели меньше.

да да, точно. Просто я изменил код прямо на форуме, то есть изменил логику работы чуть-чуть и забыл изменить return. Исправил!



по мне

new lights, alarm, doors, bonnet, boot, objective;

лучше объявить глобально, они много где используются и легче один раз глобально чем во всех пабликах локально

Че этим хочешь сказать? А может они уже объявлены? У всех свои переменные. И да я изменил название переменных, вдруг они уже объявлены. А глобальные я не буду создавать, кто даст гарантии, что именно из за этой функций будут использовать только созданные для него глобальные переменные? Логику включим, не?

KrutoyKrosch
11.11.2016, 19:58
Если кто то будет ставить эту функцию, то следующая будет 100% управление дверями/капотом/багажником/дверями. И придется каждый раз их объявлять, лучше уж создать один раз глобально, от этого ничего не изменится...

Geebrox
11.11.2016, 21:55
Если кто то будет ставить эту функцию, то следующая будет 100% управление дверями/капотом/багажником/дверями. И придется каждый раз их объявлять, лучше уж создать один раз глобально, от этого ничего не изменится...

Многое изменится, я не хочу что бы мои скрипты каким-либо образом мешали "работать" основному коду юзера. А если эти переменные уже созданы как глобальные? Потом что? Каждый новичок будет стучать мне вопросом: "Я поставил твой код и вылезла эта ошибка"?
Не вижу смысла продолжать дискуссию на эту тему о переменных!

VVWVV
11.11.2016, 22:34
Реализация хорошая. Но, тем не менее, можно сделать проверку на существование т/с в игре.

Geebrox
11.11.2016, 23:08
Реализация хорошая. Но, тем не менее, можно сделать проверку на существование т/с в игре.

Добавил

ziggi
12.11.2016, 00:45
Реализация хорошая. Но, тем не менее, можно сделать проверку на существование т/с в игре.

- Некорректное название функции (OnVehicleEngineStarts подходит для события (запуск двигателя), которое уже произошло).
- Некорректные возвращаемые значения (всё вперемешку, 1, SendClientMessage, SetVehicleParamsEx).
- Разный стиль в одной функции (смысла запихивать проверку в return нет, ерунда с отступами).
- Непонятно с какой целью скомкан код.
- 1 вместо VEHICLE_PARAM_ON.
- Может быть лишний вызов GetVehicleParamsEx, ибо условие random(100) > percent расположено ниже.


Добавил

Это делается не так.

Более адекватная версия:

forward TryToStartVehicleEngine(vehicleid, playerid);
public TryToStartVehicleEngine(vehicleid, playerid)
{
new Float:health;
if (!GetVehicleHealth(vehicleid, health)) {
return 0;
}

new percent = floatround(health)/10;
if (percent <= 25) {
SendClientMessage(playerid, -1,
!"{CD0000}Двигатель вышел из строя, вызовите механика!");
return 0;
}

if (percent < random(100)) {
SendClientMessage(playerid, -1,
!"{CD0000}Не удалось завести двигатель, повторите попытку!");
return 0;
}

new g_en_lights, g_en_alarm, g_en_doors, g_en_bonnet, g_en_boot,
g_en_objective;
GetVehicleParamsEx(vehicleid, g_en_lights, g_en_lights,
g_en_alarm, g_en_doors, g_en_bonnet, g_en_boot, g_en_objective);
SetVehicleParamsEx(vehicleid, VEHICLE_PARAMS_ON, g_en_lights,
g_en_alarm, g_en_doors, g_en_bonnet, g_en_boot, g_en_objective);
return 1;
}

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

Geebrox
12.11.2016, 01:41
- Некорректное название функции (OnVehicleEngineStarts подходит для события (запуск двигателя), которое уже произошло).
- Некорректные возвращаемые значения (всё вперемешку, 1, SendClientMessage, SetVehicleParamsEx).
- Разный стиль в одной функции (смысла запихивать проверку в return нет, ерунда с отступами).
- Непонятно с какой целью скомкан код.
- 1 вместо VEHICLE_PARAM_ON.
- Может быть лишний вызов GetVehicleParamsEx, ибо условие random(100) > percent расположено ниже.




Признаюсь что не дружу с английским (учу), и упрекать в этом как то странно, если хочу поставлю вообще StartEngine, название функции не играет ни малейшую роль при выполнение кода;
Пожалуйста, прочитайте вики, все функции, которых я использовал возвращают 1 при успешном выполнение и 0 при не удаче;
Не вижу разных стилей, если не видите смысла это не значит, что использование этого метода запрещена. Равносилен обычной проверки, так что опять упрекаете не в нужном месте;
Код никак не скомкан все ясно и понятно;
Учту;
Как и в вашем коде может быть лишний вызов GetVehicleHealth;




Это делается не так.


new Float:health;
if (!GetVehicleHealth(vehicleid, health)) {
return 0;
}


Это равносилен моей проверки, я думаю ничем не отличается, кроме того, что может быть лишний вызов GetVehicleHealth;




P.S. Мое мнение о вашем посте: Выглядит так как будто хотели "понтанутся" указывая на незначительные почти не заметные различие кода, это лично мое мнение и изменять я его не собираюсь (можете на это не обращать внимание)

DeimoS
12.11.2016, 01:59
Признаюсь что не дружу с английским (учу), и упрекать в этом как то странно, если хочу поставлю вообще StartEngine, название функции не играет ни малейшую роль при выполнение кода;

Я просто оставлю это здесь (пункт 4) (http://pro-pawn.ru/showthread.php?8347-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5-%D1%80%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D0%B0%D1%86%D0%B8%D0%B8-%D0%BF%D0%BE-%D0%BD%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D1%8E-%D0%BA%D0%BE%D0%B4%D0%B0)


Пожалуйста, прочитайте вики, все функции, которых я использовал возвращают 1 при успешном выполнение и 0 при не удаче;

Тебе говорят о том, что код должен соответствовать какому-то одному стилю, а не являться кашей. Если начал возвращать какие-то числа - возвращай исключительно числа. Если функции - функции. От того, что ты сократишь свой код на 1 строку, читаемости не прибавится. А смысл уже приходится додумывать.





new Float:health;
if (!GetVehicleHealth(vehicleid, health)) {
return 0;
}

Это равносилен моей проверки, я думаю ничем не отличается, кроме того, что может быть лишний вызов GetVehicleHealth
Твоя проверка не проверяет, существует ли транспорт под указанным ID, а в GetVehicleHealth такая проверка вшита изначально (https://wiki.sa-mp.com/wiki/GetVehicleHealth_RU). То бишь, если я создам всего 1 автомобиль на сервере, но укажу ID 100, твоя проверка пропустит этот ID, хоть такого авто и не будет существовать.




P.S. Мое мнение о вашем посте: Выглядит так как будто хотели "понтанутся" указывая на незначительные почти не заметные различие кода, это лично мое мнение и изменять я его не собираюсь (можете на это не обращать внимание)

Тогда этот форум точно не для твоих работ, увы.

ziggi
12.11.2016, 02:00
Признаюсь что не дружу с английским (учу), и упрекать в этом как то странно, если хочу поставлю вообще StartEngine, название функции не играет ни малейшую роль при выполнение кода;


Это был ответ на "Реализация хорошая", если бы не это, я бы прошёл мимо.


Пожалуйста, прочитайте вики, все функции, которых я использовал возвращают 1 при успешном выполнение и 0 при не удаче;

Я знаю что функции возвращают, суть в том, что SendClientMessage вернёт 0 при отключенном игроке, а SetVehicleParamsEx вернёт 0 при отсутствующем транспорте, это принципиальная разница.


Не вижу разных стилей, если не видите смысла это не значит, что использование этого метода запрещена. Равносилен обычной проверки, так что опять упрекаете не в нужном месте;

Опять же, это ответ на "Реализация хорошая". А разные стили заключаются в разных отступах для разных строк (параметры в GetVehicleParamsEx выровнены по началу функции, а в SetVehicleParamsEx дополнительно смещены на 1 таб, например).


Код никак не скомкан все ясно и понятно;

Группы кода принято разделять пустой строкой, чтобы было проще понять логику его работы. Код нужно писать так, чтобы он был понятен и легко читаем для всех, а не только для тебя.


Как и в вашем коде может быть лишний вызов GetVehicleHealth


new Float:health;
if (!GetVehicleHealth(vehicleid, health)) {
return 0;
}

Это равносилен моей проверки, я думаю ничем не отличается, кроме лишнего вызова GetVehicleHealth

Вызов GetVehicleHealth не может быть лишним, ибо значение health используется для вычисление процента. Суть в том, что у тебя проверка random(100) > percent стоит после GetVehicleParamsEx, поэтому GetVehicleParamsEx будет вызываться всегда, даже когда этого не нужно (в случае когда случайное значение будет <= percent). Думаю, что это как-раз таки связано с твоим желанием запихнуть условие туда, куда не следовало - в return.

Geebrox
12.11.2016, 02:08
Это был ответ на "Реализация хорошая", если бы не это, я бы прошёл мимо.


Опять таки, как название функций определяет уровень реализации? Как вообще связаны эти 2 вещи?



Я знаю что функции возвращают, суть в том, что SendClientMessage вернёт 0 при отключенном игроке, а SetVehicleParamsEx вернёт 0 при отсутствующем транспорте, это принципиальная разница.


Суть в том, что эта функция (OnVehicleEngineStarts) возвращает 1 при удачном выполнение кода и 0 при не удаче



Опять же, это ответ на "Реализация хорошая". А разные стили заключаются в разных отступах для разных строк (параметры в GetVehicleParamsEx выровнены по началу функции, а в SetVehicleParamsEx дополнительно смещены на 1 таб, например).


Этот таб не просто так стоит, подумайте головой, это указывает на то, что SetVehicleParamsEx стоит в теле другой функции



Группы кода принято разделять пустой строкой, чтобы было проще понять логику его работы. Код нужно писать так, чтобы он был понятен и легко читаем для всех, а не только для тебя.


Нигде не читал такие правила



Вызов GetVehicleHealth не может быть лишним, ибо значение health используется для вычисление процента. Суть в том, что у тебя проверка random(100) > percent стоит после GetVehicleParamsEx, поэтому GetVehicleParamsEx будет вызываться всегда, даже когда этого не нужно (в случае когда случайное значение будет <= percent). Думаю, что это как-раз таки связано с твоим желанием запихнуть условие туда, куда не следовало - в return.

Я запихнул его туда куда надо, GetVehicleHealth тоже вызывается ВСЕГДА в отличии от моего кода и могут быть лишние вызовы если это авто не валидный (INVALID_VEHICLE_ID)

DeimoS
12.11.2016, 02:17
Я запихнул его туда куда надо, GetVehicleHealth тоже вызывается ВСЕГДА в отличии от моего кода и могут быть лишние вызовы если это авто не валидный (INVALID_VEHICLE_ID)

Уходя, просто советую ознакомиться с тем, какие значения возврващает GetPlayerVehicleID (https://wiki.sa-mp.com/wiki/GetPlayerVehicleID_RU), прежде чем говорить о том, о чём ты пытаешься говорить.

Geebrox
12.11.2016, 02:20
Уходя, просто советую ознакомиться с тем, какие значения возврващает GetPlayerVehicleID (https://wiki.sa-mp.com/wiki/GetPlayerVehicleID_RU), прежде чем говорить о том, о чём ты пытаешься говорить.

не вопрос, изменил на !vehicleid

DeimoS
12.11.2016, 02:23
не вопрос, изменил на !vehicleid

-_-
Попробуй уже вслушаться в слова Ziggi. Он тебе всё по делу говорит


если я создам всего 1 автомобиль на сервере, но укажу ID 100, твоя проверка пропустит этот ID, хоть такого авто и не будет существовать.

ziggi
12.11.2016, 02:25
P.S. Мое мнение о вашем посте: Выглядит так как будто хотели "понтанутся" указывая на незначительные почти не заметные различие кода

Я просто пытаюсь помочь людям писать хороший код. Истина кроется в мелочах. Да и не особо это можно назвать мелочами, для меня это довольно серьёзные ошибки (некоторые из мной перечисленных).


это лично мое мнение и изменять я его не собираюсь (можете на это не обращать внимание)

Никто не способен взять и изменить своё мнение :). Мнение меняется в результате каких-либо обстоятельств. Мне не удалось тебя убедить, поэтому твоё мнение не изменилось.


Опять таки, как название функций определяет уровень реализации? Как вообще связаны эти 2 вещи?

Реализация - это всё, в том числе название.


Суть в том, что эта функция (OnVehicleEngineStarts) возвращает 1 при удачном выполнение кода и 0 при не удаче

Что такое "удачное выполнение кода"?
- Вызов OnVehicleEngineStarts при отключенном игроке и нужных рандомах вернёт 1 но заведёт транспорт
- Вызов OnVehicleEngineStarts при отсутствующем транспорте и нужных рандомах вернёт 0 всегда
- Вызов OnVehicleEngineStarts при отсутствующем транспорте и нужных рандомах вернёт 1 если игрок подключен


Этот таб не просто так стоит, подумайте головой, это указывает на то, что SetVehicleParamsEx стоит в теле другой функции

Походу придётся пальцем тыкать:
http://ihost.pro-pawn.ru/image.php?di=8Y04


Нигде не читал такие правила

Зря. Существует множество литературы, рекомендую ознакомиться с книгой "Совершенный код" от Макконнелла.


Я запихнул его туда куда надо, GetVehicleHealth тоже вызывается ВСЕГДА в отличии от моего кода и могут быть лишние вызовы если это авто не валидный (INVALID_VEHICLE_ID)

GetVehicleHealth вернёт 0 при не валидном транспорте, твоя функция вернёт 0 при vehicleid == INVALID_VEHICLE_ID, если я вызову твою функцию с vehicleid равным 2001 (или с любым не существующим транспортом), то твоя "валидация" пропустит это значение, а моя нет. И это сделано как-раз для того, чтобы не использовать дополнительный вызов функции для валидации.

P.S. Честно говоря, я не понимаю почему ты воспринимаешь мои слова "в штыки", совершенно обычные замечания по коду, с целью улучшить его качество и чему-нибудь научить. Говоря "мне лучше знать как надо писать" - ты ничему не научишься, а будешь всегда плюхаться на одном месте.

P.P.S. Ушёл, утром буду.

Geebrox
12.11.2016, 02:36
Я просто пытаюсь помочь людям писать хороший код. Истина кроется в мелочах. Да и не особо это можно назвать мелочами, для меня это довольно серьёзные ошибки (некоторые из мной перечисленных).



Никто не способен взять и изменить своё мнение :). Мнение меняется в результате каких-либо обстоятельств. Мне не удалось тебя убедить, поэтому твоё мнение не изменилось.


Да не удалось убедить и ничего не поделать :agree:



Реализация - это всё, в том числе название.



Да может быть, но тому есть причина и я о нем уже говорил выше



Что такое "удачное выполнение кода"?
- Вызов OnVehicleEngineStarts при отключенном игроке и нужных рандомах вернёт 1 но заведёт транспорт
- Вызов OnVehicleEngineStarts при отсутствующем транспорте и нужных рандомах вернёт 0 всегда
- Вызов OnVehicleEngineStarts при отсутствующем транспорте и нужных рандомах вернёт 1 если игрок подключен


Я говорю в общем случае, если 0 то произошла ошибка в самой функций, а если 1 то функция дошла до финиша без ошибок, это логика этой функций



Походу придётся пальцем тыкать:
http://ihost.pro-pawn.ru/image.php?di=8Y04


Не заметил, когда копировал все было по другому, но я говорил что изменял некоторые части прямо на самом форуме, а тут 4 пробела и таб это разные отступы, в моем редакторе код выглядит по другому



Зря. Существует множество литературы, рекомендую ознакомиться с книгой "Совершенный код" от Макконнелла.


Гляну



GetVehicleHealth вернёт 0 при не валидном транспорте, твоя функция вернёт 0 при vehicleid == INVALID_VEHICLE_ID, если я вызову твою функцию с vehicleid равным 2001 (или с любым не существующим транспортом), то твоя "валидация" пропустит это значение, а моя нет. И это сделано как-раз для того, чтобы не использовать дополнительный вызов функции для валидации.

GetPlayerVehicleID - возвращает 0 при отсутствие тс на сервере, этого достаточно для проверки, а иные не правильно переданные идентификаторы это уже проблемы скриптера, и да я думаю опытный скриптер сначала сам проверит на валидность тс, перед тем как использовать эту функцию

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


-_-
Попробуй уже вслушаться в слова Ziggi. Он тебе всё по делу говорит

твой ответ находится чуть выше

DeimoS
12.11.2016, 15:57
Давно таких кадров на pro-pawn не заглядывало...


в моем редакторе код выглядит по другому

Если твой редактор - Pawno, то ничего удивительного. Он любит табы превращать в пробелы



GetPlayerVehicleID - возвращает 0 при отсутствие тс на сервере, этого достаточно для проверки, а иные не правильно переданные идентификаторы это уже проблемы скриптера, и да я думаю опытный скриптер сначала сам проверит на валидность тс, перед тем как использовать эту функцию

А что тебе мешает переделать код так, как посоветовал Ziggi, избавившись от лишней проверки на валидность? От того, что ты добавил явную "проверку" на валидность (хоть она таковой и не считается), проверка из GetVehicleHealth не исчезнет и сервер опять проверит указанный ID авто, только уже внутри функции.

Твой код сейчас - полная каша. Начиная от странных переносов текста в сообщениях и заканчивая вот этим

new g_en_lights, g_en_alarm, g_en_doors,
g_en_bonnet, g_en_boot, g_en_objective;
GetVehicleParamsEx(vehicleid, g_en_lights, g_en_lights,
g_en_alarm, g_en_doors, g_en_bonnet, g_en_boot, g_en_objective);

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

Geebrox
12.11.2016, 21:35
Давно таких кадров на pro-pawn не заглядывало...



Если твой редактор - Pawno, то ничего удивительного. Он любит табы превращать в пробелы


Нет, к сожалению не угадал. Пользуюсь st3, а пробелы ставил сам на форуме, я уже говорил что редактировал код прямо на форуме, сколько еще повторять?


А что тебе мешает переделать код так, как посоветовал Ziggi

Не буду редактировать, совет от Ziggi стоит в комментариях. Пусть другие увидят мои ошибки и будут учиться на них.

P.S. Следующий раз буду пользоваться советами Ziggi конечно. За то немного поспорили, а спор это всегда хорошо, многие берут новые информации от спора. Я с самого начала понимал, что не прав, но немного захотелось поспорить так сказать :pardon:

ziggi
13.11.2016, 00:56
Я с самого начала понимал, что не прав, но немного захотелось поспорить так сказать :pardon:

Я бы за это бан давал...

whale
05.05.2017, 00:39
Нет, к сожалению не угадал. Пользуюсь st3, а пробелы ставил сам на форуме, я уже говорил что редактировал код прямо на форуме, сколько еще повторять?



Не буду редактировать, совет от Ziggi стоит в комментариях. Пусть другие увидят мои ошибки и будут учиться на них.

P.S. Следующий раз буду пользоваться советами Ziggi конечно. За то немного поспорили, а спор это всегда хорошо, многие берут новые информации от спора. Я с самого начала понимал, что не прав, но немного захотелось поспорить так сказать :pardon:

Какие цели Вы преследовали при написании данного комментария? Неужели так сложно исправить свой код, чтобы люди, которые, как Вы выразились, "увидят мои ошибки и будут учиться на них" сразу учились нормальному коду, а не повторяли чужие ошибки, в итоге?

vovandolg
08.05.2017, 10:59
Я бы за это бан давал...

это как то по римлянски))) а если бы он через некоторое время оказался прав?))