From feb78b29104cc1c7f5d327bab45edd4d00a88944 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 30 Sep 2015 02:45:11 +0100 Subject: add several options for NPC creation so abusive use can be reduced (restrictive by default) UNTESTED --- OpenSim/Region/Framework/Interfaces/INPCModule.cs | 12 +++++ .../Region/OptionalModules/World/NPC/NPCModule.cs | 26 +++++++++++ .../Shared/Api/Implementation/OSSL_Api.cs | 53 ++++++++++++++++++---- bin/OpenSim.ini.example | 15 ++++++ 4 files changed, 96 insertions(+), 10 deletions(-) diff --git a/OpenSim/Region/Framework/Interfaces/INPCModule.cs b/OpenSim/Region/Framework/Interfaces/INPCModule.cs index 478833e..8f9a13c 100644 --- a/OpenSim/Region/Framework/Interfaces/INPCModule.cs +++ b/OpenSim/Region/Framework/Interfaces/INPCModule.cs @@ -31,6 +31,16 @@ using OpenSim.Region.Framework.Scenes; namespace OpenSim.Region.Framework.Interfaces { + // option flags for NPCs + public enum NPCOptionsFlags : int + { + None = 0x00, // no flags (max restriction) + AllowNotOwned = 0x01, // allow NPCs to be created not Owned + AllowSenseAsAvatar = 0x02, // allow NPCs to set to be sensed as Avatars + AllowCloneOtherAvatars = 0x04, // allow NPCs to created cloning a avatar in region + NoNPCGroup = 0x08 // NPCs will have no group title, otherwise will have "- NPC -" + } + /// /// Temporary interface. More methods to come at some point to make NPCs /// more object oriented rather than controlling purely through module @@ -284,5 +294,7 @@ namespace OpenSim.Region.Framework.Interfaces /// agent, the agent is unowned or the agent was not an NPC. /// UUID GetOwner(UUID agentID); + + NPCOptionsFlags NPCOptionFlags {get;} } } diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 9dc4489..97c15a9 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -52,6 +52,11 @@ namespace OpenSim.Region.OptionalModules.World.NPC private Dictionary m_avatars = new Dictionary(); + + + private NPCOptionsFlags m_NPCOptionFlags; + public NPCOptionsFlags NPCOptionFlags {get {return m_NPCOptionFlags;}} + public bool Enabled { get; private set; } public void Initialise(IConfigSource source) @@ -59,6 +64,27 @@ namespace OpenSim.Region.OptionalModules.World.NPC IConfig config = source.Configs["NPC"]; Enabled = (config != null && config.GetBoolean("Enabled", false)); + m_NPCOptionFlags = NPCOptionsFlags.None; + if(Enabled) + { + bool opt = false; + + opt = config.GetBoolean("AllowNotOwned", false); + if(opt) + m_NPCOptionFlags |= NPCOptionsFlags.AllowNotOwned; + + opt = config.GetBoolean("AllowSenseAsAvatar", false); + if(opt) + m_NPCOptionFlags |= NPCOptionsFlags.AllowSenseAsAvatar; + + opt = config.GetBoolean("AllowCloneOtherAvatars", false); + if(opt) + m_NPCOptionFlags |= NPCOptionsFlags.AllowCloneOtherAvatars; + + opt = config.GetBoolean("NoNPCGroup", false); + if(opt) + m_NPCOptionFlags |= NPCOptionsFlags.NoNPCGroup; + } } public void AddRegion(Scene scene) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 7a53646..fae0bda 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -141,8 +141,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api internal float m_ScriptDelayFactor = 1.0f; internal float m_ScriptDistanceFactor = 1.0f; internal bool m_debuggerSafe = false; - internal Dictionary m_FunctionPerms = new Dictionary(); - + internal Dictionary m_FunctionPerms = new Dictionary(); protected IUrlModule m_UrlModule = null; public void Initialize( @@ -196,7 +195,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api default: break; } - } + } public override Object InitializeLifetimeService() { @@ -2577,8 +2576,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { CheckThreatLevel(ThreatLevel.High, "osNpcCreate"); m_host.AddScriptLPS(1); + + // have to get the npc module also here to set the default Not Owned + INPCModule module = World.RequestModuleInterface(); + if(module == null) + return new LSL_Key(UUID.Zero.ToString()); + + bool owned = (module.NPCOptionFlags & NPCOptionsFlags.AllowNotOwned) == 0; - return NpcCreate(firstname, lastname, position, notecard, false, false); + return NpcCreate(firstname, lastname, position, notecard, owned, false); } public LSL_Key osNpcCreate(string firstname, string lastname, LSL_Vector position, string notecard, int options) @@ -2595,7 +2601,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api private LSL_Key NpcCreate( string firstname, string lastname, LSL_Vector position, string notecard, bool owned, bool senseAsAgent) { - string groupTitle = String.Empty; if (!World.Permissions.CanRezObject(1, m_host.OwnerID, new Vector3((float)position.x, (float)position.y, (float)position.z))) return new LSL_Key(UUID.Zero.ToString()); @@ -2603,14 +2608,42 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api INPCModule module = World.RequestModuleInterface(); if (module != null) { + string groupTitle = String.Empty; AvatarAppearance appearance = null; - UUID id; - if (UUID.TryParse(notecard, out id)) + // check creation options + NPCOptionsFlags createFlags = module.NPCOptionFlags; + + if((createFlags & NPCOptionsFlags.AllowNotOwned) == 0 && !owned) + { + OSSLError("Not owned NPCs disabled"); + owned = true; // we should get here... + } + + if((createFlags & NPCOptionsFlags.AllowSenseAsAvatar) == 0 && senseAsAgent) { - ScenePresence clonePresence = World.GetScenePresence(id); - if (clonePresence != null) - appearance = clonePresence.Appearance; + OSSLError("NPC allow sense as Avatar disabled"); + senseAsAgent = false; + } + + if((createFlags & NPCOptionsFlags.NoNPCGroup) == 0) + { + if (firstname != String.Empty || lastname != String.Empty) + { + if (firstname != "Shown outfit:") + groupTitle = "- NPC -"; + } + } + + if((createFlags & NPCOptionsFlags.AllowCloneOtherAvatars) != 0) + { + UUID id; + if (UUID.TryParse(notecard, out id)) + { + ScenePresence clonePresence = World.GetScenePresence(id); + if (clonePresence != null) + appearance = clonePresence.Appearance; + } } if (appearance == null) diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 52dc081..72695b8 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -1114,6 +1114,21 @@ [NPC] ;# {Enabled} {} {Enable Non Player Character (NPC) facilities} {true false} false ; Enabled = false + + ;; several options to control NPCs creation + ;; should only be set true on special uses. + + ;; allow NPCs to be created not Owned {true false} false + ; AllowNotOwned = false + + ;; allow NPCs to set to be sensed as Avatars {true false} false + ; AllowSenseAsAvatar = false + + ;; allow NPCs to created cloning any avatar in region {true false} false + ; AllowCloneOtherAvatars = false + + ;; if true NPCs will have no group title, if false display "- NPC -" for easy identification {true false} false + ; NoNPCGroup = false [Terrain] -- cgit v1.1