From cd8c92780036ac4031dd176bc2692975554c7dea Mon Sep 17 00:00:00 2001 From: juanjp600 Date: Sun, 6 Nov 2016 18:15:13 -0300 Subject: [PATCH] Sync InputType.Select --- Subsurface/Source/Characters/Character.cs | 132 +++++++++++++++++++--- 1 file changed, 118 insertions(+), 14 deletions(-) diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index c18eff385..c229090cf 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -26,14 +26,16 @@ namespace Barotrauma get { return netStateID; } } - byte dequeuedInput = 0; byte prevDequeuedInput = 0; - int isStillCountdown = 5; - List memInput = new List(); - List memMousePos = new List(); + private byte dequeuedInput = 0; + private byte prevDequeuedInput = 0; + + private int isStillCountdown = 5; + private List memInput = new List(); + private List memMousePos = new List(); - List memPos = new List(); + private List memPos = new List(); - List memLocalPos = new List(); + private List memLocalPos = new List(); //the Character that the player is currently controlling @@ -673,10 +675,13 @@ namespace Barotrauma //break; case InputType.Down: return ((dequeuedInput & 0x8) > 0) && !((prevDequeuedInput & 0x8) > 0); - //break; + //break; case InputType.Run: return ((dequeuedInput & 0x20) > 0) && !((prevDequeuedInput & 0x20) > 0); - //break; + //break; + case InputType.Select: + return ((dequeuedInput & 0x40) > 0) && !((prevDequeuedInput & 0x40) > 0); + //break; default: return false; //break; @@ -708,6 +713,9 @@ namespace Barotrauma case InputType.Run: retVal = (dequeuedInput & 0x20) > 0; break; + case InputType.Select: + retVal = (dequeuedInput & 0x40) > 0; + break; } return retVal; } @@ -719,7 +727,6 @@ namespace Barotrauma { keys[(int)inputType].Hit = hit; keys[(int)inputType].Held = held; - } public void ClearInput(InputType inputType) @@ -1280,7 +1287,9 @@ namespace Barotrauma AnimController.Frozen = false; prevDequeuedInput = dequeuedInput; dequeuedInput = memInput[memInput.Count - 1]; + cursorPosition = memMousePos[memMousePos.Count - 1]; memInput.RemoveAt(memInput.Count - 1); + memMousePos.RemoveAt(memMousePos.Count - 1); if (dequeuedInput == 0) { if (isStillCountdown<=0) @@ -1290,6 +1299,7 @@ namespace Barotrauma //remove inputs where the player is not moving at all //helps the server catch up, shouldn't affect final position memInput.RemoveAt(memInput.Count - 1); + memMousePos.RemoveAt(memMousePos.Count - 1); } isStillCountdown = 15; } @@ -1324,11 +1334,14 @@ namespace Barotrauma newInput |= IsKeyDown(InputType.Down) ? (byte)0x8 : (byte)0; newInput |= (AnimController.TargetDir == Direction.Left) ? (byte)0x10 : (byte)0; newInput |= IsKeyDown(InputType.Run) ? (byte)0x20 : (byte)0; - memInput.Insert(0,newInput); + newInput |= IsKeyHit(InputType.Select) ? (byte)0x40 : (byte)0; + memInput.Insert(0, newInput); + memMousePos.Insert(0, closestItem!=null ? closestItem.Position : cursorPosition); LastNetworkUpdateID++; - while (memInput.Count>60) + if (memInput.Count > 60) { - memInput.RemoveAt(memInput.Count - 1); + memInput.RemoveRange(60, memInput.Count - 60); + memMousePos.RemoveRange(60, memMousePos.Count - 60); } } } @@ -1404,6 +1417,75 @@ namespace Barotrauma Control(deltaTime, cam); } + if (controlled != this && !(this is AICharacter)) + { + Vector2 mouseSimPos = ConvertUnits.ToSimUnits(cursorPosition); + + if (!LockHands) + { + //find the closest item if selectkey has been hit, or if the Character is being + //controlled by the player (in order to highlight it) + + if (findClosestTimer <= 0.0f || IsKeyHit(InputType.Select)) + { + closestCharacter = FindClosestCharacter(mouseSimPos); + if (closestCharacter != null && closestCharacter.info == null) + { + closestCharacter = null; + } + + float closestItemDist = 0.0f; + closestItem = FindClosestItem(mouseSimPos, out closestItemDist); + + if (closestCharacter != null && closestItem != null) + { + if (Vector2.Distance(closestCharacter.SimPosition, mouseSimPos) < ConvertUnits.ToSimUnits(closestItemDist)) + { + if (selectedConstruction != closestItem) closestItem = null; + } + else + { + closestCharacter = null; + } + } + + findClosestTimer = 0.1f; + } + else + { + findClosestTimer -= deltaTime; + } + + if (selectedCharacter == null && closestItem != null) + { + closestItem.IsHighlighted = true; + if (!LockHands && closestItem.Pick(this)) + { + + } + } + + if (IsKeyHit(InputType.Select)) + { + if (selectedCharacter != null) + { + DeselectCharacter(); + } + else if (closestCharacter != null && closestCharacter.IsHumanoid && closestCharacter.CanBeSelected) + { + SelectCharacter(closestCharacter); + } + } + } + else + { + if (selectedCharacter != null) DeselectCharacter(); + selectedConstruction = null; + closestItem = null; + closestCharacter = null; + } + } + if (selectedCharacter != null && AnimController.Anim == AnimController.Animation.CPR) { if (GameMain.Client == null) selectedCharacter.Oxygen += (GetSkillLevel("Medical") / 10.0f) * deltaTime; @@ -1516,6 +1598,14 @@ namespace Barotrauma GUI.DrawLine(spriteBatch, remoteVec, localVec, Color.Yellow,0,10); } + Vector2 mouseDrawPos = CursorWorldPosition; + mouseDrawPos.Y = -mouseDrawPos.Y; + GUI.DrawLine(spriteBatch, mouseDrawPos - new Vector2(0, 5), mouseDrawPos + new Vector2(0, 5), Color.Red, 0, 10); + + Vector2 closestItemPos = closestItem != null ? closestItem.DrawPosition : Vector2.Zero; + closestItemPos.Y = -closestItemPos.Y; + GUI.DrawLine(spriteBatch, closestItemPos - new Vector2(0, 5), closestItemPos + new Vector2(0, 5), Color.Lime, 0, 10); + if (this == controlled) return; Vector2 pos = DrawPosition; @@ -1826,9 +1916,10 @@ namespace Barotrauma msg.Write((byte)ClientNetObject.CHARACTER_INPUT); - while (memInput.Count > 60) + if (memInput.Count > 60) { - memInput.RemoveAt(memInput.Count - 1); + memInput.RemoveRange(60,memInput.Count - 60); + memMousePos.RemoveRange(60,memMousePos.Count - 60); } msg.Write(LastNetworkUpdateID); @@ -1837,6 +1928,11 @@ namespace Barotrauma for (int i = 0; i < inputCount; i++) { msg.Write(memInput[i]); + if ((memInput[i] & 0x40) > 0) + { + msg.Write(memMousePos[i].X); + msg.Write(memMousePos[i].Y); + } } } public virtual void ServerRead(NetIncomingMessage msg, Client c) @@ -1849,9 +1945,16 @@ namespace Barotrauma for (int i = 0; i < inputCount; i++) { byte newInput = msg.ReadByte(); + Vector2 newMousePos = Position; + if ((newInput & 0x40) > 0) + { + newMousePos.X = msg.ReadSingle(); + newMousePos.Y = msg.ReadSingle(); + } if ((i < ((long)networkUpdateID - (long)LastNetworkUpdateID)) && (i < 60)) { memInput.Insert(i, newInput); + memMousePos.Insert(i, newMousePos); } } @@ -1864,6 +1967,7 @@ namespace Barotrauma //deleting inputs from the queue here means the server is way behind and data needs to be dropped //we'll make the server drop down to 30 inputs for good measure memInput.RemoveRange(30, memInput.Count - 30); + memMousePos.RemoveRange(30, memMousePos.Count - 30); } }