From c65ba35269a68c94c3e423f78fa1585f9d89dd04 Mon Sep 17 00:00:00 2001 From: ForesterDev <11771800+ForesterDev@users.noreply.github.com> Date: Sun, 23 Feb 2020 00:11:14 +0400 Subject: 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 --- src/server/game/AI/SmartScripts/SmartScript.cpp | 20 +++++++++++ src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 40 ++++++++++++++++++++++ src/server/game/AI/SmartScripts/SmartScriptMgr.h | 18 +++++++++- src/server/game/DataStores/DBCStores.h | 1 + 4 files changed, 78 insertions(+), 1 deletion(-) (limited to 'src') 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 sItemRandomProperti TC_GAME_API extern DBCStorage sItemRandomSuffixStore; TC_GAME_API extern DBCStorage sItemSetStore; TC_GAME_API extern DBCStorage sLFGDungeonStore; +TC_GAME_API extern DBCStorage sLightStore; TC_GAME_API extern DBCStorage sLiquidTypeStore; TC_GAME_API extern DBCStorage sLockStore; TC_GAME_API extern DBCStorage sMailTemplateStore; -- cgit v1.2.3