int ScriptObject::CreateWavefrontModel(float x, float y, float z, std::string path, std::string filename) { Object *object = new DreiDObject(_objectIndex,x,y,z); std::string dPath = GetPath() + path; object->To3D()->LoadObjModelData(dPath.c_str(), filename.c_str()); return _AddObject(object); }
bool SpatialIndexManager::_AddObject(Object *newObject) { uint32 finalBucket = getGrid()->AddObject(newObject); //DLOG(info) << "SpatialIndexManager::AddObject :: Object " << newObject->getId() << " added to bucket " << finalBucket; if(finalBucket == 0xffffffff) { DLOG(info) << "SpatialIndexManager::AddObject :: Object " << newObject->getId() << " could not be added to the bucket because the bucket was invalid " << finalBucket; return false; } if(newObject->getType() == ObjType_Player) { //enforce proper handling of players!! PlayerObject* player = static_cast<PlayerObject*>(newObject); _AddObject(player); } //get all Players in range and register as necessary ObjectListType playerList; getGrid()->GetPlayerViewingRangeCellContents(finalBucket, &playerList); for(ObjectListType::iterator i = playerList.begin(); i != playerList.end(); i++) { PlayerObject* otherPlayer = static_cast<PlayerObject*>((*i)); sendCreateObject(newObject,otherPlayer, false); if((newObject->getType() == ObjType_Creature) || (newObject->getType() == ObjType_NPC)) { gContainerManager->registerPlayerToContainer(newObject, otherPlayer); } } return true; }
void SpatialIndexManager::UpdateObject(Object *updateObject) { uint32 oldBucket = updateObject->getGridBucket(); uint32 newBucket = getGrid()->getCellId(updateObject->getWorldPosition().x, updateObject->getWorldPosition().z); // now process the spatial index update if(newBucket != oldBucket) { DLOG(info) << "ContainerManager::UpdateObject :: " << updateObject->getId() <<"normal movement from bucket" << oldBucket << " to bucket" << newBucket; // test how much we moved if only one grid proceed normally if((newBucket == (oldBucket +1)) || (newBucket == (oldBucket -1)) || (newBucket == (oldBucket + GRIDWIDTH)) || (newBucket == (oldBucket - GRIDWIDTH)) || (newBucket == (oldBucket + GRIDWIDTH +1)) || (newBucket == (oldBucket + GRIDWIDTH -1)) || (newBucket == (oldBucket - GRIDWIDTH +1)) || (newBucket == (oldBucket - GRIDWIDTH -1))) { // sets the new gridcell, updates subcells getGrid()->UpdateObject(updateObject); // remove us from the row we left _UpdateBackCells(updateObject,oldBucket); // create us for the row in which direction we moved _UpdateFrontCells(updateObject,oldBucket); } else { // we teleported destroy all and create everything new DLOG(info) << "ContainerManager::UpdateObject :: " << updateObject->getId() <<"teleportation from bucket" << oldBucket << " to bucket" << newBucket; // remove us from everything RemoveObjectFromWorld(updateObject); // sets the new gridcell, updates subcells getGrid()->AddObject(updateObject); // and add us freshly to the world _AddObject(updateObject); } } // Make sure to update any regions the object may be entering or leaving. getGrid()->updateRegions(updateObject); }
int ScriptObject::CreateLoadingObject(float x, float y, float z, float sx, float sy, uint16 texture, bool depth) { Object *object = new LoadingObject(_objectIndex, x, y, z, sx, sy, texture, depth); return _AddObject(object); }
///- Objects int ScriptObject::CreateObject(float x, float y, float z, float sx, float sy, uint16 tex, bool depth, bool ortho, bool clickable) { Object *object = new PlanarObject(_objectIndex, x, y, z, sx, sy, tex, depth, ortho, clickable); return _AddObject(object); }