Core/SAI: Added SAI support for new areatriggers

This commit is contained in:
Shauren
2021-02-05 18:12:55 +01:00
parent db18aacc1f
commit 875fd4107f
6 changed files with 130 additions and 18 deletions

View File

@@ -16,6 +16,7 @@
*/
#include "SmartAI.h"
#include "AreaTrigger.h"
#include "Creature.h"
#include "CreatureGroups.h"
#include "DB2Structure.h"
@@ -1094,6 +1095,41 @@ class SmartTrigger : public AreaTriggerScript
}
};
void SmartAreaTriggerAI::OnInitialize()
{
GetScript()->OnInitialize(at);
}
void SmartAreaTriggerAI::OnUpdate(uint32 diff)
{
GetScript()->OnUpdate(diff);
}
void SmartAreaTriggerAI::OnUnitEnter(Unit* unit)
{
GetScript()->ProcessEventsFor(SMART_EVENT_AREATRIGGER_ONTRIGGER, unit);
}
void SmartAreaTriggerAI::SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker)
{
if (invoker)
GetScript()->mLastInvoker = invoker->GetGUID();
GetScript()->SetScript9(e, entry);
}
class SmartAreaTriggerEntityScript : public AreaTriggerEntityScript
{
public:
SmartAreaTriggerEntityScript() : AreaTriggerEntityScript("SmartAreaTriggerAI")
{
}
AreaTriggerAI* GetAI(AreaTrigger* areaTrigger) const override
{
return new SmartAreaTriggerAI(areaTrigger);
}
};
class SmartScene : public SceneScript
{
public:
@@ -1131,5 +1167,6 @@ public:
void AddSC_SmartScripts()
{
new SmartTrigger();
new SmartAreaTriggerEntityScript();
new SmartScene();
}

View File

@@ -19,6 +19,7 @@
#define TRINITY_SMARTAI_H
#include "Define.h"
#include "AreaTriggerAI.h"
#include "CreatureAI.h"
#include "GameObjectAI.h"
#include "Position.h"
@@ -286,6 +287,22 @@ class TC_GAME_API SmartGameObjectAI : public GameObjectAI
bool _gossipReturn;
};
class TC_GAME_API SmartAreaTriggerAI : public AreaTriggerAI
{
public:
using AreaTriggerAI::AreaTriggerAI;
void OnInitialize() override;
void OnUpdate(uint32 diff) override;
void OnUnitEnter(Unit* unit) override;
SmartScript* GetScript() { return &mScript; }
void SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker);
private:
SmartScript mScript;
};
/// Registers scripts required by the SAI scripting system
void AddSC_SmartScripts();

View File

