Adding support for Glee2D
This commit is contained in:
parent
a5f3a40912
commit
e2624fe638
@ -172,6 +172,7 @@
|
|||||||
<Compile Include="Engine\File\AxiosIsolatedFile.cs" />
|
<Compile Include="Engine\File\AxiosIsolatedFile.cs" />
|
||||||
<Compile Include="Engine\File\AxiosRegularFile.cs" />
|
<Compile Include="Engine\File\AxiosRegularFile.cs" />
|
||||||
<Compile Include="Engine\File\AxiosTitleFile.cs" />
|
<Compile Include="Engine\File\AxiosTitleFile.cs" />
|
||||||
|
<Compile Include="Engine\Glee2D\Level.cs" />
|
||||||
<Compile Include="Engine\Interfaces\IAxiosFile.cs" />
|
<Compile Include="Engine\Interfaces\IAxiosFile.cs" />
|
||||||
<Compile Include="Engine\Interfaces\IAxiosGameObject.cs" />
|
<Compile Include="Engine\Interfaces\IAxiosGameObject.cs" />
|
||||||
<Compile Include="Engine\Interfaces\IDrawableAxiosGameObject.cs" />
|
<Compile Include="Engine\Interfaces\IDrawableAxiosGameObject.cs" />
|
||||||
|
@ -215,6 +215,7 @@
|
|||||||
<Compile Include="Engine\File\AxiosIsolatedFile.cs" />
|
<Compile Include="Engine\File\AxiosIsolatedFile.cs" />
|
||||||
<Compile Include="Engine\File\AxiosRegularFile.cs" />
|
<Compile Include="Engine\File\AxiosRegularFile.cs" />
|
||||||
<Compile Include="Engine\File\AxiosTitleFile.cs" />
|
<Compile Include="Engine\File\AxiosTitleFile.cs" />
|
||||||
|
<Compile Include="Engine\Glee2D\Level.cs" />
|
||||||
<Compile Include="Engine\Interfaces\IAxiosFile.cs" />
|
<Compile Include="Engine\Interfaces\IAxiosFile.cs" />
|
||||||
<Compile Include="Engine\Interfaces\IAxiosGameObject.cs" />
|
<Compile Include="Engine\Interfaces\IAxiosGameObject.cs" />
|
||||||
<Compile Include="Engine\Interfaces\IDrawableAxiosGameObject.cs" />
|
<Compile Include="Engine\Interfaces\IDrawableAxiosGameObject.cs" />
|
||||||
|
@ -165,6 +165,7 @@
|
|||||||
<Compile Include="Engine\File\AxiosIsolatedFile.cs" />
|
<Compile Include="Engine\File\AxiosIsolatedFile.cs" />
|
||||||
<Compile Include="Engine\File\AxiosRegularFile.cs" />
|
<Compile Include="Engine\File\AxiosRegularFile.cs" />
|
||||||
<Compile Include="Engine\File\AxiosTitleFile.cs" />
|
<Compile Include="Engine\File\AxiosTitleFile.cs" />
|
||||||
|
<Compile Include="Engine\Glee2D\Level.cs" />
|
||||||
<Compile Include="Engine\Interfaces\IAxiosFile.cs" />
|
<Compile Include="Engine\Interfaces\IAxiosFile.cs" />
|
||||||
<Compile Include="Engine\Interfaces\IAxiosGameObject.cs" />
|
<Compile Include="Engine\Interfaces\IAxiosGameObject.cs" />
|
||||||
<Compile Include="Engine\Interfaces\IDrawableAxiosGameObject.cs" />
|
<Compile Include="Engine\Interfaces\IDrawableAxiosGameObject.cs" />
|
||||||
|
@ -69,6 +69,7 @@
|
|||||||
* - Adding SplitFlat extension for Texture2D
|
* - Adding SplitFlat extension for Texture2D
|
||||||
* - Removing uneeded Game Screen checking code
|
* - Removing uneeded Game Screen checking code
|
||||||
* - Adding SplitFlat extension with offsets for Texture2D
|
* - Adding SplitFlat extension with offsets for Texture2D
|
||||||
|
* - Adding support for Glee2D
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
505
axios/Engine/Glee2D/Level.cs
Normal file
505
axios/Engine/Glee2D/Level.cs
Normal file
@ -0,0 +1,505 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Xml;
|
||||||
|
using System.Xml.Serialization;
|
||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
|
using Microsoft.Xna.Framework.Content;
|
||||||
|
using System.IO;
|
||||||
|
using FarseerPhysics.Dynamics;
|
||||||
|
using FarseerPhysics.Common;
|
||||||
|
using FarseerPhysics.SamplesFramework;
|
||||||
|
using FarseerPhysics.Factories;
|
||||||
|
|
||||||
|
namespace Axios.Engine.Glee2D
|
||||||
|
{
|
||||||
|
public partial class Level
|
||||||
|
{
|
||||||
|
private World _world;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The name of the level.
|
||||||
|
/// </summary>
|
||||||
|
[XmlAttribute()]
|
||||||
|
public String Name;
|
||||||
|
|
||||||
|
[XmlAttribute()]
|
||||||
|
public bool Visible;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A Level contains several Layers. Each Layer contains several Items.
|
||||||
|
/// </summary>
|
||||||
|
public List<Layer> Layers;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A Dictionary containing any user-defined Properties.
|
||||||
|
/// </summary>
|
||||||
|
public SerializableDictionary CustomProperties;
|
||||||
|
|
||||||
|
|
||||||
|
public Level()
|
||||||
|
{
|
||||||
|
Visible = true;
|
||||||
|
Layers = new List<Layer>();
|
||||||
|
CustomProperties = new SerializableDictionary();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Level(World world)
|
||||||
|
{
|
||||||
|
Visible = true;
|
||||||
|
Layers = new List<Layer>();
|
||||||
|
CustomProperties = new SerializableDictionary();
|
||||||
|
_world = world;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Level FromFile(string filename, ContentManager cm, World world)
|
||||||
|
{
|
||||||
|
FileStream stream = System.IO.File.Open(filename, FileMode.Open);
|
||||||
|
XmlSerializer serializer = new XmlSerializer(typeof(Level));
|
||||||
|
Level level = (Level)serializer.Deserialize(stream);
|
||||||
|
stream.Close();
|
||||||
|
|
||||||
|
foreach (Layer layer in level.Layers)
|
||||||
|
{
|
||||||
|
foreach (Item item in layer.Items)
|
||||||
|
{
|
||||||
|
item.CustomProperties.RestoreItemAssociations(level);
|
||||||
|
item.load(cm, world);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return level;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Item getItemByName(string name)
|
||||||
|
{
|
||||||
|
foreach (Layer layer in Layers)
|
||||||
|
{
|
||||||
|
foreach (Item item in layer.Items)
|
||||||
|
{
|
||||||
|
if (item.Name == name) return item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Layer getLayerByName(string name)
|
||||||
|
{
|
||||||
|
foreach (Layer layer in Layers)
|
||||||
|
{
|
||||||
|
if (layer.Name == name) return layer;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void draw(SpriteBatch sb)
|
||||||
|
{
|
||||||
|
foreach (Layer layer in Layers) layer.draw(sb);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public partial class Layer
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The name of the layer.
|
||||||
|
/// </summary>
|
||||||
|
[XmlAttribute()]
|
||||||
|
public String Name;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Should this layer be visible?
|
||||||
|
/// </summary>
|
||||||
|
[XmlAttribute()]
|
||||||
|
public bool Visible;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The list of the items in this layer.
|
||||||
|
/// </summary>
|
||||||
|
public List<Item> Items;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The Scroll Speed relative to the main camera. The X and Y components are
|
||||||
|
/// interpreted as factors, so (1;1) means the same scrolling speed as the main camera.
|
||||||
|
/// Enables parallax scrolling.
|
||||||
|
/// </summary>
|
||||||
|
public Vector2 ScrollSpeed;
|
||||||
|
|
||||||
|
|
||||||
|
public Layer()
|
||||||
|
{
|
||||||
|
Items = new List<Item>();
|
||||||
|
ScrollSpeed = Vector2.One;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void draw(SpriteBatch sb)
|
||||||
|
{
|
||||||
|
if (!Visible) return;
|
||||||
|
foreach (Item item in Items) item.draw(sb);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[XmlInclude(typeof(TextureItem))]
|
||||||
|
[XmlInclude(typeof(RectangleItem))]
|
||||||
|
[XmlInclude(typeof(CircleItem))]
|
||||||
|
[XmlInclude(typeof(PathItem))]
|
||||||
|
public partial class Item
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The name of this item.
|
||||||
|
/// </summary>
|
||||||
|
[XmlAttribute()]
|
||||||
|
public String Name;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Should this item be visible?
|
||||||
|
/// </summary>
|
||||||
|
[XmlAttribute()]
|
||||||
|
public bool Visible;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The item's position in world space.
|
||||||
|
/// </summary>
|
||||||
|
public Vector2 Position;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A Dictionary containing any user-defined Properties.
|
||||||
|
/// </summary>
|
||||||
|
public SerializableDictionary CustomProperties;
|
||||||
|
|
||||||
|
|
||||||
|
public Item()
|
||||||
|
{
|
||||||
|
CustomProperties = new SerializableDictionary();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called by Level.FromFile(filename) on each Item after the deserialization process.
|
||||||
|
/// Should be overriden and can be used to load anything needed by the Item (e.g. a texture).
|
||||||
|
/// </summary>
|
||||||
|
public virtual void load(ContentManager cm, World world)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void draw(SpriteBatch sb)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public partial class TextureItem : Item
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The item's rotation in radians.
|
||||||
|
/// </summary>
|
||||||
|
public float Rotation;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The item's scale factor.
|
||||||
|
/// </summary>
|
||||||
|
public float Scale;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The color to tint the item's texture with (use white for no tint).
|
||||||
|
/// </summary>
|
||||||
|
public Color TintColor;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// If true, the texture is flipped horizontally when drawn.
|
||||||
|
/// </summary>
|
||||||
|
public bool FlipHorizontally;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// If true, the texture is flipped vertically when drawn.
|
||||||
|
/// </summary>
|
||||||
|
public bool FlipVertically;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The path to the texture's filename (including the extension) relative to ContentRootFolder.
|
||||||
|
/// </summary>
|
||||||
|
public String texture_filename;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The texture_filename without extension. For using in Content.Load<Texture2D>().
|
||||||
|
/// </summary>
|
||||||
|
public String asset_name;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The XNA texture to be drawn. Can be loaded either from file (using "texture_filename")
|
||||||
|
/// or via the Content Pipeline (using "asset_name") - then you must ensure that the texture
|
||||||
|
/// exists as an asset in your project.
|
||||||
|
/// Loading is done in the Item's load() method.
|
||||||
|
/// </summary>
|
||||||
|
Texture2D texture;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The item's origin relative to the upper left corner of the texture. Usually the middle of the texture.
|
||||||
|
/// Used for placing and rotating the texture when drawn.
|
||||||
|
/// </summary>
|
||||||
|
public Vector2 Origin;
|
||||||
|
|
||||||
|
|
||||||
|
public TextureItem()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called by Level.FromFile(filename) on each Item after the deserialization process.
|
||||||
|
/// Loads all assets needed by the TextureItem, especially the Texture2D.
|
||||||
|
/// You must provide your own implementation. However, you can rely on all public fields being
|
||||||
|
/// filled by the level deserialization process.
|
||||||
|
/// </summary>
|
||||||
|
public override void load(ContentManager cm, World world)
|
||||||
|
{
|
||||||
|
//throw new NotImplementedException();
|
||||||
|
|
||||||
|
//TODO: provide your own implementation of how a TextureItem loads its assets
|
||||||
|
//for example:
|
||||||
|
//this.texture = Texture2D.FromFile(<GraphicsDevice>, texture_filename);
|
||||||
|
//or by using the Content Pipeline:
|
||||||
|
this.texture = cm.Load<Texture2D>(asset_name);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void draw(SpriteBatch sb)
|
||||||
|
{
|
||||||
|
if (!Visible) return;
|
||||||
|
SpriteEffects effects = SpriteEffects.None;
|
||||||
|
if (FlipHorizontally) effects |= SpriteEffects.FlipHorizontally;
|
||||||
|
if (FlipVertically) effects |= SpriteEffects.FlipVertically;
|
||||||
|
sb.Draw(texture, Position, null, TintColor, Rotation, Origin, Scale, effects, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public partial class RectangleItem : Item
|
||||||
|
{
|
||||||
|
public float Width;
|
||||||
|
public float Height;
|
||||||
|
public Color FillColor;
|
||||||
|
|
||||||
|
Body _body;
|
||||||
|
|
||||||
|
public RectangleItem()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void load(ContentManager cm, World world)
|
||||||
|
{
|
||||||
|
base.load(cm, world);
|
||||||
|
|
||||||
|
_body = BodyFactory.CreateRectangle(world, Width, Height, 1f);
|
||||||
|
_body.Position = Position;
|
||||||
|
_body.UserData = this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public partial class CircleItem : Item
|
||||||
|
{
|
||||||
|
public float Radius;
|
||||||
|
public Color FillColor;
|
||||||
|
|
||||||
|
Body _body;
|
||||||
|
|
||||||
|
public CircleItem()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void load(ContentManager cm, World world)
|
||||||
|
{
|
||||||
|
base.load(cm, world);
|
||||||
|
|
||||||
|
_body = BodyFactory.CreateCircle(world, Radius, 1f);
|
||||||
|
_body.Position = Position;
|
||||||
|
_body.UserData = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public partial class PathItem : Item
|
||||||
|
{
|
||||||
|
public Vector2[] LocalPoints;
|
||||||
|
public Vector2[] WorldPoints;
|
||||||
|
public bool IsPolygon;
|
||||||
|
public int LineWidth;
|
||||||
|
public Color LineColor;
|
||||||
|
|
||||||
|
Body _body;
|
||||||
|
|
||||||
|
public PathItem()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void load(ContentManager cm, World world)
|
||||||
|
{
|
||||||
|
base.load(cm, world);
|
||||||
|
|
||||||
|
Vertices v = new Vertices(WorldPoints.Length);
|
||||||
|
foreach (Vector2 vec in WorldPoints)
|
||||||
|
v.Add(new Vector2(ConvertUnits.ToSimUnits(vec.X), ConvertUnits.ToSimUnits(vec.Y)));
|
||||||
|
|
||||||
|
_body = BodyFactory.CreateLoopShape(world, v);
|
||||||
|
_body.Position = this.Position;
|
||||||
|
_body.UserData = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// NEEDED FOR SERIALIZATION. YOU SHOULDN'T CHANGE ANYTHING BELOW!
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
public class CustomProperty
|
||||||
|
{
|
||||||
|
public string name;
|
||||||
|
public object value;
|
||||||
|
public Type type;
|
||||||
|
public string description;
|
||||||
|
|
||||||
|
public CustomProperty()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public CustomProperty(string n, object v, Type t, string d)
|
||||||
|
{
|
||||||
|
name = n;
|
||||||
|
value = v;
|
||||||
|
type = t;
|
||||||
|
description = d;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CustomProperty clone()
|
||||||
|
{
|
||||||
|
CustomProperty result = new CustomProperty(name, value, type, description);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class SerializableDictionary : Dictionary<String, CustomProperty>, IXmlSerializable
|
||||||
|
{
|
||||||
|
|
||||||
|
public SerializableDictionary()
|
||||||
|
: base()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public SerializableDictionary(SerializableDictionary copyfrom)
|
||||||
|
: base(copyfrom)
|
||||||
|
{
|
||||||
|
string[] keyscopy = new string[Keys.Count];
|
||||||
|
Keys.CopyTo(keyscopy, 0);
|
||||||
|
foreach (string key in keyscopy)
|
||||||
|
{
|
||||||
|
this[key] = this[key].clone();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public System.Xml.Schema.XmlSchema GetSchema()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ReadXml(System.Xml.XmlReader reader)
|
||||||
|
{
|
||||||
|
|
||||||
|
bool wasEmpty = reader.IsEmptyElement;
|
||||||
|
reader.Read();
|
||||||
|
|
||||||
|
if (wasEmpty) return;
|
||||||
|
|
||||||
|
while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
|
||||||
|
{
|
||||||
|
CustomProperty cp = new CustomProperty();
|
||||||
|
cp.name = reader.GetAttribute("Name");
|
||||||
|
cp.description = reader.GetAttribute("Description");
|
||||||
|
|
||||||
|
string type = reader.GetAttribute("Type");
|
||||||
|
if (type == "string") cp.type = typeof(string);
|
||||||
|
if (type == "bool") cp.type = typeof(bool);
|
||||||
|
if (type == "Vector2") cp.type = typeof(Vector2);
|
||||||
|
if (type == "Color") cp.type = typeof(Color);
|
||||||
|
if (type == "Item") cp.type = typeof(Item);
|
||||||
|
|
||||||
|
if (cp.type == typeof(Item))
|
||||||
|
{
|
||||||
|
cp.value = reader.ReadInnerXml();
|
||||||
|
this.Add(cp.name, cp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
reader.ReadStartElement("Property");
|
||||||
|
XmlSerializer valueSerializer = new XmlSerializer(cp.type);
|
||||||
|
object obj = valueSerializer.Deserialize(reader);
|
||||||
|
#if WINDOWS
|
||||||
|
cp.value = Convert.ChangeType(obj, cp.type);
|
||||||
|
#elif WINDOWS_PHONE || XBOX360
|
||||||
|
cp.value = Convert.ChangeType(obj, cp.type, null);
|
||||||
|
#endif
|
||||||
|
this.Add(cp.name, cp);
|
||||||
|
reader.ReadEndElement();
|
||||||
|
}
|
||||||
|
|
||||||
|
reader.MoveToContent();
|
||||||
|
}
|
||||||
|
reader.ReadEndElement();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void WriteXml(System.Xml.XmlWriter writer)
|
||||||
|
{
|
||||||
|
foreach (String key in this.Keys)
|
||||||
|
{
|
||||||
|
writer.WriteStartElement("Property");
|
||||||
|
writer.WriteAttributeString("Name", this[key].name);
|
||||||
|
if (this[key].type == typeof(string)) writer.WriteAttributeString("Type", "string");
|
||||||
|
if (this[key].type == typeof(bool)) writer.WriteAttributeString("Type", "bool");
|
||||||
|
if (this[key].type == typeof(Vector2)) writer.WriteAttributeString("Type", "Vector2");
|
||||||
|
if (this[key].type == typeof(Color)) writer.WriteAttributeString("Type", "Color");
|
||||||
|
if (this[key].type == typeof(Item)) writer.WriteAttributeString("Type", "Item");
|
||||||
|
writer.WriteAttributeString("Description", this[key].description);
|
||||||
|
|
||||||
|
if (this[key].type == typeof(Item))
|
||||||
|
{
|
||||||
|
Item item = (Item)this[key].value;
|
||||||
|
if (item != null) writer.WriteString(item.Name);
|
||||||
|
else writer.WriteString("$null$");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
XmlSerializer valueSerializer = new XmlSerializer(this[key].type);
|
||||||
|
valueSerializer.Serialize(writer, this[key].value);
|
||||||
|
}
|
||||||
|
writer.WriteEndElement();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Must be called after all Items have been deserialized.
|
||||||
|
/// Restores the Item references in CustomProperties of type Item.
|
||||||
|
/// </summary>
|
||||||
|
public void RestoreItemAssociations(Level level)
|
||||||
|
{
|
||||||
|
foreach (CustomProperty cp in Values)
|
||||||
|
{
|
||||||
|
if (cp.type == typeof(Item)) cp.value = level.getItemByName((string)cp.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user