bool ObjectController::_destroyOutOfRangeObjects(ObjectSet *inRangeObjects) { //TODO: when a container gets out of range //we need to destroy the children, too!!!!!!! // iterate our knowns PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); ObjectSet* knownObjects = player->getKnownObjects(); ObjectSet::iterator objIt = knownObjects->begin(); PlayerObjectSet* knownPlayers = player->getKnownPlayers(); PlayerObjectSet::iterator playerIt = knownPlayers->begin(); const uint32 objectDestroyLimit = 5000; // update players while(playerIt != knownPlayers->end()) { PlayerObject* playerObject = (*playerIt); // if its not in the current inrange queries result, destroy it if(inRangeObjects->find(playerObject) == inRangeObjects->end()) { // send a destroy to us gMessageLib->sendDestroyObject(playerObject->getId(),player); //If player is mounted destroy his mount too if(playerObject->checkIfMounted() && playerObject->getMount()) { gMessageLib->sendDestroyObject(playerObject->getMount()->getId(),player); player->removeKnownObject(playerObject->getMount()); playerObject->getMount()->removeKnownObject(player); } //send a destroy to him gMessageLib->sendDestroyObject(player->getId(),playerObject); //If we're mounted destroy our mount too if(player->checkIfMounted() && playerObject->getMount()) { gMessageLib->sendDestroyObject(player->getMount()->getId(),playerObject); playerObject->removeKnownObject(player->getMount()); player->getMount()->removeKnownObject(playerObject); } // we don't know each other anymore knownPlayers->erase(playerIt++); playerObject->removeKnownObject(player); continue; } ++playerIt; } // We may want to limit the amount of messages sent in one session. uint32 messageCount = 0; // update objects while(objIt != knownObjects->end()) { Object* object = (*objIt); // if its not in the current inrange queries result, destroy it if(inRangeObjects->find(object) == inRangeObjects->end()) { if(object->getType() == ObjType_Structure) { if(FactoryObject* factory = dynamic_cast<FactoryObject*>(object)) { //delete the hoppers contents TangibleObject* hopper = dynamic_cast<TangibleObject*>(gWorldManager->getObjectById(factory->getIngredientHopper())); if(hopper) { ObjectIDList* ol = hopper->getObjects(); ObjectIDList::iterator it = ol->begin(); while(it != ol->end()) { TangibleObject* tO = dynamic_cast<TangibleObject*>(gWorldManager->getObjectById((*it))); if(!tO) { assert(false && "ObjectController::_destroyOutOfRangeObjects WorldManager unable to find TangibleObject instance"); } tO->removeKnownObject(player); player->removeKnownObject(tO); gMessageLib->sendDestroyObject(tO->getId(),player); it++; } hopper->removeKnownObject(player); player->removeKnownObject(hopper); gMessageLib->sendDestroyObject(hopper->getId(),player); } hopper = dynamic_cast<TangibleObject*>(gWorldManager->getObjectById(factory->getOutputHopper())); if(hopper) { ObjectIDList* ol = hopper->getObjects(); ObjectIDList::iterator it = ol->begin(); while(it != ol->end()) { TangibleObject* tO = dynamic_cast<TangibleObject*>(gWorldManager->getObjectById((*it))); if(!tO) { assert(false && "ObjectController::_destroyOutOfRangeObjects WorldManager unable to find TangibleObject instance"); } //PlayerObject* player = dynamic_cast<PlayerObject*>(gWorldManager->getObjectById(targetObject->getId())); tO->removeKnownObject(player); player->removeKnownObject(tO); gMessageLib->sendDestroyObject(tO->getId(),player); it++; } hopper->removeKnownObject(player); player->removeKnownObject(hopper); gMessageLib->sendDestroyObject(hopper->getId(),player); } } } // send a destroy to us gMessageLib->sendDestroyObject(object->getId(),player); // we don't know each other anymore knownObjects->erase(objIt++); object->removeKnownObject(player); if (++messageCount >= objectDestroyLimit) { // gLogger->logMsg("Pausing sendDestroyObject()-calls."); break; } continue; } ++objIt; } // For test bool allDestroyed = false; if (objIt == knownObjects->end()) { // gLogger->logMsg("Finished sendDestroyObject()-calls."); allDestroyed = true; } return allDestroyed; }
bool ObjectController::_destroyOutOfRangeObjects(ObjectSet *inRangeObjects) { //TODO: when a container gets out of range //we need to destroy the children, too!!!!!!! // iterate our knowns PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); ObjectSet* knownObjects = player->getKnownObjects(); ObjectSet::iterator objIt = knownObjects->begin(); PlayerObjectSet* knownPlayers = player->getKnownPlayers(); PlayerObjectSet::iterator playerIt = knownPlayers->begin(); const uint32 objectDestroyLimit = 5000; // update players while(playerIt != knownPlayers->end()) { PlayerObject* playerObject = (*playerIt); // if its not in the current inrange queries result, destroy it if(inRangeObjects->find(playerObject) == inRangeObjects->end()) { // send a destroy to us gMessageLib->sendDestroyObject(playerObject->getId(),player); //If player is mounted destroy his mount too if(playerObject->checkIfMounted() && playerObject->getMount()) { gMessageLib->sendDestroyObject(playerObject->getMount()->getId(),player); player->removeKnownObject(playerObject->getMount()); playerObject->getMount()->removeKnownObject(player); } //send a destroy to him gMessageLib->sendDestroyObject(player->getId(),playerObject); //If we're mounted destroy our mount too if(player->checkIfMounted() && playerObject->getMount()) { gMessageLib->sendDestroyObject(player->getMount()->getId(),playerObject); playerObject->removeKnownObject(player->getMount()); player->getMount()->removeKnownObject(playerObject); } // we don't know each other anymore knownPlayers->erase(playerIt++); playerObject->removeKnownObject(player); continue; } ++playerIt; } // We may want to limit the amount of messages sent in one session. uint32 messageCount = 0; // update objects //for(ObjectSet::const_iterator objIt = knownObjects->begin(); objIt != knownObjects->end(); objIt++) //we access the list above so it needs to be reset to the beginning objIt = knownObjects->begin(); while(objIt != knownObjects->end()) { Object* object = (*objIt); // if its not in the current inrange queries result, destroy it if(inRangeObjects->find(object) == inRangeObjects->end()) { if(object->getType() == ObjType_Structure)//ObjType_Tangible { } // send a destroy to us gMessageLib->sendDestroyObject(object->getId(),player); // we don't know each other anymore knownObjects->erase(objIt++); object->removeKnownObject(player); if (++messageCount >= objectDestroyLimit) { break; } continue; } ++objIt; } // For test bool allDestroyed = false; if (objIt == knownObjects->end()) { allDestroyed = true; } return allDestroyed; }