(3dc4135ce) v0.9.5.1
This commit is contained in:
@@ -36,9 +36,12 @@ namespace Barotrauma
|
||||
get { return skills.Values.ToList(); }
|
||||
}
|
||||
|
||||
public Job(JobPrefab jobPrefab)
|
||||
public int Variant;
|
||||
|
||||
public Job(JobPrefab jobPrefab, int variant = 0)
|
||||
{
|
||||
prefab = jobPrefab;
|
||||
Variant = variant;
|
||||
|
||||
skills = new Dictionary<string, Skill>();
|
||||
foreach (SkillPrefab skillPrefab in prefab.Skills)
|
||||
@@ -156,6 +159,25 @@ namespace Barotrauma
|
||||
character.Inventory.TryPutItem(item, null, item.AllowedSlots);
|
||||
}
|
||||
|
||||
Wearable wearable = ((List<ItemComponent>)item.Components)?.Find(c => c is Wearable) as Wearable;
|
||||
if (wearable != null)
|
||||
{
|
||||
if (Variant > 0 && Variant <= wearable.Variants)
|
||||
{
|
||||
wearable.Variant = Variant;
|
||||
}
|
||||
else
|
||||
{
|
||||
wearable.Variant = wearable.Variant; //force server event
|
||||
if (wearable.Variants > 0 && Variant == 0)
|
||||
{
|
||||
//set variant to the same as the wearable to get the rest of the character's gear
|
||||
//to use the same variant (if possible)
|
||||
Variant = wearable.Variant;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (item.Prefab.Identifier == "idcard" && spawnPoint != null)
|
||||
{
|
||||
foreach (string s in spawnPoint.IdCardTags)
|
||||
|
||||
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||
using System.Xml.Linq;
|
||||
using Barotrauma.Extensions;
|
||||
using System.Linq;
|
||||
using System.IO;
|
||||
|
||||
namespace Barotrauma
|
||||
{
|
||||
@@ -31,6 +32,8 @@ namespace Barotrauma
|
||||
partial class JobPrefab
|
||||
{
|
||||
public static Dictionary<string, JobPrefab> List;
|
||||
|
||||
public static XElement NoJobElement;
|
||||
public static JobPrefab Get(string identifier)
|
||||
{
|
||||
if (List == null)
|
||||
@@ -146,8 +149,11 @@ namespace Barotrauma
|
||||
private set;
|
||||
}
|
||||
|
||||
public XElement Element { get; private set; }
|
||||
public XElement ClothingElement { get; private set; }
|
||||
|
||||
public XElement PreviewElement { get; private set; }
|
||||
|
||||
public JobPrefab(XElement element)
|
||||
{
|
||||
SerializableProperty.DeserializeProperties(this, element);
|
||||
@@ -155,6 +161,8 @@ namespace Barotrauma
|
||||
Description = TextManager.Get("JobDescription." + Identifier);
|
||||
Identifier = Identifier.ToLowerInvariant();
|
||||
|
||||
Element = element;
|
||||
|
||||
foreach (XElement subElement in element.Elements())
|
||||
{
|
||||
switch (subElement.Name.ToString().ToLowerInvariant())
|
||||
@@ -220,7 +228,71 @@ namespace Barotrauma
|
||||
{
|
||||
ClothingElement = element.Element("portraitclothing");
|
||||
}
|
||||
|
||||
PreviewElement = element.Element("PreviewSprites");
|
||||
if (PreviewElement == null)
|
||||
{
|
||||
PreviewElement = element.Element("previewsprites");
|
||||
}
|
||||
}
|
||||
|
||||
public class OutfitPreview
|
||||
{
|
||||
/// <summary>
|
||||
/// Pair.First = sprite, Pair.Second = draw offset
|
||||
/// </summary>
|
||||
public readonly List<Pair<Sprite, Vector2>> Sprites;
|
||||
|
||||
public OutfitPreview()
|
||||
{
|
||||
Sprites = new List<Pair<Sprite, Vector2>>();
|
||||
}
|
||||
|
||||
public void AddSprite(Sprite sprite, Vector2 drawOffset)
|
||||
{
|
||||
Sprites.Add(new Pair<Sprite, Vector2>(sprite, drawOffset));
|
||||
}
|
||||
}
|
||||
|
||||
public List<OutfitPreview> GetJobOutfitSprites(Gender gender, out Vector2 dimensions)
|
||||
{
|
||||
List<OutfitPreview> outfitPreviews = new List<OutfitPreview>();
|
||||
dimensions = PreviewElement.GetAttributeVector2("dims", Vector2.One);
|
||||
if (PreviewElement == null) { return outfitPreviews; }
|
||||
|
||||
var equipIdentifiers = Element.Elements("Items").Elements().Where(e => e.GetAttributeBool("outfit", false)).Select(e => e.GetAttributeString("identifier", ""));
|
||||
|
||||
var children = PreviewElement.Elements().ToList();
|
||||
|
||||
var outfitPrefab = MapEntityPrefab.List.Find(me => me is ItemPrefab itemPrefab && equipIdentifiers.Contains(itemPrefab.Identifier)) as ItemPrefab;
|
||||
if (outfitPrefab == null) { return null; }
|
||||
var wearables = outfitPrefab.ConfigElement.Elements("Wearable");
|
||||
if (!wearables.Any()) { return null; }
|
||||
|
||||
int variantCount = wearables.First().GetAttributeInt("variants", 1);
|
||||
|
||||
for (int i = 0; i < variantCount; i++)
|
||||
{
|
||||
var outfitPreview = new OutfitPreview();
|
||||
for (int n = 0; n < children.Count; n++)
|
||||
{
|
||||
XElement spriteElement = children[n];
|
||||
string spriteTexture = spriteElement.GetAttributeString("texture", "").Replace("[GENDER]", (gender == Gender.Female) ? "female" : "male");
|
||||
string textureVariant = spriteTexture.Replace("[VARIANT]", (i + 1).ToString());
|
||||
if (!File.Exists(textureVariant))
|
||||
{
|
||||
textureVariant = spriteTexture.Replace("[VARIANT]", "1");
|
||||
}
|
||||
var torsoSprite = new Sprite(spriteElement, path: "", file: textureVariant);
|
||||
torsoSprite.size = new Vector2(torsoSprite.SourceRect.Width, torsoSprite.SourceRect.Height);
|
||||
outfitPreview.AddSprite(torsoSprite, children[n].GetAttributeVector2("offset", Vector2.Zero));
|
||||
}
|
||||
outfitPreviews.Add(outfitPreview);
|
||||
}
|
||||
|
||||
return outfitPreviews;
|
||||
}
|
||||
|
||||
|
||||
public static JobPrefab Random(Rand.RandSync sync = Rand.RandSync.Unsynced) => List.Values.GetRandom(sync);
|
||||
|
||||
@@ -239,6 +311,7 @@ namespace Barotrauma
|
||||
}
|
||||
foreach (XElement element in mainElement.Elements())
|
||||
{
|
||||
if (element.Name.ToString().ToLowerInvariant() == "nojob") { continue; }
|
||||
if (element.IsOverride())
|
||||
{
|
||||
var job = new JobPrefab(element.FirstElement());
|
||||
@@ -262,6 +335,8 @@ namespace Barotrauma
|
||||
}
|
||||
}
|
||||
}
|
||||
NoJobElement = NoJobElement ?? mainElement.Element("NoJob");
|
||||
NoJobElement = NoJobElement ?? mainElement.Element("nojob");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user