|
Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/
[engine] Test script: remove default drop weapons
|
|
Brute | Дата: Пятница, 29.08.2008, 00:46:25 | Сообщение # 1 |
Генерал-полковник
Группа: Скриптеры
Сообщений: 1123
Статус: Не в сети
| Все наверное знают и помнят, как это делает CSDM - игрок бросает оружие, и в пол метре от земли оно испаряется. CSDM просто отлавливает команду клиента-drop или событие смерти игрока, запускает таймер равным примерно 0,1 - 0,2 секунды у тогда уж удаляет дроп. Я же предлагаю новый способ. Метод столкновения Entity с другой любой Entity. Метод работает на ура. Игрок даже не видит процесс удаления оружия, когда его бросает, т.к. оно соприкасается с его моделью(игрок тоже Entity). При смерти оружие обязательно сталкивается с полом-результат уничтожение. Собственно пошаговое описание(что куда и зачем): Code #include <amxmodx> //подключаем главный модуль #include <engine> //подключаем модуль engine //регистрируем плагин Code public plugin_init() { //обзываем плагин, задаём версию, и автора register_plugin("Test script: remove default drop weapons", "TS 1.0", "amxmodx.ucoz.ru")
// регистрируем cvar с помощью, которой потом можно будет легко включить/отключить плагин register_cvar("ts_remove_ddw", "1")
//регистрируем прикосновение двух ентити(в нашем случаи 1-"weaponbox", 2-все другие классы, //при каждом прикосновении будет вызываться процедура "weaponbox_touch") register_touch("weaponbox", "", "weaponbox_touch") } //описываем процедуру weaponbox_touch //Примечание: eid - entity Index Code public weaponbox_touch(eid) { //проверяем cvar-если не равен 1-прерываем дальнейшее выполнение плагина, // и продолжаем выполнение всего остального(в том числе и дропа) if(get_cvar_num("ts_remove_ddw") != 1) return PLUGIN_CONTINUE //проверяем дествительно ли ентити существует, //если нет-прерываем дальнейшее выполнение плагина //(возможно другой плагин уже нас опередил и удалил эту(этот) entity) if(!is_valid_ent(eid)) return PLUGIN_HANDLED
//создаем массив размером 32 ячейки(0-31) new modelname[32] //получаем название модели, которое использует эта(этот) entity entity_get_string(eid, EV_SZ_model, modelname, 31)
//сравниваем полученное название модели с моделью C4(бомбы) //чтобы не удалить её, т.к. она в брошенном состоянии, //имеет класс "weaponbox". //если соответсвие НЕ установлено-продолжаем выполнение плагина, //если УСТАНОВЛЕНО тогда прерываем дальнейшее выполнение плагина, // и продолжаем выполнение всего остального(в том числе и дропа)
if(!equali(modelname, "models/w_backpack.mdl")) { //вызываем процедуру уничтожения Entity //информация в скобочках передаст entity Index destroy_ent(eid) //заканчиваем выполнение этой процедуры return PLUGIN_HANDLED } return PLUGIN_CONTINUE } //описываем процедуру destroy_ent //Примечание: eid - entity Index Code public destroy_ent(eid) { //вновь проверяем(для собственных нервных клеток) //правильную(ый) ли мы Entity удаляем if(is_valid_ent(eid)) //собственно само удаление этой Entity remove_entity(eid) } Полный код с описанием: Code #include <amxmodx> //подключаем главный модуль #include <engine> //подключаем модуль engine
//регистрируем плагин public plugin_init() { //обзываем плагин, задаём версию, и автора register_plugin("Test script: remove default drop weapons", "TS 1.0", "amxmodx.ucoz.ru")
// регистрируем cvar с помощью, которой потом можно будет легко включить/отключить плагин register_cvar("ts_remove_ddw", "1")
//регистрируем прикосновение двух ентити(в нашем случаи 1-"weaponbox", 2-все другие классы, //при каждом прикосновении будет вызываться процедура "weaponbox_touch") register_touch("weaponbox", "", "weaponbox_touch") }
//описываем процедуру weaponbox_touch //Примечание: eid - entity Index public weaponbox_touch(eid) { //проверяем cvar-если не равен 1-прерываем дальнейшее выполнение плагина, // и продолжаем выполнение всего остального(в том числе и дропа) if(get_cvar_num("ts_remove_ddw") != 1) return PLUGIN_CONTINUE //проверяем дествительно ли ентити существует, //если нет-прерываем дальнейшее выполнение плагина //(возможно другой плагин уже нас опередил и удалил эту(этот) entity) if(!is_valid_ent(eid)) return PLUGIN_HANDLED
//создаем массив размером 32 ячейки(0-31) new modelname[32] //получаем название модели, которое использует эта(этот) entity entity_get_string(eid, EV_SZ_model, modelname, 31)
//сравниваем полученное название модели с моделью C4(бомбы) //чтобы не удалить её, т.к. она в брошенном состоянии, //имеет класс "weaponbox". //если соответсвие НЕ установлено-продолжаем выполнение плагина, //если УСТАНОВЛЕНО тогда прерываем дальнейшее выполнение плагина, // и продолжаем выполнение всего остального(в том числе и дропа)
if(!equali(modelname, "models/w_backpack.mdl")) { //вызываем процедуру уничтожения Entity //информация в скобочках передаст entity Index destroy_ent(eid) //заканчиваем выполнение этой процедуры return PLUGIN_HANDLED } return PLUGIN_CONTINUE }
//описываем процедуру destroy_ent //Примечание: eid - entity Index public destroy_ent(eid) { //вновь проверяем(для собственных нервных клеток) //правильную(ый) ли мы Entity удаляем if(is_valid_ent(eid)) //собственно само удаление этой Entity remove_entity(eid) } Полученный код без описания: Code #include <amxmodx> #include <engine>
public plugin_init() { register_plugin("Test script: remove default drop weapons", "TS 1.0", "amxmodx.ucoz.ru") register_cvar("ts_remove_ddw", "1") register_touch("weaponbox", "", "weaponbox_touch") }
public weaponbox_touch(eid) { if(get_cvar_num("ts_remove_ddw") != 1) return PLUGIN_CONTINUE if(!is_valid_ent(eid)) return PLUGIN_HANDLED
new modelname[32] entity_get_string(eid, EV_SZ_model, modelname, 31)
if(!equali(modelname, "models/w_backpack.mdl")) { destroy_ent(eid) return PLUGIN_HANDLED } return PLUGIN_CONTINUE }
public destroy_ent(eid) { if(is_valid_ent(eid)) remove_entity(eid) } Прикрепил исходный файл ниже:
|
|
| |
DaTa | Дата: Пятница, 29.08.2008, 01:35:12 | Сообщение # 2 |
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Статус: Не в сети
| Quote (Brute) if(!is_valid_ent(eid)) return PLUGIN_HANDLED Code public destroy_ent(eid) { if(is_valid_ent(eid)) remove_entity(eid) } ты уже выполнил проверку is_valid_ent(eid), зачем второй раз? а вообще вроде не безопасно удалять таким образом weaponbox, VEN разработал специально для этого Code // safe removal of weaponbox+weapon_* entity pair (delay =~= 0.03 second) #define fm_remove_weaponbox(%1) dllfunc(DLLFunc_Think, %1) Quote (Brute) if(!is_valid_ent(eid)) return PLUGIN_HANDLED нет необходимости блокировать этот вызов
|
|
| |
Brute | Дата: Пятница, 29.08.2008, 01:57:26 | Сообщение # 3 |
Генерал-полковник
Группа: Скриптеры
Сообщений: 1123
Статус: Не в сети
| Quote (DaTa) а вообще вроде не безопасно удалять таким образом weaponbox, VEN разработал специально для этого Это engine, а не fakemeta, две разные вещи, и работают они по разному. Притом weaponbox пока удаляется без ошибочно - опыт, а вот (оружие в руках) лучше не трогать - опыт
|
|
| |
DaTa | Дата: Пятница, 29.08.2008, 02:52:45 | Сообщение # 4 |
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Статус: Не в сети
| то оружие уже не в руках, оно взаимодействует с weaponbox, и когда ты удаляешь одно без второго - могут возникнуть ошибки.
|
|
| |
VEN | Дата: Пятница, 29.08.2008, 19:49:03 | Сообщение # 5 |
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| Нужно форсировать Think weaponbox'a (будь то engine или fakemeta) - безопасный и естественный способ удаления т.н. ent пары - weaponbox+weapon_*. Remove метод нестабилен, тем более, принимая во внимание, что ты дробишь т.н. ent пару.
|
|
| |
Brute | Дата: Суббота, 30.08.2008, 09:21:23 | Сообщение # 6 |
Генерал-полковник
Группа: Скриптеры
Сообщений: 1123
Статус: Не в сети
| вот на офф.форуме нашёл, что нужно использовать call_think() вместо remove_entity(), сам лично тестил-удаляются и weaponbox и weapon_* - в общем лепота. Будет желание-обновлю скрипт.
|
|
| |
DaTa | Дата: Суббота, 30.08.2008, 13:09:38 | Сообщение # 7 |
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Статус: Не в сети
| Quote (Brute) вот на офф.форуме нашёл, что нужно использовать call_think() вместо remove_entity(), сам лично тестил-удаляются и weaponbox и weapon_* - в общем лепота. Будет желание-обновлю скрипт. тебе это два раза сказали, читай выше
|
|
| |
Brute | Дата: Суббота, 30.08.2008, 14:17:01 | Сообщение # 8 |
Генерал-полковник
Группа: Скриптеры
Сообщений: 1123
Статус: Не в сети
| Quote (DaTa) тебе это два раза сказали, читай выше :D Вы функцию для FM назвали , а я хз как она в engine называется, там их три-четыре функции которые в названии имеют Think.
Сообщение отредактировал Brute - Суббота, 30.08.2008, 14:17:25 |
|
| |
VEN | Дата: Воскресенье, 31.08.2008, 14:04:44 | Сообщение # 9 |
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| Почитай описание в engine.inc - там все написано. Даже без описаний понятно, что forward pfn_think - это форвард функция; native register_think регистрирует think; forward client_PreThink(id), forward client_PostThink(id) - клиентские форвард функции. Методом исключения можно было бы легко выйти на Quote //this will CBaseEntity::Think() or something from the entity native call_think(entity); Включай логику - ты же вроде как "скриптер"...
|
|
| |
Radiance | Дата: Вторник, 24.03.2009, 18:01:40 | Сообщение # 10 |
Рядовой
Группа: Пользователи
Сообщений: 19
Статус: Не в сети
| Неплохо, но метод с engine уже давно устарел. Более актуальным методом на сегодняшний день является hamsandwich ну или fakemeta. Способ fakemeta: Code #include < amxmodx > #include < fakemeta >
public plugin_init ( ) { register_plugin ( "NoDrop", "1.0", "Radiance" ) register_forward ( FM_Touch, "Forward_HookTouchPre", 0 ) }
public Forward_HookTouchPre ( iEnt ) if ( pev_valid (iEnt ) ) { new szClassName [ 32 ] pev ( iEnt, pev_classname, szClassName, sizeof ( szClassName ) - 1 )
if ( equal ( szClassName, "weaponbox" ) ) engfunc ( EngFunc_RemoveEntity, iEnt ) }
Сообщение отредактировал Radiance - Вторник, 24.03.2009, 18:02:04 |
|
| |
slogic | Дата: Среда, 25.03.2009, 15:30:26 | Сообщение # 11 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| По-моему выше говорили, что форсированное удаление weaponbox некорректно.
|
|
| |
Radiance | Дата: Среда, 25.03.2009, 15:58:50 | Сообщение # 12 |
Рядовой
Группа: Пользователи
Сообщений: 19
Статус: Не в сети
| Quote (slogic) По-моему выше говорили, что форсированное удаление weaponbox некорректно. Удаляется вместе с самим оружием не только box'ом, так что всё нормально в этом случае, тем более при присутствии проверки pev ( ) ничего страшного не произойдёт.
|
|
| |
AnOrangeJuice | Дата: Суббота, 24.10.2009, 20:13:51 | Сообщение # 13 |
Лейтенант
Группа: Пользователи
Сообщений: 62
Статус: Не в сети
| вот fakemeta Code #include <amxmodx> #include <fakemeta> #include <hamsandwich>
public plugin_init( ) { register_plugin( "Remove Dropped Weapon", "1.0", "xPaw" ); RegisterHam( Ham_Spawn, "weaponbox", "FwdSpawnWeaponbox", 1 ); }
public FwdSpawnWeaponbox( iEntity ) { set_pev( iEntity, pev_flags, FL_KILLME ); dllfunc( DLLFunc_Think, iEntity ); return HAM_IGNORED; }
|
|
| |
| AMX Mod X Russian Community © 2006-2025 | |
|
| |