From fe2d9be0cff649fad7fee78b257686954262e3cd Mon Sep 17 00:00:00 2001 From: Melanie Date: Fri, 14 Jan 2011 03:35:45 +0100 Subject: [PATCH] Implement nonlocal god kicks and freezes --- .../CoreModules/Avatar/Gods/GodsModule.cs | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs b/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs index 9fd331857a..a83b3df9a6 100644 --- a/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs @@ -74,6 +74,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods m_scene.EventManager.OnNewClient += SubscribeToClientEvents; m_scene.EventManager.OnRegisterCaps += OnRegisterCaps; m_scene.EventManager.OnClientClosed += OnClientClosed; + scene.EventManager.OnIncomingInstantMessage += + OnIncomingInstantMessage; } public void PostInitialise() {} @@ -128,6 +130,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods uint kickFlags = userData["KickFlags"].AsUInteger(); string reason = userData["Reason"].AsString(); + ScenePresence god = m_scene.GetScenePresence(godID); + if (god == null || god.ControllingClient.SessionId != godSessionID) + return String.Empty; + KickUser(godID, godSessionID, agentID, kickFlags, Util.StringToBytes1024(reason)); } else @@ -188,12 +194,24 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods if (!m_scene.Permissions.IsGod(godID)) return; - ScenePresence god = m_scene.GetScenePresence(godID); - if (god == null || god.ControllingClient.SessionId != sessionID) - return; - ScenePresence sp = m_scene.GetScenePresence(agentID); + if (sp == null && agentID != ALL_AGENTS) + { + IMessageTransferModule transferModule = + m_scene.RequestModuleInterface(); + if (transferModule != null) + { + m_log.DebugFormat("[GODS]: Sending nonlocal kill for agent {0}", agentID); + transferModule.SendInstantMessage(new GridInstantMessage( + m_scene, godID, "God", agentID, (byte)250, false, + Utils.BytesToString(reason), UUID.Zero, true, + new Vector3(), new byte[] {(byte)kickflags}), + delegate(bool success) {} ); + } + return; + } + switch (kickflags) { case 0: @@ -240,5 +258,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods sp.ControllingClient.Kick(reason); sp.Scene.IncomingCloseAgent(sp.UUID); } + + private void OnIncomingInstantMessage(GridInstantMessage msg) + { + if (msg.dialog == (uint)250) // Nonlocal kick + { + UUID agentID = new UUID(msg.toAgentID); + string reason = msg.message; + UUID godID = new UUID(msg.fromAgentID); + uint kickMode = (uint)msg.binaryBucket[0]; + + KickUser(godID, UUID.Zero, agentID, kickMode, Util.StringToBytes1024(reason)); + } + } } }