Создаю скрипт для овцы, которая ночью должна баиньки ложиться.
Имеется следующая проблема: после пробуждения овца не желает выполнять действия, определенные ей как Action через скрипт.
NSS
//Событие, отправляющее овцу поближе к пастуху и укладывающее ее спать.
if (nEvent==EVENT_S_SLEEP)
{
if (GetLocalInt(oSelf, "int_EVENT")==EVENT_S_SLEEP)
return;
SetLocalInt(oSelf, "int_EVENT", EVENT_S_SLEEP);
float fDist=(Random(8)+1)*1.0;
ActionMoveToObject(oPastuh, FALSE, fDist);
effect eSleep=EffectSleep();
ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSleep, oSelf));
};
//Событие, которое "будит" овцу.
if (nEvent==EVENT_S_WAKEUP)
{
SetLocalInt(oSelf, "int_EVENT", EVENT_S_WAKEUP);
//Снимаем эффект сна.
effect eEffect=GetFirstEffect(oSelf);
while (GetIsEffectValid(eEffect))
{
if (GetEffectType(eEffect)==EFFECT_TYPE_SLEEP)
RemoveEffect(oSelf, eEffect);
eEffect=GetNextEffect(oSelf);
};
ActionDoCommand(SignalEvent(oSelf, EventUserDefined(EVENT_S_WALK)));
};
//Событие, которое заставляет овцу шляться по локации (типа пастись).
if (nEvent==EVENT_S_WALK)
{
SetLocalInt(oSelf, "int_EVENT", EVENT_S_WALK);
ClearAllActions();
location lWalkTo=RandomLocation(oPastuh, 20.0, FALSE);
ActionMoveToLocation(lWalkTo, FALSE);
ActionWait(3.0);
ActionDoCommand(SignalEvent(oSelf, EventUserDefined(EVENT_S_WALK)));
};
При таком раскладе команд событие EVENT_S_WALK после пробуждения не наступает ВООБЩЕ.
Т.е. строка "ActionDoCommand(SignalEvent(oSelf, EventUserDefined(EVENT_S_WALK)));" не срабатывает.
Пробовал менять код вот так:
NSS
//Событие, которое "будит" овцу.
if (nEvent==EVENT_S_WAKEUP)
{
SetLocalInt(oSelf, "int_EVENT", EVENT_S_WAKEUP);
//Снимаем эффект сна.
SignalEvent(oSelf, EventUserDefined(EVENT_S_WALK));
effect eEffect=GetFirstEffect(oSelf);
while (GetIsEffectValid(eEffect))
{
if (GetEffectType(eEffect)==EFFECT_TYPE_SLEEP)
RemoveEffect(oSelf, eEffect);
eEffect=GetNextEffect(oSelf);
};
};
При этом овца вскакивает после сна, пробегает до заданной location, а потом опять застывает и стоит.
Т.е. строка "ActionDoCommand(SignalEvent(oSelf, EventUserDefined(EVENT_S_WALK)));" опять-таки не срабатывает, но на этот раз в событии EVENT_S_WALK.
ClearAllActions() в разных местах не помогает.
Что делать?..
.......................................
Блин, понял сам, в чем дело. Все симптомы навели на то, что блокирован стек действий персонажа. А посему исправил код вот так:
NSS
if (nEvent==EVENT_S_WAKEUP)
{
SetLocalInt(oSelf, "int_EVENT", EVENT_S_WAKEUP);
effect eEffect=GetFirstEffect(oSelf);
while (GetIsEffectValid(eEffect))
{
if (GetEffectType(eEffect)==EFFECT_TYPE_SLEEP)
RemoveEffect(oSelf, eEffect);
eEffect=GetNextEffect(oSelf);
};
SetCommandable(TRUE, oSelf);//Разблокируем командный стек.
ActionDoCommand(SignalEvent(oSelf, EventUserDefined(EVENT_S_WALK)));
};
Все заработало. Ларчик просто открывался... Но как-то странно. Это что, глюк движка?..