From 1e02d7406d4f7d8049bb68953986fbde4d546509 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Tue, 14 Aug 2018 15:39:01 +0300 Subject: [PATCH] Added a collider to railgun (-> cannot go through walls or enemy subs anymore). Closes #444 --- .../Content/Items/Weapons/railgun.xml | 2 ++ .../BarotraumaShared/Source/Items/Item.cs | 5 +++ .../Source/Map/SubmarineBody.cs | 34 +++++++++++++++++-- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Content/Items/Weapons/railgun.xml b/Barotrauma/BarotraumaShared/Content/Items/Weapons/railgun.xml index 11f441901..473711a84 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Weapons/railgun.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Weapons/railgun.xml @@ -8,6 +8,8 @@ + + drawableComponents; public PhysicsBody body; + + public readonly XElement staticBodyConfig; private Vector2 lastSentPos; private bool prevBodyAwake; @@ -399,6 +401,9 @@ namespace Barotrauma case "deconstruct": case "brokensprite": break; + case "staticbody": + staticBodyConfig = subElement; + break; case "aitarget": aiTarget = new AITarget(this); aiTarget.SightRange = subElement.GetAttributeFloat("sightrange", 1000.0f); diff --git a/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs b/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs index 89de82b74..48d4d8628 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs @@ -128,10 +128,38 @@ namespace Barotrauma ConvertUnits.ToSimUnits(new Vector2(rect.X + rect.Width / 2, rect.Y - rect.Height / 2)), farseerBody, this); } + + foreach (Item item in Item.ItemList) + { + if (item.staticBodyConfig == null) continue; + + float radius = ConvertUnits.ToSimUnits(item.staticBodyConfig.GetAttributeFloat("radius", 0.0f)); + float width = ConvertUnits.ToSimUnits(item.staticBodyConfig.GetAttributeFloat("width", 0.0f)); + float height = ConvertUnits.ToSimUnits(item.staticBodyConfig.GetAttributeFloat("height", 0.0f)); + + if (width != 0.0f && height != 0.0f) + { + FixtureFactory.AttachRectangle(width, height, 5.0f, ConvertUnits.ToSimUnits(item.Position), farseerBody, this); + } + else if (radius != 0.0f && width != 0.0f) + { + FixtureFactory.AttachRectangle(width, radius * 2, 5.0f, ConvertUnits.ToSimUnits(item.Position), farseerBody, this); + FixtureFactory.AttachCircle(radius, 5.0f, farseerBody, ConvertUnits.ToSimUnits(item.Position) - Vector2.UnitX * width / 2, this); + FixtureFactory.AttachCircle(radius, 5.0f, farseerBody, ConvertUnits.ToSimUnits(item.Position) + Vector2.UnitX * width / 2, this); + } + else if (radius != 0.0f && height != 0.0f) + { + FixtureFactory.AttachRectangle(radius * 2, height, 5.0f, ConvertUnits.ToSimUnits(item.Position), farseerBody, this); + FixtureFactory.AttachCircle(radius, 5.0f, farseerBody, ConvertUnits.ToSimUnits(item.Position) - Vector2.UnitY * height / 2, this); + FixtureFactory.AttachCircle(radius, 5.0f, farseerBody, ConvertUnits.ToSimUnits(item.Position) + Vector2.UnitX * height / 2, this); + } + else if (radius != 0.0f) + { + FixtureFactory.AttachCircle(radius, 5.0f, farseerBody, ConvertUnits.ToSimUnits(item.Position), this); + } + } } - - - + farseerBody.BodyType = BodyType.Dynamic; farseerBody.CollisionCategories = Physics.CollisionWall; farseerBody.CollidesWith =