- projectiles don't stick to colliders

- fixed impacts weaker than the damage threshold giving characters health
- possible to slide down ladders
- improved IndoorsSteeringManager ladder climbing logic
This commit is contained in:
Regalis
2016-10-17 17:41:41 +03:00
parent efcc466fdd
commit 0cafc674dd
6 changed files with 46 additions and 32 deletions
@@ -90,7 +90,9 @@ namespace Barotrauma
var collider = character.AnimController.Collider; var collider = character.AnimController.Collider;
//if not in water and the waypoint is between the top and bottom of the collider, no need to move vertically //if not in water and the waypoint is between the top and bottom of the collider, no need to move vertically
if (!character.AnimController.InWater && diff.Y < collider.height / 2 + collider.radius) if (!character.AnimController.InWater &&
character.AnimController.Anim != AnimController.Animation.Climbing &&
diff.Y < collider.height / 2 + collider.radius)
{ {
diff.Y = 0.0f; diff.Y = 0.0f;
} }
@@ -162,20 +164,31 @@ namespace Barotrauma
if (character.AnimController.Anim == AnimController.Animation.Climbing) if (character.AnimController.Anim == AnimController.Animation.Climbing)
{ {
float x = currentPath.CurrentNode.SimPosition.X - pos.X; Vector2 diff = currentPath.CurrentNode.SimPosition - pos;
float y = (currentPath.CurrentNode.SimPosition.Y) - pos.Y;
if (Math.Abs(x) < Math.Abs(y) * 10.0f) if (currentPath.CurrentNode.Ladders != null)
{ {
x = 0.0f; //climbing ladders -> don't move horizontally
} diff.X = 0.0f;
else if (hull != null)
{ //at the same height as the waypoint
if (character.AnimController.GetColliderBottom().Y < hull.Rect.Y - hull.Rect.Height + 10.0f) x = 0.0f; if (currentPath.CurrentNode.SimPosition.Y > colliderBottom.Y &&
currentPath.CurrentNode.SimPosition.Y < colliderBottom.Y + collider.height + collider.radius * 2)
{
float heightFromFloor = character.AnimController.GetColliderBottom().Y - character.AnimController.FloorY;
//we can safely skip to the next waypoint if the character is at a safe height above the floor,
//or if the next waypoint in the path is also on ladders
if ((heightFromFloor > 0.0f && heightFromFloor < collider.height) ||
(currentPath.NextNode != null && currentPath.NextNode.Ladders != null))
{
currentPath.SkipToNextNode();
}
}
} }
character.AnimController.IgnorePlatforms = false; character.AnimController.IgnorePlatforms = false;
return new Vector2(x,y); return diff;
} }
return currentPath.CurrentNode.SimPosition - pos; return currentPath.CurrentNode.SimPosition - pos;
@@ -172,7 +172,7 @@ namespace Barotrauma
start, node.Waypoint.SimPosition, null, start, node.Waypoint.SimPosition, null,
Physics.CollisionWall | Physics.CollisionLevel | Physics.CollisionStairs | Physics.CollisionPlatform); Physics.CollisionWall | Physics.CollisionLevel | Physics.CollisionStairs | Physics.CollisionPlatform);
if (body != null && body.UserData is Structure) continue; if (body != null && body.UserData is Structure && !((Structure)body.UserData).IsPlatform) continue;
} }
closestDist = dist; closestDist = dist;
@@ -691,6 +691,9 @@ namespace Barotrauma
IgnorePlatforms = true; IgnorePlatforms = true;
Vector2 tempTargetMovement = TargetMovement; Vector2 tempTargetMovement = TargetMovement;
tempTargetMovement.Y = Math.Min(tempTargetMovement.Y, 1.0f);
movement = MathUtils.SmoothStep(movement, tempTargetMovement, 0.3f); movement = MathUtils.SmoothStep(movement, tempTargetMovement, 0.3f);
Limb leftFoot = GetLimb(LimbType.LeftFoot); Limb leftFoot = GetLimb(LimbType.LeftFoot);
@@ -718,14 +721,14 @@ namespace Barotrauma
ladderSimPos += character.SelectedConstruction.Submarine.SimPosition - currentHull.Submarine.SimPosition; ladderSimPos += character.SelectedConstruction.Submarine.SimPosition - currentHull.Submarine.SimPosition;
} }
MoveLimb(head, new Vector2(ladderSimPos.X - 0.27f * Dir, collider.SimPosition.Y + 0.7f), 10.5f); MoveLimb(head, new Vector2(ladderSimPos.X - 0.27f * Dir, collider.SimPosition.Y + 0.7f), 10.5f);
MoveLimb(torso, new Vector2(ladderSimPos.X - 0.27f * Dir, collider.SimPosition.Y+0.5f), 10.5f); 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(waist, new Vector2(ladderSimPos.X - 0.35f * Dir, collider.SimPosition.Y+0.4f), 10.5f);
collider.MoveToPos(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);
bool slide = targetMovement.Y < -1.1f;
Vector2 handPos = new Vector2( Vector2 handPos = new Vector2(
ladderSimPos.X, ladderSimPos.X,
collider.SimPosition.Y + 0.6f + movement.Y * 0.1f - ladderSimPos.Y); collider.SimPosition.Y + 0.6f + movement.Y * 0.1f - ladderSimPos.Y);
@@ -734,12 +737,12 @@ namespace Barotrauma
MoveLimb(leftHand, MoveLimb(leftHand,
new Vector2(handPos.X, new Vector2(handPos.X,
MathUtils.Round(handPos.Y - stepHeight, stepHeight * 2.0f) + stepHeight + ladderSimPos.Y), (slide ? handPos.Y : MathUtils.Round(handPos.Y - stepHeight, stepHeight * 2.0f) + stepHeight) + ladderSimPos.Y),
5.2f); 5.2f);
MoveLimb(rightHand, MoveLimb(rightHand,
new Vector2(handPos.X, new Vector2(handPos.X,
MathUtils.Round(handPos.Y, stepHeight * 2.0f) + ladderSimPos.Y), (slide ? handPos.Y : MathUtils.Round(handPos.Y, stepHeight * 2.0f)) + ladderSimPos.Y),
5.2f); 5.2f);
leftHand.body.ApplyTorque(Dir * 2.0f); leftHand.body.ApplyTorque(Dir * 2.0f);
@@ -753,12 +756,12 @@ namespace Barotrauma
MoveLimb(leftFoot, MoveLimb(leftFoot,
new Vector2(footPos.X, new Vector2(footPos.X,
MathUtils.Round(footPos.Y + stepHeight, stepHeight * 2.0f) - stepHeight + ladderSimPos.Y), (slide ? footPos.Y : MathUtils.Round(footPos.Y + stepHeight, stepHeight * 2.0f) - stepHeight) + ladderSimPos.Y),
15.5f, true); 15.5f, true);
MoveLimb(rightFoot, MoveLimb(rightFoot,
new Vector2(footPos.X, new Vector2(footPos.X,
MathUtils.Round(footPos.Y, stepHeight * 2.0f) + ladderSimPos.Y), (slide ? footPos.Y : MathUtils.Round(footPos.Y, stepHeight * 2.0f)) + ladderSimPos.Y),
15.5f, true); 15.5f, true);
//apply torque to the legs to make the knees bend //apply torque to the legs to make the knees bend
@@ -459,9 +459,12 @@ namespace Barotrauma
{ {
if (!character.IsNetworkPlayer || GameMain.Server != null) if (!character.IsNetworkPlayer || GameMain.Server != null)
{ {
character.AddDamage(CauseOfDeath.Damage, impact - 8.0f, null); if (impact > 8.0f)
if (impact > 8.0f) SoundPlayer.PlayDamageSound(DamageSoundType.LimbBlunt, strongestImpact, collider); {
strongestImpact = Math.Max(strongestImpact, impact - 8.0f); character.AddDamage(CauseOfDeath.Damage, impact - 8.0f, null);
SoundPlayer.PlayDamageSound(DamageSoundType.LimbBlunt, strongestImpact, collider);
strongestImpact = Math.Max(strongestImpact, impact - 8.0f);
}
} }
@@ -49,19 +49,11 @@ namespace Barotrauma.Items.Components
{ {
IgnoredBodies = new List<Body>(); IgnoredBodies = new List<Body>();
//launchImpulse = ToolBox.GetAttributeFloat(element, "launchimpulse", 10.0f);
//characterUsable = ToolBox.GetAttributeBool(element, "characterusable", false);
foreach (XElement subElement in element.Elements()) foreach (XElement subElement in element.Elements())
{ {
if (subElement.Name.ToString().ToLowerInvariant() != "attack") continue; if (subElement.Name.ToString().ToLowerInvariant() != "attack") continue;
attack = new Attack(subElement); attack = new Attack(subElement);
} }
//bleedingDamage = ToolBox.GetAttributeFloat(element, "bleedingdamage", 0.0f);
//bluntDamage = ToolBox.GetAttributeFloat(element, "bluntdamage", 0.0f);
//doesStick = ToolBox.GetAttributeBool(element, "doesstick", false);
} }
public override bool Use(float deltaTime, Character character = null) public override bool Use(float deltaTime, Character character = null)
@@ -150,6 +142,11 @@ namespace Barotrauma.Items.Components
{ {
if (IgnoredBodies.Contains(f2.Body)) return false; if (IgnoredBodies.Contains(f2.Body)) return false;
if (f2.CollisionCategories == Physics.CollisionCharacter && !(f2.Body.UserData is Limb))
{
return false;
}
AttackResult attackResult = new AttackResult(0.0f, 0.0f); AttackResult attackResult = new AttackResult(0.0f, 0.0f);
if (attack != null) if (attack != null)
{ {
-2
View File
@@ -6,8 +6,6 @@ namespace Barotrauma
{ {
static class Physics static class Physics
{ {
private static double alpha;
public const Category CollisionNone = Category.None; public const Category CollisionNone = Category.None;
public const Category CollisionAll = Category.All; public const Category CollisionAll = Category.All;
public const Category CollisionWall = Category.Cat1; public const Category CollisionWall = Category.Cat1;