Skip to content

Commit 50b510a

Browse files
committed
Do not send packets to players that left the server
They are never going to receive them anyway.
1 parent bf0b197 commit 50b510a

File tree

3 files changed

+36
-32
lines changed

3 files changed

+36
-32
lines changed

Server/mods/deathmatch/logic/CPerPlayerEntity.cpp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -240,24 +240,34 @@ void CPerPlayerEntity::DestroyEntity(CPlayer* pPlayer)
240240
void CPerPlayerEntity::BroadcastOnlyVisible(const CPacket& Packet)
241241
{
242242
// Are we synced? (if not we're not visible to anybody)
243-
if (m_bIsSynced)
243+
if (!m_bIsSynced)
244+
return;
245+
246+
CPlayerManager* playerManager = g_pGame->GetPlayerManager();
247+
CSendList sendList;
248+
249+
for (std::set<CPlayer*>::iterator iter = m_Players.begin(); iter != m_Players.end(); /*manual increment*/)
244250
{
245-
CPlayerManager* pPlayerManager = g_pGame->GetPlayerManager();
246-
for (std::set<CPlayer*>::iterator iter = m_Players.begin(); iter != m_Players.end();)
251+
CPlayer* player = *iter;
252+
253+
if (!playerManager->Exists(player))
247254
{
248-
if (!pPlayerManager->Exists(*iter))
249-
{
250-
// Why does this happen?
251-
// CLogger::ErrorPrintf( "CPerPlayerEntity removed invalid player from list: %08x", *iter );
252-
m_Players.erase(iter++);
253-
}
254-
else
255-
++iter;
255+
// Why does this happen?
256+
// CLogger::ErrorPrintf("CPerPlayerEntity removed invalid player from list: %08x", player);
257+
iter = m_Players.erase(iter);
258+
}
259+
else
260+
{
261+
++iter;
262+
263+
if (player->IsLeavingServer())
264+
continue;
256265
}
257266

258-
// Send it to all players we're visible to
259-
CPlayerManager::Broadcast(Packet, m_Players);
267+
sendList.push_back(player);
260268
}
269+
270+
CPlayerManager::Broadcast(Packet, sendList);
261271
}
262272

263273
void CPerPlayerEntity::RemoveIdenticalEntries(std::set<CPlayer*>& List1, std::set<CPlayer*>& List2)

Server/mods/deathmatch/logic/CPlayer.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,9 @@ uint CPlayer::Send(const CPacket& Packet)
270270
if (!CNetBufferWatchDog::CanSendPacket(Packet.GetPacketID()))
271271
return 0;
272272

273+
if (IsLeavingServer())
274+
return 0;
275+
273276
// Use the flags to determine how to send it
274277
NetServerPacketReliability Reliability;
275278
unsigned long ulFlags = Packet.GetFlags();

Server/mods/deathmatch/logic/CPlayerManager.cpp

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -162,18 +162,15 @@ size_t CPlayerManager::BroadcastOnlyJoined(const CPacket& Packet, CPlayer* pSkip
162162
CSendList sendList;
163163

164164
// Send the packet to each ingame player on the server except the skipped one
165-
list<CPlayer*>::const_iterator iter = m_Players.begin();
166-
for (; iter != m_Players.end(); iter++)
165+
for (CPlayer* player : m_Players)
167166
{
168-
CPlayer* pPlayer = *iter;
169-
if (pPlayer != pSkip && pPlayer->IsJoined())
167+
if (player != pSkip && player->IsJoined() && !player->IsLeavingServer())
170168
{
171-
sendList.push_back(pPlayer);
169+
sendList.push_back(player);
172170
}
173171
}
174172

175173
CPlayerManager::Broadcast(Packet, sendList);
176-
177174
return sendList.size();
178175
}
179176

@@ -183,19 +180,15 @@ size_t CPlayerManager::BroadcastDimensionOnlyJoined(const CPacket& Packet, ushor
183180
CSendList sendList;
184181

185182
// Send the packet to each ingame player on the server except the skipped one
186-
list<CPlayer*>::const_iterator iter = m_Players.begin();
187-
for (; iter != m_Players.end(); iter++)
183+
for (CPlayer* player : m_Players)
188184
{
189-
CPlayer* pPlayer = *iter;
190-
if (pPlayer != pSkip && pPlayer->IsJoined())
185+
if (player != pSkip && player->IsJoined() && !player->IsLeavingServer() && player->GetDimension() == usDimension)
191186
{
192-
if (pPlayer->GetDimension() == usDimension)
193-
sendList.push_back(pPlayer);
187+
sendList.push_back(player);
194188
}
195189
}
196190

197191
CPlayerManager::Broadcast(Packet, sendList);
198-
199192
return sendList.size();
200193
}
201194

@@ -205,18 +198,15 @@ size_t CPlayerManager::BroadcastOnlySubscribed(const CPacket& Packet, CElement*
205198
CSendList sendList;
206199

207200
// Send the packet to each ingame player on the server except the skipped one
208-
list<CPlayer*>::const_iterator iter = m_Players.begin();
209-
for (; iter != m_Players.end(); iter++)
201+
for (CPlayer* player : m_Players)
210202
{
211-
CPlayer* pPlayer = *iter;
212-
if (pPlayer != pSkip && pPlayer->IsJoined() && pPlayer->IsSubscribed(pElement, szName))
203+
if (player != pSkip && player->IsJoined() && !player->IsLeavingServer() && player->IsSubscribed(pElement, szName))
213204
{
214-
sendList.push_back(pPlayer);
205+
sendList.push_back(player);
215206
}
216207
}
217208

218209
CPlayerManager::Broadcast(Packet, sendList);
219-
220210
return sendList.size();
221211
}
222212

@@ -282,6 +272,7 @@ static void DoBroadcast(const CPacket& Packet, const std::multimap<ushort, CPlay
282272
{
283273
CPlayer* pPlayer = s_it->second;
284274
dassert(usBitStreamVersion == pPlayer->GetBitStreamVersion());
275+
dassert(!pPlayer->IsLeavingServer());
285276
g_pGame->SendPacket(Packet.GetPacketID(), pPlayer->GetSocket(), pBitStream, false, packetPriority, Reliability, Packet.GetPacketOrdering());
286277
}
287278

0 commit comments

Comments
 (0)