From cf77a59c97849376ef3555fb1422d923a89a9e94 Mon Sep 17 00:00:00 2001 From: Regalis Date: Fri, 2 Sep 2016 17:59:08 +0300 Subject: [PATCH] Implemented some of the itemcomponent read/write methods, made submarines server serializable --- .../Source/Items/Components/DockingPort.cs | 57 ++++++++++++ Subsurface/Source/Items/Components/Door.cs | 12 +++ .../Source/Items/Components/Machines/Pump.cs | 26 ++++++ .../Source/Items/Components/Machines/Radar.cs | 24 ++++- .../Items/Components/Machines/Reactor.cs | 40 +++++++++ .../Items/Components/Machines/Steering.cs | 88 ++++++++++++++++++- .../Items/Components/Power/PowerContainer.cs | 34 ++++++- .../Source/Items/Components/Signal/Wire.cs | 24 +++++ Subsurface/Source/Map/Submarine.cs | 29 +++++- Subsurface/Source/Map/SubmarineBody.cs | 2 - 10 files changed, 323 insertions(+), 13 deletions(-) diff --git a/Subsurface/Source/Items/Components/DockingPort.cs b/Subsurface/Source/Items/Components/DockingPort.cs index 82ed1bafa..493c100fd 100644 --- a/Subsurface/Source/Items/Components/DockingPort.cs +++ b/Subsurface/Source/Items/Components/DockingPort.cs @@ -651,6 +651,63 @@ namespace Barotrauma.Items.Components break; } } + + public override void ServerWrite(Lidgren.Network.NetOutgoingMessage msg) + { + msg.Write(docked); + + if (docked) + { + msg.Write(dockingTarget.item.ID); + + msg.Write((ushort)hullIds[0]); + msg.Write((ushort)hullIds[1]); + msg.Write((ushort)gapId); + } + } + + public override void ClientRead(Lidgren.Network.NetIncomingMessage msg) + { + bool isDocked = msg.ReadBoolean(); + + if (isDocked) + { + ushort dockingTargetID = msg.ReadUInt16(); + + hullIds[0] = msg.ReadUInt16(); + hullIds[1] = msg.ReadUInt16(); + gapId = msg.ReadUInt16(); + + Entity targetEntity = Entity.FindEntityByID(dockingTargetID); + if (targetEntity == null || !(targetEntity is Item)) + { + DebugConsole.ThrowError("Invalid docking port network event (can't dock to " + targetEntity.ToString() + ")"); + return; + } + + dockingTarget = (targetEntity as Item).GetComponent(); + if (dockingTarget == null) + { + DebugConsole.ThrowError("Invalid docking port network event (" + targetEntity + " doesn't have a docking port component)"); + return; + } + + if (hulls != null) + { + if (hulls[0] != null) hulls[0].ID = (ushort)hullIds[0]; + if (hulls[1] != null) hulls[1].ID = (ushort)hullIds[1]; + } + + if (gap != null) gap.ID = (ushort)gapId; + + Dock(dockingTarget); + + } + else + { + Undock(); + } + } } } diff --git a/Subsurface/Source/Items/Components/Door.cs b/Subsurface/Source/Items/Components/Door.cs index 7b4dc4650..e2310cb23 100644 --- a/Subsurface/Source/Items/Components/Door.cs +++ b/Subsurface/Source/Items/Components/Door.cs @@ -476,6 +476,18 @@ namespace Barotrauma.Items.Components item.NewComponentEvent(this, false, true); } } + + public override void ServerWrite(Lidgren.Network.NetOutgoingMessage msg) + { + msg.Write(isOpen); + msg.WriteRangedSingle(stuck, 0.0f, 100.0f, 8); + } + + public override void ClientRead(Lidgren.Network.NetIncomingMessage msg) + { + SetState(msg.ReadBoolean(), true); + Stuck = msg.ReadRangedSingle(0.0f, 100.0f, 8); + } } } diff --git a/Subsurface/Source/Items/Components/Machines/Pump.cs b/Subsurface/Source/Items/Components/Machines/Pump.cs index ee3dd8695..35d6b157d 100644 --- a/Subsurface/Source/Items/Components/Machines/Pump.cs +++ b/Subsurface/Source/Items/Components/Machines/Pump.cs @@ -194,6 +194,32 @@ namespace Barotrauma.Items.Components if (!IsActive) currPowerConsumption = 0.0f; } + + public override void ClientWrite(Lidgren.Network.NetOutgoingMessage msg) + { + //flowpercentage can only be adjusted at 10% intervals -> no need for more accuracy than this + msg.WriteRangedInteger(-10, 10, (int)(flowPercentage / 10.0f)); + msg.Write(IsActive); + } + + public override void ServerRead(Lidgren.Network.NetIncomingMessage msg) + { + FlowPercentage = msg.ReadRangedInteger(-10, 10) * 10.0f; + IsActive = msg.ReadBoolean(); + } + + public override void ServerWrite(Lidgren.Network.NetOutgoingMessage msg) + { + //flowpercentage can only be adjusted at 10% intervals -> no need for more accuracy than this + msg.WriteRangedInteger(-10, 10, (int)(flowPercentage / 10.0f)); + msg.Write(IsActive); + } + + public override void ClientRead(Lidgren.Network.NetIncomingMessage msg) + { + FlowPercentage = msg.ReadRangedInteger(-10, 10) * 10.0f; + IsActive = msg.ReadBoolean(); + } } } diff --git a/Subsurface/Source/Items/Components/Machines/Radar.cs b/Subsurface/Source/Items/Components/Machines/Radar.cs index 7fc737e65..bf0e64f91 100644 --- a/Subsurface/Source/Items/Components/Machines/Radar.cs +++ b/Subsurface/Source/Items/Components/Machines/Radar.cs @@ -403,9 +403,29 @@ namespace Barotrauma.Items.Components { if (pingCircle!=null) pingCircle.Remove(); if (screenOverlay != null) screenOverlay.Remove(); - } - + + public override void ClientWrite(Lidgren.Network.NetOutgoingMessage msg) + { + msg.Write(IsActive); + } + + public override void ServerRead(Lidgren.Network.NetIncomingMessage msg) + { + IsActive = msg.ReadBoolean(); + isActiveTickBox.Selected = IsActive; + } + + public override void ServerWrite(Lidgren.Network.NetOutgoingMessage msg) + { + msg.Write(IsActive); + } + + public override void ClientRead(Lidgren.Network.NetIncomingMessage msg) + { + IsActive = msg.ReadBoolean(); + isActiveTickBox.Selected = IsActive; + } } class RadarBlip diff --git a/Subsurface/Source/Items/Components/Machines/Reactor.cs b/Subsurface/Source/Items/Components/Machines/Reactor.cs index 88d9e6e3b..d38964084 100644 --- a/Subsurface/Source/Items/Components/Machines/Reactor.cs +++ b/Subsurface/Source/Items/Components/Machines/Reactor.cs @@ -535,6 +535,46 @@ namespace Barotrauma.Items.Components break; } } + + public override void ClientWrite(NetOutgoingMessage msg) + { + msg.Write(autoTemp); + msg.WriteRangedSingle(shutDownTemp, 0.0f, 10000.0f, 8); + + msg.WriteRangedSingle(coolingRate, 0.0f, 100.0f, 8); + msg.WriteRangedSingle(fissionRate, 0.0f, 100.0f, 8); + } + + public override void ServerRead(NetIncomingMessage msg) + { + autoTemp = msg.ReadBoolean(); + ShutDownTemp = msg.ReadRangedSingle(0.0f, 10000.0f, 8); + + CoolingRate = msg.ReadRangedSingle(0.0f, 100.0f, 8); + FissionRate = msg.ReadRangedSingle(0.0f, 100.0f, 8); + } + + public override void ServerWrite(NetOutgoingMessage msg) + { + msg.WriteRangedSingle(temperature, 0.0f, 10000.0f, 16); + + msg.Write(autoTemp); + msg.WriteRangedSingle(shutDownTemp, 0.0f, 10000.0f, 8); + + msg.WriteRangedSingle(coolingRate, 0.0f, 100.0f, 8); + msg.WriteRangedSingle(fissionRate, 0.0f, 100.0f, 8); + } + + public override void ClientRead(NetIncomingMessage msg) + { + Temperature = msg.ReadRangedSingle(0.0f, 10000.0f, 16); + + autoTemp = msg.ReadBoolean(); + ShutDownTemp = msg.ReadRangedSingle(0.0f, 10000.0f, 8); + + CoolingRate = msg.ReadRangedSingle(0.0f, 100.0f, 8); + FissionRate = msg.ReadRangedSingle(0.0f, 100.0f, 8); + } } } diff --git a/Subsurface/Source/Items/Components/Machines/Steering.cs b/Subsurface/Source/Items/Components/Machines/Steering.cs index 499e0ea39..85c057f07 100644 --- a/Subsurface/Source/Items/Components/Machines/Steering.cs +++ b/Subsurface/Source/Items/Components/Machines/Steering.cs @@ -291,8 +291,6 @@ namespace Barotrauma.Items.Components { TargetVelocity = targetSpeed/5.0f; } - - } private bool ToggleMaintainPosition(GUITickBox tickBox) @@ -329,6 +327,90 @@ namespace Barotrauma.Items.Components base.ReceiveSignal(stepsTaken, signal, connection, sender, power); } } - + + public override void ClientWrite(Lidgren.Network.NetOutgoingMessage msg) + { + msg.Write(autoPilot); + + if (!autoPilot) + { + //no need to write steering info if autopilot is controlling + msg.Write(targetVelocity.X); + msg.Write(targetVelocity.Y); + } + else + { + msg.Write(posToMaintain != null); + } + } + + public override void ServerRead(Lidgren.Network.NetIncomingMessage msg) + { + AutoPilot = msg.ReadBoolean(); + + if (!AutoPilot) + { + targetVelocity = new Vector2(msg.ReadFloat(), msg.ReadFloat()); + } + else + { + bool maintainPos = msg.ReadBoolean(); + if (posToMaintain == null && maintainPos) + { + posToMaintain = item.Submarine.WorldPosition; + maintainPosTickBox.Selected = true; + } + else + { + posToMaintain = null; + maintainPosTickBox.Selected = false; + } + } + } + + public override void ServerWrite(Lidgren.Network.NetOutgoingMessage msg) + { + msg.Write(autoPilot); + + if (!autoPilot) + { + //no need to write steering info if autopilot is controlling + msg.Write(targetVelocity.X); + msg.Write(targetVelocity.Y); + } + else + { + msg.Write(posToMaintain != null); + if (posToMaintain != null) + { + msg.Write(((Vector2)posToMaintain).X); + msg.Write(((Vector2)posToMaintain).Y); + } + } + } + + public override void ClientRead(Lidgren.Network.NetIncomingMessage msg) + { + AutoPilot = msg.ReadBoolean(); + + if (!AutoPilot) + { + targetVelocity = new Vector2(msg.ReadFloat(), msg.ReadFloat()); + } + else + { + bool maintainPos = msg.ReadBoolean(); + if (maintainPos) + { + posToMaintain = new Vector2(msg.ReadSingle(), msg.ReadSingle()); + maintainPosTickBox.Selected = true; + } + else + { + posToMaintain = null; + maintainPosTickBox.Selected = false; + } + } + } } } diff --git a/Subsurface/Source/Items/Components/Power/PowerContainer.cs b/Subsurface/Source/Items/Components/Power/PowerContainer.cs index df725a5e4..9e2695afc 100644 --- a/Subsurface/Source/Items/Components/Power/PowerContainer.cs +++ b/Subsurface/Source/Items/Components/Power/PowerContainer.cs @@ -112,7 +112,7 @@ namespace Barotrauma.Items.Components public override void Update(float deltaTime, Camera cam) { - float chargeRate = (float)(Math.Sqrt(charge / capacity)); + float chargeRatio = (float)(Math.Sqrt(charge / capacity)); float gridPower = 0.0f; float gridLoad = 0.0f; @@ -134,7 +134,7 @@ namespace Barotrauma.Items.Components //float gridRate = voltage; - if (chargeRate > 0.0f) + if (chargeRatio > 0.0f) { ApplyStatusEffects(ActionType.OnActive, deltaTime, null); } @@ -179,7 +179,7 @@ namespace Barotrauma.Items.Components CurrPowerOutput = MathHelper.Lerp( CurrPowerOutput, - Math.Min(maxOutput * chargeRate, gridLoad - (gridLoad * outputVoltage)), + Math.Min(maxOutput * chargeRatio, gridLoad - (gridLoad * outputVoltage)), 0.05f); } else @@ -245,6 +245,32 @@ namespace Barotrauma.Items.Components spriteBatch.DrawString(GUI.Font, "Recharge rate: " + (int)((rechargeSpeed / maxRechargeSpeed) * 100.0f) + " %", new Vector2(x + 30, y + 95), Color.White); } - + + public override void ClientWrite(Lidgren.Network.NetOutgoingMessage msg) + { + float chargeSpeed = MathHelper.Clamp(rechargeSpeed / MaxRechargeSpeed, 0.0f, 1.0f); + msg.WriteRangedSingle(chargeSpeed, 0.0f, 1.0f, 8); + } + + public override void ServerRead(Lidgren.Network.NetIncomingMessage msg) + { + RechargeSpeed = msg.ReadRangedSingle(0.0f, 1.0f, 8) * maxRechargeSpeed; + } + + public override void ServerWrite(Lidgren.Network.NetOutgoingMessage msg) + { + float chargeSpeed = MathHelper.Clamp(rechargeSpeed / MaxRechargeSpeed, 0.0f, 1.0f); + msg.WriteRangedSingle(chargeSpeed, 0.0f, 1.0f, 8); + + float chargeRatio = MathHelper.Clamp(charge / capacity, 0.0f, 1.0f); + msg.WriteRangedSingle(chargeRatio, 0.0f, 1.0f, 8); + } + + public override void ClientRead(Lidgren.Network.NetIncomingMessage msg) + { + RechargeSpeed = msg.ReadRangedSingle(0.0f, 1.0f, 8) * maxRechargeSpeed; + + Charge = msg.ReadRangedSingle(0.0f, 1.0f, 8) * capacity; + } } } diff --git a/Subsurface/Source/Items/Components/Signal/Wire.cs b/Subsurface/Source/Items/Components/Signal/Wire.cs index 77d203756..ab9b37d93 100644 --- a/Subsurface/Source/Items/Components/Signal/Wire.cs +++ b/Subsurface/Source/Items/Components/Signal/Wire.cs @@ -525,6 +525,30 @@ namespace Barotrauma.Items.Components base.RemoveComponentSpecific(); } + + public override void ClientWrite(Lidgren.Network.NetOutgoingMessage msg) + { + msg.Write((byte)Math.Min(Nodes.Count, 255)); + for (int i = 0; i < Math.Min(Nodes.Count, 255); i++) + { + msg.Write(Nodes[i].X); + msg.Write(Nodes[i].Y); + } + } + + public override void ServerRead(Lidgren.Network.NetIncomingMessage msg) + { + Nodes.Clear(); + + int nodeCount = msg.ReadByte(); + for (int i = 0; i < nodeCount; i++) + { + Vector2 newNode = new Vector2(msg.ReadFloat(), msg.ReadFloat()); + if (MathUtils.IsValid(newNode)) Nodes.Add(newNode); + } + + Drawable = Nodes.Any(); + } } } diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs index aeb5d83e3..37347f2cb 100644 --- a/Subsurface/Source/Map/Submarine.cs +++ b/Subsurface/Source/Map/Submarine.cs @@ -1,4 +1,5 @@ -using FarseerPhysics; +using Barotrauma.Networking; +using FarseerPhysics; using FarseerPhysics.Common; using FarseerPhysics.Dynamics; using Lidgren.Network; @@ -28,7 +29,7 @@ namespace Barotrauma HideInMenus = 2 } - class Submarine : Entity + class Submarine : Entity, IServerSerializable { public static string SavePath = "Submarines"; @@ -122,6 +123,15 @@ namespace Barotrauma } } + private ushort netStateID; + public ushort NetStateID + { + get + { + return netStateID; + } + } + public static List Loaded { get { return loaded; } @@ -951,6 +961,21 @@ namespace Barotrauma DockedTo.Clear(); } + + public void ServerWrite(NetOutgoingMessage msg) + { + msg.Write(subBody.Position.X); + msg.Write(subBody.Position.Y); + + msg.Write(Velocity.X); + msg.Write(Velocity.Y); + } + + public void ClientRead(NetIncomingMessage msg) + { + subBody.TargetPosition = new Vector2(msg.ReadSingle(), msg.ReadSingle()); + subBody.Velocity = new Vector2(msg.ReadSingle(), msg.ReadSingle()); + } } } diff --git a/Subsurface/Source/Map/SubmarineBody.cs b/Subsurface/Source/Map/SubmarineBody.cs index 2d633ee98..98f6a1f14 100644 --- a/Subsurface/Source/Map/SubmarineBody.cs +++ b/Subsurface/Source/Map/SubmarineBody.cs @@ -37,8 +37,6 @@ namespace Barotrauma private Vector2? targetPosition; - //private float mass = 10000.0f; - public Rectangle Borders { get;