Unstable 1.8.4.0
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user