From 4ad8105cd6884261653606b02573f7e9d97687f6 Mon Sep 17 00:00:00 2001 From: Regalis Date: Wed, 17 Feb 2016 20:43:42 +0200 Subject: [PATCH] Characters with no CharacterInfo can't be selected, fixed broken tickboxes in server settings, inventory log tweaking, one gap sound per hull, chat message "commands" changed from /d to d; --- Subsurface/Properties/AssemblyInfo.cs | 4 +- Subsurface/Source/Characters/Character.cs | 23 +++---- Subsurface/Source/GUI/GUITickBox.cs | 2 +- Subsurface/Source/Items/CharacterInventory.cs | 47 ++++++++++++--- .../Items/Components/Holdable/Holdable.cs | 11 +++- .../Components/Signal/ConnectionPanel.cs | 4 +- Subsurface/Source/Items/Inventory.cs | 24 +++++++- Subsurface/Source/Items/Item.cs | 2 +- Subsurface/Source/Map/FireSource.cs | 4 +- Subsurface/Source/Map/Gap.cs | 34 +++++------ Subsurface/Source/Map/Hull.cs | 57 ++++++++++++++---- Subsurface/Source/Map/SubmarineBody.cs | 2 +- Subsurface/Source/Networking/GameServer.cs | 50 +++++++++++---- Subsurface/Source/Networking/NetworkMember.cs | 18 ++++++ Subsurface/Source/Particles/Particle.cs | 4 +- Subsurface_Solution.v12.suo | Bin 926720 -> 930304 bytes 16 files changed, 216 insertions(+), 70 deletions(-) diff --git a/Subsurface/Properties/AssemblyInfo.cs b/Subsurface/Properties/AssemblyInfo.cs index cfc80a621..f40f11617 100644 --- a/Subsurface/Properties/AssemblyInfo.cs +++ b/Subsurface/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.3.2.3")] -[assembly: AssemblyFileVersion("0.3.2.3")] +[assembly: AssemblyVersion("0.3.2.4")] +[assembly: AssemblyFileVersion("0.3.2.4")] diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index a0625b26b..fe7364af3 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -653,6 +653,16 @@ namespace Barotrauma if (IsKeyDown(InputType.Use)) selectedConstruction.Use(deltaTime, this); if (selectedConstruction != null && IsKeyDown(InputType.Aim)) selectedConstruction.SecondaryUse(deltaTime, this); } + + if (selectedCharacter!=null) + { + if (Vector2.Distance(selectedCharacter.SimPosition, SimPosition) > 3.0f || + (!selectedCharacter.isDead && selectedCharacter.Stun <= 0.0f)) + { + DeselectCharacter(); + } + } + if (IsNetworkPlayer) { @@ -828,10 +838,9 @@ namespace Barotrauma if (findClosestTimer <= 0.0f || Screen.Selected == GameMain.EditMapScreen) { closestCharacter = FindClosestCharacter(mouseSimPos); - if (closestCharacter != null) + if (closestCharacter != null && closestCharacter.info==null) { - // if (closestCharacter != selectedCharacter) selectedCharacter = null; - if (!closestCharacter.IsHumanoid) closestCharacter = null; + closestCharacter = null; } closestItem = FindClosestItem(mouseSimPos); @@ -872,14 +881,6 @@ namespace Barotrauma } } } - else - { - if (Vector2.Distance(selectedCharacter.SimPosition, SimPosition) > 2.0f || - (!selectedCharacter.isDead && selectedCharacter.Stun <= 0.0f)) - { - DeselectCharacter(); - } - } if (IsKeyHit(InputType.Select)) { diff --git a/Subsurface/Source/GUI/GUITickBox.cs b/Subsurface/Source/GUI/GUITickBox.cs index 207b29999..d78c90f1a 100644 --- a/Subsurface/Source/GUI/GUITickBox.cs +++ b/Subsurface/Source/GUI/GUITickBox.cs @@ -50,7 +50,7 @@ namespace Barotrauma box.HoverColor = Color.Gray; box.SelectedColor = Color.DarkGray; - text = new GUITextBlock(new Rectangle(rect.X + 30, rect.Y+2, 200, rect.Height), label, Color.Transparent, Color.White, Alignment.TopLeft, null, this); + text = new GUITextBlock(new Rectangle(rect.X + 30, rect.Y+2, 20, rect.Height), label, Color.Transparent, Color.White, Alignment.TopLeft, null, this); this.rect = new Rectangle(box.Rect.X, box.Rect.Y, 240, rect.Height); diff --git a/Subsurface/Source/Items/CharacterInventory.cs b/Subsurface/Source/Items/CharacterInventory.cs index e5e20815c..c1ab7820a 100644 --- a/Subsurface/Source/Items/CharacterInventory.cs +++ b/Subsurface/Source/Items/CharacterInventory.cs @@ -100,8 +100,6 @@ namespace Barotrauma /// public override bool TryPutItem(Item item, List allowedSlots, bool createNetworkEvent = true) { - bool alreadyInInventory = Array.Find(Items, i => i == item)!=null; - //try to place the item in LimBlot.Any slot if that's allowed if (allowedSlots.Contains(LimbSlot.Any)) { @@ -109,7 +107,6 @@ namespace Barotrauma { if (Items[i] != null || limbSlots[i] != LimbSlot.Any) continue; - GameServer.Log(character.Name + " picked up " + item.Name, Color.Orange); PutItem(item, i, createNetworkEvent); item.Unequip(character); return true; @@ -144,7 +141,6 @@ namespace Barotrauma if (placed) { - if (!alreadyInInventory) GameServer.Log(character.Name + " picked up " + item.Name, Color.Orange); return true; } } @@ -367,29 +363,66 @@ namespace Barotrauma return true; } - public override void ReadNetworkData(NetworkEventType type, NetBuffer message, float sendingTime) + public override void ReadNetworkData(NetworkEventType type, NetIncomingMessage message, float sendingTime) { if (sendingTime < lastUpdate) return; character.ClearInput(InputType.Use); + List droppedItems = new List(); + List prevItems = new List(Items); + for (int i = 0; i c.Connection == message.SenderConnection); + if (sender != null && sender.Character != null) + { + foreach (Item item in droppedItems) + { + GameServer.Log(sender.Character == character ? + character.Name + " dropped " + item.Name : + sender.Character + " removed " + item.Name+" from "+character+"'s inventory", Color.Orange); + } + + foreach (Item item in Items) + { + if (item == null || prevItems.Contains(item)) continue; + GameServer.Log(sender.Character == character ? + character.Name + " picked up " + item.Name : + sender.Character + " placed " + item.Name + " in " + character + "'s inventory", Color.Orange); + } + } + + lastUpdate = sendingTime; } diff --git a/Subsurface/Source/Items/Components/Holdable/Holdable.cs b/Subsurface/Source/Items/Components/Holdable/Holdable.cs index d76b560b5..655c2a2d6 100644 --- a/Subsurface/Source/Items/Components/Holdable/Holdable.cs +++ b/Subsurface/Source/Items/Components/Holdable/Holdable.cs @@ -316,7 +316,16 @@ namespace Barotrauma.Items.Components } item.SetTransform(newPos, 0.0f); - if (!attached) Use(1.0f); + if (!attached) + { + Use(1.0f); + + var sender = GameMain.Server.ConnectedClients.Find(c => c.Connection == message.SenderConnection); + if (sender != null && sender.Character != null) + { + Networking.GameServer.Log(sender.characterInfo.Name+" attached a "+item.Name+" on a wall", Color.Orange); + } + } } } } diff --git a/Subsurface/Source/Items/Components/Signal/ConnectionPanel.cs b/Subsurface/Source/Items/Components/Signal/ConnectionPanel.cs index b22bfa69c..5e675e31f 100644 --- a/Subsurface/Source/Items/Components/Signal/ConnectionPanel.cs +++ b/Subsurface/Source/Items/Components/Signal/ConnectionPanel.cs @@ -172,7 +172,9 @@ namespace Barotrauma.Items.Components wireComponent.Connect(c, false); var otherConnection = c.Wires[i].OtherConnection(c); - Networking.GameServer.Log(c.Name + " -> " + (otherConnection == null ? "none" : otherConnection.Name), Color.Orange); + Networking.GameServer.Log( + item.Name+" ("+ c.Name + ") -> " + + otherConnection.Item.Name+" ("+(otherConnection == null ? "none" : otherConnection.Name)+")", Color.Orange); } c.UpdateRecipients(); } diff --git a/Subsurface/Source/Items/Inventory.cs b/Subsurface/Source/Items/Inventory.cs index e3dd3010a..468140ac4 100644 --- a/Subsurface/Source/Items/Inventory.cs +++ b/Subsurface/Source/Items/Inventory.cs @@ -361,11 +361,13 @@ namespace Barotrauma return true; } - public virtual void ReadNetworkData(NetworkEventType type, NetBuffer message, float sendingTime) + public virtual void ReadNetworkData(NetworkEventType type, NetIncomingMessage message, float sendingTime) { if (sendingTime < lastUpdate) return; List newItemIDs = new List(); + List droppedItems = new List(); + List prevItems = new List(Items); byte count = message.ReadByte(); for (int i = 0; i c.Connection == message.SenderConnection); + if (sender != null && sender.Character != null) + { + foreach (Item item in droppedItems) + { + GameServer.Log(sender.Character + " removed " + item.Name + " from " + Owner.ToString(), Color.Orange); + } + + foreach (Item item in Items) + { + if (item == null || prevItems.Contains(item)) continue; + GameServer.Log(sender.Character + " placed " + item.Name + " in " + Owner.ToString(), Color.Orange); + } + } + + lastUpdate = sendingTime; } } diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index e945e4a25..ac9d4ea0f 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -1125,7 +1125,7 @@ namespace Barotrauma // new NetworkEvent(NetworkEventType.DropItem, ID, true); - if (dropper != null) GameServer.Log(dropper.Name + " dropped " + Name, Color.Orange); + //if (dropper != null) GameServer.Log(dropper.Name + " dropped " + Name, Color.Orange); foreach (ItemComponent ic in components) ic.Drop(dropper); diff --git a/Subsurface/Source/Map/FireSource.cs b/Subsurface/Source/Map/FireSource.cs index 0e66c5f2f..4800ab0d5 100644 --- a/Subsurface/Source/Map/FireSource.cs +++ b/Subsurface/Source/Map/FireSource.cs @@ -145,13 +145,13 @@ namespace Barotrauma if (fireSoundBasic != null) { basicSoundIndex = fireSoundBasic.Loop(basicSoundIndex, - Math.Min(size.X / 100.0f, 1.0f), position + size / 2.0f, 2000.0f); + Math.Min(size.X / 100.0f, 1.0f), position + size / 2.0f, 1000.0f); } if (fireSoundLarge != null) { largeSoundIndex = fireSoundLarge.Loop(largeSoundIndex, - MathHelper.Clamp((size.X - 200.0f) / 100.0f, 0.0f, 1.0f), position + size / 2.0f, 2000.0f); + MathHelper.Clamp((size.X - 200.0f) / 100.0f, 0.0f, 1.0f), position + size / 2.0f, 1000.0f); } if (size.X>50.0f) diff --git a/Subsurface/Source/Map/Gap.cs b/Subsurface/Source/Map/Gap.cs index 210a25cb7..c082f435d 100644 --- a/Subsurface/Source/Map/Gap.cs +++ b/Subsurface/Source/Map/Gap.cs @@ -30,9 +30,6 @@ namespace Barotrauma float higherSurface; float lowerSurface; - private int soundIndex; - - float soundVolume; public float Open { @@ -42,10 +39,10 @@ namespace Barotrauma public Door ConnectedDoor; - public Vector2 FlowForce - { - get { return flowForce*soundVolume; } - } + //public Vector2 FlowForce + //{ + // get { return flowForce*soundVolume; } + //} public Vector2 LerpedFlowForce { @@ -144,8 +141,12 @@ namespace Barotrauma hulls[1] = temp; } - linkedTo.Add(hulls[0]); - if (hulls[1] != null) linkedTo.Add(hulls[1]); + for (int i = 0 ; i <2; i++) + { + if (hulls[i]==null) continue; + linkedTo.Add(hulls[i]); + if (!hulls[i].ConnectedGaps.Contains(this)) hulls[i].ConnectedGaps.Add(this); + } } public override void Draw(SpriteBatch sb, bool editing, bool back = true) @@ -205,14 +206,6 @@ namespace Barotrauma public override void Update(Camera cam, float deltaTime) { - soundVolume = soundVolume + ((flowForce.Length() < 100.0f) ? -deltaTime * 0.5f : deltaTime * 0.5f); - soundVolume = MathHelper.Clamp(soundVolume, 0.0f, 1.0f); - - int index = (int)Math.Floor(flowForce.Length() / 100.0f); - index = Math.Min(index,2); - - soundIndex = SoundPlayer.flowSounds[index].Loop(soundIndex, soundVolume, WorldPosition, 2000.0f); - flowForce = Vector2.Zero; if (open == 0.0f) return; @@ -548,7 +541,12 @@ namespace Barotrauma GapList.Remove(this); - if (soundIndex > -1) Sounds.SoundManager.Stop(soundIndex); + foreach (MapEntity entity in linkedTo) + { + var hull = entity as Hull; + if (hull.ConnectedGaps.Contains(this)) hull.ConnectedGaps.Remove(this); + } + } diff --git a/Subsurface/Source/Map/Hull.cs b/Subsurface/Source/Map/Hull.cs index 5947c7ab6..21fa54a95 100644 --- a/Subsurface/Source/Map/Hull.cs +++ b/Subsurface/Source/Map/Hull.cs @@ -48,6 +48,9 @@ namespace Barotrauma private bool update; + private int soundIndex; + private float soundVolume; + float[] waveY; //displacement from the surface of the water float[] waveVel; //velocity of the point @@ -56,6 +59,8 @@ namespace Barotrauma float lastSentVolume; + public List ConnectedGaps; + public override string Name { get @@ -173,12 +178,15 @@ namespace Barotrauma hullList.Add(this); + ConnectedGaps = new List(); + Item.UpdateHulls(); Gap.UpdateHulls(); Volume = 0.0f; + InsertToList(); } @@ -262,9 +270,11 @@ namespace Barotrauma fireSource.Remove(); } + if (soundIndex > -1) Sounds.SoundManager.Stop(soundIndex); + //renderer.Dispose(); - if (entityGrid!=null) entityGrid.RemoveEntity(this); + if (entityGrid != null) entityGrid.RemoveEntity(this); hullList.Remove(this); } @@ -311,6 +321,31 @@ namespace Barotrauma } FireSource.UpdateAll(fireSources, deltaTime); + + float strongestFlow = 0.0f; + foreach (Gap gap in ConnectedGaps) + { + float gapFlow = gap.LerpedFlowForce.Length(); + if (gapFlow > strongestFlow) + { + strongestFlow = gapFlow; + } + } + + if (strongestFlow>0.1f) + { + soundVolume = soundVolume + ((strongestFlow < 100.0f) ? -deltaTime * 0.5f : deltaTime * 0.5f); + soundVolume = MathHelper.Clamp(soundVolume, 0.0f, 1.0f); + + int index = (int)Math.Floor(strongestFlow / 100.0f); + index = Math.Min(index, 2); + + soundIndex = SoundPlayer.flowSounds[index].Loop(soundIndex, soundVolume, WorldPosition, 2000.0f); + } + else + { + if (soundIndex > -1) Sounds.SoundManager.Stop(soundIndex); + } //update client hulls if the amount of water has changed by >10% if (Math.Abs(lastSentVolume - volume) > FullVolume * 0.1f) @@ -588,19 +623,19 @@ namespace Barotrauma return null; } - public List FindGaps() - { - List gaps = new List(); + //public List FindGaps() + //{ + // List gaps = new List(); - foreach (Gap gap in Gap.GapList) - { - if (gap.Open < 0.01f) continue; + // foreach (Gap gap in Gap.GapList) + // { + // if (gap.Open < 0.01f) continue; - if (gap.linkedTo.Contains(this)) gaps.Add(gap); - } + // if (gap.linkedTo.Contains(this)) gaps.Add(gap); + // } - return gaps; - } + // return gaps; + //} public override XElement Save(XDocument doc) { diff --git a/Subsurface/Source/Map/SubmarineBody.cs b/Subsurface/Source/Map/SubmarineBody.cs index 116675693..e08eae115 100644 --- a/Subsurface/Source/Map/SubmarineBody.cs +++ b/Subsurface/Source/Map/SubmarineBody.cs @@ -425,7 +425,7 @@ namespace Barotrauma if (newHull == null) return true; } - var gaps = newHull.FindGaps(); + var gaps = newHull.ConnectedGaps; targetPos = limb.character.WorldPosition; diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index 36dba58e9..cb15fecec 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -883,7 +883,7 @@ namespace Barotrauma.Networking GameMain.GameScreen.Select(); - AddChatMessage("Press TAB to chat. Use ''/d'' to talk to dead players and spectators, and ''/playername'' to only send the message to a specific player.", ChatMessageType.Server); + AddChatMessage("Press TAB to chat. Use ''d;'' to talk to dead players and spectators, and ''player name;'' to only send the message to a specific player.", ChatMessageType.Server); yield return CoroutineStatus.Success; } @@ -1272,33 +1272,61 @@ namespace Barotrauma.Networking public override void SendChatMessage(string message, ChatMessageType type = ChatMessageType.Server) { - string[] words = message.Split(' '); + List recipients = new List(); Client targetClient = null; - if (words.Length > 2 && words[1].FirstOrDefault()=='/' && type==ChatMessageType.Server) + if (type==ChatMessageType.Server) { - if (words[1] == "/dead" || words[1] == "/d") + string command = GetChatMessageCommand(message).ToLower(); + + if (command=="dead" || command=="d") { type = ChatMessageType.Dead; } - else + else if (command != "") { targetClient = ConnectedClients.Find(c => - words[1] == "/" + c.name.ToLower() || - c.Character != null && words[1] == "/" + c.Character.Name.ToLower()); + command == c.name.ToLower() || + c.Character != null && command == c.Character.Name.ToLower()); - if (targetClient==null) + if (targetClient == null) { - AddChatMessage("Player ''"+words[1].Replace("/", "")+"'' not found!", ChatMessageType.Admin); + AddChatMessage("Player ''" + command + "'' not found!", ChatMessageType.Admin); return; } } - - message = words[0] + " " + string.Join(" ", words, 2, words.Length - 2); } + //remove the ''name: '' part + //string[] words = message.Split(':'); + //string[] newMessage = ((string[])words.Skip(1)); + + + + //if (words.Length > 2 && words[1].FirstOrDefault()=='/' && type==ChatMessageType.Server) + //{ + // if (words[1] == "/dead" || words[1] == "/d") + // { + // type = ChatMessageType.Dead; + // } + // else + // { + // targetClient = ConnectedClients.Find(c => + // words[1] == "/" + c.name.ToLower() || + // c.Character != null && words[1] == "/" + c.Character.Name.ToLower()); + + // if (targetClient==null) + // { + // AddChatMessage("Player ''"+words[1].Replace("/", "")+"'' not found!", ChatMessageType.Admin); + // return; + // } + // } + + // message = words[0] + " " + string.Join(" ", words, 2, words.Length - 2); + //} + if (targetClient != null) { recipients.Add(targetClient); diff --git a/Subsurface/Source/Networking/NetworkMember.cs b/Subsurface/Source/Networking/NetworkMember.cs index cb1b2c633..911a0029a 100644 --- a/Subsurface/Source/Networking/NetworkMember.cs +++ b/Subsurface/Source/Networking/NetworkMember.cs @@ -214,6 +214,24 @@ namespace Barotrauma.Networking public virtual void SendChatMessage(string message, ChatMessageType type = ChatMessageType.Server) { } + protected string GetChatMessageCommand(string message) + { + int separatorIndex = message.IndexOf(";"); + if (separatorIndex == -1) return ""; + + int colonIndex = message.IndexOf(":"); + + string command = ""; + try + { + command = message.Substring(colonIndex + 2, separatorIndex - colonIndex - 2); + } + + catch { } + + return command; + } + public virtual void Update(float deltaTime) { if (gameStarted && Screen.Selected == GameMain.GameScreen) diff --git a/Subsurface/Source/Particles/Particle.cs b/Subsurface/Source/Particles/Particle.cs index 79714501d..df76d43c8 100644 --- a/Subsurface/Source/Particles/Particle.cs +++ b/Subsurface/Source/Particles/Particle.cs @@ -115,7 +115,7 @@ namespace Barotrauma.Particles if (prefab.DeleteOnCollision || prefab.CollidesWithWalls) { - hullGaps = currentHull==null ? new List() : currentHull.FindGaps(); + hullGaps = currentHull == null ? new List() : currentHull.ConnectedGaps; //hullLimits = new List(); //hullLimits = FindLimits(position); } @@ -209,7 +209,7 @@ namespace Barotrauma.Particles else { currentHull = Hull.FindHull(position); - hullGaps = currentHull == null ? new List() : currentHull.FindGaps(); + hullGaps = currentHull == null ? new List() : currentHull.ConnectedGaps; if (OnChangeHull != null) OnChangeHull(edgePos, currentHull); diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index a5a712233bc2e0a9b997239713b978dc4dae1eed..bca48bc5a451f60ed9f08f405c8027b92d36dabf 100644 GIT binary patch delta 13618 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