Client LuaCsForBarotrauma
BarotraumaClient/ClientSource/Map/Levels/LevelObjects/LevelObjectPrefab.cs
1 using Barotrauma.Lights;
4 using Microsoft.Xna.Framework;
5 using System.Collections.Generic;
6 using System.Globalization;
7 using System.Linq;
8 using System.Xml.Linq;
9 
10 namespace Barotrauma
11 {
12  partial class LevelObjectPrefab : PrefabWithUintIdentifier, ISerializableEntity
13  {
14  public class SoundConfig
15  {
16  public readonly ContentXElement SoundElement;
17  public readonly Vector2 Position;
18  public readonly int TriggerIndex;
19 
20  public SoundConfig(ContentXElement element, int triggerIndex)
21  {
22  SoundElement = element;
23  Position = element.GetAttributeVector2("position", Vector2.Zero);
24  TriggerIndex = triggerIndex;
25  }
26  }
27 
28  public List<int> ParticleEmitterTriggerIndex
29  {
30  get;
31  private set;
32  }
33  public List<ParticleEmitterPrefab> ParticleEmitterPrefabs
34  {
35  get;
36  private set;
37  }
38  public List<Vector2> EmitterPositions
39  {
40  get;
41  private set;
42  }
43 
44  public List<SoundConfig> Sounds
45  {
46  get;
47  private set;
48  } = new List<SoundConfig>();
49 
50  public List<int> LightSourceTriggerIndex
51  {
52  get;
53  private set;
54  } = new List<int>();
55  public List<LightSourceParams> LightSourceParams
56  {
57  get;
58  private set;
59  } = new List<Lights.LightSourceParams>();
60 
64  public List<SpriteDeformation> SpriteDeformations
65  {
66  get;
67  private set;
68  } = new List<SpriteDeformation>();
69 
70  partial void InitProjSpecific(ContentXElement element)
71  {
72  LoadElementsProjSpecific(element, -1);
73  }
74 
75  private void LoadElementsProjSpecific(ContentXElement element, int parentTriggerIndex)
76  {
77  foreach (var subElement in element.Elements())
78  {
79  switch (subElement.Name.ToString().ToLowerInvariant())
80  {
81  case "leveltrigger":
82  case "trigger":
83  LoadElementsProjSpecific(subElement, LevelTriggerElements.IndexOf(subElement));
84  break;
85  case "lightsource":
86  LightSourceTriggerIndex.Add(parentTriggerIndex);
87  LightSourceParams.Add(new LightSourceParams(subElement));
88  break;
89  case "particleemitter":
90  if (ParticleEmitterPrefabs == null)
91  {
92  ParticleEmitterPrefabs = new List<ParticleEmitterPrefab>();
93  EmitterPositions = new List<Vector2>();
94  ParticleEmitterTriggerIndex = new List<int>();
95  }
96 
97  ParticleEmitterPrefabs.Add(new ParticleEmitterPrefab(subElement));
98  ParticleEmitterTriggerIndex.Add(parentTriggerIndex);
99  EmitterPositions.Add(subElement.GetAttributeVector2("position", Vector2.Zero));
100  break;
101  case "sound":
102  Sounds.Add(new SoundConfig(subElement, parentTriggerIndex));
103  break;
104  case "deformablesprite":
105  foreach (XElement deformElement in subElement.Elements())
106  {
107  var deformation = SpriteDeformation.Load(deformElement, Name);
108  if (deformation != null)
109  {
110  SpriteDeformations.Add(deformation);
111  }
112  }
113  break;
114  }
115  }
116  }
117 
118  public void Save(XElement element)
119  {
120  this.Config = element;
121 
123 
124  foreach (var subElement in element.Elements().ToList())
125  {
126  switch (subElement.Name.ToString().ToLowerInvariant())
127  {
128  case "childobject":
129  subElement.Remove();
130  break;
131  case "deformablesprite":
132  subElement.RemoveNodes();
133  foreach (SpriteDeformation deformation in SpriteDeformations)
134  {
135  var deformationElement = new XElement("SpriteDeformation");
136  deformation.Save(deformationElement);
137  subElement.Add(deformationElement);
138  }
139  break;
140  }
141  }
142 
143  for (int i = 0; i < LightSourceParams.Count; i++)
144  {
145  int elementIndex = 0;
146  bool wasSaved = false;
147  foreach (var subElement in element.Elements().ToList())
148  {
149  switch (subElement.Name.ToString().ToLowerInvariant())
150  {
151  case "lightsource":
152  if (elementIndex == i)
153  {
155  wasSaved = true;
156  break;
157  }
158  elementIndex++;
159  break;
160  }
161  }
162  if (!wasSaved)
163  {
164  var lightElement = new XElement("LightSource");
166  element.Add(lightElement);
167  }
168  }
169 
170  foreach (ChildObject childObj in ChildObjects)
171  {
172  element.Add(new XElement("ChildObject",
173  new XAttribute("names", string.Join(", ", childObj.AllowedNames)),
174  new XAttribute("mincount", childObj.MinCount),
175  new XAttribute("maxcount", childObj.MaxCount)));
176  }
177 
178  foreach (KeyValuePair<Identifier, float> overrideCommonness in OverrideCommonness)
179  {
180  bool elementFound = false;
181  foreach (var subElement in element.Elements())
182  {
183  if (subElement.Name.ToString().Equals("overridecommonness", System.StringComparison.OrdinalIgnoreCase)
184  && subElement.GetAttributeIdentifier("leveltype", Identifier.Empty) == overrideCommonness.Key)
185  {
186  subElement.Attribute("commonness").Value = overrideCommonness.Value.ToString("G", CultureInfo.InvariantCulture);
187  elementFound = true;
188  break;
189  }
190  }
191  if (!elementFound)
192  {
193  element.Add(new XElement("overridecommonness",
194  new XAttribute("leveltype", overrideCommonness.Key),
195  new XAttribute("commonness", overrideCommonness.Value.ToString("G", CultureInfo.InvariantCulture))));
196  }
197  }
198  }
199  }
200 }
Vector2 GetAttributeVector2(string key, in Vector2 def)
List< SpriteDeformation > SpriteDeformations
Only used for editing sprite deformation parameters. The actual LevelObjects use separate SpriteDefor...
readonly Dictionary< Identifier, float > OverrideCommonness
Overrides the commonness of the object in a specific level type. Key = name of the level type,...
LightSourceParams(ContentXElement element)
Definition: LightSource.cs:142
readonly Identifier Identifier
Definition: Prefab.cs:34
static void SerializeProperties(ISerializableEntity obj, XElement element, bool saveIfDefault=false, bool ignoreEditable=false)
static SpriteDeformation Load(string deformationType, string parentDebugName)