diff options
author | ariel- <ariel-@users.noreply.github.com> | 2016-10-14 03:59:13 -0300 |
---|---|---|
committer | joschiwald <joschiwald.trinity@gmail.com> | 2017-09-06 15:35:04 +0200 |
commit | d7c85d719306ad6f3e239e7e43975eb70bbdbc9f (patch) | |
tree | d1213a516e41ce93922ff2d78cc4d7363577a639 | |
parent | 84b6b064321e016785f084384ec5bc6f82acc89a (diff) |
Core/SmartScripts: fixup SMART_EVENT_FLAG_WHILE_CHARMED behaviour to only mean charmed creatures (#17738 follow-up)
Unit::IsControlledByPlayer is a expected value for TempSummons (like some triggers used in quests, summoned by spells).
Previous logic broke a lot of quests which use triggers to do stuff.
Allow JustSummoned and events linked from other events with flag set also in charmed (prevents breaking event chains)
Allow vehicles (needed for vehicles with SmartAI, eg Iron Rune Constructs and You: Rocket Jumping)
(cherry picked from commit 3e596376a7fae9fd585fac12e5122fd8f1b7ce14)
4 files changed, 34 insertions, 12 deletions
diff --git a/sql/updates/world/master/2017_09_06_05_world_2016_10_14_00_world.sql b/sql/updates/world/master/2017_09_06_05_world_2016_10_14_00_world.sql new file mode 100644 index 00000000000..ce5756cdeb1 --- /dev/null +++ b/sql/updates/world/master/2017_09_06_05_world_2016_10_14_00_world.sql @@ -0,0 +1,23 @@ +-- Always for SMART_EVENT_JUST_SUMMONED (Creature can be summoned already charmed by player ie TempSummons) +UPDATE `smart_scripts` SET `event_flags`=`event_flags`|0x200 WHERE `source_type` = 0 AND `event_type`=54; + +-- Event linked actions (Many levels of linked calls, do 8 times) +UPDATE `smart_scripts` `ss` LEFT JOIN `smart_scripts` `ssl` ON `ss`.`entryorguid` = `ssl`.`entryorguid` AND `ss`.`source_type` = `ssl`.`source_type` AND `ss`.`id` = `ssl`.`link` SET `ss`.`event_flags`=`ss`.`event_flags`|0x200 WHERE `ss`.`source_type`=0 AND + `ss`.`event_type` = 61 AND (`ssl`.`event_flags` & 0x200) != 0; +UPDATE `smart_scripts` `ss` LEFT JOIN `smart_scripts` `ssl` ON `ss`.`entryorguid` = `ssl`.`entryorguid` AND `ss`.`source_type` = `ssl`.`source_type` AND `ss`.`id` = `ssl`.`link` SET `ss`.`event_flags`=`ss`.`event_flags`|0x200 WHERE `ss`.`source_type`=0 AND + `ss`.`event_type` = 61 AND (`ssl`.`event_flags` & 0x200) != 0; +UPDATE `smart_scripts` `ss` LEFT JOIN `smart_scripts` `ssl` ON `ss`.`entryorguid` = `ssl`.`entryorguid` AND `ss`.`source_type` = `ssl`.`source_type` AND `ss`.`id` = `ssl`.`link` SET `ss`.`event_flags`=`ss`.`event_flags`|0x200 WHERE `ss`.`source_type`=0 AND + `ss`.`event_type` = 61 AND (`ssl`.`event_flags` & 0x200) != 0; +UPDATE `smart_scripts` `ss` LEFT JOIN `smart_scripts` `ssl` ON `ss`.`entryorguid` = `ssl`.`entryorguid` AND `ss`.`source_type` = `ssl`.`source_type` AND `ss`.`id` = `ssl`.`link` SET `ss`.`event_flags`=`ss`.`event_flags`|0x200 WHERE `ss`.`source_type`=0 AND + `ss`.`event_type` = 61 AND (`ssl`.`event_flags` & 0x200) != 0; +UPDATE `smart_scripts` `ss` LEFT JOIN `smart_scripts` `ssl` ON `ss`.`entryorguid` = `ssl`.`entryorguid` AND `ss`.`source_type` = `ssl`.`source_type` AND `ss`.`id` = `ssl`.`link` SET `ss`.`event_flags`=`ss`.`event_flags`|0x200 WHERE `ss`.`source_type`=0 AND + `ss`.`event_type` = 61 AND (`ssl`.`event_flags` & 0x200) != 0; +UPDATE `smart_scripts` `ss` LEFT JOIN `smart_scripts` `ssl` ON `ss`.`entryorguid` = `ssl`.`entryorguid` AND `ss`.`source_type` = `ssl`.`source_type` AND `ss`.`id` = `ssl`.`link` SET `ss`.`event_flags`=`ss`.`event_flags`|0x200 WHERE `ss`.`source_type`=0 AND + `ss`.`event_type` = 61 AND (`ssl`.`event_flags` & 0x200) != 0; +UPDATE `smart_scripts` `ss` LEFT JOIN `smart_scripts` `ssl` ON `ss`.`entryorguid` = `ssl`.`entryorguid` AND `ss`.`source_type` = `ssl`.`source_type` AND `ss`.`id` = `ssl`.`link` SET `ss`.`event_flags`=`ss`.`event_flags`|0x200 WHERE `ss`.`source_type`=0 AND + `ss`.`event_type` = 61 AND (`ssl`.`event_flags` & 0x200) != 0; +UPDATE `smart_scripts` `ss` LEFT JOIN `smart_scripts` `ssl` ON `ss`.`entryorguid` = `ssl`.`entryorguid` AND `ss`.`source_type` = `ssl`.`source_type` AND `ss`.`id` = `ssl`.`link` SET `ss`.`event_flags`=`ss`.`event_flags`|0x200 WHERE `ss`.`source_type`=0 AND + `ss`.`event_type` = 61 AND (`ssl`.`event_flags` & 0x200) != 0; + +-- Vehicles +UPDATE `smart_scripts` SET `event_flags`=`event_flags`|0x200 WHERE `source_type` = 0 AND `entryorguid` IN (SELECT `entry` FROM `creature_template` WHERE `AIName` = "SmartAI" AND `VehicleId` != 0); diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index bc9b214d2a9..6960764edf1 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -74,11 +74,7 @@ SmartAI::SmartAI(Creature* c) : CreatureAI(c) bool SmartAI::IsAIControlled() const { - if (me->IsControlledByPlayer()) - return false; - if (mIsCharmed) - return false; - return true; + return !mIsCharmed; } void SmartAI::UpdateDespawn(const uint32 diff) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index d427e9b4d36..a0405a5658f 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1348,7 +1348,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!IsCreature(*itr)) continue; - if (!(e.event.event_flags & SMART_EVENT_FLAG_WHILE_CHARMED) && !IsCreatureInControlOfSelf(*itr)) + if (!(e.event.event_flags & SMART_EVENT_FLAG_WHILE_CHARMED) && IsCharmedCreature(*itr)) continue; Position pos = (*itr)->GetPosition(); @@ -3097,7 +3097,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui if ((e.event.event_phase_mask && !IsInPhase(e.event.event_phase_mask)) || ((e.event.event_flags & SMART_EVENT_FLAG_NOT_REPEATABLE) && e.runOnce)) return; - if (!(e.event.event_flags & SMART_EVENT_FLAG_WHILE_CHARMED) && IsCreature(me) && !IsCreatureInControlOfSelf(me)) + if (!(e.event.event_flags & SMART_EVENT_FLAG_WHILE_CHARMED) && IsCharmedCreature(me)) return; switch (e.GetEventType()) @@ -3823,12 +3823,15 @@ bool SmartScript::IsCreature(WorldObject* obj) return obj && obj->GetTypeId() == TYPEID_UNIT; } -bool SmartScript::IsCreatureInControlOfSelf(WorldObject* obj) +bool SmartScript::IsCharmedCreature(WorldObject* obj) { - if (Creature* creatureObj = obj ? obj->ToCreature() : nullptr) - return !creatureObj->IsCharmed() && !creatureObj->IsControlledByPlayer(); - else + if (!obj) return false; + + if (Creature* creatureObj = obj->ToCreature()) + return creatureObj->IsCharmed(); + + return false; } bool SmartScript::IsGameObject(WorldObject* obj) diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h index 70e99cf2726..32041c9d684 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.h +++ b/src/server/game/AI/SmartScripts/SmartScript.h @@ -61,7 +61,7 @@ class TC_GAME_API SmartScript static bool IsUnit(WorldObject* obj); static bool IsPlayer(WorldObject* obj); static bool IsCreature(WorldObject* obj); - static bool IsCreatureInControlOfSelf(WorldObject* obj); + static bool IsCharmedCreature(WorldObject* obj); static bool IsGameObject(WorldObject* obj); void OnUpdate(const uint32 diff); |