diff --git a/Subsurface/Content/Characters/Human/human.xml b/Subsurface/Content/Characters/Human/human.xml index bf5391794..4388d847d 100644 --- a/Subsurface/Content/Characters/Human/human.xml +++ b/Subsurface/Content/Characters/Human/human.xml @@ -9,6 +9,9 @@ movementlerp="0.4" legtorque="15.0" thightorque="-5.0"> + + + @@ -76,10 +79,6 @@ - - - - diff --git a/Subsurface/Source/Characters/AI/AIController.cs b/Subsurface/Source/Characters/AI/AIController.cs index 33ed0c084..a909e4e31 100644 --- a/Subsurface/Source/Characters/AI/AIController.cs +++ b/Subsurface/Source/Characters/AI/AIController.cs @@ -41,7 +41,7 @@ namespace Barotrauma public Vector2 Velocity { - get { return Character.AnimController.RefLimb.LinearVelocity; } + get { return Character.AnimController.Collider.LinearVelocity; } } public AiState State diff --git a/Subsurface/Source/Characters/AI/IndoorsSteeringManager.cs b/Subsurface/Source/Characters/AI/IndoorsSteeringManager.cs index 368bbaf53..928487bd9 100644 --- a/Subsurface/Source/Characters/AI/IndoorsSteeringManager.cs +++ b/Subsurface/Source/Characters/AI/IndoorsSteeringManager.cs @@ -139,13 +139,12 @@ namespace Barotrauma } } - //currentPath.CheckProgress(pos, allowedDistance); - var collider = character.AnimController.GetLimb(LimbType.Collider); - Vector2 colliderBottom = character.AnimController.GetColliderBottom(); + var collider = character.AnimController.Collider; - if (Math.Abs(collider.SimPosition.X - currentPath.CurrentNode.SimPosition.X) < collider.body.radius*2 && + Vector2 colliderBottom = character.AnimController.GetColliderBottom(); + if (Math.Abs(collider.SimPosition.X - currentPath.CurrentNode.SimPosition.X) < collider.radius*2 && currentPath.CurrentNode.SimPosition.Y > colliderBottom.Y && - currentPath.CurrentNode.SimPosition.Y < colliderBottom.Y + collider.body.height + collider.body.radius*2) + currentPath.CurrentNode.SimPosition.Y < colliderBottom.Y + collider.height + collider.radius*2) { currentPath.SkipToNextNode(); } diff --git a/Subsurface/Source/Characters/Animation/FishAnimController.cs b/Subsurface/Source/Characters/Animation/FishAnimController.cs index 9849bf52b..ef06e64e3 100644 --- a/Subsurface/Source/Characters/Animation/FishAnimController.cs +++ b/Subsurface/Source/Characters/Animation/FishAnimController.cs @@ -73,7 +73,7 @@ namespace Barotrauma } else { - if (inWater || RefLimb.inWater) + if (inWater)// || RefLimb.inWater) { UpdateSineAnim(deltaTime); } @@ -224,25 +224,27 @@ namespace Barotrauma void UpdateSimpleAnim() { - movement = MathUtils.SmoothStep(movement, TargetMovement*swimSpeed, 1.0f); - if (movement == Vector2.Zero) return; + //todo: reimplement - float movementAngle = MathUtils.VectorToAngle(movement) - MathHelper.PiOver2; + //movement = MathUtils.SmoothStep(movement, TargetMovement*swimSpeed, 1.0f); + //if (movement == Vector2.Zero) return; + + //float movementAngle = MathUtils.VectorToAngle(movement) - MathHelper.PiOver2; - RefLimb.body.SmoothRotate( - (rotateTowardsMovement) ? - RefLimb.body.Rotation + MathUtils.GetShortestAngle(RefLimb.body.Rotation, movementAngle) : - HeadAngle*Dir); + //RefLimb.body.SmoothRotate( + // (rotateTowardsMovement) ? + // RefLimb.body.Rotation + MathUtils.GetShortestAngle(RefLimb.body.Rotation, movementAngle) : + // HeadAngle*Dir); - RefLimb.body.LinearVelocity = movement; + //collider.LinearVelocity = movement; - //RefLimb.body.SmoothRotate(0.0f); + ////RefLimb.body.SmoothRotate(0.0f); - foreach (Limb l in Limbs) - { - if (l == RefLimb) continue; - l.body.SetTransform(RefLimb.SimPosition, RefLimb.Rotation); - } + //foreach (Limb l in Limbs) + //{ + // if (l == RefLimb) continue; + // l.body.SetTransform(RefLimb.SimPosition, RefLimb.Rotation); + //} } void UpdateWalkAnim(float deltaTime) @@ -344,7 +346,7 @@ namespace Barotrauma if (Math.Abs(colliderPos.Y - floorY) < colliderHeight * 1.2f) { - colliderLimb.Move(new Vector2(colliderPos.X + movement.X * 0.2f, floorY + colliderHeight), 5.0f); + colliderLimb.MoveToPos(new Vector2(colliderPos.X + movement.X * 0.2f, floorY + colliderHeight), 5.0f); } float walkCycleSpeed = head.LinearVelocity.X * 0.05f; @@ -373,14 +375,14 @@ namespace Barotrauma if (limb.type == LimbType.LeftFoot) { - limb.Move(footPos +new Vector2( + limb.MoveToPos(footPos +new Vector2( transformedStepSize.X + movement.X * 0.1f, (transformedStepSize.Y > 0.0f) ? transformedStepSize.Y : 0.0f), 8.0f); } else if (limb.type == LimbType.RightFoot) { - limb.Move(footPos +new Vector2( + limb.MoveToPos(footPos +new Vector2( -transformedStepSize.X + movement.X * 0.1f, (-transformedStepSize.Y > 0.0f) ? -transformedStepSize.Y : 0.0f), 8.0f); diff --git a/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs b/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs index ee0e30f7b..a3b8e6118 100644 --- a/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs +++ b/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs @@ -63,11 +63,10 @@ namespace Barotrauma { if (character.IsDead || Frozen || character.IsUnconscious || stunTimer > 0.0f) { - collider.Disabled = true; - collider.body.PhysEnabled = false; + collider.PhysEnabled = false; - var lowestLimb = FindLowestLimb(true); - collider.body.SetTransform(GetLimb(LimbType.Torso).SimPosition, 0.0f); + var lowestLimb = FindLowestLimb(); + collider.SetTransform(GetLimb(LimbType.Torso).SimPosition, 0.0f); if (stunTimer > 0) { @@ -77,7 +76,14 @@ namespace Barotrauma return; } - if (collider == null) return; + + //stun (= disable the animations) if the ragdoll receives a large enough impact + if (strongestImpact > 0.0f) + { + character.StartStun(MathHelper.Min(strongestImpact * 0.5f, 5.0f)); + strongestImpact = 0.0f; + return; + } //if (inWater) stairs = null; @@ -153,8 +159,8 @@ namespace Barotrauma bool onStairs = stairs != null; stairs = null; - var contacts = collider.body.FarseerBody.ContactList; - while (collider.body.PhysEnabled && contacts != null && contacts.Contact != null) + var contacts = collider.FarseerBody.ContactList; + while (collider.FarseerBody.Enabled && contacts != null && contacts.Contact != null) { if (contacts.Contact.Enabled && contacts.Contact.IsTouching) { @@ -219,18 +225,13 @@ namespace Barotrauma onFloorTimer -= deltaTime; } - //stun (= disable the animations) if the ragdoll receives a large enough impact - if (strongestImpact > 0.0f) - { - character.StartStun(MathHelper.Min(strongestImpact * 0.5f, 5.0f)); - } - strongestImpact = 0.0f; - if (collider.Disabled && !swimming) + //re-enable collider (unless swimming) + if (!collider.FarseerBody.Enabled && !swimming) { - var lowestLimb = FindLowestLimb(true); - collider.body.SetTransform(lowestLimb.SimPosition + Vector2.UnitY * (collider.body.radius + collider.body.height / 2), 0.0f); - collider.Disabled = false; + var lowestLimb = FindLowestLimb(); + collider.SetTransform(lowestLimb.SimPosition + Vector2.UnitY * (collider.radius + collider.height / 2), 0.0f); + collider.FarseerBody.Enabled = true; } if (character.LockHands) @@ -274,12 +275,8 @@ namespace Barotrauma UpdateStandingSimple(); return; } - - - collider.body.PhysEnabled = true; - collider.body.Enabled = true; - + switch (Anim) { case Animation.Climbing: @@ -324,7 +321,6 @@ namespace Barotrauma foreach (Limb limb in Limbs) { - if (limb == collider) continue; limb.Disabled = false; } @@ -430,7 +426,7 @@ namespace Barotrauma if (onGround) { - collider.body.LinearVelocity = new Vector2( + collider.LinearVelocity = new Vector2( movement.X * 1.5f, collider.LinearVelocity.Y > 0.0f ? collider.LinearVelocity.Y * 0.5f : collider.LinearVelocity.Y); } @@ -483,7 +479,6 @@ namespace Barotrauma foreach (Limb limb in Limbs) { - if (limb == collider) continue; MoveLimb(limb, limb.SimPosition+move, 15.0f, true); } @@ -635,9 +630,8 @@ namespace Barotrauma Limb head = GetLimb(LimbType.Head); Limb torso = GetLimb(LimbType.Torso); - collider.body.PhysEnabled = false; - collider.Disabled = true; - collider.body.SetTransform(torso.SimPosition, 0.0f); + collider.FarseerBody.Enabled = false; + collider.SetTransform(torso.SimPosition, 0.0f); if (currentHull != null && (currentHull.Rect.Y - currentHull.Surface > 50.0f) && !head.inWater) { @@ -856,9 +850,8 @@ namespace Barotrauma MoveLimb(torso, new Vector2(ladderSimPos.X - 0.27f * Dir, collider.SimPosition.Y+0.5f), 10.5f); MoveLimb(waist, new Vector2(ladderSimPos.X - 0.35f * Dir, collider.SimPosition.Y+0.4f), 10.5f); - - MoveLimb(collider, new Vector2(ladderSimPos.X - 0.2f * Dir, collider.SimPosition.Y), 10.5f); - + collider.MoveToPos(new Vector2(ladderSimPos.X - 0.2f * Dir, collider.SimPosition.Y), 10.5f); + Vector2 handPos = new Vector2( ladderSimPos.X, collider.SimPosition.Y + 0.6f + movement.Y * 0.1f - ladderSimPos.Y); @@ -901,7 +894,6 @@ namespace Barotrauma leftLeg.body.ApplyTorque(Dir * -8.0f); rightLeg.body.ApplyTorque(Dir * -8.0f); - //apply forces to the head and the torso to move the Character up/down float movementFactor = (handPos.Y / stepHeight) * (float)Math.PI; movementFactor = 0.8f + (float)Math.Abs(Math.Sin(movementFactor)); @@ -911,7 +903,8 @@ namespace Barotrauma Vector2 climbForce = new Vector2(0.0f, movement.Y + 0.3f) * movementFactor; //if (climbForce.Y > 0.5f) climbForce.Y = Math.Max(climbForce.Y, 1.3f); - collider.body.ApplyForce((climbForce * 20.0f + subSpeed * 50.0f) * collider.Mass); + //apply forces to the collider to move the Character up/down + collider.ApplyForce((climbForce * 20.0f + subSpeed * 50.0f) * collider.Mass); head.body.SmoothRotate(0.0f); if (!character.SelectedConstruction.Prefab.Triggers.Any()) @@ -1313,7 +1306,7 @@ namespace Barotrauma float angle = flipAngle ? -limb.body.Rotation : limb.body.Rotation; if (wrapAngle) angle = MathUtils.WrapAnglePi(angle); - TrySetLimbPosition(limb, RefLimb.SimPosition, position); + TrySetLimbPosition(limb, collider.SimPosition, position); limb.body.SetTransform(limb.body.SimPosition, angle); } diff --git a/Subsurface/Source/Characters/Animation/Ragdoll.cs b/Subsurface/Source/Characters/Animation/Ragdoll.cs index 3042705e5..ac9c5b529 100644 --- a/Subsurface/Source/Characters/Animation/Ragdoll.cs +++ b/Subsurface/Source/Characters/Animation/Ragdoll.cs @@ -20,8 +20,23 @@ namespace Barotrauma public Limb[] Limbs; - private bool isFrozen = false; - public bool Frozen = false; + private bool frozen; + public bool Frozen + { + get { return frozen; } + set + { + if (frozen == value) return; + + frozen = value; + + foreach (Limb l in Limbs) + { + l.body.PhysEnabled = frozen; + } + collider.PhysEnabled = frozen; + } + } private Dictionary limbDictionary; public RevoluteJoint[] limbJoints; @@ -54,22 +69,20 @@ namespace Barotrauma protected bool inWater, headInWater; public bool onGround; private bool ignorePlatforms; - - protected Limb refLimb; - + protected Structure stairs; protected Direction dir; public Direction TargetDir; - protected Limb collider; + protected PhysicsBody collider; - public Limb RefLimb + public PhysicsBody Collider { get { - return refLimb; + return collider; } } @@ -84,26 +97,39 @@ namespace Barotrauma private set; } + public Vector2 WorldPosition + { + get + { + return character.Submarine == null ? + ConvertUnits.ToDisplayUnits(collider.SimPosition) : + ConvertUnits.ToDisplayUnits(collider.SimPosition) + character.Submarine.Position; + } + } + public bool SimplePhysicsEnabled { get { return simplePhysicsEnabled; } set { - if (value == simplePhysicsEnabled) return; + //TODO: reimplement + + return; + //if (value == simplePhysicsEnabled) return; - simplePhysicsEnabled = value; + //simplePhysicsEnabled = value; - foreach (Limb limb in Limbs) - { - limb.body.Enabled = !simplePhysicsEnabled; - } + //foreach (Limb limb in Limbs) + //{ + // limb.body.Enabled = !simplePhysicsEnabled; + //} - foreach (RevoluteJoint joint in limbJoints) - { - joint.Enabled = !simplePhysicsEnabled; - } + //foreach (RevoluteJoint joint in limbJoints) + //{ + // joint.Enabled = !simplePhysicsEnabled; + //} - refLimb.body.Enabled = true; + //refLimb.body.Enabled = true; } } @@ -166,10 +192,12 @@ namespace Barotrauma if (value == currentHull) return; currentHull = value; + Submarine currSubmarine = currentHull == null ? null : currentHull.Submarine; foreach (Limb limb in Limbs) { - limb.body.Submarine = currentHull == null ? null : currentHull.Submarine; + limb.body.Submarine = currSubmarine; } + collider.Submarine = currSubmarine; } } @@ -240,20 +268,28 @@ namespace Barotrauma case "joint": AddJoint(subElement, scale); + break; + case "collider": + collider = new PhysicsBody(subElement, scale); + collider.FarseerBody.FixedRotation = true; break; } - } - refLimb = GetLimb(LimbType.Torso); - if (refLimb == null) refLimb = GetLimb(LimbType.Head); - if (refLimb == null) DebugConsole.ThrowError("Character \"" + character + "\" doesn't have a head or torso!"); + if (collider == null) + { + DebugConsole.ThrowError("No collider configured for ''"+character.Name+"''!"); + collider = new PhysicsBody(0.0f, 0.0f, 16.0f, 5.0f); + } + + collider.CollisionCategories = Physics.CollisionCharacter; + collider.FarseerBody.FixedRotation = true; + collider.FarseerBody.OnCollision += OnLimbCollision; UpdateCollisionCategories(); foreach (var joint in limbJoints) { - joint.BodyB.SetTransform( joint.BodyA.Position + (joint.LocalAnchorA - joint.LocalAnchorB)*0.1f, (joint.LowerLimit + joint.UpperLimit) / 2.0f); @@ -272,13 +308,6 @@ namespace Barotrauma { limb.sprite.Depth = startDepth + limb.sprite.Depth * 0.0001f; } - - collider = GetLimb(LimbType.Collider); - if (collider == null) return; - - collider.body.FarseerBody.FixedRotation = true; - collider.pullJoint = null; - refLimb = collider; } public void AddJoint(XElement subElement, float scale = 1.0f) @@ -443,33 +472,35 @@ namespace Barotrauma // avgVelocity += limb.LinearVelocity; //} - Limb limb = (Limb)f1.Body.UserData; - Vector2 velocity = limb.LinearVelocity; + Vector2 velocity = f1.Body.LinearVelocity; if (character.Submarine == null && f2.Body.UserData is Submarine) velocity -= ((Submarine)f2.Body.UserData).Velocity; float impact = Vector2.Dot(velocity, -normal); - - float volume = stairs == null ? impact / 5.0f : impact; - volume = Math.Min(impact, 1.0f); - - if (impact > 0.5f && limb.HitSound != null && limb.soundTimer <= 0.0f) + if (f1.Body.UserData is Limb) { - limb.soundTimer = Limb.SoundInterval; - limb.HitSound.Play(volume, impact * 250.0f, limb.WorldPosition); - } + Limb limb = (Limb)f1.Body.UserData; - if (impact > limb.impactTolerance && limb == collider) + float volume = stairs == null ? impact / 5.0f : impact; + volume = Math.Min(impact, 1.0f); + + if (impact > 0.5f && limb.HitSound != null && limb.soundTimer <= 0.0f) + { + limb.soundTimer = Limb.SoundInterval; + limb.HitSound.Play(volume, impact * 250.0f, limb.WorldPosition); + } + } + else if (f1.Body == collider.FarseerBody) { if (!character.IsNetworkPlayer || GameMain.Server != null) { - character.AddDamage(CauseOfDeath.Damage, impact - limb.impactTolerance * 0.1f, null); - - strongestImpact = Math.Max(strongestImpact, impact - limb.impactTolerance); + character.AddDamage(CauseOfDeath.Damage, impact - 8.0f, null); + + strongestImpact = Math.Max(strongestImpact, impact - 8.0f); } - SoundPlayer.PlayDamageSound(DamageSoundType.LimbBlunt, strongestImpact, limb.body); + SoundPlayer.PlayDamageSound(DamageSoundType.LimbBlunt, strongestImpact, collider); if (Character.Controlled == character) GameMain.GameScreen.Cam.Shake = strongestImpact; } @@ -478,6 +509,8 @@ namespace Barotrauma public virtual void Draw(SpriteBatch spriteBatch) { if (simplePhysicsEnabled) return; + + collider.UpdateDrawPosition(); foreach (Limb limb in Limbs) { @@ -508,8 +541,14 @@ namespace Barotrauma //GUI.DrawLine(spriteBatch, pos, pos2, Color.Green); } + + limb.body.DebugDraw(spriteBatch, character.Submarine == null ? Color.Cyan : Color.White); } + + + collider.DebugDraw(spriteBatch, character.Submarine == null ? Color.Cyan : Color.White); + foreach (RevoluteJoint joint in limbJoints) { Vector2 pos = ConvertUnits.ToDisplayUnits(joint.WorldAnchorA); @@ -528,13 +567,16 @@ namespace Barotrauma pos.Y = -pos.Y; GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos.X - 10, (int)pos.Y - 10, 20, 20), Color.Cyan, false, 0.01f); - GUI.DrawLine(spriteBatch, pos, new Vector2(limb.WorldPosition.X, -limb.WorldPosition.Y), limb == RefLimb ? Color.Orange : Color.Cyan); + GUI.DrawLine(spriteBatch, pos, new Vector2(limb.WorldPosition.X, -limb.WorldPosition.Y), Color.Cyan); } } if (ignorePlatforms) { - GUI.DrawLine(spriteBatch, new Vector2(refLimb.WorldPosition.X, -refLimb.WorldPosition.Y), new Vector2(refLimb.WorldPosition.X, -refLimb.WorldPosition.Y+50), Color.Orange, 0, 5); + GUI.DrawLine(spriteBatch, + new Vector2(collider.DrawPosition.X, -collider.DrawPosition.Y), + new Vector2(collider.DrawPosition.X, -collider.DrawPosition.Y + 50), + Color.Orange, 0, 5); } } @@ -587,20 +629,16 @@ namespace Barotrauma return centerOfMass; } - - - /// - /// - /// + /// if false, force is applied to the position of pullJoint protected void MoveLimb(Limb limb, Vector2 pos, float amount, bool pullFromCenter = false) { - limb.Move(pos, amount, pullFromCenter); + limb.MoveToPos(pos, amount, pullFromCenter); } public void ResetPullJoints() { - for (int i = 0; i < Limbs.Count(); i++) + for (int i = 0; i < Limbs.Length; i++) { if (Limbs[i] == null || Limbs[i].pullJoint == null) continue; Limbs[i].pullJoint.Enabled = false; @@ -622,7 +660,7 @@ namespace Barotrauma return; } - Vector2 findPos = worldPosition==null ? refLimb.WorldPosition : (Vector2)worldPosition; + Vector2 findPos = worldPosition==null ? this.WorldPosition : (Vector2)worldPosition; Hull newHull = Hull.FindHull(findPos, currentHull); @@ -674,7 +712,6 @@ namespace Barotrauma while (ce != null && ce.Contact != null) { ce.Contact.Enabled = false; - ce = ce.Next; } } @@ -687,7 +724,7 @@ namespace Barotrauma //character.Stun = 0.1f; character.DisableImpactDamageTimer = 0.25f; - SetPosition(refLimb.SimPosition + moveAmount); + SetPosition(collider.SimPosition + moveAmount); character.CursorPosition += moveAmount; } @@ -701,6 +738,8 @@ namespace Barotrauma wall | Physics.CollisionProjectile | Physics.CollisionStairs : wall | Physics.CollisionProjectile | Physics.CollisionPlatform | Physics.CollisionStairs; + collider.CollidesWith = collisionCategory; + foreach (Limb limb in Limbs) { if (limb.ignoreCollisions) continue; @@ -720,26 +759,7 @@ namespace Barotrauma { if (!character.Enabled) return; - if (Frozen) - { - if (!isFrozen) - { - foreach (Limb l in Limbs) - { - l.body.PhysEnabled = false; - } - isFrozen = true; - } - return; - } - if (isFrozen) - { - foreach (Limb l in Limbs) - { - l.body.PhysEnabled = true; - } - isFrozen = false; - } + if (Frozen) return; UpdateNetPlayerPosition(); @@ -845,22 +865,16 @@ namespace Barotrauma public void SetPosition(Vector2 simPosition, bool lerp = false) { - Vector2 moveAmount = simPosition - refLimb.SimPosition; + Vector2 moveAmount = simPosition - collider.SimPosition; + + collider.SetTransform(simPosition, collider.Rotation); foreach (Limb limb in Limbs) { - if (limb == refLimb) - { - TrySetLimbPosition(limb, simPosition, simPosition, lerp); - } - else - { - //check visibility from the new position of RefLimb to the new position of this limb - Vector2 movePos = limb.SimPosition + moveAmount; - - TrySetLimbPosition(limb, simPosition, movePos, lerp); - } + //check visibility from the new position of the collider to the new position of this limb + Vector2 movePos = limb.SimPosition + moveAmount; + TrySetLimbPosition(limb, simPosition, movePos, lerp); } } @@ -899,110 +913,110 @@ namespace Barotrauma } } - public void SetRotation(float rotation) - { - float rotateAmount = rotation - refLimb.Rotation; + //public void SetRotation(float rotation) + //{ + // float rotateAmount = rotation - refLimb.Rotation; - Matrix rotationMatrix = Matrix.CreateRotationZ(rotateAmount); + // Matrix rotationMatrix = Matrix.CreateRotationZ(rotateAmount); - refLimb.body.SetTransform(refLimb.SimPosition, rotation); + // refLimb.body.SetTransform(refLimb.SimPosition, rotation); - foreach (Limb limb in Limbs) - { - if (limb == refLimb) continue; + // foreach (Limb limb in Limbs) + // { + // if (limb == refLimb) continue; - Vector2 newPos = limb.SimPosition - refLimb.SimPosition; - newPos = Vector2.Transform(newPos, rotationMatrix); + // Vector2 newPos = limb.SimPosition - refLimb.SimPosition; + // newPos = Vector2.Transform(newPos, rotationMatrix); - TrySetLimbPosition(limb, refLimb.SimPosition, refLimb.SimPosition + newPos); - limb.body.SetTransform(limb.SimPosition, limb.Rotation + rotateAmount); - } - } + // TrySetLimbPosition(limb, refLimb.SimPosition, refLimb.SimPosition + newPos); + // limb.body.SetTransform(limb.SimPosition, limb.Rotation + rotateAmount); + // } + //} private void UpdateNetPlayerPosition() { - if (refLimb.body.TargetPosition == Vector2.Zero) - { - correctionMovement = Vector2.Zero; - return; - } + //if (refLimb.body.TargetPosition == Vector2.Zero) + //{ + // correctionMovement = Vector2.Zero; + // return; + //} - //if the limb is closer than alloweddistance, just ignore the difference - float allowedDistance = NetConfig.AllowedRagdollDistance * ((inWater) ? 2.0f : 1.0f); + ////if the limb is closer than alloweddistance, just ignore the difference + //float allowedDistance = NetConfig.AllowedRagdollDistance * ((inWater) ? 2.0f : 1.0f); - if (currentHull == null) - { - var overLappingHull = Hull.FindHull(ConvertUnits.ToDisplayUnits(refLimb.body.TargetPosition), null, true); + //if (currentHull == null) + //{ + // var overLappingHull = Hull.FindHull(ConvertUnits.ToDisplayUnits(refLimb.body.TargetPosition), null, true); - if (overLappingHull != null) - { - Submarine.PickBody(refLimb.SimPosition, refLimb.body.TargetPosition, null, Physics.CollisionWall); + // if (overLappingHull != null) + // { + // Submarine.PickBody(refLimb.SimPosition, refLimb.body.TargetPosition, null, Physics.CollisionWall); - refLimb.body.TargetPosition = refLimb.SimPosition + (refLimb.body.TargetPosition - refLimb.SimPosition) * Submarine.LastPickedFraction * 0.9f; - } - } + // refLimb.body.TargetPosition = refLimb.SimPosition + (refLimb.body.TargetPosition - refLimb.SimPosition) * Submarine.LastPickedFraction * 0.9f; + // } + //} - float dist = Vector2.Distance(refLimb.body.SimPosition, refLimb.body.TargetPosition); + //float dist = Vector2.Distance(refLimb.body.SimPosition, refLimb.body.TargetPosition); - //if the limb is further away than resetdistance, all limbs are immediately snapped to their targetpositions - bool resetAll = dist > NetConfig.ResetRagdollDistance; + ////if the limb is further away than resetdistance, all limbs are immediately snapped to their targetpositions + //bool resetAll = dist > NetConfig.ResetRagdollDistance; - Vector2 diff = (refLimb.body.TargetPosition - refLimb.body.SimPosition); + //Vector2 diff = (refLimb.body.TargetPosition - refLimb.body.SimPosition); - if (diff == Vector2.Zero || diff.Length() < allowedDistance) - { - refLimb.body.TargetPosition = Vector2.Zero; - foreach (Limb limb in Limbs) - { - limb.body.TargetPosition = Vector2.Zero; - } + //if (diff == Vector2.Zero || diff.Length() < allowedDistance) + //{ + // refLimb.body.TargetPosition = Vector2.Zero; + // foreach (Limb limb in Limbs) + // { + // limb.body.TargetPosition = Vector2.Zero; + // } - correctionMovement = Vector2.Zero; - return; - } + // correctionMovement = Vector2.Zero; + // return; + //} - if (resetAll) - { - System.Diagnostics.Debug.WriteLine("reset ragdoll limb positions"); + //if (resetAll) + //{ + // System.Diagnostics.Debug.WriteLine("reset ragdoll limb positions"); - SetPosition(refLimb.body.TargetPosition, dist < 10.0f); + // SetPosition(refLimb.body.TargetPosition, dist < 10.0f); - return; - } + // return; + //} - if (inWater) - { - if (targetMovement.LengthSquared() > 0.01f) - { - correctionMovement = - Vector2.Lerp(targetMovement, Vector2.Normalize(diff) * MathHelper.Clamp(dist * 5.0f, 0.1f, 5.0f), 0.2f); + //if (inWater) + //{ + // if (targetMovement.LengthSquared() > 0.01f) + // { + // correctionMovement = + // Vector2.Lerp(targetMovement, Vector2.Normalize(diff) * MathHelper.Clamp(dist * 5.0f, 0.1f, 5.0f), 0.2f); - } - else - { - refLimb.body.LinearVelocity = Vector2.Lerp( - refLimb.LinearVelocity, - Vector2.Normalize(diff) * MathHelper.Clamp(dist, 0.0f, 5.0f), - 0.2f); - } - } - else - { - //clamp the magnitude of the correction movement between 0.5f - 5.0f - Vector2 newCorrectionMovement = Vector2.Normalize(diff) * MathHelper.Clamp(dist * 2.0f, 0.5f, 5.0f); + // } + // else + // { + // refLimb.body.LinearVelocity = Vector2.Lerp( + // refLimb.LinearVelocity, + // Vector2.Normalize(diff) * MathHelper.Clamp(dist, 0.0f, 5.0f), + // 0.2f); + // } + //} + //else + //{ + // //clamp the magnitude of the correction movement between 0.5f - 5.0f + // Vector2 newCorrectionMovement = Vector2.Normalize(diff) * MathHelper.Clamp(dist * 2.0f, 0.5f, 5.0f); - //heading in the right direction -> use the \"normal\" movement if it's faster than correctionMovement - //i.e. the character is close to the targetposition but the character is still running - if (Math.Sign(targetMovement.X) == Math.Sign(newCorrectionMovement.X)) - { - newCorrectionMovement.X = Math.Max(Math.Abs(targetMovement.X), Math.Abs(newCorrectionMovement.X)) * Math.Sign(targetMovement.X); - } + // //heading in the right direction -> use the \"normal\" movement if it's faster than correctionMovement + // //i.e. the character is close to the targetposition but the character is still running + // if (Math.Sign(targetMovement.X) == Math.Sign(newCorrectionMovement.X)) + // { + // newCorrectionMovement.X = Math.Max(Math.Abs(targetMovement.X), Math.Abs(newCorrectionMovement.X)) * Math.Sign(targetMovement.X); + // } - correctionMovement = Vector2.Lerp(correctionMovement, newCorrectionMovement, 0.5f); + // correctionMovement = Vector2.Lerp(correctionMovement, newCorrectionMovement, 0.5f); - if (Math.Abs(correctionMovement.Y) < 0.1f) correctionMovement.Y = 0.0f; - } + // if (Math.Abs(correctionMovement.Y) < 0.1f) correctionMovement.Y = 0.0f; + //} } public virtual Vector2 EstimateCurrPosition(Vector2 prevPosition, float timePassed) @@ -1042,15 +1056,14 @@ namespace Barotrauma public Vector2 GetColliderBottom() { - return collider == null ? Vector2.Zero : collider.SimPosition - Vector2.UnitY * (collider.body.height / 2 + collider.body.radius); + return collider.SimPosition - Vector2.UnitY * (collider.height / 2 + collider.radius); } - public Limb FindLowestLimb(bool ignoreCollider) + public Limb FindLowestLimb() { Limb lowestLimb = null; foreach (Limb limb in Limbs) { - if (ignoreCollider && limb == collider) continue; if (lowestLimb == null) lowestLimb = limb; else if (limb.SimPosition.Y < lowestLimb.SimPosition.Y) diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 267c3c822..d1d329566 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -428,17 +428,17 @@ namespace Barotrauma public override Vector2 SimPosition { - get { return AnimController.RefLimb.SimPosition; } + get { return AnimController.Collider.SimPosition; } } public override Vector2 Position { - get { return AnimController.RefLimb.Position; } + get { return ConvertUnits.ToDisplayUnits(SimPosition); } } public override Vector2 DrawPosition { - get { return AnimController.RefLimb.body.DrawPosition; } + get { return AnimController.Collider.DrawPosition; } } public delegate void OnDeathHandler(Character character, CauseOfDeath causeOfDeath); @@ -560,12 +560,12 @@ namespace Barotrauma //FishAnimController fishAnim = (FishAnimController)animController; } + AnimController.SetPosition(ConvertUnits.ToSimUnits(position)); foreach (Limb limb in AnimController.Limbs) { limb.body.SetTransform(ConvertUnits.ToSimUnits(position)+limb.SimPosition, 0.0f); - //limb.prevPosition = ConvertUnits.ToDisplayUnits(position); } - + maxHealth = ToolBox.GetAttributeFloat(doc.Root, "health", 100.0f); health = maxHealth; @@ -1197,6 +1197,7 @@ namespace Barotrauma foreach (Character c in CharacterList) { if (!c.Enabled) continue; + c.AnimController.UpdateAnim(deltaTime); } } @@ -1412,7 +1413,7 @@ namespace Barotrauma aiTarget.SightRange = 0.0f; - aiTarget.SightRange = Mass*10.0f + AnimController.RefLimb.LinearVelocity.Length()*500.0f; + aiTarget.SightRange = Mass*10.0f + AnimController.Collider.LinearVelocity.Length()*500.0f; } public void ShowSpeechBubble(float duration, Color color) @@ -1622,7 +1623,7 @@ namespace Barotrauma // limb.Damage = 100.0f; } - SoundPlayer.PlayDamageSound(DamageSoundType.Implode, 50.0f, AnimController.RefLimb.body); + SoundPlayer.PlayDamageSound(DamageSoundType.Implode, 50.0f, AnimController.Collider); for (int i = 0; i < 10; i++) { diff --git a/Subsurface/Source/Characters/Limb.cs b/Subsurface/Source/Characters/Limb.cs index 0f93fbd96..3a64d27ae 100644 --- a/Subsurface/Source/Characters/Limb.cs +++ b/Subsurface/Source/Characters/Limb.cs @@ -16,8 +16,7 @@ namespace Barotrauma public enum LimbType { None, LeftHand, RightHand, LeftArm, RightArm, - LeftLeg, RightLeg, LeftFoot, RightFoot, Head, Torso, Tail, Legs, RightThigh, LeftThigh, Waist, - Collider + LeftLeg, RightLeg, LeftFoot, RightFoot, Head, Torso, Tail, Legs, RightThigh, LeftThigh, Waist }; class Limb @@ -29,7 +28,6 @@ namespace Barotrauma //the physics body of the limb public PhysicsBody body; - private Texture2D bodyShapeTexture; private readonly int refJointIndex; @@ -74,11 +72,6 @@ namespace Barotrauma private List wearingItems; private Vector2 animTargetPos; - - public Texture2D BodyShapeTexture - { - get { return bodyShapeTexture; } - } public bool DoesFlip { @@ -335,7 +328,7 @@ namespace Barotrauma } } - public void Move(Vector2 pos, float amount, bool pullFromCenter=false) + public void MoveToPos(Vector2 pos, float force, bool pullFromCenter=false) { Vector2 pullPos = body.SimPosition; if (pullJoint!=null && !pullFromCenter) @@ -345,10 +338,7 @@ namespace Barotrauma animTargetPos = pos; - Vector2 vel = body.LinearVelocity; - Vector2 deltaPos = pos - pullPos; - deltaPos *= amount; - body.ApplyLinearImpulse((deltaPos - vel * 0.5f) * body.Mass, pullPos); + body.MoveToPos(pos, force, pullPos); } public AttackResult AddDamage(Vector2 position, DamageType damageType, float amount, float bleedingAmount, bool playSound) @@ -446,7 +436,7 @@ namespace Barotrauma { //DebugConsole.ThrowError("CHARACTER EXPLODED"); body.ResetDynamics(); - body.SetTransform(character.AnimController.RefLimb.SimPosition, 0.0f); + body.SetTransform(character.SimPosition, 0.0f); } if (inWater) @@ -586,34 +576,7 @@ namespace Barotrauma GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos.X, (int)-pos.Y, 5, 5), Color.Red, true); } - if (bodyShapeTexture == null) - { - switch (body.BodyShape) - { - case PhysicsBody.Shape.Rectangle: - bodyShapeTexture = GUI.CreateRectangle( - (int)ConvertUnits.ToDisplayUnits(body.width), - (int)ConvertUnits.ToDisplayUnits(body.height)); - break; - - case PhysicsBody.Shape.Capsule: - bodyShapeTexture = GUI.CreateCapsule( - (int)ConvertUnits.ToDisplayUnits(body.radius), - (int)ConvertUnits.ToDisplayUnits(body.height)); - break; - case PhysicsBody.Shape.Circle: - bodyShapeTexture = GUI.CreateCircle((int)ConvertUnits.ToDisplayUnits(body.radius)); - break; - } - } - - spriteBatch.Draw( - bodyShapeTexture, - new Vector2(body.DrawPosition.X, -body.DrawPosition.Y), - null, - character.Submarine!=null ? Color.White : Color.Cyan, - -body.DrawRotation, - new Vector2(bodyShapeTexture.Width / 2, bodyShapeTexture.Height / 2), 1.0f, SpriteEffects.None, 0.0f); + } @@ -625,11 +588,6 @@ namespace Barotrauma body.Remove(); - if (bodyShapeTexture != null) - { - bodyShapeTexture.Dispose(); - } - if (hitSound != null) hitSound.Remove(); } } diff --git a/Subsurface/Source/Items/Components/Machines/Controller.cs b/Subsurface/Source/Items/Components/Machines/Controller.cs index 1aa1313b4..a3a1a84a2 100644 --- a/Subsurface/Source/Items/Components/Machines/Controller.cs +++ b/Subsurface/Source/Items/Components/Machines/Controller.cs @@ -92,7 +92,7 @@ namespace Barotrauma.Items.Components if (userPos != 0.0f) { - float torsoX = ConvertUnits.ToDisplayUnits(character.AnimController.RefLimb.SimPosition.X); + float torsoX = character.Position.X; Vector2 diff = new Vector2(item.Rect.X + UserPos - torsoX, 0.0f); diff --git a/Subsurface/Source/Map/SubmarineBody.cs b/Subsurface/Source/Map/SubmarineBody.cs index c09393184..91f304f15 100644 --- a/Subsurface/Source/Map/SubmarineBody.cs +++ b/Subsurface/Source/Map/SubmarineBody.cs @@ -495,8 +495,8 @@ namespace Barotrauma FixedArray2 points; contact.GetWorldManifold(out normal2, out points); - Vector2 normalizedVel = limb.character.AnimController.RefLimb.LinearVelocity == Vector2.Zero ? - Vector2.Zero : Vector2.Normalize(limb.character.AnimController.RefLimb.LinearVelocity); + Vector2 normalizedVel = limb.character.AnimController.Collider.LinearVelocity == Vector2.Zero ? + Vector2.Zero : Vector2.Normalize(limb.character.AnimController.Collider.LinearVelocity); Vector2 targetPos = ConvertUnits.ToDisplayUnits(points[0] - normal2); diff --git a/Subsurface/Source/Physics/PhysicsBody.cs b/Subsurface/Source/Physics/PhysicsBody.cs index 5b4e3b2ad..37bc9b2cf 100644 --- a/Subsurface/Source/Physics/PhysicsBody.cs +++ b/Subsurface/Source/Physics/PhysicsBody.cs @@ -201,6 +201,12 @@ namespace Barotrauma set { body.CollidesWith = value; } } + private Texture2D bodyShapeTexture; + public Texture2D BodyShapeTexture + { + get { return bodyShapeTexture; } + } + public PhysicsBody(XElement element, float scale = 1.0f) : this(element, Vector2.Zero, scale) { @@ -336,6 +342,15 @@ namespace Barotrauma targetPosition = Vector2.Zero; } + public void MoveToPos(Vector2 pos, float force, Vector2? pullPos = null) + { + if (pullPos==null) pullPos = body.Position; + + Vector2 vel = body.LinearVelocity; + Vector2 deltaPos = pos - (Vector2)pullPos; + deltaPos *= force; + body.ApplyLinearImpulse((deltaPos - vel * 0.5f) * body.Mass, (Vector2)pullPos); + } public void UpdateDrawPosition() { @@ -370,10 +385,43 @@ namespace Barotrauma color = Color.Blue; } - sprite.Draw(spriteBatch, new Vector2(DrawPosition.X, -DrawPosition.Y), color, -drawRotation, scale, spriteEffect, depth); - + sprite.Draw(spriteBatch, new Vector2(DrawPosition.X, -DrawPosition.Y), color, -drawRotation, scale, spriteEffect, depth); } + public void DebugDraw(SpriteBatch spriteBatch, Color color) + { + if (bodyShapeTexture == null) + { + switch (BodyShape) + { + case PhysicsBody.Shape.Rectangle: + bodyShapeTexture = GUI.CreateRectangle( + (int)ConvertUnits.ToDisplayUnits(width), + (int)ConvertUnits.ToDisplayUnits(height)); + break; + + case PhysicsBody.Shape.Capsule: + bodyShapeTexture = GUI.CreateCapsule( + (int)ConvertUnits.ToDisplayUnits(radius), + (int)ConvertUnits.ToDisplayUnits(height)); + break; + case PhysicsBody.Shape.Circle: + bodyShapeTexture = GUI.CreateCircle((int)ConvertUnits.ToDisplayUnits(radius)); + break; + } + } + + spriteBatch.Draw( + bodyShapeTexture, + new Vector2(DrawPosition.X, -DrawPosition.Y), + null, + color, + -DrawRotation, + new Vector2(bodyShapeTexture.Width / 2, bodyShapeTexture.Height / 2), + 1.0f, SpriteEffects.None, 0.0f); + } + + /// /// rotate the body towards the target rotation in the "shortest direction" /// @@ -399,6 +447,12 @@ namespace Barotrauma { list.Remove(this); GameMain.World.RemoveBody(body); + + if (bodyShapeTexture != null) + { + bodyShapeTexture.Dispose(); + bodyShapeTexture = null; + } } } diff --git a/Subsurface/Source/Screens/EditCharacterScreen.cs b/Subsurface/Source/Screens/EditCharacterScreen.cs index 706faa041..b9920f840 100644 --- a/Subsurface/Source/Screens/EditCharacterScreen.cs +++ b/Subsurface/Source/Screens/EditCharacterScreen.cs @@ -173,12 +173,12 @@ namespace Barotrauma DrawJoints(spriteBatch, limb, limbBodyPos); - if (limb.BodyShapeTexture == null) continue; + //if (limb.BodyShapeTexture == null) continue; - spriteBatch.Draw(limb.BodyShapeTexture, limbBodyPos, - null, Color.White, 0.0f, - new Vector2(limb.BodyShapeTexture.Width, limb.BodyShapeTexture.Height) / 2, - 1.0f, SpriteEffects.None, 0.0f); + //spriteBatch.Draw(limb.BodyShapeTexture, limbBodyPos, + // null, Color.White, 0.0f, + // new Vector2(limb.BodyShapeTexture.Width, limb.BodyShapeTexture.Height) / 2, + // 1.0f, SpriteEffects.None, 0.0f); GUI.DrawLine(spriteBatch, limbBodyPos + Vector2.UnitY * 5.0f, limbBodyPos - Vector2.UnitY * 5.0f, Color.White); GUI.DrawLine(spriteBatch, limbBodyPos + Vector2.UnitX * 5.0f, limbBodyPos - Vector2.UnitX * 5.0f, Color.White);