From deb09328e071fddb3f7a343664113bedae70a776 Mon Sep 17 00:00:00 2001 From: Regalis Date: Mon, 25 Jul 2016 18:33:44 +0300 Subject: [PATCH] Sending the ids of the hulls/gaps in between docking ports to make sure they match between clients, small optimizations to hull networkevents --- .../Source/Items/Components/DockingPort.cs | 38 +++++++- Subsurface/Source/Map/Hull.cs | 94 ++++++++++--------- 2 files changed, 85 insertions(+), 47 deletions(-) diff --git a/Subsurface/Source/Items/Components/DockingPort.cs b/Subsurface/Source/Items/Components/DockingPort.cs index be9f4522e..18310e991 100644 --- a/Subsurface/Source/Items/Components/DockingPort.cs +++ b/Subsurface/Source/Items/Components/DockingPort.cs @@ -31,10 +31,12 @@ namespace Barotrauma.Items.Components private Joint joint; private Hull[] hulls; + private ushort?[] hullIds; private Body[] bodies; private Gap gap; + private ushort? gapId; private bool docked; @@ -106,6 +108,8 @@ namespace Barotrauma.Items.Components IsActive = true; + hullIds = new ushort?[2]; + list.Add(this); } @@ -286,6 +290,8 @@ namespace Barotrauma.Items.Components hulls[i] = new Hull(MapEntityPrefab.list.Find(m => m.Name == "Hull"), hullRects[i], subs[i]); hulls[i].AddToGrid(subs[i]); + if (hullIds[i] != null) hulls[i].ID = (ushort)hullIds[i]; + //for (int j = 0; j < 2; j++) //{ // bodies[i + j * 2] = BodyFactory.CreateEdge(GameMain.World, @@ -295,6 +301,7 @@ namespace Barotrauma.Items.Components } gap = new Gap(new Rectangle(hullRects[0].X, hullRects[0].Y+2, hullRects[0].Width, 4), false, subs[0]); + if (gapId != null) gap.ID = (ushort)gapId; gap.linkedTo.Clear(); if (hulls[0].WorldRect.Y > hulls[1].WorldRect.Y) @@ -312,8 +319,12 @@ namespace Barotrauma.Items.Components item.linkedTo.Add(hulls[0]); item.linkedTo.Add(hulls[1]); - item.linkedTo.Add(gap); + hullIds[0] = hulls[0].ID; + hullIds[1] = hulls[1].ID; + gapId = gap.ID; + + item.linkedTo.Add(gap); foreach (Body body in bodies) { @@ -327,10 +338,12 @@ namespace Barotrauma.Items.Components } - private void Undock() + public void Undock() { if (dockingTarget == null || !docked) return; + item.NewComponentEvent(this, false, true); + PlaySound(ActionType.OnUse, item.WorldPosition); dockingTarget.item.Submarine.DockedTo.Remove(item.Submarine); @@ -379,6 +392,11 @@ namespace Barotrauma.Items.Components gap.Remove(); gap = null; } + + hullIds[0] = null; + hullIds[1] = null; + + gapId = null; if (bodies!=null) { @@ -437,6 +455,8 @@ namespace Barotrauma.Items.Components if (!item.linkedTo.Any(e => e is Hull) && !dockingTarget.item.linkedTo.Any(e => e is Hull)) { CreateHull(); + + item.NewComponentEvent(this, false, true); } } dockingState = MathHelper.Lerp(dockingState, 0.5f, deltaTime * 10.0f); @@ -491,7 +511,7 @@ namespace Barotrauma.Items.Components drawPos, new Rectangle( rect.X, rect.Y + rect.Height/2 + (int)(rect.Height / 2 * (1.0f - dockingState)), - rect.Width, (int)(rect.Height / 2 * dockingState)), Color.Red); + rect.Width, (int)(rect.Height / 2 * dockingState)), Color.White); } else @@ -555,8 +575,6 @@ namespace Barotrauma.Items.Components Docked = signal != "0"; break; } - - item.NewComponentEvent(this, false, true); } public override bool FillNetworkData(Networking.NetworkEventType type, Lidgren.Network.NetBuffer message) @@ -566,6 +584,10 @@ namespace Barotrauma.Items.Components if (docked) { message.Write(dockingTarget.item.ID); + message.Write((ushort)hullIds[0]); + message.Write((ushort)hullIds[1]); + + message.Write((ushort)gapId); } return true; @@ -593,7 +615,13 @@ namespace Barotrauma.Items.Components return; } + hullIds[0] = message.ReadUInt16(); + hullIds[1] = message.ReadUInt16(); + + gapId = message.ReadUInt16(); + Dock(dockingTarget); + } else { diff --git a/Subsurface/Source/Map/Hull.cs b/Subsurface/Source/Map/Hull.cs index 681b02dd6..37044b886 100644 --- a/Subsurface/Source/Map/Hull.cs +++ b/Subsurface/Source/Map/Hull.cs @@ -807,21 +807,24 @@ namespace Barotrauma message.WriteRangedSingle(MathHelper.Clamp(volume/FullVolume, 0.0f, 1.5f), 0.0f, 1.5f, 6); message.WriteRangedSingle(MathHelper.Clamp(OxygenPercentage, 0.0f, 100.0f), 0.0f, 100.0f, 8); - message.Write((byte)fireSources.Count, 4); - for (int i = 0; i < Math.Min(fireSources.Count, 16); i++) + message.Write(fireSources.Count > 0); + if (fireSources.Count > 0) { - var fireSource = fireSources[i]; + message.Write((byte)fireSources.Count); + for (int i = 0; i < Math.Min(fireSources.Count, 16); i++) + { + var fireSource = fireSources[i]; - Vector2 normalizedPos = new Vector2( - (fireSource.Position.X - rect.X) / rect.Width, - (fireSource.Position.Y - (rect.Y - rect.Height)) / rect.Height); - message.WriteRangedSingle(MathHelper.Clamp(normalizedPos.X, 0.0f, 1.0f), 0.0f, 1.0f, 4); - message.WriteRangedSingle(MathHelper.Clamp(normalizedPos.Y, 0.0f, 1.0f), 0.0f, 1.0f, 4); + Vector2 normalizedPos = new Vector2( + (fireSource.Position.X - rect.X) / rect.Width, + (fireSource.Position.Y - (rect.Y - rect.Height)) / rect.Height); + message.WriteRangedSingle(MathHelper.Clamp(normalizedPos.X, 0.0f, 1.0f), 0.0f, 1.0f, 4); + message.WriteRangedSingle(MathHelper.Clamp(normalizedPos.Y, 0.0f, 1.0f), 0.0f, 1.0f, 4); - message.WriteRangedSingle(MathHelper.Clamp(fireSource.Size.X / rect.Width, 0.0f, 1.0f), 0, 1.0f, 6); + message.WriteRangedSingle(MathHelper.Clamp(fireSource.Size.X / rect.Width, 0.0f, 1.0f), 0, 1.0f, 6); + } } - - + lastSentVolume = volume; lastSentOxygen = OxygenPercentage; @@ -854,45 +857,52 @@ namespace Barotrauma Volume = newVolume; OxygenPercentage = newOxygen; - int fireSourceCount = message.ReadByte(4); + bool hasFireSources = message.ReadBoolean(); + List newFireSources = new List(); - for (int i = 0; i < fireSourceCount; i++) + if (hasFireSources) { - Vector2 pos = Vector2.Zero; - float size = 0.0f; - pos.X = message.ReadRangedSingle(0.0f, 1.0f, 4); - pos.Y = message.ReadRangedSingle(0.0f, 1.0f, 4); - size = message.ReadRangedSingle(0.0f, 1.0f, 6); - if (!MathUtils.IsValid(pos)) continue; - - pos.X = MathHelper.Clamp(pos.X, 0.05f, 0.95f); - pos.Y = MathHelper.Clamp(pos.Y, 0.05f, 0.95f); - - pos = new Vector2(rect.X + rect.Width * pos.X, rect.Y - rect.Height + (rect.Height * pos.Y)); - - var existingFire = fireSources.Find(fs => fs.Contains(pos)); - if (existingFire!=null) + int fireSourceCount = message.ReadByte(); + for (int i = 0; i < fireSourceCount; i++) { - newFireSources.Add(existingFire); - existingFire.Position = pos; - existingFire.Size = new Vector2( - existingFire.Hull == null ? size : size*existingFire.Hull.rect.Width, - existingFire.Size.Y); - } - else - { - var newFire = new FireSource(pos + Submarine.Position, this, true); - newFire.Size = new Vector2( - newFire.Hull == null ? size : size * newFire.Hull.rect.Width, - newFire.Size.Y); + Vector2 pos = Vector2.Zero; + float size = 0.0f; + pos.X = message.ReadRangedSingle(0.0f, 1.0f, 4); + pos.Y = message.ReadRangedSingle(0.0f, 1.0f, 4); + size = message.ReadRangedSingle(0.0f, 1.0f, 6); + if (!MathUtils.IsValid(pos)) continue; - //ignore if the fire wasn't added to this room (invalid position)? - if (!fireSources.Contains(newFire)) continue; - newFireSources.Add(newFire); + pos.X = MathHelper.Clamp(pos.X, 0.05f, 0.95f); + pos.Y = MathHelper.Clamp(pos.Y, 0.05f, 0.95f); + + pos = new Vector2(rect.X + rect.Width * pos.X, rect.Y - rect.Height + (rect.Height * pos.Y)); + + var existingFire = fireSources.Find(fs => fs.Contains(pos)); + if (existingFire!=null) + { + newFireSources.Add(existingFire); + existingFire.Position = pos; + existingFire.Size = new Vector2( + existingFire.Hull == null ? size : size*existingFire.Hull.rect.Width, + existingFire.Size.Y); + } + else + { + var newFire = new FireSource(pos + Submarine.Position, this, true); + newFire.Size = new Vector2( + newFire.Hull == null ? size : size * newFire.Hull.rect.Width, + newFire.Size.Y); + + //ignore if the fire wasn't added to this room (invalid position)? + if (!fireSources.Contains(newFire)) continue; + newFireSources.Add(newFire); + } } } + + var toBeRemoved = fireSources.FindAll(fs => !newFireSources.Contains(fs)); for (int i = toBeRemoved.Count - 1; i >= 0; i--) {