fix(Core/Instances): Ensure team is acquired before spawning creatures (#21221)

This commit is contained in:
Andrew
2025-01-21 20:13:22 -03:00
committed by GitHub
parent 0733c30471
commit d851f97f40
3 changed files with 14 additions and 20 deletions

View File

@@ -57,23 +57,7 @@ void InstanceScript::SaveToDB()
void InstanceScript::OnPlayerEnter(Player* player)
{
if (!IsTwoFactionInstance())
return;
if (GetTeamIdInInstance() == TEAM_NEUTRAL)
{
if (Group* group = player->GetGroup())
{
if (Player* leader = ObjectAccessor::FindConnectedPlayer(group->GetLeaderGUID()))
_teamIdInInstance = leader->GetTeamId();
else
_teamIdInInstance = player->GetTeamId();
}
else
_teamIdInInstance = player->GetTeamId();
}
if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP))
if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsTwoFactionInstance())
player->SetFaction((_teamIdInInstance == TEAM_HORDE) ? 1610 /*FACTION_HORDE*/ : 1 /*FACTION_ALLIANCE*/);
}

View File

@@ -285,6 +285,10 @@ public:
[[nodiscard]] bool AllBossesDone() const;
[[nodiscard]] bool AllBossesDone(std::initializer_list<uint32> bossIds) const;
TeamId GetTeamIdInInstance() const { return _teamIdInInstance; }
void SetTeamIdInInstance(TeamId teamId) { _teamIdInInstance = teamId; }
bool IsTwoFactionInstance() const;
TaskScheduler scheduler;
protected:
void SetHeaders(std::string const& dataHeaders);
@@ -325,9 +329,6 @@ protected:
void WritePersistentData(std::ostringstream& data);
virtual void WriteSaveDataMore(std::ostringstream& /*data*/) { }
TeamId GetTeamIdInInstance() const { return _teamIdInInstance; }
bool IsTwoFactionInstance() const;
private:
static void LoadObjectData(ObjectData const* creatureData, ObjectInfoMap& objectInfo);

View File

@@ -3020,6 +3020,15 @@ bool InstanceMap::AddPlayerToMap(Player* player)
m_resetAfterUnload = false;
m_unloadWhenEmpty = false;
if (instance_data && instance_data->IsTwoFactionInstance()
&& instance_data->GetTeamIdInInstance() == TEAM_NEUTRAL)
{
instance_data->SetTeamIdInInstance(player->GetTeamId());
if (Group* group = player->GetGroup())
if (Player* leader = ObjectAccessor::FindConnectedPlayer(group->GetLeaderGUID()))
instance_data->SetTeamIdInInstance(leader->GetTeamId());
}
// this will acquire the same mutex so it cannot be in the previous block
Map::AddPlayerToMap(player);