Syncing RespawnManager state with clients
This commit is contained in:
@@ -38,9 +38,7 @@ namespace Barotrauma.Items.Components
|
|||||||
private Vector2 avoidStrength;
|
private Vector2 avoidStrength;
|
||||||
|
|
||||||
private float neutralBallastLevel;
|
private float neutralBallastLevel;
|
||||||
|
|
||||||
public Vector2? TargetPosition;
|
|
||||||
|
|
||||||
public bool AutoPilot
|
public bool AutoPilot
|
||||||
{
|
{
|
||||||
get { return autoPilot; }
|
get { return autoPilot; }
|
||||||
@@ -367,22 +365,18 @@ 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;
|
||||||
@@ -443,8 +470,7 @@ namespace Barotrauma.Items.Components
|
|||||||
posToMaintain = null;
|
posToMaintain = null;
|
||||||
tickBox.Selected = true;
|
tickBox.Selected = true;
|
||||||
|
|
||||||
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()
|
||||||
|
|||||||
@@ -470,10 +470,7 @@ namespace Barotrauma.Networking
|
|||||||
DebugConsole.ThrowError("Error while receiving message from server", e);
|
DebugConsole.ThrowError("Error while receiving message from server", e);
|
||||||
#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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
@@ -93,12 +94,7 @@ 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");
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user