bool SpatialIndexManager::InitializeObject(PlayerObject *player) { //Pesudo // 1. Calculate CellID // 2. Set CellID // 3. Insert object into the cell in the hash table //now create around for us //we have to query the grid as noncontainers must be created to ObjectListType player_list; getGrid()->GetViewingRangeCellContents(player->getGridBucket(), &player_list, (Bucket_Creatures|Bucket_Objects|Bucket_Players)); std::for_each(player_list.begin(), player_list.end(), [this, player] (Object* object) { if (object->getId() == player->getId()) { return; } sendCreateObject(object, player, false); }); //now building content in case we are in a building initObjectsInRange(player); return true; }
bool WorldManager::addObject(Object* object,bool manual) { uint64 key = object->getId(); //make sure objects arnt added several times!!!! if(getObjectById(key)) { gLogger->logMsgF("WorldManager::addObject Object already existant added several times or ID messup ???",MSG_HIGH); return false; } mObjectMap.insert(key,object); // if we want to set the parent manually or the object is from the snapshots and not a building, return if(manual) { return true; } #if defined(_MSC_VER) if(object->getId() < 0x0000000100000000 && object->getType() != ObjType_Building) #else if(object->getId() < 0x0000000100000000LLU && object->getType() != ObjType_Building) #endif { // check if a crafting station - in that case add Item* item = dynamic_cast<Item*> (object); if(item) { if(!(item->getItemFamily() == ItemFamily_CraftingStations)) return true; } else { return true; } } switch(object->getType()) { // player, when a player enters a planet case ObjType_Player: { PlayerObject* player = dynamic_cast<PlayerObject*>(object); gLogger->logMsgF("New Player: %"PRIu64", Total Players on zone : %i",MSG_NORMAL,player->getId(),(getPlayerAccMap())->size() + 1); // insert into the player map mPlayerAccMap.insert(std::make_pair(player->getAccountId(),player)); // insert into cell if(player->getParentId()) { player->setSubZoneId(0); if(CellObject* cell = dynamic_cast<CellObject*>(getObjectById(player->getParentId()))) { cell->addObjectSecure(player); } else { gLogger->logMsgF("WorldManager::addObject: couldn't find cell %"PRIu64"",MSG_HIGH,player->getParentId()); } } // query the rtree for the qt region we are in else { if(QTRegion* region = mSpatialIndex->getQTRegion(player->mPosition.x,player->mPosition.z)) { player->setSubZoneId((uint32)region->getId()); region->mTree->addObject(player); } else { // we should never get here ! gLogger->logMsg("WorldManager::addObject: could not find zone region in map"); return false; } } // initialize initObjectsInRange(player); gMessageLib->sendCreatePlayer(player,player); // add ham to regeneration scheduler player->getHam()->updateRegenRates(); // ERU: Note sure if this is needed here. player->getHam()->checkForRegen(); // onPlayerEntered event, notify scripts string params; params.setLength(sprintf(params.getAnsi(),"%s %s %u",getPlanetNameThis(),player->getFirstName().getAnsi(),static_cast<uint32>(mPlayerAccMap.size()))); mWorldScriptsListener.handleScriptEvent("onPlayerEntered",params); // Start player world position update. Used when player don't get any events from client (player not moving). // addPlayerMovementUpdateTime(player, 1000); } break; case ObjType_Structure: { // HarvesterObject* harvester = dynamic_cast<HarvesterObject*>(object); mStructureList.push_back(object->getId()); mSpatialIndex->InsertPoint(key,object->mPosition.x,object->mPosition.z); } break; case ObjType_Building: { mStructureList.push_back(object->getId()); BuildingObject* building = dynamic_cast<BuildingObject*>(object); mSpatialIndex->InsertRegion(key,building->mPosition.x,building->mPosition.z,building->getWidth(),building->getHeight()); } break; case ObjType_Tangible: { uint64 parentId = object->getParentId(); if(parentId == 0) { mSpatialIndex->InsertPoint(key,object->mPosition.x,object->mPosition.z); } else { CellObject* cell = dynamic_cast<CellObject*>(getObjectById(parentId)); if(cell) cell->addObjectSecure(object); else gLogger->logMsgF("WorldManager::addObject couldn't find cell %"PRIu64"",MSG_NORMAL,parentId); } } break; // TODO: add moving creatures to qtregions case ObjType_NPC: case ObjType_Creature: case ObjType_Lair: { CreatureObject* creature = dynamic_cast<CreatureObject*>(object); if(creature->getCreoGroup() == CreoGroup_Shuttle) mShuttleList.push_back(dynamic_cast<Shuttle*>(creature)); uint64 parentId = creature->getParentId(); if(parentId) { CellObject* cell = dynamic_cast<CellObject*>(getObjectById(parentId)); if(cell) cell->addObjectSecure(creature); else gLogger->logMsgF("WorldManager::addObject: couldn't find cell %"PRIu64"",MSG_HIGH,parentId); } else { switch(creature->getCreoGroup()) { // moving creature, add to QT case CreoGroup_Vehicle : { if(QTRegion* region = mSpatialIndex->getQTRegion(creature->mPosition.x,creature->mPosition.z)) { creature->setSubZoneId((uint32)region->getId()); region->mTree->addObject(creature); } else { gLogger->logMsg("WorldManager::addObject: could not find zone region in map for creature"); return false; } } break; // still creature, add to SI default : { mSpatialIndex->InsertPoint(key,creature->mPosition.x,creature->mPosition.z); } } } } break; case ObjType_Region: { RegionObject* region = dynamic_cast<RegionObject*>(object); mRegionMap.insert(std::make_pair(key,region)); mSpatialIndex->InsertRegion(key,region->mPosition.x,region->mPosition.z,region->getWidth(),region->getHeight()); if(region->getActive()) addActiveRegion(region); } break; case ObjType_Intangible: { gLogger->logMsgF("Object of type ObjType_Intangible UNHANDLED in WorldManager::addObject:",MSG_HIGH); } break; default: { gLogger->logMsgF("Unhandled ObjectType in WorldManager::addObject: PRId32",MSG_HIGH,object->getType()); // Please, when adding new stufff, at least take the time to add a stub for that type. // Better fail always, than have random crashes. assert(false && "WorldManager::addObject Unhandled ObjectType"); } break; } return true; }
void WorldManager::warpPlanet(PlayerObject* playerObject, const glm::vec3& destination, uint64 parentId, const glm::quat& direction) { removePlayerMovementUpdateTime(playerObject); // remove player from objects in his range. playerObject->destroyKnownObjects(); // remove from cell / SI if(playerObject->getParentId()) { if(CellObject* cell = dynamic_cast<CellObject*>(getObjectById(playerObject->getParentId()))) { cell->removeObject(playerObject); } else { DLOG(INFO) << "WorldManager::removePlayer: couldn't find cell " << playerObject->getParentId(); } } else { if(playerObject->getSubZoneId()) { if(QTRegion* region = getQTRegion(playerObject->getSubZoneId())) { playerObject->setSubZoneId(0); region->mTree->removeObject(playerObject); } } } // remove any timers running //why remove that ? //removeObjControllerToProcess(playerObject->getController()->getTaskId()); //playerObject->getController()->clearQueues(); //playerObject->getController()->setTaskId(0); //why remove that ? removeCreatureHamToProcess(playerObject->getHam()->getTaskId()); removeCreatureStomachToProcess(playerObject->getStomach()->mDrinkTaskId); removeCreatureStomachToProcess(playerObject->getStomach()->mFoodTaskId); //we've removed the taskId, now lets reset the Id playerObject->getHam()->setTaskId(0); // reset player properties playerObject->resetProperties(); playerObject->setParentId(parentId); playerObject->mPosition = destination; playerObject->mDirection = direction; // start the new scene gMessageLib->sendStartScene(mZoneId,playerObject); gMessageLib->sendServerTime(gWorldManager->getServerTime(),playerObject->getClient()); // add us to cell / SI if(parentId) { if(CellObject* cell = dynamic_cast<CellObject*>(getObjectById(parentId))) { cell->addObjectSecure(playerObject); } else { DLOG(INFO) << "WorldManager::warpPlanet: couldn't find cell " << parentId; } } else { if(QTRegion* region = mSpatialIndex->getQTRegion(playerObject->mPosition.x,playerObject->mPosition.z)) { playerObject->setSubZoneId((uint32)region->getId()); region->mTree->addObject(playerObject); } else { // we should never get here ! return; } } // initialize objects in range initObjectsInRange(playerObject); // initialize at new position gMessageLib->sendCreatePlayer(playerObject,playerObject); // initialize ham regeneration playerObject->getHam()->checkForRegen(); playerObject->getStomach()->checkForRegen(); }