diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs | 85 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.cs | 40 |
2 files changed, 110 insertions, 15 deletions
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index dbf5138..693de1d 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs | |||
@@ -210,6 +210,9 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
210 | client.OnParcelInfoRequest += ClientOnParcelInfoRequest; | 210 | client.OnParcelInfoRequest += ClientOnParcelInfoRequest; |
211 | client.OnParcelDeedToGroup += ClientOnParcelDeedToGroup; | 211 | client.OnParcelDeedToGroup += ClientOnParcelDeedToGroup; |
212 | client.OnPreAgentUpdate += ClientOnPreAgentUpdate; | 212 | client.OnPreAgentUpdate += ClientOnPreAgentUpdate; |
213 | client.OnParcelEjectUser += ClientOnParcelEjectUser; | ||
214 | client.OnParcelFreezeUser += ClientOnParcelFreezeUser; | ||
215 | |||
213 | 216 | ||
214 | EntityBase presenceEntity; | 217 | EntityBase presenceEntity; |
215 | if (m_scene.Entities.TryGetValue(client.AgentId, out presenceEntity) && presenceEntity is ScenePresence) | 218 | if (m_scene.Entities.TryGetValue(client.AgentId, out presenceEntity) && presenceEntity is ScenePresence) |
@@ -1738,6 +1741,88 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
1738 | UpdateLandObject(localID, land.LandData); | 1741 | UpdateLandObject(localID, land.LandData); |
1739 | } | 1742 | } |
1740 | 1743 | ||
1744 | Dictionary<UUID, System.Threading.Timer> Timers = new Dictionary<UUID, System.Threading.Timer>(); | ||
1745 | |||
1746 | public void ClientOnParcelFreezeUser(IClientAPI client, UUID parcelowner, uint flags, UUID target) | ||
1747 | { | ||
1748 | ScenePresence targetAvatar = null; | ||
1749 | ((Scene)client.Scene).TryGetScenePresence(target, out targetAvatar); | ||
1750 | ScenePresence parcelManager = null; | ||
1751 | ((Scene)client.Scene).TryGetScenePresence(client.AgentId, out parcelManager); | ||
1752 | System.Threading.Timer Timer; | ||
1753 | |||
1754 | if (targetAvatar.UserLevel == 0) | ||
1755 | { | ||
1756 | ILandObject land = ((Scene)client.Scene).LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y); | ||
1757 | if (!((Scene)client.Scene).Permissions.CanEditParcelProperties(client.AgentId, land, GroupPowers.LandEjectAndFreeze)) | ||
1758 | return; | ||
1759 | if (flags == 0) | ||
1760 | { | ||
1761 | targetAvatar.AllowMovement = false; | ||
1762 | targetAvatar.ControllingClient.SendAlertMessage(parcelManager.Firstname + " " + parcelManager.Lastname + " has frozen you for 30 seconds. You cannot move or interact with the world."); | ||
1763 | parcelManager.ControllingClient.SendAlertMessage("Avatar Frozen."); | ||
1764 | System.Threading.TimerCallback timeCB = new System.Threading.TimerCallback(OnEndParcelFrozen); | ||
1765 | Timer = new System.Threading.Timer(timeCB, targetAvatar, 30000, 0); | ||
1766 | Timers.Add(targetAvatar.UUID, Timer); | ||
1767 | } | ||
1768 | else | ||
1769 | { | ||
1770 | targetAvatar.AllowMovement = true; | ||
1771 | targetAvatar.ControllingClient.SendAlertMessage(parcelManager.Firstname + " " + parcelManager.Lastname + " has unfrozen you."); | ||
1772 | parcelManager.ControllingClient.SendAlertMessage("Avatar Unfrozen."); | ||
1773 | Timers.TryGetValue(targetAvatar.UUID, out Timer); | ||
1774 | Timers.Remove(targetAvatar.UUID); | ||
1775 | Timer.Dispose(); | ||
1776 | } | ||
1777 | } | ||
1778 | } | ||
1779 | |||
1780 | private void OnEndParcelFrozen(object avatar) | ||
1781 | { | ||
1782 | ScenePresence targetAvatar = (ScenePresence)avatar; | ||
1783 | targetAvatar.AllowMovement = true; | ||
1784 | System.Threading.Timer Timer; | ||
1785 | Timers.TryGetValue(targetAvatar.UUID, out Timer); | ||
1786 | Timers.Remove(targetAvatar.UUID); | ||
1787 | targetAvatar.ControllingClient.SendAgentAlertMessage("The freeze has worn off; you may go about your business.", false); | ||
1788 | } | ||
1789 | |||
1790 | public void ClientOnParcelEjectUser(IClientAPI client, UUID parcelowner, uint flags, UUID target) | ||
1791 | { | ||
1792 | ScenePresence targetAvatar = null; | ||
1793 | ScenePresence parcelManager = null; | ||
1794 | |||
1795 | // Must have presences | ||
1796 | if (!m_scene.TryGetScenePresence(target, out targetAvatar) || | ||
1797 | !m_scene.TryGetScenePresence(client.AgentId, out parcelManager)) | ||
1798 | return; | ||
1799 | |||
1800 | // Cannot eject estate managers or gods | ||
1801 | if (m_scene.Permissions.IsAdministrator(target)) | ||
1802 | return; | ||
1803 | |||
1804 | // Check if you even have permission to do this | ||
1805 | ILandObject land = m_scene.LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y); | ||
1806 | if (!m_scene.Permissions.CanEditParcelProperties(client.AgentId, land, GroupPowers.LandEjectAndFreeze) && | ||
1807 | !m_scene.Permissions.IsAdministrator(client.AgentId)) | ||
1808 | return; | ||
1809 | Vector3 pos = m_scene.GetNearestAllowedPosition(targetAvatar, land); | ||
1810 | |||
1811 | targetAvatar.TeleportWithMomentum(pos, null); | ||
1812 | targetAvatar.ControllingClient.SendAlertMessage("You have been ejected by " + parcelManager.Firstname + " " + parcelManager.Lastname); | ||
1813 | parcelManager.ControllingClient.SendAlertMessage("Avatar Ejected."); | ||
1814 | |||
1815 | if ((flags & 1) != 0) // Ban TODO: Remove magic number | ||
1816 | { | ||
1817 | LandAccessEntry entry = new LandAccessEntry(); | ||
1818 | entry.AgentID = targetAvatar.UUID; | ||
1819 | entry.Flags = AccessList.Ban; | ||
1820 | entry.Expires = 0; // Perm | ||
1821 | |||
1822 | land.LandData.ParcelAccessList.Add(entry); | ||
1823 | } | ||
1824 | } | ||
1825 | |||
1741 | protected void InstallInterfaces() | 1826 | protected void InstallInterfaces() |
1742 | { | 1827 | { |
1743 | Command clearCommand | 1828 | Command clearCommand |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index f50d3cd..69fe137 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -5138,9 +5138,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
5138 | get { return m_allowScriptCrossings; } | 5138 | get { return m_allowScriptCrossings; } |
5139 | } | 5139 | } |
5140 | 5140 | ||
5141 | public Vector3? GetNearestAllowedPosition(ScenePresence avatar) | 5141 | public Vector3 GetNearestAllowedPosition(ScenePresence avatar) |
5142 | { | 5142 | { |
5143 | ILandObject nearestParcel = GetNearestAllowedParcel(avatar.UUID, avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); | 5143 | return GetNearestAllowedPosition(avatar, null); |
5144 | } | ||
5145 | |||
5146 | public Vector3 GetNearestAllowedPosition(ScenePresence avatar, ILandObject excludeParcel) | ||
5147 | { | ||
5148 | ILandObject nearestParcel = GetNearestAllowedParcel(avatar.UUID, avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y, excludeParcel); | ||
5144 | 5149 | ||
5145 | if (nearestParcel != null) | 5150 | if (nearestParcel != null) |
5146 | { | 5151 | { |
@@ -5149,10 +5154,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
5149 | Vector3? nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel); | 5154 | Vector3? nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel); |
5150 | if (nearestPoint != null) | 5155 | if (nearestPoint != null) |
5151 | { | 5156 | { |
5152 | // m_log.DebugFormat( | 5157 | Debug.WriteLine("Found a sane previous position based on velocity, sending them to: " + nearestPoint.ToString()); |
5153 | // "[SCENE]: Found a sane previous position based on velocity for {0}, sending them to {1} in {2}", | ||
5154 | // avatar.Name, nearestPoint, nearestParcel.LandData.Name); | ||
5155 | |||
5156 | return nearestPoint.Value; | 5158 | return nearestPoint.Value; |
5157 | } | 5159 | } |
5158 | 5160 | ||
@@ -5162,24 +5164,27 @@ namespace OpenSim.Region.Framework.Scenes | |||
5162 | nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel); | 5164 | nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel); |
5163 | if (nearestPoint != null) | 5165 | if (nearestPoint != null) |
5164 | { | 5166 | { |
5165 | // m_log.DebugFormat( | 5167 | Debug.WriteLine("They had a zero velocity, sending them to: " + nearestPoint.ToString()); |
5166 | // "[SCENE]: {0} had a zero velocity, sending them to {1}", avatar.Name, nearestPoint); | ||
5167 | |||
5168 | return nearestPoint.Value; | 5168 | return nearestPoint.Value; |
5169 | } | 5169 | } |
5170 | 5170 | ||
5171 | //Ultimate backup if we have no idea where they are | 5171 | ILandObject dest = LandChannel.GetLandObject(avatar.lastKnownAllowedPosition.X, avatar.lastKnownAllowedPosition.Y); |
5172 | // m_log.DebugFormat( | 5172 | if (dest != excludeParcel) |
5173 | // "[SCENE]: No idea where {0} is, sending them to {1}", avatar.Name, avatar.lastKnownAllowedPosition); | 5173 | { |
5174 | // Ultimate backup if we have no idea where they are and | ||
5175 | // the last allowed position was in another parcel | ||
5176 | Debug.WriteLine("Have no idea where they are, sending them to: " + avatar.lastKnownAllowedPosition.ToString()); | ||
5177 | return avatar.lastKnownAllowedPosition; | ||
5178 | } | ||
5174 | 5179 | ||
5175 | return avatar.lastKnownAllowedPosition; | 5180 | // else fall through to region edge |
5176 | } | 5181 | } |
5177 | 5182 | ||
5178 | //Go to the edge, this happens in teleporting to a region with no available parcels | 5183 | //Go to the edge, this happens in teleporting to a region with no available parcels |
5179 | Vector3 nearestRegionEdgePoint = GetNearestRegionEdgePosition(avatar); | 5184 | Vector3 nearestRegionEdgePoint = GetNearestRegionEdgePosition(avatar); |
5180 | 5185 | ||
5181 | //Debug.WriteLine("They are really in a place they don't belong, sending them to: " + nearestRegionEdgePoint.ToString()); | 5186 | //Debug.WriteLine("They are really in a place they don't belong, sending them to: " + nearestRegionEdgePoint.ToString()); |
5182 | 5187 | ||
5183 | return nearestRegionEdgePoint; | 5188 | return nearestRegionEdgePoint; |
5184 | } | 5189 | } |
5185 | 5190 | ||
@@ -5206,13 +5211,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
5206 | 5211 | ||
5207 | public ILandObject GetNearestAllowedParcel(UUID avatarId, float x, float y) | 5212 | public ILandObject GetNearestAllowedParcel(UUID avatarId, float x, float y) |
5208 | { | 5213 | { |
5214 | return GetNearestAllowedParcel(avatarId, x, y, null); | ||
5215 | } | ||
5216 | |||
5217 | public ILandObject GetNearestAllowedParcel(UUID avatarId, float x, float y, ILandObject excludeParcel) | ||
5218 | { | ||
5209 | List<ILandObject> all = AllParcels(); | 5219 | List<ILandObject> all = AllParcels(); |
5210 | float minParcelDistance = float.MaxValue; | 5220 | float minParcelDistance = float.MaxValue; |
5211 | ILandObject nearestParcel = null; | 5221 | ILandObject nearestParcel = null; |
5212 | 5222 | ||
5213 | foreach (var parcel in all) | 5223 | foreach (var parcel in all) |
5214 | { | 5224 | { |
5215 | if (!parcel.IsEitherBannedOrRestricted(avatarId)) | 5225 | if (!parcel.IsEitherBannedOrRestricted(avatarId) && parcel != excludeParcel) |
5216 | { | 5226 | { |
5217 | float parcelDistance = GetParcelDistancefromPoint(parcel, x, y); | 5227 | float parcelDistance = GetParcelDistancefromPoint(parcel, x, y); |
5218 | if (parcelDistance < minParcelDistance) | 5228 | if (parcelDistance < minParcelDistance) |