From 8964c0df5c73da6d3fac1a18ba56173aebe73b70 Mon Sep 17 00:00:00 2001 From: Regalis Date: Thu, 13 Apr 2017 00:35:36 +0300 Subject: [PATCH] Syncing character skill levels --- .../Source/Characters/CharacterNetworking.cs | 50 +++++++++++++++---- Subsurface/Source/Characters/Jobs/Skill.cs | 1 + 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/Subsurface/Source/Characters/CharacterNetworking.cs b/Subsurface/Source/Characters/CharacterNetworking.cs index e0b5e91d1..b5d8aad79 100644 --- a/Subsurface/Source/Characters/CharacterNetworking.cs +++ b/Subsurface/Source/Characters/CharacterNetworking.cs @@ -715,7 +715,19 @@ namespace Barotrauma msg.Write(this is AICharacter); msg.Write(Info.Gender == Gender.Female); msg.Write((byte)Info.HeadSpriteId); - msg.Write(Info.Job == null ? "" : Info.Job.Name); + if (info.Job != null) + { + msg.Write(Info.Job.Name); + msg.Write((byte)info.Job.Skills.Count); + foreach (Skill skill in info.Job.Skills) + { + msg.WriteRangedInteger(0, 100, MathHelper.Clamp(skill.Level, 0, 100)); + } + } + else + { + msg.Write(""); + } } public static Character ReadSpawnData(NetBuffer inc, bool spawn = true) @@ -746,22 +758,42 @@ namespace Barotrauma int ownerId = hasOwner ? inc.ReadByte() : -1; - string newName = inc.ReadString(); - byte teamID = inc.ReadByte(); + string newName = inc.ReadString(); + byte teamID = inc.ReadByte(); - bool hasAi = inc.ReadBoolean(); - bool isFemale = inc.ReadBoolean(); - int headSpriteID = inc.ReadByte(); - string jobName = inc.ReadString(); + bool hasAi = inc.ReadBoolean(); + bool isFemale = inc.ReadBoolean(); + int headSpriteID = inc.ReadByte(); + string jobName = inc.ReadString(); + + JobPrefab jobPrefab = null; + List skillLevels = new List(); + if (!string.IsNullOrEmpty(jobName)) + { + jobPrefab = JobPrefab.List.Find(jp => jp.Name == jobName); + int skillCount = inc.ReadByte(); + for (int i = 0; i < skillCount; i++) + { + skillLevels.Add(inc.ReadRangedInteger(0, 100)); + } + } if (!spawn) return null; - JobPrefab jobPrefab = JobPrefab.List.Find(jp => jp.Name == jobName); CharacterInfo ch = new CharacterInfo(configPath, newName, isFemale ? Gender.Female : Gender.Male, jobPrefab); ch.HeadSpriteId = headSpriteID; - character = Character.Create(configPath, position, ch, GameMain.Client.ID != ownerId, hasAi); + System.Diagnostics.Debug.Assert(skillLevels.Count == ch.Job.Skills.Count); + if (ch.Job != null) + { + for (int i = 0; i < skillLevels.Count && i < ch.Job.Skills.Count; i++) + { + ch.Job.Skills[i].Level = skillLevels[i]; + } + } + + character = Create(configPath, position, ch, GameMain.Client.ID != ownerId, hasAi); character.ID = id; character.TeamID = teamID; diff --git a/Subsurface/Source/Characters/Jobs/Skill.cs b/Subsurface/Source/Characters/Jobs/Skill.cs index 3248bb623..30a6cf195 100644 --- a/Subsurface/Source/Characters/Jobs/Skill.cs +++ b/Subsurface/Source/Characters/Jobs/Skill.cs @@ -23,6 +23,7 @@ namespace Barotrauma public int Level { get { return level; } + set { level = MathHelper.Clamp(value, 0, 100); } } public Skill(SkillPrefab prefab)