diff --git a/SubstrateCS/Source/AlphaBlockCollection.cs b/SubstrateCS/Source/AlphaBlockCollection.cs index 6f05a2d..9c1b331 100644 --- a/SubstrateCS/Source/AlphaBlockCollection.cs +++ b/SubstrateCS/Source/AlphaBlockCollection.cs @@ -677,9 +677,15 @@ namespace Substrate } /// - public TileEntity GetTileEntity (int x, int y, int z) + public TileEntity GetTileEntity(int x, int y, int z) { - return _tileEntityManager.GetTileEntity(x, y, z); + return GetTileEntity(x, y, z, false); + } + + /// + public TileEntity GetTileEntity(int x, int y, int z, bool unregistered) + { + return _tileEntityManager.GetTileEntity(x, y, z, unregistered); } internal TileEntity GetTileEntity (int index) @@ -687,7 +693,7 @@ namespace Substrate int x, y, z; _blocks.GetMultiIndex(index, out x, out y, out z); - return _tileEntityManager.GetTileEntity(x, y, z); + return GetTileEntity(x, y, z, false); } /// diff --git a/SubstrateCS/Source/Core/BlockTileEntities.cs b/SubstrateCS/Source/Core/BlockTileEntities.cs index 4876da6..0790add 100644 --- a/SubstrateCS/Source/Core/BlockTileEntities.cs +++ b/SubstrateCS/Source/Core/BlockTileEntities.cs @@ -31,7 +31,7 @@ namespace Substrate.Core BuildTileEntityCache(); } - public TileEntity GetTileEntity (int x, int y, int z) + public TileEntity GetTileEntity (int x, int y, int z, bool unregistered) { BlockKey key = (TranslateCoordinates != null) ? TranslateCoordinates(x, y, z) @@ -43,7 +43,7 @@ namespace Substrate.Core return null; } - return TileEntityFactory.Create(te); + return unregistered ? TileEntityFactory.CreateAlways(te) : TileEntityFactory.Create(te); } public void SetTileEntity (int x, int y, int z, TileEntity te) diff --git a/SubstrateCS/Source/TileEntityFactory.cs b/SubstrateCS/Source/TileEntityFactory.cs index cb2f033..5d7865a 100644 --- a/SubstrateCS/Source/TileEntityFactory.cs +++ b/SubstrateCS/Source/TileEntityFactory.cs @@ -36,12 +36,13 @@ namespace Substrate /// /// A representing a single Tile Entity, containing an 'id' field of the Tile Entity's registered name. /// A new instance of a concrete type, or null if no type was registered with the given name. - public static TileEntity Create (TagNodeCompound tree) + public static TileEntity Create(TagNodeCompound tree) { string type = tree["id"].ToTagString(); Type t; - if (!_registry.TryGetValue(type, out t)) { + if (!_registry.TryGetValue(type, out t)) + { return null; } @@ -50,6 +51,31 @@ namespace Substrate return te.LoadTreeSafe(tree); } + /// + /// Create a new instance of a type by NBT node, or a blank TileEntity otherwise. + /// + /// A representing a single Tile Entity, containing an 'id' field of the Tile Entity's registered name. + /// A new instance of a concrete type, or null if no type was registered with the given name. + public static TileEntity CreateAlways(TagNodeCompound tree) + { + string type = tree["id"].ToTagString(); + + Type t; + + TileEntity te; + + if (!_registry.TryGetValue(type, out t)) + { + te = new TileEntity(""); + } + else + { + te = Activator.CreateInstance(t) as TileEntity; + } + + return te.LoadTreeSafe(tree); + } + /// /// Lookup a concrete type by name. ///