public void ServerReadCrew(IReadMessage msg, Client sender) { int[] pendingHires = null; bool updatePending = msg.ReadBoolean(); if (updatePending) { ushort pendingHireLength = msg.ReadUInt16(); pendingHires = new int[pendingHireLength]; for (int i = 0; i < pendingHireLength; i++) { pendingHires[i] = msg.ReadInt32(); } } bool validateHires = msg.ReadBoolean(); bool renameCharacter = msg.ReadBoolean(); int renamedIdentifier = -1; string newName = null; bool existingCrewMember = false; if (renameCharacter) { renamedIdentifier = msg.ReadInt32(); newName = msg.ReadString(); existingCrewMember = msg.ReadBoolean(); } bool fireCharacter = msg.ReadBoolean(); int firedIdentifier = -1; if (fireCharacter) { firedIdentifier = msg.ReadInt32(); } Location location = map?.CurrentLocation; List <CharacterInfo> hiredCharacters = new List <CharacterInfo>(); CharacterInfo firedCharacter = null; if (location != null && AllowedToManageCampaign(sender)) { if (fireCharacter) { firedCharacter = CrewManager.CharacterInfos.FirstOrDefault(info => info.GetIdentifier() == firedIdentifier); if (firedCharacter != null && (firedCharacter.Character?.IsBot ?? true)) { CrewManager.FireCharacter(firedCharacter); } else { DebugConsole.ThrowError($"Tried to fire an invalid character ({firedIdentifier})"); } } if (renameCharacter) { CharacterInfo characterInfo = null; if (existingCrewMember && CrewManager != null) { characterInfo = CrewManager.CharacterInfos.FirstOrDefault(info => info.GetIdentifierUsingOriginalName() == renamedIdentifier); } else if (!existingCrewMember && location.HireManager != null) { characterInfo = location.HireManager.AvailableCharacters.FirstOrDefault(info => info.GetIdentifierUsingOriginalName() == renamedIdentifier); } if (characterInfo != null && (characterInfo.Character?.IsBot ?? true)) { if (existingCrewMember) { CrewManager.RenameCharacter(characterInfo, newName); } else { location.HireManager.RenameCharacter(characterInfo, newName); } } else { DebugConsole.ThrowError($"Tried to rename an invalid character ({renamedIdentifier})"); } } if (location.HireManager != null) { if (validateHires) { foreach (CharacterInfo hireInfo in location.HireManager.PendingHires) { if (TryHireCharacter(location, hireInfo)) { hiredCharacters.Add(hireInfo); } ; } } if (updatePending) { List <CharacterInfo> pendingHireInfos = new List <CharacterInfo>(); foreach (int identifier in pendingHires) { CharacterInfo match = location.GetHireableCharacters().FirstOrDefault(info => info.GetIdentifierUsingOriginalName() == identifier); if (match == null) { DebugConsole.ThrowError($"Tried to add a character that doesn't exist ({identifier}) to pending hires"); continue; } pendingHireInfos.Add(match); if (pendingHireInfos.Count + CrewManager.CharacterInfos.Count() >= CrewManager.MaxCrewSize) { break; } } location.HireManager.PendingHires = pendingHireInfos; } location.HireManager.AvailableCharacters.ForEachMod(info => { if (!location.HireManager.PendingHires.Contains(info)) { location.HireManager.RenameCharacter(info, info.OriginalName); } }); } } // bounce back if (renameCharacter && existingCrewMember) { SendCrewState(hiredCharacters, (renamedIdentifier, newName), firedCharacter); } else { SendCrewState(hiredCharacters, default, firedCharacter);
public void ClientReadCrew(IReadMessage msg) { ushort availableHireLength = msg.ReadUInt16(); List <CharacterInfo> availableHires = new List <CharacterInfo>(); for (int i = 0; i < availableHireLength; i++) { CharacterInfo hire = CharacterInfo.ClientRead("human", msg); hire.Salary = msg.ReadInt32(); availableHires.Add(hire); } ushort pendingHireLength = msg.ReadUInt16(); List <int> pendingHires = new List <int>(); for (int i = 0; i < pendingHireLength; i++) { pendingHires.Add(msg.ReadInt32()); } ushort hiredLength = msg.ReadUInt16(); List <CharacterInfo> hiredCharacters = new List <CharacterInfo>(); for (int i = 0; i < hiredLength; i++) { CharacterInfo hired = CharacterInfo.ClientRead("human", msg); hired.Salary = msg.ReadInt32(); hiredCharacters.Add(hired); } bool renameCrewMember = msg.ReadBoolean(); if (renameCrewMember) { int renamedIdentifier = msg.ReadInt32(); string newName = msg.ReadString(); CharacterInfo renamedCharacter = CrewManager.CharacterInfos.FirstOrDefault(info => info.GetIdentifierUsingOriginalName() == renamedIdentifier); if (renamedCharacter != null) { CrewManager.RenameCharacter(renamedCharacter, newName); } } bool fireCharacter = msg.ReadBoolean(); if (fireCharacter) { int firedIdentifier = msg.ReadInt32(); CharacterInfo firedCharacter = CrewManager.CharacterInfos.FirstOrDefault(info => info.GetIdentifier() == firedIdentifier); // this one might and is allowed to be null since the character is already fired on the original sender's game if (firedCharacter != null) { CrewManager.FireCharacter(firedCharacter); } } if (map?.CurrentLocation?.HireManager != null && CampaignUI?.CrewManagement != null) { CampaignUI.CrewManagement.SetHireables(map.CurrentLocation, availableHires); if (hiredCharacters.Any()) { CampaignUI.CrewManagement.ValidateHires(hiredCharacters); } CampaignUI.CrewManagement.SetPendingHires(pendingHires, map.CurrentLocation); if (renameCrewMember || fireCharacter) { CampaignUI.CrewManagement.UpdateCrew(); } } }