PDA

Просмотр полной версии : [Include] ЭМИ система для удаленного отключения транспорта



NewGreen
22.10.2015, 12:34
Приветствую, наверное многие видели как в Need For Speed (в некоторых частях) полицейские могли обезвреживали машину гонщика при помощи ЭМИ.
Как нам известно ЭМИ - это Электромагнитный импульс, который блокирует работу двигателя автомобиля попутно выводя из строя всю электронную начинку.

Сегодня хочу представить вам подобную систему для SA:MP, но с некоторыми отличиями от той что была в NFS.
Основное отличие, в том что, в оригинальной NFS оборудование ЭМИ установлено в автомобиле, в нашей же системе, в качестве ЭМИ используется переностное оружие, вы можете настроить ЭМИ на любом огнестрельном оружии.

Приступим к описанию:

Основные функции:

SetEMPStatusToPlayer(playerid,status) - функция позволяющая включить/выключить возможность использовать ЭМИ для игрока.

параметры:
playerid - ID игрока
status - переключатель true, false
опции:
true - включить ЭМИ для игрока
false - выключить ЭМИ для игрока

IsVehicleUnderEMP(vehicleid) - функция проверяющая был ли транспорт, атакован при помощи ЭМИ.

параметры:
vehicleid - ID транспорта.
возвращает:
true - если машина не в рабочем состоянии, т.е. была под воздействием ЭМИ.
false - если машина в рабочем состоянии.

SetPlayerEMPWeapon(playerid,weaponid) - функция позволяющая установить для игрока статус ЭМИ для любого огнестрельного оружия.

параметры:
playerid - ID игрока
weaponid - ID огнестрельного оружия



Дополнительные настройки

#define EMP_SOUND_ID 6600 - определяет ID звука ЭМИ который слышен окружающим при воздействии ЭМИ на транспорт
#define EMP_WORK_DISTANCE 50 - определяет рабочую дистанцию ЭМИ.

Приступим к установке:

Первое что нужно сделать это - скачать и подключить файл empsystem.inc


#include <a_samp>
#include <empsystem>
// ...

Важно подключить файл после файла a_samp.inc !

Некоторые нюансы/советы в работе системы ЭМИ:

1. Первый выстрел из оружия ЭМИ лишь повредит электронную часть транспорта, последующие выстрелы будут наносить прямой урон.
Это сделано для того чтобы игрок мог "отключить" транспорт в плохом физическом состоянии (дымящийся) не взорвав его.
2. На каждый транспорт вам дается один ЭМИ выстрел.
3. Функцию SetEMPStatusToPlayer можно использовать в таймере, чтобы ограничить время перезарядки ЭМИ.
Подобное решение позволит ограничить количество выстрелов ЭМИ, например можно сделать чтобы ЭМИ заряд был доступен раз в 10 сек

Upd:


v 1.1
- Проведена оптимизация функции GetDistanceFromPlayerToVehicle, за счет нативной функции VectorSize,
скорость работы функции возросла в ~3,5 раза.
- Убраны расширенные настройки, с целью не создавать излишнюю функциональность.
- Проведены легкие "косметические" изменения.



Ссылки для скачивания:

http://rghost.ru (http://rghost.ru/private/8Vb8WhRsg/e2d5899956ac589abd1c5122e9914651)
http://pastebin.com/ (http://pastebin.com/2B3BGaiX)

Спасибо за внимание!

Автор: NewGreen

