aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp10
-rw-r--r--src/server/game/Entities/Creature/Creature.h2
-rw-r--r--src/server/game/Entities/Creature/CreatureData.h4
-rw-r--r--src/server/game/Entities/Creature/TemporarySummon.h2
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp8
-rw-r--r--src/server/game/Entities/GameObject/GameObject.h2
-rw-r--r--src/server/game/Entities/GameObject/GameObjectData.h4
-rw-r--r--src/server/game/Entities/Pet/Pet.h2
-rw-r--r--src/server/game/Entities/Player/Player.cpp50
-rw-r--r--src/server/game/Entities/Player/Player.h8
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp2
11 files changed, 55 insertions, 39 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 105a780beca..8f2c6980762 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -307,7 +307,7 @@ bool Creature::InitEntry(uint32 entry, CreatureData const* data /*= nullptr*/)
// get difficulty 1 mode entry
CreatureTemplate const* cinfo = nullptr;
- DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry(GetMap()->GetSpawnMode());
+ DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry(GetMap()->GetDifficultyID());
while (!cinfo && difficultyEntry)
{
int32 idx = CreatureTemplate::DifficultyIDToDifficultyEntryIndex(difficultyEntry->ID);
@@ -1103,10 +1103,10 @@ void Creature::SaveToDB()
}
uint32 mapId = GetTransport() ? GetTransport()->GetGOInfo()->moTransport.SpawnMap : GetMapId();
- SaveToDB(mapId, data->spawnMask);
+ SaveToDB(mapId, data->spawnDifficulties);
}
-void Creature::SaveToDB(uint32 mapid, uint64 spawnMask)
+void Creature::SaveToDB(uint32 mapid, std::vector<Difficulty> const& spawnDifficulties)
{
// update in loaded data
if (!m_spawnId)
@@ -1174,7 +1174,7 @@ void Creature::SaveToDB(uint32 mapid, uint64 spawnMask)
// prevent add data integrity problems
data.movementType = !m_respawnradius && GetDefaultMovementType() == RANDOM_MOTION_TYPE
? IDLE_MOTION_TYPE : GetDefaultMovementType();
- data.spawnMask = spawnMask;
+ data.spawnDifficulties = spawnDifficulties;
data.npcflag = npcflag;
data.unit_flags = unitFlags;
data.unit_flags2 = unitFlags2;
@@ -1197,7 +1197,7 @@ void Creature::SaveToDB(uint32 mapid, uint64 spawnMask)
stmt->setUInt64(index++, m_spawnId);
stmt->setUInt32(index++, GetEntry());
stmt->setUInt16(index++, uint16(mapid));
- stmt->setUInt64(index++, spawnMask);
+ stmt->setString(index++, StringJoin(data.spawnDifficulties, ","));
stmt->setUInt32(index++, data.phaseId);
stmt->setUInt32(index++, data.phaseGroup);
stmt->setUInt32(index++, displayId);
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 0470a4cc41f..d87db9be2ca 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -187,7 +187,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma
public:
void SaveToDB();
// overriden in Pet
- virtual void SaveToDB(uint32 mapid, uint64 spawnMask);
+ virtual void SaveToDB(uint32 mapid, std::vector<Difficulty> const& spawnDifficulties);
virtual void DeleteFromDB(); // overriden in Pet
Loot loot;
diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h
index e1d0fea528e..45a13c6f603 100644
--- a/src/server/game/Entities/Creature/CreatureData.h
+++ b/src/server/game/Entities/Creature/CreatureData.h
@@ -500,7 +500,7 @@ struct CreatureData
CreatureData() : id(0), mapid(0), displayid(0), equipmentId(0),
posX(0.0f), posY(0.0f), posZ(0.0f), orientation(0.0f), spawntimesecs(0),
spawndist(0.0f), currentwaypoint(0), curhealth(0), curmana(0), movementType(0),
- spawnMask(0), npcflag(0), unit_flags(0), unit_flags2(0), unit_flags3(0), dynamicflags(0),
+ spawnDifficulties(), npcflag(0), unit_flags(0), unit_flags2(0), unit_flags3(0), dynamicflags(0),
phaseUseFlags(0), phaseId(0), phaseGroup(0), terrainSwapMap(-1), ScriptId(0), dbData(true) { }
uint32 id; // entry in creature_template
uint16 mapid;
@@ -516,7 +516,7 @@ struct CreatureData
uint32 curhealth;
uint32 curmana;
uint8 movementType;
- uint64 spawnMask;
+ std::vector<Difficulty> spawnDifficulties;
uint64 npcflag;
uint32 unit_flags; // enum UnitFlags mask values
uint32 unit_flags2; // enum UnitFlags2 mask values
diff --git a/src/server/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h
index 785b848529b..f4a05581ea5 100644
--- a/src/server/game/Entities/Creature/TemporarySummon.h
+++ b/src/server/game/Entities/Creature/TemporarySummon.h
@@ -53,7 +53,7 @@ class TC_GAME_API TempSummon : public Creature
virtual void UnSummon(uint32 msTime = 0);
void RemoveFromWorld() override;
void SetTempSummonType(TempSummonType type);
- void SaveToDB(uint32 /*mapid*/, uint64 /*spawnMask*/) override { }
+ void SaveToDB(uint32 /*mapid*/, std::vector<Difficulty> const& /*spawnDifficulties*/) override { }
Unit* GetSummoner() const;
Creature* GetSummonerCreatureBase() const;
ObjectGuid GetSummonerGUID() const { return m_summonerGUID; }
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index d0a458a7946..89b59a11ab2 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -911,10 +911,10 @@ void GameObject::SaveToDB()
return;
}
- SaveToDB(GetMapId(), data->spawnMask);
+ SaveToDB(GetMapId(), data->spawnDifficulties);
}
-void GameObject::SaveToDB(uint32 mapid, uint64 spawnMask)
+void GameObject::SaveToDB(uint32 mapid, std::vector<Difficulty> const& spawnDifficulties)
{
const GameObjectTemplate* goI = GetGOInfo();
@@ -938,7 +938,7 @@ void GameObject::SaveToDB(uint32 mapid, uint64 spawnMask)
data.spawntimesecs = m_spawnedByDefault ? m_respawnDelayTime : -(int32)m_respawnDelayTime;
data.animprogress = GetGoAnimProgress();
data.go_state = GetGoState();
- data.spawnMask = spawnMask;
+ data.spawnDifficulties = spawnDifficulties;
data.artKit = GetGoArtKit();
data.phaseId = GetDBPhase() > 0 ? GetDBPhase() : data.phaseId;
@@ -957,7 +957,7 @@ void GameObject::SaveToDB(uint32 mapid, uint64 spawnMask)
stmt->setUInt64(index++, m_spawnId);
stmt->setUInt32(index++, GetEntry());
stmt->setUInt16(index++, uint16(mapid));
- stmt->setUInt64(index++, spawnMask);
+ stmt->setString(index++, StringJoin(data.spawnDifficulties, ","));
stmt->setUInt32(index++, data.phaseId);
stmt->setUInt32(index++, data.phaseGroup);
stmt->setFloat(index++, GetPositionX());
diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h
index 12ff942a6ba..24b70b9ce73 100644
--- a/src/server/game/Entities/GameObject/GameObject.h
+++ b/src/server/game/Entities/GameObject/GameObject.h
@@ -119,7 +119,7 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject>
std::string const& GetNameForLocaleIdx(LocaleConstant locale_idx) const override;
void SaveToDB();
- void SaveToDB(uint32 mapid, uint64 spawnMask);
+ void SaveToDB(uint32 mapid, std::vector<Difficulty> const& spawnDifficulties);
bool LoadFromDB(ObjectGuid::LowType spawnId, Map* map) { return LoadGameObjectFromDB(spawnId, map, false); }
private:
bool LoadGameObjectFromDB(ObjectGuid::LowType spawnId, Map* map, bool addToMap);
diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h
index 7491a3d8ac9..c6411c24f0a 100644
--- a/src/server/game/Entities/GameObject/GameObjectData.h
+++ b/src/server/game/Entities/GameObject/GameObjectData.h
@@ -855,7 +855,7 @@ struct GameObjectAddon
struct GameObjectData
{
explicit GameObjectData() : id(0), mapid(0), posX(0.0f), posY(0.0f), posZ(0.0f), orientation(0.0f), spawntimesecs(0),
- animprogress(0), go_state(GO_STATE_ACTIVE), spawnMask(0), artKit(0),
+ animprogress(0), go_state(GO_STATE_ACTIVE), spawnDifficulties(), artKit(0),
phaseUseFlags(0), phaseId(0), phaseGroup(0), terrainSwapMap(-1), ScriptId(0), dbData(true) { }
uint32 id; // entry in gamobject_template
uint16 mapid;
@@ -867,7 +867,7 @@ struct GameObjectData
int32 spawntimesecs;
uint32 animprogress;
GOState go_state;
- uint64 spawnMask;
+ std::vector<Difficulty> spawnDifficulties;
uint8 artKit;
uint8 phaseUseFlags;
uint32 phaseId;
diff --git a/src/server/game/Entities/Pet/Pet.h b/src/server/game/Entities/Pet/Pet.h
index e6652501b86..e411d2251af 100644
--- a/src/server/game/Entities/Pet/Pet.h
+++ b/src/server/game/Entities/Pet/Pet.h
@@ -160,7 +160,7 @@ class TC_GAME_API Pet : public Guardian
uint16 m_petSpecialization;
private:
- void SaveToDB(uint32, uint64) override // override of Creature::SaveToDB - must not be called
+ void SaveToDB(uint32, std::vector<Difficulty> const&) override // override of Creature::SaveToDB - must not be called
{
ABORT();
}
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 2aae0333ebf..f956d970992 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -397,8 +397,8 @@ void Player::CleanupsBeforeDelete(bool finalCleanup)
Unit::CleanupsBeforeDelete(finalCleanup);
// clean up player-instance binds, may unload some instance saves
- for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
- for (BoundInstancesMap::iterator itr = m_boundInstances[i].begin(); itr != m_boundInstances[i].end(); ++itr)
+ for (auto difficultyItr = m_boundInstances.begin(); difficultyItr != m_boundInstances.end(); ++difficultyItr)
+ for (auto itr = difficultyItr->second.begin(); itr != difficultyItr->second.end(); ++itr)
itr->second.save->RemovePlayer(this);
}
@@ -19428,8 +19428,7 @@ void Player::_LoadGroup(PreparedQueryResult result)
void Player::_LoadBoundInstances(PreparedQueryResult result)
{
- for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
- m_boundInstances[i].clear();
+ m_boundInstances.clear();
Group* group = GetGroup();
@@ -19514,8 +19513,12 @@ InstancePlayerBind* Player::GetBoundInstance(uint32 mapid, Difficulty difficulty
if (!mapDiff)
return nullptr;
- BoundInstancesMap::iterator itr = m_boundInstances[difficulty].find(mapid);
- if (itr != m_boundInstances[difficulty].end())
+ auto difficultyItr = m_boundInstances.find(difficulty);
+ if (difficultyItr == m_boundInstances.end())
+ return nullptr;
+
+ auto itr = difficultyItr->second.find(mapid);
+ if (itr != difficultyItr->second.end())
if (itr->second.extendState || withExpired)
return &itr->second;
return nullptr;
@@ -19528,8 +19531,12 @@ InstancePlayerBind const* Player::GetBoundInstance(uint32 mapid, Difficulty diff
if (!mapDiff)
return nullptr;
- auto itr = m_boundInstances[difficulty].find(mapid);
- if (itr != m_boundInstances[difficulty].end())
+ auto difficultyItr = m_boundInstances.find(difficulty);
+ if (difficultyItr == m_boundInstances.end())
+ return nullptr;
+
+ auto itr = difficultyItr->second.find(mapid);
+ if (itr != difficultyItr->second.end())
return &itr->second;
return nullptr;
@@ -19550,13 +19557,18 @@ InstanceSave* Player::GetInstanceSave(uint32 mapid)
void Player::UnbindInstance(uint32 mapid, Difficulty difficulty, bool unload)
{
- BoundInstancesMap::iterator itr = m_boundInstances[difficulty].find(mapid);
- UnbindInstance(itr, difficulty, unload);
+ auto difficultyItr = m_boundInstances.find(difficulty);
+ if (difficultyItr != m_boundInstances.end())
+ {
+ auto itr = difficultyItr->second.find(mapid);
+ if (itr != difficultyItr->second.end())
+ UnbindInstance(itr, difficultyItr, unload);
+ }
}
-void Player::UnbindInstance(BoundInstancesMap::iterator &itr, Difficulty difficulty, bool unload)
+void Player::UnbindInstance(BoundInstancesMap::mapped_type::iterator& itr, BoundInstancesMap::iterator& difficultyItr, bool unload)
{
- if (itr != m_boundInstances[difficulty].end())
+ if (itr != difficultyItr->second.end())
{
if (!unload)
{
@@ -19572,7 +19584,7 @@ void Player::UnbindInstance(BoundInstancesMap::iterator &itr, Difficulty difficu
GetSession()->SendCalendarRaidLockout(itr->second.save, false);
itr->second.save->RemovePlayer(this); // save can become invalid
- m_boundInstances[difficulty].erase(itr++);
+ difficultyItr->second.erase(itr++);
}
}
@@ -19669,9 +19681,9 @@ void Player::SendRaidInfo()
time_t now = time(nullptr);
- for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
+ for (auto difficultyItr = m_boundInstances.begin(); difficultyItr != m_boundInstances.end(); ++difficultyItr)
{
- for (BoundInstancesMap::iterator itr = m_boundInstances[i].begin(); itr != m_boundInstances[i].end(); ++itr)
+ for (auto itr = difficultyItr->second.begin(); itr != difficultyItr->second.end(); ++itr)
{
InstancePlayerBind const& bind = itr->second;
if (bind.perm)
@@ -21193,7 +21205,11 @@ void Player::ResetInstances(uint8 method, bool isRaid, bool isLegacy)
diff = GetLegacyRaidDifficultyID();
}
- for (BoundInstancesMap::iterator itr = m_boundInstances[diff].begin(); itr != m_boundInstances[diff].end();)
+ auto difficultyItr = m_boundInstances.find(diff);
+ if (difficultyItr == m_boundInstances.end())
+ return;
+
+ for (auto itr = difficultyItr->second.begin(); itr != difficultyItr->second.end();)
{
InstanceSave* p = itr->second.save;
const MapEntry* entry = sMapStore.LookupEntry(itr->first);
@@ -21227,7 +21243,7 @@ void Player::ResetInstances(uint8 method, bool isRaid, bool isLegacy)
SendResetInstanceSuccess(p->GetMapId());
p->DeleteFromDB();
- m_boundInstances[diff].erase(itr++);
+ difficultyItr->second.erase(itr++);
// the following should remove the instance save from the manager and delete it as well
p->RemovePlayer(this);
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 7cbea6951f0..fd2b6e9a049 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2234,20 +2234,20 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
/*** INSTANCE SYSTEM ***/
/*********************************************************/
- typedef std::unordered_map< uint32 /*mapId*/, InstancePlayerBind > BoundInstancesMap;
+ typedef std::unordered_map<Difficulty, std::unordered_map<uint32 /*mapId*/, InstancePlayerBind>> BoundInstancesMap;
void UpdateHomebindTime(uint32 time);
uint32 m_HomebindTimer;
bool m_InstanceValid;
// permanent binds and solo binds by difficulty
- BoundInstancesMap m_boundInstances[MAX_DIFFICULTY];
+ BoundInstancesMap m_boundInstances;
InstancePlayerBind* GetBoundInstance(uint32 mapid, Difficulty difficulty, bool withExpired = false);
InstancePlayerBind const* GetBoundInstance(uint32 mapid, Difficulty difficulty) const;
- BoundInstancesMap& GetBoundInstances(Difficulty difficulty) { return m_boundInstances[difficulty]; }
+ BoundInstancesMap::iterator GetBoundInstances(Difficulty difficulty) { return m_boundInstances.find(difficulty); }
InstanceSave* GetInstanceSave(uint32 mapid);
void UnbindInstance(uint32 mapid, Difficulty difficulty, bool unload = false);
- void UnbindInstance(BoundInstancesMap::iterator &itr, Difficulty difficulty, bool unload = false);
+ void UnbindInstance(BoundInstancesMap::mapped_type::iterator& itr, BoundInstancesMap::iterator& difficultyItr, bool unload = false);
InstancePlayerBind* BindToInstance(InstanceSave* save, bool permanent, BindExtensionState extendState = EXTEND_STATE_NORMAL, bool load = false);
void BindToInstance();
void SetPendingBind(uint32 instanceId, uint32 bindTimer);
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
index bd86313e004..50b1897e2c5 100644
--- a/src/server/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
@@ -529,7 +529,7 @@ void Transport::LoadStaticPassengers()
{
if (uint32 mapId = GetGOInfo()->moTransport.SpawnMap)
{
- CellObjectGuidsMap const& cells = sObjectMgr->GetMapObjectGuids(mapId, GetMap()->GetSpawnMode());
+ CellObjectGuidsMap const& cells = sObjectMgr->GetMapObjectGuids(mapId, GetMap()->GetDifficultyID());
CellGuidSet::const_iterator guidEnd;
for (CellObjectGuidsMap::const_iterator cellItr = cells.begin(); cellItr != cells.end(); ++cellItr)
{