summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorAndrew <47818697+Nyeriah@users.noreply.github.com>2025-09-11 18:38:56 -0300
committerGitHub <noreply@github.com>2025-09-11 18:38:56 -0300
commitf893df775c38459d4b06284fd0fc410f80e25be3 (patch)
tree160fc2d86234827319d501745153b93875a26208 /src/server
parent110fd070f2f6fe5926b7330c5f33b89e59f2c69c (diff)
feat(Core/Conditions): Implement CONDITION_AI_DATA and support for st… (#22879)
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp10
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.h1
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp13
-rw-r--r--src/server/game/Conditions/ConditionMgr.h3
4 files changed, 25 insertions, 2 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index f7e30d3398..db446525d6 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -74,6 +74,8 @@ SmartAI::SmartAI(Creature* c) : CreatureAI(c)
_chaseOnInterrupt = false;
+ aiDataSet.clear();
+
// Xinef: Vehicle conditions
m_ConditionsTimer = 0;
if (me->GetVehicleKit())
@@ -778,6 +780,7 @@ void SmartAI::JustRespawned()
mFollowArrivedEntry = 0;
mFollowCreditType = 0;
mFollowArrivedAlive = true;
+ aiDataSet.clear();
}
void SmartAI::JustReachedHome()
@@ -963,8 +966,12 @@ void SmartAI::DoAction(int32 param)
GetScript()->ProcessEventsFor(SMART_EVENT_ACTION_DONE, nullptr, param);
}
-uint32 SmartAI::GetData(uint32 /*id*/) const
+uint32 SmartAI::GetData(uint32 id) const
{
+ auto const& itr = aiDataSet.find(id);
+ if (itr != aiDataSet.end())
+ return itr->second;
+
return 0;
}
@@ -980,6 +987,7 @@ void SmartAI::SetData(uint32 id, uint32 value, WorldObject* invoker)
gob = invoker->ToGameObject();
}
+ aiDataSet[id] = value;
GetScript()->ProcessEventsFor(SMART_EVENT_DATA_SET, unit, id, value, false, nullptr, gob);
}
diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h
index 1cc940df47..7b3a367729 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.h
+++ b/src/server/game/AI/SmartScripts/SmartAI.h
@@ -262,6 +262,7 @@ private:
uint32 m_ConditionsTimer;
bool _chaseOnInterrupt;
+ std::unordered_map<uint32, uint32> aiDataSet;
};
class SmartGameObjectAI : public GameObjectAI
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index 09edfab284..bb6fa29c49 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -18,6 +18,8 @@
#include "ConditionMgr.h"
#include "AchievementMgr.h"
#include "GameEventMgr.h"
+#include "GameObject.h"
+#include "GameObjectAI.h"
#include "InstanceScript.h"
#include "ObjectMgr.h"
#include "Pet.h"
@@ -576,6 +578,14 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo)
condMeets = sWorldState->IsConditionFulfilled(ConditionValue1, ConditionValue2);
break;
}
+ case CONDITION_AI_DATA:
+ {
+ if (Creature* creature = object->ToCreature())
+ condMeets = creature->AI() && creature->AI()->GetData(ConditionValue1) == ConditionValue2;
+ else if (GameObject* go = object->ToGameObject())
+ condMeets = go->AI() && go->AI()->GetData(ConditionValue1) == ConditionValue2;
+ break;
+ }
default:
condMeets = false;
break;
@@ -779,6 +789,9 @@ uint32 Condition::GetSearcherTypeMaskForCondition()
case CONDITION_WORLD_SCRIPT:
mask |= GRID_MAP_TYPE_MASK_ALL;
break;
+ case CONDITION_AI_DATA:
+ mask |= GRID_MAP_TYPE_MASK_CREATURE | GRID_MAP_TYPE_MASK_GAMEOBJECT;
+ break;
default:
ASSERT(false && "Condition::GetSearcherTypeMaskForCondition - missing condition handling!");
break;
diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h
index 1540fd903a..eaa1d14e21 100644
--- a/src/server/game/Conditions/ConditionMgr.h
+++ b/src/server/game/Conditions/ConditionMgr.h
@@ -87,8 +87,9 @@ enum ConditionTypes
CONDITION_QUEST_SATISFY_EXCLUSIVE = 101, // quest_id 0 0 true if satisfied exclusive group
CONDITION_HAS_AURA_TYPE = 102, // aura_type 0 0 true if has aura type
CONDITION_WORLD_SCRIPT = 103, // conditionId state 0 true if WorldState::IsConditionFulfilled returns true
+ CONDITION_AI_DATA = 104, // dataId value 0 true if AI::GetData returns value
- CONDITION_AC_END = 104 // placeholder
+ CONDITION_AC_END = 105 // placeholder
};
/*! Documentation on implementing a new ConditionSourceType: