From 722c27c8730d724004f8e04e2448555dab5eb3ba Mon Sep 17 00:00:00 2001 From: Justin Aquadro Date: Wed, 6 Apr 2011 08:48:50 +0000 Subject: [PATCH] Implemented Entity's INBTObject properties. --- Substrate/SubstrateCS/Source/Entity.cs | 225 +++++++++++++++++++++++-- 1 file changed, 208 insertions(+), 17 deletions(-) diff --git a/Substrate/SubstrateCS/Source/Entity.cs b/Substrate/SubstrateCS/Source/Entity.cs index 3f0c890..5721c3a 100644 --- a/Substrate/SubstrateCS/Source/Entity.cs +++ b/Substrate/SubstrateCS/Source/Entity.cs @@ -7,24 +7,20 @@ namespace Substrate.Map using NBT; using Utility; - public class Entity + public class Entity : INBTObject, ICopyable { - private string _entityID; - private double _posX; - private double _posY; - private double _posZ; - private double _motionX; - private double _motionY; - private double _motionZ; - private float _rotationYaw; - private float _rotationPitch; - private float _fallDistance; - private short _fire; - private short _air; - private byte _onGround; + public class Vector3 + { + public double X { get; set; } + public double Y { get; set; } + public double Z { get; set; } + } - - #region Predefined Schemas + public class Orientation + { + public double Pitch { get; set; } + public double Yaw { get; set; } + } public static readonly NBTCompoundNode BaseSchema = new NBTCompoundNode("") { @@ -38,6 +34,98 @@ namespace Substrate.Map new NBTScalerNode("OnGround", NBT_Type.TAG_BYTE), }; + private string _id; + private Vector3 _pos; + private Vector3 _motion; + private Orientation _rotation; + + private float _fallDistance; + private short _fire; + private short _air; + private byte _onGround; + + private string? _world; + + public string ID + { + get { return _id; } + } + + public Vector3 Position + { + get { return _pos; } + set { _pos = value; } + } + + public Vector3 Motion + { + get { return _motion; } + set { _motion = value; } + } + + public Orientation Rotation + { + get { return _rotation; } + set { _rotation = value; } + } + + public double FallDistance + { + get { return _fallDistance; } + set { _fallDistance = (float)value; } + } + + public int Fire + { + get { return _fire; } + set { _fire = (short)value; } + } + + public int Air + { + get { return _air; } + set { _air = (short)value; } + } + + public bool IsOnGround + { + get { return _onGround == 1; } + set { _onGround = (byte)(value ? 1 : 0); } + } + + public Entity (string id) + { + _id = id; + } + + public Entity (Entity e) + { + _id = e._id; + + _pos = new Vector3(); + _pos.X = e._pos.X; + _pos.Y = e._pos.Y; + _pos.Z = e._pos.Z; + + _motion = new Vector3(); + _motion.X = e._motion.X; + _motion.Y = e._motion.Y; + _motion.Z = e._motion.Z; + + _rotation = new Orientation(); + _rotation.Pitch = e._rotation.Pitch; + _rotation.Yaw = e._rotation.Yaw; + + _fallDistance = e._fallDistance; + _fire = e._fire; + _air = e._air; + _onGround = e._onGround; + _world = e._world; + } + + + #region Predefined Schemas + public static readonly NBTCompoundNode MobSchema = BaseSchema.MergeInto(new NBTCompoundNode("") { new NBTStringNode("id", "Mob"), @@ -125,9 +213,112 @@ namespace Substrate.Map }); #endregion + + + #region INBTObject Members + + public Entity LoadTree (NBT_Value tree) + { + NBT_Compound ctree = tree as NBT_Compound; + if (ctree == null) { + return null; + } + + _id = ctree["id"].ToNBTString(); + + NBT_List pos = ctree["Pos"].ToNBTList(); + _pos = new Vector3(); + _pos.X = pos[0].ToNBTDouble(); + _pos.Y = pos[1].ToNBTDouble(); + _pos.Z = pos[2].ToNBTDouble(); + + NBT_List motion = ctree["Motion"].ToNBTList(); + _motion = new Vector3(); + _motion.X = motion[0].ToNBTDouble(); + _motion.Y = motion[1].ToNBTDouble(); + _motion.Z = motion[2].ToNBTDouble(); + + NBT_List rotation = ctree["Rotation"].ToNBTList(); + _rotation = new Orientation(); + _rotation.Yaw = rotation[0].ToNBTFloat(); + _rotation.Pitch = rotation[1].ToNBTFloat(); + + _fire = ctree["Fire"].ToNBTShort(); + _air = ctree["Air"].ToNBTShort(); + _onGround = ctree["OnGround"].ToNBTByte(); + + NBT_Value world; + ctree.TryGetValue("World", out world); + + if (world != null) { + _world = world.ToNBTString(); + } + + return this; + } + + public Entity LoadTreeSafe (NBT_Value tree) + { + if (!ValidateTree(tree)) { + return null; + } + + return LoadTree(tree); + } + + public NBT_Value BuildTree () + { + NBT_Compound tree = new NBT_Compound(); + tree["id"] = new NBT_String(_id); + + NBT_List pos = new NBT_List(NBT_Type.TAG_DOUBLE); + pos.Add(new NBT_Double(_pos.X)); + pos.Add(new NBT_Double(_pos.Y)); + pos.Add(new NBT_Double(_pos.Z)); + tree["Position"] = pos; + + NBT_List motion = new NBT_List(NBT_Type.TAG_DOUBLE); + motion.Add(new NBT_Double(_motion.X)); + motion.Add(new NBT_Double(_motion.Y)); + motion.Add(new NBT_Double(_motion.Z)); + tree["Motion"] = motion; + + NBT_List rotation = new NBT_List(NBT_Type.TAG_FLOAT); + rotation.Add(new NBT_Float((float)_rotation.Yaw)); + rotation.Add(new NBT_Float((float)_rotation.Pitch)); + tree["Rotation"] = rotation; + + tree["FallDistance"] = new NBT_Float(_fallDistance); + tree["Fire"] = new NBT_Short(_fire); + tree["Air"] = new NBT_Short(_air); + tree["OnGround"] = new NBT_Byte(_onGround); + + if (_world != null) { + tree["World"] = new NBT_String(_world.GetValueOrDefault()); + } + + return tree; + } + + public bool ValidateTree (NBT_Value tree) + { + return new NBTVerifier(tree, BaseSchema).Verify(); + } + + #endregion + + + #region ICopyable Members + + public Entity Copy () + { + return new Entity(this); + } + + #endregion } - public class MobEntity : Entity + public class EntityMob : Entity { }