AMX MOD X
Четверг, 28.03.2024, 15:25:29



Приветствую Вас Гость | RSS
[ Главная ] [ [engine] Test script: remove default drop weapons - AMX Mod X Форум ] [ Регистрация ] [ Вход ]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/

  • Страница 1 из 1
  • 1
Модератор форума: slogic, AlMod  
AMX Mod X Форум » Скриптинг » Скрипты » [engine] Test script: remove default drop weapons (удаление дропа оружия)
[engine] Test script: remove default drop weapons
BruteДата: Пятница, 29.08.2008, 00:46:25 | Сообщение # 1
Генерал-полковник
Группа: Скриптеры
Сообщений: 1123
Репутация: 9
Статус: Не в сети
Все наверное знают и помнят, как это делает 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)
}

Прикрепил исходный файл ниже:

Прикрепления: ts_remove_ddw.sma (0.7 Kb)
 
DaTaДата: Пятница, 29.08.2008, 01:35:12 | Сообщение # 2
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Репутация: 16
Статус: Не в сети
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
Репутация: 9
Статус: Не в сети
Quote (DaTa)
а вообще вроде не безопасно удалять таким образом weaponbox, VEN разработал специально для этого

Это engine, а не fakemeta, две разные вещи, и работают они по разному. <_<

Притом weaponbox пока удаляется без ошибочно - опыт, а вот

Quote (DaTa)
weapon_*
(оружие в руках) лучше не трогать - опыт P
 
DaTaДата: Пятница, 29.08.2008, 02:52:45 | Сообщение # 4
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Репутация: 16
Статус: Не в сети
то оружие уже не в руках, оно взаимодействует с weaponbox, и когда ты удаляешь одно без второго - могут возникнуть ошибки.
 
VENДата: Пятница, 29.08.2008, 19:49:03 | Сообщение # 5
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Репутация: 45
Статус: Не в сети
Нужно форсировать Think weaponbox'a (будь то engine или fakemeta) - безопасный и естественный способ удаления т.н. ent пары - weaponbox+weapon_*. Remove метод нестабилен, тем более, принимая во внимание, что ты дробишь т.н. ent пару.
 
BruteДата: Суббота, 30.08.2008, 09:21:23 | Сообщение # 6
Генерал-полковник
Группа: Скриптеры
Сообщений: 1123
Репутация: 9
Статус: Не в сети
вот на офф.форуме нашёл, что нужно использовать call_think() вместо remove_entity(), сам лично тестил-удаляются и weaponbox и weapon_* - в общем лепота. Будет желание-обновлю скрипт.
 
DaTaДата: Суббота, 30.08.2008, 13:09:38 | Сообщение # 7
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Репутация: 16
Статус: Не в сети
Quote (Brute)
вот на офф.форуме нашёл, что нужно использовать call_think() вместо remove_entity(), сам лично тестил-удаляются и weaponbox и weapon_* - в общем лепота. Будет желание-обновлю скрипт.

тебе это два раза сказали, читай выше :D
 
BruteДата: Суббота, 30.08.2008, 14:17:01 | Сообщение # 8
Генерал-полковник
Группа: Скриптеры
Сообщений: 1123
Репутация: 9
Статус: Не в сети
Quote (DaTa)
тебе это два раза сказали, читай выше :D

Вы функцию для FM назвали :D , а я хз как она в engine называется, там их три-четыре функции которые в названии имеют Think.


Сообщение отредактировал Brute - Суббота, 30.08.2008, 14:17:25
 
VENДата: Воскресенье, 31.08.2008, 14:04:44 | Сообщение # 9
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Репутация: 45
Статус: Не в сети
Почитай описание в 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
Репутация: 0
Статус: Не в сети
Неплохо, но метод с 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
Репутация: 47
Статус: Не в сети
По-моему выше говорили, что форсированное удаление weaponbox некорректно.
 
RadianceДата: Среда, 25.03.2009, 15:58:50 | Сообщение # 12
Рядовой
Группа: Пользователи
Сообщений: 19
Репутация: 0
Статус: Не в сети
Quote (slogic)
По-моему выше говорили, что форсированное удаление weaponbox некорректно.

Удаляется вместе с самим оружием не только box'ом, так что всё нормально в этом случае, тем более при присутствии проверки pev ( ) ничего страшного не произойдёт.

 
AnOrangeJuiceДата: Суббота, 24.10.2009, 20:13:51 | Сообщение # 13
Лейтенант
Группа: Пользователи
Сообщений: 62
Репутация: 2
Статус: Не в сети
вот 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 Форум » Скриптинг » Скрипты » [engine] Test script: remove default drop weapons (удаление дропа оружия)
  • Страница 1 из 1
  • 1
Поиск:

AMX Mod X Russian Community © 2006-2024