From aa2dbab57913d6af7f4e8a4f263db2c9bb6f7e95 Mon Sep 17 00:00:00 2001 From: Regalis Date: Sat, 13 Aug 2016 18:33:42 +0300 Subject: [PATCH] PickItem networkevents include whether the item was selected instead of toggling selected/deselected, items can be picked when inside their trigger even if the position of the item isn't visible (i.e. ladders in Nehalennia can be climbed again) --- Subsurface/Source/Characters/Character.cs | 8 +++++- Subsurface/Source/Items/Item.cs | 31 +++++++++-------------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 5fbd13970..f5f893224 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -1479,6 +1479,10 @@ namespace Barotrauma message.Write((ushort)pickData[0]); message.Write((int)pickData[1] == 1); message.Write((int)pickData[2] == 1); + + var pickedItem = Entity.FindEntityByID((ushort)pickData[0]); + message.Write(pickedItem != null && selectedConstruction == pickedItem); + message.WritePadBits(); return true; @@ -1613,6 +1617,8 @@ namespace Barotrauma bool pickHit = message.ReadBoolean(); bool actionHit = message.ReadBoolean(); + bool isSelected = message.ReadBoolean(); + data = new int[] { (int)itemId, pickHit ? 1 : 0, actionHit ? 1: 0 }; System.Diagnostics.Debug.WriteLine("item id: "+itemId); @@ -1629,7 +1635,7 @@ namespace Barotrauma GameServer.Log(Name + " selected " + pickedItem.Name, Color.Orange); } pickedItem.Pick(this, false, pickHit, actionHit); - + selectedConstruction = isSelected ? pickedItem : null; } return; diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index a427cbac5..336f99082 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -1178,22 +1178,20 @@ namespace Barotrauma float pickDist = Vector2.Distance(item.WorldPosition, displayPickPos); - bool outsideTrigger = false; + bool insideTrigger = false; foreach (Rectangle trigger in item.prefab.Triggers) { Rectangle transformedTrigger = item.TransformTrigger(trigger, true); - if (!Submarine.RectContains(transformedTrigger, displayPos)) - { - outsideTrigger = true; - continue; - } + if (!Submarine.RectContains(transformedTrigger, displayPos)) continue; + + insideTrigger = true; Vector2 triggerCenter = new Vector2(transformedTrigger.Center.X, transformedTrigger.Y - transformedTrigger.Height / 2); pickDist = Math.Min(Math.Abs(triggerCenter.X - displayPickPos.X), Math.Abs(triggerCenter.Y - displayPickPos.Y)); } - if (outsideTrigger) continue; + if (!insideTrigger && item.prefab.Triggers.Any()) continue; if (pickDist > item.PickDistance && item.PickDistance > 0.0f) continue; @@ -1204,7 +1202,7 @@ namespace Barotrauma { if (item.PickDistance > 0.0f && Vector2.Distance(displayPos, item.WorldPosition) > item.prefab.PickDistance) continue; - if (!item.prefab.PickThroughWalls) + if (!item.prefab.PickThroughWalls && Screen.Selected != GameMain.EditMapScreen && !insideTrigger) { Body body = Submarine.CheckVisibility(item.Submarine == null ? position : position - item.Submarine.SimPosition, item.SimPosition, true); if (body != null && body.UserData as Item != item) continue; @@ -1301,19 +1299,14 @@ namespace Barotrauma System.Diagnostics.Debug.WriteLine("Item.Pick(" + picker + ", " + forceSelectKey + ")"); - if (selected) + if (picker.SelectedConstruction == this) { - if (picker.SelectedConstruction == this) - { - picker.SelectedConstruction = null; - } - else - { - picker.SelectedConstruction = this; - } + if (picker.IsKeyHit(InputType.Select) || forceSelectKey) picker.SelectedConstruction = null; + } + else if (selected) + { + picker.SelectedConstruction = this; } - - if (!hasRequiredSkills && Character.Controlled==picker && Screen.Selected != GameMain.EditMapScreen) {