Option for clients to spectate the game without respawning
This commit is contained in:
@@ -795,7 +795,6 @@ namespace Barotrauma.Networking
|
|||||||
GameMain.NetLobbyScreen.UpdateSubList(GameMain.NetLobbyScreen.SubList, submarines);
|
GameMain.NetLobbyScreen.UpdateSubList(GameMain.NetLobbyScreen.SubList, submarines);
|
||||||
GameMain.NetLobbyScreen.UpdateSubList(GameMain.NetLobbyScreen.ShuttleList.ListBox, submarines);
|
GameMain.NetLobbyScreen.UpdateSubList(GameMain.NetLobbyScreen.ShuttleList.ListBox, submarines);
|
||||||
|
|
||||||
|
|
||||||
gameStarted = inc.ReadBoolean();
|
gameStarted = inc.ReadBoolean();
|
||||||
bool allowSpectating = inc.ReadBoolean();
|
bool allowSpectating = inc.ReadBoolean();
|
||||||
|
|
||||||
@@ -847,6 +846,8 @@ namespace Barotrauma.Networking
|
|||||||
bool allowSubVoting = inc.ReadBoolean();
|
bool allowSubVoting = inc.ReadBoolean();
|
||||||
bool allowModeVoting = inc.ReadBoolean();
|
bool allowModeVoting = inc.ReadBoolean();
|
||||||
|
|
||||||
|
bool allowSpectating = inc.ReadBoolean();
|
||||||
|
|
||||||
YesNoMaybe traitorsEnabled = (YesNoMaybe)inc.ReadRangedInteger(0, 2);
|
YesNoMaybe traitorsEnabled = (YesNoMaybe)inc.ReadRangedInteger(0, 2);
|
||||||
int missionTypeIndex = inc.ReadRangedInteger(0, Mission.MissionTypes.Count - 1);
|
int missionTypeIndex = inc.ReadRangedInteger(0, Mission.MissionTypes.Count - 1);
|
||||||
int modeIndex = inc.ReadByte();
|
int modeIndex = inc.ReadByte();
|
||||||
@@ -889,6 +890,8 @@ namespace Barotrauma.Networking
|
|||||||
GameMain.NetLobbyScreen.SelectMode(modeIndex);
|
GameMain.NetLobbyScreen.SelectMode(modeIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GameMain.NetLobbyScreen.SetAllowSpectating(allowSpectating);
|
||||||
|
|
||||||
GameMain.NetLobbyScreen.LevelSeed = levelSeed;
|
GameMain.NetLobbyScreen.LevelSeed = levelSeed;
|
||||||
|
|
||||||
GameMain.NetLobbyScreen.SetAutoRestart(autoRestartEnabled, autoRestartTimer);
|
GameMain.NetLobbyScreen.SetAutoRestart(autoRestartEnabled, autoRestartTimer);
|
||||||
@@ -1213,6 +1216,7 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
public void WriteCharacterInfo(NetOutgoingMessage msg)
|
public void WriteCharacterInfo(NetOutgoingMessage msg)
|
||||||
{
|
{
|
||||||
|
msg.Write(characterInfo == null);
|
||||||
if (characterInfo == null) return;
|
if (characterInfo == null) return;
|
||||||
|
|
||||||
msg.Write(characterInfo.Gender == Gender.Male);
|
msg.Write(characterInfo.Gender == Gender.Male);
|
||||||
|
|||||||
@@ -314,6 +314,7 @@ namespace Barotrauma.Networking
|
|||||||
allowSpecBox.OnSelected = (GUITickBox) =>
|
allowSpecBox.OnSelected = (GUITickBox) =>
|
||||||
{
|
{
|
||||||
AllowSpectating = GUITickBox.Selected;
|
AllowSpectating = GUITickBox.Selected;
|
||||||
|
GameMain.NetLobbyScreen.LastUpdateID++;
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -415,6 +415,19 @@ namespace Barotrauma
|
|||||||
campaignViewButton.OnClicked = (btn, obj) => { ToggleCampaignView(true); return true; };
|
campaignViewButton.OnClicked = (btn, obj) => { ToggleCampaignView(true); return true; };
|
||||||
campaignViewButton.Visible = false;
|
campaignViewButton.Visible = false;
|
||||||
|
|
||||||
|
if (myPlayerFrame.children.Find(c => c.UserData as string == "playyourself") == null)
|
||||||
|
{
|
||||||
|
var playYourself = new GUITickBox(new Rectangle(0, 0, 20, 20), "Play yourself", Alignment.TopLeft, myPlayerFrame);
|
||||||
|
playYourself.Selected = GameMain.NetworkMember.CharacterInfo != null;
|
||||||
|
playYourself.OnSelected = TogglePlayYourself;
|
||||||
|
playYourself.UserData = "playyourself";
|
||||||
|
|
||||||
|
if (GameMain.NetworkMember.CharacterInfo != null)
|
||||||
|
{
|
||||||
|
TogglePlayYourself(playYourself);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (IsServer && GameMain.Server != null)
|
if (IsServer && GameMain.Server != null)
|
||||||
{
|
{
|
||||||
List<Submarine> subsToShow = Submarine.SavedSubmarines.Where(s => !s.HasTag(SubmarineTag.HideInMenus)).ToList();
|
List<Submarine> subsToShow = Submarine.SavedSubmarines.Where(s => !s.HasTag(SubmarineTag.HideInMenus)).ToList();
|
||||||
@@ -441,7 +454,6 @@ namespace Barotrauma
|
|||||||
StartButton = new GUIButton(new Rectangle(0, 0, 80, 30), "Start", Alignment.BottomRight, "", defaultModeContainer);
|
StartButton = new GUIButton(new Rectangle(0, 0, 80, 30), "Start", Alignment.BottomRight, "", defaultModeContainer);
|
||||||
StartButton.OnClicked = GameMain.Server.StartGameClicked;
|
StartButton.OnClicked = GameMain.Server.StartGameClicked;
|
||||||
|
|
||||||
|
|
||||||
GUIButton settingsButton = new GUIButton(new Rectangle(-110, 0, 80, 20), "Settings", Alignment.TopRight, "", infoFrame);
|
GUIButton settingsButton = new GUIButton(new Rectangle(-110, 0, 80, 20), "Settings", Alignment.TopRight, "", infoFrame);
|
||||||
settingsButton.OnClicked = GameMain.Server.ToggleSettingsFrame;
|
settingsButton.OnClicked = GameMain.Server.ToggleSettingsFrame;
|
||||||
settingsButton.UserData = "settingsButton";
|
settingsButton.UserData = "settingsButton";
|
||||||
@@ -462,14 +474,6 @@ namespace Barotrauma
|
|||||||
|
|
||||||
if (GameModePreset.list.Count > 0 && modeList.Selected == null) modeList.Select(0);
|
if (GameModePreset.list.Count > 0 && modeList.Selected == null) modeList.Select(0);
|
||||||
|
|
||||||
if (myPlayerFrame.children.Find(c => c.UserData as string == "playyourself") == null)
|
|
||||||
{
|
|
||||||
var playYourself = new GUITickBox(new Rectangle(0, 0, 20, 20), "Play yourself", Alignment.TopLeft, myPlayerFrame);
|
|
||||||
playYourself.Selected = GameMain.Server.CharacterInfo != null;
|
|
||||||
playYourself.OnSelected = TogglePlayYourself;
|
|
||||||
playYourself.UserData = "playyourself";
|
|
||||||
}
|
|
||||||
|
|
||||||
GameMain.Server.Voting.ResetVotes(GameMain.Server.ConnectedClients);
|
GameMain.Server.Voting.ResetVotes(GameMain.Server.ConnectedClients);
|
||||||
|
|
||||||
if (GameMain.Server.RandomizeSeed) LevelSeed = ToolBox.RandomSeed(8);
|
if (GameMain.Server.RandomizeSeed) LevelSeed = ToolBox.RandomSeed(8);
|
||||||
@@ -490,8 +494,6 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
|
|
||||||
GameMain.Client.Voting.ResetVotes(GameMain.Client.ConnectedClients);
|
GameMain.Client.Voting.ResetVotes(GameMain.Client.ConnectedClients);
|
||||||
|
|
||||||
UpdatePlayerFrame(GameMain.Client.CharacterInfo);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GameMain.NetworkMember.EndVoteCount = 0;
|
GameMain.NetworkMember.EndVoteCount = 0;
|
||||||
@@ -512,23 +514,14 @@ namespace Barotrauma
|
|||||||
|
|
||||||
private void UpdatePlayerFrame(CharacterInfo characterInfo)
|
private void UpdatePlayerFrame(CharacterInfo characterInfo)
|
||||||
{
|
{
|
||||||
if (myPlayerFrame.children.Count <= 1)
|
if (myPlayerFrame.children.Count <= 2)
|
||||||
{
|
{
|
||||||
myPlayerFrame.ClearChildren();
|
myPlayerFrame.ClearChildren();
|
||||||
|
|
||||||
if (IsServer && GameMain.Server != null)
|
var playYourself = new GUITickBox(new Rectangle(0, 0, 20, 20), "Play yourself", Alignment.TopLeft, myPlayerFrame);
|
||||||
{
|
playYourself.Selected = GameMain.NetworkMember.CharacterInfo != null;
|
||||||
var playYourself = new GUITickBox(new Rectangle(0, 0, 20, 20), "Play yourself", Alignment.TopLeft, myPlayerFrame);
|
playYourself.OnSelected = TogglePlayYourself;
|
||||||
playYourself.Selected = GameMain.Server.CharacterInfo != null;
|
playYourself.UserData = "playyourself";
|
||||||
playYourself.OnSelected = TogglePlayYourself;
|
|
||||||
playYourself.UserData = "playyourself";
|
|
||||||
}
|
|
||||||
|
|
||||||
//new GUITextBlock(new Rectangle(100, 30, 200, 30), "Name: ", "", myPlayerFrame);
|
|
||||||
|
|
||||||
//GUITextBox playerName = new GUITextBox(new Rectangle(100, 55, 0, 20), Alignment.TopLeft, "", myPlayerFrame);
|
|
||||||
//playerName.Text = characterInfo.Name;
|
|
||||||
//playerName.OnEnterPressed += ChangeCharacterName;
|
|
||||||
|
|
||||||
GUIButton toggleHead = new GUIButton(new Rectangle(0, 50, 15, 15), "<", "", myPlayerFrame);
|
GUIButton toggleHead = new GUIButton(new Rectangle(0, 50, 15, 15), "<", "", myPlayerFrame);
|
||||||
toggleHead.UserData = -1;
|
toggleHead.UserData = -1;
|
||||||
@@ -590,34 +583,48 @@ namespace Barotrauma
|
|||||||
|
|
||||||
UpdateJobPreferences(jobList);
|
UpdateJobPreferences(jobList);
|
||||||
|
|
||||||
UpdatePreviewPlayer(characterInfo);
|
UpdatePlayerHead(characterInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool TogglePlayYourself(GUITickBox tickBox)
|
public bool TogglePlayYourself(GUITickBox tickBox)
|
||||||
{
|
{
|
||||||
if (tickBox.Selected)
|
if (tickBox.Selected)
|
||||||
{
|
{
|
||||||
GameMain.Server.CharacterInfo = new CharacterInfo(Character.HumanConfigFile, GameMain.Server.Name,Gender.None,null);
|
GameMain.NetworkMember.CharacterInfo = new CharacterInfo(Character.HumanConfigFile, GameMain.NetworkMember.Name, Gender.None, null);
|
||||||
UpdatePlayerFrame(GameMain.Server.CharacterInfo);
|
UpdatePlayerFrame(GameMain.NetworkMember.CharacterInfo);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
myPlayerFrame.ClearChildren();
|
myPlayerFrame.ClearChildren();
|
||||||
|
|
||||||
if (IsServer && GameMain.Server != null)
|
GameMain.NetworkMember.CharacterInfo = null;
|
||||||
{
|
GameMain.NetworkMember.Character = null;
|
||||||
GameMain.Server.CharacterInfo = null;
|
|
||||||
GameMain.Server.Character = null;
|
|
||||||
|
|
||||||
var playYourself = new GUITickBox(new Rectangle(0, 0, 20, 20), "Play yourself", Alignment.TopLeft, myPlayerFrame);
|
new GUITextBlock(Rectangle.Empty, "Playing as a spectator", "", Alignment.Center, Alignment.Center, myPlayerFrame, true);
|
||||||
playYourself.OnSelected = TogglePlayYourself;
|
|
||||||
playYourself.UserData = "playyourself";
|
var playYourself = new GUITickBox(new Rectangle(0, 0, 20, 20), "Play yourself", Alignment.TopLeft, myPlayerFrame);
|
||||||
}
|
playYourself.OnSelected = TogglePlayYourself;
|
||||||
|
playYourself.UserData = "playyourself";
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetAllowSpectating(bool allowSpectating)
|
||||||
|
{
|
||||||
|
GUITickBox playYourselfTickBox = myPlayerFrame?.FindChild("playyourself") as GUITickBox;
|
||||||
|
if (playYourselfTickBox == null) return;
|
||||||
|
|
||||||
|
//show the player config menu if spectating is not allowed
|
||||||
|
if (!playYourselfTickBox.Selected && !allowSpectating)
|
||||||
|
{
|
||||||
|
playYourselfTickBox.Selected = !playYourselfTickBox.Selected;
|
||||||
|
TogglePlayYourself(playYourselfTickBox);
|
||||||
|
}
|
||||||
|
//hide "play yourself" tickbox if spectating is not allowed
|
||||||
|
playYourselfTickBox.Visible = allowSpectating;
|
||||||
|
}
|
||||||
|
|
||||||
public void SetAutoRestart(bool enabled, float timer = 0.0f)
|
public void SetAutoRestart(bool enabled, float timer = 0.0f)
|
||||||
{
|
{
|
||||||
autoRestartBox.Selected = enabled;
|
autoRestartBox.Selected = enabled;
|
||||||
@@ -1079,7 +1086,7 @@ namespace Barotrauma
|
|||||||
if ((prevSize == 1.0f && chatBox.BarScroll == 0.0f) || (prevSize < 1.0f && chatBox.BarScroll == 1.0f)) chatBox.BarScroll = 1.0f;
|
if ((prevSize == 1.0f && chatBox.BarScroll == 0.0f) || (prevSize < 1.0f && chatBox.BarScroll == 1.0f)) chatBox.BarScroll = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdatePreviewPlayer(CharacterInfo characterInfo)
|
private void UpdatePlayerHead(CharacterInfo characterInfo)
|
||||||
{
|
{
|
||||||
GUIComponent existing = myPlayerFrame.FindChild("playerhead");
|
GUIComponent existing = myPlayerFrame.FindChild("playerhead");
|
||||||
if (existing != null) myPlayerFrame.RemoveChild(existing);
|
if (existing != null) myPlayerFrame.RemoveChild(existing);
|
||||||
@@ -1096,7 +1103,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
GameMain.NetworkMember.CharacterInfo.HeadSpriteId += dir;
|
GameMain.NetworkMember.CharacterInfo.HeadSpriteId += dir;
|
||||||
|
|
||||||
UpdatePreviewPlayer(GameMain.NetworkMember.CharacterInfo);
|
UpdatePlayerHead(GameMain.NetworkMember.CharacterInfo);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1106,7 +1113,7 @@ namespace Barotrauma
|
|||||||
Gender gender = (Gender)obj;
|
Gender gender = (Gender)obj;
|
||||||
GameMain.NetworkMember.CharacterInfo.Gender = gender;
|
GameMain.NetworkMember.CharacterInfo.Gender = gender;
|
||||||
|
|
||||||
UpdatePreviewPlayer(GameMain.NetworkMember.CharacterInfo);
|
UpdatePlayerHead(GameMain.NetworkMember.CharacterInfo);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,6 @@ namespace Barotrauma.Networking
|
|||||||
public List<ChatMessage> chatMsgQueue = new List<ChatMessage>();
|
public List<ChatMessage> chatMsgQueue = new List<ChatMessage>();
|
||||||
public UInt16 lastChatMsgQueueID;
|
public UInt16 lastChatMsgQueueID;
|
||||||
|
|
||||||
|
|
||||||
//latest chat messages sent by this client
|
//latest chat messages sent by this client
|
||||||
public List<string> lastSentChatMessages = new List<string>();
|
public List<string> lastSentChatMessages = new List<string>();
|
||||||
public float ChatSpamSpeed;
|
public float ChatSpamSpeed;
|
||||||
@@ -81,6 +80,8 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
public ClientPermissions Permissions = ClientPermissions.None;
|
public ClientPermissions Permissions = ClientPermissions.None;
|
||||||
|
|
||||||
|
public bool SpectateOnly;
|
||||||
|
|
||||||
public Queue<Entity> PendingPositionUpdates
|
public Queue<Entity> PendingPositionUpdates
|
||||||
{
|
{
|
||||||
get { return pendingPositionUpdates; }
|
get { return pendingPositionUpdates; }
|
||||||
|
|||||||
@@ -952,6 +952,8 @@ namespace Barotrauma.Networking
|
|||||||
outmsg.Write(Voting.AllowSubVoting);
|
outmsg.Write(Voting.AllowSubVoting);
|
||||||
outmsg.Write(Voting.AllowModeVoting);
|
outmsg.Write(Voting.AllowModeVoting);
|
||||||
|
|
||||||
|
outmsg.Write(AllowSpectating);
|
||||||
|
|
||||||
outmsg.WriteRangedInteger(0, 2, (int)TraitorsEnabled);
|
outmsg.WriteRangedInteger(0, 2, (int)TraitorsEnabled);
|
||||||
|
|
||||||
outmsg.WriteRangedInteger(0, Mission.MissionTypes.Count - 1, (GameMain.NetLobbyScreen.MissionTypeIndex));
|
outmsg.WriteRangedInteger(0, Mission.MissionTypes.Count - 1, (GameMain.NetLobbyScreen.MissionTypeIndex));
|
||||||
@@ -1209,7 +1211,11 @@ namespace Barotrauma.Networking
|
|||||||
for (int teamID = 1; teamID <= teamCount; teamID++)
|
for (int teamID = 1; teamID <= teamCount; teamID++)
|
||||||
{
|
{
|
||||||
//find the clients in this team
|
//find the clients in this team
|
||||||
List<Client> teamClients = teamCount == 1 ? connectedClients : connectedClients.FindAll(c => c.TeamID == teamID);
|
List<Client> teamClients = teamCount == 1 ? new List<Client>(connectedClients) : connectedClients.FindAll(c => c.TeamID == teamID);
|
||||||
|
if (AllowSpectating)
|
||||||
|
{
|
||||||
|
teamClients.RemoveAll(c => c.SpectateOnly);
|
||||||
|
}
|
||||||
|
|
||||||
if (!teamClients.Any() && teamID > 1) continue;
|
if (!teamClients.Any() && teamID > 1) continue;
|
||||||
|
|
||||||
@@ -1949,6 +1955,12 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
private void UpdateCharacterInfo(NetIncomingMessage message, Client sender)
|
private void UpdateCharacterInfo(NetIncomingMessage message, Client sender)
|
||||||
{
|
{
|
||||||
|
sender.SpectateOnly = message.ReadBoolean() && AllowSpectating;
|
||||||
|
if (sender.SpectateOnly)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Gender gender = Gender.Male;
|
Gender gender = Gender.Male;
|
||||||
int headSpriteId = 0;
|
int headSpriteId = 0;
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -110,7 +110,10 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
private List<Client> GetClientsToRespawn()
|
private List<Client> GetClientsToRespawn()
|
||||||
{
|
{
|
||||||
return networkMember.ConnectedClients.FindAll(c => c.inGame && (c.Character == null || c.Character.IsDead));
|
return networkMember.ConnectedClients.FindAll(c =>
|
||||||
|
c.inGame &&
|
||||||
|
(!c.SpectateOnly || !((GameServer)networkMember).AllowSpectating) &&
|
||||||
|
(c.Character == null || c.Character.IsDead));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Update(float deltaTime)
|
public void Update(float deltaTime)
|
||||||
|
|||||||
Reference in New Issue
Block a user