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
@@ -39,8 +39,6 @@ namespace Barotrauma.Items.Components
private float neutralBallastLevel; private float neutralBallastLevel;
public Vector2? TargetPosition;
public bool AutoPilot public bool AutoPilot
{ {
get { return autoPilot; } get { return autoPilot; }
@@ -367,23 +365,19 @@ namespace Barotrauma.Items.Components
private void UpdatePath() private void UpdatePath()
{ {
if (pathFinder == null) pathFinder = new PathFinder(WayPoint.WayPointList, false);
Vector2 target; Vector2 target;
if (TargetPosition != null) if (levelEndTickBox.Selected)
{ {
target = (Vector2)TargetPosition; target = ConvertUnits.ToSimUnits(Level.Loaded.EndPosition);
} }
else else
{ {
if (levelEndTickBox.Selected) target = ConvertUnits.ToSimUnits(Level.Loaded.StartPosition);
{
target = ConvertUnits.ToSimUnits(Level.Loaded.EndPosition);
}
else
{
target = ConvertUnits.ToSimUnits(Level.Loaded.StartPosition);
}
} }
steeringPath = pathFinder.FindPath(ConvertUnits.ToSimUnits(item.WorldPosition), target); steeringPath = pathFinder.FindPath(ConvertUnits.ToSimUnits(item.WorldPosition), target);
} }
@@ -426,6 +420,39 @@ namespace Barotrauma.Items.Components
return true; 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) private bool SelectDestination(GUITickBox tickBox)
{ {
unsentChanges = true; unsentChanges = true;
@@ -445,7 +472,6 @@ namespace Barotrauma.Items.Components
UpdatePath(); UpdatePath();
return true; return true;
} }
@@ -111,11 +111,11 @@ namespace Barotrauma
spawnQueue.Enqueue(new ItemSpawnInfo(itemPrefab, inventory)); spawnQueue.Enqueue(new ItemSpawnInfo(itemPrefab, inventory));
} }
public void AddToRemoveQueue(Item item) public void AddToRemoveQueue(Entity entity)
{ {
if (GameMain.Client != null) return; if (GameMain.Client != null) return;
removeQueue.Enqueue(item); removeQueue.Enqueue(entity);
} }
public void Update() public void Update()
+3 -3
View File
@@ -471,9 +471,6 @@ namespace Barotrauma.Networking
#endif #endif
} }
if (updateTimer > DateTime.Now) return;
if (gameStarted && Screen.Selected == GameMain.GameScreen) if (gameStarted && Screen.Selected == GameMain.GameScreen)
{ {
endVoteTickBox.Visible = Voting.AllowEndVoting && myCharacter != null; endVoteTickBox.Visible = Voting.AllowEndVoting && myCharacter != null;
@@ -482,10 +479,13 @@ namespace Barotrauma.Networking
{ {
respawnManager.Update(deltaTime); respawnManager.Update(deltaTime);
} }
if (updateTimer > DateTime.Now) return;
SendIngameUpdate(); SendIngameUpdate();
} }
else else
{ {
if (updateTimer > DateTime.Now) return;
SendLobbyUpdate(); SendLobbyUpdate();
} }
+64 -15
View File
@@ -10,7 +10,7 @@ using System.Threading.Tasks;
namespace Barotrauma.Networking namespace Barotrauma.Networking
{ {
class RespawnManager class RespawnManager : Entity, IServerSerializable
{ {
private readonly float respawnInterval; private readonly float respawnInterval;
private float maxTransportTime; private float maxTransportTime;
@@ -62,6 +62,7 @@ namespace Barotrauma.Networking
private float updateReturnTimer; private float updateReturnTimer;
public RespawnManager(NetworkMember networkMember, Submarine shuttle) public RespawnManager(NetworkMember networkMember, Submarine shuttle)
: base(shuttle)
{ {
this.networkMember = networkMember; this.networkMember = networkMember;
@@ -94,11 +95,6 @@ namespace Barotrauma.Networking
} }
} }
if (shuttleSteering != null)
{
shuttleSteering.TargetPosition = ConvertUnits.ToSimUnits(Level.Loaded.StartPosition);
}
var server = networkMember as GameServer; var server = networkMember as GameServer;
if (server != null) if (server != null)
{ {
@@ -161,6 +157,7 @@ namespace Barotrauma.Networking
if (!CountdownStarted) if (!CountdownStarted)
{ {
CountdownStarted = true; CountdownStarted = true;
server.CreateEntityEvent(this);
} }
} }
else else
@@ -181,22 +178,22 @@ namespace Barotrauma.Networking
private void UpdateTransporting(float deltaTime) private void UpdateTransporting(float deltaTime)
{ {
//infinite transport time -> shuttle wont return
if (maxTransportTime <= 0.0f) return;
shuttleTransportTimer -= deltaTime; shuttleTransportTimer -= deltaTime;
if (shuttleReturnTimer + deltaTime > 15.0f && shuttleReturnTimer <= 15.0f && if (shuttleTransportTimer + deltaTime > 15.0f && shuttleTransportTimer <= 15.0f &&
networkMember.Character != null && networkMember.Character != null &&
networkMember.Character.Submarine == respawnShuttle) networkMember.Character.Submarine == respawnShuttle)
{ {
networkMember.AddChatMessage("The shuttle will automatically return back to the outpost. Please leave the shuttle immediately.", ChatMessageType.Server); 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; var server = networkMember as GameServer;
if (server == null) return; if (server == null) return;
//if there are no living chracters inside, transporting can be stopped immediately //if there are no living chracters inside, transporting can be stopped immediately
if (!Character.CharacterList.Any(c => c.Submarine == respawnShuttle && !c.IsDead)) if (!Character.CharacterList.Any(c => c.Submarine == respawnShuttle && !c.IsDead))
{ {
@@ -207,6 +204,8 @@ namespace Barotrauma.Networking
{ {
state = State.Returning; state = State.Returning;
server.CreateEntityEvent(this);
CountdownStarted = false; CountdownStarted = false;
shuttleReturnTimer = maxTransportTime; shuttleReturnTimer = maxTransportTime;
shuttleTransportTimer = maxTransportTime; shuttleTransportTimer = maxTransportTime;
@@ -226,14 +225,13 @@ namespace Barotrauma.Networking
updateReturnTimer += deltaTime; updateReturnTimer += deltaTime;
if (updateReturnTimer > 10.0f) if (updateReturnTimer > 1.0f)
{ {
updateReturnTimer = 0.0f; updateReturnTimer = 0.0f;
respawnShuttle.PhysicsBody.FarseerBody.IgnoreCollisionWith(Level.Loaded.ShaftBody); respawnShuttle.PhysicsBody.FarseerBody.IgnoreCollisionWith(Level.Loaded.ShaftBody);
shuttleSteering.AutoPilot = true; shuttleSteering.SetDestinationLevelStart();
shuttleSteering.MaintainPos = false;
foreach (Door door in shuttleDoors) foreach (Door door in shuttleDoors)
{ {
@@ -271,6 +269,8 @@ namespace Barotrauma.Networking
ResetShuttle(); ResetShuttle();
state = State.Waiting; state = State.Waiting;
server.CreateEntityEvent(this);
respawnTimer = respawnInterval; respawnTimer = respawnInterval;
CountdownStarted = false; CountdownStarted = false;
} }
@@ -283,13 +283,12 @@ namespace Barotrauma.Networking
if (server == null) return; if (server == null) return;
state = State.Transporting; state = State.Transporting;
server.CreateEntityEvent(this);
ResetShuttle(); ResetShuttle();
shuttleSteering.TargetVelocity = Vector2.Zero; shuttleSteering.TargetVelocity = Vector2.Zero;
//server.SendChatMessage(ChatMessage.Create("", "Transportation shuttle dispatched", ChatMessageType.Server, null), server.ConnectedClients);
RespawnCharacters(); RespawnCharacters();
CoroutineManager.StopCoroutines("forcepos"); CoroutineManager.StopCoroutines("forcepos");
@@ -468,5 +467,55 @@ 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();
}
} }
} }