aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-06-24 22:20:34 +0200
committerShauren <shauren.trinity@gmail.com>2022-06-24 22:20:34 +0200
commit5d27939667cf3ca985a33b93646fa4e34445c8d3 (patch)
tree38b082e57aadb156b888321f07f5457aa1d2c290 /src/server/game/Maps
parente2cf6d68fc5d6b3316f69873ee3ab917b2c9d4c0 (diff)
Core/Conditions: Implemented conditions for spawn groups
Diffstat (limited to 'src/server/game/Maps')
-rw-r--r--src/server/game/Maps/Map.cpp23
-rw-r--r--src/server/game/Maps/Map.h1
-rw-r--r--src/server/game/Maps/SpawnData.h18
3 files changed, 34 insertions, 8 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 174b3fda99a..e9fe8caffc3 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -853,6 +853,7 @@ void Map::Update(uint32 t_diff)
if (_respawnCheckTimer <= t_diff)
{
ProcessRespawns();
+ UpdateSpawnGroupConditions();
_respawnCheckTimer = sWorld->getIntConfig(CONFIG_RESPAWN_MINCHECKINTERVALMS);
}
else
@@ -3640,6 +3641,28 @@ bool Map::IsSpawnGroupActive(uint32 groupId) const
return (_toggledSpawnGroupIds.find(groupId) != _toggledSpawnGroupIds.end()) != !(data->flags & SPAWNGROUP_FLAG_MANUAL_SPAWN);
}
+void Map::UpdateSpawnGroupConditions()
+{
+ std::vector<uint32> const* spawnGroups = sObjectMgr->GetSpawnGroupsForMap(GetId());
+ if (!spawnGroups)
+ return;
+
+ for (uint32 spawnGroupId : *spawnGroups)
+ {
+ bool isActive = IsSpawnGroupActive(spawnGroupId);
+ bool shouldBeActive = sConditionMgr->IsMapMeetingNotGroupedConditions(CONDITION_SOURCE_TYPE_SPAWN_GROUP, spawnGroupId, this);
+ if (isActive == shouldBeActive)
+ continue;
+
+ if (shouldBeActive)
+ SpawnGroupSpawn(spawnGroupId);
+ else if (ASSERT_NOTNULL(GetSpawnGroupData(spawnGroupId))->flags & SPAWNGROUP_FLAG_DESPAWN_ON_CONDITION_FAILURE)
+ SpawnGroupDespawn(spawnGroupId);
+ else
+ SetSpawnGroupInactive(spawnGroupId);
+ }
+}
+
void Map::AddFarSpellCallback(FarSpellCallback&& callback)
{
_farSpellCallbacks.Enqueue(new FarSpellCallback(std::move(callback)));
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
index d4b7b5c1c10..f589ce9e0e3 100644
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -876,6 +876,7 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
}
void SetSpawnGroupActive(uint32 groupId, bool state);
+ void UpdateSpawnGroupConditions();
std::unordered_set<uint32> _toggledSpawnGroupIds;
uint32 _respawnCheckTimer;
diff --git a/src/server/game/Maps/SpawnData.h b/src/server/game/Maps/SpawnData.h
index c672ec528ad..9f25655e46e 100644
--- a/src/server/game/Maps/SpawnData.h
+++ b/src/server/game/Maps/SpawnData.h
@@ -50,14 +50,16 @@ enum SpawnObjectTypeMask
enum SpawnGroupFlags
{
- SPAWNGROUP_FLAG_NONE = 0x00,
- SPAWNGROUP_FLAG_SYSTEM = 0x01,
- SPAWNGROUP_FLAG_COMPATIBILITY_MODE = 0x02,
- SPAWNGROUP_FLAG_MANUAL_SPAWN = 0x04,
- SPAWNGROUP_FLAG_DYNAMIC_SPAWN_RATE = 0x08,
- SPAWNGROUP_FLAG_ESCORTQUESTNPC = 0x10,
-
- SPAWNGROUP_FLAGS_ALL = (SPAWNGROUP_FLAG_SYSTEM | SPAWNGROUP_FLAG_COMPATIBILITY_MODE | SPAWNGROUP_FLAG_MANUAL_SPAWN | SPAWNGROUP_FLAG_DYNAMIC_SPAWN_RATE | SPAWNGROUP_FLAG_ESCORTQUESTNPC)
+ SPAWNGROUP_FLAG_NONE = 0x00,
+ SPAWNGROUP_FLAG_SYSTEM = 0x01,
+ SPAWNGROUP_FLAG_COMPATIBILITY_MODE = 0x02,
+ SPAWNGROUP_FLAG_MANUAL_SPAWN = 0x04,
+ SPAWNGROUP_FLAG_DYNAMIC_SPAWN_RATE = 0x08,
+ SPAWNGROUP_FLAG_ESCORTQUESTNPC = 0x10,
+ SPAWNGROUP_FLAG_DESPAWN_ON_CONDITION_FAILURE = 0x20,
+
+ SPAWNGROUP_FLAGS_ALL = (SPAWNGROUP_FLAG_SYSTEM | SPAWNGROUP_FLAG_COMPATIBILITY_MODE | SPAWNGROUP_FLAG_MANUAL_SPAWN
+ | SPAWNGROUP_FLAG_DYNAMIC_SPAWN_RATE | SPAWNGROUP_FLAG_ESCORTQUESTNPC | SPAWNGROUP_FLAG_DESPAWN_ON_CONDITION_FAILURE)
};
struct SpawnGroupTemplateData