diff options
Diffstat (limited to 'src')
8 files changed, 76 insertions, 27 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 97fe3b80f10..d8fbd109af9 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1043,7 +1043,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u delete targets; break; } - case SMART_ACTION_SET_INGAME_PHASE_MASK: + case SMART_ACTION_SET_INGAME_PHASE_ID: { ObjectList* targets = GetTargets(e, unit); @@ -1051,12 +1051,23 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u break; for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) - { - if (IsUnit(*itr)) - (*itr)->ToUnit()->SetPhaseMask(e.action.ingamePhaseMask.mask, true); - else if (IsGameObject(*itr)) - (*itr)->ToGameObject()->SetPhaseMask(e.action.ingamePhaseMask.mask, true); - } + (*itr)->SetInPhase(e.action.ingamePhaseId.id, true, e.action.ingamePhaseId.apply == 1); + + delete targets; + break; + } + case SMART_ACTION_SET_INGAME_PHASE_GROUP: + { + ObjectList* targets = GetTargets(e, unit); + + if (!targets) + break; + + std::set<uint32> const& phases = GetPhasesForGroup(e.action.ingamePhaseGroup.id); + + for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) + for (auto phase : phases) + (*itr)->SetInPhase(phase, true, e.action.ingamePhaseGroup.apply == 1); delete targets; break; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 2e8453904a1..47100088f2f 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -1008,6 +1008,44 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) } break; } + case SMART_ACTION_SET_INGAME_PHASE_ID: + { + uint32 phaseId = e.action.ingamePhaseId.id; + uint32 apply = e.action.ingamePhaseId.apply; + + if (apply != 0 && apply != 1) + { + TC_LOG_ERROR("sql.sql", "SmartScript: SMART_ACTION_SET_INGAME_PHASE_ID uses invalid apply value %u (Should be 0 or 1) for creature %u, skipped", apply, e.entryOrGuid); + return false; + } + + PhaseEntry const* phase = sPhaseStore.LookupEntry(phaseId); + if (!phase) + { + TC_LOG_ERROR("sql.sql", "SmartScript: SMART_ACTION_SET_INGAME_PHASE_ID uses invalid phaseid %u for creature %u, skipped", phaseId, e.entryOrGuid); + return false; + } + break; + } + case SMART_ACTION_SET_INGAME_PHASE_GROUP: + { + uint32 phaseGroup = e.action.ingamePhaseGroup.id; + uint32 apply = e.action.ingamePhaseGroup.apply; + + if (apply != 0 && apply != 1) + { + TC_LOG_ERROR("sql.sql", "SmartScript: SMART_ACTION_SET_INGAME_PHASE_GROUP uses invalid apply value %u (Should be 0 or 1) for creature %u, skipped", apply, e.entryOrGuid); + return false; + } + + PhaseGroupEntry const* phase = sPhaseGroupStore.LookupEntry(phaseGroup); + if (!phase) + { + TC_LOG_ERROR("sql.sql", "SmartScript: SMART_ACTION_SET_INGAME_PHASE_GROUP uses invalid phase group id %u for creature %u, skipped", phaseGroup, e.entryOrGuid); + return false; + } + break; + } case SMART_ACTION_FOLLOW: case SMART_ACTION_SET_ORIENTATION: case SMART_ACTION_STORE_TARGET_LIST: @@ -1037,7 +1075,6 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_ACTION_SET_RUN: case SMART_ACTION_SET_SWIM: case SMART_ACTION_FORCE_DESPAWN: - case SMART_ACTION_SET_INGAME_PHASE_MASK: case SMART_ACTION_SET_UNIT_FLAG: case SMART_ACTION_REMOVE_UNIT_FLAG: case SMART_ACTION_PLAYMOVIE: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 5574e45c614..8ec2cdb1ff9 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -433,7 +433,7 @@ enum SMART_ACTION SMART_ACTION_THREAT_SINGLE_PCT = 13, // Threat% SMART_ACTION_THREAT_ALL_PCT = 14, // Threat% SMART_ACTION_CALL_AREAEXPLOREDOREVENTHAPPENS = 15, // QuestID - SMART_ACTION_UNUSED_16 = 16, // UNUSED + SMART_ACTION_SET_INGAME_PHASE_GROUP = 16, // phaseGroupId, apply SMART_ACTION_SET_EMOTE_STATE = 17, // emoteID SMART_ACTION_SET_UNIT_FLAG = 18, // Flags (may be more than one field OR'd together), Target SMART_ACTION_REMOVE_UNIT_FLAG = 19, // Flags (may be more than one field OR'd together), Target @@ -461,7 +461,7 @@ enum SMART_ACTION SMART_ACTION_FORCE_DESPAWN = 41, // timer SMART_ACTION_SET_INVINCIBILITY_HP_LEVEL = 42, // MinHpValue(+pct, -flat) SMART_ACTION_MOUNT_TO_ENTRY_OR_MODEL = 43, // Creature_template entry(param1) OR ModelId (param2) (or 0 for both to dismount) - SMART_ACTION_SET_INGAME_PHASE_MASK = 44, // mask + SMART_ACTION_SET_INGAME_PHASE_ID = 44, // PhaseId, apply SMART_ACTION_SET_DATA = 45, // Field, Data (only creature @todo) SMART_ACTION_MOVE_FORWARD = 46, // distance SMART_ACTION_SET_VISIBILITY = 47, // on/off @@ -728,9 +728,16 @@ struct SmartAction struct { - uint32 mask; - } ingamePhaseMask; + uint32 id; + uint32 apply; + } ingamePhaseId; + struct + { + uint32 groupId; + uint32 apply; + } ingamePhaseGroup; + struct { uint32 field; diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index a46db80600e..7833b3b5e5d 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -1074,20 +1074,14 @@ public: return true; } - //npc phasemask handling - //change phasemask of creature or pet + //npc phase handling + //change phase of creature or pet static bool HandleNpcSetPhaseCommand(ChatHandler* handler, char const* args) { if (!*args) return false; - uint32 phasemask = (uint32) atoi((char*)args); - if (phasemask == 0) - { - handler->SendSysMessage(LANG_BAD_VALUE); - handler->SetSentErrorMessage(true); - return false; - } + uint32 phase = (uint32) atoi((char*)args); Creature* creature = handler->getSelectedCreature(); if (!creature) @@ -1097,7 +1091,7 @@ public: return false; } - creature->SetPhaseMask(phasemask, true); + creature->SetInPhase(phase, true, !creature->IsInPhase(phase)); if (!creature->IsPet()) creature->SaveToDB(); diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp index be8bc34acf1..8bd1ef26aec 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp @@ -155,7 +155,7 @@ public: { case 177807: // Egg if (GetBossState(BOSS_FIREMAW) == DONE) - go->SetPhaseMask(2, true); + go->SetLootState(GO_JUST_DEACTIVATED); else EggList.push_back(go->GetGUID()); break; @@ -201,7 +201,7 @@ public: { for (std::list<uint64>::const_iterator itr = EggList.begin(); itr != EggList.end(); ++itr) if (GameObject* egg = instance->GetGameObject((*itr))) - egg->SetPhaseMask(2, true); + egg->SetLootState(GO_JUST_DEACTIVATED); } SetData(DATA_EGG_EVENT, NOT_STARTED); break; diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index ccdd92ae4ba..dfca72efa6a 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -636,7 +636,7 @@ class npc_jaina_or_sylvanas_intro_hor : public CreatureScript if (Creature* lichking = ObjectAccessor::GetCreature(*me, _lichkingGUID)) { if (GameObject* frostmourne = ObjectAccessor::GetGameObject(*me, _instance->GetData64(DATA_FROSTMOURNE))) - frostmourne->SetPhaseMask(2, true); + frostmourne->SetLootState(GO_JUST_DEACTIVATED); lichking->CastSpell(lichking, SPELL_TAKE_FROSTMOURNE, true); lichking->CastSpell(lichking, SPELL_FROSTMOURNE_VISUAL, true); } diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp index 6f33e80b92b..b17a5dbc8f5 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp @@ -248,7 +248,7 @@ class instance_halls_of_reflection : public InstanceMapScript case GO_FROSTMOURNE: FrostmourneGUID = go->GetGUID(); if (GetData(DATA_INTRO_EVENT) == DONE) - go->SetPhaseMask(2, true); + go->SetLootState(GO_JUST_DEACTIVATED); break; case GO_ENTRANCE_DOOR: EntranceDoorGUID = go->GetGUID(); diff --git a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp index bf84a267a27..80c71771c96 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp @@ -69,7 +69,7 @@ class instance_oculus : public InstanceMapScript case NPC_VAROS: VarosGUID = creature->GetGUID(); if (GetBossState(DATA_DRAKOS) == DONE) - creature->SetPhaseMask(1, true); + creature->SetPhaseMask(1, true); break; case NPC_UROM: UromGUID = creature->GetGUID(); |