- clients ignore lobby updates if they already received a more up-to-date one
- server tells clients their ID in the first lobby update - clients take control of a spawned character if their ID matches the ownerID of the character (-> respawning works now)
This commit is contained in:
@@ -2436,10 +2436,10 @@ namespace Barotrauma
|
|||||||
CharacterInfo ch = new CharacterInfo(configPath, newName, isFemale ? Gender.Female : Gender.Male, jobPrefab);
|
CharacterInfo ch = new CharacterInfo(configPath, newName, isFemale ? Gender.Female : Gender.Male, jobPrefab);
|
||||||
ch.HeadSpriteId = headSpriteID;
|
ch.HeadSpriteId = headSpriteID;
|
||||||
|
|
||||||
character = Character.Create(configPath, position, ch, GameMain.Client.MyCharacterID != id, hasAi);
|
character = Character.Create(configPath, position, ch, GameMain.Client.ID != ownerId, hasAi);
|
||||||
character.ID = id;
|
character.ID = id;
|
||||||
|
|
||||||
if (GameMain.Client.MyCharacterID == id)
|
if (GameMain.Client.ID == ownerId)
|
||||||
{
|
{
|
||||||
GameMain.Client.Character = character;
|
GameMain.Client.Character = character;
|
||||||
Controlled = character;
|
Controlled = character;
|
||||||
|
|||||||
@@ -47,14 +47,7 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
get { return myID; }
|
get { return myID; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public ushort MyCharacterID
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
private set;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public override List<Client> ConnectedClients
|
public override List<Client> ConnectedClients
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -435,12 +428,6 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
if (Screen.Selected != GameMain.GameScreen)
|
if (Screen.Selected != GameMain.GameScreen)
|
||||||
{
|
{
|
||||||
List<Submarine> subList = GameMain.NetLobbyScreen.GetSubList();
|
|
||||||
|
|
||||||
GameMain.NetLobbyScreen = new NetLobbyScreen();
|
|
||||||
GameMain.NetLobbyScreen.UpdateSubList(GameMain.NetLobbyScreen.SubList, subList);
|
|
||||||
GameMain.NetLobbyScreen.UpdateSubList(GameMain.NetLobbyScreen.ShuttleList.ListBox, subList);
|
|
||||||
|
|
||||||
GameMain.NetLobbyScreen.Select();
|
GameMain.NetLobbyScreen.Select();
|
||||||
}
|
}
|
||||||
connected = true;
|
connected = true;
|
||||||
@@ -597,9 +584,7 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
bool respawnAllowed = inc.ReadBoolean();
|
bool respawnAllowed = inc.ReadBoolean();
|
||||||
bool loadSecondSub = inc.ReadBoolean();
|
bool loadSecondSub = inc.ReadBoolean();
|
||||||
|
|
||||||
MyCharacterID = inc.ReadUInt16();
|
|
||||||
|
|
||||||
GameModePreset gameMode = GameModePreset.list.Find(gm => gm.Name == modeName);
|
GameModePreset gameMode = GameModePreset.list.Find(gm => gm.Name == modeName);
|
||||||
|
|
||||||
if (gameMode == null)
|
if (gameMode == null)
|
||||||
@@ -690,18 +675,22 @@ namespace Barotrauma.Networking
|
|||||||
case ServerNetObject.SYNC_IDS:
|
case ServerNetObject.SYNC_IDS:
|
||||||
bool lobbyUpdated = inc.ReadBoolean();
|
bool lobbyUpdated = inc.ReadBoolean();
|
||||||
inc.ReadPadBits();
|
inc.ReadPadBits();
|
||||||
|
|
||||||
if (lobbyUpdated)
|
if (lobbyUpdated)
|
||||||
{
|
{
|
||||||
GameMain.NetLobbyScreen.LastUpdateID = inc.ReadUInt32();
|
UInt32 updateID = inc.ReadUInt32();
|
||||||
GameMain.NetLobbyScreen.ServerName = inc.ReadString();
|
string serverName = inc.ReadString();
|
||||||
GameMain.NetLobbyScreen.ServerMessage.Text = inc.ReadString();
|
string serverText = inc.ReadString();
|
||||||
|
|
||||||
UInt16 subListCount = inc.ReadUInt16();
|
if (inc.ReadBoolean())
|
||||||
if (subListCount > 0)
|
|
||||||
{
|
{
|
||||||
|
myID = inc.ReadByte();
|
||||||
|
|
||||||
|
UInt16 subListCount = inc.ReadUInt16();
|
||||||
List<Submarine> submarines = new List<Submarine>();
|
List<Submarine> submarines = new List<Submarine>();
|
||||||
for (int i = 0; i < subListCount; i++)
|
for (int i = 0; i < subListCount; i++)
|
||||||
{
|
{
|
||||||
|
|
||||||
string subName = inc.ReadString();
|
string subName = inc.ReadString();
|
||||||
string subHash = inc.ReadString();
|
string subHash = inc.ReadString();
|
||||||
|
|
||||||
@@ -715,28 +704,48 @@ namespace Barotrauma.Networking
|
|||||||
submarines.Add(new Submarine(Path.Combine(Submarine.SavePath, subName), subHash, false));
|
submarines.Add(new Submarine(Path.Combine(Submarine.SavePath, subName), subHash, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GameMain.NetLobbyScreen.UpdateSubList(GameMain.NetLobbyScreen.SubList, submarines);
|
|
||||||
GameMain.NetLobbyScreen.UpdateSubList(GameMain.NetLobbyScreen.ShuttleList.ListBox, submarines);
|
if (updateID > GameMain.NetLobbyScreen.LastUpdateID)
|
||||||
|
{
|
||||||
|
GameMain.NetLobbyScreen.UpdateSubList(GameMain.NetLobbyScreen.SubList, submarines);
|
||||||
|
GameMain.NetLobbyScreen.UpdateSubList(GameMain.NetLobbyScreen.ShuttleList.ListBox, submarines);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
string selectSubName = inc.ReadString();
|
|
||||||
string selectSubHash = inc.ReadString();
|
|
||||||
GameMain.NetLobbyScreen.TrySelectSub(selectSubName, selectSubHash, GameMain.NetLobbyScreen.SubList);
|
|
||||||
string selectShuttleName = inc.ReadString();
|
|
||||||
string selectShuttleHash = inc.ReadString();
|
|
||||||
GameMain.NetLobbyScreen.TrySelectSub(selectShuttleName, selectShuttleHash, GameMain.NetLobbyScreen.ShuttleList.ListBox);
|
|
||||||
|
|
||||||
GameMain.NetLobbyScreen.SetTraitorsEnabled((YesNoMaybe)inc.ReadRangedInteger(0, 2));
|
string selectSubName = inc.ReadString();
|
||||||
|
string selectSubHash = inc.ReadString();
|
||||||
|
|
||||||
GameMain.NetLobbyScreen.SetMissionType(inc.ReadRangedInteger(0, Mission.MissionTypes.Count - 1));
|
string selectShuttleName = inc.ReadString();
|
||||||
|
string selectShuttleHash = inc.ReadString();
|
||||||
|
|
||||||
GameMain.NetLobbyScreen.SelectMode(inc.ReadByte());
|
YesNoMaybe traitorsEnabled = (YesNoMaybe)inc.ReadRangedInteger(0, 2);
|
||||||
|
int missionTypeIndex = inc.ReadRangedInteger(0, Mission.MissionTypes.Count - 1);
|
||||||
|
int modeIndex = inc.ReadByte();
|
||||||
|
|
||||||
GameMain.NetLobbyScreen.LevelSeed = inc.ReadString();
|
string levelSeed = inc.ReadString();
|
||||||
|
|
||||||
bool autoRestartEnabled = inc.ReadBoolean();
|
bool autoRestartEnabled = inc.ReadBoolean();
|
||||||
float autoRestartTimer = autoRestartEnabled ? inc.ReadFloat() : 0.0f;
|
float autoRestartTimer = autoRestartEnabled ? inc.ReadFloat() : 0.0f;
|
||||||
|
|
||||||
GameMain.NetLobbyScreen.SetAutoRestart(autoRestartEnabled, autoRestartTimer);
|
//ignore the message if we already a more up-to-date one
|
||||||
|
if (updateID > GameMain.NetLobbyScreen.LastUpdateID)
|
||||||
|
{
|
||||||
|
GameMain.NetLobbyScreen.LastUpdateID = updateID;
|
||||||
|
|
||||||
|
GameMain.NetLobbyScreen.ServerName = serverName;
|
||||||
|
GameMain.NetLobbyScreen.ServerMessage.Text = serverText;
|
||||||
|
|
||||||
|
GameMain.NetLobbyScreen.TrySelectSub(selectSubName, selectSubHash, GameMain.NetLobbyScreen.SubList);
|
||||||
|
GameMain.NetLobbyScreen.TrySelectSub(selectShuttleName, selectShuttleHash, GameMain.NetLobbyScreen.ShuttleList.ListBox);
|
||||||
|
|
||||||
|
GameMain.NetLobbyScreen.SetTraitorsEnabled(traitorsEnabled);
|
||||||
|
GameMain.NetLobbyScreen.SetMissionType(missionTypeIndex);
|
||||||
|
GameMain.NetLobbyScreen.SelectMode(modeIndex);
|
||||||
|
|
||||||
|
GameMain.NetLobbyScreen.LevelSeed = levelSeed;
|
||||||
|
|
||||||
|
GameMain.NetLobbyScreen.SetAutoRestart(autoRestartEnabled, autoRestartTimer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
lastSentChatMsgID = inc.ReadUInt32();
|
lastSentChatMsgID = inc.ReadUInt32();
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -717,12 +717,17 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
outmsg.Write(true);
|
outmsg.Write(true);
|
||||||
outmsg.WritePadBits();
|
outmsg.WritePadBits();
|
||||||
|
|
||||||
outmsg.Write(GameMain.NetLobbyScreen.LastUpdateID);
|
outmsg.Write(GameMain.NetLobbyScreen.LastUpdateID);
|
||||||
outmsg.Write(GameMain.NetLobbyScreen.GetServerName());
|
outmsg.Write(GameMain.NetLobbyScreen.GetServerName());
|
||||||
outmsg.Write(GameMain.NetLobbyScreen.ServerMessage.Text);
|
outmsg.Write(GameMain.NetLobbyScreen.ServerMessage.Text);
|
||||||
var subList = GameMain.NetLobbyScreen.GetSubList();
|
var subList = GameMain.NetLobbyScreen.GetSubList();
|
||||||
|
|
||||||
|
outmsg.Write(c.lastRecvGeneralUpdate < 1);
|
||||||
if (c.lastRecvGeneralUpdate < 1)
|
if (c.lastRecvGeneralUpdate < 1)
|
||||||
{
|
{
|
||||||
|
outmsg.Write(c.ID);
|
||||||
|
|
||||||
outmsg.Write((UInt16)subList.Count);
|
outmsg.Write((UInt16)subList.Count);
|
||||||
for (int i = 0; i < subList.Count; i++)
|
for (int i = 0; i < subList.Count; i++)
|
||||||
{
|
{
|
||||||
@@ -730,10 +735,6 @@ namespace Barotrauma.Networking
|
|||||||
outmsg.Write(subList[i].MD5Hash.ToString());
|
outmsg.Write(subList[i].MD5Hash.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
outmsg.Write((UInt16)0);
|
|
||||||
}
|
|
||||||
outmsg.Write((GameMain.NetLobbyScreen.SubList.SelectedData as Submarine).Name);
|
outmsg.Write((GameMain.NetLobbyScreen.SubList.SelectedData as Submarine).Name);
|
||||||
outmsg.Write((GameMain.NetLobbyScreen.SubList.SelectedData as Submarine).MD5Hash.ToString());
|
outmsg.Write((GameMain.NetLobbyScreen.SubList.SelectedData as Submarine).MD5Hash.ToString());
|
||||||
outmsg.Write((GameMain.NetLobbyScreen.ShuttleList.SelectedData as Submarine).Name);
|
outmsg.Write((GameMain.NetLobbyScreen.ShuttleList.SelectedData as Submarine).Name);
|
||||||
@@ -1009,9 +1010,7 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
msg.Write(AllowRespawn && missionAllowRespawn);
|
msg.Write(AllowRespawn && missionAllowRespawn);
|
||||||
msg.Write(Submarine.MainSubs[1] != null); //loadSecondSub
|
msg.Write(Submarine.MainSubs[1] != null); //loadSecondSub
|
||||||
|
|
||||||
msg.Write(client.Character.ID);
|
|
||||||
|
|
||||||
server.SendMessage(msg, client.Connection, NetDeliveryMethod.ReliableUnordered);
|
server.SendMessage(msg, client.Connection, NetDeliveryMethod.ReliableUnordered);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user