From 1d08423725141de712290b18739dcc9b3ea3a7c6 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 (cherry picked from commit c65ba35269a68c94c3e423f78fa1585f9d89dd04) --- src/server/game/AI/SmartScripts/SmartScript.cpp | 20 +++++++++++ src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 40 ++++++++++++++++++++++ src/server/game/AI/SmartScripts/SmartScriptMgr.h | 16 +++++++++ src/server/game/DataStores/DB2Stores.h | 1 + 4 files changed, 77 insertions(+) (limited to 'src/server') diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 4ea727cbfe7..16636b10afd 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -2430,6 +2430,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; + } case SMART_ACTION_PLAY_SPELL_VISUAL_KIT: { for (WorldObject* const target : targets) diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index da5dbbad14d..06aab98c8e8 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -1700,6 +1700,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 " SI64FMTD " 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->ParentAreaID != 0) + { + TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry " SI64FMTD " 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 " SI64FMTD " 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 " SI64FMTD " 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->ParentAreaID != 0) + { + TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry " SI64FMTD " 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_CREATE_CONVERSATION: { if (!sConversationDataStore->GetConversationTemplate(e.action.conversation.id)) diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 7cc6f0440ed..3b480c11cb0 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -603,6 +603,8 @@ 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, kitType (unknown values, copypaste from packet dumps), duration + SMART_ACTION_OVERRIDE_LIGHT = 138, // zoneId, lightId, fadeInTime + SMART_ACTION_OVERRIDE_WEATHER = 139, // zoneId, weatherId, weatherGrade SMART_ACTION_CREATE_CONVERSATION = 143, // conversation_template.id SMART_ACTION_END = 144 }; @@ -1207,6 +1209,20 @@ struct SmartAction uint32 duration; } spellVisualKit; + struct + { + uint32 zoneId; + uint32 lightId; + uint32 fadeInTime; + } overrideLight; + + struct + { + uint32 zoneId; + uint32 weatherId; + uint32 weatherGrade; + } overrideWeather; + struct { uint32 id; diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index 8a652478c06..25715feb226 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -160,6 +160,7 @@ TC_GAME_API extern DB2Storage sKeystoneAff TC_GAME_API extern DB2Storage sLanguageWordsStore; TC_GAME_API extern DB2Storage sLanguagesStore; TC_GAME_API extern DB2Storage sLFGDungeonsStore; +TC_GAME_API extern DB2Storage sLightStore; TC_GAME_API extern DB2Storage sLiquidTypeStore; TC_GAME_API extern DB2Storage sLockStore; TC_GAME_API extern DB2Storage sMailTemplateStore; -- cgit v1.2.3