void CGameServer::DestroyAllEntities(const tvector<tstring>& asSpare, bool bRemakeGame) { if (!GameNetwork()->IsHost() && !IsLoading()) return; if (m_pWorkListener) m_pWorkListener->SetAction("Locating dead nodes", GameServer()->GetMaxEntities()); for (size_t i = 0; i < GameServer()->GetMaxEntities(); i++) { CBaseEntity* pEntity = CBaseEntity::GetEntity(i); if (!pEntity) continue; bool bSpare = false; for (size_t j = 0; j < asSpare.size(); j++) { if (asSpare[j] == pEntity->GetClassName()) { bSpare = true; break; } } if (bSpare) continue; pEntity->Delete(); if (m_pWorkListener) m_pWorkListener->WorkProgress(i); } if (m_pWorkListener) m_pWorkListener->SetAction("Clearing buffers", GameServer()->m_ahDeletedEntities.size()); for (size_t i = 0; i < GameServer()->m_ahDeletedEntities.size(); i++) { delete GameServer()->m_ahDeletedEntities[i]; if (m_pWorkListener) m_pWorkListener->WorkProgress(i); } GameServer()->m_ahDeletedEntities.clear(); if (CBaseEntity::GetNumEntities() == 0) CBaseEntity::s_iNextEntityListIndex = 0; if (bRemakeGame && GameNetwork()->IsHost()) m_hGame = CreateGame(); }
void CCPU::OnDeleted() { if (!GameNetwork()->IsHost()) return; if (!GetDigitanksPlayer()) return; tvector<CBaseEntity*> apDeleteThese; for (size_t i = 0; i < GetDigitanksPlayer()->GetNumUnits(); i++) { CBaseEntity* pMember = GetDigitanksPlayer()->GetUnit(i); if (pMember == this) continue; apDeleteThese.push_back(pMember); } if (GameServer()->IsLoading()) return; for (size_t i = 0; i < apDeleteThese.size(); i++) { CBaseEntity* pMember = apDeleteThese[i]; if (!pMember) continue; CStructure* pStructure = dynamic_cast<CStructure*>(pMember); // Delete? I meant... repurpose. if (pStructure && !pStructure->IsConstructing()) { GetDigitanksPlayer()->RemoveUnit(pStructure); } else { bool bColorSwap = (pStructure || dynamic_cast<CDigitank*>(pMember)); Color clrTeam = GetDigitanksPlayer()->GetColor(); CModelDissolver::AddModel(pMember, bColorSwap?&clrTeam:NULL); pMember->Delete(); } } }