[Server] Try to fix server crash from iterations through invalid players

pull/249/merge
David Cernat 8 years ago
parent 5a786e6c56
commit 3c30801eac

@ -183,7 +183,10 @@ void Cell::sendToLoaded(mwmp::ActorPacket *actorPacket, mwmp::BaseActorList *bas
std::list <Player*> plList; std::list <Player*> plList;
for (auto pl : players) for (auto pl : players)
plList.push_back(pl); {
if (pl != nullptr && !pl->npc.mName.empty())
plList.push_back(pl);
}
plList.sort(); plList.sort();
plList.unique(); plList.unique();
@ -207,7 +210,10 @@ void Cell::sendToLoaded(mwmp::WorldPacket *worldPacket, mwmp::BaseEvent *baseEve
std::list <Player*> plList; std::list <Player*> plList;
for (auto pl : players) for (auto pl : players)
plList.push_back(pl); {
if (pl != nullptr && !pl->npc.mName.empty())
plList.push_back(pl);
}
plList.sort(); plList.sort();
plList.unique(); plList.unique();

@ -142,8 +142,13 @@ void Player::forEachLoaded(std::function<void(Player *pl, Player *other)> func)
std::list <Player*> plList; std::list <Player*> plList;
for (auto cell : cells) for (auto cell : cells)
{
for (auto pl : *cell) for (auto pl : *cell)
plList.push_back(pl); {
if (pl != nullptr && !pl->npc.mName.empty())
plList.push_back(pl);
}
}
plList.sort(); plList.sort();
plList.unique(); plList.unique();

@ -32,43 +32,35 @@ namespace mwmp
player.forEachLoaded([this](Player *pl, Player *other) { player.forEachLoaded([this](Player *pl, Player *other) {
if (other == nullptr) LOG_APPEND(Log::LOG_INFO, "- Started information exchange with %s", other->npc.mName.c_str());
{
LOG_APPEND(Log::LOG_INFO, "- Tried to exchange information with nullptr!"); playerController->GetPacket(ID_PLAYER_STATS_DYNAMIC)->setPlayer(other);
LOG_APPEND(Log::LOG_INFO, "- Please report this to a developer"); playerController->GetPacket(ID_PLAYER_ATTRIBUTE)->setPlayer(other);
} playerController->GetPacket(ID_PLAYER_POSITION)->setPlayer(other);
else playerController->GetPacket(ID_PLAYER_SKILL)->setPlayer(other);
{ playerController->GetPacket(ID_PLAYER_EQUIPMENT)->setPlayer(other);
LOG_APPEND(Log::LOG_INFO, "- Started information exchange with %s", other->npc.mName.c_str()); playerController->GetPacket(ID_PLAYER_ANIM_FLAGS)->setPlayer(other);
playerController->GetPacket(ID_PLAYER_STATS_DYNAMIC)->setPlayer(other); playerController->GetPacket(ID_PLAYER_STATS_DYNAMIC)->Send(pl->guid);
playerController->GetPacket(ID_PLAYER_ATTRIBUTE)->setPlayer(other); playerController->GetPacket(ID_PLAYER_ATTRIBUTE)->Send(pl->guid);
playerController->GetPacket(ID_PLAYER_POSITION)->setPlayer(other); playerController->GetPacket(ID_PLAYER_POSITION)->Send(pl->guid);
playerController->GetPacket(ID_PLAYER_SKILL)->setPlayer(other); playerController->GetPacket(ID_PLAYER_SKILL)->Send(pl->guid);
playerController->GetPacket(ID_PLAYER_EQUIPMENT)->setPlayer(other); playerController->GetPacket(ID_PLAYER_EQUIPMENT)->Send(pl->guid);
playerController->GetPacket(ID_PLAYER_ANIM_FLAGS)->setPlayer(other); playerController->GetPacket(ID_PLAYER_ANIM_FLAGS)->Send(pl->guid);
playerController->GetPacket(ID_PLAYER_STATS_DYNAMIC)->Send(pl->guid); playerController->GetPacket(ID_PLAYER_STATS_DYNAMIC)->setPlayer(pl);
playerController->GetPacket(ID_PLAYER_ATTRIBUTE)->Send(pl->guid); playerController->GetPacket(ID_PLAYER_ATTRIBUTE)->setPlayer(pl);
playerController->GetPacket(ID_PLAYER_POSITION)->Send(pl->guid); playerController->GetPacket(ID_PLAYER_SKILL)->setPlayer(pl);
playerController->GetPacket(ID_PLAYER_SKILL)->Send(pl->guid); playerController->GetPacket(ID_PLAYER_EQUIPMENT)->setPlayer(pl);
playerController->GetPacket(ID_PLAYER_EQUIPMENT)->Send(pl->guid); playerController->GetPacket(ID_PLAYER_ANIM_FLAGS)->setPlayer(pl);
playerController->GetPacket(ID_PLAYER_ANIM_FLAGS)->Send(pl->guid);
playerController->GetPacket(ID_PLAYER_STATS_DYNAMIC)->Send(other->guid);
playerController->GetPacket(ID_PLAYER_STATS_DYNAMIC)->setPlayer(pl); playerController->GetPacket(ID_PLAYER_ATTRIBUTE)->Send(other->guid);
playerController->GetPacket(ID_PLAYER_ATTRIBUTE)->setPlayer(pl); playerController->GetPacket(ID_PLAYER_SKILL)->Send(other->guid);
playerController->GetPacket(ID_PLAYER_SKILL)->setPlayer(pl); playerController->GetPacket(ID_PLAYER_EQUIPMENT)->Send(other->guid);
playerController->GetPacket(ID_PLAYER_EQUIPMENT)->setPlayer(pl); playerController->GetPacket(ID_PLAYER_ANIM_FLAGS)->Send(other->guid);
playerController->GetPacket(ID_PLAYER_ANIM_FLAGS)->setPlayer(pl);
LOG_APPEND(Log::LOG_INFO, "- Finished information exchange with %s", other->npc.mName.c_str());
playerController->GetPacket(ID_PLAYER_STATS_DYNAMIC)->Send(other->guid);
playerController->GetPacket(ID_PLAYER_ATTRIBUTE)->Send(other->guid);
playerController->GetPacket(ID_PLAYER_SKILL)->Send(other->guid);
playerController->GetPacket(ID_PLAYER_EQUIPMENT)->Send(other->guid);
playerController->GetPacket(ID_PLAYER_ANIM_FLAGS)->Send(other->guid);
LOG_APPEND(Log::LOG_INFO, "- Finished information exchange with %s", other->npc.mName.c_str());
}
}); });
playerController->GetPacket(ID_PLAYER_POSITION)->setPlayer(&player); playerController->GetPacket(ID_PLAYER_POSITION)->setPlayer(&player);

Loading…
Cancel
Save