private void ParcelDivideHandler(Packet packet, LLAgent agent) { ParcelDividePacket divide = (ParcelDividePacket)packet; int startX = (int)Math.Round(divide.ParcelData.West) / 4; int startY = (int)Math.Round(divide.ParcelData.South) / 4; int endX = ((int)Math.Round(divide.ParcelData.East) / 4) - 1; int endY = ((int)Math.Round(divide.ParcelData.North) / 4) - 1; if (startX < 0 || startY < 0 || endX < startX || endY < startY || endX > 63 || endY > 63 || startX > endX || startY > endY) { m_log.Warn(agent.Name + String.Format(" sent invalid ParcelDivide: West {0} South {1} East {2} North {3}", divide.ParcelData.West, divide.ParcelData.South, divide.ParcelData.East, divide.ParcelData.North)); return; } // Make sure only a single parcel was selected int startParcelID = m_parcels.GetParcelID(startX, startY); for (int y = startY; y <= endY; y++) { for (int x = startX; x <= endX; x++) { int parcelID = m_parcels.GetParcelID(x, y); if (parcelID != startParcelID) { m_scene.PresenceAlert(this, agent, "Only one parcel can be subdivided at a time"); return; } } } SceneParcel parcel; if (!m_parcels.TryGetParcel(startParcelID, out parcel)) { m_log.Warn("Failed to look up parcel " + startParcelID + " during parcel divide"); return; } if (m_permissions != null && !m_permissions.CanEditParcel(agent, parcel)) { m_scene.PresenceAlert(this, agent, "You do not have permission to subdivide this parcel"); return; } m_parcels.SplitParcel(parcel, startX, endX, startY, endY); // Broadcast the new parcel overlay info m_scene.ForEachPresence(SendParcelOverlay); }
/// <summary> /// /// </summary> /// <param name="west"></param> /// <param name="south"></param> /// <param name="east"></param> /// <param name="north"></param> public void ParcelSubdivide(float west, float south, float east, float north) { ParcelDividePacket divide = new ParcelDividePacket(); divide.AgentData.AgentID = Client.Network.AgentID; divide.AgentData.SessionID = Client.Network.SessionID; divide.ParcelData.East = east; divide.ParcelData.North = north; divide.ParcelData.South = south; divide.ParcelData.West = west; // FIXME: Region needs a reference to it's parent Simulator //Client.Network.SendPacket((Packet)divide, this.Simulator); }
/// <summary> /// Subdivide (split) a parcel /// </summary> /// <param name="simulator"></param> /// <param name="west"></param> /// <param name="south"></param> /// <param name="east"></param> /// <param name="north"></param> public void ParcelSubdivide(Simulator simulator, float west, float south, float east, float north) { ParcelDividePacket divide = new ParcelDividePacket(); divide.AgentData.AgentID = Client.Self.AgentID; divide.AgentData.SessionID = Client.Self.SessionID; divide.ParcelData.East = east; divide.ParcelData.North = north; divide.ParcelData.South = south; divide.ParcelData.West = west; Client.Network.SendPacket(divide, simulator); }