Просмотр полной версии : [Прочее] Завод двигателя исходя из здоровье транспорта
Описание:
Функция, которая позволяет завести двигатель исходя из здоровья транспорта. Чем больше здоровья транспорта, тем больше шансов завести её.
Функция:
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;
}
Автор: Я
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;
лучше объявить глобально, они много где используются и легче один раз глобально чем во всех пабликах локально
То, что во втором операнде поставь в первый, ибо у тебя больше шансов будет не завести двигатель, когда будет больше здоровья нежели меньше.
да да, точно. Просто я изменил код прямо на форуме, то есть изменил логику работы чуть-чуть и забыл изменить return. Исправил!
по мне
new lights, alarm, doors, bonnet, boot, objective;
лучше объявить глобально, они много где используются и легче один раз глобально чем во всех пабликах локально
Че этим хочешь сказать? А может они уже объявлены? У всех свои переменные. И да я изменил название переменных, вдруг они уже объявлены. А глобальные я не буду создавать, кто даст гарантии, что именно из за этой функций будут использовать только созданные для него глобальные переменные? Логику включим, не?
KrutoyKrosch
11.11.2016, 19:58
Если кто то будет ставить эту функцию, то следующая будет 100% управление дверями/капотом/багажником/дверями. И придется каждый раз их объявлять, лучше уж создать один раз глобально, от этого ничего не изменится...
Если кто то будет ставить эту функцию, то следующая будет 100% управление дверями/капотом/багажником/дверями. И придется каждый раз их объявлять, лучше уж создать один раз глобально, от этого ничего не изменится...
Многое изменится, я не хочу что бы мои скрипты каким-либо образом мешали "работать" основному коду юзера. А если эти переменные уже созданы как глобальные? Потом что? Каждый новичок будет стучать мне вопросом: "Я поставил твой код и вылезла эта ошибка"?
Не вижу смысла продолжать дискуссию на эту тему о переменных!
Реализация хорошая. Но, тем не менее, можно сделать проверку на существование т/с в игре.
Реализация хорошая. Но, тем не менее, можно сделать проверку на существование т/с в игре.
Добавил
Реализация хорошая. Но, тем не менее, можно сделать проверку на существование т/с в игре.
- Некорректное название функции (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 лучше вынести в команду и возвращать код ошибки.
- Некорректное название функции (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. Мое мнение о вашем посте: Выглядит так как будто хотели "понтанутся" указывая на незначительные почти не заметные различие кода, это лично мое мнение и изменять я его не собираюсь (можете на это не обращать внимание)
Признаюсь что не дружу с английским (учу), и упрекать в этом как то странно, если хочу поставлю вообще 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. Мое мнение о вашем посте: Выглядит так как будто хотели "понтанутся" указывая на незначительные почти не заметные различие кода, это лично мое мнение и изменять я его не собираюсь (можете на это не обращать внимание)
Тогда этот форум точно не для твоих работ, увы.
Признаюсь что не дружу с английским (учу), и упрекать в этом как то странно, если хочу поставлю вообще 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.
Это был ответ на "Реализация хорошая", если бы не это, я бы прошёл мимо.
Опять таки, как название функций определяет уровень реализации? Как вообще связаны эти 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)
Я запихнул его туда куда надо, GetVehicleHealth тоже вызывается ВСЕГДА в отличии от моего кода и могут быть лишние вызовы если это авто не валидный (INVALID_VEHICLE_ID)
Уходя, просто советую ознакомиться с тем, какие значения возврващает GetPlayerVehicleID (https://wiki.sa-mp.com/wiki/GetPlayerVehicleID_RU), прежде чем говорить о том, о чём ты пытаешься говорить.
Уходя, просто советую ознакомиться с тем, какие значения возврващает GetPlayerVehicleID (https://wiki.sa-mp.com/wiki/GetPlayerVehicleID_RU), прежде чем говорить о том, о чём ты пытаешься говорить.
не вопрос, изменил на !vehicleid
не вопрос, изменил на !vehicleid
-_-
Попробуй уже вслушаться в слова Ziggi. Он тебе всё по делу говорит
если я создам всего 1 автомобиль на сервере, но укажу ID 100, твоя проверка пропустит этот ID, хоть такого авто и не будет существовать.
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. Ушёл, утром буду.
Я просто пытаюсь помочь людям писать хороший код. Истина кроется в мелочах. Да и не особо это можно назвать мелочами, для меня это довольно серьёзные ошибки (некоторые из мной перечисленных).
Никто не способен взять и изменить своё мнение :). Мнение меняется в результате каких-либо обстоятельств. Мне не удалось тебя убедить, поэтому твоё мнение не изменилось.
Да не удалось убедить и ничего не поделать :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. Он тебе всё по делу говорит
твой ответ находится чуть выше
Давно таких кадров на 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);
И твоя упёртость сейчас совершенно ничем необоснованна. Если ты пишешь код так, как нравится тебе, то и оставляй его при себе. А мы уж как-нибудь сами напишем всё, что нам понадобится. Ну а если хочешь стать частью этого комьюнити - будь добр, придерживайся общепринятых правил
Давно таких кадров на pro-pawn не заглядывало...
Если твой редактор - Pawno, то ничего удивительного. Он любит табы превращать в пробелы
Нет, к сожалению не угадал. Пользуюсь st3, а пробелы ставил сам на форуме, я уже говорил что редактировал код прямо на форуме, сколько еще повторять?
А что тебе мешает переделать код так, как посоветовал Ziggi
Не буду редактировать, совет от Ziggi стоит в комментариях. Пусть другие увидят мои ошибки и будут учиться на них.
P.S. Следующий раз буду пользоваться советами Ziggi конечно. За то немного поспорили, а спор это всегда хорошо, многие берут новые информации от спора. Я с самого начала понимал, что не прав, но немного захотелось поспорить так сказать :pardon:
Я с самого начала понимал, что не прав, но немного захотелось поспорить так сказать :pardon:
Я бы за это бан давал...
Нет, к сожалению не угадал. Пользуюсь st3, а пробелы ставил сам на форуме, я уже говорил что редактировал код прямо на форуме, сколько еще повторять?
Не буду редактировать, совет от Ziggi стоит в комментариях. Пусть другие увидят мои ошибки и будут учиться на них.
P.S. Следующий раз буду пользоваться советами Ziggi конечно. За то немного поспорили, а спор это всегда хорошо, многие берут новые информации от спора. Я с самого начала понимал, что не прав, но немного захотелось поспорить так сказать :pardon:
Какие цели Вы преследовали при написании данного комментария? Неужели так сложно исправить свой код, чтобы люди, которые, как Вы выразились, "увидят мои ошибки и будут учиться на них" сразу учились нормальному коду, а не повторяли чужие ошибки, в итоге?
vovandolg
08.05.2017, 10:59
Я бы за это бан давал...
это как то по римлянски))) а если бы он через некоторое время оказался прав?))
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot