diff --git a/Subsurface/Source/Items/Components/Machines/Steering.cs b/Subsurface/Source/Items/Components/Machines/Steering.cs index 06dcc38f2..9f941a761 100644 --- a/Subsurface/Source/Items/Components/Machines/Steering.cs +++ b/Subsurface/Source/Items/Components/Machines/Steering.cs @@ -38,9 +38,7 @@ namespace Barotrauma.Items.Components private Vector2 avoidStrength; private float neutralBallastLevel; - - public Vector2? TargetPosition; - + public bool AutoPilot { get { return autoPilot; } @@ -367,22 +365,18 @@ namespace Barotrauma.Items.Components private void UpdatePath() { + if (pathFinder == null) pathFinder = new PathFinder(WayPoint.WayPointList, false); + Vector2 target; - if (TargetPosition != null) + if (levelEndTickBox.Selected) { - target = (Vector2)TargetPosition; + target = ConvertUnits.ToSimUnits(Level.Loaded.EndPosition); } else { - if (levelEndTickBox.Selected) - { - target = ConvertUnits.ToSimUnits(Level.Loaded.EndPosition); - } - else - { - target = ConvertUnits.ToSimUnits(Level.Loaded.StartPosition); - } + target = ConvertUnits.ToSimUnits(Level.Loaded.StartPosition); } + steeringPath = pathFinder.FindPath(ConvertUnits.ToSimUnits(item.WorldPosition), target); } @@ -426,6 +420,39 @@ namespace Barotrauma.Items.Components return true; } + public void SetDestinationLevelStart() + { + AutoPilot = true; + + MaintainPos = false; + posToMaintain = null; + + levelEndTickBox.Selected = false; + + if (!levelStartTickBox.Selected) + { + levelStartTickBox.Selected = true; + UpdatePath(); + } + } + + public void SetDestinationLevelEnd() + { + AutoPilot = false; + + MaintainPos = false; + posToMaintain = null; + + levelStartTickBox.Selected = false; + + if (!levelEndTickBox.Selected) + { + levelEndTickBox.Selected = true; + UpdatePath(); + } + } + + private bool SelectDestination(GUITickBox tickBox) { unsentChanges = true; @@ -443,8 +470,7 @@ namespace Barotrauma.Items.Components posToMaintain = null; tickBox.Selected = true; - UpdatePath(); - + UpdatePath(); return true; } diff --git a/Subsurface/Source/Networking/EntitySpawner.cs b/Subsurface/Source/Networking/EntitySpawner.cs index 9439482f7..84d82fbf2 100644 --- a/Subsurface/Source/Networking/EntitySpawner.cs +++ b/Subsurface/Source/Networking/EntitySpawner.cs @@ -111,11 +111,11 @@ namespace Barotrauma spawnQueue.Enqueue(new ItemSpawnInfo(itemPrefab, inventory)); } - public void AddToRemoveQueue(Item item) + public void AddToRemoveQueue(Entity entity) { if (GameMain.Client != null) return; - removeQueue.Enqueue(item); + removeQueue.Enqueue(entity); } public void Update() diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index 16f9d5121..cb0047c32 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -470,10 +470,7 @@ namespace Barotrauma.Networking DebugConsole.ThrowError("Error while receiving message from server", e); #endif } - - - if (updateTimer > DateTime.Now) return; - + if (gameStarted && Screen.Selected == GameMain.GameScreen) { endVoteTickBox.Visible = Voting.AllowEndVoting && myCharacter != null; @@ -482,10 +479,13 @@ namespace Barotrauma.Networking { respawnManager.Update(deltaTime); } + + if (updateTimer > DateTime.Now) return; SendIngameUpdate(); } else { + if (updateTimer > DateTime.Now) return; SendLobbyUpdate(); } diff --git a/Subsurface/Source/Networking/RespawnManager.cs b/Subsurface/Source/Networking/RespawnManager.cs index c60194ee5..90b3620cc 100644 --- a/Subsurface/Source/Networking/RespawnManager.cs +++ b/Subsurface/Source/Networking/RespawnManager.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; namespace Barotrauma.Networking { - class RespawnManager + class RespawnManager : Entity, IServerSerializable { private readonly float respawnInterval; private float maxTransportTime; @@ -62,6 +62,7 @@ namespace Barotrauma.Networking private float updateReturnTimer; public RespawnManager(NetworkMember networkMember, Submarine shuttle) + : base(shuttle) { this.networkMember = networkMember; @@ -93,12 +94,7 @@ namespace Barotrauma.Networking } } } - - if (shuttleSteering != null) - { - shuttleSteering.TargetPosition = ConvertUnits.ToSimUnits(Level.Loaded.StartPosition); - } - + var server = networkMember as GameServer; if (server != null) { @@ -161,6 +157,7 @@ namespace Barotrauma.Networking if (!CountdownStarted) { CountdownStarted = true; + server.CreateEntityEvent(this); } } else @@ -181,22 +178,22 @@ namespace Barotrauma.Networking private void UpdateTransporting(float deltaTime) { + //infinite transport time -> shuttle wont return + if (maxTransportTime <= 0.0f) return; + shuttleTransportTimer -= deltaTime; - if (shuttleReturnTimer + deltaTime > 15.0f && shuttleReturnTimer <= 15.0f && + if (shuttleTransportTimer + deltaTime > 15.0f && shuttleTransportTimer <= 15.0f && networkMember.Character != null && networkMember.Character.Submarine == respawnShuttle) { networkMember.AddChatMessage("The shuttle will automatically return back to the outpost. Please leave the shuttle immediately.", ChatMessageType.Server); } - //infinite transport time -> shuttle wont return - if (maxTransportTime < 0.1f) return; var server = networkMember as GameServer; if (server == null) return; - //if there are no living chracters inside, transporting can be stopped immediately if (!Character.CharacterList.Any(c => c.Submarine == respawnShuttle && !c.IsDead)) { @@ -207,6 +204,8 @@ namespace Barotrauma.Networking { state = State.Returning; + server.CreateEntityEvent(this); + CountdownStarted = false; shuttleReturnTimer = maxTransportTime; shuttleTransportTimer = maxTransportTime; @@ -226,14 +225,13 @@ namespace Barotrauma.Networking updateReturnTimer += deltaTime; - if (updateReturnTimer > 10.0f) + if (updateReturnTimer > 1.0f) { updateReturnTimer = 0.0f; respawnShuttle.PhysicsBody.FarseerBody.IgnoreCollisionWith(Level.Loaded.ShaftBody); - shuttleSteering.AutoPilot = true; - shuttleSteering.MaintainPos = false; + shuttleSteering.SetDestinationLevelStart(); foreach (Door door in shuttleDoors) { @@ -271,6 +269,8 @@ namespace Barotrauma.Networking ResetShuttle(); state = State.Waiting; + server.CreateEntityEvent(this); + respawnTimer = respawnInterval; CountdownStarted = false; } @@ -283,13 +283,12 @@ namespace Barotrauma.Networking if (server == null) return; state = State.Transporting; + server.CreateEntityEvent(this); ResetShuttle(); shuttleSteering.TargetVelocity = Vector2.Zero; - //server.SendChatMessage(ChatMessage.Create("", "Transportation shuttle dispatched", ChatMessageType.Server, null), server.ConnectedClients); - RespawnCharacters(); CoroutineManager.StopCoroutines("forcepos"); @@ -467,6 +466,56 @@ namespace Barotrauma.Networking } } - + + public void ServerWrite(NetBuffer msg, Client c, object[] extraData = null) + { + msg.WriteRangedInteger(0, Enum.GetNames(typeof(State)).Length, (int)state); + + switch (state) + { + case State.Transporting: + msg.Write(TransportTimer); + break; + case State.Waiting: + msg.Write(CountdownStarted); + msg.Write(respawnTimer); + break; + case State.Returning: + break; + } + + msg.WritePadBits(); + } + + public void ClientRead(ServerNetObject type, NetBuffer msg, float sendingTime) + { + var newState = (State)msg.ReadRangedInteger(0, Enum.GetNames(typeof(State)).Length); + + switch (newState) + { + case State.Transporting: + maxTransportTime = msg.ReadSingle(); + shuttleTransportTimer = maxTransportTime; + CountdownStarted = false; + + if (state != newState) + { + CoroutineManager.StopCoroutines("forcepos"); + CoroutineManager.StartCoroutine(ForceShuttleToPos(Level.Loaded.StartPosition - Vector2.UnitY * Level.ShaftHeight, 100.0f), "forcepos"); + } + break; + case State.Waiting: + CountdownStarted = msg.ReadBoolean(); + ResetShuttle(); + respawnTimer = msg.ReadSingle(); + break; + case State.Returning: + CountdownStarted = false; + break; + } + state = newState; + + msg.ReadPadBits(); + } } }