From 76239602b48d660b8735d9f2a07ec01aa08584ee Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 25 Jul 2016 00:51:37 +0100 Subject: [PATCH] change avatar Health, from bad penetration depth to relative velocity --- .../Region/Framework/Scenes/ScenePresence.cs | 182 +++++++++--------- 1 file changed, 90 insertions(+), 92 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index f20d06523a..8618a664a8 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -277,6 +277,7 @@ namespace OpenSim.Region.Framework.Scenes private Quaternion m_lastRotation; private Vector3 m_lastVelocity; private Vector3 m_lastSize = new Vector3(0.45f,0.6f,1.9f); + private bool SentInitialData = false; private bool m_followCamAuto = false; @@ -1073,6 +1074,8 @@ namespace OpenSim.Region.Framework.Scenes } + private float lastHealthSent = 0; + private void RegionHeartbeatEnd(Scene scene) { if (IsChildAgent) @@ -1095,7 +1098,24 @@ namespace OpenSim.Region.Framework.Scenes } else { - m_scene.EventManager.OnRegionHeartbeatEnd -= RegionHeartbeatEnd; +// m_scene.EventManager.OnRegionHeartbeatEnd -= RegionHeartbeatEnd; + } + } + + if(Health != 100.0f) + { + float last = Health; + Health += 0.05f; + if(Health > 100.0f) + { + Health = 100.0f; + lastHealthSent = Health; + ControllingClient.SendHealth(Health); + } + else if(Math.Abs(Health - lastHealthSent) > 1.0) + { + lastHealthSent = Health; + ControllingClient.SendHealth(Health); } } } @@ -3758,6 +3778,7 @@ namespace OpenSim.Region.Framework.Scenes public void SendInitialDataToMe() { // Send all scene object to the new client + SentInitialData = true; Util.FireAndForget(delegate { // we created a new ScenePresence (a new child agent) in a fresh region. @@ -3993,6 +4014,12 @@ namespace OpenSim.Region.Framework.Scenes if(IsDeleted || !ControllingClient.IsActive) return; + if(!SentInitialData) + { + SendInitialDataToMe(); + return; + } + if(m_reprioritizationBusy) return; @@ -4667,18 +4694,19 @@ namespace OpenSim.Region.Framework.Scenes /// public void PhysicsCollisionUpdate(EventArgs e) { - if (IsChildAgent || Animator == null) + if (IsChildAgent) return; if(IsInTransit) return; + //if ((Math.Abs(Velocity.X) > 0.1e-9f) || (Math.Abs(Velocity.Y) > 0.1e-9f)) // The Physics Scene will send updates every 500 ms grep: PhysicsActor.SubscribeEvents( // as of this comment the interval is set in AddToPhysicalScene // if (m_updateCount > 0) // { - if (Animator.UpdateMovementAnimations()) + if (Animator != null && Animator.UpdateMovementAnimations()) TriggerScenePresenceUpdated(); // m_updateCount--; // } @@ -4686,7 +4714,6 @@ namespace OpenSim.Region.Framework.Scenes CollisionEventUpdate collisionData = (CollisionEventUpdate)e; Dictionary coldata = collisionData.m_objCollisionList; - // // No collisions at all means we may be flying. Update always // // to make falling work // if (m_lastColCount != coldata.Count || coldata.Count == 0) @@ -4697,42 +4724,24 @@ namespace OpenSim.Region.Framework.Scenes if (coldata.Count != 0) { -/* - switch (Animator.CurrentMovementAnimation) + ContactPoint lowest; + lowest.SurfaceNormal = Vector3.Zero; + lowest.Position = Vector3.Zero; + lowest.Position.Z = float.MaxValue; + + foreach (ContactPoint contact in coldata.Values) { - case "STAND": - case "WALK": - case "RUN": - case "CROUCH": - case "CROUCHWALK": - { - */ - ContactPoint lowest; - lowest.SurfaceNormal = Vector3.Zero; - lowest.Position = Vector3.Zero; - lowest.Position.Z = float.MaxValue; - - foreach (ContactPoint contact in coldata.Values) - { - - if (contact.CharacterFeet && contact.Position.Z < lowest.Position.Z) - { - lowest = contact; - } - } - - if (lowest.Position.Z != float.MaxValue) - { - lowest.SurfaceNormal = -lowest.SurfaceNormal; - CollisionPlane = new Vector4(lowest.SurfaceNormal, Vector3.Dot(lowest.Position, lowest.SurfaceNormal)); - } - else - CollisionPlane = Vector4.UnitW; -/* - } - break; + if (contact.CharacterFeet && contact.Position.Z < lowest.Position.Z) + lowest = contact; } -*/ + + if (lowest.Position.Z != float.MaxValue) + { + lowest.SurfaceNormal = -lowest.SurfaceNormal; + CollisionPlane = new Vector4(lowest.SurfaceNormal, Vector3.Dot(lowest.Position, lowest.SurfaceNormal)); + } + else + CollisionPlane = Vector4.UnitW; } else CollisionPlane = Vector4.UnitW; @@ -4745,73 +4754,62 @@ namespace OpenSim.Region.Framework.Scenes // The following may be better in the ICombatModule // probably tweaking of the values for ground and normal prim collisions will be needed - float starthealth = Health; - uint killerObj = 0; - SceneObjectPart part = null; - foreach (uint localid in coldata.Keys) + float startHealth = Health; + if(coldata.Count > 0) { - if (localid == 0) + uint killerObj = 0; + SceneObjectPart part = null; + float rvel; // relative velocity, negative on approch + foreach (uint localid in coldata.Keys) { - part = null; - } - else - { - part = Scene.GetSceneObjectPart(localid); - } - if (part != null) - { - // Ignore if it has been deleted or volume detect - if (!part.ParentGroup.IsDeleted && !part.ParentGroup.IsVolumeDetect) + if (localid == 0) { - if (part.ParentGroup.Damage > 0.0f) + // 0 is the ground + rvel = coldata[0].RelativeSpeed; + if(rvel < -5.0f) + Health -= 0.01f * rvel * rvel; + } + else + { + part = Scene.GetSceneObjectPart(localid); + + if(part != null && !part.ParentGroup.IsDeleted && !part.ParentGroup.IsVolumeDetect) { - // Something with damage... - Health -= part.ParentGroup.Damage; - part.ParentGroup.Scene.DeleteSceneObject(part.ParentGroup, false); - } - else - { - // An ordinary prim - if (coldata[localid].PenetrationDepth >= 0.10f) - Health -= coldata[localid].PenetrationDepth * 5.0f; + if (part.ParentGroup.Damage > 0.0f) + { + // Something with damage... + Health -= part.ParentGroup.Damage; + part.ParentGroup.Scene.DeleteSceneObject(part.ParentGroup, false); + } + else + { + // An ordinary prim + rvel = coldata[localid].RelativeSpeed; + if(rvel < -5.0f) + { + Health -= 0.005f * rvel * rvel;; + } + } } } - } - else - { - // 0 is the ground - // what about collisions with other avatars? - if (localid == 0 && coldata[localid].PenetrationDepth >= 0.10f) - Health -= coldata[localid].PenetrationDepth * 5.0f; + + if (Health <= 0.0f) + { + if (localid != 0) + killerObj = localid; + } } - - if (Health <= 0.0f) - { - if (localid != 0) - killerObj = localid; - } - //m_log.Debug("[AVATAR]: Collision with localid: " + localid.ToString() + " at depth: " + coldata[localid].ToString()); - } - //Health = 100; - if (!Invulnerable) - { - if (starthealth != Health) - { - ControllingClient.SendHealth(Health); - } if (Health <= 0) { - m_scene.EventManager.TriggerAvatarKill(killerObj, this); - } - if (starthealth == Health && Health < 100.0f) - { - Health += 0.03f; - if (Health > 100.0f) - Health = 100.0f; ControllingClient.SendHealth(Health); + m_scene.EventManager.TriggerAvatarKill(killerObj, this); + return; } } + + if(Math.Abs(Health - startHealth) > 1.0) + ControllingClient.SendHealth(Health); } public void setHealthWithUpdate(float health)