diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 140 | ||||
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.h | 2 | 
2 files changed, 64 insertions, 78 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 638eb0da737..35422071924 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1586,31 +1586,27 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u          }          case SMART_ACTION_CREATE_TIMED_EVENT:          { -            SmartEvent ne = SmartEvent(); -            ne.type = (SMART_EVENT)SMART_EVENT_UPDATE; -            ne.event_chance = e.action.timeEvent.chance; -            if (!ne.event_chance) ne.event_chance = 100; - -            ne.minMaxRepeat.min = e.action.timeEvent.min; -            ne.minMaxRepeat.max = e.action.timeEvent.max; -            ne.minMaxRepeat.repeatMin = e.action.timeEvent.repeatMin; -            ne.minMaxRepeat.repeatMax = e.action.timeEvent.repeatMax; - -            ne.event_flags = 0; -            if (!ne.minMaxRepeat.repeatMin && !ne.minMaxRepeat.repeatMax) -                ne.event_flags |= SMART_EVENT_FLAG_NOT_REPEATABLE; - -            SmartAction ac = SmartAction(); -            ac.type = (SMART_ACTION)SMART_ACTION_TRIGGER_TIMED_EVENT; -            ac.timeEvent.id = e.action.timeEvent.id; - -            SmartScriptHolder ev = SmartScriptHolder(); -            ev.event = ne; +            SmartScriptHolder& ev = mStoredEvents.emplace_back();              ev.event_id = e.action.timeEvent.id; +            ev.event.type = (SMART_EVENT)SMART_EVENT_UPDATE; +            ev.event.event_chance = e.action.timeEvent.chance; +            if (!ev.event.event_chance) ev.event.event_chance = 100; + +            ev.event.minMaxRepeat.min = e.action.timeEvent.min; +            ev.event.minMaxRepeat.max = e.action.timeEvent.max; +            ev.event.minMaxRepeat.repeatMin = e.action.timeEvent.repeatMin; +            ev.event.minMaxRepeat.repeatMax = e.action.timeEvent.repeatMax; + +            ev.event.event_flags = 0; +            if (!ev.event.minMaxRepeat.repeatMin && !ev.event.minMaxRepeat.repeatMax) +                ev.event.event_flags |= SMART_EVENT_FLAG_NOT_REPEATABLE; + +            ev.action.type = (SMART_ACTION)SMART_ACTION_TRIGGER_TIMED_EVENT; +            ev.action.timeEvent.id = e.action.timeEvent.id; +              ev.target = e.target; -            ev.action = ac; +              InitTimer(ev); -            mStoredEvents.push_back(ev);              break;          }          case SMART_ACTION_TRIGGER_TIMED_EVENT: @@ -2207,33 +2203,29 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u              else              {                  // Delayed spawn (use values from parameter to schedule event to call us back -                SmartEvent ne = SmartEvent(); -                ne.type = (SMART_EVENT)SMART_EVENT_UPDATE; -                ne.event_chance = 100; - -                ne.minMaxRepeat.min = e.action.groupSpawn.minDelay; -                ne.minMaxRepeat.max = e.action.groupSpawn.maxDelay; -                ne.minMaxRepeat.repeatMin = 0; -                ne.minMaxRepeat.repeatMax = 0; - -                ne.event_flags = 0; -                ne.event_flags |= SMART_EVENT_FLAG_NOT_REPEATABLE; - -                SmartAction ac = SmartAction(); -                ac.type = (SMART_ACTION)SMART_ACTION_SPAWN_SPAWNGROUP; -                ac.groupSpawn.groupId = e.action.groupSpawn.groupId; -                ac.groupSpawn.minDelay = 0; -                ac.groupSpawn.maxDelay = 0; -                ac.groupSpawn.spawnflags = e.action.groupSpawn.spawnflags; -                ac.timeEvent.id = e.action.timeEvent.id; - -                SmartScriptHolder ev = SmartScriptHolder(); -                ev.event = ne; +                SmartScriptHolder& ev = mStoredEvents.emplace_back();                  ev.event_id = e.event_id; +                ev.event.type = (SMART_EVENT)SMART_EVENT_UPDATE; +                ev.event.event_chance = 100; + +                ev.event.minMaxRepeat.min = e.action.groupSpawn.minDelay; +                ev.event.minMaxRepeat.max = e.action.groupSpawn.maxDelay; +                ev.event.minMaxRepeat.repeatMin = 0; +                ev.event.minMaxRepeat.repeatMax = 0; + +                ev.event.event_flags = 0; +                ev.event.event_flags |= SMART_EVENT_FLAG_NOT_REPEATABLE; + +                ev.action.type = (SMART_ACTION)SMART_ACTION_SPAWN_SPAWNGROUP; +                ev.action.groupSpawn.groupId = e.action.groupSpawn.groupId; +                ev.action.groupSpawn.minDelay = 0; +                ev.action.groupSpawn.maxDelay = 0; +                ev.action.groupSpawn.spawnflags = e.action.groupSpawn.spawnflags; +                ev.action.timeEvent.id = e.action.timeEvent.id; +                  ev.target = e.target; -                ev.action = ac; +                  InitTimer(ev); -                mStoredEvents.push_back(ev);              }              break;          } @@ -2249,33 +2241,29 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u              else              {                  // Delayed spawn (use values from parameter to schedule event to call us back -                SmartEvent ne = SmartEvent(); -                ne.type = (SMART_EVENT)SMART_EVENT_UPDATE; -                ne.event_chance = 100; - -                ne.minMaxRepeat.min = e.action.groupSpawn.minDelay; -                ne.minMaxRepeat.max = e.action.groupSpawn.maxDelay; -                ne.minMaxRepeat.repeatMin = 0; -                ne.minMaxRepeat.repeatMax = 0; - -                ne.event_flags = 0; -                ne.event_flags |= SMART_EVENT_FLAG_NOT_REPEATABLE; - -                SmartAction ac = SmartAction(); -                ac.type = (SMART_ACTION)SMART_ACTION_DESPAWN_SPAWNGROUP; -                ac.groupSpawn.groupId = e.action.groupSpawn.groupId; -                ac.groupSpawn.minDelay = 0; -                ac.groupSpawn.maxDelay = 0; -                ac.groupSpawn.spawnflags = e.action.groupSpawn.spawnflags; -                ac.timeEvent.id = e.action.timeEvent.id; - -                SmartScriptHolder ev = SmartScriptHolder(); -                ev.event = ne; +                SmartScriptHolder& ev = mStoredEvents.emplace_back();                  ev.event_id = e.event_id; +                ev.event.type = (SMART_EVENT)SMART_EVENT_UPDATE; +                ev.event.event_chance = 100; + +                ev.event.minMaxRepeat.min = e.action.groupSpawn.minDelay; +                ev.event.minMaxRepeat.max = e.action.groupSpawn.maxDelay; +                ev.event.minMaxRepeat.repeatMin = 0; +                ev.event.minMaxRepeat.repeatMax = 0; + +                ev.event.event_flags = 0; +                ev.event.event_flags |= SMART_EVENT_FLAG_NOT_REPEATABLE; + +                ev.action.type = (SMART_ACTION)SMART_ACTION_DESPAWN_SPAWNGROUP; +                ev.action.groupSpawn.groupId = e.action.groupSpawn.groupId; +                ev.action.groupSpawn.minDelay = 0; +                ev.action.groupSpawn.maxDelay = 0; +                ev.action.groupSpawn.spawnflags = e.action.groupSpawn.spawnflags; +                ev.action.timeEvent.id = e.action.timeEvent.id; +                  ev.target = e.target; -                ev.action = ac; +                  InitTimer(ev); -                mStoredEvents.push_back(ev);              }              break;          } @@ -3830,9 +3818,7 @@ void SmartScript::InstallEvents()  {      if (!mInstallEvents.empty())      { -        for (SmartScriptHolder& installevent : mInstallEvents) -            mEvents.push_back(installevent);//must be before UpdateTimers - +        mEvents.insert(mEvents.end(), std::move_iterator(mInstallEvents.begin()), std::move_iterator(mInstallEvents.end()));          mInstallEvents.clear();      }  } @@ -4024,7 +4010,7 @@ void SmartScript::RetryLater(SmartScriptHolder& e, bool ignoreChanceRoll)      e.runOnce = false;  } -void SmartScript::FillScript(SmartAIEventList e, WorldObject* obj, AreaTriggerEntry const* at, SceneTemplate const* scene, Quest const* quest, uint32 event) +void SmartScript::FillScript(SmartAIEventList&& e, WorldObject* obj, AreaTriggerEntry const* at, SceneTemplate const* scene, Quest const* quest, uint32 event)  {      if (e.empty())      { @@ -4040,14 +4026,14 @@ void SmartScript::FillScript(SmartAIEventList e, WorldObject* obj, AreaTriggerEn              TC_LOG_DEBUG("scripts.ai", "SmartScript: EventMap for Event {} is empty but is using SmartScript.", event);          return;      } -    for (SmartScriptHolder& scriptholder : e) +    for (SmartScriptHolder& scriptholder : std::move(e))      {          #ifndef TRINITY_DEBUG              if (scriptholder.event.event_flags & SMART_EVENT_FLAG_DEBUG_ONLY)                  continue;          #endif -        if (obj && scriptholder.Difficulties.size()) +        if (obj && !scriptholder.Difficulties.empty())          {              bool foundValidDifficulty = false;              for (Difficulty difficulty : scriptholder.Difficulties) @@ -4064,7 +4050,7 @@ void SmartScript::FillScript(SmartAIEventList e, WorldObject* obj, AreaTriggerEn          }          mAllEventFlags |= scriptholder.event.event_flags; -        mEvents.push_back(scriptholder); +        mEvents.push_back(std::move(scriptholder));      }  } diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h index 8d9d00c62bc..09aefe00d39 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.h +++ b/src/server/game/AI/SmartScripts/SmartScript.h @@ -50,7 +50,7 @@ class TC_GAME_API SmartScript          void OnInitialize(WorldObject* obj, AreaTriggerEntry const* at = nullptr, SceneTemplate const* scene = nullptr, Quest const* qst = nullptr, uint32 evnt = 0);          void GetScript(); -        void FillScript(SmartAIEventList e, WorldObject* obj, AreaTriggerEntry const* at, SceneTemplate const* scene, Quest const* quest, uint32 event = 0); +        void FillScript(SmartAIEventList&& e, WorldObject* obj, AreaTriggerEntry const* at, SceneTemplate const* scene, Quest const* quest, uint32 event = 0);          void ProcessEventsFor(SMART_EVENT e, Unit* unit = nullptr, uint32 var0 = 0, uint32 var1 = 0, bool bvar = false, SpellInfo const* spell = nullptr, GameObject* gob = nullptr, std::string const& varString = "");          void ProcessEvent(SmartScriptHolder& e, Unit* unit = nullptr, uint32 var0 = 0, uint32 var1 = 0, bool bvar = false, SpellInfo const* spell = nullptr, GameObject* gob = nullptr, std::string const& varString = "");  | 
