Spawning client characters with correct characterinfo

This commit is contained in:
Regalis
2016-09-26 17:06:20 +03:00
parent 02d98f5d29
commit c402ba208b
2 changed files with 54 additions and 6 deletions
+19 -4
View File
@@ -534,6 +534,8 @@ namespace Barotrauma.Networking
GameMain.NetLobbyScreen.TrySelectSub(subName, subHash, GameMain.NetLobbyScreen.SubList) && GameMain.NetLobbyScreen.TrySelectSub(subName, subHash, GameMain.NetLobbyScreen.SubList) &&
GameMain.NetLobbyScreen.TrySelectSub(shuttleName, shuttleHash, GameMain.NetLobbyScreen.ShuttleList.ListBox)); GameMain.NetLobbyScreen.TrySelectSub(shuttleName, shuttleHash, GameMain.NetLobbyScreen.ShuttleList.ListBox));
WriteCharacterInfo(readyToStartMsg);
client.SendMessage(readyToStartMsg, NetDeliveryMethod.ReliableUnordered); client.SendMessage(readyToStartMsg, NetDeliveryMethod.ReliableUnordered);
break; break;
@@ -602,7 +604,7 @@ namespace Barotrauma.Networking
GameMain.GameScreen.Select(); GameMain.GameScreen.Select();
DebugConsole.NewMessage(Convert.ToString(posX) + "," + Convert.ToString(posY), Color.Lime); DebugConsole.NewMessage(Convert.ToString(posX) + "," + Convert.ToString(posY), Color.Lime);
Character myChar = Character.Create(Character.HumanConfigFile, new Vector2(posX, posY), null, true, false); Character myChar = Character.Create(Character.HumanConfigFile, new Vector2(posX, posY), characterInfo, true, false);
Character.Controlled = myChar; Character.Controlled = myChar;
yield return CoroutineStatus.Success; yield return CoroutineStatus.Success;
@@ -800,18 +802,31 @@ namespace Barotrauma.Networking
{ {
spriteBatch.DrawString(GUI.Font, "Disconnected", new Vector2(x + 10, y + 25), Color.White); spriteBatch.DrawString(GUI.Font, "Disconnected", new Vector2(x + 10, y + 25), Color.White);
} }
} }
public override void Disconnect() public override void Disconnect()
{ {
//TODO: tell server
client.Shutdown(""); client.Shutdown("");
GameMain.NetworkMember = null; GameMain.NetworkMember = null;
} }
public void WriteCharacterInfo(NetOutgoingMessage msg)
{
if (characterInfo == null) return;
msg.Write(characterInfo.Gender == Gender.Male);
msg.Write((byte)characterInfo.HeadSpriteId);
var jobPreferences = GameMain.NetLobbyScreen.JobPreferences;
int count = Math.Min(jobPreferences.Count, 3);
msg.Write((byte)count);
for (int i = 0; i < count; i++)
{
msg.Write(jobPreferences[i].Name);
}
}
public override bool SelectCrewCharacter(GUIComponent component, object obj) public override bool SelectCrewCharacter(GUIComponent component, object obj)
{ {
+35 -2
View File
@@ -499,6 +499,7 @@ namespace Barotrauma.Networking
if (connectedClient != null) if (connectedClient != null)
{ {
connectedClient.ReadyToStart = inc.ReadBoolean(); connectedClient.ReadyToStart = inc.ReadBoolean();
UpdateCharacterInfo(inc, connectedClient);
} }
break; break;
case ClientPacketHeader.UPDATE_LOBBY: case ClientPacketHeader.UPDATE_LOBBY:
@@ -848,7 +849,7 @@ namespace Barotrauma.Networking
Vector2 spawnPosition = spawnPoint.WorldPosition; Vector2 spawnPosition = spawnPoint.WorldPosition;
DebugConsole.NewMessage(Convert.ToString(spawnPosition.X) + "," + Convert.ToString(spawnPosition.Y), Color.Lime); DebugConsole.NewMessage(Convert.ToString(spawnPosition.X) + "," + Convert.ToString(spawnPosition.Y), Color.Lime);
Character spawnedCharacter = Character.Create(Character.HumanConfigFile, spawnPosition, null, true, false); Character spawnedCharacter = Character.Create(Character.HumanConfigFile, spawnPosition, c.characterInfo, true, false);
spawnedCharacter.AnimController.Frozen = true; spawnedCharacter.AnimController.Frozen = true;
c.Character = spawnedCharacter; c.Character = spawnedCharacter;
@@ -907,7 +908,7 @@ namespace Barotrauma.Networking
msg.Write(c.Character.WorldPosition.X); msg.Write(c.Character.WorldPosition.X);
msg.Write(c.Character.WorldPosition.Y); msg.Write(c.Character.WorldPosition.Y);
c.Connection.SendMessage(msg, NetDeliveryMethod.ReliableUnordered,0); c.Connection.SendMessage(msg, NetDeliveryMethod.ReliableUnordered,0);
} }
} }
@@ -1233,6 +1234,38 @@ namespace Barotrauma.Networking
return true; return true;
} }
private void UpdateCharacterInfo(NetIncomingMessage message, Client sender)
{
Gender gender = Gender.Male;
int headSpriteId = 0;
try
{
gender = message.ReadBoolean() ? Gender.Male : Gender.Female;
headSpriteId = message.ReadByte();
}
catch (Exception e)
{
gender = Gender.Male;
headSpriteId = 0;
DebugConsole.Log("Received invalid characterinfo from \"" +sender.name+"\"! { "+e.Message+" }");
}
List<JobPrefab> jobPreferences = new List<JobPrefab>();
int count = message.ReadByte();
for (int i = 0; i < Math.Min(count, 3); i++)
{
string jobName = message.ReadString();
JobPrefab jobPrefab = JobPrefab.List.Find(jp => jp.Name == jobName);
if (jobPrefab != null) jobPreferences.Add(jobPrefab);
}
sender.characterInfo = new CharacterInfo(Character.HumanConfigFile, name, gender);
sender.characterInfo.HeadSpriteId = headSpriteId;
sender.jobPreferences = jobPreferences;
}
public void AssignJobs(List<Client> unassigned) public void AssignJobs(List<Client> unassigned)
{ {