Русское сообщество по скриптингу

Оптимизированный вариант удаления объектов

Статьи или фрагменты кода для новичков и уже опытных скриптеров по SourceMod.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по SourceMod.

Оптимизированный вариант удаления объектов

Сообщение DJ_WEST » 23 июл 2010, 23:32

Автор: FoxMulder
Перевод: DJ_WEST

Если вам требуется удалить объект на карте через определенное время, то большинство для этого будет использовать таймер (CreateTimer), а также затем в функции прийдется проверять объект на его существование. В данной статье будет предложен другой более оптимизированный вариант удаления объектов в таких случаях:
[pawn]public KillEntityIn(i_Ent, Float:f_Seconds)
{
    if (IsValidEdict(i_Ent))
    {
        // Добавляем событие "kill" в очередь для удаления объекта
        decl String:s_AddOutput[64]
        FormatEx(s_AddOutput, sizeof(s_AddOutput), "OnUser1 !self:kill::%f:1", f_Seconds)
        SetVariantString(s_AddOutput)
        AcceptEntityInput(i_Ent, "AddOutput")
        AcceptEntityInput(i_Ent, "FireUser1")
    }
}
  [/pawn]
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3747
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2164 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Оптимизированный вариант удаления объектов

Сообщение Jonny » 29 июл 2010, 01:27

Код: Выделить всё
public RemoveAllEntityes()
{
   new entity = -1;

   while ((entity = FindEntityByClassname2(entity, "weapon_autoshotgun_spawn")) != -1)
   {
      if (IsValidEdict(entity))
         RemoveEdict(entity);      
   }
}


это менее оптимизированный вариант, да?

Добавлено спустя 3 минуты 3 секунды:
Кстати, пробовал делать перехват создания объектов с помощью [EXTENSION] SDK Hooks, ситуация была следующая: создается объект, сразу же идет проверка на тип объекта. Если совпадает, то идет удаление. Причем не сразу, а по таймеру (0.1), чтобы не было краша. В итоге скрипт убирал все аптечки (как вариант) при первом запуске карты, однако после рестарта раунда аптечки лежали на месте... :)
Аватара пользователя
Jonny
 
Сообщения: 39
Зарегистрирован: 05 мар 2010, 01:00
Благодарил (а): 0 раз.
Поблагодарили: 8 раз.
Опыт программирования: Меньше месяца
Языки программирования: Counter-Strike 1.6
Left 4 Dead

Re: Оптимизированный вариант удаления объектов

Сообщение DJ_WEST » 30 июл 2010, 19:19

это менее оптимизированный вариант, да?

Нет, но это совсем другое. В первом посте говорится о варианте работе с объектами, когда нужно удалять какой-то объект по истечению промежутка времени, а твой вариант для удаления всех объектов одного класса на карте. Это разные вещи. И насчет удаления всех объектов одного класса в движке есть хорошая команда, по памяти по-мойму ent_remove_all classname. Я думаю, лучше вызывать ее, так как всю работу сделает функция движка за один вызов, чем большое кол-во вызовов через SourceMod.
Кстати, пробовал делать перехват создания объектов с помощью [EXTENSION] SDK Hooks, ситуация была следующая: создается объект, сразу же идет проверка на тип объекта. Если совпадает, то идет удаление. Причем не сразу, а по таймеру (0.1), чтобы не было краша. В итоге скрипт убирал все аптечки (как вариант) при первом запуске карты, однако после рестарта раунда аптечки лежали на месте... :)

Это все понятно, но SDKHooks сторонее расширение и использовать его только ради того, чтобы удалить объект, не очень привлекательно, когда с этим можно вполне справиться и без него.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3747
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2164 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Оптимизированный вариант удаления объектов

Сообщение Jonny » 31 июл 2010, 12:11

На картах c5m2_park и c3m2_swamp на последних респах оружия (например парк перед кнопкой выключения тревоги) при первом прохождении карты (сразу после смены карты, без повторных попыток) не удаляются респы оружия методом приведенным мной. На остальных картах всё работает нормально. И на этих двух картах после неудачной попытки прохождения тоже всё работает нормально. Поэтому и пробовал SDKHooks

ent_remove_all classname
я так подозреваю это удалит даже оружие в руках игроков.
Аватара пользователя
Jonny
 
Сообщения: 39
Зарегистрирован: 05 мар 2010, 01:00
Благодарил (а): 0 раз.
Поблагодарили: 8 раз.
Опыт программирования: Меньше месяца
Языки программирования: Counter-Strike 1.6
Left 4 Dead

Re: Оптимизированный вариант удаления объектов

Сообщение DJ_WEST » 31 июл 2010, 22:02

На картах c5m2_park и c3m2_swamp на последних респах оружия (например парк перед кнопкой выключения тревоги) при первом прохождении карты (сразу после смены карты, без повторных попыток) не удаляются респы оружия методом приведенным мной

Значит что-то не так делаешь, либо оно появляется после того, как ты проверяешь (с задержкой), либо у них другой classname.
я так подозреваю это удалит даже оружие в руках игроков.

weapon_autoshotgun_spawn - никак не удалит оружие из рук игрока, потому что префикс _spawn означает, что оружие спавнится на земле, после взятия игроком оно будет weapon_autoshotgun.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3747
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2164 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Оптимизированный вариант удаления объектов

Сообщение Jonny » 02 авг 2010, 18:46

classname я смотрел, у них обычный weapon_spawn
к тому же он удаляется при рестарте раунда
он так же удаляется сразу на всех других картах
а функция удаления запускается через секунду после старта раунда, через 15 секунд, через 60 секунд.
Аватара пользователя
Jonny
 
Сообщения: 39
Зарегистрирован: 05 мар 2010, 01:00
Благодарил (а): 0 раз.
Поблагодарили: 8 раз.
Опыт программирования: Меньше месяца
Языки программирования: Counter-Strike 1.6
Left 4 Dead


Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1