void CScriptEntity::SetScriptControl(const bool bScriptControl, shared_str caSciptName) { if (!( ( (m_bScriptControl && !bScriptControl) || (!m_bScriptControl && bScriptControl) ) && ( bScriptControl || ( xr_strlen(*m_caScriptName) && !xr_strcmp(caSciptName,m_caScriptName) ) ) )) { ai().script_engine().script_log(eLuaMessageTypeError,"Invalid sequence of taking an entity under script control"); return; } if (bScriptControl && !can_script_capture()) return; if (bScriptControl && !m_bScriptControl) object().add_visual_callback (&ActionCallback); else if (!bScriptControl && m_bScriptControl) object().remove_visual_callback (&ActionCallback); m_bScriptControl = bScriptControl; m_caScriptName = caSciptName; /* #ifdef DEBUG if (bScriptControl) ai().script_engine().script_log (ScriptStorage::eLuaMessageTypeInfo,"Script %s set object %s under its control",*caSciptName,*object().cName()); else ai().script_engine().script_log (ScriptStorage::eLuaMessageTypeInfo,"Script %s freed object %s from its control",*caSciptName,*object().cName()); #endif */ if (!bScriptControl) ResetScriptData(this); }
void CScriptEntity::reinit() { ResetScriptData (); set_script_capture (); }
void CScriptEntity::init() { m_current_sound = 0; ResetScriptData (); }
CScriptEntity::~CScriptEntity() { ResetScriptData (); }
void CScriptEntity::ProcessScripts() { CScriptEntityAction *l_tpEntityAction = 0; #ifdef DEBUG bool empty_queue = m_tpActionQueue.empty(); #endif while (!m_tpActionQueue.empty()) { l_tpEntityAction= m_tpActionQueue.front(); VERIFY (l_tpEntityAction); #ifdef _DEBUG // if (!xr_strcmp("m_stalker_wounded",*object().cName())) // Msg ("%6d Processing action : %s",Device.dwTimeGlobal,*l_tpEntityAction->m_tAnimationAction.m_caAnimationToPlay); #endif if (m_tpCurrentEntityAction != l_tpEntityAction) l_tpEntityAction->initialize (); m_tpCurrentEntityAction = l_tpEntityAction; if (!l_tpEntityAction->CheckIfActionCompleted()) break; #ifdef _DEBUG // if (!xr_strcmp("m_stalker_wounded",*object().cName())) // Msg ("%6d Action completed : %s",Device.dwTimeGlobal,*l_tpEntityAction->m_tAnimationAction.m_caAnimationToPlay); #endif vfFinishAction(l_tpEntityAction); #ifdef DEBUG if (psAI_Flags.is(aiLua)) Msg("Entity Action removed!!!"); #endif if (true /*psAI_Flags.is(aiLua)*/ ) { object().callback(GameObject::eActionTypeRemoved)(object().lua_game_object(),u32(eActionTypeRemoved)); } xr_delete (l_tpEntityAction); m_tpActionQueue.erase(m_tpActionQueue.begin()); } if (m_tpActionQueue.empty()) { #ifdef DEBUG if (empty_queue) ai().script_engine().script_log (ScriptStorage::eLuaMessageTypeInfo,"Object %s has an empty script queue!",*object().cName()); #endif return; } try { bool l_bCompleted; l_bCompleted = l_tpEntityAction->m_tWatchAction.m_bCompleted; bfAssignWatch (l_tpEntityAction); if (l_tpEntityAction->m_tWatchAction.m_bCompleted && !l_bCompleted) object().callback(GameObject::eActionTypeWatch)(object().lua_game_object(),u32(eActionTypeWatch)); l_bCompleted = l_tpEntityAction->m_tAnimationAction.m_bCompleted; bfAssignAnimation(l_tpEntityAction); l_bCompleted = l_tpEntityAction->m_tSoundAction.m_bCompleted; bfAssignSound (l_tpEntityAction); if (l_tpEntityAction->m_tSoundAction.m_bCompleted && !l_bCompleted) object().callback(GameObject::eActionTypeSound)(object().lua_game_object(),u32(eActionTypeSound)); l_bCompleted = l_tpEntityAction->m_tParticleAction.m_bCompleted; bfAssignParticles(l_tpEntityAction); if (l_tpEntityAction->m_tParticleAction.m_bCompleted && !l_bCompleted) object().callback(GameObject::eActionTypeParticle)(object().lua_game_object(),u32(eActionTypeParticle)); l_bCompleted = l_tpEntityAction->m_tObjectAction.m_bCompleted; bfAssignObject (l_tpEntityAction); if (l_tpEntityAction->m_tObjectAction.m_bCompleted && !l_bCompleted) object().callback(GameObject::eActionTypeObject)(object().lua_game_object(),u32(eActionTypeObject)); l_bCompleted = l_tpEntityAction->m_tMovementAction.m_bCompleted; bfAssignMovement(l_tpEntityAction); if (l_tpEntityAction->m_tMovementAction.m_bCompleted && !l_bCompleted) object().callback(GameObject::eActionTypeMovement)(object().lua_game_object(),u32(eActionTypeMovement), -1); // ”становить выбранную анимацию if (!l_tpEntityAction->m_tAnimationAction.m_bCompleted) bfScriptAnimation (); bfAssignMonsterAction(l_tpEntityAction); } catch(...) { ResetScriptData (); } }