Syncing RespawnManager state with clients

This commit is contained in:
Regalis
2017-03-20 20:44:20 +02:00
parent dde0160956
commit 2c688f40e3
4 changed files with 113 additions and 38 deletions

View File

@@ -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;
}

View File

@@ -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()

View File

@@ -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();
}

View File

@@ -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();
}
}
}