Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Ошибка в коде
Vitaminoz Дата: Среда, 05.02.2014, 16:02:46 | Сообщение # 1
Сообщений: 141
Репутация: 1 [ +/- ]
Есть кусок кода в скрипте:
Код
    new hurt_zombie = CreateEntityByName("point_hurt");
  decl Float:vec_hurt[3];
  vec_hurt[0] = GetEventFloat(event, "x");
  vec_hurt[1] = GetEventFloat(event, "y");
  vec_hurt[2] = GetEventFloat(event, "z");
  DispatchKeyValueVector(hurt_zombie, "origin", vec_hurt);
  DispatchKeyValue(hurt_zombie, "Damage", "20");
  DispatchSpawn(hurt_zombie);
  AcceptEntityInput(hurt_zombie, "TurnOn");
  CreateTimer(30.0, SmokeParticle, hurt_zombie);

Код
public Action:SmokeParticle(Handle:timer, any:hurt_zombie)
{
  AcceptEntityInput(hurt_zombie, "kill");
}

Но, иногда (не всегда) в Error заноситься такая информация :
Код
L 02/05/2014 - 10:37:20: [SM] Native "AcceptEntityInput" reported: Entity 163 (163) is not a CBaseEntity
L 02/05/2014 - 10:37:20: [SM] Displaying call stack trace for plugin "zombie_horde.smx":
L 02/05/2014 - 10:37:20: [SM]   [0]  Line 74, zombie_horde.sp::SmokeParticle()

не могу понять где я ошибся.
 
_wS_ Дата: Среда, 05.02.2014, 16:37:26 | Сообщение # 2
Тут ошибка не в коде, а в логике. CreateTimer(30.0, SmokeParticle, hurt_zombie). За 30 сек может многое произойти, и раунд начаться новый, и карта смениться, а таймер все равно сработает. Индекс с номером hurt_zombie уже может принадлежать совсем другой entity. Тест простой:

1. создал entity (пусть ее индекс 57)
2. удалил её
3. создал сразу же снова
4. индекс снова 57, но entity то уже другая

Так надежно:

Код
CreateTimer(30.0, SmokeParticle, EntIndexToEntRef(hurt_zombie), TIMER_FLAG_NO_MAPCHANGE);

public Action:SmokeParticle(Handle:timer, any:ref)
{
     new entity = EntRefToEntIndex(ref);
     if (entity > 0) AcceptEntityInput(entity, "kill");
     return Plugin_Stop;
}

Всегда нужно просчитывать варианты "что может пойти не так". Вот по коду видно, что после начала нового раунда таймер может работать и дальше. Если таймеров несколько и срабатывают они с неплохой задержкой, то очевидно, что лучше сохранить их Handle и в начале раунда убить.
 
Vitaminoz Дата: Среда, 05.02.2014, 17:00:19 | Сообщение # 3
Сообщений: 141
Репутация: 1 [ +/- ]
Действительно совсем забыл по это. Спасибо. Я тоже вспомнил про то что index меняться будет думал через targetname убивать.И Кстати разве return Plugin_Stop не в таймере только с флагом TIMER_REPEAT ?


Сообщение отредактировал Vitaminoz - Среда, 05.02.2014, 17:01:09
 
_wS_ Дата: Среда, 05.02.2014, 18:27:36 | Сообщение # 4
Цитата Vitaminoz ()
Кстати разве return Plugin_Stop не в таймере только с флагом TIMER_REPEAT ?

Да, можно не писать, но мне так удобнее, для уверенности.
 
  • Страница 1 из 1
  • 1
Поиск: