Unstable 1.8.4.0

This commit is contained in:
Markus Isberg
2025-03-12 12:56:27 +00:00
parent a4c3e868e4
commit a4a3427e4e
627 changed files with 29860 additions and 10018 deletions
@@ -94,21 +94,73 @@ namespace Barotrauma
return null;
}
}
/// <summary>
/// Note: Does not automatically filter items by team or by game mode. See <see cref="JobItem.GetItemIdentifier(CharacterTeamType, bool)"/>
/// </summary>
public IEnumerable<JobItem> GetJobItems(int jobVariant, Func<JobItem, bool> predicate)
=> JobItems.TryGetValue(jobVariant, out ImmutableArray<JobItem> items) ? items.Where(predicate) : Enumerable.Empty<JobItem>();
/// <summary>
/// Note: Does not automatically filter items by team or by game mode. See <see cref="JobItem.GetItemIdentifier(CharacterTeamType, bool)"/>
/// </summary>
public bool HasJobItem(int jobVariant, Func<JobItem, bool> predicate)
=> JobItems.TryGetValue(jobVariant, out ImmutableArray<JobItem> items) && items.Any(predicate);
public class PreviewItem
public class JobItem
{
public readonly Identifier ItemIdentifier;
public readonly bool ShowPreview;
public PreviewItem(Identifier itemIdentifier, bool showPreview)
public enum GameModeType
{
ItemIdentifier = itemIdentifier;
ShowPreview = showPreview;
Any, PvP, PvE
}
public readonly Identifier ItemIdentifier;
public readonly Identifier ItemIdentifierTeam2;
public readonly bool ShowPreview;
public readonly bool Equip;
public readonly bool Outfit;
public readonly int Amount;
public readonly bool Infinite;
public readonly JobItem ParentItem;
public readonly GameModeType GameMode;
public JobItem(ContentXElement element, JobItem parentItem)
{
ItemIdentifier = element.GetAttributeIdentifier("identifier", Identifier.Empty);
ItemIdentifierTeam2 = element.GetAttributeIdentifier("identifierteam2", Identifier.Empty);
ShowPreview = element.GetAttributeBool(nameof(ShowPreview), true);
GameMode = element.GetAttributeEnum(nameof(GameMode), parentItem?.GameMode ?? GameModeType.Any);
Amount = element.GetAttributeInt(nameof(Amount), 1);
Equip = element.GetAttributeBool(nameof(Equip), false);
Outfit = element.GetAttributeBool(nameof(Outfit), false);
Infinite = element.GetAttributeBool(nameof(Infinite), false);
ParentItem = parentItem;
}
public Identifier GetItemIdentifier(CharacterTeamType team, bool isPvPMode)
{
switch (GameMode)
{
case GameModeType.PvP:
if (!isPvPMode) { return Identifier.Empty; }
break;
case GameModeType.PvE:
if (isPvPMode) { return Identifier.Empty; }
break;
}
return
team == CharacterTeamType.Team2 && !ItemIdentifierTeam2.IsEmpty ?
ItemIdentifierTeam2 :
ItemIdentifier;
}
}
public readonly Dictionary<int, ContentXElement> ItemSets = new Dictionary<int, ContentXElement>();
public readonly ImmutableDictionary<int, ImmutableArray<PreviewItem>> PreviewItems;
/// <summary>
/// The items the character can get when spawning. The key is the index of the job variant.
/// </summary>
public readonly ImmutableDictionary<int, ImmutableArray<JobItem>> JobItems;
public readonly List<SkillPrefab> Skills = new List<SkillPrefab>();
public readonly List<AutonomousObjective> AutonomousObjectives = new List<AutonomousObjective>();
public readonly List<Identifier> AppropriateOrders = new List<Identifier>();
@@ -145,6 +197,13 @@ namespace Barotrauma
private set;
}
[Serialize(10, IsPropertySaveable.No, description: "Determines the order of the characters in the campaign setup ui.")]
public int CampaignSetupUIOrder
{
get;
private set;
}
[Serialize(false, IsPropertySaveable.No, description: "If set to true, a client that has chosen this as their preferred job will get it regardless of the maximum number or the amount of spawnpoints in the sub.")]
public bool AllowAlways
{
@@ -211,7 +270,7 @@ namespace Barotrauma
Description = TextManager.Get("JobDescription." + Identifier);
Element = element;
var previewItems = new Dictionary<int, List<PreviewItem>>();
var jobItems = new Dictionary<int, List<JobItem>>();
int variant = 0;
foreach (var subElement in element.Elements())
@@ -219,9 +278,8 @@ namespace Barotrauma
switch (subElement.Name.ToString().ToLowerInvariant())
{
case "itemset":
ItemSets.Add(variant, subElement);
previewItems[variant] = new List<PreviewItem>();
loadItemIdentifiers(subElement, variant);
jobItems[variant] = new List<JobItem>();
loadJobItems(subElement, variant, parentItem: null);
variant++;
break;
case "skills":
@@ -246,35 +304,39 @@ namespace Barotrauma
}
}
void loadItemIdentifiers(XElement parentElement, int variant)
void loadJobItems(ContentXElement parentElement, int variant, JobItem parentItem)
{
foreach (XElement itemElement in parentElement.GetChildElements("Item"))
foreach (ContentXElement itemElement in parentElement.GetChildElements("Item"))
{
if (itemElement.Element("name") != null)
if (itemElement.GetAttribute("name") != null)
{
DebugConsole.ThrowErrorLocalized("Error in job config \"" + Name + "\" - use identifiers instead of names to configure the items.");
DebugConsole.ThrowErrorLocalized("Error in job config \"" + Name + "\" - use identifiers instead of names to configure the items.",
contentPackage: parentElement.ContentPackage);
continue;
}
Identifier itemIdentifier = itemElement.GetAttributeIdentifier("identifier", Identifier.Empty);
JobItem jobItem = null;
if (itemIdentifier.IsEmpty)
{
DebugConsole.ThrowErrorLocalized("Error in job config \"" + Name + "\" - item with no identifier.");
DebugConsole.ThrowErrorLocalized("Error in job config \"" + Name + "\" - item with no identifier.",
contentPackage: parentElement.ContentPackage);
}
else
{
previewItems[variant].Add(new PreviewItem(itemIdentifier, itemElement.GetAttributeBool("showpreview", true)));
jobItem = new JobItem(itemElement, parentItem);
jobItems[variant].Add(jobItem);
}
loadItemIdentifiers(itemElement, variant);
loadJobItems(itemElement, variant, parentItem: jobItem);
}
}
PreviewItems = previewItems.Select(kvp => (kvp.Key, kvp.Value.ToImmutableArray()))
JobItems = jobItems.Select(kvp => (kvp.Key, kvp.Value.ToImmutableArray()))
.ToImmutableDictionary();
Variants = variant;
Skills.Sort((x,y) => y.LevelRange.Start.CompareTo(x.LevelRange.Start));
Skills.Sort((x,y) => y.GetLevelRange(isPvP: false).Start.CompareTo(x.GetLevelRange(isPvP: false).Start));
}
public static JobPrefab Random(Rand.RandSync sync, Func<JobPrefab, bool> predicate = null) => Prefabs.GetRandom(p => !p.HiddenJob && (predicate == null || predicate(p)), sync);