Core/SAI: Implement quest source for SAI (#26170)

This commit is contained in:
Matan Shukry
2021-03-06 15:20:39 +02:00
committed by GitHub
parent 56e9560661
commit 1b4c4d2164
5 changed files with 109 additions and 20 deletions
+35 -12
View File
@@ -50,6 +50,7 @@ SmartScript::SmartScript()
trigger = nullptr;
areaTrigger = nullptr;
sceneTemplate = nullptr;
quest = nullptr;
mEventPhase = 0;
mPathId = 0;
mTextTimer = 0;
@@ -3041,6 +3042,20 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
ProcessAction(e, unit, var0, var1, bvar, spell, gob);
break;
}
case SMART_EVENT_QUEST_ACCEPTED:
case SMART_EVENT_QUEST_COMPLETION:
case SMART_EVENT_QUEST_REWARDED:
case SMART_EVENT_QUEST_FAIL:
{
ProcessAction(e, unit);
break;
}
case SMART_EVENT_QUEST_OBJ_COPLETETION:
{
if (var0 == (e.event.questObjective.id))
ProcessAction(e, unit);
break;
}
//no params
case SMART_EVENT_AGGRO:
case SMART_EVENT_DEATH:
@@ -3051,11 +3066,6 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
case SMART_EVENT_AI_INIT:
case SMART_EVENT_TRANSPORT_ADDPLAYER:
case SMART_EVENT_TRANSPORT_REMOVE_PLAYER:
case SMART_EVENT_QUEST_ACCEPTED:
case SMART_EVENT_QUEST_OBJ_COPLETETION:
case SMART_EVENT_QUEST_COMPLETION:
case SMART_EVENT_QUEST_REWARDED:
case SMART_EVENT_QUEST_FAIL:
case SMART_EVENT_JUST_SUMMONED:
case SMART_EVENT_RESET:
case SMART_EVENT_JUST_CREATED:
@@ -3712,7 +3722,7 @@ void SmartScript::OnUpdate(uint32 const diff)
}
}
void SmartScript::FillScript(SmartAIEventList e, WorldObject* obj, AreaTriggerEntry const* at, SceneTemplate const* scene)
void SmartScript::FillScript(SmartAIEventList e, WorldObject* obj, AreaTriggerEntry const* at, SceneTemplate const* scene, Quest const* quest)
{
if (e.empty())
{
@@ -3722,6 +3732,8 @@ void SmartScript::FillScript(SmartAIEventList e, WorldObject* obj, AreaTriggerEn
TC_LOG_DEBUG("scripts.ai", "SmartScript: EventMap for AreaTrigger %u is empty but is using SmartScript.", at->ID);
if (scene)
TC_LOG_DEBUG("scripts.ai", "SmartScript: EventMap for SceneId %u is empty but is using SmartScript.", scene->SceneId);
if (quest)
TC_LOG_DEBUG("scripts.ai", "SmartScript: EventMap for Quest %u is empty but is using SmartScript.", quest->GetQuestId());
return;
}
for (SmartAIEventList::iterator i = e.begin(); i != e.end(); ++i)
@@ -3774,33 +3786,38 @@ void SmartScript::GetScript()
e = sSmartScriptMgr->GetScript(-((int32)me->GetSpawnId()), mScriptType);
if (e.empty())
e = sSmartScriptMgr->GetScript((int32)me->GetEntry(), mScriptType);
FillScript(std::move(e), me, nullptr, nullptr);
FillScript(std::move(e), me, nullptr, nullptr, nullptr);
}
else if (go)
{
e = sSmartScriptMgr->GetScript(-((int32)go->GetSpawnId()), mScriptType);
if (e.empty())
e = sSmartScriptMgr->GetScript((int32)go->GetEntry(), mScriptType);
FillScript(std::move(e), go, nullptr, nullptr);
FillScript(std::move(e), go, nullptr, nullptr, nullptr);
}
else if (trigger)
{
e = sSmartScriptMgr->GetScript((int32)trigger->ID, mScriptType);
FillScript(std::move(e), nullptr, trigger, nullptr);
FillScript(std::move(e), nullptr, trigger, nullptr, nullptr);
}
else if (areaTrigger)
{
e = sSmartScriptMgr->GetScript((int32)areaTrigger->GetEntry(), mScriptType);
FillScript(std::move(e), areaTrigger, nullptr, nullptr);
FillScript(std::move(e), areaTrigger, nullptr, nullptr, nullptr);
}
else if (sceneTemplate)
{
e = sSmartScriptMgr->GetScript(sceneTemplate->SceneId, mScriptType);
FillScript(std::move(e), nullptr, nullptr, sceneTemplate);
FillScript(std::move(e), nullptr, nullptr, sceneTemplate, nullptr);
}
else if (quest)
{
e = sSmartScriptMgr->GetScript(quest->GetQuestId(), mScriptType);
FillScript(std::move(e), nullptr, nullptr, nullptr, quest);
}
}
void SmartScript::OnInitialize(WorldObject* obj, AreaTriggerEntry const* at, SceneTemplate const* scene)
void SmartScript::OnInitialize(WorldObject* obj, AreaTriggerEntry const* at, SceneTemplate const* scene, Quest const* qst)
{
if (obj)//handle object based scripts
{
@@ -3838,6 +3855,12 @@ void SmartScript::OnInitialize(WorldObject* obj, AreaTriggerEntry const* at, Sce
sceneTemplate = scene;
TC_LOG_DEBUG("scripts.ai", "SmartScript::OnInitialize: source is Scene with id %u", scene->SceneId);
}
else if (qst)
{
mScriptType = SMART_SCRIPT_TYPE_QUEST;
quest = qst;
TC_LOG_DEBUG("scripts.ai", "SmartScript::OnInitialize: source is Quest with id %u", qst->GetQuestId());
}
else
{
TC_LOG_ERROR("misc", "SmartScript::OnInitialize: !WARNING! Initialized objects are NULL.");