From 270efd77e092f1888b6f029c80c27705e3875b0f Mon Sep 17 00:00:00 2001 From: Regalis Date: Wed, 10 Jun 2015 01:13:34 +0300 Subject: [PATCH] Welding tool, plasma cutter & misc item fixes/improvements --- Subsurface/Characters/Character.cs | 16 +-- Subsurface/Characters/DelayedEffect.cs | 9 +- Subsurface/Characters/StatusEffect.cs | 33 ++++-- .../Content/Items/Diving/divinggear.xml | 2 + .../Items/{OxygenTank => Diving}/item.xml | 0 .../{OxygenTank => Diving}/oxygentank.png | Bin Subsurface/Content/Items/Tools/fueltank.png | Bin 0 -> 474 bytes .../Content/Items/Tools/plasmacutter.png | Bin 0 -> 1067 bytes Subsurface/Content/Items/Tools/tools.xml | 56 ++++++++++- .../Content/Items/Tools/weldingtool.png | Bin 1368 -> 307 bytes Subsurface/Content/Particles/prefabs.xml | 11 ++ Subsurface/IPropertyObject.cs | 5 + Subsurface/Items/Components/Container.cs | 4 +- Subsurface/Items/Components/Controller.cs | 8 +- Subsurface/Items/Components/Door.cs | 20 +++- Subsurface/Items/Components/Holdable.cs | 4 +- Subsurface/Items/Components/ItemComponent.cs | 18 +++- Subsurface/Items/Components/Pickable.cs | 2 +- Subsurface/Items/Components/Projectile.cs | 4 +- Subsurface/Items/Components/RangedWeapon.cs | 15 +-- Subsurface/Items/Components/RepairTool.cs | 95 +++++++++++++----- Subsurface/Items/Components/Rope.cs | 6 +- Subsurface/Items/Components/Signal/Wire.cs | 4 +- Subsurface/Items/Components/Throwable.cs | 4 +- Subsurface/Items/Components/Turret.cs | 6 +- Subsurface/Items/Components/Wearable.cs | 4 +- Subsurface/Items/Item.cs | 18 ++-- Subsurface/Screens/EditCharacterScreen.cs | 2 +- Subsurface/Screens/EditMapScreen.cs | 2 +- Subsurface/Screens/GameScreen.cs | 11 ++ Subsurface/Subsurface.csproj | 11 +- Subsurface_Solution.v12.suo | Bin 250880 -> 227328 bytes 32 files changed, 275 insertions(+), 95 deletions(-) rename Subsurface/Content/Items/{OxygenTank => Diving}/item.xml (100%) rename Subsurface/Content/Items/{OxygenTank => Diving}/oxygentank.png (100%) create mode 100644 Subsurface/Content/Items/Tools/fueltank.png create mode 100644 Subsurface/Content/Items/Tools/plasmacutter.png diff --git a/Subsurface/Characters/Character.cs b/Subsurface/Characters/Character.cs index 76356b75c..c9eff264b 100644 --- a/Subsurface/Characters/Character.cs +++ b/Subsurface/Characters/Character.cs @@ -356,7 +356,7 @@ namespace Subsurface /// /// Control the characte /// - public void Control(Camera cam, bool forcePick=false) + public void Control(float deltaTime, Camera cam, bool forcePick=false) { if (isDead) return; @@ -383,15 +383,15 @@ namespace Subsurface if (selectedItems[i] == null) continue; if (i == 1 && selectedItems[0] == selectedItems[1]) continue; - if (actionKeyDown.State) selectedItems[i].Use(this); - if (secondaryKeyDown.State && selectedItems[i] != null) selectedItems[i].SecondaryUse(this); + if (actionKeyDown.State) selectedItems[i].Use(deltaTime, this); + if (secondaryKeyDown.State && selectedItems[i] != null) selectedItems[i].SecondaryUse(deltaTime, this); } if (selectedConstruction != null) { - if (actionKeyDown.State) selectedConstruction.Use(this); - if (secondaryKeyDown.State) selectedConstruction.SecondaryUse(this); + if (actionKeyDown.State) selectedConstruction.Use(deltaTime, this); + if (secondaryKeyDown.State) selectedConstruction.SecondaryUse(deltaTime, this); } if (IsNetworkPlayer) @@ -522,8 +522,8 @@ namespace Subsurface } if (controlled == this) ControlLocalPlayer(cam); - - Control(cam); + + Control(deltaTime, cam); UpdateSightRange(); aiTarget.SoundRange = 0.0f; @@ -781,7 +781,7 @@ namespace Subsurface new NetworkEvent(NetworkEventType.KillCharacter, ID, false); } - if (Game1.GameSession.crewManager!=null) + if (Game1.GameSession!=null && Game1.GameSession.crewManager != null) { Game1.GameSession.crewManager.KillCharacter(this); } diff --git a/Subsurface/Characters/DelayedEffect.cs b/Subsurface/Characters/DelayedEffect.cs index 1ecb3098c..1b1646083 100644 --- a/Subsurface/Characters/DelayedEffect.cs +++ b/Subsurface/Characters/DelayedEffect.cs @@ -14,9 +14,7 @@ namespace Subsurface private Item item; private Character character; - - private Limb limb; - + public float Timer { get { return timer; } @@ -28,13 +26,12 @@ namespace Subsurface delay = ToolBox.GetAttributeFloat(element, "delay", 1.0f); } - public override void Apply(ActionType type, float deltaTime, Item item, Character character = null, Limb limb = null) + public override void Apply(ActionType type, float deltaTime, Item item, Character character = null) { if (this.type != type) return; this.item = item; this.character = character; - this.limb = limb; timer = delay; @@ -47,7 +44,7 @@ namespace Subsurface if (timer > 0.0f) return; - base.Apply(1.0f, character, item, limb); + base.Apply(1.0f, character, item); list.Remove(this); } diff --git a/Subsurface/Characters/StatusEffect.cs b/Subsurface/Characters/StatusEffect.cs index 2fa7fca9c..eea50dc26 100644 --- a/Subsurface/Characters/StatusEffect.cs +++ b/Subsurface/Characters/StatusEffect.cs @@ -1,4 +1,5 @@ -using System; +using Microsoft.Xna.Framework; +using System; using System.Collections.Generic; using System.Linq; using System.Xml.Linq; @@ -10,7 +11,7 @@ namespace Subsurface [Flags] public enum Target { - This = 1, Parent = 2, Character = 4, Contained = 8, Nearby = 16 + This = 1, Parent = 2, Character = 4, Contained = 8, Nearby = 16, UseTarget=32 } private Target targets; @@ -142,14 +143,34 @@ namespace Subsurface } - public virtual void Apply(ActionType type, float deltaTime, Item item, Character character = null, Limb limb = null) + public virtual void Apply(ActionType type, float deltaTime, Item item, Character character = null) { if (this.type == type) Apply(deltaTime, character, item); - } - - protected virtual void Apply(float deltaTime, Character character, Item item, Limb limb = null) + public virtual void Apply(ActionType type, float deltaTime, Vector2 position, IPropertyObject target) + { + if (!targetNames.Contains(target.Name)) return; + if (this.type == type) Apply(deltaTime, position, target); + } + + protected virtual void Apply(float deltaTime, Vector2 position, IPropertyObject target) + { + if (explosion != null) explosion.Explode(position); + + if (sound != null) sound.Play(1.0f, 1000.0f, position); + + for (int i = 0; i < propertyNames.Count(); i++) + { + ObjectProperty property; + if (target.ObjectProperties.TryGetValue(propertyNames[i], out property)) + { + ApplyToProperty(property, propertyEffects[i], deltaTime); + } + } + } + + protected virtual void Apply(float deltaTime, Character character, Item item) { if (explosion != null) explosion.Explode(item.SimPosition); diff --git a/Subsurface/Content/Items/Diving/divinggear.xml b/Subsurface/Content/Items/Diving/divinggear.xml index cdd318394..79cdf2cfb 100644 --- a/Subsurface/Content/Items/Diving/divinggear.xml +++ b/Subsurface/Content/Items/Diving/divinggear.xml @@ -12,10 +12,12 @@ + + diff --git a/Subsurface/Content/Items/OxygenTank/item.xml b/Subsurface/Content/Items/Diving/item.xml similarity index 100% rename from Subsurface/Content/Items/OxygenTank/item.xml rename to Subsurface/Content/Items/Diving/item.xml diff --git a/Subsurface/Content/Items/OxygenTank/oxygentank.png b/Subsurface/Content/Items/Diving/oxygentank.png similarity index 100% rename from Subsurface/Content/Items/OxygenTank/oxygentank.png rename to Subsurface/Content/Items/Diving/oxygentank.png diff --git a/Subsurface/Content/Items/Tools/fueltank.png b/Subsurface/Content/Items/Tools/fueltank.png new file mode 100644 index 0000000000000000000000000000000000000000..f26b70ebe31df319982a3b2336629306648538a8 GIT binary patch literal 474 zcmV<00VV#4P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-U`a$lRCwByR69t>@5B7`2B94&C zZc(zv`R#U$@pOvw$pmLbj-Rr^_jZll#}`(gJCKwlI+A+6X#oM$hyS|!1@LtJmpH5v zj~C7a$U|`d2&m1GZ&fV7Cao>q9)eW@6O?L$+Z;M20$hy8z@=X=9~v=*j*WzB;Qi_z zUZ;VVi$@eifjrMK8jY~u?@?71%Cf{}vjx|y7%t(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZo%}b7=exiAcOiBGG^wNi>MCK?FT|@a{>xW|8d7&dm1AbXRvzSCxk)LpIsOP2OYo zTlGEPPk$|@jU<|dx! z5yvs-zPpUI7SHoA#vrA{tSY=`^PM50D01y~n=d~35NjF%{p(0Yy;&Ff%iQF@~}%vDSidJ69r#BKPCUMXWJc zXVIzV`)|G`(+Zrd{{C1PoT(P%^zMdH?X+aPYN-ylmf{EEkDJfdE!)8FWE{JjruR!IPy zKY!lcei6W#GoQQtk3Guo=dSbg;fMI`v%h)f#&vI5`paiv3N85qZ0W0sBn0O#!8 zApmrmqLd=bGE$wgZ{I!+95^7@rNS`87{jHI z^Yim`yIlZ+ARx;!gb?_?&zpx{Cd)ILb8~b$9g3pBImeaNU$+hP-Q)u_TP+%m264Q} zq?k-Uud}B1)o+2a939@ zG8puyJO8CuUgO)Zz9dN!#-kBZNQ^P0>6oIJY-MUKDhSY7#&9^~(od_?HtaU|v=Z%h zd%DZD)+iM)*KBg|_2W}hy - + - + - + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + t2^L) A`v3p{ delta 1319 zcmV+?1=#wt0@w;6iBL{Q4GJ0x0000DNk~Le0000o0000o2nGNE03JVxv5_G|e+1r1 zL_t(|+U%OoZxvM>#Xsjx`OywgN+}INbkk4}OWm@?OfGbv-g$3IT7ER8QwcYjyqTB#=FNHMd(QXVnf3K8AB>C{+!z*&HW5`apI{fjm#K*Y5JPdS1e`m-OGiGGm={!$a0f>I!CXCm zo-4pv;Ch;S3HTN`1N;np58PY}K)yIA9U1|q4C@e^WM0F(Y1o|W?2g2B!xb30EJpr- zcWwX|?JwuygVhGIn9~3LeSsyh!c1P?p5-~Z}-8O+77)o}OG$ALaaw@7$ zOjrHz>XcPP6o~0)fM45QSd9+>73tRx1|g($EjznZt%=xme=MNDOeLY8Z5znGp=`Z@ zTwZl!#HiLs&QC^I30!RjQ|a_{n?QOC*tNBOGh1$GFhe7Xq_P6L>tgc~x6;SYwYeVI zI{@nIupj~{XNAm4?O0V7c2#%v>|A$&+jaylw#mrYHYsN;7G^AU9V?|?WwGZYclVi; zv97h@SWQO8e}bQrE%mOWaA97usZG*Puin z>guCj9p(wnZiU?eP`eg3GbuD)Z_BZ2Am3fIKR@ZnmJCJ>8&+ej5gV()6iq}xOr;5v zv^YX`qEC<8zsQLj^UU0XxY^McPLm!o(6ilZnXIcjWJe-BMk2-Q3a~ik>tiucf zgTQ8qef2d%Ib-brPT5?ue*k`L6Ud``Nbds&fdjz4jWGNQ@G7udFpSs+^eXK@9<@1T z^8j`Mf3>+A|D?^ZEx=x2EQ31$jIM{BL%^T#5ikyXwwTb@5|E|FW?&RJ`M61|3gqSg dwbt19Zva}OJ)n%2##;aY002ovPDHLkV1h0BSrq^P diff --git a/Subsurface/Content/Particles/prefabs.xml b/Subsurface/Content/Particles/prefabs.xml index 8c9e90b53..a977a81bb 100644 --- a/Subsurface/Content/Particles/prefabs.xml +++ b/Subsurface/Content/Particles/prefabs.xml @@ -70,4 +70,15 @@ inwater="false" deleteonhit="true" velocitychange="0.0, 0.5"/> + + diff --git a/Subsurface/IPropertyObject.cs b/Subsurface/IPropertyObject.cs index 618fad5c2..be8de376d 100644 --- a/Subsurface/IPropertyObject.cs +++ b/Subsurface/IPropertyObject.cs @@ -4,6 +4,11 @@ namespace Subsurface { interface IPropertyObject { + string Name + { + get; + } + Dictionary ObjectProperties { get; diff --git a/Subsurface/Items/Components/Container.cs b/Subsurface/Items/Components/Container.cs index e1ebdd5a4..63c6a12db 100644 --- a/Subsurface/Items/Components/Container.cs +++ b/Subsurface/Items/Components/Container.cs @@ -162,7 +162,7 @@ namespace Subsurface.Items.Components { base.Draw(spriteBatch); - if (hideItems) return; + if (hideItems || (item.body!=null && !item.body.Enabled)) return; Vector2 transformedItemPos = itemPos; Vector2 transformedItemInterval = itemInterval; @@ -175,7 +175,7 @@ namespace Subsurface.Items.Components } else { - item.body.Enabled = true; + //item.body.Enabled = true; Matrix transform = Matrix.CreateRotationZ(item.body.Rotation); diff --git a/Subsurface/Items/Components/Controller.cs b/Subsurface/Items/Components/Controller.cs index e5b455468..1e4f2c072 100644 --- a/Subsurface/Items/Components/Controller.cs +++ b/Subsurface/Items/Components/Controller.cs @@ -134,14 +134,14 @@ namespace Subsurface.Items.Components } } - public override bool Use(Character activator = null) + public override bool Use(float deltaTime, Character activator = null) { character = activator; foreach (MapEntity e in item.linkedTo) { Item linkedItem = e as Item; if (linkedItem == null) continue; - linkedItem.Use(activator); + linkedItem.Use(deltaTime, activator); } ApplyStatusEffects(ActionType.OnUse, 1.0f, character); @@ -149,7 +149,7 @@ namespace Subsurface.Items.Components return true; } - public override void SecondaryUse(Character character = null) + public override void SecondaryUse(float deltaTime, Character character = null) { if (character == null) return; @@ -157,7 +157,7 @@ namespace Subsurface.Items.Components { Item linkedItem = e as Item; if (linkedItem == null) continue; - linkedItem.SecondaryUse(character); + linkedItem.SecondaryUse(deltaTime, character); } } diff --git a/Subsurface/Items/Components/Door.cs b/Subsurface/Items/Components/Door.cs index bc212d7f5..69d84c23a 100644 --- a/Subsurface/Items/Components/Door.cs +++ b/Subsurface/Items/Components/Door.cs @@ -19,6 +19,21 @@ namespace Subsurface.Items.Components ConvexHull convexHull; ConvexHull convexHull2; + private float stuck; + public float Stuck + { + get { return stuck; } + set + { + if (isOpen) return; + stuck = MathHelper.Clamp(value, 0.0f, 100.0f); + if (stuck == 0.0f) isStuck = false; + if (stuck == 100.0f) isStuck = true; + } + } + + private bool isStuck; + Gap LinkedGap { get @@ -35,8 +50,9 @@ namespace Subsurface.Items.Components return linkedGap; } } - + bool isOpen; + float openState; [HasDefaultValue("0.0,0.0,0.0,0.0", false)] @@ -293,6 +309,8 @@ namespace Subsurface.Items.Components public override void ReceiveSignal(string signal, Connection connection, Item sender) { + if (isStuck) return; + if (connection.name=="toggle") { isOpen = !isOpen; diff --git a/Subsurface/Items/Components/Holdable.cs b/Subsurface/Items/Components/Holdable.cs index 84b375006..47d054880 100644 --- a/Subsurface/Items/Components/Holdable.cs +++ b/Subsurface/Items/Components/Holdable.cs @@ -166,7 +166,7 @@ namespace Subsurface.Items.Components return true; } - public override bool Use(Character character = null) + public override bool Use(float deltaTime, Character character = null) { if (!attachable || item.body==null) return false; @@ -213,7 +213,7 @@ namespace Subsurface.Items.Components public override void OnMapLoaded() { - if (attached) Use(); + if (attached) Use(1.0f); } } } diff --git a/Subsurface/Items/Components/ItemComponent.cs b/Subsurface/Items/Components/ItemComponent.cs index c7d41824d..9e79166f7 100644 --- a/Subsurface/Items/Components/ItemComponent.cs +++ b/Subsurface/Items/Components/ItemComponent.cs @@ -146,6 +146,7 @@ namespace Subsurface switch (subElement.Name.ToString().ToLower()) { case "requireditem": + case "requireditems": RelatedItem ri = RelatedItem.Load(subElement); if (ri != null) requiredItems.Add(ri); break; @@ -264,13 +265,13 @@ namespace Subsurface //called when the item is equipped and left mouse button is pressed //returns true if the item was used succesfully (not out of ammo, reloading, etc) - public virtual bool Use(Character character = null) + public virtual bool Use(float deltaTime, Character character = null) { return false; } //called when the item is equipped and right mouse button is pressed - public virtual void SecondaryUse(Character character = null) { } + public virtual void SecondaryUse(float deltaTime, Character character = null) { } //called when the item is placed in a "limbslot" public virtual void Equip(Character character) { } @@ -347,12 +348,21 @@ namespace Subsurface return true; } - public void ApplyStatusEffects(ActionType type, float deltaTime, Character character = null, Limb limb = null) + public void ApplyStatusEffects(ActionType type, float deltaTime, Character character = null) { foreach (StatusEffect effect in statusEffects) { if (effect.type != type) continue; - item.ApplyStatusEffect(effect, type, deltaTime, character, limb); + item.ApplyStatusEffect(effect, type, deltaTime, character); + } + } + + public void ApplyStatusEffects(ActionType type, float deltaTime, Vector2 position, IPropertyObject target) + { + foreach (StatusEffect effect in statusEffects) + { + if (effect.type != type) continue; + effect.Apply(type, deltaTime, position, target); } } diff --git a/Subsurface/Items/Components/Pickable.cs b/Subsurface/Items/Components/Pickable.cs index c466126aa..2815ecd97 100644 --- a/Subsurface/Items/Components/Pickable.cs +++ b/Subsurface/Items/Components/Pickable.cs @@ -48,7 +48,7 @@ namespace Subsurface.Items.Components if (!picker.HasSelectedItem(item) && item.body!=null) item.body.Enabled = false; this.picker = picker; - ApplyStatusEffects(ActionType.OnPicked, 1.0f, picker, null); + ApplyStatusEffects(ActionType.OnPicked, 1.0f, picker); //foreach (StatusEffect effect in item.Prefab.statusEffects) //{ diff --git a/Subsurface/Items/Components/Projectile.cs b/Subsurface/Items/Components/Projectile.cs index 8857103a7..6a2f04b70 100644 --- a/Subsurface/Items/Components/Projectile.cs +++ b/Subsurface/Items/Components/Projectile.cs @@ -75,11 +75,11 @@ namespace Subsurface.Items.Components //} - public override bool Use(Character character = null) + public override bool Use(float deltaTime, Character character = null) { if (character != null && !characterUsable) return false; - ApplyStatusEffects(ActionType.OnUse, 1.0f, character); + //ApplyStatusEffects(ActionType.OnUse, 1.0f, character); Debug.WriteLine(item.body.Rotation); diff --git a/Subsurface/Items/Components/RangedWeapon.cs b/Subsurface/Items/Components/RangedWeapon.cs index c82aeb818..5affe69de 100644 --- a/Subsurface/Items/Components/RangedWeapon.cs +++ b/Subsurface/Items/Components/RangedWeapon.cs @@ -14,10 +14,11 @@ namespace Subsurface.Items.Components private Vector2 barrelPos; - //[Initable(new Vector2(0.0f, 0.0f))] - public Vector2 BarrelPos + [HasDefaultValue("0.0,0.0", false)] + public string BarrelPos { - get { return new Vector2(barrelPos.X * item.body.Dir, barrelPos.Y); } + get { return ToolBox.Vector2ToString(ConvertUnits.ToDisplayUnits(barrelPos)); } + set { barrelPos = ConvertUnits.ToSimUnits(ToolBox.ParseToVector2(value)); } } public Vector2 TransformedBarrelPos @@ -25,7 +26,9 @@ namespace Subsurface.Items.Components get { Matrix bodyTransform = Matrix.CreateRotationZ(item.body.Rotation); - return (Vector2.Transform(BarrelPos, bodyTransform) + item.body.Position); + Vector2 flippedPos = barrelPos; + if (item.body.Dir < 0.0f) flippedPos.X = -flippedPos.X; + return (Vector2.Transform(flippedPos, bodyTransform) + item.body.Position); } } @@ -47,7 +50,7 @@ namespace Subsurface.Items.Components } } - public override bool Use(Character character = null) + public override bool Use(float deltaTime, Character character = null) { if (character == null) return false; if (!character.SecondaryKeyDown.State || reload > 0.0f) return false; @@ -78,7 +81,7 @@ namespace Subsurface.Items.Components projectile.SetTransform(TransformedBarrelPos, (item.body.Dir == 1.0f) ? item.body.Rotation : item.body.Rotation - MathHelper.Pi); - projectile.Use(); + projectile.Use(deltaTime); item.RemoveContained(projectile); //recoil diff --git a/Subsurface/Items/Components/RepairTool.cs b/Subsurface/Items/Components/RepairTool.cs index de5cfc1bd..37049cb64 100644 --- a/Subsurface/Items/Components/RepairTool.cs +++ b/Subsurface/Items/Components/RepairTool.cs @@ -5,6 +5,7 @@ using FarseerPhysics; using FarseerPhysics.Dynamics; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; +using Subsurface.Particles; namespace Subsurface.Items.Components { @@ -16,29 +17,49 @@ namespace Subsurface.Items.Components Vector2 pickedPosition; + Vector2 barrelPos; + float structureFixAmount, limbFixAmount; - [HasDefaultValue(100.0f, false)] + [HasDefaultValue(0.0f, false)] public float Range { get { return ConvertUnits.ToDisplayUnits(range); } set { range = ConvertUnits.ToSimUnits(value); } } - [HasDefaultValue(1.0f, false)] + [HasDefaultValue(0.0f, false)] public float StructureFixAmount { get { return structureFixAmount; } set { structureFixAmount = value; } } - [HasDefaultValue(1.0f, false)] + [HasDefaultValue(0.0f, false)] public float LimbFixAmount { get { return limbFixAmount; } set { limbFixAmount = value; } } + [HasDefaultValue("0.0,0.0", false)] + public string BarrelPos + { + get { return ToolBox.Vector2ToString(ConvertUnits.ToDisplayUnits(barrelPos)); } + set { barrelPos = ConvertUnits.ToSimUnits(ToolBox.ParseToVector2(value)); } + } + + public Vector2 TransformedBarrelPos + { + get + { + Matrix bodyTransform = Matrix.CreateRotationZ(item.body.Rotation); + Vector2 flippedPos = barrelPos; + if (item.body.Dir < 0.0f) flippedPos.X = -flippedPos.X; + return (Vector2.Transform(flippedPos, bodyTransform) + item.body.Position); + } + } + public RepairTool(Item item, XElement element) : base(item, element) { @@ -69,16 +90,18 @@ namespace Subsurface.Items.Components //} - public override bool Use(Character character = null) + public override bool Use(float deltaTime, Character character = null) { if (character == null) return false; + isActive = true; + Vector2 targetPosition = item.body.Position; //targetPosition = targetPosition.X, -targetPosition.Y); targetPosition += new Vector2( - (float)Math.Cos(item.body.Rotation) * range, - (float)Math.Sin(item.body.Rotation) * range) * item.body.Dir; + (float)Math.Cos(item.body.Rotation), + (float)Math.Sin(item.body.Rotation)) * range * item.body.Dir; List ignoredBodies = new List(); foreach (Limb limb in character.animController.limbs) @@ -86,13 +109,12 @@ namespace Subsurface.Items.Components ignoredBodies.Add(limb.body.FarseerBody); } - - Body targetBody = Map.PickBody(item.body.Position, targetPosition, ignoredBodies); + Body targetBody = Map.PickBody(TransformedBarrelPos, targetPosition, ignoredBodies); pickedPosition = Map.LastPickedPosition; - if (targetBody==null || targetBody.UserData==null) return false; + if (targetBody==null || targetBody.UserData==null) return true; - ApplyStatusEffects(ActionType.OnUse, 1.0f, character); + //ApplyStatusEffects(ActionType.OnUse, 1.0f, character); Structure targetStructure; @@ -100,18 +122,14 @@ namespace Subsurface.Items.Components Item targetItem; if ((targetStructure = (targetBody.UserData as Structure)) != null) { - if (!fixableEntities.Contains(targetStructure.Name)) return false; + if (!fixableEntities.Contains(targetStructure.Name)) return true; int sectionIndex = targetStructure.FindSectionIndex(ConvertUnits.ToDisplayUnits(pickedPosition)); - if (sectionIndex < 0) return false; + if (sectionIndex < 0) return true; targetStructure.HighLightSection(sectionIndex); - if (character.SecondaryKeyDown.State) - { - targetStructure.AddDamage(sectionIndex, -structureFixAmount); - isActive = true; - } + } else if ((targetLimb = (targetBody.UserData as Limb)) != null) @@ -119,26 +137,55 @@ namespace Subsurface.Items.Components if (character.SecondaryKeyDown.State) { targetLimb.character.Health += limbFixAmount; - isActive = true; + //isActive = true; } } - else if ((targetItem = (targetBody.UserData as Item)) !=null) + else if ((targetItem = (targetBody.UserData as Item)) != null) { - targetItem.Condition -= structureFixAmount; + //targetItem.Condition -= structureFixAmount; + targetItem.IsHighlighted = true; + + foreach (StatusEffect effect in statusEffects) + { + if (Array.IndexOf(effect.TargetNames, targetItem.Name) == -1) continue; + effect.Apply(ActionType.OnUse, deltaTime, targetItem); + //targetItem.ApplyStatusEffect(effect, ActionType.OnUse, deltaTime); + } + //ApplyStatusEffects(ActionType.OnUse, 1.0f, null, targ); } + //if (character.SecondaryKeyDown.State) + //{ + // IPropertyObject propertyObject = targetBody.UserData as IPropertyObject; + // if (propertyObject!=null) ApplyStatusEffects(ActionType.OnUse, 1.0f, item.SimPosition, propertyObject); + // //isActive = true; + //} + return true; } + public override void Update(float deltaTime, Camera cam) + { + base.Update(deltaTime, cam); + + //isActive = true; + } + public override void Draw(SpriteBatch spriteBatch) { if (!isActive) return; - Vector2 startPos = ConvertUnits.ToDisplayUnits(item.body.Position); - Vector2 endPos = ConvertUnits.ToDisplayUnits(pickedPosition); - endPos = new Vector2(endPos.X + Game1.localRandom.Next(-2, 2), endPos.Y + Game1.localRandom.Next(-2, 2)); + Vector2 particleSpeed = new Vector2( + (float)Math.Cos(item.body.Rotation), + (float)Math.Sin(item.body.Rotation)) *item.body.Dir * 5.0f; - GUI.DrawLine(spriteBatch, startPos, endPos, Color.Orange, 0.0f); + Game1.particleManager.CreateParticle("weld", TransformedBarrelPos, particleSpeed); + + //Vector2 startPos = ConvertUnits.ToDisplayUnits(item.body.Position); + //Vector2 endPos = ConvertUnits.ToDisplayUnits(pickedPosition); + //endPos = new Vector2(endPos.X + Game1.localRandom.Next(-2, 2), endPos.Y + Game1.localRandom.Next(-2, 2)); + + //GUI.DrawLine(spriteBatch, startPos, endPos, Color.Orange, 0.0f); isActive = false; } diff --git a/Subsurface/Items/Components/Rope.cs b/Subsurface/Items/Components/Rope.cs index 2d89415d5..0f541e78a 100644 --- a/Subsurface/Items/Components/Rope.cs +++ b/Subsurface/Items/Components/Rope.cs @@ -40,8 +40,8 @@ namespace Subsurface.Items.Components { Vector2 barrelPos = Vector2.Zero; - RangedWeapon weapon = item.GetComponent(); - if (weapon != null) barrelPos = weapon.BarrelPos; + //RangedWeapon weapon = item.GetComponent(); + //if (weapon != null) barrelPos = weapon.barrelPos; return barrelPos; } @@ -120,7 +120,7 @@ namespace Subsurface.Items.Components } - public override void SecondaryUse(Character character = null) + public override void SecondaryUse(float deltaTime, Character character = null) { if (reload > 0.0f) return; diff --git a/Subsurface/Items/Components/Signal/Wire.cs b/Subsurface/Items/Components/Signal/Wire.cs index ced4a556c..56553d701 100644 --- a/Subsurface/Items/Components/Signal/Wire.cs +++ b/Subsurface/Items/Components/Signal/Wire.cs @@ -142,7 +142,7 @@ namespace Subsurface.Items.Components //} } - public override bool Use(Character character = null) + public override bool Use(float deltaTime, Character character = null) { if (newNodePos!= Vector2.Zero && nodes.Count>0 && Vector2.Distance(newNodePos, nodes[nodes.Count - 1]) > nodeDistance) { @@ -155,7 +155,7 @@ namespace Subsurface.Items.Components return true; } - public override void SecondaryUse(Character character = null) + public override void SecondaryUse(float deltaTime, Character character = null) { if (nodes.Count > 1) { diff --git a/Subsurface/Items/Components/Throwable.cs b/Subsurface/Items/Components/Throwable.cs index a17372f1c..78faa506f 100644 --- a/Subsurface/Items/Components/Throwable.cs +++ b/Subsurface/Items/Components/Throwable.cs @@ -25,7 +25,7 @@ namespace Subsurface.Items.Components //throwForce = ToolBox.GetAttributeFloat(element, "throwforce", 1.0f); } - public override bool Use(Character character = null) + public override bool Use(float deltaTime, Character character = null) { if (character == null) return false; if (!character.SecondaryKeyDown.State || throwing) return false; @@ -36,7 +36,7 @@ namespace Subsurface.Items.Components return true; } - public override void SecondaryUse(Character character = null) + public override void SecondaryUse(float deltaTime, Character character = null) { if (throwing) return; throwPos = 0.25f; diff --git a/Subsurface/Items/Components/Turret.cs b/Subsurface/Items/Components/Turret.cs index aca69bcdf..a5d5d3d31 100644 --- a/Subsurface/Items/Components/Turret.cs +++ b/Subsurface/Items/Components/Turret.cs @@ -123,7 +123,7 @@ namespace Subsurface.Items.Components //cam.OffsetAmount = prefab.OffsetOnSelected; } - public override void SecondaryUse(Character character = null) + public override void SecondaryUse(float deltaTime, Character character = null) { if (character == null) return; Vector2 centerPos = new Vector2(item.Rect.X + barrelPos.X, item.Rect.Y - barrelPos.Y); @@ -142,7 +142,7 @@ namespace Subsurface.Items.Components } } - public override bool Use(Character character = null) + public override bool Use(float deltaTime, Character character = null) { if (reload > 0.0f) return false; @@ -202,7 +202,7 @@ namespace Subsurface.Items.Components //if (useSounds.Count() > 0) useSounds[Game1.localRandom.Next(useSounds.Count())].Play(1.0f, 800.0f, item.body.FarseerBody); - projectileComponent.Use(); + projectileComponent.Use(deltaTime); item.RemoveContained(projectile); return true; diff --git a/Subsurface/Items/Components/Wearable.cs b/Subsurface/Items/Components/Wearable.cs index 8f59f09f6..ae3bb018f 100644 --- a/Subsurface/Items/Components/Wearable.cs +++ b/Subsurface/Items/Components/Wearable.cs @@ -119,13 +119,13 @@ namespace Subsurface.Items.Components for (int i = 0; i < limb.Length; i++) { if (limb[i] == null) continue; - ApplyStatusEffects(ActionType.OnWearing, deltaTime, picker, limb[i]); + ApplyStatusEffects(ActionType.OnWearing, deltaTime, picker); if (containedItems == null) continue; for (int j = 0; j PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -400,10 +406,10 @@ PreserveNewest - + PreserveNewest - + PreserveNewest @@ -657,6 +663,7 @@ + diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 259ad40981d885a76c226f5014e6f8fd254f6d61..248f75092fca83a86ea45e4da828a8922ccf1fc6 100644 GIT binary patch delta 14482 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 z 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