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(); }