Merge remote-tracking branch 'upstream/master' into develop
This commit is contained in:
@@ -525,6 +525,7 @@ namespace Barotrauma
|
||||
ushort infoID = inc.ReadUInt16();
|
||||
string newName = inc.ReadString();
|
||||
string originalName = inc.ReadString();
|
||||
bool renamingEnabled = inc.ReadBoolean();
|
||||
int tagCount = inc.ReadByte();
|
||||
HashSet<Identifier> tagSet = new HashSet<Identifier>();
|
||||
for (int i = 0; i < tagCount; i++)
|
||||
@@ -538,7 +539,8 @@ namespace Barotrauma
|
||||
Color skinColor = inc.ReadColorR8G8B8();
|
||||
Color hairColor = inc.ReadColorR8G8B8();
|
||||
Color facialHairColor = inc.ReadColorR8G8B8();
|
||||
|
||||
|
||||
|
||||
Identifier npcId = inc.ReadIdentifier();
|
||||
|
||||
Identifier factionId = inc.ReadIdentifier();
|
||||
@@ -571,7 +573,8 @@ namespace Barotrauma
|
||||
CharacterInfo ch = new CharacterInfo(speciesName, newName, originalName, jobPrefab, variant, npcIdentifier: npcId)
|
||||
{
|
||||
ID = infoID,
|
||||
MinReputationToHire = (factionId, minReputationToHire)
|
||||
MinReputationToHire = (factionId, minReputationToHire),
|
||||
RenamingEnabled = renamingEnabled
|
||||
};
|
||||
ch.RecreateHead(tagSet.ToImmutableHashSet(), hairIndex, beardIndex, moustacheIndex, faceAttachmentIndex);
|
||||
ch.Head.SkinColor = skinColor;
|
||||
|
||||
@@ -357,6 +357,7 @@ namespace Barotrauma
|
||||
case EventType.Control:
|
||||
bool myCharacter = msg.ReadBoolean();
|
||||
byte ownerID = msg.ReadByte();
|
||||
bool renamingEnabled = msg.ReadBoolean();
|
||||
ResetNetState();
|
||||
if (myCharacter)
|
||||
{
|
||||
@@ -385,6 +386,10 @@ namespace Barotrauma
|
||||
}
|
||||
IsRemotePlayer = ownerID > 0;
|
||||
}
|
||||
if (info != null)
|
||||
{
|
||||
info.RenamingEnabled = renamingEnabled;
|
||||
}
|
||||
break;
|
||||
case EventType.Status:
|
||||
ReadStatus(msg);
|
||||
|
||||
@@ -427,7 +427,7 @@ internal class DeathPrompt
|
||||
var botList = new GUIListBox(new RectTransform(new Vector2(1.0f, 0.9f), content.RectTransform));
|
||||
foreach (CharacterInfo c in GetAvailableBots())
|
||||
{
|
||||
var characterFrame = campaign.CampaignUI?.CrewManagement.CreateCharacterFrame(c, botList, hideSalary: true);
|
||||
var characterFrame = campaign.CampaignUI?.HRManagerUI.CreateCharacterFrame(c, botList, hideSalary: true);
|
||||
if (characterFrame != null)
|
||||
{
|
||||
characterFrame.UserData = c;
|
||||
|
||||
+53
-27
@@ -8,13 +8,16 @@ using PlayerBalanceElement = Barotrauma.CampaignUI.PlayerBalanceElement;
|
||||
|
||||
namespace Barotrauma
|
||||
{
|
||||
class CrewManagement
|
||||
/// <summary>
|
||||
/// The "HR manager" UI, which is used to hire/fire characters and rename crewmates.
|
||||
/// </summary>
|
||||
class HRManagerUI
|
||||
{
|
||||
private CampaignMode campaign => campaignUI.Campaign;
|
||||
private readonly CampaignUI campaignUI;
|
||||
private readonly GUIComponent parentComponent;
|
||||
|
||||
private GUILayoutGroup pendingAndCrewGroup;
|
||||
private GUIComponent pendingAndCrewPanel;
|
||||
private GUIListBox hireableList, pendingList, crewList;
|
||||
private GUIFrame characterPreviewFrame;
|
||||
private GUIDropDown sortingDropDown;
|
||||
@@ -25,14 +28,21 @@ namespace Barotrauma
|
||||
private PlayerBalanceElement? playerBalanceElement;
|
||||
|
||||
private List<CharacterInfo> PendingHires => campaign.Map?.CurrentLocation?.HireManager?.PendingHires;
|
||||
|
||||
// Is the player hiring a new character for themselves instead of bots for the crew?
|
||||
// The window can only be used for one of these purposes at the same time.
|
||||
private static bool HiringNewCharacter => GameMain.NetworkMember?.ServerSettings is { RespawnMode: RespawnMode.Permadeath, IronmanMode: false } &&
|
||||
GameMain.Client?.CharacterInfo is { PermanentlyDead: true };
|
||||
|
||||
private static bool HasPermissionToHire => CampaignMode.AllowedToManageCampaign(
|
||||
HiringNewCharacter ? ClientPermissions.ManageMoney : ClientPermissions.ManageHires);
|
||||
|
||||
private bool wasReplacingPermanentlyDeadCharacter;
|
||||
/// <summary>
|
||||
/// Is the player hiring a new character for themselves instead of bots for the crew?
|
||||
/// The window can only be used for one of these purposes at the same time.
|
||||
/// </summary>
|
||||
private static bool ReplacingPermanentlyDeadCharacter =>
|
||||
GameMain.NetworkMember?.ServerSettings is { RespawnMode: RespawnMode.Permadeath, IronmanMode: false } &&
|
||||
GameMain.Client?.CharacterInfo is { PermanentlyDead: true };
|
||||
|
||||
private bool hadPermissionToHire;
|
||||
private static bool HasPermissionToHire => ReplacingPermanentlyDeadCharacter ?
|
||||
GameMain.NetworkMember?.ServerSettings.ReplaceCostPercentage <= 0 || CampaignMode.AllowedToManageCampaign(ClientPermissions.ManageMoney) || CampaignMode.AllowedToManageCampaign(ClientPermissions.ManageHires) :
|
||||
CampaignMode.AllowedToManageCampaign(ClientPermissions.ManageHires);
|
||||
|
||||
private Point resolutionWhenCreated;
|
||||
|
||||
@@ -48,7 +58,7 @@ namespace Barotrauma
|
||||
SkillDesc
|
||||
}
|
||||
|
||||
public CrewManagement(CampaignUI campaignUI, GUIComponent parentComponent)
|
||||
public HRManagerUI(CampaignUI campaignUI, GUIComponent parentComponent)
|
||||
{
|
||||
this.campaignUI = campaignUI;
|
||||
this.parentComponent = parentComponent;
|
||||
@@ -61,14 +71,19 @@ namespace Barotrauma
|
||||
(locationChangeInfo) => UpdateLocationView(locationChangeInfo.NewLocation, true, locationChangeInfo.PrevLocation));
|
||||
Reputation.OnAnyReputationValueChanged.RegisterOverwriteExisting(
|
||||
"CrewManagement.UpdateLocationView".ToIdentifier(), _ => needsHireableRefresh = true);
|
||||
|
||||
hadPermissionToHire = HasPermissionToHire;
|
||||
wasReplacingPermanentlyDeadCharacter = ReplacingPermanentlyDeadCharacter;
|
||||
}
|
||||
|
||||
public void RefreshPermissions()
|
||||
public void RefreshUI()
|
||||
{
|
||||
RefreshCrewFrames(hireableList);
|
||||
RefreshCrewFrames(crewList);
|
||||
RefreshCrewFrames(pendingList);
|
||||
if (clearAllButton != null) { clearAllButton.Enabled = HasPermissionToHire; }
|
||||
hadPermissionToHire = HasPermissionToHire;
|
||||
wasReplacingPermanentlyDeadCharacter = ReplacingPermanentlyDeadCharacter;
|
||||
}
|
||||
|
||||
private void RefreshCrewFrames(GUIListBox listBox)
|
||||
@@ -80,8 +95,11 @@ namespace Barotrauma
|
||||
if (child.FindChild(c => c is GUIButton && c.UserData is CharacterInfo, true) is GUIButton buyButton)
|
||||
{
|
||||
CharacterInfo characterInfo = buyButton.UserData as CharacterInfo;
|
||||
bool enougMoneyToHire = !HiringNewCharacter || campaign.CanAfford(HireManager.GetSalaryFor(characterInfo));
|
||||
buyButton.Enabled = HasPermissionToHire && EnoughReputationToHire(characterInfo) && enougMoneyToHire;
|
||||
buyButton.Enabled =
|
||||
//"normal buying" is disabled when replacing a dead character
|
||||
!ReplacingPermanentlyDeadCharacter &&
|
||||
HasPermissionToHire &&
|
||||
EnoughReputationToHire(characterInfo) && campaign.CanAffordNewCharacter(characterInfo);
|
||||
foreach (GUITextBlock text in child.GetAllChildren<GUITextBlock>())
|
||||
{
|
||||
text.TextColor = new Color(text.TextColor, buyButton.Enabled ? 1.0f : 0.6f);
|
||||
@@ -182,11 +200,13 @@ namespace Barotrauma
|
||||
|
||||
playerBalanceElement = CampaignUI.AddBalanceElement(pendingAndCrewMainGroup, new Vector2(1.0f, 0.75f / 14.0f));
|
||||
|
||||
pendingAndCrewGroup = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.95f), anchor: Anchor.Center,
|
||||
parent: new GUIFrame(new RectTransform(new Vector2(1.0f, 13.25f / 14.0f), pendingAndCrewMainGroup.RectTransform)
|
||||
{
|
||||
MaxSize = new Point(panelMaxWidth, campaignUI.GetTabContainer(CampaignMode.InteractionType.Crew).Rect.Height)
|
||||
}).RectTransform));
|
||||
pendingAndCrewPanel = new GUIFrame(new RectTransform(new Vector2(1.0f, 13.25f / 14.0f), pendingAndCrewMainGroup.RectTransform)
|
||||
{
|
||||
MaxSize = new Point(panelMaxWidth, campaignUI.GetTabContainer(CampaignMode.InteractionType.Crew).Rect.Height)
|
||||
});
|
||||
|
||||
var pendingAndCrewGroup = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.95f), anchor: Anchor.Center,
|
||||
parent: pendingAndCrewPanel.RectTransform));
|
||||
|
||||
float height = 0.05f;
|
||||
new GUITextBlock(new RectTransform(new Vector2(1.0f, height), pendingAndCrewGroup.RectTransform), TextManager.Get("campaigncrew.pending"), font: GUIStyle.SubHeadingFont);
|
||||
@@ -456,7 +476,7 @@ namespace Barotrauma
|
||||
if (listBox != crewList)
|
||||
{
|
||||
new GUITextBlock(new RectTransform(new Vector2(width, 1.0f), mainGroup.RectTransform),
|
||||
TextManager.FormatCurrency(HireManager.GetSalaryFor(characterInfo)),
|
||||
TextManager.FormatCurrency(ReplacingPermanentlyDeadCharacter ? campaign.NewCharacterCost(characterInfo) : HireManager.GetSalaryFor(characterInfo)),
|
||||
textAlignment: Alignment.Center)
|
||||
{
|
||||
CanBeFocused = false
|
||||
@@ -476,12 +496,12 @@ namespace Barotrauma
|
||||
ToolTip = TextManager.Get("hirebutton"),
|
||||
ClickSound = GUISoundType.Cart,
|
||||
UserData = characterInfo,
|
||||
Enabled = CanHire(characterInfo) && !HiringNewCharacter,
|
||||
Enabled = CanHire(characterInfo) && !ReplacingPermanentlyDeadCharacter,
|
||||
OnClicked = (b, o) => AddPendingHire(o as CharacterInfo)
|
||||
};
|
||||
hireButton.OnAddedToGUIUpdateList += (GUIComponent btn) =>
|
||||
{
|
||||
if (HiringNewCharacter)
|
||||
if (ReplacingPermanentlyDeadCharacter)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -500,9 +520,9 @@ namespace Barotrauma
|
||||
}
|
||||
};
|
||||
|
||||
if (HiringNewCharacter)
|
||||
if (ReplacingPermanentlyDeadCharacter)
|
||||
{
|
||||
bool canHire = CanHire(characterInfo) && campaign.CanAfford(HireManager.GetSalaryFor(characterInfo));
|
||||
bool canHire = CanHire(characterInfo) && campaign.CanAffordNewCharacter(characterInfo);
|
||||
var takeoverButton = new GUIButton(new RectTransform(new Vector2(width, 0.9f), mainGroup.RectTransform), style: "CrewManagementTakeControlButton")
|
||||
{
|
||||
ToolTip = canHire ? TextManager.Get("hireandtakecontrol") : TextManager.Get("hireandtakecontroldisabled"),
|
||||
@@ -516,7 +536,7 @@ namespace Barotrauma
|
||||
return false;
|
||||
}
|
||||
Client client = gameClient.ConnectedClients.FirstOrDefault(c => c.SessionId == gameClient.SessionId);
|
||||
if (!campaign.TryPurchase(client, HireManager.GetSalaryFor(characterInfo)))
|
||||
if (!campaign.TryPurchase(client, campaign.NewCharacterCost(characterInfo)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -528,7 +548,7 @@ namespace Barotrauma
|
||||
};
|
||||
takeoverButton.OnAddedToGUIUpdateList += (GUIComponent btn) =>
|
||||
{
|
||||
bool canHireCurrently = HiringNewCharacter && CanHire(characterInfo) && campaign.CanAfford(HireManager.GetSalaryFor(characterInfo));
|
||||
bool canHireCurrently = ReplacingPermanentlyDeadCharacter && CanHire(characterInfo) && campaign.CanAffordNewCharacter(characterInfo);
|
||||
btn.ToolTip = TextManager.Get(canHireCurrently ? "hireandtakecontrol" : "hireandtakecontroldisabled");
|
||||
btn.Visible = GameMain.GameSession is { AllowHrManagerBotTakeover: true };
|
||||
btn.Enabled = canHireCurrently;
|
||||
@@ -931,9 +951,15 @@ namespace Barotrauma
|
||||
{
|
||||
playerBalanceElement = CampaignUI.UpdateBalanceElement(playerBalanceElement);
|
||||
}
|
||||
|
||||
|
||||
// When showing this window to someone hiring a new character, the right side panels aren't needed
|
||||
pendingAndCrewGroup.Visible = !HiringNewCharacter;
|
||||
pendingAndCrewPanel.Visible = !ReplacingPermanentlyDeadCharacter;
|
||||
|
||||
if (hadPermissionToHire != HasPermissionToHire ||
|
||||
wasReplacingPermanentlyDeadCharacter != ReplacingPermanentlyDeadCharacter)
|
||||
{
|
||||
RefreshUI();
|
||||
}
|
||||
|
||||
if (needsHireableRefresh)
|
||||
{
|
||||
@@ -1,4 +1,4 @@
|
||||
#nullable enable
|
||||
#nullable enable
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@@ -71,7 +71,9 @@ namespace Barotrauma
|
||||
private HashSet<Identifier> selectedTalents = new HashSet<Identifier>();
|
||||
|
||||
private readonly Queue<Identifier> showCaseClosureQueue = new();
|
||||
|
||||
|
||||
private GUITextBlock? nameBlock;
|
||||
private GUIButton? renameButton;
|
||||
private GUIListBox? skillListBox;
|
||||
private GUITextBlock? talentPointText;
|
||||
private GUIProgressBar? experienceBar;
|
||||
@@ -134,7 +136,6 @@ namespace Barotrauma
|
||||
GUILayoutGroup playerFrame = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.9f), containerFrame.RectTransform, Anchor.TopCenter));
|
||||
GameMain.NetLobbyScreen.CreatePlayerFrame(playerFrame, alwaysAllowEditing: true, createPendingText: false);
|
||||
|
||||
// TODO: What is CampaignCharacterDiscarded and can it be relevant in permadeath mode?
|
||||
if (!GameMain.NetLobbyScreen.PermadeathMode)
|
||||
{
|
||||
GUIButton newCharacterBox = new GUIButton(new RectTransform(new Vector2(0.5f, 0.2f), skillLayout.RectTransform, Anchor.BottomRight),
|
||||
@@ -174,6 +175,25 @@ namespace Barotrauma
|
||||
}
|
||||
};
|
||||
}
|
||||
else if (characterInfo != null)
|
||||
{
|
||||
renameButton = new GUIButton(new RectTransform(new Vector2(0.5f, 0.2f), skillLayout.RectTransform, Anchor.BottomRight),
|
||||
text: TextManager.Get("button.RenameCharacter"), style: "GUIButtonSmall")
|
||||
{
|
||||
Enabled = characterInfo.RenamingEnabled,
|
||||
ToolTip = TextManager.Get("permadeath.rename.description"),
|
||||
IgnoreLayoutGroups = false,
|
||||
TextBlock =
|
||||
{
|
||||
AutoScaleHorizontal = true
|
||||
},
|
||||
OnClicked = (_, _) =>
|
||||
{
|
||||
CreateRenamePopup();
|
||||
return true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
GUILayoutGroup characterCloseButtonLayout = new GUILayoutGroup(new RectTransform(new Vector2(1f, 0.1f), characterLayout.RectTransform), childAnchor: Anchor.BottomCenter);
|
||||
new GUIButton(new RectTransform(new Vector2(0.4f, 1f), characterCloseButtonLayout.RectTransform), TextManager.Get("ApplySettingsButton")) //TODO: Is this text appropriate for this circumstance for all languages?
|
||||
@@ -189,6 +209,57 @@ namespace Barotrauma
|
||||
};
|
||||
}
|
||||
|
||||
private void CreateRenamePopup()
|
||||
{
|
||||
GUIMessageBox renamePopup = new(
|
||||
TextManager.Get("button.RenameCharacter"), TextManager.Get("permadeath.rename.description"),
|
||||
new LocalizedString[] { TextManager.Get("Confirm"), TextManager.Get("Cancel") }, minSize: new Point(0, GUI.IntScale(230)));
|
||||
GUITextBox newNameBox = new(new(Vector2.One, renamePopup.Content.RectTransform), "")
|
||||
{
|
||||
OnEnterPressed = (textBox, text) =>
|
||||
{
|
||||
textBox.Text = text.Trim();
|
||||
return true;
|
||||
}
|
||||
};
|
||||
renamePopup.Buttons[0].OnClicked += (_, _) =>
|
||||
{
|
||||
if (newNameBox.Text?.Trim() is string newName && newName != "")
|
||||
{
|
||||
if (characterInfo != null)
|
||||
{
|
||||
if (newNameBox.Text == characterInfo.Name)
|
||||
{
|
||||
renamePopup.Close();
|
||||
return true;
|
||||
}
|
||||
if (GameMain.GameSession?.Campaign?.CampaignUI?.HRManagerUI is { } crewManagement)
|
||||
{
|
||||
crewManagement.RenameCharacter(characterInfo, newName);
|
||||
if (nameBlock != null)
|
||||
{
|
||||
nameBlock.Text = newName;
|
||||
}
|
||||
if (renameButton != null)
|
||||
{
|
||||
renameButton.Enabled = false;
|
||||
}
|
||||
renamePopup.Close();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
DebugConsole.ThrowError("Tried to rename character, but CharacterInfo completely missing!");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
newNameBox.Flash();
|
||||
return false;
|
||||
}
|
||||
};
|
||||
renamePopup.Buttons[1].OnClicked += renamePopup.Close;
|
||||
}
|
||||
|
||||
private void CreateStatPanel(GUIComponent parent, CharacterInfo info)
|
||||
{
|
||||
Job job = info.Job;
|
||||
@@ -206,7 +277,7 @@ namespace Barotrauma
|
||||
CanBeFocused = true
|
||||
};
|
||||
|
||||
GUITextBlock nameBlock = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), nameLayout.RectTransform), info.Name, font: GUIStyle.SubHeadingFont);
|
||||
nameBlock = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), nameLayout.RectTransform), info.Name, font: GUIStyle.SubHeadingFont);
|
||||
|
||||
if (!info.OmitJobInMenus)
|
||||
{
|
||||
|
||||
@@ -522,6 +522,11 @@ namespace Barotrauma
|
||||
}
|
||||
}
|
||||
|
||||
if (GameMain.GameSession?.Campaign?.CampaignUI?.HRManagerUI is { } crewManagement)
|
||||
{
|
||||
crewManagement.RefreshUI();
|
||||
}
|
||||
|
||||
return background;
|
||||
}
|
||||
|
||||
@@ -532,6 +537,10 @@ namespace Barotrauma
|
||||
crewList.RemoveChild(component);
|
||||
traitorButtons.RemoveAll(t => t.IsChildOf(component, recursive: true));
|
||||
}
|
||||
if (GameMain.GameSession?.Campaign?.CampaignUI?.HRManagerUI is { } crewManagement)
|
||||
{
|
||||
crewManagement.RefreshUI();
|
||||
}
|
||||
}
|
||||
|
||||
private static void SetCharacterComponentTooltip(GUIComponent characterComponent)
|
||||
|
||||
@@ -344,18 +344,6 @@ namespace Barotrauma
|
||||
}
|
||||
}
|
||||
|
||||
protected SubmarineInfo GetPredefinedStartOutpost()
|
||||
{
|
||||
if (Map?.CurrentLocation?.Type?.GetForcedOutpostGenerationParams() is OutpostGenerationParams parameters && !parameters.OutpostFilePath.IsNullOrEmpty())
|
||||
{
|
||||
return new SubmarineInfo(parameters.OutpostFilePath.Value)
|
||||
{
|
||||
OutpostGenerationParams = parameters
|
||||
};
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
partial void NPCInteractProjSpecific(Character npc, Character interactor)
|
||||
{
|
||||
if (npc == null || interactor == null) { return; }
|
||||
@@ -370,7 +358,7 @@ namespace Barotrauma
|
||||
UpgradeManager.CreateUpgradeErrorMessage(TextManager.Get("Dialog.CantUpgrade").Value, IsSinglePlayer, npc);
|
||||
return;
|
||||
case InteractionType.Crew when GameMain.NetworkMember != null:
|
||||
CampaignUI.CrewManagement.SendCrewState(false);
|
||||
CampaignUI.HRManagerUI.SendCrewState(false);
|
||||
goto default;
|
||||
case InteractionType.MedicalClinic:
|
||||
CampaignUI.MedicalClinic.RequestLatestPending();
|
||||
|
||||
+20
-6
@@ -939,7 +939,16 @@ namespace Barotrauma
|
||||
UInt16 renamedIdentifier = msg.ReadUInt16();
|
||||
string newName = msg.ReadString();
|
||||
CharacterInfo renamedCharacter = CrewManager.GetCharacterInfos().FirstOrDefault(info => info.ID == renamedIdentifier);
|
||||
if (renamedCharacter != null) { CrewManager.RenameCharacter(renamedCharacter, newName); }
|
||||
if (renamedCharacter != null)
|
||||
{
|
||||
CrewManager.RenameCharacter(renamedCharacter, newName);
|
||||
// Since renaming can only be done once in permadeath, we can safely set this to false to disable the renaming in the UI.
|
||||
renamedCharacter.RenamingEnabled = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
DebugConsole.ThrowError($"Could not find a character to rename with the ID {renamedIdentifier}.");
|
||||
}
|
||||
}
|
||||
|
||||
bool fireCharacter = msg.ReadBoolean();
|
||||
@@ -951,15 +960,15 @@ namespace Barotrauma
|
||||
if (firedCharacter != null) { CrewManager.FireCharacter(firedCharacter); }
|
||||
}
|
||||
|
||||
if (map?.CurrentLocation?.HireManager != null && CampaignUI?.CrewManagement != null)
|
||||
if (map?.CurrentLocation?.HireManager != null && CampaignUI?.HRManagerUI != null)
|
||||
{
|
||||
//can't apply until we have the latest save file
|
||||
if (!NetIdUtils.IdMoreRecent(pendingSaveID, LastSaveID))
|
||||
{
|
||||
CampaignUI.CrewManagement.SetHireables(map.CurrentLocation, availableHires);
|
||||
if (hiredCharacters.Any()) { CampaignUI.CrewManagement.ValidateHires(hiredCharacters, takeMoney: false, createNotification: createNotification); }
|
||||
CampaignUI.CrewManagement.SetPendingHires(pendingHires, map.CurrentLocation);
|
||||
if (renameCrewMember || fireCharacter) { CampaignUI.CrewManagement.UpdateCrew(); }
|
||||
CampaignUI.HRManagerUI.SetHireables(map.CurrentLocation, availableHires);
|
||||
if (hiredCharacters.Any()) { CampaignUI.HRManagerUI.ValidateHires(hiredCharacters, takeMoney: false, createNotification: createNotification); }
|
||||
CampaignUI.HRManagerUI.SetPendingHires(pendingHires, map.CurrentLocation);
|
||||
if (renameCrewMember || fireCharacter) { CampaignUI.HRManagerUI.UpdateCrew(); }
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1007,6 +1016,11 @@ namespace Barotrauma
|
||||
|
||||
public override bool TryPurchase(Client client, int price)
|
||||
{
|
||||
if (price == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!AllowedToManageCampaign(ClientPermissions.ManageMoney))
|
||||
{
|
||||
return PersonalWallet.TryDeduct(price);
|
||||
|
||||
@@ -1339,7 +1339,7 @@ namespace Barotrauma.Networking
|
||||
if (GameMain.GameSession?.GameMode is CampaignMode campaign)
|
||||
{
|
||||
campaign.CampaignUI?.UpgradeStore?.RequestRefresh();
|
||||
campaign.CampaignUI?.CrewManagement?.RefreshPermissions();
|
||||
campaign.CampaignUI?.HRManagerUI?.RefreshUI();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1554,7 +1554,7 @@ namespace Barotrauma.Networking
|
||||
}
|
||||
else
|
||||
{
|
||||
GameMain.GameSession.StartRound(levelData, mirrorLevel);
|
||||
GameMain.GameSession.StartRound(levelData, mirrorLevel, startOutpost: campaign?.GetPredefinedStartOutpost());
|
||||
}
|
||||
isOutpost = levelData.Type == LevelData.LevelType.Outpost;
|
||||
}
|
||||
@@ -1959,7 +1959,7 @@ namespace Barotrauma.Networking
|
||||
if (GameMain.GameSession?.GameMode is CampaignMode campaign)
|
||||
{
|
||||
campaign.CampaignUI?.UpgradeStore?.RequestRefresh();
|
||||
campaign.CampaignUI?.CrewManagement?.RefreshPermissions();
|
||||
campaign.CampaignUI?.HRManagerUI?.RefreshUI();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace Barotrauma
|
||||
|
||||
public CampaignMode Campaign { get; }
|
||||
|
||||
public CrewManagement CrewManagement { get; set; }
|
||||
public HRManagerUI HRManagerUI { get; set; }
|
||||
|
||||
public Store Store { get; private set; }
|
||||
|
||||
@@ -102,7 +102,7 @@ namespace Barotrauma
|
||||
|
||||
var crewTab = new GUIFrame(new RectTransform(Vector2.One, container.RectTransform), color: Color.Black * 0.9f);
|
||||
tabs[(int)CampaignMode.InteractionType.Crew] = crewTab;
|
||||
CrewManagement = new CrewManagement(this, crewTab);
|
||||
HRManagerUI = new HRManagerUI(this, crewTab);
|
||||
|
||||
// store tab -------------------------------------------------------------------------
|
||||
|
||||
@@ -204,7 +204,7 @@ namespace Barotrauma
|
||||
submarineSelection?.Update();
|
||||
break;
|
||||
case CampaignMode.InteractionType.Crew:
|
||||
CrewManagement?.Update();
|
||||
HRManagerUI?.Update();
|
||||
break;
|
||||
case CampaignMode.InteractionType.Store:
|
||||
Store?.Update(deltaTime);
|
||||
@@ -598,8 +598,8 @@ namespace Barotrauma
|
||||
Store.SelectStore(npc);
|
||||
break;
|
||||
case CampaignMode.InteractionType.Crew:
|
||||
CrewManagement.UpdateCrew();
|
||||
CrewManagement.UpdateHireables();
|
||||
HRManagerUI.UpdateCrew();
|
||||
HRManagerUI.UpdateHireables();
|
||||
break;
|
||||
case CampaignMode.InteractionType.PurchaseSub:
|
||||
submarineSelection ??= new SubmarineSelection(false, () => Campaign.ShowCampaignUI = false, tabs[(int)CampaignMode.InteractionType.PurchaseSub].RectTransform);
|
||||
|
||||
@@ -1116,6 +1116,36 @@ namespace Barotrauma
|
||||
AssignComponentToServerSetting(skillLossImmediateRespawnSlider, nameof(ServerSettings.SkillLossPercentageOnImmediateRespawn));
|
||||
skillLossImmediateRespawnSlider.OnMoved(skillLossImmediateRespawnSlider, skillLossImmediateRespawnSlider.BarScroll);
|
||||
|
||||
var newCharacterCostSliderElement = CreateLabeledSlider(settingsContent,
|
||||
"ServerSettings.ReplaceCostPercentage", "", "ServerSettings.ReplaceCostPercentage.tooltip",
|
||||
out var newCharacterCostSlider, out var newCharacterCostSliderLabel,
|
||||
range: new Vector2(0, 200), step: 10f);
|
||||
newCharacterCostSlider.StepValue = 10f;
|
||||
newCharacterCostSlider.OnMoved = (GUIScrollBar scrollBar, float _) =>
|
||||
{
|
||||
GUITextBlock textBlock = scrollBar.UserData as GUITextBlock;
|
||||
int currentMultiplier = (int)Math.Round(scrollBar.BarScrollValue);
|
||||
if (currentMultiplier < 1)
|
||||
{
|
||||
textBlock.Text = TextManager.Get("ServerSettings.ReplaceCostPercentage.Free");
|
||||
}
|
||||
else
|
||||
{
|
||||
textBlock.Text = TextManager.GetWithVariable("percentageformat", "[value]", currentMultiplier.ToString());
|
||||
}
|
||||
return true;
|
||||
};
|
||||
newCharacterCostSlider.OnReleased = (GUIScrollBar scrollBar, float barScroll) =>
|
||||
{
|
||||
GameMain.Client?.ServerSettings.ClientAdminWrite(ServerSettings.NetFlags.Properties);
|
||||
return true;
|
||||
};
|
||||
clientDisabledElements.AddRange(newCharacterCostSliderElement.GetAllChildren());
|
||||
permadeathEnabledRespawnSettings.AddRange(newCharacterCostSliderElement.GetAllChildren());
|
||||
ironmanDisabledRespawnSettings.AddRange(newCharacterCostSliderElement.GetAllChildren());
|
||||
AssignComponentToServerSetting(newCharacterCostSlider, nameof(ServerSettings.ReplaceCostPercentage));
|
||||
newCharacterCostSlider.OnMoved(newCharacterCostSlider, newCharacterCostSlider.BarScroll); // initialize
|
||||
|
||||
var allowBotTakeoverTickbox = new GUITickBox(new RectTransform(Vector2.One, settingsContent.RectTransform), TextManager.Get("AllowBotTakeover"))
|
||||
{
|
||||
ToolTip = TextManager.Get("AllowBotTakeover.Tooltip"),
|
||||
@@ -1834,7 +1864,8 @@ namespace Barotrauma
|
||||
OverflowClip = true
|
||||
};
|
||||
|
||||
if (PermanentlyDead)
|
||||
if (!allowEditing ||
|
||||
(PermanentlyDead && !characterInfo.RenamingEnabled))
|
||||
{
|
||||
CharacterNameBox.Readonly = true;
|
||||
CharacterNameBox.Enabled = false;
|
||||
|
||||
Reference in New Issue
Block a user