From b02f29300d4b060d5d98b6a753e33f556941359e Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Mon, 18 Jan 2016 06:58:41 -0800 Subject: [PATCH 01/12] Code cleanup to terse update sending as given in a patch in Mantis 7813. Thanks tqlion! --- .../Region/Framework/Scenes/ScenePresence.cs | 33 +++++-------------- 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 142d6433c2..fa35691db2 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -3557,31 +3557,16 @@ namespace OpenSim.Region.Framework.Scenes if (Appearance.AvatarSize != m_lastSize) SendAvatarDataToAllAgents(); - if (!IsSatOnObject) + // Send terse position update if not sitting and position, velocity, or rotation + // has changed significantly from last sent update + if (!IsSatOnObject && ( + !Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) + || !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) + || !m_pos.ApproxEquals(m_lastPosition, POSITION_LARGETOLERANCE) + || (!m_pos.ApproxEquals(m_lastPosition, POSITION_SMALLTOLERANCE) && Velocity.LengthSquared() < LOWVELOCITYSQ ) + ) ) { - // this does need to be more complex later - Vector3 vel = Velocity; - Vector3 dpos = m_pos - m_lastPosition; - if( Math.Abs(vel.X - m_lastVelocity.X) > VELOCITY_TOLERANCE || - Math.Abs(vel.Y - m_lastVelocity.Y) > VELOCITY_TOLERANCE || - Math.Abs(vel.Z - m_lastVelocity.Z) > VELOCITY_TOLERANCE || - - Math.Abs(m_bodyRot.X - m_lastRotation.X) > ROTATION_TOLERANCE || - Math.Abs(m_bodyRot.Y - m_lastRotation.Y) > ROTATION_TOLERANCE || - Math.Abs(m_bodyRot.Z - m_lastRotation.Z) > ROTATION_TOLERANCE || - - Math.Abs(dpos.X) > POSITION_LARGETOLERANCE || - Math.Abs(dpos.Y) > POSITION_LARGETOLERANCE || - Math.Abs(dpos.Z) > POSITION_LARGETOLERANCE || - - ( (Math.Abs(dpos.X) > POSITION_SMALLTOLERANCE || - Math.Abs(dpos.Y) > POSITION_SMALLTOLERANCE || - Math.Abs(dpos.Z) > POSITION_SMALLTOLERANCE) - && vel.LengthSquared() < LOWVELOCITYSQ - )) - { - SendTerseUpdateToAllClients(); - } + SendTerseUpdateToAllClients(); } CheckForSignificantMovement(); } From fb57d315386e4560d507f74c78a5a3c5208a5adf Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Mon, 18 Jan 2016 07:00:50 -0800 Subject: [PATCH 02/12] BulletSim: revert avatar stationary testing for having slight velocity. This fix causes drift (Mantis 7813). This revision will rebreak pushing (Mantis 7779) but drifting is bad and pushing will be fixed in future commits. --- .../BulletS/BSActorAvatarMove.cs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSActorAvatarMove.cs b/OpenSim/Region/PhysicsModules/BulletS/BSActorAvatarMove.cs index 12ffacbce1..71cd8792b0 100755 --- a/OpenSim/Region/PhysicsModules/BulletS/BSActorAvatarMove.cs +++ b/OpenSim/Region/PhysicsModules/BulletS/BSActorAvatarMove.cs @@ -117,11 +117,13 @@ public class BSActorAvatarMove : BSActor m_velocityMotor.SetTarget(targ); m_velocityMotor.SetCurrent(vel); m_velocityMotor.Enabled = true; + m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,SetVelocityAndTarget,vel={1}, targ={2}, inTaintTime={3}", + m_controllingPrim.LocalID, vel, targ, inTaintTime); } }); } - // If a hover motor has not been created, create one and start the hovering. + // If a movement motor has not been created, create one and start the hovering. private void ActivateAvatarMove() { if (m_velocityMotor == null) @@ -133,7 +135,7 @@ public class BSActorAvatarMove : BSActor 1f // efficiency ); m_velocityMotor.ErrorZeroThreshold = BSParam.AvatarStopZeroThreshold; - // _velocityMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG so motor will output detail log messages. + // m_velocityMotor.PhysicsScene = m_controllingPrim.PhysScene; // DEBUG DEBUG so motor will output detail log messages. SetVelocityAndTarget(m_controllingPrim.RawVelocity, m_controllingPrim.TargetVelocity, true /* inTaintTime */); m_physicsScene.BeforeStep += Mover; @@ -190,8 +192,14 @@ public class BSActorAvatarMove : BSActor // if colliding with something stationary and we're not doing volume detect . if (!m_controllingPrim.ColliderIsMoving && !m_controllingPrim.ColliderIsVolumeDetect) { - m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,totalForce={1}, vel={2}", /* DEBUG */ - m_controllingPrim.LocalID, m_physicsScene.PE.GetTotalForce(m_controllingPrim.PhysBody), m_controllingPrim.Velocity); /* DEBUG */ + m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,zeroingMotion", m_controllingPrim.LocalID); + m_controllingPrim.IsStationary = true; + m_controllingPrim.ZeroMotion(true /* inTaintTime */); + + /* 20160118 Attempt to not be stationary if some velocity applied. Caused drifting since still can't tell who applied velocity. + * Solution is to make clearer what is causing the added velocity (push or environment) when deciding if stationary. + m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,totalForce={1}, vel={2}", + m_controllingPrim.LocalID, m_physicsScene.PE.GetTotalForce(m_controllingPrim.PhysBody), m_controllingPrim.Velocity); // If velocity is very small, assume it is movement creep and suppress it. // Applying push forces (Character.AddForce) should move the avatar and that is only seen here as velocity. if ( (m_controllingPrim.Velocity.LengthSquared() < BSParam.AvatarStopZeroThresholdSquared) @@ -199,13 +207,14 @@ public class BSActorAvatarMove : BSActor { m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,zeroingMotion", m_controllingPrim.LocalID); m_controllingPrim.IsStationary = true; - m_controllingPrim.ZeroMotion(true /* inTaintTime */); + m_controllingPrim.ZeroMotion(true); } else { m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,not zeroing because velocity={1}", m_controllingPrim.LocalID, m_controllingPrim.Velocity); } + */ } // Standing has more friction on the ground From 35d4298be698d9eb02974a4210c5ace867b0db35 Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Mon, 18 Jan 2016 07:02:48 -0800 Subject: [PATCH 03/12] BulletSim: change method signatures for internal AddForce methods to remove confusion about push forces. The latter is an external, physics engine interface feature (the force parameter has a different unit if pushing vs adding force) and that distinction is not used internally. --- .../BulletS/BSActorMoveToTarget.cs | 2 +- .../PhysicsModules/BulletS/BSActorSetTorque.cs | 2 +- .../Region/PhysicsModules/BulletS/BSCharacter.cs | 8 ++++---- .../Region/PhysicsModules/BulletS/BSDynamics.cs | 4 ++-- .../PhysicsModules/BulletS/BSPhysObject.cs | 6 +++--- OpenSim/Region/PhysicsModules/BulletS/BSPrim.cs | 16 ++++++++++------ 6 files changed, 21 insertions(+), 17 deletions(-) diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSActorMoveToTarget.cs b/OpenSim/Region/PhysicsModules/BulletS/BSActorMoveToTarget.cs index 3db8f2cf25..87cf9729ec 100755 --- a/OpenSim/Region/PhysicsModules/BulletS/BSActorMoveToTarget.cs +++ b/OpenSim/Region/PhysicsModules/BulletS/BSActorMoveToTarget.cs @@ -211,7 +211,7 @@ public class BSActorMoveToTarget : BSActor // Add enough force to overcome the mass of the object addedForce *= m_controllingPrim.Mass; - m_controllingPrim.AddForce(addedForce, false /* pushForce */, true /* inTaintTime */); + m_controllingPrim.AddForce(true /* inTaintTime */, addedForce); } m_physicsScene.DetailLog("{0},BSActorMoveToTarget.Mover3,move,fromPos={1},addedForce={2}", m_controllingPrim.LocalID, origPosition, addedForce); diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSActorSetTorque.cs b/OpenSim/Region/PhysicsModules/BulletS/BSActorSetTorque.cs index a1cf4db95b..0261bcb937 100755 --- a/OpenSim/Region/PhysicsModules/BulletS/BSActorSetTorque.cs +++ b/OpenSim/Region/PhysicsModules/BulletS/BSActorSetTorque.cs @@ -127,7 +127,7 @@ public class BSActorSetTorque : BSActor m_physicsScene.DetailLog("{0},BSActorSetTorque,preStep,force={1}", m_controllingPrim.LocalID, m_controllingPrim.RawTorque); if (m_controllingPrim.PhysBody.HasPhysicalBody) { - m_controllingPrim.AddAngularForce(m_controllingPrim.RawTorque, false, true); + m_controllingPrim.AddAngularForce(true /* inTaintTime */, m_controllingPrim.RawTorque); m_controllingPrim.ActivateIfPhysical(false); } diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs b/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs index ab9cc27e3f..0eb5fbace9 100644 --- a/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs +++ b/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs @@ -457,7 +457,7 @@ public sealed class BSCharacter : BSPhysObject get { return RawVelocity; } set { RawVelocity = value; - OMV.Vector3 vel = RawVelocity; + OMV.Vector3 vel = RawVelocity; DetailLog("{0}: set Velocity = {1}", LocalID, value); @@ -662,10 +662,10 @@ public sealed class BSCharacter : BSPhysObject addForce *= Mass * BSParam.AvatarAddForcePushFactor; DetailLog("{0},BSCharacter.addForce,call,force={1},addForce={2},push={3},mass={4}", LocalID, force, addForce, pushforce, Mass); - AddForce(addForce, pushforce, false); + AddForce(false, addForce); } - public override void AddForce(OMV.Vector3 force, bool pushforce, bool inTaintTime) { + public override void AddForce(bool inTaintTime, OMV.Vector3 force) { if (force.IsFinite()) { OMV.Vector3 addForce = Util.ClampV(force, BSParam.MaxAddForceMagnitude); @@ -692,7 +692,7 @@ public sealed class BSCharacter : BSPhysObject } } - public override void AddAngularForce(OMV.Vector3 force, bool pushforce, bool inTaintTime) { + public override void AddAngularForce(bool inTaintTime, OMV.Vector3 force) { } public override void SetMomentum(OMV.Vector3 momentum) { } diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSDynamics.cs b/OpenSim/Region/PhysicsModules/BulletS/BSDynamics.cs index 0fc55776a4..313c961780 100644 --- a/OpenSim/Region/PhysicsModules/BulletS/BSDynamics.cs +++ b/OpenSim/Region/PhysicsModules/BulletS/BSDynamics.cs @@ -768,7 +768,7 @@ namespace OpenSim.Region.PhysicsModule.BulletS } if ((m_knownChanged & m_knownChangedForce) != 0) - ControllingPrim.AddForce((Vector3)m_knownForce, false /*pushForce*/, true /*inTaintTime*/); + ControllingPrim.AddForce(false /* inTaintTime */, (Vector3)m_knownForce); if ((m_knownChanged & m_knownChangedForceImpulse) != 0) ControllingPrim.AddForceImpulse((Vector3)m_knownForceImpulse, false /*pushforce*/, true /*inTaintTime*/); @@ -784,7 +784,7 @@ namespace OpenSim.Region.PhysicsModule.BulletS if ((m_knownChanged & m_knownChangedRotationalForce) != 0) { - ControllingPrim.AddAngularForce((Vector3)m_knownRotationalForce, false /*pushForce*/, true /*inTaintTime*/); + ControllingPrim.AddAngularForce(true /* inTaintTime */, (Vector3)m_knownRotationalForce); } // If we set one of the values (ie, the physics engine didn't do it) we must force diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSPhysObject.cs b/OpenSim/Region/PhysicsModules/BulletS/BSPhysObject.cs index b50e4cce11..ff6baca149 100755 --- a/OpenSim/Region/PhysicsModules/BulletS/BSPhysObject.cs +++ b/OpenSim/Region/PhysicsModules/BulletS/BSPhysObject.cs @@ -245,10 +245,10 @@ public abstract class BSPhysObject : PhysicsActor public override void AddAngularForce(OMV.Vector3 force, bool pushforce) { - AddAngularForce(force, pushforce, false); + AddAngularForce(false, force); } - public abstract void AddAngularForce(OMV.Vector3 force, bool pushforce, bool inTaintTime); - public abstract void AddForce(OMV.Vector3 force, bool pushforce, bool inTaintTime); + public abstract void AddAngularForce(bool inTaintTime, OMV.Vector3 force); + public abstract void AddForce(bool inTaintTime, OMV.Vector3 force); public abstract OMV.Vector3 ForceRotationalVelocity { get; set; } diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSPrim.cs b/OpenSim/Region/PhysicsModules/BulletS/BSPrim.cs index 1d552ebb4c..fd9b8344f4 100644 --- a/OpenSim/Region/PhysicsModules/BulletS/BSPrim.cs +++ b/OpenSim/Region/PhysicsModules/BulletS/BSPrim.cs @@ -394,7 +394,7 @@ public class BSPrim : BSPhysObject // Apply upforce and overcome gravity. OMV.Vector3 correctionForce = upForce - PhysScene.DefaultGravity; DetailLog("{0},BSPrim.PositionSanityCheck,applyForce,pos={1},upForce={2},correctionForce={3}", LocalID, RawPosition, upForce, correctionForce); - AddForce(correctionForce, false, inTaintTime); + AddForce(inTaintTime, correctionForce); ret = true; } } @@ -1249,14 +1249,18 @@ public class BSPrim : BSPhysObject // Per documentation, max force is limited. OMV.Vector3 addForce = Util.ClampV(force, BSParam.MaxAddForceMagnitude); - // Since this force is being applied in only one step, make this a force per second. - addForce /= PhysScene.LastTimeStep; - AddForce(addForce, pushforce, false /* inTaintTime */); + // Push forces seem to be scaled differently (follow pattern in ubODE) + if (!pushforce) { + // Since this force is being applied in only one step, make this a force per second. + addForce /= PhysScene.LastTimeStep; + } + + AddForce(false /* inTaintTime */, addForce); } // Applying a force just adds this to the total force on the object. // This added force will only last the next simulation tick. - public override void AddForce(OMV.Vector3 force, bool pushforce, bool inTaintTime) { + public override void AddForce(bool inTaintTime, OMV.Vector3 force) { // for an object, doesn't matter if force is a pushforce or not if (IsPhysicallyActive) { @@ -1315,7 +1319,7 @@ public class BSPrim : BSPhysObject } // BSPhysObject.AddAngularForce() - public override void AddAngularForce(OMV.Vector3 force, bool pushforce, bool inTaintTime) + public override void AddAngularForce(bool inTaintTime, OMV.Vector3 force) { if (force.IsFinite()) { From 5ed90b39216cfa2777f390fb8f23a34e07153d56 Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Mon, 18 Jan 2016 10:48:10 -0800 Subject: [PATCH 04/12] BulletSim: fix problem of not zeroing motion when stationary (drift problem from Mantis 7813). Redo Z computations for movement. Clean up code to simplify tests. Add function to suppress stationary tests unless velocity drops. --- .../BulletS/BSActorAvatarMove.cs | 106 +++++++----------- 1 file changed, 40 insertions(+), 66 deletions(-) diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSActorAvatarMove.cs b/OpenSim/Region/PhysicsModules/BulletS/BSActorAvatarMove.cs index 71cd8792b0..35823ae49d 100755 --- a/OpenSim/Region/PhysicsModules/BulletS/BSActorAvatarMove.cs +++ b/OpenSim/Region/PhysicsModules/BulletS/BSActorAvatarMove.cs @@ -47,10 +47,9 @@ public class BSActorAvatarMove : BSActor // The amount the step up is applying. Used to smooth stair walking. float m_lastStepUp; - // Jumping happens over several frames. If use applies up force while colliding, start the - // jump and allow the jump to continue for this number of frames. - int m_jumpFrames = 0; - float m_jumpVelocity = 0f; + // There are times the velocity is set but we don't want to inforce stationary until the + // real velocity drops. + bool m_waitingForLowVelocityForStationary = false; public BSActorAvatarMove(BSScene physicsScene, BSPhysObject pObj, string actorName) : base(physicsScene, pObj, actorName) @@ -117,12 +116,18 @@ public class BSActorAvatarMove : BSActor m_velocityMotor.SetTarget(targ); m_velocityMotor.SetCurrent(vel); m_velocityMotor.Enabled = true; - m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,SetVelocityAndTarget,vel={1}, targ={2}, inTaintTime={3}", - m_controllingPrim.LocalID, vel, targ, inTaintTime); + m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,SetVelocityAndTarget,vel={1}, targ={2}", + m_controllingPrim.LocalID, vel, targ); + m_waitingForLowVelocityForStationary = false; } }); } + public void SuppressStationayCheckUntilLowVelocity() + { + m_waitingForLowVelocityForStationary = true; + } + // If a movement motor has not been created, create one and start the hovering. private void ActivateAvatarMove() { @@ -135,13 +140,14 @@ public class BSActorAvatarMove : BSActor 1f // efficiency ); m_velocityMotor.ErrorZeroThreshold = BSParam.AvatarStopZeroThreshold; - // m_velocityMotor.PhysicsScene = m_controllingPrim.PhysScene; // DEBUG DEBUG so motor will output detail log messages. + m_velocityMotor.PhysicsScene = m_controllingPrim.PhysScene; // DEBUG DEBUG so motor will output detail log messages. SetVelocityAndTarget(m_controllingPrim.RawVelocity, m_controllingPrim.TargetVelocity, true /* inTaintTime */); m_physicsScene.BeforeStep += Mover; m_controllingPrim.OnPreUpdateProperty += Process_OnPreUpdateProperty; m_walkingUpStairs = 0; + m_waitingForLowVelocityForStationary = false; } } @@ -192,29 +198,25 @@ public class BSActorAvatarMove : BSActor // if colliding with something stationary and we're not doing volume detect . if (!m_controllingPrim.ColliderIsMoving && !m_controllingPrim.ColliderIsVolumeDetect) { - m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,zeroingMotion", m_controllingPrim.LocalID); - m_controllingPrim.IsStationary = true; - m_controllingPrim.ZeroMotion(true /* inTaintTime */); - - /* 20160118 Attempt to not be stationary if some velocity applied. Caused drifting since still can't tell who applied velocity. - * Solution is to make clearer what is causing the added velocity (push or environment) when deciding if stationary. - m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,totalForce={1}, vel={2}", - m_controllingPrim.LocalID, m_physicsScene.PE.GetTotalForce(m_controllingPrim.PhysBody), m_controllingPrim.Velocity); - // If velocity is very small, assume it is movement creep and suppress it. - // Applying push forces (Character.AddForce) should move the avatar and that is only seen here as velocity. - if ( (m_controllingPrim.Velocity.LengthSquared() < BSParam.AvatarStopZeroThresholdSquared) - && (m_physicsScene.PE.GetTotalForce(m_controllingPrim.PhysBody).LengthSquared() < BSParam.AvatarStopZeroThresholdSquared) ) + if (m_waitingForLowVelocityForStationary) + { + // if waiting for velocity to drop and it has finally dropped, we can be stationary + if (m_controllingPrim.RawVelocity.LengthSquared() < BSParam.AvatarStopZeroThresholdSquared) + { + m_waitingForLowVelocityForStationary = false; + } + } + if (!m_waitingForLowVelocityForStationary) { m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,zeroingMotion", m_controllingPrim.LocalID); m_controllingPrim.IsStationary = true; - m_controllingPrim.ZeroMotion(true); + m_controllingPrim.ZeroMotion(true /* inTaintTime */); } else { - m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,not zeroing because velocity={1}", - m_controllingPrim.LocalID, m_controllingPrim.Velocity); + m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,waitingForLowVel,rawvel={1}", + m_controllingPrim.LocalID, m_controllingPrim.RawVelocity.Length()); } - */ } // Standing has more friction on the ground @@ -259,50 +261,24 @@ public class BSActorAvatarMove : BSActor m_physicsScene.PE.SetFriction(m_controllingPrim.PhysBody, m_controllingPrim.Friction); } - // If not flying and not colliding, assume falling and keep the downward motion component. - // This check is done here for the next jump test. - if (!m_controllingPrim.Flying && !m_controllingPrim.IsColliding) - { - stepVelocity.Z = m_controllingPrim.RawVelocity.Z; - } + // 'm_velocityMotor is used for walking, flying, and jumping and will thus have the correct values + // for Z. But in come cases it must be over-ridden. Like when falling or jumping. - // Colliding and not flying with an upward force. The avatar must be trying to jump. - if (!m_controllingPrim.Flying && m_controllingPrim.IsColliding && stepVelocity.Z > 0) - { - // We allow the upward force to happen for this many frames. - m_jumpFrames = BSParam.AvatarJumpFrames; - m_jumpVelocity = stepVelocity.Z; - } + float realVelocityZ = m_controllingPrim.RawVelocity.Z; - // The case where the avatar is not colliding and is not flying is special. - // The avatar is either falling or jumping and the user can be applying force to the avatar - // (force in some direction or force up or down). - // If the avatar has negative Z velocity and is not colliding, presume we're falling and keep the velocity. - // If the user is trying to apply upward force but we're not colliding, assume the avatar - // is trying to jump and don't apply the upward force if not touching the ground any more. - if (!m_controllingPrim.Flying && !m_controllingPrim.IsColliding) + // If not flying and falling, we over-ride the stepping motor so we can fall to the ground + if (!m_controllingPrim.Flying && realVelocityZ < 0) { - // If upward velocity is being applied, this must be a jump and only allow that to go on so long - if (m_jumpFrames > 0) + // Can't fall faster than this + if (realVelocityZ < BSParam.AvatarTerminalVelocity) { - // Since not touching the ground, only apply upward force for so long. - m_jumpFrames--; - stepVelocity.Z = m_jumpVelocity; + realVelocityZ = BSParam.AvatarTerminalVelocity; } - else - { - // Since we're not affected by anything, the avatar must be falling and we do not want that to be too fast. - if (m_controllingPrim.RawVelocity.Z < BSParam.AvatarTerminalVelocity) - { - stepVelocity.Z = BSParam.AvatarTerminalVelocity; - } - else - { - stepVelocity.Z = m_controllingPrim.RawVelocity.Z; - } - } - // DetailLog("{0},BSCharacter.MoveMotor,taint,overrideStepZWithWorldZ,stepVel={1}", LocalID, stepVelocity); + + stepVelocity.Z = realVelocityZ; } + // m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,DEBUG,motorCurrent={1},realZ={2},flying={3},collid={4},jFrames={5}", + // m_controllingPrim.LocalID, m_velocityMotor.CurrentValue, realVelocityZ, m_controllingPrim.Flying, m_controllingPrim.IsColliding, m_jumpFrames); //Alicia: Maintain minimum height when flying. // SL has a flying effect that keeps the avatar flying above the ground by some margin @@ -313,6 +289,8 @@ public class BSActorAvatarMove : BSActor if( m_controllingPrim.Position.Z < hover_height) { + m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,addingUpforceForGroundMargin,height={1},hoverHeight={2}", + m_controllingPrim.LocalID, m_controllingPrim.Position.Z, hover_height); stepVelocity.Z += BSParam.AvatarFlyingGroundUpForce; } } @@ -337,11 +315,7 @@ public class BSActorAvatarMove : BSActor if (m_controllingPrim.IsStationary) { entprop.Position = m_controllingPrim.RawPosition; - // Suppress small movement velocity - if (entprop.Velocity.LengthSquared() < BSParam.AvatarStopZeroThresholdSquared) { - m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,OnPreUpdate,zeroing velocity={1}", m_controllingPrim.LocalID, entprop.Velocity); - entprop.Velocity = OMV.Vector3.Zero; - } + entprop.Velocity = OMV.Vector3.Zero; m_physicsScene.PE.SetTranslation(m_controllingPrim.PhysBody, entprop.Position, entprop.Rotation); } From ddd59fab5ff7a68b0cc208326e6a5602290a0efe Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Mon, 18 Jan 2016 10:50:28 -0800 Subject: [PATCH 05/12] BulletSim: add stationary suppression on AddForce application. This enables small pushing of avatars (Mantis 7779). --- OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs b/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs index 0eb5fbace9..4b75e32db6 100644 --- a/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs +++ b/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs @@ -683,6 +683,10 @@ public sealed class BSCharacter : BSPhysObject PhysScene.PE.ApplyCentralForce(PhysBody, addForce); PhysScene.PE.Activate(PhysBody, true); } + if (m_moveActor != null) + { + m_moveActor.SuppressStationayCheckUntilLowVelocity(); + } }); } else From 33af41905021e6ab2e51873a75b585044e445974 Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Tue, 19 Jan 2016 22:09:51 -0800 Subject: [PATCH 06/12] BulletSim: make collision sounds work most of the time. Seems that collisions usually stop the collider so velocity is often small. Also remove some chatty debug messages. --- .../PhysicsModules/BulletS/BSActorAvatarMove.cs | 2 +- OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs | 1 + OpenSim/Region/PhysicsModules/BulletS/BSPhysObject.cs | 11 +++++++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSActorAvatarMove.cs b/OpenSim/Region/PhysicsModules/BulletS/BSActorAvatarMove.cs index 35823ae49d..79ee00f4ca 100755 --- a/OpenSim/Region/PhysicsModules/BulletS/BSActorAvatarMove.cs +++ b/OpenSim/Region/PhysicsModules/BulletS/BSActorAvatarMove.cs @@ -140,7 +140,7 @@ public class BSActorAvatarMove : BSActor 1f // efficiency ); m_velocityMotor.ErrorZeroThreshold = BSParam.AvatarStopZeroThreshold; - m_velocityMotor.PhysicsScene = m_controllingPrim.PhysScene; // DEBUG DEBUG so motor will output detail log messages. + // m_velocityMotor.PhysicsScene = m_controllingPrim.PhysScene; // DEBUG DEBUG so motor will output detail log messages. SetVelocityAndTarget(m_controllingPrim.RawVelocity, m_controllingPrim.TargetVelocity, true /* inTaintTime */); m_physicsScene.BeforeStep += Mover; diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs b/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs index 4b75e32db6..6d5589fd9b 100644 --- a/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs +++ b/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs @@ -89,6 +89,7 @@ public sealed class BSCharacter : BSPhysObject _buoyancy = ComputeBuoyancyFromFlying(isFlying); Friction = BSParam.AvatarStandingFriction; Density = BSParam.AvatarDensity; + _isPhysical = true; // Old versions of ScenePresence passed only the height. If width and/or depth are zero, // replace with the default values. diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSPhysObject.cs b/OpenSim/Region/PhysicsModules/BulletS/BSPhysObject.cs index ff6baca149..a70d1b80da 100755 --- a/OpenSim/Region/PhysicsModules/BulletS/BSPhysObject.cs +++ b/OpenSim/Region/PhysicsModules/BulletS/BSPhysObject.cs @@ -505,17 +505,20 @@ public abstract class BSPhysObject : PhysicsActor // Collision sound requires a velocity to know it should happen. This is a lot of computation for a little used feature. OMV.Vector3 relvel = OMV.Vector3.Zero; if (IsPhysical) - relvel = Velocity; + relvel = RawVelocity; if (collidee != null && collidee.IsPhysical) - relvel -= collidee.Velocity; + relvel -= collidee.RawVelocity; newContact.RelativeSpeed = OMV.Vector3.Dot(relvel, contactNormal); + // DetailLog("{0},{1}.Collision.AddCollider,vel={2},contee.vel={3},relvel={4},relspeed={5}", + // LocalID, TypeName, RawVelocity, (collidee == null ? OMV.Vector3.Zero : collidee.RawVelocity), relvel, newContact.RelativeSpeed); lock (PhysScene.CollisionLock) { CollisionCollection.AddCollider(collideeLocalID, newContact); } - DetailLog("{0},{1}.Collision.AddCollider,call,with={2},point={3},normal={4},depth={5},colliderMoving={6}", - LocalID, TypeName, collideeLocalID, contactPoint, contactNormal, pentrationDepth, ColliderIsMoving); + DetailLog("{0},{1}.Collision.AddCollider,call,with={2},point={3},normal={4},depth={5},speed={6},colliderMoving={7}", + LocalID, TypeName, collideeLocalID, contactPoint, contactNormal, pentrationDepth, + newContact.RelativeSpeed, ColliderIsMoving); ret = true; } From 66be75556be0a36bca1d513ee105d4d38f31a72a Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Wed, 20 Jan 2016 06:35:53 -0800 Subject: [PATCH 07/12] BulletSim: increase default value of AvatarStopZeroThreshold as this reduces the occurance of stopped avatar drifting in the viewer. Not sure why but this is a short term fix while investigation continues. --- OpenSim/Region/PhysicsModules/BulletS/BSParam.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSParam.cs b/OpenSim/Region/PhysicsModules/BulletS/BSParam.cs index aea69d7061..389a4418b7 100755 --- a/OpenSim/Region/PhysicsModules/BulletS/BSParam.cs +++ b/OpenSim/Region/PhysicsModules/BulletS/BSParam.cs @@ -633,7 +633,7 @@ public static class BSParam new ParameterDefn("AvatarAddForcePushFactor", "BSCharacter.AddForce is multiplied by this and mass to be like other physics engines", 0.315f ), new ParameterDefn("AvatarStopZeroThreshold", "Movement velocity below which avatar is assumed to be stopped", - 0.1f, + 0.4f, (s) => { return (float)AvatarStopZeroThreshold; }, (s,v) => { AvatarStopZeroThreshold = v; AvatarStopZeroThresholdSquared = v * v; } ), new ParameterDefn("AvatarBelowGroundUpCorrectionMeters", "Meters to move avatar up if it seems to be below ground", From 109723dc2df4c6f7fc0309911eb2d99988713431 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Tue, 26 Jan 2016 20:39:37 +0000 Subject: [PATCH 08/12] add option MaxRegionsViewDistance to control the maximum range to tell viewer to connect to Neighbour regions, since that is diferent from view range --- .../EntityTransfer/EntityTransferModule.cs | 8 ++-- OpenSim/Region/Framework/Scenes/Scene.cs | 7 ++++ .../Region/Framework/Scenes/ScenePresence.cs | 40 +++++++++++++++++-- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 18bd5e5bbc..e5d725c7e7 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -801,7 +801,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer int newSizeX = finalDestination.RegionSizeX; int newSizeY = finalDestination.RegionSizeY; - bool OutSideViewRange = NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, + bool OutSideViewRange = NeedsNewAgent(sp.RegionViewDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, oldSizeX, oldSizeY, newSizeX, newSizeY); if (OutSideViewRange) @@ -1338,7 +1338,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // This returns 'true' if the new region already has a child agent for our // incoming agent. The implication is that, if 'false', we have to create the // child and then teleport into the region. - protected virtual bool NeedsNewAgent(float drawdist, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, + protected virtual bool NeedsNewAgent(float viewdist, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY, int oldsizeX, int oldsizeY, int newsizeX, int newsizeY) { if (m_regionCombinerModule != null && m_regionCombinerModule.IsRootForMegaregion(Scene.RegionInfo.RegionID)) @@ -1353,7 +1353,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return !(newRegionX >= swCorner.X && newRegionX <= neCorner.X && newRegionY >= swCorner.Y && newRegionY <= neCorner.Y); } - return Util.IsOutsideView(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY, + return Util.IsOutsideView(viewdist, oldRegionX, newRegionX, oldRegionY, newRegionY, oldsizeX, oldsizeY, newsizeX, newsizeY); } @@ -2449,7 +2449,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer // view to include everything in the megaregion if (m_regionCombinerModule == null || !m_regionCombinerModule.IsRootForMegaregion(Scene.RegionInfo.RegionID)) { - uint dd = (uint)avatar.DrawDistance; + uint dd = (uint)avatar.RegionViewDistance; // until avatar movement updates client connections, we need to seend at least this current region imediate Neighbors uint ddX = Math.Max(dd, Constants.RegionSize); diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 5799cd4819..acffd4acc8 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -296,6 +296,12 @@ namespace OpenSim.Region.Framework.Scenes get { return m_maxDrawDistance; } } + protected float m_maxRegionViewDistance = 255f; + public float MaxRegionViewDistance + { + get { return m_maxRegionViewDistance; } + } + private List m_AllowedViewers = new List(); private List m_BannedViewers = new List(); @@ -972,6 +978,7 @@ namespace OpenSim.Region.Framework.Scenes m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance", m_defaultDrawDistance); m_maxDrawDistance = startupConfig.GetFloat("MaxDrawDistance", m_maxDrawDistance); + m_maxRegionViewDistance = startupConfig.GetFloat("MaxRegionsViewDistance", m_maxRegionViewDistance); LegacySitOffsets = startupConfig.GetBoolean("LegacyOpenSimSitOffsets", LegacySitOffsets); diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index fa35691db2..7f0ab3f3b4 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -583,6 +583,14 @@ namespace OpenSim.Region.Framework.Scenes } } + public float RegionViewDistance + { + get + { + return Util.Clamp(m_drawDistance, 32f, m_scene.MaxRegionViewDistance); + } + } + public bool AllowMovement { get; set; } private bool m_setAlwaysRun; @@ -3566,7 +3574,33 @@ namespace OpenSim.Region.Framework.Scenes || (!m_pos.ApproxEquals(m_lastPosition, POSITION_SMALLTOLERANCE) && Velocity.LengthSquared() < LOWVELOCITYSQ ) ) ) { - SendTerseUpdateToAllClients(); +/* + if (!IsSatOnObject) + { + // this does need to be more complex later + Vector3 vel = Velocity; + Vector3 dpos = m_pos - m_lastPosition; + if( Math.Abs(vel.X - m_lastVelocity.X) > VELOCITY_TOLERANCE || + Math.Abs(vel.Y - m_lastVelocity.Y) > VELOCITY_TOLERANCE || + Math.Abs(vel.Z - m_lastVelocity.Z) > VELOCITY_TOLERANCE || + + Math.Abs(m_bodyRot.X - m_lastRotation.X) > ROTATION_TOLERANCE || + Math.Abs(m_bodyRot.Y - m_lastRotation.Y) > ROTATION_TOLERANCE || + Math.Abs(m_bodyRot.Z - m_lastRotation.Z) > ROTATION_TOLERANCE || + + Math.Abs(dpos.X) > POSITION_LARGETOLERANCE || + Math.Abs(dpos.Y) > POSITION_LARGETOLERANCE || + Math.Abs(dpos.Z) > POSITION_LARGETOLERANCE || + + ( (Math.Abs(dpos.X) > POSITION_SMALLTOLERANCE || + Math.Abs(dpos.Y) > POSITION_SMALLTOLERANCE || + Math.Abs(dpos.Z) > POSITION_SMALLTOLERANCE) + && vel.LengthSquared() < LOWVELOCITYSQ + )) + { +*/ + SendTerseUpdateToAllClients(); +// } } CheckForSignificantMovement(); } @@ -4184,7 +4218,7 @@ namespace OpenSim.Region.Framework.Scenes // m_log.Debug("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX))); // m_log.Debug("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY))); - if (Util.IsOutsideView(DrawDistance, x, newRegionX, y, newRegionY, + if (Util.IsOutsideView(RegionViewDistance, x, newRegionX, y, newRegionY, regInfo.sizeX, regInfo.sizeY, newRegionSizeX, newRegionSizeY)) { byebyeRegions.Add(handle); @@ -4195,7 +4229,7 @@ namespace OpenSim.Region.Framework.Scenes } else { - if (Util.IsOutsideView(DrawDistance, x, newRegionX, y, newRegionY, + if (Util.IsOutsideView(RegionViewDistance, x, newRegionX, y, newRegionY, (int)Constants.RegionSize, (int)Constants.RegionSize, newRegionSizeX, newRegionSizeY)) { byebyeRegions.Add(handle); From 8981cba137e6eea28f7a1e8f60e21ae8cad1b67b Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Tue, 26 Jan 2016 20:52:09 +0000 Subject: [PATCH 09/12] update OpenSimDefaults.ini --- bin/OpenSimDefaults.ini | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 84e029b6d0..725ce5789e 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -161,13 +161,19 @@ ; Warning! Don't use this with regions that have existing content!, This will likely break them CombineContiguousRegions = false - ; Extend the region's draw distance; 255m is the default which includes - ; one neighbor on each side of the current region, 767m would go three - ; neighbors on each side for a total of 49 regions in view. Warning, unless - ; all the regions have the same drawdistance, you will end up with strange - ; effects because the agents that get closed may be inconsistent. + ; the default view range. Viewers override this ( no major effect still ) DefaultDrawDistance = 255.0 + ; limit the maximum view range ( no effect still (does limit MaxRegionsViewDistance) ) + MaxDrawDistance = 512 + + ; the maximum distance to tell a viewer to connect to a neighbour region, so it can be seen + ; (it is limited by MaxDrawDistance above) + ; less than 256 shows imediate neighbours; 512 also second imediate neighbours etc + ; more than 512m can cause viewers problems specially in case of dense regions. + ; curretly this distance is from current region borders. + MaxRegionsViewDistance = 255 + ; If you have only one region in an instance, or to avoid the many bugs ; that you can trigger in modules by restarting a region, set this to ; true to make the entire instance exit instead of restarting the region. From 668ff1e12ca4096f82fab919ced7e04b03ba08f2 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Tue, 26 Jan 2016 20:55:00 +0000 Subject: [PATCH 10/12] make sure MaxRegionsViewDistance is lower than MaxDrawDistance --- OpenSim/Region/Framework/Scenes/Scene.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index acffd4acc8..ec74297ae5 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -985,6 +985,9 @@ namespace OpenSim.Region.Framework.Scenes if (m_defaultDrawDistance > m_maxDrawDistance) m_defaultDrawDistance = m_maxDrawDistance; + if (m_maxRegionViewDistance > m_maxDrawDistance) + m_maxRegionViewDistance = m_maxDrawDistance; + UseBackup = startupConfig.GetBoolean("UseSceneBackup", UseBackup); if (!UseBackup) m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName); From b34652e9eb109ab280610925716b40d40882bf59 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Tue, 26 Jan 2016 21:42:46 +0000 Subject: [PATCH 11/12] accept mantis 7785 requests, at least until bullet can be also be used fix landing height. (could not test) --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 7f0ab3f3b4..b281e5f12f 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -5792,8 +5792,8 @@ namespace OpenSim.Region.Framework.Scenes return true; // respect region owner and managers - if(m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_uuid)) - return true; +// if(m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_uuid)) +// return true; if (!m_scene.RegionInfo.EstateSettings.AllowDirectTeleport) { @@ -5823,8 +5823,9 @@ namespace OpenSim.Region.Framework.Scenes || (m_teleportFlags & adicionalLandPointFlags) != 0) { if (land.LandData.LandingType == (byte)LandingType.LandingPoint && - land.LandData.UserLocation != Vector3.Zero && - land.LandData.OwnerID != m_uuid ) + land.LandData.UserLocation != Vector3.Zero ) + // && + // land.LandData.OwnerID != m_uuid ) { pos = land.LandData.UserLocation; if(land.LandData.UserLookAt != Vector3.Zero) From 170acd7d67b48416a17ed959968b1173e389058b Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 30 Jan 2016 15:42:59 +0000 Subject: [PATCH 12/12] change parcel_owner_is_god configuration option from default from true to false, leaving only region_owner true by default --- .../Region/CoreModules/World/Permissions/PermissionsModule.cs | 2 +- bin/OpenSim.ini.example | 4 ++-- bin/OpenSimDefaults.ini | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index 2813acbb9b..b1005f7afb 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs @@ -179,7 +179,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions m_RegionManagerIsGod = Util.GetConfigVarFromSections(config, "region_manager_is_god", new string[] { "Startup", "Permissions" }, false); m_ParcelOwnerIsGod = Util.GetConfigVarFromSections(config, "parcel_owner_is_god", - new string[] { "Startup", "Permissions" }, true); + new string[] { "Startup", "Permissions" }, false); m_SimpleBuildPermissions = Util.GetConfigVarFromSections(config, "simple_build_permissions", new string[] { "Startup", "Permissions" }, false); diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 8f5dcef7db..f8c05063c7 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -400,9 +400,9 @@ ;; Allow region managers to assume god powers in regions they manage ; region_manager_is_god = false - ;# {parcel_owner_is_god} {} {Allow parcel owner gods} {true false} true + ;# {parcel_owner_is_god} {} {Allow parcel owner gods} {true false} false ;; Allow parcel owners to assume god powers in their parcels - ; parcel_owner_is_god = true + ; parcel_owner_is_god = false ;# {simple_build_permissions} {} {Allow building in parcel by access list (no groups)} {true false} false ;; More control over permissions diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 725ce5789e..f09d2a16e2 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -418,7 +418,7 @@ ; please note that this still doesn't duplicate SL, and is not intended to ;region_owner_is_god = true ;region_manager_is_god = false - ;parcel_owner_is_god = true + ;parcel_owner_is_god = false ; Control user types that are allowed to create new scripts ; Only enforced if serviceside_object_permissions is true