@@ -48,6 +48,7 @@ SmartScript::SmartScript()
go = nullptr;
me = nullptr;
trigger = nullptr;
areaTrigger = nullptr;
sceneTemplate = nullptr;
mEventPhase = 0;
mPathId = 0;
@@ -170,6 +171,7 @@ void SmartScript::ResetBaseObject()
{
me = m;
go = nullptr;
areaTrigger = nullptr;
}
}
@@ -179,6 +181,7 @@ void SmartScript::ResetBaseObject()
{
me = nullptr;
go = o;
areaTrigger = nullptr;
}
}
}
@@ -1618,6 +1621,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (IsSmartGO(goTarget))
ENSURE_AI(SmartGameObjectAI, goTarget->AI())->SetScript9(e, e.action.timedActionList.id, GetLastInvoker());
}
else if (AreaTrigger* areaTriggerTarget = target->ToAreaTrigger())
if (SmartAreaTriggerAI* atSAI = CAST_AI(SmartAreaTriggerAI, areaTriggerTarget->AI()))
atSAI->SetScript9(e, e.action.timedActionList.id, GetLastInvoker());
}
break;
}
@@ -1705,6 +1711,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (IsSmartGO(goTarget))
ENSURE_AI(SmartGameObjectAI, goTarget->AI())->SetScript9(e, id, GetLastInvoker());
}
else if (AreaTrigger* areaTriggerTarget = target->ToAreaTrigger())
if (SmartAreaTriggerAI* atSAI = CAST_AI(SmartAreaTriggerAI, areaTriggerTarget->AI()))
atSAI->SetScript9(e, id, GetLastInvoker());
}
break;
}
@@ -1729,6 +1738,9 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
if (IsSmartGO(goTarget))
ENSURE_AI(SmartGameObjectAI, goTarget->AI())->SetScript9(e, id, GetLastInvoker());
}
else if (AreaTrigger* areaTriggerTarget = target->ToAreaTrigger())
if (SmartAreaTriggerAI* atSAI = CAST_AI(SmartAreaTriggerAI, areaTriggerTarget->AI()))
atSAI->SetScript9(e, id, GetLastInvoker());
}
break;
}
@@ -3608,7 +3620,11 @@ bool SmartScript::IsGameObject(WorldObject* obj)
void SmartScript::OnUpdate(uint32 const diff)
{
if ((mScriptType == SMART_SCRIPT_TYPE_CREATURE || mScriptType == SMART_SCRIPT_TYPE_GAMEOBJECT) && !GetBaseObject())
if ((mScriptType == SMART_SCRIPT_TYPE_CREATURE
|| mScriptType == SMART_SCRIPT_TYPE_GAMEOBJECT
|| mScriptType == SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY
|| mScriptType == SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_SERVERSIDE)
&& !GetBaseObject())
return;
InstallEvents();//before UpdateTimers
@@ -3743,6 +3759,11 @@ void SmartScript::GetScript()
e = sSmartScriptMgr->GetScript((int32)trigger->ID, mScriptType);
FillScript(std::move(e), nullptr, trigger, nullptr);
}
else if (areaTrigger)
{
e = sSmartScriptMgr->GetScript((int32)areaTrigger->GetEntry(), mScriptType);
FillScript(std::move(e), areaTrigger, nullptr, nullptr);
}
else if (sceneTemplate)
{
e = sSmartScriptMgr->GetScript(sceneTemplate->SceneId, mScriptType);
@@ -3766,6 +3787,11 @@ void SmartScript::OnInitialize(WorldObject* obj, AreaTriggerEntry const* at, Sce
go = obj->ToGameObject();
TC_LOG_DEBUG("scripts.ai", "SmartScript::OnInitialize: source is GameObject %u", go->GetEntry());
break;
case TYPEID_AREATRIGGER:
areaTrigger = obj->ToAreaTrigger();
mScriptType = areaTrigger->IsServerSide() ? SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_SERVERSIDE : SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY;
TC_LOG_DEBUG("scripts.ai", "SmartScript::OnInitialize: source is AreaTrigger %u, IsServerSide %u", areaTrigger->GetEntry(), uint32(areaTrigger->IsServerSide()));
break;
default:
TC_LOG_ERROR("misc", "SmartScript::OnInitialize: Unhandled TypeID !WARNING!");
return;

View File

@@ -21,6 +21,7 @@
#include "Define.h"
#include "SmartScriptMgr.h"
class AreaTrigger;
class Creature;
class GameObject;
class Player;
@@ -122,6 +123,7 @@ class TC_GAME_API SmartScript
GameObject* go;
ObjectGuid goOrigGUID;
AreaTriggerEntry const* trigger;
AreaTrigger* areaTrigger;
SceneTemplate const* sceneTemplate;
SmartScriptType mScriptType;
uint32 mEventPhase;

View File

@@ -16,6 +16,8 @@
*/
#include "SmartScriptMgr.h"
#include "AreaTriggerDataStore.h"
#include "AreaTriggerTemplate.h"
#include "CreatureTextMgr.h"
#include "DB2Stores.h"
#include "DatabaseEnv.h"
@@ -194,6 +196,24 @@ void SmartAIMgr::LoadSmartAIFromDB()
}
case SMART_SCRIPT_TYPE_TIMED_ACTIONLIST:
break;//nothing to check, really
case SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY:
{
if (!sAreaTriggerDataStore->GetAreaTriggerTemplate({ (uint32)temp.entryOrGuid, false }))
{
TC_LOG_ERROR("sql.sql", "SmartAIMgr::LoadSmartAIFromDB: AreaTrigger entry (%u IsServerSide false) does not exist, skipped loading.", uint32(temp.entryOrGuid));
continue;
}
break;
}
case SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_SERVERSIDE:
{
if (!sAreaTriggerDataStore->GetAreaTriggerTemplate({ (uint32)temp.entryOrGuid, true }))
{
TC_LOG_ERROR("sql.sql", "SmartAIMgr::LoadSmartAIFromDB: AreaTrigger entry (%u IsServerSide true) does not exist, skipped loading.", uint32(temp.entryOrGuid));
continue;
}
break;
}
default:
TC_LOG_ERROR("sql.sql", "SmartAIMgr::LoadSmartAIFromDB: not yet implemented source_type %u", (uint32)source_type);
continue;
@@ -840,6 +860,11 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
}
case SMART_EVENT_AREATRIGGER_ONTRIGGER:
{
if (e.event.areatrigger.id && (e.GetScriptType() == SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY || e.GetScriptType() == SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_SERVERSIDE))
{
TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry " SI64FMTD " SourceType %u Event %u Action %u areatrigger param not supported for SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY and SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_SERVERSIDE, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType());
return false;
}
if (e.event.areatrigger.id && !IsAreaTriggerValid(e, e.event.areatrigger.id))
return false;
break;

