From 00653c5aa40edc4c8b3d70c7b9f42cec2022dd58 Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sun, 10 Dec 2017 13:39:00 +0300 Subject: [PATCH 01/39] Renames "OnSecondaryUse" to "OnAim" for more sense adds new "OnHudUse" to separate normal and self use --- .../Content/Items/Door/doors.xml | 4 +-- .../Source/Characters/AI/HumanAIController.cs | 2 +- .../Source/Characters/Character.cs | 4 +-- .../Source/Characters/StatusEffect.cs | 12 ++++++- .../Source/Items/CharacterInventory.cs | 5 +-- .../Source/Items/Components/DockingPort.cs | 2 +- .../Items/Components/Holdable/Throwable.cs | 2 +- .../Source/Items/Components/ItemComponent.cs | 9 ++++- .../Items/Components/Machines/Controller.cs | 2 +- .../Source/Items/Components/Rope.cs | 2 +- .../Source/Items/Components/Signal/Wire.cs | 2 +- .../BarotraumaShared/Source/Items/Item.cs | 33 +++++++++++++++++-- 12 files changed, 62 insertions(+), 17 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Content/Items/Door/doors.xml b/Barotrauma/BarotraumaShared/Content/Items/Door/doors.xml index 120365d6c..5a9ee8cf4 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Door/doors.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Door/doors.xml @@ -96,7 +96,7 @@ - + @@ -127,7 +127,7 @@ - + diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs index 33e67d60d..b3a3c7d38 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs @@ -128,7 +128,7 @@ namespace Barotrauma Character.AnimController.TargetDir = Direction.Left; } - if (Character.SelectedConstruction != null) Character.SelectedConstruction.SecondaryUse(deltaTime, Character); + if (Character.SelectedConstruction != null) Character.SelectedConstruction.Aim(deltaTime, Character); } else if (Math.Abs(Character.AnimController.TargetMovement.X) > 0.1f && !Character.AnimController.InWater) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs index a506e62d1..9834a756a 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs @@ -932,13 +932,13 @@ namespace Barotrauma if (i == 1 && selectedItems[0] == selectedItems[1]) continue; if (IsKeyDown(InputType.Use)) selectedItems[i].Use(deltaTime, this); - if (IsKeyDown(InputType.Aim) && selectedItems[i] != null) selectedItems[i].SecondaryUse(deltaTime, this); + if (IsKeyDown(InputType.Aim) && selectedItems[i] != null) selectedItems[i].Aim(deltaTime, this); } if (selectedConstruction != null) { if (IsKeyDown(InputType.Use)) selectedConstruction.Use(deltaTime, this); - if (selectedConstruction != null && IsKeyDown(InputType.Aim)) selectedConstruction.SecondaryUse(deltaTime, this); + if (selectedConstruction != null && IsKeyDown(InputType.Aim)) selectedConstruction.Aim(deltaTime, this); } if (SelectedCharacter != null) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/StatusEffect.cs b/Barotrauma/BarotraumaShared/Source/Characters/StatusEffect.cs index a1d6cc4b0..d615243ad 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/StatusEffect.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/StatusEffect.cs @@ -41,6 +41,7 @@ namespace Barotrauma private readonly float duration; private readonly bool useItem; + private readonly bool hudUseItem; public readonly ActionType type; @@ -166,9 +167,11 @@ namespace Barotrauma FireSize = subElement.GetAttributeFloat("size",10.0f); break; case "use": - case "useitem": useItem = true; break; + case "huduse": + hudUseItem = true; + break; case "requireditem": case "requireditems": RelatedItem newRequiredItem = RelatedItem.Load(subElement); @@ -258,6 +261,13 @@ namespace Barotrauma item.Use(deltaTime, targets.FirstOrDefault(t => t is Character) as Character); } } + if (hudUseItem) + { + foreach (Item item in targets.FindAll(t => t is Item).Cast()) + { + item.HudUse(deltaTime, targets.FirstOrDefault(t => t is Character) as Character); + } + } foreach (ISerializableEntity target in targets) { diff --git a/Barotrauma/BarotraumaShared/Source/Items/CharacterInventory.cs b/Barotrauma/BarotraumaShared/Source/Items/CharacterInventory.cs index b25a8e34a..8d6dce863 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/CharacterInventory.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/CharacterInventory.cs @@ -36,6 +36,7 @@ namespace Barotrauma { if (Items[slotIndex] == null) return false; +//Isn't this useless? Client isn't handling status effects. Plus, this doesn't send the ActionType so it can be wrong even. #if CLIENT if (GameMain.Client != null) { @@ -46,10 +47,10 @@ namespace Barotrauma if (GameMain.Server != null) { - GameMain.Server.CreateEntityEvent(Items[slotIndex], new object[] { NetEntityEvent.Type.ApplyStatusEffect, ActionType.OnUse, character.ID }); + GameMain.Server.CreateEntityEvent(Items[slotIndex], new object[] { NetEntityEvent.Type.ApplyStatusEffect, ActionType.OnHudUse, character.ID }); } - Items[slotIndex].ApplyStatusEffects(ActionType.OnUse, 1.0f, character); + Items[slotIndex].ApplyStatusEffects(ActionType.OnHudUse, 1.0f, character); return true; } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs index 1b33e369a..7d78d1897 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs @@ -255,7 +255,7 @@ namespace Barotrauma.Items.Components dockingTarget.dockingDir = -dockingDir; #if CLIENT - PlaySound(ActionType.OnSecondaryUse, item.WorldPosition); + PlaySound(ActionType.OnAim, item.WorldPosition); #endif ConnectWireBetweenPorts(); diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Throwable.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Throwable.cs index 751a14836..909be1fdf 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Throwable.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Throwable.cs @@ -36,7 +36,7 @@ namespace Barotrauma.Items.Components return true; } - public override void SecondaryUse(float deltaTime, Character character = null) + public override void Aim(float deltaTime, Character character = null) { if (throwing) return; } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs index 26bb3f2ad..1e7096266 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs @@ -290,8 +290,15 @@ namespace Barotrauma.Items.Components return false; } + //called when the item is used via the HUD button + //returns true if the item was used succesfully (not out of ammo, reloading, etc) + public virtual bool HudUse(float deltaTime, Character character = null) + { + return false; + } + //called when the item is equipped and right mouse button is pressed - public virtual void SecondaryUse(float deltaTime, Character character = null) { } + public virtual void Aim(float deltaTime, Character character = null) { } //called when the item is placed in a "limbslot" public virtual void Equip(Character character) { } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Controller.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Controller.cs index b75f1eb4b..63aa5c5ab 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Controller.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Controller.cs @@ -160,7 +160,7 @@ namespace Barotrauma.Items.Components return true; } - public override void SecondaryUse(float deltaTime, Character character = null) + public override void Aim(float deltaTime, Character character = null) { if (this.character == null || this.character != character || this.character.SelectedConstruction != item || !character.CanInteractWith(item)) { diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Rope.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Rope.cs index db4f8068d..f1cbdd3ec 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Rope.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Rope.cs @@ -118,7 +118,7 @@ namespace Barotrauma.Items.Components } - public override void SecondaryUse(float deltaTime, Character character = null) + public override void Aim(float deltaTime, Character character = null) { if (reload > 0.0f) return; diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Wire.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Wire.cs index 086df16b3..5c8a34551 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Wire.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Wire.cs @@ -242,7 +242,7 @@ namespace Barotrauma.Items.Components return true; } - public override void SecondaryUse(float deltaTime, Character character = null) + public override void Aim(float deltaTime, Character character = null) { if (nodes.Count > 1) { diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index 5405a9816..8f1d82837 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -16,7 +16,7 @@ namespace Barotrauma { public enum ActionType { - Always, OnPicked, OnUse, OnSecondaryUse, + Always, OnPicked, OnUse, OnHudUse, OnAim, OnWearing, OnContaining, OnContained, OnActive, OnFailure, OnBroken, OnFire, InWater, @@ -800,6 +800,7 @@ namespace Barotrauma if (!ic.WasUsed) { ic.StopSounds(ActionType.OnUse); + ic.StopSounds(ActionType.OnHudUse); } #endif ic.WasUsed = false; @@ -1165,12 +1166,38 @@ namespace Barotrauma if (remove) Remove(); } - public void SecondaryUse(float deltaTime, Character character = null) + public void HudUse(float deltaTime, Character character = null) + { + if (condition == 0.0f) return; + + bool remove = false; + + foreach (ItemComponent ic in components) + { + if (!ic.HasRequiredContainedItems(character == Character.Controlled)) continue; + if (ic.HudUse(deltaTime, character)) + { + ic.WasUsed = true; + +#if CLIENT + ic.PlaySound(ActionType.OnHudUse, WorldPosition); +#endif + + ic.ApplyStatusEffects(ActionType.OnHudUse, deltaTime, character); + + if (ic.DeleteOnUse) remove = true; + } + } + + if (remove) Remove(); + } + + public void Aim(float deltaTime, Character character = null) { foreach (ItemComponent ic in components) { if (!ic.HasRequiredContainedItems(character == Character.Controlled)) continue; - ic.SecondaryUse(deltaTime, character); + ic.Aim(deltaTime, character); } } From 1d6d1a066f2149def47a86639a65adb857722553 Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sun, 10 Dec 2017 13:45:12 +0300 Subject: [PATCH 02/39] realised half way through that I don't even need a new action type, oops --- .../Source/Characters/StatusEffect.cs | 12 +------- .../Source/Items/CharacterInventory.cs | 5 ++-- .../Source/Items/Components/ItemComponent.cs | 7 ----- .../BarotraumaShared/Source/Items/Item.cs | 30 +------------------ 4 files changed, 4 insertions(+), 50 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/StatusEffect.cs b/Barotrauma/BarotraumaShared/Source/Characters/StatusEffect.cs index d615243ad..a1d6cc4b0 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/StatusEffect.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/StatusEffect.cs @@ -41,7 +41,6 @@ namespace Barotrauma private readonly float duration; private readonly bool useItem; - private readonly bool hudUseItem; public readonly ActionType type; @@ -167,11 +166,9 @@ namespace Barotrauma FireSize = subElement.GetAttributeFloat("size",10.0f); break; case "use": + case "useitem": useItem = true; break; - case "huduse": - hudUseItem = true; - break; case "requireditem": case "requireditems": RelatedItem newRequiredItem = RelatedItem.Load(subElement); @@ -261,13 +258,6 @@ namespace Barotrauma item.Use(deltaTime, targets.FirstOrDefault(t => t is Character) as Character); } } - if (hudUseItem) - { - foreach (Item item in targets.FindAll(t => t is Item).Cast()) - { - item.HudUse(deltaTime, targets.FirstOrDefault(t => t is Character) as Character); - } - } foreach (ISerializableEntity target in targets) { diff --git a/Barotrauma/BarotraumaShared/Source/Items/CharacterInventory.cs b/Barotrauma/BarotraumaShared/Source/Items/CharacterInventory.cs index 8d6dce863..b25a8e34a 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/CharacterInventory.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/CharacterInventory.cs @@ -36,7 +36,6 @@ namespace Barotrauma { if (Items[slotIndex] == null) return false; -//Isn't this useless? Client isn't handling status effects. Plus, this doesn't send the ActionType so it can be wrong even. #if CLIENT if (GameMain.Client != null) { @@ -47,10 +46,10 @@ namespace Barotrauma if (GameMain.Server != null) { - GameMain.Server.CreateEntityEvent(Items[slotIndex], new object[] { NetEntityEvent.Type.ApplyStatusEffect, ActionType.OnHudUse, character.ID }); + GameMain.Server.CreateEntityEvent(Items[slotIndex], new object[] { NetEntityEvent.Type.ApplyStatusEffect, ActionType.OnUse, character.ID }); } - Items[slotIndex].ApplyStatusEffects(ActionType.OnHudUse, 1.0f, character); + Items[slotIndex].ApplyStatusEffects(ActionType.OnUse, 1.0f, character); return true; } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs index 1e7096266..970d7d23f 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs @@ -290,13 +290,6 @@ namespace Barotrauma.Items.Components return false; } - //called when the item is used via the HUD button - //returns true if the item was used succesfully (not out of ammo, reloading, etc) - public virtual bool HudUse(float deltaTime, Character character = null) - { - return false; - } - //called when the item is equipped and right mouse button is pressed public virtual void Aim(float deltaTime, Character character = null) { } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index 8f1d82837..2da3079f7 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -16,7 +16,7 @@ namespace Barotrauma { public enum ActionType { - Always, OnPicked, OnUse, OnHudUse, OnAim, + Always, OnPicked, OnUse, OnAim, OnWearing, OnContaining, OnContained, OnActive, OnFailure, OnBroken, OnFire, InWater, @@ -800,7 +800,6 @@ namespace Barotrauma if (!ic.WasUsed) { ic.StopSounds(ActionType.OnUse); - ic.StopSounds(ActionType.OnHudUse); } #endif ic.WasUsed = false; @@ -1166,33 +1165,6 @@ namespace Barotrauma if (remove) Remove(); } - public void HudUse(float deltaTime, Character character = null) - { - if (condition == 0.0f) return; - - bool remove = false; - - foreach (ItemComponent ic in components) - { - if (!ic.HasRequiredContainedItems(character == Character.Controlled)) continue; - if (ic.HudUse(deltaTime, character)) - { - ic.WasUsed = true; - -#if CLIENT - ic.PlaySound(ActionType.OnHudUse, WorldPosition); -#endif - - ic.ApplyStatusEffects(ActionType.OnHudUse, deltaTime, character); - - if (ic.DeleteOnUse) remove = true; - } - } - - if (remove) Remove(); - } - - public void Aim(float deltaTime, Character character = null) { foreach (ItemComponent ic in components) { From 231a38f71dc2bc542feed514366feca96ba4daef Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sun, 10 Dec 2017 15:00:52 +0300 Subject: [PATCH 03/39] roll back name change from "Aim" to "SecondaryUse" Expand SecondaryUse to have similar properties to normal Use so it can apply SecondaryUse-related status effects Make Throwable great again --- .../Source/Characters/AI/HumanAIController.cs | 2 +- .../Source/Characters/Character.cs | 4 ++-- .../Source/Items/Components/DockingPort.cs | 2 +- .../Items/Components/Holdable/Throwable.cs | 15 ++++-------- .../Source/Items/Components/ItemComponent.cs | 5 +++- .../Items/Components/Machines/Controller.cs | 2 +- .../Source/Items/Components/Rope.cs | 7 +++--- .../Source/Items/Components/Signal/Wire.cs | 3 ++- .../BarotraumaShared/Source/Items/Item.cs | 23 +++++++++++++++++-- 9 files changed, 41 insertions(+), 22 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs index b3a3c7d38..33e67d60d 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/HumanAIController.cs @@ -128,7 +128,7 @@ namespace Barotrauma Character.AnimController.TargetDir = Direction.Left; } - if (Character.SelectedConstruction != null) Character.SelectedConstruction.Aim(deltaTime, Character); + if (Character.SelectedConstruction != null) Character.SelectedConstruction.SecondaryUse(deltaTime, Character); } else if (Math.Abs(Character.AnimController.TargetMovement.X) > 0.1f && !Character.AnimController.InWater) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs index 9834a756a..a506e62d1 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs @@ -932,13 +932,13 @@ namespace Barotrauma if (i == 1 && selectedItems[0] == selectedItems[1]) continue; if (IsKeyDown(InputType.Use)) selectedItems[i].Use(deltaTime, this); - if (IsKeyDown(InputType.Aim) && selectedItems[i] != null) selectedItems[i].Aim(deltaTime, this); + if (IsKeyDown(InputType.Aim) && selectedItems[i] != null) selectedItems[i].SecondaryUse(deltaTime, this); } if (selectedConstruction != null) { if (IsKeyDown(InputType.Use)) selectedConstruction.Use(deltaTime, this); - if (selectedConstruction != null && IsKeyDown(InputType.Aim)) selectedConstruction.Aim(deltaTime, this); + if (selectedConstruction != null && IsKeyDown(InputType.Aim)) selectedConstruction.SecondaryUse(deltaTime, this); } if (SelectedCharacter != null) diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs index 7d78d1897..1b33e369a 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs @@ -255,7 +255,7 @@ namespace Barotrauma.Items.Components dockingTarget.dockingDir = -dockingDir; #if CLIENT - PlaySound(ActionType.OnAim, item.WorldPosition); + PlaySound(ActionType.OnSecondaryUse, item.WorldPosition); #endif ConnectWireBetweenPorts(); diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Throwable.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Throwable.cs index 909be1fdf..bf5cc7835 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Throwable.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Throwable.cs @@ -27,18 +27,13 @@ namespace Barotrauma.Items.Components public override bool Use(float deltaTime, Character character = null) { - if (character == null) return false; - if (!character.IsKeyDown(InputType.Aim) || throwing) return false; - - throwing = true; - - IsActive = true; - return true; + return true; //We do the actual throwing in Aim because Use might be used by chems } - public override void Aim(float deltaTime, Character character = null) + public override bool SecondaryUse(float deltaTime, Character character = null) { - if (throwing) return; + if (!throwing) return false; //This should only be triggered + return true; } public override void Drop(Character dropper) @@ -103,7 +98,7 @@ namespace Barotrauma.Items.Components Limb rightHand = ac.GetLimb(LimbType.RightHand); item.body.AngularVelocity = rightHand.body.AngularVelocity; - + ApplyStatusEffects(ActionType.OnSecondaryUse, deltaTime, picker); //Stun grenades, flares, etc. all have their throw-related things handled in "onSecondaryUse" throwing = false; } } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs index 970d7d23f..f6d7cb494 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs @@ -291,7 +291,10 @@ namespace Barotrauma.Items.Components } //called when the item is equipped and right mouse button is pressed - public virtual void Aim(float deltaTime, Character character = null) { } + public virtual bool SecondaryUse(float deltaTime, Character character = null) + { + return false; + } //called when the item is placed in a "limbslot" public virtual void Equip(Character character) { } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Controller.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Controller.cs index 63aa5c5ab..ae4b7dde7 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Controller.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Controller.cs @@ -160,7 +160,7 @@ namespace Barotrauma.Items.Components return true; } - public override void Aim(float deltaTime, Character character = null) + public override bool SecondaryUse(float deltaTime, Character character = null) { if (this.character == null || this.character != character || this.character.SelectedConstruction != item || !character.CanInteractWith(item)) { diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Rope.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Rope.cs index f1cbdd3ec..feb13df8a 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Rope.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Rope.cs @@ -118,9 +118,9 @@ namespace Barotrauma.Items.Components } - public override void Aim(float deltaTime, Character character = null) + public override bool SecondaryUse(float deltaTime, Character character = null) { - if (reload > 0.0f) return; + if (reload > 0.0f) return false; bool first = true; for (int i = 0; i < ropeBodies.Length - 1; i++) @@ -157,7 +157,8 @@ namespace Barotrauma.Items.Components //ropeBodies[i + 1].ApplyForce(dist / length * pullForce * 0.1f); } - } + } + return true; } private void NextSection(int i) diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Wire.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Wire.cs index 5c8a34551..99cd54835 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Wire.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Wire.cs @@ -242,7 +242,7 @@ namespace Barotrauma.Items.Components return true; } - public override void Aim(float deltaTime, Character character = null) + public override bool SecondaryUse(float deltaTime, Character character = null) { if (nodes.Count > 1) { @@ -251,6 +251,7 @@ namespace Barotrauma.Items.Components } Drawable = IsActive || sections.Count > 0; + return true; } public override bool Pick(Character picker) diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index 2da3079f7..822a6ffe7 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -16,7 +16,7 @@ namespace Barotrauma { public enum ActionType { - Always, OnPicked, OnUse, OnAim, + Always, OnPicked, OnUse, OnSecondaryUse, OnWearing, OnContaining, OnContained, OnActive, OnFailure, OnBroken, OnFire, InWater, @@ -800,6 +800,7 @@ namespace Barotrauma if (!ic.WasUsed) { ic.StopSounds(ActionType.OnUse); + ic.StopSounds(ActionType.OnSecondaryUse); } #endif ic.WasUsed = false; @@ -1165,12 +1166,30 @@ namespace Barotrauma if (remove) Remove(); } + public void SecondaryUse(float deltaTime, Character character = null) { + if (condition == 0.0f) return; + + bool remove = false; + foreach (ItemComponent ic in components) { if (!ic.HasRequiredContainedItems(character == Character.Controlled)) continue; - ic.Aim(deltaTime, character); + if (ic.Use(deltaTime, character)) + { + ic.WasUsed = true; + +#if CLIENT + ic.PlaySound(ActionType.OnSecondaryUse, WorldPosition); +#endif + + ic.ApplyStatusEffects(ActionType.OnSecondaryUse, deltaTime, character); + + if (ic.DeleteOnUse) remove = true; + } } + + if (remove) Remove(); } public List GetHUDTexts(Character character) From 55dd58579fbdfaaef7779510200efe309d73d373 Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sun, 10 Dec 2017 15:56:34 +0300 Subject: [PATCH 04/39] I DID IT HOLY SHIT I GONE AND DONE IT OnSecondaryUse is what throwing uses for doing things SPECIFICALLY on throw. This way, you can theoretically have grenades on which you'll have to pull the pin before throwing. This also lets flares be used without the need to throw them. did i mention my brain hurts --- .../BarotraumaShared/Content/Items/Door/doors.xml | 4 ++-- .../Content/Items/Weapons/weapons.xml | 4 ++-- .../Source/Items/Components/Holdable/Throwable.cs | 14 ++++++++++++-- .../Source/Items/Components/Machines/Controller.cs | 8 +++++--- Barotrauma/BarotraumaShared/Source/Items/Item.cs | 2 +- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Content/Items/Door/doors.xml b/Barotrauma/BarotraumaShared/Content/Items/Door/doors.xml index 5a9ee8cf4..120365d6c 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Door/doors.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Door/doors.xml @@ -96,7 +96,7 @@ - + @@ -127,7 +127,7 @@ - + diff --git a/Barotrauma/BarotraumaShared/Content/Items/Weapons/weapons.xml b/Barotrauma/BarotraumaShared/Content/Items/Weapons/weapons.xml index 454ed82e2..37854344d 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Weapons/weapons.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Weapons/weapons.xml @@ -117,7 +117,7 @@ - + @@ -134,7 +134,7 @@ - + diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Throwable.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Throwable.cs index bf5cc7835..968ece938 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Throwable.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Throwable.cs @@ -11,6 +11,7 @@ namespace Barotrauma.Items.Components float throwPos; bool throwing; + bool throwDone; [Serialize(1.0f, false)] public float ThrowForce @@ -32,7 +33,8 @@ namespace Barotrauma.Items.Components public override bool SecondaryUse(float deltaTime, Character character = null) { - if (!throwing) return false; //This should only be triggered + if (!throwDone) return false; //This should only be triggered in update + throwDone = false; return true; } @@ -52,7 +54,14 @@ namespace Barotrauma.Items.Components public override void Update(float deltaTime, Camera cam) { if (!item.body.Enabled) return; - if (!picker.HasSelectedItem(item)) IsActive = false; + if (!picker.HasSelectedItem(item)) + { + IsActive = false; + return; + } + + if (picker.IsKeyDown(InputType.Aim) && picker.IsKeyHit(InputType.Use)) + throwing = true; if (!picker.IsKeyDown(InputType.Aim) && !throwing) throwPos = 0.0f; @@ -98,6 +107,7 @@ namespace Barotrauma.Items.Components Limb rightHand = ac.GetLimb(LimbType.RightHand); item.body.AngularVelocity = rightHand.body.AngularVelocity; + throwDone = true; ApplyStatusEffects(ActionType.OnSecondaryUse, deltaTime, picker); //Stun grenades, flares, etc. all have their throw-related things handled in "onSecondaryUse" throwing = false; } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Controller.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Controller.cs index ae4b7dde7..3dbd1799a 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Controller.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Controller.cs @@ -165,15 +165,15 @@ namespace Barotrauma.Items.Components if (this.character == null || this.character != character || this.character.SelectedConstruction != item || !character.CanInteractWith(item)) { character = null; - return; + return false; } - if (character == null) return; + if (character == null) return false; Entity focusTarget = GetFocusTarget(); if (focusTarget == null) { item.SendSignal(0, XMLExtensions.Vector2ToString(character.CursorWorldPosition), "position_out", character); - return; + return false; } character.ViewTarget = focusTarget; @@ -191,6 +191,8 @@ namespace Barotrauma.Items.Components { item.SendSignal(0, XMLExtensions.Vector2ToString(character.CursorWorldPosition), "position_out", character); } + + return true; } private Item GetFocusTarget() diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index 822a6ffe7..d6c4d2aad 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -1175,7 +1175,7 @@ namespace Barotrauma foreach (ItemComponent ic in components) { if (!ic.HasRequiredContainedItems(character == Character.Controlled)) continue; - if (ic.Use(deltaTime, character)) + if (ic.SecondaryUse(deltaTime, character)) { ic.WasUsed = true; From a2a4225598027ce925a7750a21f992fa8465ccfe Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sun, 10 Dec 2017 22:17:14 +0300 Subject: [PATCH 05/39] Added a fully functional syringe gun! Accepts syringes as ammo. Has custom sprite and sound. Made syringes have a "projectile" component for syringe guns Adds several missing signal components to the fabricator, as well as medical syringe to medical fabricator Adds support for status effects applied to characters from onImpact Removed "contained.Condition = 0.0f;" in Projectile.cs due to it limiting the possibilities of the .xml content creation Added a couple null checks in StatusEffect.cs due to crashes caused by the new projectile changes - might need to debug further, perhaps there's a root cause? Added itemlist console command --- .../BarotraumaShared.projitems | 3 ++ .../Content/Items/Fabricators/fabricators.xml | 6 +++- .../Content/Items/Medical/medical.xml | 9 +++++ .../Content/Items/Weapons/syringegun.ogg | Bin 0 -> 6508 bytes .../Content/Items/Weapons/weapons.png | Bin 13883 -> 17026 bytes .../Content/Items/Weapons/weapons.xml | 32 ++++++++++++++++++ .../Source/Characters/StatusEffect.cs | 2 +- .../BarotraumaShared/Source/DebugConsole.cs | 11 ++++++ .../Source/Items/Components/Projectile.cs | 13 ++++--- 9 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 Barotrauma/BarotraumaShared/Content/Items/Weapons/syringegun.ogg diff --git a/Barotrauma/BarotraumaShared/BarotraumaShared.projitems b/Barotrauma/BarotraumaShared/BarotraumaShared.projitems index 0f3ac76c9..5a76b4df1 100644 --- a/Barotrauma/BarotraumaShared/BarotraumaShared.projitems +++ b/Barotrauma/BarotraumaShared/BarotraumaShared.projitems @@ -1021,6 +1021,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/Barotrauma/BarotraumaShared/Content/Items/Fabricators/fabricators.xml b/Barotrauma/BarotraumaShared/Content/Items/Fabricators/fabricators.xml index e90a36068..9ccb70b2f 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Fabricators/fabricators.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Fabricators/fabricators.xml @@ -40,13 +40,16 @@ + + + - + @@ -96,6 +99,7 @@ + diff --git a/Barotrauma/BarotraumaShared/Content/Items/Medical/medical.xml b/Barotrauma/BarotraumaShared/Content/Items/Medical/medical.xml index 229e9bce8..5a2d67126 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Medical/medical.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Medical/medical.xml @@ -25,6 +25,15 @@ + + + + + + + + + >wglS@r; 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 h|27NSjTd^r#yiHput>oi diff --git a/Barotrauma/BarotraumaShared/Content/Items/Weapons/weapons.xml b/Barotrauma/BarotraumaShared/Content/Items/Weapons/weapons.xml index 454ed82e2..e3988b2db 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Weapons/weapons.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Weapons/weapons.xml @@ -56,6 +56,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0f) { diff --git a/Barotrauma/BarotraumaShared/Source/DebugConsole.cs b/Barotrauma/BarotraumaShared/Source/DebugConsole.cs index 15b2e7ffa..6c86da3b1 100644 --- a/Barotrauma/BarotraumaShared/Source/DebugConsole.cs +++ b/Barotrauma/BarotraumaShared/Source/DebugConsole.cs @@ -114,6 +114,17 @@ namespace Barotrauma NewMessage("The code words are: " + traitorManager.codeWords + ", response: " + traitorManager.codeResponse + ".", Color.Cyan); })); + commands.Add(new Command("itemlist", "itemlist: List all the item prefabs available for spawning.", (string[] args) => + { + NewMessage("***************", Color.Cyan); + foreach (ItemPrefab itemPrefab in MapEntityPrefab.List) + { + + NewMessage("- " + itemPrefab.Name, Color.Cyan); + } + NewMessage("***************", Color.Cyan); + })); + commands.Add(new Command("createfilelist", "", (string[] args) => { UpdaterUtil.SaveFileList("filelist.xml"); diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Projectile.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Projectile.cs index 16e8b97a7..6eb8cd2ab 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Projectile.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Projectile.cs @@ -237,6 +237,7 @@ namespace Barotrauma.Items.Components } AttackResult attackResult = new AttackResult(); + Character character = null; if (attack != null) { var submarine = target.Body.UserData as Submarine; @@ -248,11 +249,13 @@ namespace Barotrauma.Items.Components return true; } - Limb limb; + Limb limb = target.Body.UserData as Limb; Structure structure; - if ((limb = (target.Body.UserData as Limb)) != null) + if (limb != null) { attackResult = attack.DoDamageToLimb(User, limb, item.WorldPosition, 1.0f); + if (limb.character != null) + character = limb.character; } else if ((structure = (target.Body.UserData as Structure)) != null) { @@ -260,8 +263,8 @@ namespace Barotrauma.Items.Components } } - ApplyStatusEffects(ActionType.OnUse, 1.0f); - ApplyStatusEffects(ActionType.OnImpact, 1.0f); + ApplyStatusEffects(ActionType.OnUse, 1.0f, character); + ApplyStatusEffects(ActionType.OnImpact, 1.0f, character); IsActive = false; @@ -306,7 +309,7 @@ namespace Barotrauma.Items.Components { contained.SetTransform(item.SimPosition, contained.body.Rotation); } - contained.Condition = 0.0f; + //contained.Condition = 0.0f; //Let the freaking .xml handle it jeez } } From f34968be30c7fdfec40ea6ac2c6600b7d8db7d5a Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Mon, 11 Dec 2017 12:33:59 +0300 Subject: [PATCH 06/39] Tweaked visuals a bit Added tiny bleeding and structure damage to the syringes --- .../Content/Items/Medical/medical.xml | 2 +- .../Content/Items/Weapons/weapons.png | Bin 17026 -> 16957 bytes .../Content/Items/Weapons/weapons.xml | 4 ++-- .../BarotraumaShared/Source/DebugConsole.cs | 5 +++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Content/Items/Medical/medical.xml b/Barotrauma/BarotraumaShared/Content/Items/Medical/medical.xml index 5a2d67126..e09b4a293 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Medical/medical.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Medical/medical.xml @@ -27,7 +27,7 @@ - + diff --git a/Barotrauma/BarotraumaShared/Content/Items/Weapons/weapons.png b/Barotrauma/BarotraumaShared/Content/Items/Weapons/weapons.png index 2be499b8863065acce4c007fe987d74277ce9a60..2bd2a36f06f51013ee0f9469c45c76760b69a051 100644 GIT binary patch delta 16631 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 delta 16722 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 Hl+XkKjW`fu diff --git a/Barotrauma/BarotraumaShared/Content/Items/Weapons/weapons.xml b/Barotrauma/BarotraumaShared/Content/Items/Weapons/weapons.xml index e3988b2db..47df72bc1 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Weapons/weapons.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Weapons/weapons.xml @@ -76,14 +76,14 @@ - + - + diff --git a/Barotrauma/BarotraumaShared/Source/DebugConsole.cs b/Barotrauma/BarotraumaShared/Source/DebugConsole.cs index 6c86da3b1..12e257202 100644 --- a/Barotrauma/BarotraumaShared/Source/DebugConsole.cs +++ b/Barotrauma/BarotraumaShared/Source/DebugConsole.cs @@ -117,9 +117,10 @@ namespace Barotrauma commands.Add(new Command("itemlist", "itemlist: List all the item prefabs available for spawning.", (string[] args) => { NewMessage("***************", Color.Cyan); - foreach (ItemPrefab itemPrefab in MapEntityPrefab.List) + foreach (MapEntityPrefab ep in MapEntityPrefab.List) { - + var itemPrefab = ep as ItemPrefab; + if (itemPrefab == null || itemPrefab.Name == null) continue; NewMessage("- " + itemPrefab.Name, Color.Cyan); } NewMessage("***************", Color.Cyan); From 4a1ba21067ee92fb18b6ad4ac29f2190eace4b06 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Tue, 12 Dec 2017 22:21:29 +0200 Subject: [PATCH 07/39] Fixed OnActive statuseffects not being applied on powered items that don't require power (prevented flare particles from working because they are configured in the LightComponent that inherits from Powered) --- .../Source/Items/Components/Power/Powered.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Power/Powered.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Power/Powered.cs index 3f17757a3..60e3da7d2 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Power/Powered.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Power/Powered.cs @@ -88,7 +88,16 @@ namespace Barotrauma.Items.Components public override void Update(float deltaTime, Camera cam) { - if (currPowerConsumption == 0.0f) return; + if (currPowerConsumption == 0.0f) + { + //if the item consumes no power, ignore the voltage requirement and + //apply OnActive statuseffects as long as this component is active + if (powerConsumption == 0.0f) + { + ApplyStatusEffects(ActionType.OnActive, deltaTime, null); + } + return; + } #if CLIENT if (voltage > minVoltage) From 23b220b6afc8835becb627a66ba75ec38cef8c87 Mon Sep 17 00:00:00 2001 From: juanjp600 Date: Tue, 12 Dec 2017 17:58:49 -0300 Subject: [PATCH 08/39] Sync character collider rotation, try to make collider face the main limb by instantly flipping it if the angle's too wide, client-side ragdoll correction is more aggressive --- .../Source/Characters/CharacterNetworking.cs | 5 +++-- .../Animation/HumanoidAnimController.cs | 10 ++++++--- .../Source/Characters/Animation/Ragdoll.cs | 11 +++++++--- .../Source/Characters/CharacterNetworking.cs | 14 +++++++------ .../BarotraumaShared/Source/Map/Submarine.cs | 2 +- .../Source/Physics/PhysicsBody.cs | 21 ++++++++++++------- 6 files changed, 41 insertions(+), 22 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs b/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs index ec44d08af..4f043091d 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs @@ -138,11 +138,12 @@ namespace Barotrauma msg.ReadFloat(), msg.ReadFloat()); + float rotation = msg.ReadFloat(); int index = 0; if (GameMain.NetworkMember.Character == this && AllowInput) { - var posInfo = new CharacterStateInfo(pos, networkUpdateID, facingRight ? Direction.Right : Direction.Left, selectedEntity, animation); + var posInfo = new CharacterStateInfo(pos, rotation, networkUpdateID, facingRight ? Direction.Right : Direction.Left, selectedEntity, animation); while (index < memState.Count && NetIdUtils.IdMoreRecent(posInfo.ID, memState[index].ID)) index++; @@ -150,7 +151,7 @@ namespace Barotrauma } else { - var posInfo = new CharacterStateInfo(pos, sendingTime, facingRight ? Direction.Right : Direction.Left, selectedEntity, animation); + var posInfo = new CharacterStateInfo(pos, rotation, sendingTime, facingRight ? Direction.Right : Direction.Left, selectedEntity, animation); while (index < memState.Count && posInfo.Timestamp > memState[index].Timestamp) index++; diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs b/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs index 9c9a70b4a..f6962526c 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs @@ -83,9 +83,13 @@ namespace Barotrauma { levitatingCollider = false; Collider.FarseerBody.FixedRotation = false; - - Collider.LinearVelocity = (GetLimb(LimbType.Waist).SimPosition - Collider.SimPosition) * 20.0f; - Collider.SmoothRotate(GetLimb(LimbType.Torso).Rotation); + + if (Math.Abs(Collider.Rotation-GetLimb(LimbType.Torso).Rotation)>Math.PI*0.6f) + { + Collider.SetTransform(Collider.SimPosition, MathHelper.WrapAngle(Collider.Rotation + (float)Math.PI)); + } + Collider.SmoothRotate(GetLimb(LimbType.Torso).Rotation); + Collider.LinearVelocity = (GetLimb(LimbType.Waist).SimPosition - Collider.SimPosition) * 20.0f; return; } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs b/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs index 2feb08dd3..1a9442acd 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs @@ -1339,13 +1339,18 @@ namespace Barotrauma } } - Vector2 positionError = serverPos.Position - localPos.Position; + Vector2 positionError = serverPos.Position - localPos.Position; + float rotationError = serverPos.Rotation - localPos.Rotation; for (int i = localPosIndex; i < character.MemLocalState.Count; i++) { - character.MemLocalState[i].Translate(positionError); + character.MemLocalState[i].Translate(positionError,rotationError); } - Collider.SetTransform(Collider.SimPosition + positionError, Collider.Rotation); + Collider.SetTransform(Collider.SimPosition + positionError, Collider.Rotation + rotationError); + foreach (Limb limb in Limbs) + { + limb.body.SetTransform(limb.body.SimPosition + positionError, limb.body.Rotation + rotationError); + } } if (character.MemLocalState.Count > 120) character.MemLocalState.RemoveRange(0, character.MemLocalState.Count - 120); diff --git a/Barotrauma/BarotraumaShared/Source/Characters/CharacterNetworking.cs b/Barotrauma/BarotraumaShared/Source/Characters/CharacterNetworking.cs index 217156842..1a6ec6b07 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/CharacterNetworking.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/CharacterNetworking.cs @@ -15,18 +15,18 @@ namespace Barotrauma public readonly AnimController.Animation Animation; - public CharacterStateInfo(Vector2 pos, float time, Direction dir, Entity interact, AnimController.Animation animation = AnimController.Animation.None) - : this(pos, 0, time, dir, interact, animation) + public CharacterStateInfo(Vector2 pos, float rotation, float time, Direction dir, Entity interact, AnimController.Animation animation = AnimController.Animation.None) + : this(pos, rotation, 0, time, dir, interact, animation) { } - public CharacterStateInfo(Vector2 pos, UInt16 ID, Direction dir, Entity interact, AnimController.Animation animation = AnimController.Animation.None) - : this(pos, ID, 0.0f, dir, interact, animation) + public CharacterStateInfo(Vector2 pos, float rotation, UInt16 ID, Direction dir, Entity interact, AnimController.Animation animation = AnimController.Animation.None) + : this(pos, rotation, ID, 0.0f, dir, interact, animation) { } - protected CharacterStateInfo(Vector2 pos, UInt16 ID, float time, Direction dir, Entity interact, AnimController.Animation animation = AnimController.Animation.None) - : base(pos, ID, time) + protected CharacterStateInfo(Vector2 pos, float rotation, UInt16 ID, float time, Direction dir, Entity interact, AnimController.Animation animation = AnimController.Animation.None) + : base(pos, rotation, ID, time) { Direction = dir; Interact = interact; @@ -197,6 +197,7 @@ namespace Barotrauma { var posInfo = new CharacterStateInfo( SimPosition, + AnimController.Collider.Rotation, LastNetworkUpdateID, AnimController.TargetDir, SelectedCharacter == null ? (Entity)selectedConstruction : (Entity)SelectedCharacter, @@ -467,6 +468,7 @@ namespace Barotrauma tempBuffer.Write(SimPosition.X); tempBuffer.Write(SimPosition.Y); + tempBuffer.Write(AnimController.Collider.Rotation); tempBuffer.WritePadBits(); diff --git a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs index 45b4f17c0..5a4ae4962 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs @@ -1258,7 +1258,7 @@ namespace Barotrauma return; } - subBody.MemPos.Insert(index, new PosInfo(newTargetPosition, sendingTime)); + subBody.MemPos.Insert(index, new PosInfo(newTargetPosition, 0.0f, sendingTime)); } } diff --git a/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs b/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs index 4c54d48fd..3cfa569da 100644 --- a/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs +++ b/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs @@ -16,22 +16,29 @@ namespace Barotrauma private set; } + public float Rotation + { + get; + private set; + } + public readonly float Timestamp; public readonly UInt16 ID; - public PosInfo(Vector2 pos, float time) - : this(pos, 0, time) + public PosInfo(Vector2 pos, float rotation, float time) + : this(pos, rotation, 0, time) { } - public PosInfo(Vector2 pos, UInt16 ID) - : this(pos, ID, 0.0f) + public PosInfo(Vector2 pos, float rotation, UInt16 ID) + : this(pos, rotation, ID, 0.0f) { } - protected PosInfo(Vector2 pos, UInt16 ID, float time) + protected PosInfo(Vector2 pos, float rotation, UInt16 ID, float time) { Position = pos; + Rotation = rotation; this.ID = ID; Timestamp = time; @@ -52,9 +59,9 @@ namespace Barotrauma } } - public void Translate(Vector2 amount) + public void Translate(Vector2 posAmount,float rotationAmount) { - Position += amount; + Position += posAmount; Rotation += rotationAmount; } } From c4e894cb2e2b5ea844fbbac3edd267933d00d8f4 Mon Sep 17 00:00:00 2001 From: juanjp600 Date: Tue, 12 Dec 2017 21:08:37 -0300 Subject: [PATCH 09/39] Fixed camera going insane when dropping through hatches TODO: make the game less rubberbandy --- .../Source/Characters/CharacterNetworking.cs | 2 +- .../Source/Characters/Animation/Ragdoll.cs | 22 ++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs b/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs index 4f043091d..82418a2a4 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs @@ -141,7 +141,7 @@ namespace Barotrauma float rotation = msg.ReadFloat(); int index = 0; - if (GameMain.NetworkMember.Character == this && AllowInput) + if (GameMain.NetworkMember.Character == this) { var posInfo = new CharacterStateInfo(pos, rotation, networkUpdateID, facingRight ? Direction.Right : Direction.Left, selectedEntity, animation); while (index < memState.Count && NetIdUtils.IdMoreRecent(posInfo.ID, memState[index].ID)) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs b/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs index 1a9442acd..a0dbe6343 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs @@ -1339,17 +1339,33 @@ namespace Barotrauma } } + Hull serverHull = Hull.FindHull(serverPos.Position, character.CurrentHull, false); + Hull clientHull = Hull.FindHull(localPos.Position, serverHull, false); + Vector2 positionError = serverPos.Position - localPos.Position; float rotationError = serverPos.Rotation - localPos.Rotation; - for (int i = localPosIndex; i < character.MemLocalState.Count; i++) + + if (serverHull!=clientHull && ((serverHull==null) || (clientHull==null) || (serverHull.Submarine != clientHull.Submarine))) { - character.MemLocalState[i].Translate(positionError,rotationError); + //hull subs don't match => just teleport the player to exactly this position to avoid mismatches, + //since this would completely break the camera + positionError = Collider.SimPosition - serverPos.Position; + character.MemLocalState.Clear(); + } + else + { + for (int i = localPosIndex; i < character.MemLocalState.Count; i++) + { + Hull pointHull = Hull.FindHull(character.MemLocalState[i].Position, clientHull, false); + if (pointHull != clientHull && ((pointHull == null) || (clientHull == null) || (pointHull.Submarine == clientHull.Submarine))) break; + character.MemLocalState[i].Translate(positionError, rotationError); + } } Collider.SetTransform(Collider.SimPosition + positionError, Collider.Rotation + rotationError); foreach (Limb limb in Limbs) { - limb.body.SetTransform(limb.body.SimPosition + positionError, limb.body.Rotation + rotationError); + limb.body.SetTransform(limb.body.SimPosition + positionError, limb.body.Rotation); } } From 847e10d4a24da718494b347f4838fcda742a0330 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Wed, 13 Dec 2017 18:34:23 +0200 Subject: [PATCH 10/39] Fixed wires not being dropped server-side when a player drops a connected wire without dragging it to their inventory first (or client-side when a host does so). Closes #96 --- .../Items/Components/Signal/Connection.cs | 4 +- .../Components/Signal/ConnectionPanel.cs | 1 - .../Components/Signal/ConnectionPanel.cs | 41 ++++++++++++++++++- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs index 949859513..1bf1927b0 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs @@ -102,11 +102,11 @@ namespace Barotrauma.Items.Components { if (GameMain.Client != null) { - panel.Item.CreateClientEvent(panel); + panel.Item.CreateClientEvent(panel); } else if (GameMain.Server != null) { - panel.Item.CreateServerEvent(panel); + panel.Item.CreateServerEvent(panel); } draggingConnected = null; diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/ConnectionPanel.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/ConnectionPanel.cs index e66a28d9a..b2f10ae90 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/ConnectionPanel.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/ConnectionPanel.cs @@ -23,7 +23,6 @@ namespace Barotrauma.Items.Components HighlightedWire = null; Connection.DrawConnections(spriteBatch, this, character); - } } } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/ConnectionPanel.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/ConnectionPanel.cs index 7b25c669b..cb4f18016 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/ConnectionPanel.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/ConnectionPanel.cs @@ -231,13 +231,30 @@ namespace Barotrauma.Items.Components { GameServer.Log(c.Character.Name + " disconnected a wire from " + Connections[i].Item.Name + " (" + Connections[i].Name + ") to " + existingWire.Connections[0].Item.Name + " (" + existingWire.Connections[0].Name + ")", ServerLog.MessageType.ItemInteraction); + + //wires that are not in anyone's inventory (i.e. not currently being rewired) + //can never be connected to only one connection + // -> the client must have dropped the wire from the connection panel + if (existingWire.Item.ParentInventory == null) + { + //let other clients know the item was also disconnected from the other connection + existingWire.Connections[0].Item.CreateServerEvent(existingWire.Connections[0].Item.GetComponent()); + existingWire.Item.Drop(c.Character); + } } else if (existingWire.Connections[1] != null) { GameServer.Log(c.Character.Name + " disconnected a wire from " + Connections[i].Item.Name + " (" + Connections[i].Name + ") to " + existingWire.Connections[1].Item.Name + " (" + existingWire.Connections[1].Name + ")", ServerLog.MessageType.ItemInteraction); - } + if (existingWire.Item.ParentInventory == null) + { + //let other clients know the item was also disconnected from the other connection + existingWire.Connections[1].Item.CreateServerEvent(existingWire.Connections[1].Item.GetComponent()); + existingWire.Item.Drop(c.Character); + } + } + Connections[i].Wires[j] = null; } @@ -281,6 +298,9 @@ namespace Barotrauma.Items.Components public void ClientRead(ServerNetObject type, NetBuffer msg, float sendingTime) { + List prevWires = Connections.SelectMany(c => Array.FindAll(c.Wires, w => w != null)).ToList(); + List newWires = new List(); + foreach (Connection connection in Connections) { connection.ClearConnections(); @@ -289,16 +309,33 @@ namespace Barotrauma.Items.Components { ushort wireId = msg.ReadUInt16(); - Item wireItem = MapEntity.FindEntityByID(wireId) as Item; + Item wireItem = Entity.FindEntityByID(wireId) as Item; if (wireItem == null) continue; Wire wireComponent = wireItem.GetComponent(); if (wireComponent == null) continue; + newWires.Add(wireComponent); + connection.Wires[i] = wireComponent; wireComponent.Connect(connection, false); } } + + foreach (Wire wire in prevWires) + { + if (wire.Connections[0] == null && wire.Connections[1] == null) + { + wire.Item.Drop(null); + } + //wires that are not in anyone's inventory (i.e. not currently being rewired) can never be connected to only one connection + // -> someone must have dropped the wire from the connection panel + else if (wire.Item.ParentInventory == null && + (wire.Connections[0] != null ^ wire.Connections[1] != null)) + { + wire.Item.Drop(null); + } + } } } } From cce2cf942dc0d16228b7d697475d484e3b803a29 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Wed, 13 Dec 2017 21:07:51 +0200 Subject: [PATCH 11/39] Fixed hulls not being linked to gaps if the center of the gap is exactly at the edge of the adjacent hulls. Closes #147 --- Barotrauma/BarotraumaShared/Source/Map/Gap.cs | 7 +++++-- Barotrauma/BarotraumaShared/Source/Map/Hull.cs | 12 ++++++------ .../BarotraumaShared/Source/Map/Submarine.cs | 14 +++++++++++--- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/Map/Gap.cs b/Barotrauma/BarotraumaShared/Source/Map/Gap.cs index cf1969028..8b79581b2 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Gap.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Gap.cs @@ -163,8 +163,11 @@ namespace Barotrauma searchPos[1] = new Vector2(rect.Center.X, rect.Y - rect.Height); } - hulls[0] = Hull.FindHullOld(searchPos[0], null, false); - hulls[1] = Hull.FindHullOld(searchPos[1], null, false); + for (int i = 0; i < 2; i++) + { + hulls[i] = Hull.FindHullOld(searchPos[i], null, false); + if (hulls[i] == null) hulls[i] = Hull.FindHullOld(searchPos[i], null, false, true); + } if (hulls[0] == null && hulls[1] == null) return; diff --git a/Barotrauma/BarotraumaShared/Source/Map/Hull.cs b/Barotrauma/BarotraumaShared/Source/Map/Hull.cs index 932807c2b..a74c65fd7 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Hull.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Hull.cs @@ -558,23 +558,23 @@ namespace Barotrauma return null; } - + //returns the water block which contains the point (or null if it isn't inside any) - public static Hull FindHullOld(Vector2 position, Hull guess = null, bool useWorldCoordinates = true) + public static Hull FindHullOld(Vector2 position, Hull guess = null, bool useWorldCoordinates = true, bool inclusive = false) { - return FindHullOld(position, hullList, guess, useWorldCoordinates); + return FindHullOld(position, hullList, guess, useWorldCoordinates, inclusive); } - public static Hull FindHullOld(Vector2 position, List hulls, Hull guess = null, bool useWorldCoordinates = true) + public static Hull FindHullOld(Vector2 position, List hulls, Hull guess = null, bool useWorldCoordinates = true, bool inclusive = false) { if (guess != null && hulls.Contains(guess)) { - if (Submarine.RectContains(useWorldCoordinates ? guess.WorldRect : guess.rect, position)) return guess; + if (Submarine.RectContains(useWorldCoordinates ? guess.WorldRect : guess.rect, position, inclusive)) return guess; } foreach (Hull hull in hulls) { - if (Submarine.RectContains(useWorldCoordinates ? hull.WorldRect : hull.rect, position)) return hull; + if (Submarine.RectContains(useWorldCoordinates ? hull.WorldRect : hull.rect, position, inclusive)) return hull; } return null; diff --git a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs index 5a4ae4962..854adb3be 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs @@ -491,10 +491,18 @@ namespace Barotrauma return new Rectangle((int)pos.X, (int)pos.Y, (int)size.X, (int)size.Y); } - public static bool RectContains(Rectangle rect, Vector2 pos) + public static bool RectContains(Rectangle rect, Vector2 pos, bool inclusive = false) { - return (pos.X > rect.X && pos.X < rect.X + rect.Width - && pos.Y < rect.Y && pos.Y > rect.Y - rect.Height); + if (inclusive) + { + return (pos.X >= rect.X && pos.X <= rect.X + rect.Width + && pos.Y <= rect.Y && pos.Y >= rect.Y - rect.Height); + } + else + { + return (pos.X > rect.X && pos.X < rect.X + rect.Width + && pos.Y < rect.Y && pos.Y > rect.Y - rect.Height); + } } public static bool RectsOverlap(Rectangle rect1, Rectangle rect2, bool inclusive=true) From 7e03235f8bbc6375e495916c75fac0f3ce627564 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Wed, 13 Dec 2017 21:24:41 +0200 Subject: [PATCH 12/39] Changed the species name of the huskified humans from "human" to "husk" and gave them the same combat strength as normal husk to prevent them from attacking each other. Closes #119 --- .../Content/Characters/Human/humanhusk.xml | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Content/Characters/Human/humanhusk.xml b/Barotrauma/BarotraumaShared/Content/Characters/Human/humanhusk.xml index b18075da7..33e8bad60 100644 --- a/Barotrauma/BarotraumaShared/Content/Characters/Human/humanhusk.xml +++ b/Barotrauma/BarotraumaShared/Content/Characters/Human/humanhusk.xml @@ -1,17 +1,27 @@  - + + + - + - + @@ -115,9 +125,5 @@ - - From 986862b23ee1cdf54fcb70c8aad398d975848016 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Thu, 14 Dec 2017 00:16:13 +0200 Subject: [PATCH 13/39] The GUIMessageBox constructor with no width or height parameters automatically resizes the box according to the size of the text instead of using the default height. Closes #131 --- Barotrauma/BarotraumaClient/Source/GUI/GUIMessageBox.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Barotrauma/BarotraumaClient/Source/GUI/GUIMessageBox.cs b/Barotrauma/BarotraumaClient/Source/GUI/GUIMessageBox.cs index 77e91591c..0c2477986 100644 --- a/Barotrauma/BarotraumaClient/Source/GUI/GUIMessageBox.cs +++ b/Barotrauma/BarotraumaClient/Source/GUI/GUIMessageBox.cs @@ -32,7 +32,7 @@ namespace Barotrauma } public GUIMessageBox(string headerText, string text) - : this(headerText, text, new string[] {"OK"}) + : this(headerText, text, new string[] {"OK"}, DefaultWidth, 0) { this.Buttons[0].OnClicked = Close; } From 1da15dbca218178481e637a04784aeb5d2ebfbe4 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Thu, 14 Dec 2017 17:18:25 +0200 Subject: [PATCH 14/39] OnFire statuseffects aren't applied to items inside fireproof containers. Closes #98 --- Barotrauma/BarotraumaShared/Source/Map/Explosion.cs | 9 +++++++++ Barotrauma/BarotraumaShared/Source/Map/FireSource.cs | 10 +++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Barotrauma/BarotraumaShared/Source/Map/Explosion.cs b/Barotrauma/BarotraumaShared/Source/Map/Explosion.cs index ae4401112..5c3a6999c 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Explosion.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Explosion.cs @@ -74,6 +74,15 @@ namespace Barotrauma { if (item.CurrentHull != hull || item.FireProof || item.Condition <= 0.0f) continue; + //don't apply OnFire effects if the item is inside a fireproof container + //(or if it's inside a container that's inside a fireproof container, etc) + Item container = item.Container; + while (container != null) + { + if (container.FireProof) return; + container = container.Container; + } + if (Vector2.Distance(item.WorldPosition, worldPosition) > attack.Range * 0.1f) continue; item.ApplyStatusEffects(ActionType.OnFire, 1.0f); diff --git a/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs b/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs index bfa7eb231..4f0a684ce 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs @@ -217,7 +217,15 @@ namespace Barotrauma foreach (Item item in Item.ItemList) { if (item.CurrentHull != hull || item.FireProof || item.Condition <= 0.0f) continue; - if (item.ParentInventory != null && item.ParentInventory.Owner is Character) return; + + //don't apply OnFire effects if the item is inside a fireproof container + //(or if it's inside a container that's inside a fireproof container, etc) + Item container = item.Container; + while (container != null) + { + if (container.FireProof) return; + container = container.Container; + } float range = (float)Math.Sqrt(size.X) * 10.0f; if (item.Position.X < position.X - range || item.Position.X > position.X + size.X + range) continue; From 58e98977df1fe2ff27f484ea6a935d93c96d5d59 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Thu, 14 Dec 2017 19:25:31 +0200 Subject: [PATCH 15/39] Fixes to projectiles going through walls: - Continuous collision detection (body.IsBullet) is disabled when the body is moving slow enough, not immediately when it hits something. - The prismatic joint that sticks projectiles to walls/characters stays active for a minimum of 1 s to prevent the projectile from immediately overshooting the joint limits and falling off (usually at the wrong side of a wall/door it hit). - Separate properties for determining which types of bodies the projectile can stick to (character/structure/item). - Spears and syringes only stick to characters. - Increased syringe launch impulse. Closes #122 --- .../Content/Items/Medical/medical.xml | 2 +- .../Content/Items/Weapons/weapons.xml | 4 +- .../Source/Items/Components/Projectile.cs | 84 ++++++++++++++----- 3 files changed, 68 insertions(+), 22 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Content/Items/Medical/medical.xml b/Barotrauma/BarotraumaShared/Content/Items/Medical/medical.xml index e09b4a293..e7e20a0a4 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Medical/medical.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Medical/medical.xml @@ -26,7 +26,7 @@ - + diff --git a/Barotrauma/BarotraumaShared/Content/Items/Weapons/weapons.xml b/Barotrauma/BarotraumaShared/Content/Items/Weapons/weapons.xml index 7a04b23a5..130d19aba 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Weapons/weapons.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Weapons/weapons.xml @@ -16,7 +16,7 @@ - + @@ -100,7 +100,7 @@ - + diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Projectile.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Projectile.cs index 6eb8cd2ab..c5c079d2e 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Projectile.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Projectile.cs @@ -12,9 +12,14 @@ namespace Barotrauma.Items.Components { class Projectile : ItemComponent { - private float launchImpulse; + //continuous collision detection is used while the projectile is moving faster than this + const float ContinuousCollisionThreshold = 5.0f; - private bool doesStick; + //a duration during which the projectile won't drop from the body it's stuck to + private const float PersistentStickJointDuration = 1.0f; + + private float launchImpulse; + private PrismaticJoint stickJoint; private Body stickTarget; @@ -24,6 +29,8 @@ namespace Barotrauma.Items.Components public Character User; + private float persistentStickJointTimer; + [Serialize(10.0f, false)] public float LaunchImpulse { @@ -39,10 +46,32 @@ namespace Barotrauma.Items.Components } [Serialize(false, false)] + //backwards compatibility, can stick to anything public bool DoesStick { - get { return doesStick; } - set { doesStick = value; } + get; + set; + } + + [Serialize(false, false)] + public bool StickToCharacters + { + get; + set; + } + + [Serialize(false, false)] + public bool StickToStructures + { + get; + set; + } + + [Serialize(false, false)] + public bool StickToItems + { + get; + set; } [Serialize(false, false)] @@ -106,7 +135,7 @@ namespace Barotrauma.Items.Components IsActive = true; - if (stickJoint == null || !doesStick) return; + if (stickJoint == null) return; if (stickTarget != null) { @@ -182,7 +211,7 @@ namespace Barotrauma.Items.Components //the raycast didn't hit anything -> the projectile flew somewhere outside the level and is permanently lost if (!hitSomething) { - Item.Spawner.AddToRemoveQueue(item); + Entity.Spawner.AddToRemoveQueue(item); } } @@ -190,8 +219,23 @@ namespace Barotrauma.Items.Components { ApplyStatusEffects(ActionType.OnActive, deltaTime, null); - if (stickJoint != null && - (stickJoint.JointTranslation < stickJoint.LowerLimit * 0.9f || stickJoint.JointTranslation > stickJoint.UpperLimit * 0.9f)) + if (item.body != null && item.body.FarseerBody.IsBullet) + { + if (item.body.LinearVelocity.LengthSquared() < ContinuousCollisionThreshold * ContinuousCollisionThreshold) + { + item.body.FarseerBody.IsBullet = false; + } + } + + if (stickJoint == null) return; + + if (persistentStickJointTimer > 0.0f) + { + persistentStickJointTimer -= deltaTime; + return; + } + + if (stickJoint.JointTranslation < stickJoint.LowerLimit * 0.9f || stickJoint.JointTranslation > stickJoint.UpperLimit * 0.9f) { if (stickTarget != null) { @@ -218,7 +262,7 @@ namespace Barotrauma.Items.Components stickJoint = null; - IsActive = false; + if (!item.body.FarseerBody.IsBullet) IsActive = false; } } @@ -265,12 +309,9 @@ namespace Barotrauma.Items.Components ApplyStatusEffects(ActionType.OnUse, 1.0f, character); ApplyStatusEffects(ActionType.OnImpact, 1.0f, character); - - IsActive = false; - + item.body.FarseerBody.OnCollision -= OnProjectileCollision; - item.body.FarseerBody.IsBullet = false; item.body.CollisionCategories = Physics.CollisionItem; item.body.CollidesWith = Physics.CollisionWall | Physics.CollisionLevel; @@ -283,17 +324,20 @@ namespace Barotrauma.Items.Components { item.body.LinearVelocity *= 0.1f; } - else if (doesStick) + else if (Vector2.Dot(item.body.LinearVelocity, collisionNormal) < 0.0f && + (DoesStick || + (StickToCharacters && target.Body.UserData is Limb) || + (StickToStructures && target.Body.UserData is Structure) || + (StickToItems && target.Body.UserData is Item))) { Vector2 dir = new Vector2( (float)Math.Cos(item.body.Rotation), (float)Math.Sin(item.body.Rotation)); + + StickToTarget(target.Body, dir); + item.body.LinearVelocity *= 0.5f; - if (Vector2.Dot(item.body.LinearVelocity, collisionNormal) < 0.0f) - { - StickToTarget(target.Body, dir); - return Hitscan; - } + return Hitscan; } else { @@ -336,6 +380,8 @@ namespace Barotrauma.Items.Components stickJoint.UpperLimit = ConvertUnits.ToSimUnits(item.Sprite.size.X * 0.3f); } + persistentStickJointTimer = PersistentStickJointDuration; + item.body.FarseerBody.IgnoreCollisionWith(targetBody); stickTarget = targetBody; GameMain.World.AddJoint(stickJoint); From e17b5a195c3a6353dcba9660a101b361c62d2aa1 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Thu, 14 Dec 2017 20:01:45 +0200 Subject: [PATCH 16/39] Increased the minimum distance between monster spawns and subs (20 000 units in monster events, 30% of the width of the level in monster missions). Closes #63 and closes #151 --- .../Source/Events/ArtifactEvent.cs | 2 +- .../Source/Events/Missions/MonsterMission.cs | 2 +- .../Source/Events/Missions/SalvageMission.cs | 2 +- .../Source/Events/MonsterEvent.cs | 2 +- .../BarotraumaShared/Source/Map/Levels/Level.cs | 17 ++++++++++------- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/Events/ArtifactEvent.cs b/Barotrauma/BarotraumaShared/Source/Events/ArtifactEvent.cs index 41b8577c4..be7ca10b1 100644 --- a/Barotrauma/BarotraumaShared/Source/Events/ArtifactEvent.cs +++ b/Barotrauma/BarotraumaShared/Source/Events/ArtifactEvent.cs @@ -34,7 +34,7 @@ namespace Barotrauma base.Init(); Vector2 position = Level.Loaded.GetRandomItemPos( - Level.PositionType.Cave | Level.PositionType.MainPath | Level.PositionType.Ruin, 500.0f, 30.0f); + Level.PositionType.Cave | Level.PositionType.MainPath | Level.PositionType.Ruin, 500.0f, 10000.0f, 30.0f); item = new Item(itemPrefab, position, null); item.MoveWithLevel = true; diff --git a/Barotrauma/BarotraumaShared/Source/Events/Missions/MonsterMission.cs b/Barotrauma/BarotraumaShared/Source/Events/Missions/MonsterMission.cs index 315026dc8..bb2b00e00 100644 --- a/Barotrauma/BarotraumaShared/Source/Events/Missions/MonsterMission.cs +++ b/Barotrauma/BarotraumaShared/Source/Events/Missions/MonsterMission.cs @@ -28,7 +28,7 @@ namespace Barotrauma public override void Start(Level level) { Vector2 spawnPos; - Level.Loaded.TryGetInterestingPosition(true, Level.PositionType.MainPath, true, out spawnPos); + Level.Loaded.TryGetInterestingPosition(true, Level.PositionType.MainPath, Level.Loaded.Size.X * 0.3f, out spawnPos); monster = Character.Create(monsterFile, spawnPos, null, GameMain.Client != null, true, false); monster.Enabled = false; diff --git a/Barotrauma/BarotraumaShared/Source/Events/Missions/SalvageMission.cs b/Barotrauma/BarotraumaShared/Source/Events/Missions/SalvageMission.cs index b5c4fc7b1..0d430ad10 100644 --- a/Barotrauma/BarotraumaShared/Source/Events/Missions/SalvageMission.cs +++ b/Barotrauma/BarotraumaShared/Source/Events/Missions/SalvageMission.cs @@ -46,7 +46,7 @@ namespace Barotrauma public override void Start(Level level) { - Vector2 position = Level.Loaded.GetRandomItemPos(spawnPositionType, 100.0f, 30.0f); + Vector2 position = Level.Loaded.GetRandomItemPos(spawnPositionType, 100.0f, Level.Loaded.Size.X * 0.3f, 30.0f); item = new Item(itemPrefab, position, null); item.MoveWithLevel = true; diff --git a/Barotrauma/BarotraumaShared/Source/Events/MonsterEvent.cs b/Barotrauma/BarotraumaShared/Source/Events/MonsterEvent.cs index 9c2ed6ec2..9b6d2c34e 100644 --- a/Barotrauma/BarotraumaShared/Source/Events/MonsterEvent.cs +++ b/Barotrauma/BarotraumaShared/Source/Events/MonsterEvent.cs @@ -85,7 +85,7 @@ namespace Barotrauma if (disallowed) return null; Vector2 spawnPos; - if (!Level.Loaded.TryGetInterestingPosition(true, spawnPosType, true, out spawnPos)) + if (!Level.Loaded.TryGetInterestingPosition(true, spawnPosType, 20000.0f, out spawnPos)) { //no suitable position found, disable the event repeat = false; diff --git a/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs b/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs index 236cffcfe..74abdf6df 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs @@ -817,7 +817,7 @@ namespace Barotrauma //50% chance of placing the ruins at a cave if (Rand.Range(0.0f, 1.0f, Rand.RandSync.Server) < 0.5f) { - TryGetInterestingPosition(true, PositionType.Cave, false, out ruinPos); + TryGetInterestingPosition(true, PositionType.Cave, 0.0f, out ruinPos); } ruinPos.Y = Math.Min(ruinPos.Y, borders.Y + borders.Height - ruinSize.Y / 2); @@ -894,7 +894,7 @@ namespace Barotrauma } } - public Vector2 GetRandomItemPos(PositionType spawnPosType, float randomSpread, float offsetFromWall = 10.0f) + public Vector2 GetRandomItemPos(PositionType spawnPosType, float randomSpread, float minDistFromSubs, float offsetFromWall = 10.0f) { if (!positionsOfInterest.Any()) return Size*0.5f; @@ -906,7 +906,7 @@ namespace Barotrauma do { Vector2 startPos; - Level.Loaded.TryGetInterestingPosition(true, spawnPosType, true, out startPos); + Loaded.TryGetInterestingPosition(true, spawnPosType, minDistFromSubs, out startPos); startPos += Rand.Vector(Rand.Range(0.0f, randomSpread, Rand.RandSync.Server), Rand.RandSync.Server); @@ -935,7 +935,7 @@ namespace Barotrauma - public bool TryGetInterestingPosition(bool useSyncedRand, PositionType positionType, bool avoidSubs, out Vector2 position) + public bool TryGetInterestingPosition(bool useSyncedRand, PositionType positionType, float minDistFromSubs, out Vector2 position) { if (!positionsOfInterest.Any()) { @@ -945,17 +945,20 @@ namespace Barotrauma var matchingPositions = positionsOfInterest.FindAll(p => positionType.HasFlag(p.PositionType)); - if (avoidSubs) + if (minDistFromSubs > 0.0f) { foreach (Submarine sub in Submarine.Loaded) { - float minDist = Math.Max(sub.Borders.Width, sub.Borders.Height); - matchingPositions.RemoveAll(p => Vector2.Distance(p.Position, sub.WorldPosition) < minDist); + matchingPositions.RemoveAll(p => Vector2.DistanceSquared(p.Position, sub.WorldPosition) < minDistFromSubs * minDistFromSubs); } } if (!matchingPositions.Any()) { +#if DEBUG + DebugConsole.ThrowError("Could not find a suitable position of interest. (PositionType: " + positionType + ", minDistFromSubs: " + minDistFromSubs + "\n" + Environment.StackTrace); +#endif + position = positionsOfInterest[Rand.Int(positionsOfInterest.Count, (useSyncedRand ? Rand.RandSync.Server : Rand.RandSync.Unsynced))].Position; return false; } From 760452170e611c0c7890dfe904314fbd6e2f849a Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Thu, 14 Dec 2017 22:57:42 +0300 Subject: [PATCH 17/39] Implement ID card slot and ID card description that states the owner and his job in preparation for identity system --- .../Source/Items/CharacterInventory.cs | 21 +++++++++++++++--- .../Content/Items/Reactor/reactor.xml | 4 ++-- .../Content/Items/Tools/tools.xml | 2 +- .../BarotraumaShared/Content/Items/idcard.xml | 7 ++---- Barotrauma/BarotraumaShared/Content/Jobs.xml | 12 +++++----- .../Content/UI/inventoryIcons.png | Bin 14066 -> 16233 bytes .../Source/Characters/Character.cs | 2 +- .../Source/Characters/Jobs/Job.cs | 1 + .../Source/Items/CharacterInventory.cs | 4 ++-- .../BarotraumaShared/Source/Items/Item.cs | 16 +++++++------ 10 files changed, 42 insertions(+), 27 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Items/CharacterInventory.cs b/Barotrauma/BarotraumaClient/Source/Items/CharacterInventory.cs index 6ccfbc19c..6c609618e 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/CharacterInventory.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/CharacterInventory.cs @@ -39,7 +39,7 @@ namespace Barotrauma case 3: case 4: SlotPositions[i] = new Vector2( - spacing * 2 + rectWidth + (spacing + rectWidth) * (i - 2), + spacing * 2 + rectWidth + (spacing + rectWidth) * (i - 1), GameMain.GraphicsHeight - (spacing + rectHeight) * 3); useOnSelfButton[i - 3] = new GUIButton( @@ -52,16 +52,24 @@ namespace Barotrauma break; + //face case 5: SlotPositions[i] = new Vector2( spacing * 2 + rectWidth + (spacing + rectWidth) * (i - 5), GameMain.GraphicsHeight - (spacing + rectHeight) * 3); + break; + //id card + case 6: + SlotPositions[i] = new Vector2( + spacing * 2 + rectWidth + (spacing + rectWidth) * (i - 5), + GameMain.GraphicsHeight - (spacing + rectHeight) * 3); + break; default: SlotPositions[i] = new Vector2( - spacing * 2 + rectWidth + (spacing + rectWidth) * ((i - 6) % 5), - GameMain.GraphicsHeight - (spacing + rectHeight) * ((i > 10) ? 2 : 1)); + spacing * 2 + rectWidth + (spacing + rectWidth) * ((i - 7) % 5), + GameMain.GraphicsHeight - (spacing + rectHeight) * ((i > 11) ? 2 : 1)); break; } } @@ -247,6 +255,13 @@ namespace Barotrauma new Vector2(15.0f, 16.0f), Vector2.One, SpriteEffects.None, 0.1f); } + else if (i == 6) + { + spriteBatch.Draw(icons, new Vector2(slotRect.Center.X, slotRect.Center.Y), + new Rectangle(62, 36, 22, 18), Color.White * 0.7f, 0.0f, + new Vector2(11.0f, 9.0f), Vector2.One, + SpriteEffects.None, 0.1f); + } } base.Draw(spriteBatch); diff --git a/Barotrauma/BarotraumaShared/Content/Items/Reactor/reactor.xml b/Barotrauma/BarotraumaShared/Content/Items/Reactor/reactor.xml index 5ac35b6f1..255bf051f 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Reactor/reactor.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Reactor/reactor.xml @@ -68,7 +68,7 @@ - + - + diff --git a/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml b/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml index 0d6c81251..2f194ca87 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml @@ -116,7 +116,7 @@ - + diff --git a/Barotrauma/BarotraumaShared/Content/Items/idcard.xml b/Barotrauma/BarotraumaShared/Content/Items/idcard.xml index 1c2d8c62e..d6659ef30 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/idcard.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/idcard.xml @@ -10,8 +10,5 @@ - - - - - + + \ No newline at end of file diff --git a/Barotrauma/BarotraumaShared/Content/Jobs.xml b/Barotrauma/BarotraumaShared/Content/Jobs.xml index 17fa0ac06..c46354b4e 100644 --- a/Barotrauma/BarotraumaShared/Content/Jobs.xml +++ b/Barotrauma/BarotraumaShared/Content/Jobs.xml @@ -8,7 +8,7 @@ - + @@ -30,7 +30,7 @@ - + @@ -48,7 +48,7 @@ - + @@ -66,7 +66,7 @@ - + @@ -86,7 +86,7 @@ - + @@ -105,7 +105,7 @@ - + diff --git a/Barotrauma/BarotraumaShared/Content/UI/inventoryIcons.png b/Barotrauma/BarotraumaShared/Content/UI/inventoryIcons.png index ab2341432011a5710647dff39d55485cacc6f1f6..885ca8b46b947c2754e0e566f22973aa166e39c2 100644 GIT binary patch literal 16233 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 literal 14066 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 Date: Thu, 14 Dec 2017 23:24:25 +0300 Subject: [PATCH 18/39] disguise bool for Wearable class --- .../BarotraumaShared/Source/Items/Components/Wearable.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Wearable.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Wearable.cs index 168387bc8..248d4257d 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Wearable.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Wearable.cs @@ -31,14 +31,14 @@ namespace Barotrauma.Items.Components private WearableSprite[] wearableSprites; private LimbType[] limbType; private Limb[] limb; - private List damageModifiers; public List DamageModifiers { get { return damageModifiers; } } - + + public bool Disguise; public Wearable (Item item, XElement element) : base(item, element) { From 8a7af2affdfedab2e7d2986776d05d0539402b17 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Fri, 15 Dec 2017 00:25:46 +0200 Subject: [PATCH 19/39] Players can't use other items when a railgun controller is selected. Prevents accidentally firing weapons or hitting people with something while using the railguns. Closes #94 --- .../Content/Items/Weapons/railgun.xml | 3 ++- .../BarotraumaShared/Source/Characters/Character.cs | 13 ++++++++----- .../BarotraumaShared/Source/Items/ItemPrefab.cs | 7 +++++++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Content/Items/Weapons/railgun.xml b/Barotrauma/BarotraumaShared/Content/Items/Weapons/railgun.xml index 969b6213c..50662afde 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Weapons/railgun.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Weapons/railgun.xml @@ -36,11 +36,12 @@ category="Machine" type="Controller" linkable="true" + disableitemusagewhenselected="true" > - + diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs index a506e62d1..63a52738e 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs @@ -926,13 +926,16 @@ namespace Barotrauma } } - for (int i = 0; i < selectedItems.Length; i++ ) + if (SelectedConstruction == null || !SelectedConstruction.Prefab.DisableItemUsageWhenSelected) { - if (selectedItems[i] == null) continue; - if (i == 1 && selectedItems[0] == selectedItems[1]) continue; + for (int i = 0; i < selectedItems.Length; i++ ) + { + if (selectedItems[i] == null) continue; + if (i == 1 && selectedItems[0] == selectedItems[1]) continue; - if (IsKeyDown(InputType.Use)) selectedItems[i].Use(deltaTime, this); - if (IsKeyDown(InputType.Aim) && selectedItems[i] != null) selectedItems[i].SecondaryUse(deltaTime, this); + if (IsKeyDown(InputType.Use)) selectedItems[i].Use(deltaTime, this); + if (IsKeyDown(InputType.Aim) && selectedItems[i] != null) selectedItems[i].SecondaryUse(deltaTime, this); + } } if (selectedConstruction != null) diff --git a/Barotrauma/BarotraumaShared/Source/Items/ItemPrefab.cs b/Barotrauma/BarotraumaShared/Source/Items/ItemPrefab.cs index a1ec49bbd..dba9dfd98 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/ItemPrefab.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/ItemPrefab.cs @@ -134,6 +134,13 @@ namespace Barotrauma private set; } + [Serialize(false, false)] + public bool DisableItemUsageWhenSelected + { + get; + private set; + } + public bool CanSpriteFlipX { get { return canSpriteFlipX; } From 18d75c620fcac820747e5c442eb3d88c0b0571e3 Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Fri, 15 Dec 2017 16:47:10 +0300 Subject: [PATCH 20/39] Adds crowbar function to force-open doors... ***except the Door component ignores the damn requireditem and allows bare fukken hands to open it goddamnit*** --- .../Source/Items/Components/Door.cs | 2 +- .../Content/Items/Door/doors.xml | 9 ++++++--- .../Content/Items/Tools/tools.png | Bin 7169 -> 9821 bytes .../Content/Items/Tools/tools.xml | 19 +++++++++++++++++- .../Source/Items/Components/Door.cs | 10 ++++----- .../Items/Components/Holdable/Holdable.cs | 2 +- .../Items/Components/Holdable/Pickable.cs | 2 +- 7 files changed, 31 insertions(+), 13 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Door.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Door.cs index 38817a23f..ccb31b328 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Door.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Door.cs @@ -7,7 +7,7 @@ using System; namespace Barotrauma.Items.Components { - partial class Door : ItemComponent, IDrawableComponent, IServerSerializable + partial class Door : Pickable, IDrawableComponent, IServerSerializable { private ConvexHull convexHull; private ConvexHull convexHull2; diff --git a/Barotrauma/BarotraumaShared/Content/Items/Door/doors.xml b/Barotrauma/BarotraumaShared/Content/Items/Door/doors.xml index 120365d6c..043507a2d 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Door/doors.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Door/doors.xml @@ -6,7 +6,8 @@ - + + @@ -35,7 +36,8 @@ - + + @@ -64,7 +66,8 @@ - + + diff --git a/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.png b/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.png index 55f741a6bd25183d7d8d49df3eb4f25641aff28b..79f6c2c5f459bd15e9635156564015053ddd2e72 100644 GIT binary patch literal 9821 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 delta 7166 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 A`v3p{ diff --git a/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml b/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml index 2f194ca87..882767d30 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml @@ -175,7 +175,7 @@ price="10"> - + @@ -185,6 +185,23 @@ + + + + + + + + + + + Date: Fri, 15 Dec 2017 11:21:37 -0300 Subject: [PATCH 21/39] Improved giveperm/revokeperm commands --- .../BarotraumaShared/Source/DebugConsole.cs | 42 +++++++++++++++---- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/DebugConsole.cs b/Barotrauma/BarotraumaShared/Source/DebugConsole.cs index 12e257202..8eebab697 100644 --- a/Barotrauma/BarotraumaShared/Source/DebugConsole.cs +++ b/Barotrauma/BarotraumaShared/Source/DebugConsole.cs @@ -369,10 +369,14 @@ namespace Barotrauma } })); - commands.Add(new Command("giveperm", "giveperm [id]: Grants administrative permissions to the player with the specified client ID.", (string[] args) => + commands.Add(new Command("giveperm|giveperms", "giveperm [id]: Grants administrative permissions to the player with the specified client ID.", (string[] args) => { if (GameMain.Server == null) return; - if (args.Length < 1) return; + if (args.Length < 1) + { + NewMessage("giveperm [id]: Grants administrative permissions to the player with the specified client ID.", Color.Cyan); + return; + } int id; int.TryParse(args[0], out id); @@ -382,7 +386,13 @@ namespace Barotrauma ThrowError("Client id \"" + id + "\" not found."); return; } - + + NewMessage("Valid permissions are:",Color.White); + NewMessage(" - all",Color.White); + foreach (ClientPermissions permission in Enum.GetValues(typeof(ClientPermissions))) + { + NewMessage(" - " + permission.ToString(),Color.White); + } ShowQuestionPrompt("Permission to grant to \"" + client.Name + "\"?", (perm) => { ClientPermissions permission = ClientPermissions.None; @@ -392,7 +402,11 @@ namespace Barotrauma } else { - Enum.TryParse(perm, out permission); + if (!Enum.TryParse(perm, out permission)) + { + ThrowError("\"" + perm + "\" sn't a valid permission!"); + return; + } } client.SetPermissions(client.Permissions | permission); GameMain.Server.UpdateClientPermissions(client); @@ -400,10 +414,14 @@ namespace Barotrauma }); })); - commands.Add(new Command("revokeperm", "revokeperm [id]: Revokes administrative permissions to the player with the specified client ID.", (string[] args) => + commands.Add(new Command("revokeperm|revokeperms", "revokeperm [id]: Revokes administrative permissions to the player with the specified client ID.", (string[] args) => { if (GameMain.Server == null) return; - if (args.Length < 1) return; + if (args.Length < 1) + { + NewMessage("revokeperm [id]: Revokes administrative permissions to the player with the specified client ID.", Color.Cyan); + return; + } int id; int.TryParse(args[0], out id); @@ -414,6 +432,12 @@ namespace Barotrauma return; } + NewMessage("Valid permissions are:", Color.White); + NewMessage(" - all", Color.White); + foreach (ClientPermissions permission in Enum.GetValues(typeof(ClientPermissions))) + { + NewMessage(" - " + permission.ToString(), Color.White); + } ShowQuestionPrompt("Permission to revoke from \"" + client.Name + "\"?", (perm) => { ClientPermissions permission = ClientPermissions.None; @@ -423,7 +447,11 @@ namespace Barotrauma } else { - Enum.TryParse(perm, out permission); + if (!Enum.TryParse(perm, out permission)) + { + ThrowError("\"" + perm + "\" isn't a valid permission!"); + return; + } } client.SetPermissions(client.Permissions & ~permission); GameMain.Server.UpdateClientPermissions(client); From ae344c89c595c965ad7c0402350df286722f4103 Mon Sep 17 00:00:00 2001 From: Juan Pablo Arce Date: Fri, 15 Dec 2017 11:25:21 -0300 Subject: [PATCH 22/39] Fixed indentation --- .../BarotraumaShared/Source/DebugConsole.cs | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/DebugConsole.cs b/Barotrauma/BarotraumaShared/Source/DebugConsole.cs index 8eebab697..a403ff2ce 100644 --- a/Barotrauma/BarotraumaShared/Source/DebugConsole.cs +++ b/Barotrauma/BarotraumaShared/Source/DebugConsole.cs @@ -369,14 +369,14 @@ namespace Barotrauma } })); - commands.Add(new Command("giveperm|giveperms", "giveperm [id]: Grants administrative permissions to the player with the specified client ID.", (string[] args) => + commands.Add(new Command("giveperm", "giveperm [id]: Grants administrative permissions to the player with the specified client ID.", (string[] args) => { if (GameMain.Server == null) return; - if (args.Length < 1) - { - NewMessage("giveperm [id]: Grants administrative permissions to the player with the specified client ID.", Color.Cyan); - return; - } + if (args.Length < 1) + { + NewMessage("giveperm [id]: Grants administrative permissions to the player with the specified client ID.", Color.Cyan); + return; + } int id; int.TryParse(args[0], out id); @@ -387,12 +387,12 @@ namespace Barotrauma return; } - NewMessage("Valid permissions are:",Color.White); - NewMessage(" - all",Color.White); - foreach (ClientPermissions permission in Enum.GetValues(typeof(ClientPermissions))) - { - NewMessage(" - " + permission.ToString(),Color.White); - } + NewMessage("Valid permissions are:",Color.White); + NewMessage(" - all",Color.White); + foreach (ClientPermissions permission in Enum.GetValues(typeof(ClientPermissions))) + { + NewMessage(" - " + permission.ToString(),Color.White); + } ShowQuestionPrompt("Permission to grant to \"" + client.Name + "\"?", (perm) => { ClientPermissions permission = ClientPermissions.None; @@ -402,11 +402,11 @@ namespace Barotrauma } else { - if (!Enum.TryParse(perm, out permission)) - { - ThrowError("\"" + perm + "\" sn't a valid permission!"); - return; - } + if (!Enum.TryParse(perm, out permission)) + { + ThrowError("\"" + perm + "\" sn't a valid permission!"); + return; + } } client.SetPermissions(client.Permissions | permission); GameMain.Server.UpdateClientPermissions(client); @@ -414,14 +414,14 @@ namespace Barotrauma }); })); - commands.Add(new Command("revokeperm|revokeperms", "revokeperm [id]: Revokes administrative permissions to the player with the specified client ID.", (string[] args) => + commands.Add(new Command("revokeperm", "revokeperm [id]: Revokes administrative permissions to the player with the specified client ID.", (string[] args) => { if (GameMain.Server == null) return; if (args.Length < 1) - { - NewMessage("revokeperm [id]: Revokes administrative permissions to the player with the specified client ID.", Color.Cyan); - return; - } + { + NewMessage("revokeperm [id]: Revokes administrative permissions to the player with the specified client ID.", Color.Cyan); + return; + } int id; int.TryParse(args[0], out id); @@ -432,12 +432,12 @@ namespace Barotrauma return; } - NewMessage("Valid permissions are:", Color.White); - NewMessage(" - all", Color.White); - foreach (ClientPermissions permission in Enum.GetValues(typeof(ClientPermissions))) - { - NewMessage(" - " + permission.ToString(), Color.White); - } + NewMessage("Valid permissions are:", Color.White); + NewMessage(" - all", Color.White); + foreach (ClientPermissions permission in Enum.GetValues(typeof(ClientPermissions))) + { + NewMessage(" - " + permission.ToString(), Color.White); + } ShowQuestionPrompt("Permission to revoke from \"" + client.Name + "\"?", (perm) => { ClientPermissions permission = ClientPermissions.None; @@ -447,11 +447,11 @@ namespace Barotrauma } else { - if (!Enum.TryParse(perm, out permission)) - { - ThrowError("\"" + perm + "\" isn't a valid permission!"); - return; - } + if (!Enum.TryParse(perm, out permission)) + { + ThrowError("\"" + perm + "\" isn't a valid permission!"); + return; + } } client.SetPermissions(client.Permissions & ~permission); GameMain.Server.UpdateClientPermissions(client); From eb92242a8caf3e691e2cf2e3c0354d14bf3b753c Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sat, 16 Dec 2017 17:26:54 +0300 Subject: [PATCH 23/39] Port over changes from https://github.com/Regalis11/Barotrauma/pull/163/commits/9ad9a65f1e051f2e60f88b3de5b12d2f2dc84674 --- .../BarotraumaShared/Source/Items/Components/ItemComponent.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs index f6d7cb494..498279d26 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs @@ -506,13 +506,15 @@ namespace Barotrauma.Items.Components } List prevRequiredItems = new List(requiredItems); - requiredItems.Clear(); + bool overrideRequiredItems = false; foreach (XElement subElement in componentElement.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) { case "requireditem": + if (!overrideRequiredItems) requiredItems.Clear(); + overrideRequiredItems = true; RelatedItem newRequiredItem = RelatedItem.Load(subElement); if (newRequiredItem == null) continue; From bd646fb23ed4c8f20d1d3455a189bac67c20e835 Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sat, 16 Dec 2017 19:52:25 +0300 Subject: [PATCH 24/39] Implements identity system! If your mask hides your face (e.g. oxygen mask, clown mask and diving suit), the game will either use the name of the ID card owner in your ID card slot or will give you a "?" name. This only affects "DisplayName". The reason why I can't completely override the .Name for the client from server is due to how crew manifest and CharacterInfo classes are handled - it would require a major rework of many Character-related systems and interactions to truly make this "hack-proof". Server hosts will have to stay on their toes I guess. --- .../Source/Characters/Character.cs | 7 +++-- .../Source/Characters/CharacterHUD.cs | 2 +- .../Source/Items/Inventory.cs | 21 ++++++++++++-- .../Content/Items/Diving/divinggear.xml | 4 +-- .../Content/Items/Jobgear/misc.xml | 1 + .../Content/Items/Tools/tools.xml | 4 +-- .../Source/Characters/Character.cs | 15 ++++++++++ .../Source/Characters/CharacterInfo.cs | 29 ++++++++++++++++++- .../Source/Characters/Jobs/Job.cs | 3 +- 9 files changed, 74 insertions(+), 12 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Character.cs b/Barotrauma/BarotraumaClient/Source/Characters/Character.cs index 8d54f0a0d..2d73f742c 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/Character.cs @@ -298,15 +298,16 @@ namespace Barotrauma if (info != null) { - Vector2 namePos = new Vector2(pos.X, pos.Y - 110.0f - (5.0f / cam.Zoom)) - GUI.Font.MeasureString(Info.Name) * 0.5f / cam.Zoom; + string name = Info.DisplayName; + Vector2 namePos = new Vector2(pos.X, pos.Y - 110.0f - (5.0f / cam.Zoom)) - GUI.Font.MeasureString(name) * 0.5f / cam.Zoom; Color nameColor = Color.White; if (Character.Controlled != null && TeamID != Character.Controlled.TeamID) { nameColor = Color.Red; } - GUI.Font.DrawString(spriteBatch, Info.Name, namePos + new Vector2(1.0f / cam.Zoom, 1.0f / cam.Zoom), Color.Black, 0.0f, Vector2.Zero, 1.0f / cam.Zoom, SpriteEffects.None, 0.001f); - GUI.Font.DrawString(spriteBatch, Info.Name, namePos, nameColor, 0.0f, Vector2.Zero, 1.0f / cam.Zoom, SpriteEffects.None, 0.0f); + GUI.Font.DrawString(spriteBatch, name, namePos + new Vector2(1.0f / cam.Zoom, 1.0f / cam.Zoom), Color.Black, 0.0f, Vector2.Zero, 1.0f / cam.Zoom, SpriteEffects.None, 0.001f); + GUI.Font.DrawString(spriteBatch, name, namePos, nameColor, 0.0f, Vector2.Zero, 1.0f / cam.Zoom, SpriteEffects.None, 0.0f); if (GameMain.DebugDraw) { diff --git a/Barotrauma/BarotraumaClient/Source/Characters/CharacterHUD.cs b/Barotrauma/BarotraumaClient/Source/Characters/CharacterHUD.cs index 9a3ac7b23..8a9f1ebc4 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/CharacterHUD.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/CharacterHUD.cs @@ -208,7 +208,7 @@ namespace Barotrauma string focusName = character.FocusedCharacter.SpeciesName; if (character.FocusedCharacter.Info != null) { - focusName = character.FocusedCharacter.Info.Name; + focusName = character.FocusedCharacter.Info.DisplayName; } Vector2 textPos = startPos; textPos -= new Vector2(GUI.Font.MeasureString(focusName).X / 2, 20); diff --git a/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs b/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs index 8130dea44..b5204a9f0 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs @@ -296,9 +296,26 @@ namespace Barotrauma } else { - toolTip = string.IsNullOrEmpty(Items[i].Description) ? + string description = Items[i].Description; + if (Items[i].Name == "ID Card") + { + string[] readTags = Items[i].Tags.Split(','); + string idName = null; + string idJob = null; + foreach (string tag in readTags) + { + string[] s = tag.Split(':'); + if (s[0] == "name") + idName = s[1]; + if (s[0] == "job") + idJob = s[1]; + } + if (idName != null) + description = "This belongs to " + idName + (idJob != null ? ", the " + idJob + ".\n" : ".\n") + description; + } + toolTip = string.IsNullOrEmpty(description) ? Items[i].Name : - Items[i].Name + '\n' + Items[i].Description; + Items[i].Name + '\n' + description; } DrawToolTip(spriteBatch, toolTip, slots[i].Rect); diff --git a/Barotrauma/BarotraumaShared/Content/Items/Diving/divinggear.xml b/Barotrauma/BarotraumaShared/Content/Items/Diving/divinggear.xml index 238988d26..9cbd1a043 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Diving/divinggear.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Diving/divinggear.xml @@ -41,7 +41,7 @@ - + @@ -92,7 +92,7 @@ - + diff --git a/Barotrauma/BarotraumaShared/Content/Items/Jobgear/misc.xml b/Barotrauma/BarotraumaShared/Content/Items/Jobgear/misc.xml index 5a8c593f1..cdb8cb115 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Jobgear/misc.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Jobgear/misc.xml @@ -38,6 +38,7 @@ + diff --git a/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml b/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml index 882767d30..79c955152 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml @@ -197,8 +197,8 @@ - + aimpos="50,0" handle1="-5,0" holdangle="30" reload="1.7"> + diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs index 85e74eb6b..702b737f7 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs @@ -139,6 +139,19 @@ namespace Barotrauma } } + private float hideFaceTimer; + public bool HideFace + { + get + { + return hideFaceTimer > 0.0f; + } + set + { + hideFaceTimer = MathHelper.Clamp(hideFaceTimer + (value ? 1.0f : -0.5f), 0.0f, 10.0f); + } + } + public string ConfigPath { get; @@ -1406,6 +1419,8 @@ namespace Barotrauma item.Submarine = Submarine; } } + + HideFace = false; if (isDead) return; diff --git a/Barotrauma/BarotraumaShared/Source/Characters/CharacterInfo.cs b/Barotrauma/BarotraumaShared/Source/Characters/CharacterInfo.cs index dd6d8133f..12e5d93c4 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/CharacterInfo.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/CharacterInfo.cs @@ -12,7 +12,34 @@ namespace Barotrauma partial class CharacterInfo { public string Name; - + public string DisplayName + { + get { + string disguiseName = "?"; + if (Character != null && Character.HideFace) + { + if (Character.Inventory != null) + { + var idCard = Character.Inventory.FindItem("ID Card"); + if (idCard != null && Character.Inventory.IsInLimbSlot(idCard, InvSlotType.Card)) //Disguise as the ID card name if it's equipped + { + string[] readTags = idCard.Tags.Split(','); + foreach (string tag in readTags) + { + string[] s = tag.Split(':'); + if (s[0] == "name") + { + disguiseName = s[1]; + break; + } + } + } + } + return disguiseName; + } + return Name; + } + } public Character Character; public readonly string File; diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Jobs/Job.cs b/Barotrauma/BarotraumaShared/Source/Characters/Jobs/Job.cs index d2b3e28e8..865e6bcbc 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Jobs/Job.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Jobs/Job.cs @@ -130,7 +130,8 @@ namespace Barotrauma { item.AddTag(s); } - item.Description = "This belongs to " + character.Name + ", the " + Name + "."; + item.AddTag("name:" + character.Name); + item.AddTag("job:" + Name); } if (parentItem != null) parentItem.Combine(item); From bdeb3a19fda9824c89d500c38fe104c3ca73c95b Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sat, 16 Dec 2017 20:24:24 +0300 Subject: [PATCH 25/39] Updated server logs so admins can see disguised persons clientist should also display stuff TODO: Log inventory interactions like putting item in slots (e.g. oxy mask equipped in Head slot or equipped in Any slot, etc.) so you can tell the exact moment someone decided to disguise themselves. --- .../BarotraumaClient/Source/Characters/Character.cs | 2 ++ .../Source/Items/Components/Machines/Pump.cs | 6 +++--- .../Source/Items/Components/Power/PowerContainer.cs | 4 ++-- .../Source/Items/Components/Signal/Connection.cs | 4 ++-- .../BarotraumaShared/Source/Characters/Character.cs | 12 ++++++++++-- Barotrauma/BarotraumaShared/Source/DebugConsole.cs | 2 +- .../Source/Items/Components/DockingPort.cs | 4 ++-- .../BarotraumaShared/Source/Items/Components/Door.cs | 2 +- .../Source/Items/Components/Holdable/Holdable.cs | 8 ++++---- .../Source/Items/Components/Holdable/MeleeWeapon.cs | 4 ++-- .../Source/Items/Components/Holdable/Throwable.cs | 2 +- .../Items/Components/Machines/Deconstructor.cs | 2 +- .../Source/Items/Components/Machines/Fabricator.cs | 4 ++-- .../Source/Items/Components/Machines/Pump.cs | 4 ++-- .../Source/Items/Components/Machines/Reactor.cs | 2 +- .../Source/Items/Components/Power/PowerContainer.cs | 2 +- .../Items/Components/Signal/ConnectionPanel.cs | 12 ++++++------ .../Source/Items/Components/Signal/Wire.cs | 6 +++--- .../Source/Items/Components/Turret.cs | 2 +- .../BarotraumaShared/Source/Items/Inventory.cs | 8 ++++---- Barotrauma/BarotraumaShared/Source/Items/Item.cs | 4 ++-- 21 files changed, 53 insertions(+), 43 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Character.cs b/Barotrauma/BarotraumaClient/Source/Characters/Character.cs index 2d73f742c..ddcc3112f 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/Character.cs @@ -299,6 +299,8 @@ namespace Barotrauma if (info != null) { string name = Info.DisplayName; + if (controlled == null && name != Info.Name) + name += " (Disguised)"; Vector2 namePos = new Vector2(pos.X, pos.Y - 110.0f - (5.0f / cam.Zoom)) - GUI.Font.MeasureString(name) * 0.5f / cam.Zoom; Color nameColor = Color.White; diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Pump.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Pump.cs index 63777556f..2e9691150 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Pump.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Pump.cs @@ -20,7 +20,7 @@ namespace Barotrauma.Items.Components if (GameMain.Server != null) { item.CreateServerEvent(this); - GameServer.Log(Character.Controlled + (IsActive ? " turned on " : " turned off ") + item.Name, ServerLog.MessageType.ItemInteraction); + GameServer.Log(Character.Controlled.LogName + (IsActive ? " turned on " : " turned off ") + item.Name, ServerLog.MessageType.ItemInteraction); } else if (GameMain.Client != null) { @@ -39,7 +39,7 @@ namespace Barotrauma.Items.Components if (GameMain.Server != null) { item.CreateServerEvent(this); - GameServer.Log(Character.Controlled + " set the pumping speed of " + item.Name + " to " + (int)(flowPercentage) + " %", ServerLog.MessageType.ItemInteraction); + GameServer.Log(Character.Controlled.LogName + " set the pumping speed of " + item.Name + " to " + (int)(flowPercentage) + " %", ServerLog.MessageType.ItemInteraction); } else if (GameMain.Client != null) { @@ -58,7 +58,7 @@ namespace Barotrauma.Items.Components if (GameMain.Server != null) { item.CreateServerEvent(this); - GameServer.Log(Character.Controlled + " set the pumping speed of " + item.Name + " to " + (int)(flowPercentage) + " %", ServerLog.MessageType.ItemInteraction); + GameServer.Log(Character.Controlled.LogName + " set the pumping speed of " + item.Name + " to " + (int)(flowPercentage) + " %", ServerLog.MessageType.ItemInteraction); } else if (GameMain.Client != null) { diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Power/PowerContainer.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Power/PowerContainer.cs index e113317cc..0de3d0b2b 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Power/PowerContainer.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Power/PowerContainer.cs @@ -19,7 +19,7 @@ namespace Barotrauma.Items.Components if (GameMain.Server != null) { item.CreateServerEvent(this); - GameServer.Log(Character.Controlled + " set the recharge speed of " + item.Name + " to " + (int)((rechargeSpeed / maxRechargeSpeed) * 100.0f) + " %", ServerLog.MessageType.ItemInteraction); + GameServer.Log(Character.Controlled.LogName + " set the recharge speed of " + item.Name + " to " + (int)((rechargeSpeed / maxRechargeSpeed) * 100.0f) + " %", ServerLog.MessageType.ItemInteraction); } else if (GameMain.Client != null) { @@ -38,7 +38,7 @@ namespace Barotrauma.Items.Components if (GameMain.Server != null) { item.CreateServerEvent(this); - GameServer.Log(Character.Controlled + " set the recharge speed of " + item.Name + " to " + (int)((rechargeSpeed / maxRechargeSpeed) * 100.0f) + " %", ServerLog.MessageType.ItemInteraction); + GameServer.Log(Character.Controlled.LogName + " set the recharge speed of " + item.Name + " to " + (int)((rechargeSpeed / maxRechargeSpeed) * 100.0f) + " %", ServerLog.MessageType.ItemInteraction); } else if (GameMain.Client != null) { diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs index 1bf1927b0..93b37d1f6 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs @@ -174,12 +174,12 @@ namespace Barotrauma.Items.Components var otherConnection = draggingConnected.OtherConnection(this); if (otherConnection == null) { - GameServer.Log(Character.Controlled + " connected a wire to " + + GameServer.Log(Character.Controlled.LogName + " connected a wire to " + Item.Name + " (" + Name + ")", ServerLog.MessageType.ItemInteraction); } else { - GameServer.Log(Character.Controlled + " connected a wire from " + + GameServer.Log(Character.Controlled.LogName + " connected a wire from " + Item.Name + " (" + Name + ") to " + otherConnection.item.Name + " (" + otherConnection.Name + ")", ServerLog.MessageType.ItemInteraction); } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs index 702b737f7..07ce2b3ad 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs @@ -138,6 +138,14 @@ namespace Barotrauma return info != null && !string.IsNullOrWhiteSpace(info.Name) ? info.Name : SpeciesName; } } + //Only used by server logs to determine "true identity" of the player for cases when they're disguised + public string LogName + { + get + { + return info != null && !string.IsNullOrWhiteSpace(info.Name) ? info.Name + (info.DisplayName != info.Name ? " (as " + info.DisplayName + ")" : "") : SpeciesName; + } + } private float hideFaceTimer; public bool HideFace @@ -1646,7 +1654,7 @@ namespace Barotrauma var attackingCharacter = attacker as Character; if (attackingCharacter != null && attackingCharacter.AIController == null) { - GameServer.Log(Name + " attacked by " + attackingCharacter.Name+". Damage: "+attackResult.Damage+" Bleeding damage: "+attackResult.Bleeding, ServerLog.MessageType.Attack); + GameServer.Log(LogName + " attacked by " + attackingCharacter.LogName +". Damage: "+attackResult.Damage+" Bleeding damage: "+attackResult.Bleeding, ServerLog.MessageType.Attack); } if (GameMain.Client == null && @@ -1811,7 +1819,7 @@ namespace Barotrauma AnimController.Frozen = false; - GameServer.Log(Name+" has died (Cause of death: "+causeOfDeath+")", ServerLog.MessageType.Attack); + GameServer.Log(LogName+" has died (Cause of death: "+causeOfDeath+")", ServerLog.MessageType.Attack); if (OnDeath != null) OnDeath(this, causeOfDeath); diff --git a/Barotrauma/BarotraumaShared/Source/DebugConsole.cs b/Barotrauma/BarotraumaShared/Source/DebugConsole.cs index 12e257202..839001bca 100644 --- a/Barotrauma/BarotraumaShared/Source/DebugConsole.cs +++ b/Barotrauma/BarotraumaShared/Source/DebugConsole.cs @@ -97,7 +97,7 @@ namespace Barotrauma NewMessage("***************", Color.Cyan); foreach (Client c in GameMain.Server.ConnectedClients) { - NewMessage("- " + c.ID.ToString() + ": " + c.Name + ", " + c.Connection.RemoteEndPoint.Address.ToString(), Color.Cyan); + NewMessage("- " + c.ID.ToString() + ": " + c.Name + (c.Character != null ? " playing " + c.Character.LogName : "") + ", " + c.Connection.RemoteEndPoint.Address.ToString(), Color.Cyan); } NewMessage("***************", Color.Cyan); })); diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs index 1b33e369a..236a2c85d 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/DockingPort.cs @@ -699,12 +699,12 @@ namespace Barotrauma.Items.Components if (docked) { if (item.Submarine != null && dockingTarget?.item?.Submarine != null) - GameServer.Log(sender.Name + " docked " + item.Submarine.Name + " to " + dockingTarget.item.Submarine.Name, ServerLog.MessageType.ItemInteraction); + GameServer.Log(sender.LogName + " docked " + item.Submarine.Name + " to " + dockingTarget.item.Submarine.Name, ServerLog.MessageType.ItemInteraction); } else { if (item.Submarine != null && prevDockingTarget?.item?.Submarine != null) - GameServer.Log(sender.Name + " undocked " + item.Submarine.Name + " from " + prevDockingTarget.item.Submarine.Name, ServerLog.MessageType.ItemInteraction); + GameServer.Log(sender.LogName + " undocked " + item.Submarine.Name + " from " + prevDockingTarget.item.Submarine.Name, ServerLog.MessageType.ItemInteraction); } } } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs index 0ee8f360a..0f52ffcfe 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs @@ -417,7 +417,7 @@ namespace Barotrauma.Items.Components bool newState = predictedState == null ? isOpen : predictedState.Value; if (sender != null && wasOpen != newState) { - GameServer.Log(sender.Name + (newState ? " opened " : " closed ") + item.Name, ServerLog.MessageType.ItemInteraction); + GameServer.Log(sender.LogName + (newState ? " opened " : " closed ") + item.Name, ServerLog.MessageType.ItemInteraction); } } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Holdable.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Holdable.cs index cd1683d18..b1b4a9a43 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Holdable.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Holdable.cs @@ -190,7 +190,7 @@ namespace Barotrauma.Items.Components item.body.Enabled = true; IsActive = true; - if (!alreadySelected) GameServer.Log(character.Name + " equipped " + item.Name, ServerLog.MessageType.ItemInteraction); + if (!alreadySelected) GameServer.Log(character.LogName + " equipped " + item.Name, ServerLog.MessageType.ItemInteraction); } } @@ -200,7 +200,7 @@ namespace Barotrauma.Items.Components picker.DeselectItem(item); - GameServer.Log(character.Name + " unequipped " + item.Name, ServerLog.MessageType.ItemInteraction); + GameServer.Log(character.LogName + " unequipped " + item.Name, ServerLog.MessageType.ItemInteraction); item.body.Enabled = false; IsActive = false; @@ -235,7 +235,7 @@ namespace Barotrauma.Items.Components item.CreateServerEvent(this); if (picker != null) { - Networking.GameServer.Log(picker.Name + " detached " + item.Name + " from a wall", ServerLog.MessageType.ItemInteraction); + Networking.GameServer.Log(picker.LogName + " detached " + item.Name + " from a wall", ServerLog.MessageType.ItemInteraction); } } return true; @@ -290,7 +290,7 @@ namespace Barotrauma.Items.Components if (GameMain.Server != null) { item.CreateServerEvent(this); - GameServer.Log(character.Name + " attached " + item.Name+" to a wall", ServerLog.MessageType.ItemInteraction); + GameServer.Log(character.LogName + " attached " + item.Name+" to a wall", ServerLog.MessageType.ItemInteraction); } item.Drop(); } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/MeleeWeapon.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/MeleeWeapon.cs index b98cb3361..07aa6982a 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/MeleeWeapon.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/MeleeWeapon.cs @@ -255,12 +255,12 @@ namespace Barotrauma.Items.Components { GameMain.Server.CreateEntityEvent(item, new object[] { Networking.NetEntityEvent.Type.ApplyStatusEffect, ActionType.OnUse, targetCharacter.ID }); - string logStr = picker?.Name + " used " + item.Name; + string logStr = picker?.LogName + " used " + item.Name; if (item.ContainedItems != null && item.ContainedItems.Length > 0) { logStr += "(" + string.Join(", ", item.ContainedItems.Select(i => i?.Name)) + ")"; } - logStr += " on " + targetCharacter + "."; + logStr += " on " + targetCharacter.LogName + "."; Networking.GameServer.Log(logStr, Networking.ServerLog.MessageType.Attack); } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Throwable.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Throwable.cs index 968ece938..7d31ae1d8 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Throwable.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Throwable.cs @@ -97,7 +97,7 @@ namespace Barotrauma.Items.Components Vector2 throwVector = picker.CursorWorldPosition - picker.WorldPosition; throwVector = Vector2.Normalize(throwVector); - GameServer.Log(picker.Name + " threw " + item.Name, ServerLog.MessageType.ItemInteraction); + GameServer.Log(picker.LogName + " threw " + item.Name, ServerLog.MessageType.ItemInteraction); item.Drop(); item.body.ApplyLinearImpulse(throwVector * throwForce * item.body.Mass * 3.0f); diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Deconstructor.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Deconstructor.cs index d9f127d14..96b285ea4 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Deconstructor.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Deconstructor.cs @@ -105,7 +105,7 @@ namespace Barotrauma.Items.Components if (user != null) { - GameServer.Log(user.Name + (IsActive ? " activated " : " deactivated ") + item.Name, ServerLog.MessageType.ItemInteraction); + GameServer.Log(user.LogName + (IsActive ? " activated " : " deactivated ") + item.Name, ServerLog.MessageType.ItemInteraction); } #if CLIENT diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Fabricator.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Fabricator.cs index 299bdf083..9857fb052 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Fabricator.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Fabricator.cs @@ -159,7 +159,7 @@ namespace Barotrauma.Items.Components if (user != null) { - GameServer.Log(user.Name + " started fabricating " + selectedItem.TargetItem.Name + " in " + item.Name, ServerLog.MessageType.ItemInteraction); + GameServer.Log(user.LogName + " started fabricating " + selectedItem.TargetItem.Name + " in " + item.Name, ServerLog.MessageType.ItemInteraction); } #if CLIENT @@ -184,7 +184,7 @@ namespace Barotrauma.Items.Components { if (fabricatedItem != null && user != null) { - GameServer.Log(user.Name + " cancelled the fabrication of " + fabricatedItem.TargetItem.Name + " in " + item.Name, ServerLog.MessageType.ItemInteraction); + GameServer.Log(user.LogName + " cancelled the fabrication of " + fabricatedItem.TargetItem.Name + " in " + item.Name, ServerLog.MessageType.ItemInteraction); } IsActive = false; diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Pump.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Pump.cs index 88e7b74eb..b99f8ef31 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Pump.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Pump.cs @@ -157,11 +157,11 @@ namespace Barotrauma.Items.Components { if (newFlowPercentage != FlowPercentage) { - GameServer.Log(c.Character + " set the pumping speed of " + item.Name + " to " + (int)(newFlowPercentage) + " %", ServerLog.MessageType.ItemInteraction); + GameServer.Log(c.Character.LogName + " set the pumping speed of " + item.Name + " to " + (int)(newFlowPercentage) + " %", ServerLog.MessageType.ItemInteraction); } if (newIsActive != IsActive) { - GameServer.Log(c.Character + (newIsActive ? " turned on " : " turned off ") + item.Name, ServerLog.MessageType.ItemInteraction); + GameServer.Log(c.Character.LogName + (newIsActive ? " turned on " : " turned off ") + item.Name, ServerLog.MessageType.ItemInteraction); } FlowPercentage = newFlowPercentage; diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Reactor.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Reactor.cs index 9d25c3058..9e3b031f5 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Reactor.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Reactor.cs @@ -173,7 +173,7 @@ namespace Barotrauma.Items.Components { if (Timing.TotalTime >= (float)nextServerLogWriteTime) { - GameServer.Log(lastUser + " adjusted reactor settings: " + + GameServer.Log(lastUser.LogName + " adjusted reactor settings: " + "Temperature: " + (int)temperature + ", Fission rate: " + (int)fissionRate + ", Cooling rate: " + (int)coolingRate + diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Power/PowerContainer.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Power/PowerContainer.cs index be46a3539..47626ff3e 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Power/PowerContainer.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Power/PowerContainer.cs @@ -201,7 +201,7 @@ namespace Barotrauma.Items.Components if (item.CanClientAccess(c)) { RechargeSpeed = newRechargeSpeed; - GameServer.Log(c.Character + " set the recharge speed of "+item.Name+" to "+ (int)((rechargeSpeed / maxRechargeSpeed) * 100.0f) + " %", ServerLog.MessageType.ItemInteraction); + GameServer.Log(c.Character.LogName + " set the recharge speed of "+item.Name+" to "+ (int)((rechargeSpeed / maxRechargeSpeed) * 100.0f) + " %", ServerLog.MessageType.ItemInteraction); } item.CreateServerEvent(this); diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/ConnectionPanel.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/ConnectionPanel.cs index cb4f18016..f82c732d3 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/ConnectionPanel.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/ConnectionPanel.cs @@ -215,7 +215,7 @@ namespace Barotrauma.Items.Components if (existingWire.Locked) { //this should not be possible unless the client is running a modified version of the game - GameServer.Log(c.Character.Name + " attempted to disconnect a locked wire from " + + GameServer.Log(c.Character.LogName + " attempted to disconnect a locked wire from " + Connections[i].Item.Name + " (" + Connections[i].Name + ")", ServerLog.MessageType.Error); continue; } @@ -224,12 +224,12 @@ namespace Barotrauma.Items.Components if (existingWire.Connections[0] == null && existingWire.Connections[1] == null) { - GameServer.Log(c.Character.Name + " disconnected a wire from " + + GameServer.Log(c.Character.LogName + " disconnected a wire from " + Connections[i].Item.Name + " (" + Connections[i].Name + ")", ServerLog.MessageType.ItemInteraction); } else if (existingWire.Connections[0] != null) { - GameServer.Log(c.Character.Name + " disconnected a wire from " + + GameServer.Log(c.Character.LogName + " disconnected a wire from " + Connections[i].Item.Name + " (" + Connections[i].Name + ") to " + existingWire.Connections[0].Item.Name + " (" + existingWire.Connections[0].Name + ")", ServerLog.MessageType.ItemInteraction); //wires that are not in anyone's inventory (i.e. not currently being rewired) @@ -244,7 +244,7 @@ namespace Barotrauma.Items.Components } else if (existingWire.Connections[1] != null) { - GameServer.Log(c.Character.Name + " disconnected a wire from " + + GameServer.Log(c.Character.LogName + " disconnected a wire from " + Connections[i].Item.Name + " (" + Connections[i].Name + ") to " + existingWire.Connections[1].Item.Name + " (" + existingWire.Connections[1].Name + ")", ServerLog.MessageType.ItemInteraction); if (existingWire.Item.ParentInventory == null) @@ -276,13 +276,13 @@ namespace Barotrauma.Items.Components if (otherConnection == null) { - GameServer.Log(c.Character.Name + " connected a wire to " + + GameServer.Log(c.Character.LogName + " connected a wire to " + Connections[i].Item.Name + " (" + Connections[i].Name + ")", ServerLog.MessageType.ItemInteraction); } else { - GameServer.Log(c.Character.Name + " connected a wire from " + + GameServer.Log(c.Character.LogName + " connected a wire from " + Connections[i].Item.Name + " (" + Connections[i].Name + ") to " + (otherConnection == null ? "none" : otherConnection.Item.Name + " (" + (otherConnection.Name) + ")"), ServerLog.MessageType.ItemInteraction); diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Wire.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Wire.cs index 99cd54835..f32fa02d9 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Wire.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Wire.cs @@ -308,18 +308,18 @@ namespace Barotrauma.Items.Components { if (connections[0] != null && connections[1] != null) { - GameServer.Log(user.Name + " disconnected a wire from " + + GameServer.Log(user.LogName + " disconnected a wire from " + connections[0].Item.Name + " (" + connections[0].Name + ") to "+ connections[1].Item.Name + " (" + connections[1].Name + ")", ServerLog.MessageType.ItemInteraction); } else if (connections[0] != null) { - GameServer.Log(user.Name + " disconnected a wire from " + + GameServer.Log(user.LogName + " disconnected a wire from " + connections[0].Item.Name + " (" + connections[0].Name + ")", ServerLog.MessageType.ItemInteraction); } else if (connections[1] != null) { - GameServer.Log(user.Name + " disconnected a wire from " + + GameServer.Log(user.LogName + " disconnected a wire from " + connections[1].Item.Name + " (" + connections[1].Name + ")", ServerLog.MessageType.ItemInteraction); } } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Turret.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Turret.cs index 5d3563d18..29d5c60e4 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Turret.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Turret.cs @@ -175,7 +175,7 @@ namespace Barotrauma.Items.Components if (character != null) { - string msg = character.Name + " launched " + item.Name + " (projectile: " + projectiles[0].Item.Name; + string msg = character.LogName + " launched " + item.Name + " (projectile: " + projectiles[0].Item.Name; if (projectiles[0].Item.ContainedItems == null || projectiles[0].Item.ContainedItems.All(i => i == null)) { msg += ")"; diff --git a/Barotrauma/BarotraumaShared/Source/Items/Inventory.cs b/Barotrauma/BarotraumaShared/Source/Items/Inventory.cs index ed782dd53..669b68f34 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Inventory.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Inventory.cs @@ -212,11 +212,11 @@ namespace Barotrauma { if (Owner == c.Character) { - GameServer.Log(c.Character + " picked up " + item.Name, ServerLog.MessageType.Inventory); + GameServer.Log(c.Character.LogName+ " picked up " + item.Name, ServerLog.MessageType.Inventory); } else { - GameServer.Log(c.Character + " placed " + item.Name + " in " + Owner, ServerLog.MessageType.Inventory); + GameServer.Log(c.Character.LogName + " placed " + item.Name + " in " + Owner, ServerLog.MessageType.Inventory); } } } @@ -227,11 +227,11 @@ namespace Barotrauma { if (Owner == c.Character) { - GameServer.Log(c.Character + " dropped " + item.Name, ServerLog.MessageType.Inventory); + GameServer.Log(c.Character.LogName + " dropped " + item.Name, ServerLog.MessageType.Inventory); } else { - GameServer.Log(c.Character + " removed " + item.Name + " from " + Owner, ServerLog.MessageType.Inventory); + GameServer.Log(c.Character.LogName + " removed " + item.Name + " from " + Owner, ServerLog.MessageType.Inventory); } } } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index 1667a41bd..45161fefa 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -1361,12 +1361,12 @@ namespace Barotrauma if (ContainedItems == null || ContainedItems.All(i => i == null)) { - GameServer.Log(c.Character.Name + " used item " + Name, ServerLog.MessageType.ItemInteraction); + GameServer.Log(c.Character.LogName + " used item " + Name, ServerLog.MessageType.ItemInteraction); } else { GameServer.Log( - c.Character.Name + " used item " + Name + " (contained items: " + string.Join(", ", Array.FindAll(ContainedItems, i => i != null).Select(i => i.Name)) + ")", + c.Character.LogName + " used item " + Name + " (contained items: " + string.Join(", ", Array.FindAll(ContainedItems, i => i != null).Select(i => i.Name)) + ")", ServerLog.MessageType.ItemInteraction); } From af53449d2dbcef3a5351ca00a5ffe99567456050 Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sat, 16 Dec 2017 20:38:27 +0300 Subject: [PATCH 26/39] Update the size of tools.png to 64x128 as according to juanjp600, powers of two for sizes are more efficient due to memory alignment or something. --- .../Content/Items/Tools/tools.png | Bin 9821 -> 9950 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.png b/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.png index 79f6c2c5f459bd15e9635156564015053ddd2e72..8cfb428349b362f84bea07bf5b2d08e82ea38160 100644 GIT binary patch delta 9400 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 delta 9247 zcmaKSWl)?=)AiyI0t9ymE@6=n+}$k%3-0c&*Wwxo65Krj0t9z=2<|Mp!QGvg`}zKV zT{VBEy1HiOoYNyct4dJC?}TrRP?13(P(`2HZafvw8ypY_9S3d-8t@oz!T`{<%SnoT z@iO@5hoY@9aQy@aS0tNaP$-*7AMrjPf+T58EiY3TJQbZkbr@9*3Bn*Hz(c82mzrEsbahz3WF`g~7;`;CL=_%A?@HyVw3`%ipEOf= zKXaLMKUyAhe~O)VCGpsL@bu`nPgBr+Ktm%l6BmJ6@!BdWIjGBp0Tz}K4r4#+& z?+=(%7j^cKmJhSbzBSa#3T9pLrB~w8#4wc=uuoq$>5Z=PUBf(tc4X{lEdWlG9tk`!LRc4n56Mrg zO>a00<2OMnNTO?6D3Jvw)>Fux!`-NMa%y^TG7f)x=H`+Q9CjGvGZU^!b$8x+dwbW; zp|m@&v2GBN;r&t3(MhufA1!8G=+D?3DGU*IjlhQ4Yzz(!Z9ol`l%95g zXa5Hj8EMJCS65ewle1jA6YXt<6-7l?l`K^pF6CId%jFJ7<3VN(4$#}wuBEq>!mSvJ zpg98xi37q-hB?KHICNY{A7rDat;&2E*$&zs8HcpYgnYPClNE>Nd+osRV4*ljj`ie4 zj%bJ}I{FkZ`@}(UJz__-CX+4rKARpWrfg0pnb588g{-XT#ag7(bnBUY8Fk%Gx3;#< zH5x?Wynhr&i@ct$t8=&EKiIebtTn$fQ(bV#_Z2yAZxzAWITB@`BppkZkz#C~1go~z z?f77S-(O+bsAs(^_%3$<(Y8V-#%f-4eyC3)+N~3=IM1BN7EL7;H;MPJW^~;X8DnAah1rsn--F;CXxs(-||U)UFP)uYkun zP)W3uTIduZWc)|YI$OC0*fc>Zss^*}v&K~kK8>fGdLsm?a^ldZaHy!xVEP_Y@au>H+|1Z>=s9~%H&AvgNlleeDoF1UQ6P=KC{o$m;F+(j(GsQwu zr+L^SwWxCR=mRsesF`9Jx*yEZqXm~m!6=c`1+vVa$k4V$| z`LkxtRg2r+XFNi}3$@IDXi5A$@!FM4N&$*Hkm#g`%7RWJ`NDsToz`WAP|^HvmusIv zNPWuFeSN_4$@iqB)#ALLHPD$EleiGc@TX6w?s)ID;zi$%SUs^8HOEZNk;!Y(M3$Dt z#KgdnzNeXcBOM#>K=<50D4Kev0AG@4{vNO2qCT@ZOqhX&X59VQj>OW;&KtVAdgnf# z&59A?BO^2KQ)1wM;Hx(F`{?LlX8C4U-EqE6tE~dCAHR3t#=LCiadfQH(OsU`)n1rt z%f9ju$~^F0Xqj0SXq?ks=ABcJW3r=S%cKE=MP%fvFUYK!X895ls}#ovOWXJ5gUOVM4N=t?ksVjuw34^BxE3buAUv{U;Xg-v#jt!PY&?V zzjN^J80tRum$Ls6k5?%8_lelrMCSA?Cl%X-h=sL%-1AfGJ3L7Q3JN)t43Gh8N1id! zN7@ifL5bZuNd>Z8?*0EPs%uk&7PbA6E%q64A3PMZcSp^eqqr=Kc4&qi@8R?>~Wd@>Ozic|b z>S(w9NJtP~YxfW5bQ5p2GO>vSx(ot|V8oKJ7EwKM2krrPR2=L?bR7FiB3f_>ac|@> z;u*KI_a6m9j|SH+(2en@3x6tRYPH@-k3#OxGhwz0apvY4vWOQiv7llCO#58oEgwE# z0=lAYnq&(hdRE+m#C{2N^&1mH|AIeV6sreCMTNRyL(ac`ku@ z^r(e2G0)=|9GF*hXmql!B@r(D{v$uR9FunvQD}GXf?I+NaFd%04}Mrl70@VKcgs0K3#WYM6K(wib5EY=uO}=Erhqi7rU9Q zYt0e-q5;<`80_WcgY06kO0}$0i1|Jw@xj*zBm7kb1u=>P1N-|V@EZ8D4Cm)>-2ePJ zzk$KHEH9 zZn&ihJs9i@pAtCwbwN3|S+^_*D%al>gH@QBGW0T?0iug2!;F z&Xtw0{2JL$BYQ78cd8&YH18;ckAh4tz7#P;Y#>U6&AYaaENx!{$Q<`cJw9Q|rkNEf zo?|7o+j@P182?9o{|$r8Y3W=2bAW?p113OuG%-yr2~ z1(uqT#(PpRGj9t*;@~)(Zj3k}-XPbfn`JJEkj)rc2Kr~h9k_mJ`pn?q5s#M*JI6Q~ zJ#lV7zhE(IHh#BV)elUw*@+3qqQS<&I0mcuqEZ?uEHj#e8T$%BX< zO2^}nJ2(wqah~y{N;;sR<=HtDE9DB9!-RYMv@jukJg>r+FsGUnf zWEAgdB5D&iU-1>Vzl%dus0~x+2h&ptKo&#mEN`8vw)MdpzL!qgdj|&%8d^X@%~SYI zXxHekvR_%jP}HA*)TIxUU{GNt&uY`Gxx;`Wf{#w1L13NUMkK?I`4Tej{&shY-s59|6GRU zhoua%+p9h{gceGMf9qcILzOcBm)|8JXl!AL<}CL!?!NVA(={-uUhT`5$M~5SDSiE? zG>4tPjwf?MyG-Rr9q_ikEq65P>gxpWK;goF86>T8@aB&7FKcTubJ7T+Cf;c^HeTPB zj{AOlJu(@Vn#A=By6sJc#!jW{$w0x+_&~lzq=;Xmc|Ue8U$TZ z5Tp9*j$r7sj4f)lQC_KOC4Jw^PsG3`g0oMg$NmC9;hu>v4-cqItc^3vHfD}~pE-G^ zNVl(CA4O z1)GHtQwz-ySsUwfG?qMa%Ao&aW)M&(O3!X`JGXh|8zOk{GKG3#M!_ zZXcX&ZEasuRPeWN7;VBzpaBnH zTv{^;-$YP=YDt2aI8R@#jfI@+0G$Jz$Iz`O@YFqbpw6B6!n{z9Uc*_%HQowImdyZV zcpf|6e_t;#`ZTIE!6i)eJk8K4%#51V_K+8y@<9=~rL%JYDeFl;kMiR?{Q|$dlPzi^ z|NNC%#I5dG)#NqGpLrIj?&^}NhVE|x*GcKp=r{R#Fpeb&xU_bX%da|}g1LJlXQ1o! zx|-TrSYBo2c%`?gsp%?$Rpc4G-LmiQ?0=Kq0(l1N_<=^LAB`wB(YHiZQYQ{GF!!Q= zKOgUsd_vXSSgndU3(f;X3?M}GqE*bF!>!*Nmtvau&%EPP4YtrF#YS*{#{+1S7PMV` zKPm|w49G%cLH_hCzyYan+(xp4cA(P}(2NQOB8hLK9U4bNQDV=q1fM_1X7OvN`qvUP zP|j>@Ked!DHDIX|rkG9zeLNKM#_^<>+hBz*dt5S3F(|>1Qn@(AoX!ufZu5?j+dF(Q zP_WAThG*}zKW9hRSbA)#L4gJ@uNQ&La%jk&dIF*y;jUCmCpy6f(-O}V>x684N4y7! z;xK*D`X^-RR0T4{+NswP8Bs3tg+`)kk~c0O#+XxN6-aKb5+F%oLqz;RV(VgT`0xIomR@PqmVzZ?FS!BB0i!lZe^ zC;{Cf1t%in(*p!>=@Sv^YkFOq?z&Z0SJEr350D0)cKcpy9E+)P?^cj2!OolC!h$_( z5~jHSCurQw6?Kxw=D=oCsrtcyJl1}@ZO3ijxkTUJY`t;UZlAHFI zz=jSgxY+ELAUVzqB*w2vG`HJ-Ii4wS*N4Zpv{m5C*EE7q;!aLqW6d`@xr#(RAH&0x z*|5n(0MD$28uCl9@&&wIS3+He^NCmuh;6mCt4p0wmDd%MtusbyG3a8A!tN+&gh%<^ zopfy$b` z-y7n^O3$4h9UZ-agJaTkd#laL%^gL`#UHN#D5(6Sj~U-^ap`v{kYR9UV*06PBmX8P zEuJMi>&MjZ^4gH)uWcHPT`I=iwcbI&maNl~+%8Y`+p!e1CIIp`gL-80nn;t~_*Vfi1 z&{#SsYY?)Ks?ACz92*@OxjDp%y}3!0-&9zrrY9{;l9Iv`I5IlAj)N-`?TvAr>IFO9 z_z_Kz9J|nBiRF0?v(7^l33X1~LA{xYU7MG*yn}0nUxum{l9z7h2^N824oJqIfen__3>L1;J*BF~495)60Ag%J! zpgUgaP*H*msO04Pycomq6t|I5^)gvY+x{SZ`&K!5+Kg@4&KDH5-=y7Ejpy#ZcIJ;5 zM7eACIkekaXAHhqG6a7ohFt5D`FYY0_2N;+G@VbrVsg%Vn|w7ptXV<_Wuds}=sVlW zL@6mL85!wWS@=R0ikiK*XIuHeEAYMMmX@*Eyv`=at8Fdgz|)nEq!i-%&vnbu9K&XA zI(xg7T4KW^3IT4dFpOhEDa|g$uKM7T(}X#1i6>h!8aRUTQpv^P*+&2HiXHlumkkc? zBR)v^inswJ(lrq&d|Ydi9|*kHa+HHeXxCX|YHB5~A47G^(J6$QqJi{+AA>oW^y}Rc zJu;!8p>f%Q&R@mvrus^kv_tdrsYlZU2wOaky7#6nPp_I>d4Xp#Ry{$PdCMwO8Lr{s zsGnmjWc*)(zma~Z4z& z_`n7^DGd#AiV40!{=~;M&PZ2LW$Pkukdjo}`ZrAnw~q4BT}G`+8Lc%hN%+n5otvCszF zd4p@jy)6kDn>ZH3YHGX35b?V+T>3Y3w@kE!afIc-ucc5x@QIks;5p16CC>P|8=sNM zP>j}Li|0>P0nBPKOi5O8d>d(yF#^YKr2{X>GVXMLK84rIgomIqEf&9QXMNeRGVw@D zuib+nqn=gVLb)8Gpu`6ISi|5-tdq!?`fqA3S>lS9l@6TpUFHV8@p4q0^#|Jb?17@f zokV{Co=wt5no2~KUfgDh*TKwe=6B5K;fV}`xxvsdg)6nM;&C}z6K)fr1=)q!bx}v% zyT?&Xf4s$LxgqZ_M^fN$9D1YI;*Q%P3`hr_u@GpMOX$fXvx)BCI*B0_wY_+`#0?4$ ztQH7Z4Jj5}^sub7d*ibO+~HgPCGT7Mg;NNa%bJ(a<7| z4;9{FV`E<I@JR3#WJ2XxkmsbRVJ+9&(W<+>Ybo z;%@COfRip;B2-8f;L8hxN5GG?x7dKd&9Ri)*=w#in6KP8E1;|@*?v#JW*7{+EZ?U4 zPD-cUWP$0h)*h3S^BCg);E`*#_vzJFt8yzmJg)lXl$E8DMXEn_5}qVAH8ASyj-lJt zXvV_4S@Zq2(tQ{K`=|P#T4c(}RiJv=>6@+&Irl?QBOs2$|Go0%CIFO4hZR7LnT1>(V-Gcz-X65W(0U*-_I zg7C|n&xY{@z0Zl3Zw|XgH$Nt^V>P;@eQZHlX!oTgsML$D9j$H!nZ7Ya!vEpw{3=#K z?@L7A8;8C}I`wL+Su(vmFW~I-A$*|*_@G(ACbiv&2Un8Mm<-#X4X1LDN4-)D^EC7h zxnrVQP{-~vIG07$l#WOtdqf!)6Eh%*ayg18V#M$y^pCohx+>GuXwBv@?LRm_Kc9~# zWOHC-V)AZt`8OQacu(&mYxdvjQD)dr`-*VGE)OTh^6vA|qgHcxEvX#g0ffxlUrhZ1E(}BH70KzeJG`k_ z^>`zJ$5Sk_l@5e|2RnHtTc7n>z0evQSGog(XG@o=$&eD6@HI6O@Qw~jJvf{qq$Iw_ z4Q0Un?XL{>1Fv2lnLbV}Lmy|?;a(}=lP277F!wLMHOM4XQRa^Kwbm&ijl6Vd>H3#| zfPgF>ur!9mq4?ilZVa|HZEl*Z65!$W4nW??|6Dvth~%Zj^7HcxNeCc}v^H%A7tlG~ znt{oIlSytbq7ki18L5BL^26<2v!py#_9p@5zg9vHotsp2axTxR*EChoVEeZ9L(xdGFtoMpelMSHBwLv+{lTpt zIBZhUs?fctb=m4KxsWFm0;hhwkaOCN2rQ3NSvPuG>8}0oAvswPT5Y~HO*b-w>Yq0dQlg zC*w|d`~Ej#Bkt(6`txEPFZ@K8h6oh~MH5b`=wsO-2GQ&9{P2Qh3_Bx&!r3Wn5A8<= zo?e*BZrVO)*IvdN^Spo&W{|%y*fwXCPZ4SR>P#PL7p$(UpL`eWlBhT_F1=hu#vk~h zT9t!!b*!GZ3Pw+#LsNqN6*=%w0UE`x)Vis<(Yo!s^}98?>1-MlmaVD4p}0ip?g(u` z^);~LO7QH?`y*J3a)s_GF`v|qsf~?)+|A4>Kam5O+n<${mqWB^s*>dh?)jKQj`T4S zEB*>d`k0rMHUsvMm@ zVoU8Iy@^?*0L)sxH>ao>9PbX5V{Ha~6?)_K=PPtG*EHkyJ91khd+yg>=VSEvKcO;!Tf11<#2yP|Jkt+0yaA4sO?h zpd5D%f)(@{ilLM;Ed9+uf#i!Xo*0y#G##1{Y4^ybRMrUn)aic@2uWAY)+rGw%@>CN zM+2cbjId`?x6G6du4_It8u1hC0XfJoX@{-msGS2Xwti_oxrw`iw=?5Q#|(&{e8(f#m*+%#$8BCDLJ%f$7r&g;P}pD=!Mgci z&1Y;}IIS?G)xn}vb)ozFWnw2l{}bxuMbM=AZCKh3NLGP(1WL7UPf znKa6s{gy`x0VqTnB#x4$nVR2&hoj83Ys=sK`%%Y!`d%EC|J7k2Pw13(12Lu*Q@m!4 z)y+j49sfaU*NhXNSu;(wPCmFFf Date: Sat, 16 Dec 2017 21:09:02 +0300 Subject: [PATCH 27/39] Expose Description to Sub Editor so you can do things like create spare ID cards or w/e --- Barotrauma/BarotraumaShared/Source/Items/Item.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index 45161fefa..8af99c2af 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -120,6 +120,7 @@ namespace Barotrauma } private string description; + [Editable, Serialize("", true)] public string Description { get { return description == null ? prefab.Description : description; } From 8ab97af4564b2a64c912f07a43b556032b1425ba Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sat, 16 Dec 2017 21:30:18 +0300 Subject: [PATCH 28/39] Allow sub makers to alter the ID Card's description property on spawn points --- .../Source/Items/Inventory.cs | 2 +- .../BarotraumaClient/Source/Map/WayPoint.cs | 20 ++++++++++++++++++- .../Source/Characters/Jobs/Job.cs | 2 ++ .../BarotraumaShared/Source/Map/WayPoint.cs | 13 ++++++++++++ .../Source/Networking/RespawnManager.cs | 4 +++- 5 files changed, 38 insertions(+), 3 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs b/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs index b5204a9f0..166974b34 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs @@ -297,7 +297,7 @@ namespace Barotrauma else { string description = Items[i].Description; - if (Items[i].Name == "ID Card") + if (Items[i].Prefab.Name == "ID Card") { string[] readTags = Items[i].Tags.Split(','); string idName = null; diff --git a/Barotrauma/BarotraumaClient/Source/Map/WayPoint.cs b/Barotrauma/BarotraumaClient/Source/Map/WayPoint.cs index 983249d48..48213cbde 100644 --- a/Barotrauma/BarotraumaClient/Source/Map/WayPoint.cs +++ b/Barotrauma/BarotraumaClient/Source/Map/WayPoint.cs @@ -106,6 +106,16 @@ namespace Barotrauma return true; } + private bool EnterIDCardDesc(GUITextBox textBox, string text) + { + IdCardDesc = text; + textBox.Text = text; + textBox.Color = Color.Green; + + textBox.Deselect(); + + return true; + } private bool EnterIDCardTags(GUITextBox textBox, string text) { IdCardTags = text.Split(','); @@ -172,8 +182,16 @@ namespace Barotrauma y = 40 + 20; - new GUITextBlock(new Rectangle(0, y, 100, 20), "ID Card tags:", Color.Transparent, Color.White, Alignment.TopLeft, null, editingHUD); + new GUITextBlock(new Rectangle(0, y, 100, 20), "ID Card description:", Color.Transparent, Color.White, Alignment.TopLeft, null, editingHUD); GUITextBox propertyBox = new GUITextBox(new Rectangle(100, y, 200, 20), "", editingHUD); + propertyBox.Text = idCardDesc; + propertyBox.OnEnterPressed = EnterIDCardDesc; + propertyBox.OnTextChanged = TextBoxChanged; + propertyBox.ToolTip = "Characters spawning at this spawnpoint will have the specified description added to their ID card. This can be used to describe additional access levels their card has on the sub."; + + y = y + 30; + + new GUITextBlock(new Rectangle(0, y, 100, 20), "ID Card tags:", Color.Transparent, Color.White, Alignment.TopLeft, null, editingHUD); propertyBox.Text = string.Join(", ", idCardTags); propertyBox.OnEnterPressed = EnterIDCardTags; propertyBox.OnTextChanged = TextBoxChanged; diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Jobs/Job.cs b/Barotrauma/BarotraumaShared/Source/Characters/Jobs/Job.cs index 865e6bcbc..04271943d 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Jobs/Job.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Jobs/Job.cs @@ -132,6 +132,8 @@ namespace Barotrauma } item.AddTag("name:" + character.Name); item.AddTag("job:" + Name); + if (!string.IsNullOrWhiteSpace(spawnPoint.IdCardDesc)) + item.Description = spawnPoint.IdCardDesc; } if (parentItem != null) parentItem.Combine(item); diff --git a/Barotrauma/BarotraumaShared/Source/Map/WayPoint.cs b/Barotrauma/BarotraumaShared/Source/Map/WayPoint.cs index 809426c4c..712ce55dc 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/WayPoint.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/WayPoint.cs @@ -21,6 +21,7 @@ namespace Barotrauma protected SpawnType spawnType; //characters spawning at the waypoint will be given an ID card with these tags + private string idCardDesc; private string[] idCardTags; //only characters with this job will be spawned at the waypoint @@ -57,6 +58,11 @@ namespace Barotrauma } } + public string IdCardDesc + { + get { return idCardDesc; } + private set { idCardDesc = value; } + } public string[] IdCardTags { get { return idCardTags; } @@ -113,6 +119,7 @@ namespace Barotrauma public override MapEntity Clone() { var clone = new WayPoint(rect, Submarine); + clone.idCardDesc = idCardDesc; clone.idCardTags = idCardTags; clone.spawnType = spawnType; clone.assignedJob = assignedJob; @@ -570,6 +577,11 @@ namespace Barotrauma Enum.TryParse(element.GetAttributeString("spawn", "Path"), out w.spawnType); + string idCardDescString = element.GetAttributeString("idcarddesc", ""); + if (!string.IsNullOrWhiteSpace(idCardDescString)) + { + w.IdCardDesc = idCardDescString; + } string idCardTagString = element.GetAttributeString("idcardtags", ""); if (!string.IsNullOrWhiteSpace(idCardTagString)) { @@ -604,6 +616,7 @@ namespace Barotrauma new XAttribute("y", (int)(rect.Y - Submarine.HiddenSubPosition.Y)), new XAttribute("spawn", spawnType)); + if (idCardDesc != null) element.Add(new XAttribute("idcarddesc", idCardDesc)); if (idCardTags.Length > 0) { element.Add(new XAttribute("idcardtags", string.Join(",", idCardTags))); diff --git a/Barotrauma/BarotraumaShared/Source/Networking/RespawnManager.cs b/Barotrauma/BarotraumaShared/Source/Networking/RespawnManager.cs index 44e8d777c..90cafee63 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/RespawnManager.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/RespawnManager.cs @@ -533,7 +533,9 @@ namespace Barotrauma.Networking foreach (string s in shuttleSpawnPoints[i].IdCardTags) { item.AddTag(s); - } + } + if (!string.IsNullOrWhiteSpace(shuttleSpawnPoints[i].IdCardDesc)) + item.Description = shuttleSpawnPoints[i].IdCardDesc; } #if CLIENT GameMain.GameSession.CrewManager.AddCharacter(character); From 0ce9acb76a6c7684be2bee5868b85654b6a65723 Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sat, 16 Dec 2017 21:45:30 +0300 Subject: [PATCH 29/39] fix things --- Barotrauma/BarotraumaClient/Source/Map/WayPoint.cs | 12 ++++++++---- Barotrauma/BarotraumaShared/Source/Map/WayPoint.cs | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Map/WayPoint.cs b/Barotrauma/BarotraumaClient/Source/Map/WayPoint.cs index 48213cbde..cf1f7a269 100644 --- a/Barotrauma/BarotraumaClient/Source/Map/WayPoint.cs +++ b/Barotrauma/BarotraumaClient/Source/Map/WayPoint.cs @@ -153,7 +153,7 @@ namespace Barotrauma private GUIComponent CreateEditingHUD(bool inGame = false) { int width = 500; - int height = spawnType == SpawnType.Path ? 100 : 140; + int height = spawnType == SpawnType.Path ? 100 : 200; int x = GameMain.GraphicsWidth / 2 - width / 2, y = 10; editingHUD = new GUIFrame(new Rectangle(x, y, width, height), Color.Black * 0.5f); @@ -182,8 +182,9 @@ namespace Barotrauma y = 40 + 20; - new GUITextBlock(new Rectangle(0, y, 100, 20), "ID Card description:", Color.Transparent, Color.White, Alignment.TopLeft, null, editingHUD); - GUITextBox propertyBox = new GUITextBox(new Rectangle(100, y, 200, 20), "", editingHUD); + new GUITextBlock(new Rectangle(0, y, 100, 20), "ID Card desc:", Color.Transparent, Color.White, Alignment.TopLeft, null, editingHUD); + GUITextBox propertyBox = new GUITextBox(new Rectangle(100, y, 350, 20), "", editingHUD); + propertyBox.MaxTextLength = 150; propertyBox.Text = idCardDesc; propertyBox.OnEnterPressed = EnterIDCardDesc; propertyBox.OnTextChanged = TextBoxChanged; @@ -192,6 +193,8 @@ namespace Barotrauma y = y + 30; new GUITextBlock(new Rectangle(0, y, 100, 20), "ID Card tags:", Color.Transparent, Color.White, Alignment.TopLeft, null, editingHUD); + propertyBox = new GUITextBox(new Rectangle(100, y, 350, 20), "", editingHUD); + propertyBox.MaxTextLength = 60; propertyBox.Text = string.Join(", ", idCardTags); propertyBox.OnEnterPressed = EnterIDCardTags; propertyBox.OnTextChanged = TextBoxChanged; @@ -200,7 +203,8 @@ namespace Barotrauma y = y + 30; new GUITextBlock(new Rectangle(0, y, 100, 20), "Assigned job:", Color.Transparent, Color.White, Alignment.TopLeft, null, editingHUD); - propertyBox = new GUITextBox(new Rectangle(100, y, 200, 20), "", editingHUD); + propertyBox = new GUITextBox(new Rectangle(100, y, 350, 20), "", editingHUD); + propertyBox.MaxTextLength = 60; propertyBox.Text = (assignedJob == null) ? "None" : assignedJob.Name; propertyBox.OnEnterPressed = EnterAssignedJob; propertyBox.OnTextChanged = TextBoxChanged; diff --git a/Barotrauma/BarotraumaShared/Source/Map/WayPoint.cs b/Barotrauma/BarotraumaShared/Source/Map/WayPoint.cs index 712ce55dc..65fb6bc8c 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/WayPoint.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/WayPoint.cs @@ -616,7 +616,7 @@ namespace Barotrauma new XAttribute("y", (int)(rect.Y - Submarine.HiddenSubPosition.Y)), new XAttribute("spawn", spawnType)); - if (idCardDesc != null) element.Add(new XAttribute("idcarddesc", idCardDesc)); + if (!string.IsNullOrWhiteSpace(idCardDesc)) element.Add(new XAttribute("idcarddesc", idCardDesc)); if (idCardTags.Length > 0) { element.Add(new XAttribute("idcardtags", string.Join(",", idCardTags))); From 828bde6f0478fc0f1de41fe6e2edda2456060b96 Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sun, 17 Dec 2017 14:18:30 +0300 Subject: [PATCH 30/39] Make flashlight's idle holding position similar to that of oxygen/welding tanks so you can still use them unaimed --- Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml b/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml index 79c955152..5e0c69ecf 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml @@ -248,7 +248,7 @@ - + From d5e409bfff929556c48f5f2f15263ba361e40597 Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sun, 17 Dec 2017 14:55:35 +0300 Subject: [PATCH 31/39] Increase muffling effects with obstruction for spoken speech (barely affects radio chat and wifi components, however it does add extra 100f range to the distance) Decreased required muffling to 0.3f Added an "obstructionmult" to intensify speaking obstruction effects --- .../BarotraumaShared/Source/Networking/ChatMessage.cs | 6 +++--- Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/Networking/ChatMessage.cs b/Barotrauma/BarotraumaShared/Source/Networking/ChatMessage.cs index 6b7a2333f..e69dbf80f 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/ChatMessage.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/ChatMessage.cs @@ -105,18 +105,18 @@ namespace Barotrauma.Networking return ApplyDistanceEffect(listener, Sender, Text, SpeakRange); } - public static string ApplyDistanceEffect(Entity listener, Entity Sender, string text, float range) + public static string ApplyDistanceEffect(Entity listener, Entity Sender, string text, float range, float obstructionmult = 2.0f) { if (listener.WorldPosition == Sender.WorldPosition) return text; float dist = Vector2.Distance(listener.WorldPosition, Sender.WorldPosition); if (dist > range) return ""; - if (Submarine.CheckVisibility(listener.SimPosition, Sender.SimPosition) != null) dist *= 2.0f; + if (Submarine.CheckVisibility(listener.SimPosition, Sender.SimPosition) != null) dist = (dist + 100f) * obstructionmult; if (dist > range) return ""; float garbleAmount = dist / range; - if (garbleAmount < 0.5f) return text; + if (garbleAmount < 0.3f) return text; int startIndex = Math.Max(text.IndexOf(':') + 1, 1); diff --git a/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs b/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs index cec645624..b40f789c1 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs @@ -1848,7 +1848,7 @@ namespace Barotrauma.Networking case ChatMessageType.Default: if (!receiver.IsDead) { - return ChatMessage.ApplyDistanceEffect(receiver, sender, message, ChatMessage.SpeakRange); + return ChatMessage.ApplyDistanceEffect(receiver, sender, message, ChatMessage.SpeakRange, 3.0f); } break; case ChatMessageType.Radio: From 4f7c805a9c515a5af9530afaf366948baa98d60c Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sun, 17 Dec 2017 15:17:15 +0300 Subject: [PATCH 32/39] Hide character names/health/etc. if you can't see their head or it doesn't exist. TODO: use Line of Sight instead of CheckVisibility --- Barotrauma/BarotraumaClient/Source/Characters/Character.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Character.cs b/Barotrauma/BarotraumaClient/Source/Characters/Character.cs index ddcc3112f..aaf6a7bba 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/Character.cs @@ -296,11 +296,18 @@ namespace Barotrauma if (this == controlled) return; + //Ideally it shouldn't send the character entirely if we can't see them but /shrug, this isn't the most hacker-proof game atm + Limb selfHead = controlled != null ? controlled.AnimController.GetLimb(LimbType.Head) : null; + Limb targHead = this.AnimController.GetLimb(LimbType.Head); + if (controlled != null && selfHead != null && targHead != null && Submarine.CheckVisibility(selfHead.SimPosition, targHead.SimPosition) != null) //TODO: use Line of Sight instead of CheckVisibility + return; + if (info != null) { string name = Info.DisplayName; if (controlled == null && name != Info.Name) name += " (Disguised)"; + Vector2 namePos = new Vector2(pos.X, pos.Y - 110.0f - (5.0f / cam.Zoom)) - GUI.Font.MeasureString(name) * 0.5f / cam.Zoom; Color nameColor = Color.White; From a620b0683177e6178f00397397c6ef6aa090d7df Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sun, 17 Dec 2017 15:49:16 +0300 Subject: [PATCH 33/39] Play a loud sound when the door is crowbarred open so everyone is alerted! (Security should know when someonoe is breaking into places without ID card) TODO: use bump.ogg when wrenching/crowbarring is initiated --- .../BarotraumaShared/BarotraumaShared.projitems | 6 ++++++ .../Content/Items/Door/doors.xml | 9 ++++++--- .../Content/Items/Tools/bump.ogg | Bin 0 -> 5250 bytes .../Content/Items/Tools/crowbar.ogg | Bin 0 -> 24035 bytes .../Source/Items/Components/Door.cs | 3 +++ .../Items/Components/Holdable/Pickable.cs | 1 + 6 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 Barotrauma/BarotraumaShared/Content/Items/Tools/bump.ogg create mode 100644 Barotrauma/BarotraumaShared/Content/Items/Tools/crowbar.ogg diff --git a/Barotrauma/BarotraumaShared/BarotraumaShared.projitems b/Barotrauma/BarotraumaShared/BarotraumaShared.projitems index 5a76b4df1..91e79eb92 100644 --- a/Barotrauma/BarotraumaShared/BarotraumaShared.projitems +++ b/Barotrauma/BarotraumaShared/BarotraumaShared.projitems @@ -976,6 +976,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest diff --git a/Barotrauma/BarotraumaShared/Content/Items/Door/doors.xml b/Barotrauma/BarotraumaShared/Content/Items/Door/doors.xml index 043507a2d..476f8a787 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Door/doors.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Door/doors.xml @@ -6,12 +6,13 @@ - + + @@ -36,12 +37,13 @@ - + + @@ -66,12 +68,13 @@ - + + diff --git a/Barotrauma/BarotraumaShared/Content/Items/Tools/bump.ogg b/Barotrauma/BarotraumaShared/Content/Items/Tools/bump.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d3cd6041a407e6f4d990e3a3249bbdb29d307d0f GIT binary patch literal 5250 zcmd5>woqcosIUZb2%Q{`3f+ftj*AKR3rQqzMEymg!s6ohB~W%p(otv! z49X!gfkHz$B!p0QFNH|H1bc_A+lU@`CxVTcvW(&C>+WQ;5wYN_g5TjCwnG~bKr74_ zv!#&mi`y}68q0J`VQ8M)v5Hhpyh|}n!>0--;zUQXkr9n--gWa3q{eX=k&Sp+w{@>=>bt4Up-95=Lm zBZqdOzMvrNcojX*O>7YEj(5SN<+&+W_-w2i2w;uBEaxU;#iuPi;ZBAr=304+ur$ zGS<~i9-!roY~QnuQaNi@8S_qW_v_dt8?wJg$qszkY*J$G2kDT8vWTzTYNyFsLC!s06D zbLUPHUZPmOovxVTua>I-pr5KiaM4fuW601?*9yIbspK44Y*bZVmTA^)eC3W=k8F@! zx^ma*l}QKELA9n%ZL3H9fPYxcH8Cf8*)M^Vn)*REOa(k;jNE@rcswfF;kou(WXKu% zJWfJ4=6s2Q+?{YymVMT@X^zhHzk3(W+L`6(3VWS<&jWYQmBfL3QqUlIWR@E8P2$KL z)!myz&XL-cAl~8 zDeTrO*1i4K9v>XNH9Y!#o&4xdBXv$gEDsUgV~9=+s3!$9P=^Mo!3ESObIJeI8LQ+b zx&Sccl2h)IS?-cEZkcC*DAm6JfVM1}(3$5fbH-ir3|tG!UAYqhWf4)l-TV3H733mz zG7(urv!7vj&oE`raAj-U%E*Cbyr^1qkw7A>{ZDp``l@{`mj^FfnK+7(3Ijt}NfJ^}ZhUzFSukJ&FIRnS1nO zJ)mRP!mIsI6tc4Kay3GGGaKO|IV({c#THRo8N#v2k@gzTzL z7%d9A@G(w>>MH?n08&j|Fy$JdS-47$Ll#DShL&zRsY}bjiA(4NBQb}*&8=ce3Oq#lCf9xEdr%8yjSV6k2-{Au{P6 zmgL7E1^baigXaA#8S;=XDIgIdll%r5_pmbLVGEL9fehKNfH6Xc!sLLDM88=^fGB@# zkUF-RB$^`z%%;Ir8S*s-Nz0ZvlkAh2Hby5u5v4r|h$UGT+-D?*peEySV*5ok7|cLF$@i(8rxE4|c<&MaYg;z1yx-f4u_J5&=#a z94iYCC_@Jnpfh<>!m>zVZ8?QkMd4Bc*}K_13SWR>*BVpUlt69-n_XGRi)7bEvw78- zJWLNSs#`!|3tkBY)TY{);WCPR8pGxpHwi8b*S>lwEDzvS?c-9SxDZM%Tzg?3H)=mO zlFvo+`B8j+4WDlu1XtNpRXoE?$l=wn`9?iF{v!c}-w?y+Q=9m&<^@!V5Nbl@^EMRm zqh!be<6+_VP%9ZSTU^M4YQ(Vl>w~zJY#H+8F&+drF5>aK3&e$di2U*xH(HJy^@vYl z%aAt|@r-(EsnTXiw;-0!kAcV%nUXO*&C}idH*y2zY6vzA3#NMn)l#{EGBx-cdj!;P zuf#}&k?cRTG8z_akP4wz)7`ak7x>i@+4RkPZM;Nia$OK3I2C@zu~n@f%sS%1)fw8zuc7uK$aE|s)hg4^K{3^&9*hPQk3w6yJHjYPQd zQ=6%(GXgwav<%oSu&B<7Ctx-GBX79@lpp zXl%F>KpH}aIAF?U-(2~J_rDJ=|8C)5?x^~op#J5K{}ufI1L6FC@2dZceTzYEW<1E< z|7T>nz#z-=cEfaXQjn&TT48;zXiVrGT&FG!#R=V1B!RNwYB!A0@&^QJA&n4t913j` zmzQe<_2P~a2*)o^vZLRW*KLokH5Ug4UN9GNXua3!G^1-_6;A6hg#)bnwEigm7J#Q% zOTg57c*&~G^}heEKSNqUyFw;1g(PI*#PFr7(_~W>eP7v>j>MnWqRH|kHCMh03n$t# zD|xZ4yb4y_Fk@t?l!|mi!vU_QBCTYDoRSR$H~Dl?Da#9hU56Ec9dqf0H5`rX1)8$t zge3@5x1fY@H`PAJ{=`!IZtqP?@$R_$g`wM`Hm&r@#UYF7YT8luLp#luz}p)IP_0Tx zEfo4AUM0g67O@$3kc-lYms(3yb#x~Yt%{DRjv)6;iAz%>bED#pzMCXvyb2z9#9!AA zvB=VLEZuPQZR)q25+C1}C|P9%7J{cRtxCY^)$9wG8e4DmJ$yR#7M6&xEe0O}u(V}n zWK0?vZ!|H(T3A|H|NS?}WXh%N;K*dk|M!%@K{*S^{`X{p7nBw(GC>d=?bOv|OZ=>9)#m6iuekUQxgR3^rz0t3*GPtYZ}Yro%Nn@DPI&$10?z#ZIy> zf7$ct(1{?`_7~Wu_U1>Ztb#8sleA8Y9gp*JJ)egX!P_%^2;*^S3-i;o4glsQJN$F@ zK1Ko=3w+$O6fkv6dUhDB@Ki7!KXIt_&>#Tk5lxCaRaWX67>pSn%4jhMAgYxf_WcIr zGbDE0@QXrgOAk>KfUe?^C2@;%$E0V+evAe&3NMwArYTojHBJuOg}HDn6%4F;#5n`EHMyLTml&oskpQCt9C^1FxmU$xShc zSNrjOM*eQe%B<-VYxeqHR629A_?LIdL7W?!oL}Q6U&NUMy%!YAsc&~EvffL*4~kcT z`A-^Y5Bq)2d4lry(vycs#^B493u^mbM1L1XR^Uu04P5qM9(dAiUz1ey5e>3lOV2y+ zri1zq;VT-)yOcWbDs!frH0j?cmc-O8s^LGv?Og)q`RRo=LrToYM!6T$#Z})O+GBb- zTD@fKQxlF5ndD_HoN0KYRXWr7dSw4;(2iN&CAFWL(Hew=GYLO*YcotodLy6M4N>yXj*TurU&F3Wn&v&x8$L-8jl zF}cJ)3f>@8*rzU*@sgv3*C_` zo-iKl?5%qj*LYUYjwrcH51=_eiD)eCzx3mc7$1r2_IEEtTVD~D+-{d_Zn#NuJr-h; z;j_d}*-J{BpIo1GObu`!Q43wsoxcjVoTg5)?!L7i+Yq@Q5#rG@Gur?CjWVN|pl?Ud zZ5GU@8NJ(^<4bvCOwgLC;8;(@f?WzX5}((YH36=XUX4NZ^@~3|*z{KQp1PZ0-49GJ zl}NpNAJ@N~cvK!ZeqwE1yyT9{1aaVa0{4EhjWe_UwB}jBTxe|DUHoeGhgUl{Q?4sw zdf!@??&=jFLS|~x@{hbY>;C;1PfJ(m*hM0|Nl(3)Dzv$le*gOS5#$)eE(J96IpW|o z#;ifsC(_Zu;a9=!?^CnfwbhXP;L(QW!qv~=COCf zniQA|y+F)zpm%NNw{=+uE*3rLZ%h|2`eu6$uGcOw+jwchnWV_b-l3HP!7{WgP){LhbCfAU!v`1=EM+zD>MS)!E+VAS`ezo_O-R|!RroBe=G@13R=(8(kyZk VX$<~6xKj@iGhL3I0?Ynx{{Z;l99{qb literal 0 HcmV?d00001 diff --git a/Barotrauma/BarotraumaShared/Content/Items/Tools/crowbar.ogg b/Barotrauma/BarotraumaShared/Content/Items/Tools/crowbar.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a0f6049535ad36e9fb2059963ba7283753e8b609 GIT binary patch literal 24035 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 OHMgn{z#{>8KmiU>zhZ^} literal 0 HcmV?d00001 diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs index 0f52ffcfe..fbb0e3fe4 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs @@ -206,6 +206,9 @@ namespace Barotrauma.Items.Components public override bool OnPicked(Character picker) { SetState(predictedState == null ? !isOpen : !predictedState.Value, false, true); //crowbar function +#if CLIENT + PlaySound(ActionType.OnPicked, item.WorldPosition); +#endif return false; } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Pickable.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Pickable.cs index 7dba6ac00..69e06f783 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Pickable.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Pickable.cs @@ -89,6 +89,7 @@ namespace Barotrauma.Items.Components #if CLIENT if (!GameMain.Instance.LoadingScreenOpen && picker == Character.Controlled) GUI.PlayUISound(GUISoundType.PickItem); + PlaySound(ActionType.OnPicked, item.WorldPosition); #endif return true; From 6b8bd59656ee8e8adaeb40474b5be21245fdb0ff Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sun, 17 Dec 2017 15:52:48 +0300 Subject: [PATCH 34/39] Let mechanics spawn with crowbars --- Barotrauma/BarotraumaShared/Content/Jobs.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/Barotrauma/BarotraumaShared/Content/Jobs.xml b/Barotrauma/BarotraumaShared/Content/Jobs.xml index c46354b4e..4ed0e602f 100644 --- a/Barotrauma/BarotraumaShared/Content/Jobs.xml +++ b/Barotrauma/BarotraumaShared/Content/Jobs.xml @@ -49,6 +49,7 @@ + From 0eacbce313b795708d6fb2c07af58d48f793bec6 Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sun, 17 Dec 2017 16:32:25 +0300 Subject: [PATCH 35/39] Tweaked crowbar to be a powerful two-handed weapon instead --- Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml | 8 ++++---- .../Source/Items/Components/Holdable/MeleeWeapon.cs | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml b/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml index 5e0c69ecf..fc2150ced 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml @@ -190,15 +190,15 @@ category="Equipment" Tags="smallitem" - price="10"> + price="15"> - - + + diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/MeleeWeapon.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/MeleeWeapon.cs index 07aa6982a..38f8ca61a 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/MeleeWeapon.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/MeleeWeapon.cs @@ -137,7 +137,7 @@ namespace Barotrauma.Items.Components } else { - ac.HoldItem(deltaTime, item, handlePos, new Vector2(hitPos, 0.0f), aimPos, false, holdAngle); + ac.HoldItem(deltaTime, item, handlePos, holdPos, aimPos, false, holdAngle); } } else From 714b52dce80b01bf6493c8cca6067aecab3b213f Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sun, 17 Dec 2017 18:05:05 +0300 Subject: [PATCH 36/39] Fixed several sound-related issues that have been bothering me for ages, e.g. * Sounds not playing when the structure is fully destroyed * Glass windows using wrong sound effects * Only one glassBreak sound was used despite there being 3 --- .../BarotraumaClient/Source/Sounds/SoundPlayer.cs | 7 ++++--- .../BarotraumaShared/Content/Sounds/sounds.xml | 4 ++-- Barotrauma/BarotraumaShared/Source/Map/Structure.cs | 12 ++++++------ 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Sounds/SoundPlayer.cs b/Barotrauma/BarotraumaClient/Source/Sounds/SoundPlayer.cs index 8442023e4..9f7055eae 100644 --- a/Barotrauma/BarotraumaClient/Source/Sounds/SoundPlayer.cs +++ b/Barotrauma/BarotraumaClient/Source/Sounds/SoundPlayer.cs @@ -453,10 +453,11 @@ namespace Barotrauma { damage = MathHelper.Clamp(damage+Rand.Range(-10.0f, 10.0f), 0.0f, 100.0f); var sounds = damageSounds.FindAll(s => - damage >= s.damageRange.X && - damage <= s.damageRange.Y && + s.damageRange == null || + (damage >= s.damageRange.X && + damage <= s.damageRange.Y) && s.damageType == damageType && - (string.IsNullOrEmpty(s.requiredTag) || (tags != null && tags.Contains(s.requiredTag)))); + (tags == null ? string.IsNullOrEmpty(s.requiredTag) : tags.Contains(s.requiredTag))); if (!sounds.Any()) return; diff --git a/Barotrauma/BarotraumaShared/Content/Sounds/sounds.xml b/Barotrauma/BarotraumaShared/Content/Sounds/sounds.xml index 8aae1829b..d4156d5d9 100644 --- a/Barotrauma/BarotraumaShared/Content/Sounds/sounds.xml +++ b/Barotrauma/BarotraumaShared/Content/Sounds/sounds.xml @@ -16,8 +16,8 @@ - - + + diff --git a/Barotrauma/BarotraumaShared/Source/Map/Structure.cs b/Barotrauma/BarotraumaShared/Source/Map/Structure.cs index a9f7f8330..46a7fd781 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Structure.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Structure.cs @@ -506,15 +506,15 @@ namespace Barotrauma float impact = Vector2.Dot(f2.Body.LinearVelocity, -normal)*f2.Body.Mass*0.1f; - if (impact < 10.0f) return true; - #if CLIENT SoundPlayer.PlayDamageSound(DamageSoundType.StructureBlunt, impact, new Vector2( - sections[section].rect.X + sections[section].rect.Width / 2, - sections[section].rect.Y - sections[section].rect.Height / 2)); + sections[section].rect.X + sections[section].rect.Width / 2, + sections[section].rect.Y - sections[section].rect.Height / 2), tags: Tags); #endif + if (impact < 10.0f) return true; + AddDamage(section, impact); } } @@ -661,10 +661,10 @@ namespace Barotrauma #if CLIENT GameMain.ParticleManager.CreateParticle("dustcloud", SectionPosition(i), 0.0f, 0.0f); - if (playSound && !SectionBodyDisabled(i)) + if (playSound)// && !SectionBodyDisabled(i)) { DamageSoundType damageSoundType = (attack.DamageType == DamageType.Blunt) ? DamageSoundType.StructureBlunt : DamageSoundType.StructureSlash; - SoundPlayer.PlayDamageSound(damageSoundType, damageAmount, worldPosition); + SoundPlayer.PlayDamageSound(damageSoundType, damageAmount, worldPosition, tags: Tags); } #endif From e35fe18662813d2d3bff2b02e3117c2a95414192 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sun, 17 Dec 2017 19:33:53 +0200 Subject: [PATCH 37/39] Carrier's "dummy limb" with a light source cannot be severed. Closes #154 --- .../BarotraumaShared/Content/Characters/Carrier/carrier.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Barotrauma/BarotraumaShared/Content/Characters/Carrier/carrier.xml b/Barotrauma/BarotraumaShared/Content/Characters/Carrier/carrier.xml index 9377d3d06..81a8367e1 100644 --- a/Barotrauma/BarotraumaShared/Content/Characters/Carrier/carrier.xml +++ b/Barotrauma/BarotraumaShared/Content/Characters/Carrier/carrier.xml @@ -61,7 +61,7 @@ - + From 041d1112b89475c424ee0cf10baf1d66f32011a3 Mon Sep 17 00:00:00 2001 From: Alex Noir Date: Sun, 17 Dec 2017 21:35:19 +0300 Subject: [PATCH 38/39] Added a timer to the raycasts so it's not screwing over performance too hard --- .../Source/Characters/Character.cs | 32 ++++++++++++++++--- .../Source/Items/Inventory.cs | 2 +- .../Source/Items/Components/Wearable.cs | 4 +-- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Character.cs b/Barotrauma/BarotraumaClient/Source/Characters/Character.cs index aaf6a7bba..da4bf9838 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/Character.cs @@ -15,6 +15,8 @@ namespace Barotrauma { protected float soundTimer; protected float soundInterval; + protected float nameTimer; + protected bool nameVisible; private List sounds; @@ -295,11 +297,33 @@ namespace Barotrauma } if (this == controlled) return; + + nameTimer -= (float)Timing.Step; + if (nameTimer <= 0.0f) + { + //Ideally it shouldn't send the character entirely if we can't see them but /shrug, this isn't the most hacker-proof game atm + Limb selfHead = controlled != null ? controlled.AnimController.GetLimb(LimbType.Head) : null; + Limb targHead = this.AnimController.GetLimb(LimbType.Head); - //Ideally it shouldn't send the character entirely if we can't see them but /shrug, this isn't the most hacker-proof game atm - Limb selfHead = controlled != null ? controlled.AnimController.GetLimb(LimbType.Head) : null; - Limb targHead = this.AnimController.GetLimb(LimbType.Head); - if (controlled != null && selfHead != null && targHead != null && Submarine.CheckVisibility(selfHead.SimPosition, targHead.SimPosition) != null) //TODO: use Line of Sight instead of CheckVisibility + if (controlled != null && controlled.Submarine == Submarine) + { + if (selfHead != null && targHead != null) + { + Body closestBody = Submarine.CheckVisibility(selfHead.SimPosition, targHead.SimPosition); + Structure wall = null; + if (closestBody != null) + wall = closestBody.UserData as Structure; + nameVisible = closestBody == null || wall == null || !wall.CastShadow; + } + else + nameVisible = false; + } + else + nameVisible = true; //Ideally it should check for visibility from outside the sub/from sub-to-sub, but this will work for now. + nameTimer = Rand.Range(0.5f, 2f); + } + + if (!nameVisible) return; if (info != null) diff --git a/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs b/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs index 166974b34..377c51275 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs @@ -297,7 +297,7 @@ namespace Barotrauma else { string description = Items[i].Description; - if (Items[i].Prefab.Name == "ID Card") + if (Items[i].Prefab.NameMatches("ID Card")) { string[] readTags = Items[i].Tags.Split(','); string idName = null; diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Wearable.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Wearable.cs index 248d4257d..168387bc8 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Wearable.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Wearable.cs @@ -31,14 +31,14 @@ namespace Barotrauma.Items.Components private WearableSprite[] wearableSprites; private LimbType[] limbType; private Limb[] limb; + private List damageModifiers; public List DamageModifiers { get { return damageModifiers; } } - - public bool Disguise; + public Wearable (Item item, XElement element) : base(item, element) { From a5d6da31a40eb88a008f7e9150c84f90207c1309 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sun, 17 Dec 2017 20:42:31 +0200 Subject: [PATCH 39/39] Holdable items can be held in any limb slot, not just hands. + Characters can hold a flashlight in their mouth. --- .../Content/Items/Tools/tools.xml | 6 +-- .../Animation/HumanoidAnimController.cs | 4 +- .../Items/Components/Holdable/Holdable.cs | 38 +++++++++++++++++-- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml b/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml index 0d6c81251..c59cedf22 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Tools/tools.xml @@ -218,8 +218,7 @@ @@ -231,12 +230,11 @@ - + - diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs b/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs index f6962526c..9dbaf2193 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs @@ -1011,8 +1011,6 @@ namespace Barotrauma public override void HoldItem(float deltaTime, Item item, Vector2[] handlePos, Vector2 holdPos, Vector2 aimPos, bool aim, float holdAngle) { - Holdable holdable = item.GetComponent(); - if (character.IsUnconscious || character.Stun > 0.0f) aim = false; //calculate the handle positions @@ -1030,7 +1028,6 @@ namespace Barotrauma bool usingController = character.SelectedConstruction != null && character.SelectedConstruction.GetComponent() != null; - float itemAngle; if (Anim != Animation.Climbing && !usingController && character.Stun <= 0.0f && aim && itemPos != Vector2.Zero) { @@ -1042,6 +1039,7 @@ namespace Barotrauma itemAngle = (torso.body.Rotation + holdAngle * Dir); + Holdable holdable = item.GetComponent(); if (holdable.ControlPose) { head.body.SmoothRotate(itemAngle); diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Holdable.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Holdable.cs index 73d99dedc..4c67bfcdf 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Holdable.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/Holdable.cs @@ -184,8 +184,8 @@ namespace Barotrauma.Items.Components item.SetTransform(rightHand.SimPosition, 0.0f); } - bool alreadySelected = character.HasSelectedItem(item); - if (picker.TrySelectItem(item)) + bool alreadySelected = character.HasEquippedItem(item); + if (picker.TrySelectItem(item) || picker.HasEquippedItem(item)) { item.body.Enabled = true; IsActive = true; @@ -308,7 +308,7 @@ namespace Barotrauma.Items.Components public override void Update(float deltaTime, Camera cam) { if (item.body == null || !item.body.Enabled) return; - if (picker == null || !picker.HasSelectedItem(item)) + if (picker == null || !picker.HasEquippedItem(item)) { IsActive = false; return; @@ -320,7 +320,37 @@ namespace Barotrauma.Items.Components item.Submarine = picker.Submarine; - picker.AnimController.HoldItem(deltaTime, item, handlePos, holdPos, aimPos, picker.IsKeyDown(InputType.Aim), holdAngle); + if (picker.HasSelectedItem(item)) + { + picker.AnimController.HoldItem(deltaTime, item, handlePos, holdPos, aimPos, picker.IsKeyDown(InputType.Aim), holdAngle); + } + else + { + Limb equipLimb = null; + if (picker.Inventory.IsInLimbSlot(item, InvSlotType.Face) || picker.Inventory.IsInLimbSlot(item, InvSlotType.Head)) + { + equipLimb = picker.AnimController.GetLimb(LimbType.Head); + } + else if (picker.Inventory.IsInLimbSlot(item, InvSlotType.Torso)) + { + equipLimb = picker.AnimController.GetLimb(LimbType.Torso); + } + else if (picker.Inventory.IsInLimbSlot(item, InvSlotType.Legs)) + { + equipLimb = picker.AnimController.GetLimb(LimbType.Waist); + } + + if (equipLimb != null) + { + float itemAngle = (equipLimb.Rotation + holdAngle * picker.AnimController.Dir); + + Matrix itemTransfrom = Matrix.CreateRotationZ(equipLimb.Rotation); + Vector2 transformedHandlePos = Vector2.Transform(handlePos[0], itemTransfrom); + + item.body.ResetDynamics(); + item.SetTransform(equipLimb.SimPosition - transformedHandlePos, itemAngle); + } + } } protected void Flip(Item item)