diff options
author | ForesterDev <11771800+ForesterDev@users.noreply.github.com> | 2020-02-23 00:11:14 +0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-22 21:11:14 +0100 |
commit | c65ba35269a68c94c3e423f78fa1585f9d89dd04 (patch) | |
tree | 3dac4b8e0aa227cf85aaf8db0d56f1f0a4d457d9 /src | |
parent | 0f265b4af6c8c63539deaf781b742a743627206d (diff) |
Core/SmartAI: implement SMART_ACTION_OVERRIDE_LIGHT and SMART_ACTION_OVERRIDE_WEATHER (#24146)
* Core\SmartAI: implement SMART_ACTION_OVERRIDE_LIGHT and SMART_ACTION_OVERRIDE_WEATHER
* Change the invoker of action to any worldobject
* Revert "Change the invoker of action to any worldobject"
This reverts commit 2e15f7258553b7057c3e8f67c54efc77fb6d75b8.
* Add dbc-validations for new actions
* Use GetBaseObject() instead of Creature* for new actions. Add debug-logging
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 20 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 40 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 18 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCStores.h | 1 |
4 files changed, 78 insertions, 1 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index fd9f1b9467b..39f1f030cef 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -2309,6 +2309,26 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u break; } + case SMART_ACTION_OVERRIDE_LIGHT: + { + if (WorldObject* obj = GetBaseObject()) + { + obj->GetMap()->SetZoneOverrideLight(e.action.overrideLight.zoneId, e.action.overrideLight.lightId, e.action.overrideLight.fadeInTime); + TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction: SMART_ACTION_OVERRIDE_LIGHT: %s sets zone override light (zoneId: %u, lightId: %u, fadeInTime: %u)", + obj->GetGUID().ToString().c_str(), e.action.overrideLight.zoneId, e.action.overrideLight.lightId, e.action.overrideLight.fadeInTime); + } + break; + } + case SMART_ACTION_OVERRIDE_WEATHER: + { + if (WorldObject* obj = GetBaseObject()) + { + obj->GetMap()->SetZoneWeather(e.action.overrideWeather.zoneId, (WeatherState)e.action.overrideWeather.weatherId, float(e.action.overrideWeather.weatherGrade)); + TC_LOG_DEBUG("scripts.ai", "SmartScript::ProcessAction: SMART_ACTION_OVERRIDE_WEATHER: %s sets zone weather (zoneId: %u, weatherId: %u, weatherGrade: %u)", + obj->GetGUID().ToString().c_str(), e.action.overrideWeather.zoneId, e.action.overrideWeather.weatherId, e.action.overrideWeather.weatherGrade); + } + break; + } default: TC_LOG_ERROR("sql.sql", "SmartScript::ProcessAction: Entry %d SourceType %u, Event %u, Unhandled Action type %u", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType()); break; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index f14f7fd5604..a004f454f33 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -1528,6 +1528,46 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) break; } + case SMART_ACTION_OVERRIDE_LIGHT: + { + AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(e.action.overrideLight.zoneId); + if (!areaEntry) + { + TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses non-existent zoneId %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.overrideLight.zoneId); + return false; + } + + if (areaEntry->zone != 0) + { + TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses subzone (ID: %u) instead of zone, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.overrideLight.zoneId); + return false; + } + + if (!sLightStore.LookupEntry(e.action.overrideLight.lightId)) + { + TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses non-existent lightId %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.overrideLight.lightId); + return false; + } + + break; + } + case SMART_ACTION_OVERRIDE_WEATHER: + { + AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(e.action.overrideWeather.zoneId); + if (!areaEntry) + { + TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses non-existent zoneId %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.overrideWeather.zoneId); + return false; + } + + if (areaEntry->zone != 0) + { + TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses subzone (ID: %u) instead of zone, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.overrideWeather.zoneId); + return false; + } + + break; + } case SMART_ACTION_FOLLOW: case SMART_ACTION_SET_ORIENTATION: case SMART_ACTION_STORE_TARGET_LIST: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 9db915a667d..6416d63667b 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -587,8 +587,10 @@ enum SMART_ACTION SMART_ACTION_PLAY_CINEMATIC = 135, // entry, cinematic SMART_ACTION_SET_MOVEMENT_SPEED = 136, // movementType, speedInteger, speedFraction SMART_ACTION_PLAY_SPELL_VISUAL_KIT = 137, // spellVisualKitId (RESERVED, PENDING CHERRYPICK) + SMART_ACTION_OVERRIDE_LIGHT = 138, // zoneId, lightId, fadeInTime + SMART_ACTION_OVERRIDE_WEATHER = 139, // zoneId, weatherId, weatherGrade - SMART_ACTION_END = 138 + SMART_ACTION_END = 140 }; struct SmartAction @@ -1153,6 +1155,20 @@ struct SmartAction uint32 speedFraction; } movementSpeed; + struct + { + uint32 zoneId; + uint32 lightId; + uint32 fadeInTime; + } overrideLight; + + struct + { + uint32 zoneId; + uint32 weatherId; + uint32 weatherGrade; + } overrideWeather; + //! Note for any new future actions //! All parameters must have type uint32 diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index 67c68ad514c..fcd83f7d409 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -149,6 +149,7 @@ TC_GAME_API extern DBCStorage <ItemRandomPropertiesEntry> sItemRandomProperti TC_GAME_API extern DBCStorage <ItemRandomSuffixEntry> sItemRandomSuffixStore; TC_GAME_API extern DBCStorage <ItemSetEntry> sItemSetStore; TC_GAME_API extern DBCStorage <LFGDungeonEntry> sLFGDungeonStore; +TC_GAME_API extern DBCStorage <LightEntry> sLightStore; TC_GAME_API extern DBCStorage <LiquidTypeEntry> sLiquidTypeStore; TC_GAME_API extern DBCStorage <LockEntry> sLockStore; TC_GAME_API extern DBCStorage <MailTemplateEntry> sMailTemplateStore; |