diff options
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 16 | ||||
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 14 |
2 files changed, 23 insertions, 7 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index c142a3f479f..d0f77855045 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -793,10 +793,10 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u break; // If invoker was pet or charm - Player* player = unit->GetCharmerOrOwnerPlayerOrPlayerItself(); - if (player && GetBaseObject()) + Player* playerCharmed = unit->GetCharmerOrOwnerPlayerOrPlayerItself(); + if (playerCharmed && GetBaseObject()) { - player->GroupEventHappens(e.action.quest.quest, GetBaseObject()); + playerCharmed->GroupEventHappens(e.action.quest.quest, GetBaseObject()); TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction: SMART_ACTION_CALL_GROUPEVENTHAPPENS: %s, group credit for quest %u", unit->GetGUID().ToString().c_str(), e.action.quest.quest); } @@ -1182,10 +1182,14 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u } case SMART_ACTION_SUMMON_CREATURE: { - WorldObject* summoner = GetBaseObjectOrUnit(unit); + EnumFlag<SmartActionSummonCreatureFlags> flags(static_cast<SmartActionSummonCreatureFlags>(e.action.summonCreature.flags)); + bool preferUnit = flags.HasFlag(SmartActionSummonCreatureFlags::PreferUnit); + WorldObject* summoner = preferUnit ? unit : GetBaseObjectOrUnit(unit); if (!summoner) break; + bool personalSpawn = flags.HasFlag(SmartActionSummonCreatureFlags::PersonalSpawn); + float x, y, z, o; for (WorldObject* target : targets) { @@ -1194,7 +1198,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u y += e.target.y; z += e.target.z; o += e.target.o; - if (Creature* summon = summoner->SummonCreature(e.action.summonCreature.creature, x, y, z, o, (TempSummonType)e.action.summonCreature.type, e.action.summonCreature.duration)) + if (Creature* summon = summoner->SummonCreature(e.action.summonCreature.creature, x, y, z, o, (TempSummonType)e.action.summonCreature.type, e.action.summonCreature.duration, personalSpawn)) if (e.action.summonCreature.attackInvoker) summon->AI()->AttackStart(target->ToUnit()); } @@ -1202,7 +1206,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (e.GetTargetType() != SMART_TARGET_POSITION) break; - if (Creature* summon = summoner->SummonCreature(e.action.summonCreature.creature, e.target.x, e.target.y, e.target.z, e.target.o, (TempSummonType)e.action.summonCreature.type, e.action.summonCreature.duration)) + if (Creature* summon = summoner->SummonCreature(e.action.summonCreature.creature, e.target.x, e.target.y, e.target.z, e.target.o, (TempSummonType)e.action.summonCreature.type, e.action.summonCreature.duration, personalSpawn)) if (unit && e.action.summonCreature.attackInvoker) summon->AI()->AttackStart(unit); break; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index edae385acb7..007d5918d7f 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -470,7 +470,7 @@ enum SMART_ACTION SMART_ACTION_ACTIVATE_GOBJECT = 9, // SMART_ACTION_RANDOM_EMOTE = 10, // EmoteId1, EmoteId2, EmoteId3... SMART_ACTION_CAST = 11, // SpellId, CastFlags, TriggeredFlags - SMART_ACTION_SUMMON_CREATURE = 12, // CreatureID, summonType, duration in ms, attackInvoker + SMART_ACTION_SUMMON_CREATURE = 12, // CreatureID, summonType, duration in ms, attackInvoker, flags(SmartActionSummonCreatureFlags) SMART_ACTION_THREAT_SINGLE_PCT = 13, // Threat% SMART_ACTION_THREAT_ALL_PCT = 14, // Threat% SMART_ACTION_CALL_AREAEXPLOREDOREVENTHAPPENS = 15, // QuestID @@ -597,6 +597,17 @@ enum SMART_ACTION SMART_ACTION_END = 138 }; +enum class SmartActionSummonCreatureFlags +{ + None = 0, + PersonalSpawn = 1, + PreferUnit = 2, + + All = PersonalSpawn | PreferUnit, +}; + +DEFINE_ENUM_FLAG(SmartActionSummonCreatureFlags); + struct SmartAction { SMART_ACTION type; @@ -679,6 +690,7 @@ struct SmartAction uint32 type; uint32 duration; uint32 attackInvoker; + uint32 flags; // SmartActionSummonCreatureFlags } summonCreature; struct |
