From f9017d3cf9fc3e3cadbcad939ebf4fa06a10f863 Mon Sep 17 00:00:00 2001 From: Regalis Date: Tue, 11 Oct 2016 21:11:06 +0300 Subject: [PATCH] User-controlled monsters can damage structures from outside the sub --- .../Content/Characters/Crawler/crawler.xml | 2 +- Subsurface/Source/Characters/Character.cs | 38 ++++++++++++++----- Subsurface/Source/Characters/Limb.cs | 3 +- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/Subsurface/Content/Characters/Crawler/crawler.xml b/Subsurface/Content/Characters/Crawler/crawler.xml index 709b2fb1b..ca7e38e98 100644 --- a/Subsurface/Content/Characters/Crawler/crawler.xml +++ b/Subsurface/Content/Characters/Crawler/crawler.xml @@ -30,7 +30,7 @@ - + diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index d69420376..9f78e2aff 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -763,19 +763,39 @@ namespace Barotrauma attackPos, AnimController.Limbs.Select(l => l.body.FarseerBody).ToList(), Physics.CollisionCharacter | Physics.CollisionWall); - + IDamageable attackTarget = null; if (body != null) { - if (body.UserData is IDamageable) - { - attackTarget = (IDamageable)body.UserData; - } - else if (body.UserData is Limb) - { - attackTarget = ((Limb)body.UserData).character; - } attackPos = Submarine.LastPickedPosition; + + if (body != null && body.UserData is Submarine) + { + var sub = ((Submarine)body.UserData); + + body = Submarine.PickBody( + attackLimb.SimPosition - ((Submarine)body.UserData).SimPosition, + attackPos - ((Submarine)body.UserData).SimPosition, + AnimController.Limbs.Select(l => l.body.FarseerBody).ToList(), + Physics.CollisionWall); + + if (body != null) + { + attackPos = Submarine.LastPickedPosition + sub.SimPosition; + attackTarget = body.UserData as IDamageable; + } + } + else + { + if (body.UserData is IDamageable) + { + attackTarget = (IDamageable)body.UserData; + } + else if (body.UserData is Limb) + { + attackTarget = ((Limb)body.UserData).character; + } + } } attackLimb.UpdateAttack(deltaTime, attackPos, attackTarget); diff --git a/Subsurface/Source/Characters/Limb.cs b/Subsurface/Source/Characters/Limb.cs index 8a86cc5a6..dc5e5ada9 100644 --- a/Subsurface/Source/Characters/Limb.cs +++ b/Subsurface/Source/Characters/Limb.cs @@ -499,7 +499,8 @@ namespace Barotrauma float dist = ConvertUnits.ToDisplayUnits(Vector2.Distance(SimPosition, attackPosition)); AttackTimer += deltaTime; - body.ApplyTorque(Mass * character.AnimController.Dir * attack.Torque); + + body.ApplyTorque(Mass * character.AnimController.Dir * attack.Torque); if (dist < attack.Range * 0.5f) {