diff options
Diffstat (limited to 'src/server/game/AI/SmartScripts')
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 86 | ||||
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 21 | 
3 files changed, 110 insertions, 3 deletions
| diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 03ad4df397a..79f3b7ce652 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -2052,6 +2052,92 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u                  if (IsCreature(target))                      target->ToCreature()->SetCorpseDelay(e.action.corpseDelay.timer);              } + +            break; +        } +        case SMART_ACTION_SPAWN_SPAWNGROUP: +        { +            if (e.action.groupSpawn.minDelay == 0 && e.action.groupSpawn.maxDelay == 0) +            { +                bool const ignoreRespawn = ((e.action.groupSpawn.spawnflags & SMARTAI_SPAWN_FLAGS::SMARTAI_SPAWN_FLAG_IGNORE_RESPAWN) != 0); +                bool const force = ((e.action.groupSpawn.spawnflags & SMARTAI_SPAWN_FLAGS::SMARTAI_SPAWN_FLAG_FORCE_SPAWN) != 0); + +                // Instant spawn +                sObjectMgr->SpawnGroupSpawn(e.action.groupSpawn.groupId, GetBaseObject()->GetMap(), ignoreRespawn, force); +            } +            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; +                ev.event_id = e.event_id; +                ev.target = e.target; +                ev.action = ac; +                InitTimer(ev); +                mStoredEvents.push_back(ev); +            } +            break; +        } +        case SMART_ACTION_DESPAWN_SPAWNGROUP: +        { +            if (e.action.groupSpawn.minDelay == 0 && e.action.groupSpawn.maxDelay == 0) +            { +                bool const deleteRespawnTimes = ((e.action.groupSpawn.spawnflags & SMARTAI_SPAWN_FLAGS::SMARTAI_SPAWN_FLAG_NOSAVE_RESPAWN) != 0); + +                // Instant spawn +                sObjectMgr->SpawnGroupDespawn(e.action.groupSpawn.groupId, GetBaseObject()->GetMap(), deleteRespawnTimes); +            } +            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; +                ev.event_id = e.event_id; +                ev.target = e.target; +                ev.action = ac; +                InitTimer(ev); +                mStoredEvents.push_back(ev); +            }              break;          }          case SMART_ACTION_DISABLE_EVADE: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 31282a934ac..3555575b2b2 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -228,7 +228,7 @@ void SmartAIMgr::LoadSmartAIFromDB()                  }                  case SMART_SCRIPT_TYPE_GAMEOBJECT:                  { -                    GameObjectData const* gameObject = sObjectMgr->GetGOData(uint32(std::abs(temp.entryOrGuid))); +                    GameObjectData const* gameObject = sObjectMgr->GetGameObjectData(uint32(std::abs(temp.entryOrGuid)));                      if (!gameObject)                      {                          TC_LOG_ERROR("sql.sql", "SmartAIMgr::LoadSmartAIFromDB: GameObject guid (%u) does not exist, skipped loading.", uint32(std::abs(temp.entryOrGuid))); @@ -932,7 +932,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)                      return false;                  } -                if (e.event.distance.guid != 0 && !sObjectMgr->GetGOData(e.event.distance.guid)) +                if (e.event.distance.guid != 0 && !sObjectMgr->GetGameObjectData(e.event.distance.guid))                  {                      TC_LOG_ERROR("sql.sql", "SmartAIMgr: Event SMART_EVENT_DISTANCE_GAMEOBJECT using invalid gameobject guid %u, skipped.", e.event.distance.guid);                      return false; @@ -1508,6 +1508,8 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)          case SMART_ACTION_TRIGGER_RANDOM_TIMED_EVENT:          case SMART_ACTION_SET_COUNTER:          case SMART_ACTION_REMOVE_ALL_GAMEOBJECTS: +        case SMART_ACTION_SPAWN_SPAWNGROUP: +        case SMART_ACTION_DESPAWN_SPAWNGROUP:              break;          default:              TC_LOG_ERROR("sql.sql", "SmartAIMgr: Not handled action_type(%u), event_type(%u), Entry %d SourceType %u Event %u, skipped.", e.GetActionType(), e.GetEventType(), e.entryOrGuid, e.GetScriptType(), e.event_id); diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 7a1433bc7fb..f2ba244aaae 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -589,8 +589,12 @@ enum SMART_ACTION      SMART_ACTION_REMOVE_ALL_GAMEOBJECTS             = 126,      SMART_ACTION_STOP_MOTION                        = 127,    // stopMoving, movementExpired      SMART_ACTION_PLAY_ANIMKIT                       = 128,    // don't use on 3.3.5a +    SMART_ACTION_SCENE_PLAY                         = 129,    // don't use on 3.3.5a +    SMART_ACTION_SCENE_CANCEL                       = 130,    // don't use on 3.3.5a +    SMART_ACTION_SPAWN_SPAWNGROUP                   = 131,    // Group ID, min secs, max secs, spawnflags +    SMART_ACTION_DESPAWN_SPAWNGROUP                 = 132,    // Group ID, min secs, max secs, spawnflags -    SMART_ACTION_END                                = 129 +    SMART_ACTION_END                                = 133  };  struct SmartAction @@ -1094,6 +1098,13 @@ struct SmartAction          {              uint32 disable;          } disableEvade; +        struct +        { +            uint32 groupId; +            uint32 minDelay; +            uint32 maxDelay; +            uint32 spawnflags; +        } groupSpawn;          struct          { @@ -1138,6 +1149,14 @@ struct SmartAction      };  }; +enum SMARTAI_SPAWN_FLAGS +{ +    SMARTAI_SPAWN_FLAG_NONE                 = 0x00, +    SMARTAI_SPAWN_FLAG_IGNORE_RESPAWN       = 0x01, +    SMARTAI_SPAWN_FLAG_FORCE_SPAWN          = 0x02, +    SMARTAI_SPAWN_FLAG_NOSAVE_RESPAWN       = 0x04, +}; +  enum SMARTAI_TEMPLATE  {      SMARTAI_TEMPLATE_BASIC          = 0, //nothing is preset | 
