void ObjectController::_findInRangeObjectsOutside(bool updateAll) { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); //scale down viewing range when busy float viewingRange = _GetMessageHeapLoadViewingRange(); // gLogger->logMsg("... _findInRangeObjectsOutside."); // query the rtree for non moving objects/objects in buildings // ObjectSet inRangeObjects; // mSI->getObjectsInRange(player,&inRangeObjects,(ObjType_Player | ObjType_Tangible | ObjType_Creature | ObjType_NPC | ObjType_Building),viewingRange); // Using intersectsWithQuery(..) // NOTE: THIS USEAGE OF intersectsWithQuery(..) MUST BE CHECKED, SINCE IT SEEMS THAT WE GET TO MUCH / TO MANY OBJECTS !!! // mSI->getObjectsInRangeEx(player,&inRangeObjects,(ObjType_Player | ObjType_Tangible | ObjType_Creature | ObjType_NPC | ObjType_Building),viewingRange); // Make Set ready, mInRangeObjects.clear(); mObjectSetIt = mInRangeObjects.begin(); // Will point to end of Set if(player->getSubZoneId()) { if(QTRegion* region = gWorldManager->getQTRegion(player->getSubZoneId())) { // gLogger->logMsg("... in a region."); Anh_Math::Rectangle qRect = Anh_Math::Rectangle(player->mPosition.x - viewingRange,player->mPosition.z - viewingRange,viewingRange * 2,viewingRange * 2); // We need to find moving creatures also... region->mTree->getObjectsInRange(player,&mInRangeObjects,ObjType_Player | ObjType_NPC | ObjType_Creature | ObjType_Lair , &qRect); } } if (updateAll) { // gLogger->logMsg("UpdateAll."); // Doing this because we need the players from inside buildings too. mSI->getObjectsInRangeEx(player,&mInRangeObjects,(ObjType_Player | ObjType_NPC | ObjType_Creature), viewingRange); // This may be good when we standstill. mSI->getObjectsInRange(player,&mInRangeObjects,(ObjType_Tangible | ObjType_Building | ObjType_Lair | ObjType_Structure), viewingRange); } /* { // This may be good when we are moving around outside. mSI->getObjectsInRange(player,&mInRangeObjects,(ObjType_Player | ObjType_NPC | ObjType_Creature | ObjType_Tangible | ObjType_Building), viewingRange); } */ // Update the iterator to start of Set. mObjectSetIt = mInRangeObjects.begin(); }
void WorldManager::initPlayersInRange(Object* object,PlayerObject* player) { // we still query for players here, cause they are found through the buildings and arent kept in a qtree ObjectSet inRangeObjects; mSpatialIndex->getObjectsInRange(object,&inRangeObjects,(ObjType_Player),gWorldConfig->getPlayerViewingRange()); // query the according qtree, if we are in one if(object->getSubZoneId()) { if(QTRegion* region = getQTRegion(object->getSubZoneId())) { float viewingRange = _GetMessageHeapLoadViewingRange(); //float viewingRange = (float)gWorldConfig->getPlayerViewingRange(); Anh_Math::Rectangle qRect; if(!object->getParentId()) { qRect = Anh_Math::Rectangle(object->mPosition.x - viewingRange,object->mPosition.z - viewingRange,viewingRange * 2,viewingRange * 2); } else { CellObject* cell = dynamic_cast<CellObject*>(getObjectById(object->getParentId())); BuildingObject* building = dynamic_cast<BuildingObject*>(getObjectById(cell->getParentId())); qRect = Anh_Math::Rectangle(building->mPosition.x - viewingRange,building->mPosition.z - viewingRange,viewingRange * 2,viewingRange * 2); } region->mTree->getObjectsInRange(object,&inRangeObjects,ObjType_Player,&qRect); } } // iterate through the results ObjectSet::iterator it = inRangeObjects.begin(); while(it != inRangeObjects.end()) { PlayerObject* pObject = dynamic_cast<PlayerObject*>(*it); if(pObject) { if(pObject != player) { gMessageLib->sendCreateObject(object,pObject); pObject->addKnownObjectSafe(object); object->addKnownObjectSafe(pObject); } } ++it; } }
void WorldManager::initObjectsInRange(PlayerObject* playerObject) { float viewingRange = _GetMessageHeapLoadViewingRange(); //if we are in a playerbuilding create the playerbuilding first //otherwise our items will not show when they are created before the cell if(CellObject* cell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(playerObject->getParentId()))) { if(HouseObject* playerHouse = dynamic_cast<HouseObject*>(gWorldManager->getObjectById(cell->getParentId()))) { //gLogger->logMsgF("create playerbuilding",MSG_HIGH); gMessageLib->sendCreateObject(playerHouse,playerObject); playerHouse->addKnownObjectSafe(playerObject); playerObject->addKnownObjectSafe(playerHouse); } } // we still query for players here, cause they are found through the buildings and arent kept in a qtree ObjectSet inRangeObjects; mSpatialIndex->getObjectsInRange(playerObject,&inRangeObjects,(ObjType_Player | ObjType_Tangible | ObjType_NPC | ObjType_Creature | ObjType_Building | ObjType_Structure ),viewingRange); // query the according qtree, if we are in one if(playerObject->getSubZoneId()) { if(QTRegion* region = getQTRegion(playerObject->getSubZoneId())) { Anh_Math::Rectangle qRect; if(!playerObject->getParentId()) { qRect = Anh_Math::Rectangle(playerObject->mPosition.x - viewingRange,playerObject->mPosition.z - viewingRange,viewingRange * 2,viewingRange * 2); } else { CellObject* cell = dynamic_cast<CellObject*>(getObjectById(playerObject->getParentId())); if(BuildingObject* house = dynamic_cast<BuildingObject*>(getObjectById(cell->getParentId()))) { qRect = Anh_Math::Rectangle(house->mPosition.x - viewingRange,house->mPosition.z - viewingRange,viewingRange * 2,viewingRange * 2); } } region->mTree->getObjectsInRange(playerObject,&inRangeObjects,ObjType_Player,&qRect); } } // iterate through the results ObjectSet::iterator it = inRangeObjects.begin(); while(it != inRangeObjects.end()) { Object* object = (*it); // send create for the type of object if (object->getPrivateOwner()) //what is this about ?? does it concern instances ???? { if (object->isOwnedBy(playerObject)) { gMessageLib->sendCreateObject(object,playerObject); object->addKnownObjectSafe(playerObject); playerObject->addKnownObjectSafe(object); } } else { gMessageLib->sendCreateObject(object,playerObject); object->addKnownObjectSafe(playerObject); playerObject->addKnownObjectSafe(object); } ++it; } }
void WorldManager::createObjectinWorld(Object* object) { float viewingRange = _GetMessageHeapLoadViewingRange(); ObjectSet inRangeObjects; mSpatialIndex->getObjectsInRange(object,&inRangeObjects,(ObjType_Player),viewingRange); // query the according qtree, if we are in one if(object->getSubZoneId()) { if(QTRegion* region = getQTRegion(object->getSubZoneId())) { Anh_Math::Rectangle qRect; if(!object->getParentId()) { qRect = Anh_Math::Rectangle(object->mPosition.x - viewingRange,object->mPosition.z - viewingRange,viewingRange * 2,viewingRange * 2); } else { CellObject* cell = dynamic_cast<CellObject*>(getObjectById(object->getParentId())); if(BuildingObject* house = dynamic_cast<BuildingObject*>(getObjectById(cell->getParentId()))) { qRect = Anh_Math::Rectangle(house->mPosition.x - viewingRange,house->mPosition.z - viewingRange,viewingRange * 2,viewingRange * 2); } } region->mTree->getObjectsInRange(object,&inRangeObjects,ObjType_Player,&qRect); } } // iterate through the results ObjectSet::iterator it = inRangeObjects.begin(); while(it != inRangeObjects.end()) { PlayerObject* player = dynamic_cast<PlayerObject*> (*it); if(player) { // send create for the type of object if (object->getPrivateOwner()) //what is this about ?? does it concern instances ???? { if (object->isOwnedBy(player)) { gMessageLib->sendCreateObject(object,player); object->addKnownObjectSafe(player); player->addKnownObjectSafe(object); } } else { gMessageLib->sendCreateObject(object,player); object->addKnownObjectSafe(player); player->addKnownObjectSafe(object); } } ++it; } }
//========================================================================================= // // Find the objects observed/known objects when inside // void ObjectController::_findInRangeObjectsInside(bool updateAll) { PlayerObject* player = dynamic_cast<PlayerObject*>(mObject); float viewingRange = _GetMessageHeapLoadViewingRange(); CellObject* playerCell = dynamic_cast<CellObject*>(gWorldManager->getObjectById(player->getParentId())); // Make Set ready, mInRangeObjects.clear(); // Init the iterator. mObjectSetIt = mInRangeObjects.begin(); // make sure we got a cell if (!playerCell) { gLogger->logMsg("ERROR: No playerCell."); return; } Object* object = gWorldManager->getObjectById(playerCell->getParentId()); //BuildingObject* building = dynamic_cast<BuildingObject*>(object); BuildingObject* building = dynamic_cast<BuildingObject*>(object); // make sure we got a building if (!building) { gLogger->logMsg("ERROR: No building."); return; } // mInRangeObjectIndex = 0; if (updateAll) { // This is good to use when entering a building. mSI->getObjectsInRange(player,&mInRangeObjects,(ObjType_Player | ObjType_Tangible | ObjType_NPC | ObjType_Creature | ObjType_Building | ObjType_Structure),viewingRange); // query the qtree based on the buildings world position if (QTRegion* region = mSI->getQTRegion(building->mPosition.x,building->mPosition.z)) { Anh_Math::Rectangle qRect = Anh_Math::Rectangle(building->mPosition.x - viewingRange,building->mPosition.z - viewingRange,viewingRange * 2,viewingRange * 2); // We need to find moving creatures outside... region->mTree->getObjectsInRange(player,&mInRangeObjects,ObjType_Player | ObjType_NPC | ObjType_Creature, &qRect); } } else { // This is good to use when running around inside a building. // We need to see player or creatures spawning inside. // Added ObjType_Tangible because Tutorial spawns ObjType_Tangible in a way we don't normally do. // If we need more speed in normal cases, just add a test for Tutorial and de-select ObjType_Tangible if not active. mSI->getObjectsInRange(player,&mInRangeObjects,(ObjType_Tangible | ObjType_Player | ObjType_Creature | ObjType_NPC),viewingRange); // query the qtree based on the buildings world position if (QTRegion* region = mSI->getQTRegion(building->mPosition.x,building->mPosition.z)) { Anh_Math::Rectangle qRect = Anh_Math::Rectangle(building->mPosition.x - viewingRange,building->mPosition.z - viewingRange,viewingRange * 2,viewingRange * 2); // We need to find moving creatures outside... region->mTree->getObjectsInRange(player,&mInRangeObjects,ObjType_Player | ObjType_NPC | ObjType_Creature,&qRect); } } // Update the iterator to start of Set. mObjectSetIt = mInRangeObjects.begin(); }