View File

@@ -1381,7 +1381,9 @@ enum SmartScriptType
SMART_SCRIPT_TYPE_INSTANCE = 8, //
SMART_SCRIPT_TYPE_TIMED_ACTIONLIST = 9, //
SMART_SCRIPT_TYPE_SCENE = 10, //done
SMART_SCRIPT_TYPE_MAX = 11
SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY = 11,
SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_SERVERSIDE = 12,
SMART_SCRIPT_TYPE_MAX
};
enum SmartAITypeMaskId
@@ -1396,28 +1398,31 @@ enum SmartAITypeMaskId
SMART_SCRIPT_TYPE_MASK_TRANSPORT = 128,
SMART_SCRIPT_TYPE_MASK_INSTANCE = 256,
SMART_SCRIPT_TYPE_MASK_TIMED_ACTIONLIST = 512,
SMART_SCRIPT_TYPE_MASK_SCENE = 1024
SMART_SCRIPT_TYPE_MASK_SCENE = 1024,
SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY = 2048
};
const uint32 SmartAITypeMask[SMART_SCRIPT_TYPE_MAX][2] =
{
{SMART_SCRIPT_TYPE_CREATURE, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_SCRIPT_TYPE_GAMEOBJECT, SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
{SMART_SCRIPT_TYPE_AREATRIGGER, SMART_SCRIPT_TYPE_MASK_AREATRIGGER },
{SMART_SCRIPT_TYPE_EVENT, SMART_SCRIPT_TYPE_MASK_EVENT },
{SMART_SCRIPT_TYPE_GOSSIP, SMART_SCRIPT_TYPE_MASK_GOSSIP },
{SMART_SCRIPT_TYPE_QUEST, SMART_SCRIPT_TYPE_MASK_QUEST },
{SMART_SCRIPT_TYPE_SPELL, SMART_SCRIPT_TYPE_MASK_SPELL },
{SMART_SCRIPT_TYPE_TRANSPORT, SMART_SCRIPT_TYPE_MASK_TRANSPORT },
{SMART_SCRIPT_TYPE_INSTANCE, SMART_SCRIPT_TYPE_MASK_INSTANCE },
{SMART_SCRIPT_TYPE_TIMED_ACTIONLIST, SMART_SCRIPT_TYPE_MASK_TIMED_ACTIONLIST },
{SMART_SCRIPT_TYPE_SCENE, SMART_SCRIPT_TYPE_MASK_SCENE }
{SMART_SCRIPT_TYPE_CREATURE, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_SCRIPT_TYPE_GAMEOBJECT, SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
{SMART_SCRIPT_TYPE_AREATRIGGER, SMART_SCRIPT_TYPE_MASK_AREATRIGGER },
{SMART_SCRIPT_TYPE_EVENT, SMART_SCRIPT_TYPE_MASK_EVENT },
{SMART_SCRIPT_TYPE_GOSSIP, SMART_SCRIPT_TYPE_MASK_GOSSIP },
{SMART_SCRIPT_TYPE_QUEST, SMART_SCRIPT_TYPE_MASK_QUEST },
{SMART_SCRIPT_TYPE_SPELL, SMART_SCRIPT_TYPE_MASK_SPELL },
{SMART_SCRIPT_TYPE_TRANSPORT, SMART_SCRIPT_TYPE_MASK_TRANSPORT },
{SMART_SCRIPT_TYPE_INSTANCE, SMART_SCRIPT_TYPE_MASK_INSTANCE },
{SMART_SCRIPT_TYPE_TIMED_ACTIONLIST, SMART_SCRIPT_TYPE_MASK_TIMED_ACTIONLIST },
{SMART_SCRIPT_TYPE_SCENE, SMART_SCRIPT_TYPE_MASK_SCENE },
{SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY, SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY },
{SMART_SCRIPT_TYPE_AREATRIGGER_ENTITY_SERVERSIDE, SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY }
};
const uint32 SmartAIEventMask[SMART_EVENT_END][2] =
{
{SMART_EVENT_UPDATE_IC, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_TIMED_ACTIONLIST},
{SMART_EVENT_UPDATE_OOC, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT + SMART_SCRIPT_TYPE_MASK_INSTANCE },
{SMART_EVENT_UPDATE_OOC, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT + SMART_SCRIPT_TYPE_MASK_INSTANCE + SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY },
{SMART_EVENT_HEALT_PCT, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_EVENT_MANA_PCT, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_EVENT_AGGRO, SMART_SCRIPT_TYPE_MASK_CREATURE },
@@ -1462,7 +1467,7 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] =
{SMART_EVENT_TRANSPORT_REMOVE_PLAYER, SMART_SCRIPT_TYPE_MASK_TRANSPORT },
{SMART_EVENT_TRANSPORT_RELOCATE, SMART_SCRIPT_TYPE_MASK_TRANSPORT },
{SMART_EVENT_INSTANCE_PLAYER_ENTER, SMART_SCRIPT_TYPE_MASK_INSTANCE },
{SMART_EVENT_AREATRIGGER_ONTRIGGER, SMART_SCRIPT_TYPE_MASK_AREATRIGGER },
{SMART_EVENT_AREATRIGGER_ONTRIGGER, SMART_SCRIPT_TYPE_MASK_AREATRIGGER + SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY },
{SMART_EVENT_QUEST_ACCEPTED, SMART_SCRIPT_TYPE_MASK_QUEST },
{SMART_EVENT_QUEST_OBJ_COPLETETION, SMART_SCRIPT_TYPE_MASK_QUEST },
{SMART_EVENT_QUEST_REWARDED, SMART_SCRIPT_TYPE_MASK_QUEST },
@@ -1476,8 +1481,8 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] =
{SMART_EVENT_WAYPOINT_STOPPED, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_EVENT_WAYPOINT_ENDED, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_EVENT_TIMED_EVENT_TRIGGERED, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
{SMART_EVENT_UPDATE, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
{SMART_EVENT_LINK, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT + SMART_SCRIPT_TYPE_MASK_AREATRIGGER + SMART_SCRIPT_TYPE_MASK_EVENT + SMART_SCRIPT_TYPE_MASK_GOSSIP + SMART_SCRIPT_TYPE_MASK_QUEST + SMART_SCRIPT_TYPE_MASK_SPELL + SMART_SCRIPT_TYPE_MASK_TRANSPORT + SMART_SCRIPT_TYPE_MASK_INSTANCE },
{SMART_EVENT_UPDATE, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT + SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY },
{SMART_EVENT_LINK, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT + SMART_SCRIPT_TYPE_MASK_AREATRIGGER + SMART_SCRIPT_TYPE_MASK_EVENT + SMART_SCRIPT_TYPE_MASK_GOSSIP + SMART_SCRIPT_TYPE_MASK_QUEST + SMART_SCRIPT_TYPE_MASK_SPELL + SMART_SCRIPT_TYPE_MASK_TRANSPORT + SMART_SCRIPT_TYPE_MASK_INSTANCE + SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY },
{SMART_EVENT_GOSSIP_SELECT, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
{SMART_EVENT_JUST_CREATED, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
{SMART_EVENT_GOSSIP_HELLO, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },