From 463c66d256220759cea7eff46206e3e770742fd4 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 28 Nov 2021 16:02:45 +0000 Subject: [PATCH] try save some zeptogram of CO2 --- .../Shared/Api/Implementation/LSL_Api.cs | 107 ++++++++++-------- 1 file changed, 57 insertions(+), 50 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 3ab2bb4ba1..7bfb9aed6b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -106,7 +106,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api protected bool throwErrorOnNotImplemented = false; protected float m_ScriptDelayFactor = 1.0f; - protected float m_ScriptDistanceFactor = 1.0f; + protected float m_Script10mDistance = 10.0f; + protected float m_Script10mDistanceSquare = 100.0f; protected float m_MinTimerInterval = 0.5f; protected float m_recoilScaleFactor = 0.0f; protected bool m_AllowGodFunctions; @@ -255,6 +256,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api private int m_saydistance = 20; private int m_shoutdistance = 100; + bool m_disable_underground_movement = true; + private string m_lsl_shard = "OpenSim"; private string m_lsl_user_agent = string.Empty; @@ -417,22 +420,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (seConfig != null) { - m_ScriptDelayFactor = - seConfig.GetFloat("ScriptDelayFactor", m_ScriptDelayFactor); - m_ScriptDistanceFactor = - seConfig.GetFloat("ScriptDistanceLimitFactor", m_ScriptDistanceFactor); - m_MinTimerInterval = - seConfig.GetFloat("MinTimerInterval", m_MinTimerInterval); - m_automaticLinkPermission = - seConfig.GetBoolean("AutomaticLinkPermission", m_automaticLinkPermission); - m_notecardLineReadCharsMax = - seConfig.GetInt("NotecardLineReadCharsMax", m_notecardLineReadCharsMax); + float scriptDistanceFactor = seConfig.GetFloat("ScriptDistanceLimitFactor", 1.0f); + m_Script10mDistance = 10.0f * scriptDistanceFactor; + m_Script10mDistanceSquare = m_Script10mDistance * m_Script10mDistance; + + m_ScriptDelayFactor = seConfig.GetFloat("ScriptDelayFactor", m_ScriptDelayFactor); + m_MinTimerInterval = seConfig.GetFloat("MinTimerInterval", m_MinTimerInterval); + m_automaticLinkPermission = seConfig.GetBoolean("AutomaticLinkPermission", m_automaticLinkPermission); + m_notecardLineReadCharsMax = seConfig.GetInt("NotecardLineReadCharsMax", m_notecardLineReadCharsMax); // Rezzing an object with a velocity can create recoil. This feature seems to have been // removed from recent versions of SL. The code computes recoil (vel*mass) and scales // it by this factor. May be zero to turn off recoil all together. m_recoilScaleFactor = seConfig.GetFloat("RecoilScaleFactor", m_recoilScaleFactor); m_AllowGodFunctions = seConfig.GetBoolean("AllowGodFunctions", false); + + m_disable_underground_movement = seConfig.GetBoolean("DisableUndergroundMovement", true); } if (m_notecardLineReadCharsMax > 65535) @@ -604,14 +607,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if ((item = GetScriptByName(name)) == UUID.Zero) { - Error("llResetOtherScript", "Can't find script '" + name + "'"); + Error("llResetOtherScript", "Can't find script '" + name + "'"); return; } if(item == m_item.ItemID) llResetScript(); else { - m_ScriptEngine.ResetScript(item); + m_ScriptEngine.ResetScript(item); } } @@ -965,6 +968,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return Math.Sqrt(dx * dx + dy * dy + dz * dz); } + private double VecDistSquare(LSL_Vector a, LSL_Vector b) + { + double dx = a.x - b.x; + double dy = a.y - b.y; + double dz = a.z - b.z; + return dx * dx + dy * dy + dz * dz; + } + public LSL_Float llVecDist(LSL_Vector a, LSL_Vector b) { return VecDist(a, b); @@ -2690,38 +2701,39 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api SetPos(m_host.ParentGroup.RootPart, pos, false); - return VecDist(pos, llGetRootPosition()) <= 0.1 ? 1 : 0; + return VecDistSquare(pos, llGetRootPosition()) <= 0.01 ? 1 : 0; } // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) // note linked setpos is capped "differently" private LSL_Vector SetPosAdjust(LSL_Vector start, LSL_Vector end) { - if (llVecDist(start, end) > 10.0f * m_ScriptDistanceFactor) - return start + m_ScriptDistanceFactor * 10.0f * llVecNorm(end - start); + if (VecDistSquare(start, end) > m_Script10mDistanceSquare) + return start + m_Script10mDistance * llVecNorm(end - start); else return end; } protected LSL_Vector GetSetPosTarget(SceneObjectPart part, LSL_Vector targetPos, LSL_Vector fromPos, bool adjust) { - if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) - return fromPos; + if (part == null) + return targetPos; + SceneObjectGroup grp = part.ParentGroup; + if (grp == null || grp.IsDeleted || grp.inTransit) + return targetPos; - // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) - - - float ground = World.GetGroundHeight((float)targetPos.x, (float)targetPos.y); - bool disable_underground_movement = m_ScriptEngine.Config.GetBoolean("DisableUndergroundMovement", true); - - if (part.ParentGroup.RootPart == part) - { - if ((targetPos.z < ground) && disable_underground_movement && m_host.ParentGroup.AttachmentPoint == 0) - targetPos.z = ground; - } if (adjust) - return SetPosAdjust(fromPos, targetPos); + targetPos = SetPosAdjust(fromPos, targetPos); + if (m_disable_underground_movement && grp.AttachmentPoint == 0) + { + if (part.IsRoot) + { + float ground = World.GetGroundHeight((float)targetPos.x, (float)targetPos.y); + if ((targetPos.z < ground)) + targetPos.z = ground; + } + } return targetPos; } @@ -2733,20 +2745,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// if TRUE, will cap the distance to 10m. protected void SetPos(SceneObjectPart part, LSL_Vector targetPos, bool adjust) { - if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted || part.ParentGroup.inTransit) + if (part == null) return; - + SceneObjectGroup grp = part.ParentGroup; + if (grp == null || grp.IsDeleted || grp.inTransit) + return; + LSL_Vector currentPos = GetPartLocalPos(part); LSL_Vector toPos = GetSetPosTarget(part, targetPos, currentPos, adjust); - - if (part.ParentGroup.RootPart == part) + if (part.IsRoot) { - SceneObjectGroup parent = part.ParentGroup; - if (!parent.IsAttachment && !World.Permissions.CanObjectEntry(parent, false, (Vector3)toPos)) + if (!grp.IsAttachment && !World.Permissions.CanObjectEntry(grp, false, (Vector3)toPos)) return; - parent.UpdateGroupPosition((Vector3)toPos); + grp.UpdateGroupPosition((Vector3)toPos); } else { @@ -2770,23 +2783,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api protected LSL_Vector GetPartLocalPos(SceneObjectPart part) { - Vector3 pos; - - if (!part.IsRoot) - { - pos = part.OffsetPosition; - } - else + if (part.IsRoot) { if (part.ParentGroup.IsAttachment) pos = part.AttachedPos; else pos = part.AbsolutePosition; } + else + { + pos = part.OffsetPosition; + } -// m_log.DebugFormat("[LSL API]: Returning {0} in GetPartLocalPos()", pos); - + //m_log.DebugFormat("[LSL API]: Returning {0} in GetPartLocalPos()", pos); return new LSL_Vector(pos); } @@ -3521,9 +3531,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (string.IsNullOrEmpty(inventory) || Double.IsNaN(rot.x) || Double.IsNaN(rot.y) || Double.IsNaN(rot.z) || Double.IsNaN(rot.s)) return; - float dist = (float)llVecDist(llGetPos(), pos); - - if (dist > m_ScriptDistanceFactor * 10.0f) + if (VecDistSquare(llGetPos(), pos) > m_Script10mDistanceSquare) return; TaskInventoryItem item = m_host.Inventory.GetInventoryItem(inventory); @@ -3542,7 +3550,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api Util.FireAndForget(x => { - Quaternion wrot = rot; wrot.Normalize(); List new_groups = World.RezObject(m_host, item, pos, wrot, vel, param, atRoot);