From b8396f682cebfcbd9ecc15a42194119a74185627 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Sun, 24 Feb 2019 13:51:59 +0100 Subject: Core/MapScripts: Add support to GameObjects to SCRIPT_COMMAND_DESPAWN_SELF (cherry picked from commit da19ad117e3c4c15793ba8f84738efaecb4d1428) --- src/server/game/Maps/MapScripts.cpp | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) (limited to 'src/server/game/Maps/MapScripts.cpp') diff --git a/src/server/game/Maps/MapScripts.cpp b/src/server/game/Maps/MapScripts.cpp index 541fdcf76b9..c49a8bab1da 100644 --- a/src/server/game/Maps/MapScripts.cpp +++ b/src/server/game/Maps/MapScripts.cpp @@ -155,6 +155,39 @@ inline Creature* Map::_GetScriptCreatureSourceOrTarget(Object* source, Object* t return creature; } +inline GameObject* Map::_GetScriptGameObjectSourceOrTarget(Object* source, Object* target, ScriptInfo const* scriptInfo, bool bReverse) const +{ + GameObject* gameobject = nullptr; + if (!source && !target) + TC_LOG_ERROR("scripts", "%s source and target objects are NULL.", scriptInfo->GetDebugInfo().c_str()); + else + { + if (bReverse) + { + // Check target first, then source. + if (target) + gameobject = target->ToGameObject(); + if (!gameobject && source) + gameobject = source->ToGameObject(); + } + else + { + // Check source first, then target. + if (source) + gameobject = source->ToGameObject(); + if (!gameobject && target) + gameobject = target->ToGameObject(); + } + + if (!gameobject) + TC_LOG_ERROR("scripts", "%s neither source nor target are gameobjects (source: TypeId: %u, Entry: %u, %s; target: TypeId: %u, Entry: %u, %s), skipping.", + scriptInfo->GetDebugInfo().c_str(), + source ? source->GetTypeId() : 0, source ? source->GetEntry() : 0, (source ? source->GetGUID() : ObjectGuid::Empty).ToString().c_str(), + target ? target->GetTypeId() : 0, target ? target->GetEntry() : 0, (target ? target->GetGUID() : ObjectGuid::Empty).ToString().c_str()); + } + return gameobject; +} + inline Unit* Map::_GetScriptUnit(Object* obj, bool isSource, ScriptInfo const* scriptInfo) const { Unit* unit = nullptr; @@ -719,9 +752,11 @@ void Map::ScriptsProcess() break; case SCRIPT_COMMAND_DESPAWN_SELF: - // Target or source must be Creature. + // First try with target or source creature, then with target or source gameobject if (Creature* cSource = _GetScriptCreatureSourceOrTarget(source, target, step.script, true)) cSource->DespawnOrUnsummon(step.script->DespawnSelf.DespawnDelay); + else if (GameObject* goSource = _GetScriptGameObjectSourceOrTarget(source, target, step.script, true)) + goSource->DespawnOrUnsummon(Milliseconds(step.script->DespawnSelf.DespawnDelay)); break; case SCRIPT_COMMAND_LOAD_PATH: -- cgit v1.2.3