Client LuaCsForBarotrauma
BarotraumaClient/ClientSource/Characters/Jobs/JobPrefab.cs
1 using Microsoft.Xna.Framework;
2 using System.Linq;
3 using System;
4 using System.Xml.Linq;
5 using System.Collections.Generic;
6 
7 namespace Barotrauma
8 {
9  partial class JobPrefab : PrefabWithUintIdentifier
10  {
11  public GUIButton CreateInfoFrame(out GUIComponent buttonContainer)
12  {
13  int width = 500, height = 400;
14 
15  GUIButton frameHolder = new GUIButton(new RectTransform(Vector2.One, GUI.Canvas, Anchor.Center), style: null);
16  new GUIFrame(new RectTransform(GUI.Canvas.RelativeSize, frameHolder.RectTransform, Anchor.Center), style: "GUIBackgroundBlocker");
17 
18  GUIFrame frame = new GUIFrame(new RectTransform(new Point(width, height), frameHolder.RectTransform, Anchor.Center));
19  GUIFrame paddedFrame = new GUIFrame(new RectTransform(new Vector2(0.9f, 0.9f), frame.RectTransform, Anchor.Center), style: null);
20 
21  new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.1f), paddedFrame.RectTransform), Name, font: GUIStyle.LargeFont);
22 
23  var descriptionBlock = new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), paddedFrame.RectTransform) { RelativeOffset = new Vector2(0.0f, 0.15f) },
24  Description, font: GUIStyle.SmallFont, wrap: true);
25 
26  var skillContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.45f, 0.5f), paddedFrame.RectTransform)
27  { RelativeOffset = new Vector2(0.0f, 0.2f + descriptionBlock.RectTransform.RelativeSize.Y) });
28  new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), skillContainer.RectTransform),
29  TextManager.Get("Skills"), font: GUIStyle.LargeFont);
30  foreach (SkillPrefab skill in Skills)
31  {
32  new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), skillContainer.RectTransform),
33  " - " + TextManager.AddPunctuation(':', TextManager.Get("SkillName." + skill.Identifier), (int)skill.LevelRange.Start + " - " + (int)skill.LevelRange.End),
34  font: GUIStyle.SmallFont);
35  }
36 
37  buttonContainer = paddedFrame;
38 
39  /*if (!ItemIdentifiers.TryGetValue(variant, out var itemIdentifiers)) { return backFrame; }
40  var itemContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.45f, 0.5f), paddedFrame.RectTransform, Anchor.TopRight)
41  { RelativeOffset = new Vector2(0.0f, 0.2f + descriptionBlock.RectTransform.RelativeSize.Y) })
42  {
43  Stretch = true
44  };
45  new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), itemContainer.RectTransform),
46  TextManager.Get("Items", "mapentitycategory.equipment"), font: GUIStyle.LargeFont);
47  foreach (string identifier in itemIdentifiers.Distinct())
48  {
49  if (!(MapEntityPrefab.Find(name: null, identifier: identifier) is ItemPrefab itemPrefab)) { continue; }
50  int count = itemIdentifiers.Count(i => i == identifier);
51  new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.0f), itemContainer.RectTransform),
52  " - " + (count == 1 ? itemPrefab.Name : itemPrefab.Name + " x" + count),
53  font: GUIStyle.SmallFont);
54  }*/
55 
56  return frameHolder;
57  }
58 
59  public class OutfitPreview
60  {
61  public readonly List<(Sprite sprite, Vector2 drawOffset)> Sprites;
62 
63  public Vector2 Dimensions;
64 
65  public OutfitPreview()
66  {
67  Sprites = new List<(Sprite sprite, Vector2 drawOffset)>();
68  Dimensions = Vector2.One;
69  }
70 
71  public void AddSprite(Sprite sprite, Vector2 drawOffset)
72  {
73  Sprites.Add((sprite, drawOffset));
74  }
75  }
76 
77  public List<OutfitPreview> GetJobOutfitSprites(CharacterInfoPrefab charInfoPrefab, bool useInventoryIcon, out Vector2 maxDimensions)
78  {
79  List<OutfitPreview> outfitPreviews = new List<OutfitPreview>();
80  maxDimensions = Vector2.One;
81 
82  var equipIdentifiers = Element.GetChildElements("ItemSet").Elements().Where(e => e.GetAttributeBool("outfit", false)).Select(e => e.GetAttributeIdentifier("identifier", ""));
83 
84  List<ItemPrefab> outfitPrefabs = new List<ItemPrefab>();
85  foreach (var equipIdentifier in equipIdentifiers)
86  {
87  var itemPrefab = ItemPrefab.Prefabs.Find(ip => ip.Identifier == equipIdentifier);
88  if (itemPrefab != null) { outfitPrefabs.Add(itemPrefab); }
89  }
90 
91  if (!outfitPrefabs.Any()) { return null; }
92 
93  for (int i = 0; i < outfitPrefabs.Count; i++)
94  {
95  var outfitPreview = new OutfitPreview();
96 
97  if (!ItemSets.TryGetValue(i, out var itemSetElement)) { continue; }
98  var previewElement = itemSetElement.GetChildElement("PreviewSprites");
99  if (previewElement == null || useInventoryIcon)
100  {
101  if (outfitPrefabs[i] is ItemPrefab prefab && prefab.InventoryIcon != null)
102  {
103  outfitPreview.AddSprite(prefab.InventoryIcon, Vector2.Zero);
104  outfitPreview.Dimensions = prefab.InventoryIcon.SourceRect.Size.ToVector2();
105  maxDimensions.X = MathHelper.Max(maxDimensions.X, outfitPreview.Dimensions.X);
106  maxDimensions.Y = MathHelper.Max(maxDimensions.Y, outfitPreview.Dimensions.Y);
107  }
108  outfitPreviews.Add(outfitPreview);
109  continue;
110  }
111 
112  var children = previewElement.Elements().ToList();
113  for (int n = 0; n < children.Count; n++)
114  {
115  var spriteElement = children[n];
116  string spriteTexture = charInfoPrefab.ReplaceVars(spriteElement.GetAttributeString("texture", ""), charInfoPrefab.Heads.First());
117  var sprite = new Sprite(spriteElement, file: spriteTexture);
118  sprite.size = new Vector2(sprite.SourceRect.Width, sprite.SourceRect.Height);
119  outfitPreview.AddSprite(sprite, children[n].GetAttributeVector2("offset", Vector2.Zero));
120  }
121 
122  outfitPreview.Dimensions = previewElement.GetAttributeVector2("dims", Vector2.One);
123  maxDimensions.X = MathHelper.Max(maxDimensions.X, outfitPreview.Dimensions.X);
124  maxDimensions.Y = MathHelper.Max(maxDimensions.Y, outfitPreview.Dimensions.Y);
125 
126  outfitPreviews.Add(outfitPreview);
127  }
128 
129  return outfitPreviews;
130  }
131  }
132 }
IEnumerable< ContentXElement > GetChildElements(string name)
RectTransform RectTransform
static readonly PrefabCollection< ItemPrefab > Prefabs
readonly List<(Sprite sprite, Vector2 drawOffset)> Sprites
readonly Dictionary< int, ContentXElement > ItemSets
List< OutfitPreview > GetJobOutfitSprites(CharacterInfoPrefab charInfoPrefab, bool useInventoryIcon, out Vector2 maxDimensions)
GUIButton CreateInfoFrame(out GUIComponent buttonContainer)
readonly Identifier Identifier
Definition: SkillPrefab.cs:8
Range< float > LevelRange
Definition: SkillPrefab.cs:10