void CProjectileHandler::UpdateProjectileContainer(ProjectileContainer& pc, bool synced) { ProjectileContainer::iterator pci = pc.begin(); while (pci != pc.end()) { CProjectile* p = *pci; if (p->deleteMe) { if (p->synced) { assert(synced); if(p->weapon || p->piece) { //! iterator is always valid const ProjectileMap::iterator it = syncedProjectileIDs.find(p->id); const ProjectileMapPair& pp = it->second; eventHandler.ProjectileDestroyed(pp.first, pp.second); syncedProjectileIDs.erase(it); if (p->id != 0) { freeIDs.push_back(p->id); } } //! push_back this projectile for deletion pci = pc.erase_delete_synced(pci); } else { assert(!synced); pci = pc.erase_delete(pci); } } else { p->Update(); GML_GET_TICKS(p->lastProjUpdate); ++pci; } } }
void CProjectileHandler::UpdateProjectileContainer(ProjectileContainer& pc, bool synced) { ProjectileContainer::iterator pci = pc.begin(); #define VECTOR_SANITY_CHECK(v) \ assert(!math::isnan(v.x) && !math::isinf(v.x)); \ assert(!math::isnan(v.y) && !math::isinf(v.y)); \ assert(!math::isnan(v.z) && !math::isinf(v.z)); #define MAPPOS_SANITY_CHECK(v) \ assert(v.x >= -(float3::maxxpos * 16.0f)); \ assert(v.x <= (float3::maxxpos * 16.0f)); \ assert(v.z >= -(float3::maxzpos * 16.0f)); \ assert(v.z <= (float3::maxzpos * 16.0f)); \ assert(v.y >= -MAX_PROJECTILE_HEIGHT); \ assert(v.y <= MAX_PROJECTILE_HEIGHT); #define PROJECTILE_SANITY_CHECK(p) \ VECTOR_SANITY_CHECK(p->pos); \ MAPPOS_SANITY_CHECK(p->pos); while (pci != pc.end()) { CProjectile* p = *pci; if (p->deleteMe) { ProjectileMap::iterator pIt; if (p->synced) { //! iterator is always valid pIt = syncedProjectileIDs.find(p->id); eventHandler.ProjectileDestroyed((pIt->second).first, (pIt->second).second); syncedProjectileIDs.erase(pIt); freeSyncedIDs.push_back(p->id); //! push_back this projectile for deletion pci = pc.erase_delete_synced(pci); } else { #if UNSYNCED_PROJ_NOEVENT eventHandler.UnsyncedProjectileDestroyed(p); #else pIt = unsyncedProjectileIDs.find(p->id); eventHandler.ProjectileDestroyed((pIt->second).first, (pIt->second).second); unsyncedProjectileIDs.erase(pIt); freeUnsyncedIDs.push_back(p->id); #endif #if DETACH_SYNCED pci = pc.erase_detach(pci); #else pci = pc.erase_delete(pci); #endif } } else { PROJECTILE_SANITY_CHECK(p); p->Update(); qf->MovedProjectile(p); PROJECTILE_SANITY_CHECK(p); GML_GET_TICKS(p->lastProjUpdate); ++pci; } } }