Daniel_Cortez
22.10.2015, 18:02
Спрошу сразу: готовы ли вы прислушиваться к чужой критике и учитывать пожелания в этой теме в новых версиях инклуда (если таковые вообще планируются)?
Просто раньше уже были случаи с игнорированием всяческих советов и пожеланий (пример (http://pro-pawn.ru/showthread.php?12757), ещё пример (http://pro-pawn.ru/showthread.php?12744), и ещё (http://pro-pawn.ru/showthread.php?12769)), не хотелось бы попросту сотрясать здесь воздух.

NewGreen
22.10.2015, 18:22
Спрошу сразу: готовы ли вы прислушиваться к чужой критике и учитывать пожелания в этой теме в новых версиях инклуда (если таковые вообще планируются)?
Просто раньше уже были случаи с игнорированием всяческих советов и пожеланий (пример (http://pro-pawn.ru/showthread.php?12757), ещё пример (http://pro-pawn.ru/showthread.php?12744), и ещё (http://pro-pawn.ru/showthread.php?12769)), не хотелось бы попросту сотрясать здесь воздух.
Конечно, я только за, честная критика помогает учится и улучшатся!

$continue$
22.10.2015, 18:27
По сути функция должна, что то вернуть. (Предлагаю вернуть статус [true/false])


forward SetEMPStatusToPlayer(playerid,bool:status);
public SetEMPStatusToPlayer(playerid,bool:status)
{
playerEMPStatus{playerid} = status;
}

Удобство? Не думаю. То есть, я должен порыться в коде, что бы увидеть что обращение идет к char


#define IsVehicleUnderEMP(%0) vehicleEMPStatus{%0}

Ну и в добавок какие то кривые названия переменных (EMP).
Что это?

http://i.imgur.com/UgmkiJz.png
http://i.imgur.com/JT7Tn8n.png

Daniel_Cortez
22.10.2015, 19:04
По сути функция должна, что то вернуть. (Предлагаю вернуть статус [true/false])


forward SetEMPStatusToPlayer(playerid,bool:status);
public SetEMPStatusToPlayer(playerid,bool:status)
{
playerEMPStatus{playerid} = status;
}

Это "Set", а не "Get".


Ну и в добавок какие то кривые названия переменных (EMP).
Что это?

http://i.imgur.com/UgmkiJz.png
http://i.imgur.com/JT7Tn8n.png

wp:Electromagnetic pulce (EMP) (https://en.wikipedia.org/wiki/Electromagnetic_pulse)

P.S.: Свои замечания опубликую чуть позже. Пока что можете посмотреть замечание по поводу #define здесь (http://pro-pawn.ru/showthread.php?12744&p=64690&viewfull=1#post64690), у вас проблема точно такая же (нужно редактировать инклуд, в то время, как можно передать параметры в инклуд из использующего скрипта без редактирования чужого кода). И определитесь с префиксом в перехватах: ставить дефолтный "MyLib" - куда это годно? Проявите хоть немного уникальности в этом плане, это же инклуд с реализацией EMP, а не какая-то серая "MyLib".

NewGreen
22.10.2015, 19:14
По сути функция должна, что то вернуть. (Предлагаю вернуть статус [true/false])


forward SetEMPStatusToPlayer(playerid,bool:status);
public SetEMPStatusToPlayer(playerid,bool:status)
{
playerEMPStatus{playerid} = status;
}


Функция лишь переключает положение, вкл/выкл для игрока, и ничего не возвращает.

Удобство? Не думаю. То есть, я должен порыться в коде, что бы увидеть что обращение идет к char


#define IsVehicleUnderEMP(%0) vehicleEMPStatus{%0}

Сначала отвечу сам, потом задам вам встречный вопрос)
Сделано это, как вы отметили - для удобства, т.к. по сути дела это интерфейс к состоянию переключателя, и приятнее будет когда он будет выглядеть так:

IsVehicleUnderEMP(vehicleid)
нежели

vehicleEMPStatus{vehicleid}
сути дела это не меняет, но, добавляет единообразия в систему.
char - используется лишь в целях экономии, да и значений всего два это - true и false.

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


Ну и в добавок какие то кривые названия переменных (EMP).
Что это?

http://i.imgur.com/UgmkiJz.png
http://i.imgur.com/JT7Tn8n.png

EMP от слова electromagnetic pulse - что в переводе Электромагнитный импульс

NewGreen
12.11.2015, 19:30
Upd:


v 1.1
- Проведена оптимизация функции GetDistanceFromPlayerToVehicle, за счет нативной функции VectorSize,
скорость работы функции возросла в ~3,5 раза.
- Убраны расширенные настройки, с целью не создавать излишнюю функциональность.
- Проведены легкие "косметические" изменения.