(3dc4135ce) v0.9.5.1

This commit is contained in:
Regalis
2019-11-21 18:22:25 +01:00
parent b39922a074
commit 5c95c53118
287 changed files with 12655 additions and 5048 deletions
@@ -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");
}
}
}