void SceneObjectImplementation::broadcastObjectPrivate(SceneObject* object, SceneObject* selfObject) { ZoneServer* zoneServer = getZoneServer(); if (zoneServer != NULL && zoneServer->isServerLoading()) return; if (parent.get() != NULL) { ManagedReference<SceneObject*> grandParent = cast<SceneObject*>(getRootParent().get().get()); if (grandParent != NULL) { grandParent->broadcastObjectPrivate(object, selfObject); return; } else { return; } } if (zone == NULL) return; // bool readlock = !zone->isLockedByCurrentThread(); SortedVector<ManagedReference<QuadTreeEntry*> > closeSceneObjects; int maxInRangeObjectCount = 0; // zone->rlock(readlock); //Locker zoneLocker(zone); try { if (closeobjects == NULL) { info("Null closeobjects vector in SceneObjectImplementation::broadcastObjectPrivate", true); zone->getInRangeObjects(getPositionX(), getPositionY(), 192, &closeSceneObjects, true); maxInRangeObjectCount = closeSceneObjects.size(); } else { CloseObjectsVector* vec = (CloseObjectsVector*) closeobjects; closeSceneObjects.removeAll(vec->size(), 10); //closeSceneObjects.addAll(*closeobjects); vec->safeCopyTo(closeSceneObjects); maxInRangeObjectCount = closeSceneObjects.size(); //closeobjects->size(); } } catch (...) { // zone->runlock(readlock); throw; } //zone->runlock(readlock); for (int i = 0; i < maxInRangeObjectCount; ++i) { SceneObject* scno = cast<SceneObject*>(closeSceneObjects.get(i).get()); if (selfObject == scno) continue; ManagedReference<ZoneClientSession*> client = scno->getClient(); if (scno->isVehicleObject() || client != NULL || scno->isMount()) { object->sendTo(scno, true); } } }
void ZoneComponent::updateZoneWithParent(SceneObject* sceneObject, SceneObject* newParent, bool lightUpdate, bool sendPackets) { ManagedReference<Zone*> zone = sceneObject->getZone(); ManagedReference<SceneObject*> oldParent = sceneObject->getParent(); if (oldParent != NULL && !oldParent->isCellObject()) return; if (zone == NULL) zone = newParent->getRootParent().get()->getZone(); Locker _locker(zone); if (oldParent == NULL) { // we are in zone, enter cell //zone->remove(sceneObject); newParent->transferObject(sceneObject, -1, true); zone->unlock(); //insertToBuilding(sceneObject, dynamic_cast<BuildingObject*>(newParent->getParent())); } else { // we are in cell already if (oldParent != newParent) { //oldParent->removeObject(sceneObject, false); newParent->transferObject(sceneObject, -1, true); zone->unlock(); } else { zone->unlock(); zone->updateActiveAreas(sceneObject); } //notify in range objects that i moved } CloseObjectsVector* closeObjects = (CloseObjectsVector*) sceneObject->getCloseObjects(); if (closeObjects != NULL) { SortedVector<ManagedReference<QuadTreeEntry*> > objects(closeObjects->size(), 10); closeObjects->safeCopyTo(objects); for (int i = 0; i < objects.size(); ++i) { QuadTreeEntry* object = objects.get(i); try { object->notifyPositionUpdate(sceneObject); } catch (Exception& e) { } } } //zoneLocker.release(); //zone->unlock(); bool isInvis = false; if (sceneObject->isCreatureObject()) { CreatureObject* creo = cast<CreatureObject*>(sceneObject); if(creo->isInvisible()) isInvis = true; } if (sendPackets && !isInvis) { if (lightUpdate) { LightUpdateTransformWithParentMessage* message = new LightUpdateTransformWithParentMessage(sceneObject); sceneObject->broadcastMessage(message, false, true); } else { UpdateTransformWithParentMessage* message = new UpdateTransformWithParentMessage(sceneObject); sceneObject->broadcastMessage(message, false, true); } } try { notifySelfPositionUpdate(sceneObject); } catch (Exception& e) { sceneObject->error("Exception caught while calling notifySelfPositionUpdate(sceneObject) in ZoneComponent::updateZoneWithParent"); sceneObject->error(e.getMessage()); } zone->wlock(); }