From 13baea71918ee7c209c450156317e36d6c65fdfe Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Sun, 21 Jun 2015 17:36:42 -0400 Subject: [PATCH 1/5] Partially implement chests --- TrueCraft.API/TrueCraft.API.csproj | 7 +- TrueCraft.API/Windows/IWindow.cs | 1 + TrueCraft.API/packages.config | 4 + TrueCraft.Core/Logic/BlockProvider.cs | 2 +- TrueCraft.Core/Logic/Blocks/ChestBlock.cs | 97 ++++++++++++++ TrueCraft.Core/Logic/Blocks/WallSignBlock.cs | 19 +++ TrueCraft.Core/TrueCraft.Core.csproj | 1 + TrueCraft.Core/Windows/ChestWindow.cs | 126 +++++++++++++++++++ TrueCraft.Core/Windows/Window.cs | 4 +- TrueCraft/RemoteClient.cs | 2 +- TrueCraft/TrueCraft.csproj | 6 +- TrueCraft/packages.config | 2 +- 12 files changed, 263 insertions(+), 8 deletions(-) create mode 100644 TrueCraft.API/packages.config create mode 100644 TrueCraft.Core/Windows/ChestWindow.cs diff --git a/TrueCraft.API/TrueCraft.API.csproj b/TrueCraft.API/TrueCraft.API.csproj index 4000c40..52f909a 100644 --- a/TrueCraft.API/TrueCraft.API.csproj +++ b/TrueCraft.API/TrueCraft.API.csproj @@ -31,7 +31,7 @@ - ..\packages\YamlDotNet.3.5.1\lib\net35\YamlDotNet.dll + ..\packages\YamlDotNet.3.6.0\lib\net35\YamlDotNet.dll @@ -113,4 +113,7 @@ fNbt - \ No newline at end of file + + + + diff --git a/TrueCraft.API/Windows/IWindow.cs b/TrueCraft.API/Windows/IWindow.cs index 97ad635..b96c188 100644 --- a/TrueCraft.API/Windows/IWindow.cs +++ b/TrueCraft.API/Windows/IWindow.cs @@ -11,6 +11,7 @@ namespace TrueCraft.API.Windows string Name { get; } sbyte Type { get; } int Length { get; } + int MinecraftWasWrittenByFuckingIdiotsLength { get; } ItemStack this[int index] { get; set; } bool Empty { get; } diff --git a/TrueCraft.API/packages.config b/TrueCraft.API/packages.config new file mode 100644 index 0000000..c965a8b --- /dev/null +++ b/TrueCraft.API/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/TrueCraft.Core/Logic/BlockProvider.cs b/TrueCraft.Core/Logic/BlockProvider.cs index a01ba02..bfeefbe 100644 --- a/TrueCraft.Core/Logic/BlockProvider.cs +++ b/TrueCraft.Core/Logic/BlockProvider.cs @@ -99,7 +99,7 @@ namespace TrueCraft.Core.Logic coordinates += MathHelper.BlockFaceToCoordinates(face); var old = world.GetBlockData(coordinates); byte[] overwritable = - { + { AirBlock.BlockID, WaterBlock.BlockID, StationaryWaterBlock.BlockID, diff --git a/TrueCraft.Core/Logic/Blocks/ChestBlock.cs b/TrueCraft.Core/Logic/Blocks/ChestBlock.cs index 80a955a..022211c 100644 --- a/TrueCraft.Core/Logic/Blocks/ChestBlock.cs +++ b/TrueCraft.Core/Logic/Blocks/ChestBlock.cs @@ -2,6 +2,10 @@ using System; using TrueCraft.API; using TrueCraft.Core.Logic.Items; using TrueCraft.API.Logic; +using TrueCraft.API.World; +using TrueCraft.API.Networking; +using fNbt; +using TrueCraft.Core.Windows; namespace TrueCraft.Core.Logic.Blocks { @@ -60,5 +64,98 @@ namespace TrueCraft.Core.Logic.Blocks { get { return false; } } + + private static readonly Coordinates3D[] AdjacentBlocks = + { + Coordinates3D.North, + Coordinates3D.South, + Coordinates3D.West, + Coordinates3D.East + }; + + public override void ItemUsedOnBlock(Coordinates3D coordinates, ItemStack item, BlockFace face, IWorld world, IRemoteClient user) + { + int adjacent = 0; + var coords = coordinates + MathHelper.BlockFaceToCoordinates(face); + Coordinates3D _ = Coordinates3D.Down; + // Check for adjacent chests. We can only allow one adjacent check block. + for (int i = 0; i < AdjacentBlocks.Length; i++) + { + if (world.GetBlockID(coords + AdjacentBlocks[i]) == ChestBlock.BlockID) + { + _ = coords + AdjacentBlocks[i]; + adjacent++; + } + } + if (adjacent <= 1) + { + if (_ != Coordinates3D.Down) + { + // Confirm that adjacent chest is not a double chest + for (int i = 0; i < AdjacentBlocks.Length; i++) + { + if (world.GetBlockID(_ + AdjacentBlocks[i]) == ChestBlock.BlockID) + adjacent++; + } + } + if (adjacent <= 1) + base.ItemUsedOnBlock(coordinates, item, face, world, user); + } + } + + public override void BlockPlaced(BlockDescriptor descriptor, BlockFace face, IWorld world, IRemoteClient user) + { + world.SetMetadata(descriptor.Coordinates, (byte)MathHelper.DirectionByRotationFlat(user.Entity.Yaw, true)); + } + + public override bool BlockRightClicked(BlockDescriptor descriptor, BlockFace face, IWorld world, IRemoteClient user) + { + bool unobstructed = true, isDouble = false; + Coordinates3D other = Coordinates3D.Down; + for (int i = 0; i < AdjacentBlocks.Length; i++) + { + if (world.GetBlockID(descriptor.Coordinates + AdjacentBlocks[i]) == ChestBlock.BlockID) + { + isDouble = true; + other = descriptor.Coordinates + AdjacentBlocks[i]; + var _ = world.BlockRepository.GetBlockProvider(world.GetBlockID( + descriptor.Coordinates + AdjacentBlocks[i] + Coordinates3D.Up)); + if (_.Opaque) + unobstructed = false; + } + } + if (world.BlockRepository.GetBlockProvider(world.GetBlockID(descriptor.Coordinates + Coordinates3D.Up)).Opaque) + unobstructed = false; + if (!unobstructed) + return false; + var entity = world.GetTileEntity(descriptor.Coordinates); + var window = new ChestWindow((InventoryWindow)user.Inventory, isDouble); + if (entity != null) + { + foreach (NbtCompound item in (NbtList)entity["Items"]) + { + var stack = ItemStack.FromNbt(item); + window.ChestInventory[stack.Index] = stack; + } + } + if (isDouble) + { + entity = world.GetTileEntity(other); + if (entity != null) + { + foreach (NbtCompound item in (NbtList)entity["Items"]) + { + var stack = ItemStack.FromNbt(item); + window.ChestInventory[stack.Index] = stack; + } + } + } + user.OpenWindow(window); + window.WindowChange += (sender, e) => + { + // TODO: Update tile entity + }; // TODO: Memory leak here + return false; + } } } \ No newline at end of file diff --git a/TrueCraft.Core/Logic/Blocks/WallSignBlock.cs b/TrueCraft.Core/Logic/Blocks/WallSignBlock.cs index d28ec0d..bffa96b 100644 --- a/TrueCraft.Core/Logic/Blocks/WallSignBlock.cs +++ b/TrueCraft.Core/Logic/Blocks/WallSignBlock.cs @@ -4,6 +4,8 @@ using TrueCraft.API; using TrueCraft.API.World; using TrueCraft.API.Networking; using TrueCraft.Core.Logic.Items; +using TrueCraft.Core.Networking.Packets; +using fNbt; namespace TrueCraft.Core.Logic.Blocks { @@ -37,5 +39,22 @@ namespace TrueCraft.Core.Logic.Blocks { return new[] { new ItemStack(SignItem.ItemID) }; } + + public override void TileEntityLoadedForClient(BlockDescriptor descriptor, IWorld world, NbtCompound entity, IRemoteClient client) + { + client.QueuePacket(new UpdateSignPacket + { + X = descriptor.Coordinates.X, + Y = (short)descriptor.Coordinates.Y, + Z = descriptor.Coordinates.Z, + Text = new[] + { + entity["Text1"].StringValue, + entity["Text2"].StringValue, + entity["Text3"].StringValue, + entity["Text4"].StringValue + } + }); + } } } \ No newline at end of file diff --git a/TrueCraft.Core/TrueCraft.Core.csproj b/TrueCraft.Core/TrueCraft.Core.csproj index d43f54c..22f6ffd 100644 --- a/TrueCraft.Core/TrueCraft.Core.csproj +++ b/TrueCraft.Core/TrueCraft.Core.csproj @@ -318,6 +318,7 @@ + diff --git a/TrueCraft.Core/Windows/ChestWindow.cs b/TrueCraft.Core/Windows/ChestWindow.cs new file mode 100644 index 0000000..173d806 --- /dev/null +++ b/TrueCraft.Core/Windows/ChestWindow.cs @@ -0,0 +1,126 @@ +using System; +using TrueCraft.API.Windows; +using TrueCraft.Core.Windows; +using TrueCraft.API; + +namespace TrueCraft.Core.Windows +{ + public class ChestWindow : Window + { + public ChestWindow(InventoryWindow inventory, bool doubleChest = false) + { + DoubleChest = doubleChest; + if (doubleChest) + { + WindowAreas = new[] + { + new WindowArea(ChestIndex, 54, 9, 3), // Chest + new WindowArea(DoubleMainIndex, 27, 9, 3), // Main inventory + new WindowArea(DoubleHotbarIndex, 9, 9, 1) // Hotbar + }; + } + else + { + WindowAreas = new[] + { + new WindowArea(ChestIndex, 27, 9, 3), // Chest + new WindowArea(MainIndex, 27, 9, 3), // Main inventory + new WindowArea(HotbarIndex, 9, 9, 1) // Hotbar + }; + } + inventory.MainInventory.CopyTo(MainInventory); + inventory.Hotbar.CopyTo(Hotbar); + Copying = false; + inventory.WindowChange += (sender, e) => + { + if (Copying) return; + if ((e.SlotIndex >= InventoryWindow.MainIndex && e.SlotIndex < InventoryWindow.MainIndex + inventory.MainInventory.Length) + || (e.SlotIndex >= InventoryWindow.HotbarIndex && e.SlotIndex < InventoryWindow.HotbarIndex + inventory.Hotbar.Length)) + { + inventory.MainInventory.CopyTo(MainInventory); + inventory.Hotbar.CopyTo(Hotbar); + } + }; + foreach (var area in WindowAreas) + area.WindowChange += (s, e) => OnWindowChange(new WindowChangeEventArgs( + (s as WindowArea).StartIndex + e.SlotIndex, e.Value)); + } + + public const int ChestIndex = 0; + public const int MainIndex = 27; + public const int HotbarIndex = 54; + public const int DoubleMainIndex = 54; + public const int DoubleHotbarIndex = 81; + + public bool DoubleChest { get; set; } + public override IWindowArea[] WindowAreas { get; protected set; } + private bool Copying { get; set; } + + public override string Name + { + get + { + if (DoubleChest) + return "Large Chest"; + return "Chest"; + } + } + + public override sbyte Type + { + get + { + return 0; + } + } + + public IWindowArea ChestInventory + { + get + { + return WindowAreas[0]; + } + } + + public IWindowArea MainInventory + { + get + { + return WindowAreas[1]; + } + } + + public IWindowArea Hotbar + { + get + { + return WindowAreas[2]; + } + } + + public override int MinecraftWasWrittenByFuckingIdiotsLength + { + get + { + return ChestInventory.Length; + } + } + + public override void CopyToInventory(IWindow inventoryWindow) + { + var window = (InventoryWindow)inventoryWindow; + Copying = true; + MainInventory.CopyTo(window.MainInventory); + Hotbar.CopyTo(window.Hotbar); + Copying = false; + } + + protected override IWindowArea GetLinkedArea(int index, ItemStack slot) + { + if (index == 0) + return Hotbar; + else + return ChestInventory; + } + } +} \ No newline at end of file diff --git a/TrueCraft.Core/Windows/Window.cs b/TrueCraft.Core/Windows/Window.cs index ea54bd7..d56a3b0 100644 --- a/TrueCraft.Core/Windows/Window.cs +++ b/TrueCraft.Core/Windows/Window.cs @@ -70,7 +70,7 @@ namespace TrueCraft.Core.Windows throw new IndexOutOfRangeException(); } - public int Length + public virtual int Length { get { @@ -78,6 +78,8 @@ namespace TrueCraft.Core.Windows } } + public virtual int MinecraftWasWrittenByFuckingIdiotsLength { get { return Length; } } + public bool Empty { get diff --git a/TrueCraft/RemoteClient.cs b/TrueCraft/RemoteClient.cs index 227655c..ece4749 100644 --- a/TrueCraft/RemoteClient.cs +++ b/TrueCraft/RemoteClient.cs @@ -175,7 +175,7 @@ namespace TrueCraft CurrentWindow = window; window.ID = NextWindowID++; if (NextWindowID < 0) NextWindowID = 1; - QueuePacket(new OpenWindowPacket(window.ID, window.Type, window.Name, (sbyte)window.Length)); + QueuePacket(new OpenWindowPacket(window.ID, window.Type, window.Name, (sbyte)window.MinecraftWasWrittenByFuckingIdiotsLength)); QueuePacket(new WindowItemsPacket(window.ID, window.GetSlots())); } diff --git a/TrueCraft/TrueCraft.csproj b/TrueCraft/TrueCraft.csproj index ad320bb..affb812 100644 --- a/TrueCraft/TrueCraft.csproj +++ b/TrueCraft/TrueCraft.csproj @@ -14,6 +14,8 @@ false bin\Debug 4 + true + false false @@ -25,8 +27,8 @@ ..\lib\Ionic.Zip.Reduced.dll - - ..\packages\YamlDotNet.3.5.1\lib\net35\YamlDotNet.dll + + ..\packages\YamlDotNet.3.6.0\lib\net35\YamlDotNet.dll diff --git a/TrueCraft/packages.config b/TrueCraft/packages.config index 49d63fd..c965a8b 100644 --- a/TrueCraft/packages.config +++ b/TrueCraft/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file -- 2.47.2 From 1c340d25f7f9eebecb669d6664abbe9703df4140 Mon Sep 17 00:00:00 2001 From: William Moorehouse Date: Sun, 21 Jun 2015 19:26:58 -0400 Subject: [PATCH 2/5] Added slab renderer --- .../Rendering/Blocks/SlabRenderer.cs | 175 ++++++++++++++++++ TrueCraft.Client/TrueCraft.Client.csproj | 1 + 2 files changed, 176 insertions(+) create mode 100644 TrueCraft.Client/Rendering/Blocks/SlabRenderer.cs diff --git a/TrueCraft.Client/Rendering/Blocks/SlabRenderer.cs b/TrueCraft.Client/Rendering/Blocks/SlabRenderer.cs new file mode 100644 index 0000000..2205521 --- /dev/null +++ b/TrueCraft.Client/Rendering/Blocks/SlabRenderer.cs @@ -0,0 +1,175 @@ +using System; +using TrueCraft.Core.Logic.Blocks; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using TrueCraft.API.Logic; + +namespace TrueCraft.Client.Rendering.Blocks +{ + public class SlabRenderer : BlockRenderer + { + static SlabRenderer() + { + BlockRenderer.RegisterRenderer(StoneSlabBlock.BlockID, new SlabRenderer()); + BlockRenderer.RegisterRenderer(DoubleStoneSlabBlock.BlockID, new SlabRenderer()); + } + + public enum SlabType : byte + { + Stone = 0, + Sandstone = 1, + Wood =2, + Cobblestone = 3 + } + + protected virtual Vector2 GetSideTexture(SlabType type) + { + switch (type) + { + case SlabType.Stone: + return new Vector2(5, 0); + + case SlabType.Sandstone: + return new Vector2(0, 12); + + case SlabType.Wood: + return new Vector2(4, 0); + + case SlabType.Cobblestone: + return new Vector2(1, 0); + + default: + return Vector2.Zero; + } + } + + protected virtual Vector2 GetTopTexture(SlabType type) + { + switch (type) + { + case SlabType.Stone: + return new Vector2(6, 0); + + case SlabType.Sandstone: + return new Vector2(0, 13); + + case SlabType.Wood: + return new Vector2(4, 0); + + case SlabType.Cobblestone: + return new Vector2(1, 0); + + default: + return Vector2.Zero; + } + } + + protected virtual Vector2 GetBottomTexture(SlabType type) + { + switch (type) + { + case SlabType.Stone: + return new Vector2(6, 0); + + case SlabType.Sandstone: + return new Vector2(0, 14); + + case SlabType.Wood: + return new Vector2(4, 0); + + case SlabType.Cobblestone: + return new Vector2(1, 0); + + default: + return Vector2.Zero; + } + } + + protected virtual Vector2[] GetTextureMap(SlabType type, bool isDouble) + { + var sideTexture = GetSideTexture(type); + var topTexture = GetTopTexture(type); + var bottomTexture = GetBottomTexture(type); + + var result = new Vector2[] + { + // Positive Z + sideTexture + Vector2.UnitX + ((isDouble) ? Vector2.UnitY : Vector2.UnitY / 2), + sideTexture + ((isDouble) ? Vector2.UnitY : Vector2.UnitY / 2), + sideTexture, + sideTexture + Vector2.UnitX, + // Negative Z + sideTexture + Vector2.UnitX + ((isDouble) ? Vector2.UnitY : Vector2.UnitY / 2), + sideTexture + ((isDouble) ? Vector2.UnitY : Vector2.UnitY / 2), + sideTexture, + sideTexture + Vector2.UnitX, + // Positive X + sideTexture + Vector2.UnitX + ((isDouble) ? Vector2.UnitY : Vector2.UnitY / 2), + sideTexture + ((isDouble) ? Vector2.UnitY : Vector2.UnitY / 2), + sideTexture, + sideTexture + Vector2.UnitX, + // Negative X + sideTexture + Vector2.UnitX + ((isDouble) ? Vector2.UnitY : Vector2.UnitY / 2), + sideTexture + ((isDouble) ? Vector2.UnitY : Vector2.UnitY / 2), + sideTexture, + sideTexture + Vector2.UnitX, + // Positive Y + topTexture + Vector2.UnitX + Vector2.UnitY, + topTexture + Vector2.UnitY, + topTexture, + topTexture + Vector2.UnitX, + // Negative Y + bottomTexture + Vector2.UnitX + Vector2.UnitY, + bottomTexture + Vector2.UnitY, + bottomTexture, + bottomTexture + Vector2.UnitX + }; + + for (int i = 0; i < result.Length; i++) + result[i] *= new Vector2(16f / 256f); + + return result; + } + + public static int Value = 0; + + public override VertexPositionNormalColorTexture[] Render(BlockDescriptor descriptor, Vector3 offset, Tuple textureMap, int indiciesOffset, out int[] indicies) + { + if (descriptor.ID == StoneSlabBlock.BlockID) + return RenderSlab(descriptor, offset, textureMap, indiciesOffset, out indicies); + else + return RenderDoubleSlab(descriptor, offset, textureMap, indiciesOffset, out indicies); + } + + protected virtual VertexPositionNormalColorTexture[] RenderSlab(BlockDescriptor descriptor, Vector3 offset, Tuple textureMap, int indiciesOffset, out int[] indicies) + { + var result = CreateUniformCube(offset, GetTextureMap((SlabType)descriptor.Metadata, false), indiciesOffset, out indicies, Color.White); + for (int i = 0; i < 6; i++) + { + var face = (CubeFace)i; + switch(face) + { + case CubeFace.PositiveZ: + case CubeFace.NegativeZ: + case CubeFace.PositiveX: + case CubeFace.NegativeX: + for (int j = 2; j < 4; j++) + result[(i * 4) + j].Position.Y -= 0.5f; + break; + + case CubeFace.PositiveY: + for (int j = 0; j < 4; j++) + result[(i * 4) + j].Position.Y -= 0.5f; + break; + } + } + + return result; + } + + protected virtual VertexPositionNormalColorTexture[] RenderDoubleSlab(BlockDescriptor descriptor, Vector3 offset, Tuple textureMap, int indiciesOffset, out int[] indicies) + { + return CreateUniformCube(offset, GetTextureMap((SlabType)descriptor.Metadata, true), indiciesOffset, out indicies, Color.White); + } + } +} diff --git a/TrueCraft.Client/TrueCraft.Client.csproj b/TrueCraft.Client/TrueCraft.Client.csproj index acf12a3..6cafb2f 100644 --- a/TrueCraft.Client/TrueCraft.Client.csproj +++ b/TrueCraft.Client/TrueCraft.Client.csproj @@ -68,6 +68,7 @@ + -- 2.47.2 From 9e61bb9a981120e67dee504be6b0837f03634d87 Mon Sep 17 00:00:00 2001 From: William Moorehouse Date: Sun, 21 Jun 2015 19:52:47 -0400 Subject: [PATCH 3/5] Renamed StoneSlabBlock to SlabBlock --- .../Logic/Blocks/{StoneSlabBlock.cs => SlabBlock.cs} | 6 +++--- TrueCraft.Core/TrueCraft.Core.csproj | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) rename TrueCraft.Core/Logic/Blocks/{StoneSlabBlock.cs => SlabBlock.cs} (96%) diff --git a/TrueCraft.Core/Logic/Blocks/StoneSlabBlock.cs b/TrueCraft.Core/Logic/Blocks/SlabBlock.cs similarity index 96% rename from TrueCraft.Core/Logic/Blocks/StoneSlabBlock.cs rename to TrueCraft.Core/Logic/Blocks/SlabBlock.cs index ea6c36a..5d75725 100644 --- a/TrueCraft.Core/Logic/Blocks/StoneSlabBlock.cs +++ b/TrueCraft.Core/Logic/Blocks/SlabBlock.cs @@ -4,7 +4,7 @@ using TrueCraft.API; namespace TrueCraft.Core.Logic.Blocks { - public class StoneSlabBlock : BlockProvider + public class SlabBlock : BlockProvider { public enum SlabMaterial { @@ -120,9 +120,9 @@ namespace TrueCraft.Core.Logic.Blocks } } - public class DoubleStoneSlabBlock : BlockProvider + public class DoubleSlabBlock : SlabBlock { - public static readonly byte BlockID = 0x2B; + public static readonly new byte BlockID = 0x2B; public override byte ID { get { return 0x2B; } } diff --git a/TrueCraft.Core/TrueCraft.Core.csproj b/TrueCraft.Core/TrueCraft.Core.csproj index d43f54c..bdcbda5 100644 --- a/TrueCraft.Core/TrueCraft.Core.csproj +++ b/TrueCraft.Core/TrueCraft.Core.csproj @@ -298,7 +298,7 @@ - + -- 2.47.2 From f60f65458e2fe6fc3e6a6fb00b5d4fc99850c1d8 Mon Sep 17 00:00:00 2001 From: William Moorehouse Date: Sun, 21 Jun 2015 19:53:04 -0400 Subject: [PATCH 4/5] Implemented static texture maps --- .../Rendering/Blocks/SlabRenderer.cs | 294 +++++++++++------- 1 file changed, 177 insertions(+), 117 deletions(-) diff --git a/TrueCraft.Client/Rendering/Blocks/SlabRenderer.cs b/TrueCraft.Client/Rendering/Blocks/SlabRenderer.cs index 2205521..93ab160 100644 --- a/TrueCraft.Client/Rendering/Blocks/SlabRenderer.cs +++ b/TrueCraft.Client/Rendering/Blocks/SlabRenderer.cs @@ -8,134 +8,189 @@ namespace TrueCraft.Client.Rendering.Blocks { public class SlabRenderer : BlockRenderer { + private static Vector2 StoneTopTexture = new Vector2(6, 0); + private static Vector2 StoneSideTexture = new Vector2(5, 0); + private static Vector2 StoneBottomTexture = new Vector2(6, 0); + private static Vector2 SandstoneTopTexture = new Vector2(0, 13); + private static Vector2 SandstoneSideTexture = new Vector2(0, 12); + private static Vector2 SandstoneBottomTexture = new Vector2(0, 14); + private static Vector2 WoodTopTexture = new Vector2(4, 0); + private static Vector2 WoodSideTexture = new Vector2(4, 0); + private static Vector2 WoodBottomTexture = new Vector2(4, 0); + private static Vector2 CobbleTopTexture = new Vector2(1, 0); + private static Vector2 CobbleSideTexture = new Vector2(1, 0); + private static Vector2 CobbleBottomTexture = new Vector2(1, 0); + + private static Vector2[] StoneTextureMap = + { + // Positive Z + StoneSideTexture + Vector2.UnitX + Vector2.UnitY, + StoneSideTexture + Vector2.UnitY, + StoneSideTexture, + StoneSideTexture + Vector2.UnitX, + // Negative Z + StoneSideTexture + Vector2.UnitX + Vector2.UnitY, + StoneSideTexture + Vector2.UnitY, + StoneSideTexture, + StoneSideTexture + Vector2.UnitX, + // Positive X + StoneSideTexture + Vector2.UnitX + Vector2.UnitY, + StoneSideTexture + Vector2.UnitY, + StoneSideTexture, + StoneSideTexture + Vector2.UnitX, + // Negative X + StoneSideTexture + Vector2.UnitX + Vector2.UnitY, + StoneSideTexture + Vector2.UnitY, + StoneSideTexture, + StoneSideTexture + Vector2.UnitX, + // Negative Y + StoneTopTexture + Vector2.UnitX + Vector2.UnitY, + StoneTopTexture + Vector2.UnitY, + StoneTopTexture, + StoneTopTexture + Vector2.UnitX, + // Negative Y + StoneBottomTexture + Vector2.UnitX + Vector2.UnitY, + StoneBottomTexture + Vector2.UnitY, + StoneBottomTexture, + StoneBottomTexture + Vector2.UnitX, + }; + + private static Vector2[] SandstoneTextureMap = + { + // Positive Z + SandstoneSideTexture + Vector2.UnitX + Vector2.UnitY, + SandstoneSideTexture + Vector2.UnitY, + SandstoneSideTexture, + SandstoneSideTexture + Vector2.UnitX, + // Negative Z + SandstoneSideTexture + Vector2.UnitX + Vector2.UnitY, + SandstoneSideTexture + Vector2.UnitY, + SandstoneSideTexture, + SandstoneSideTexture + Vector2.UnitX, + // Positive X + SandstoneSideTexture + Vector2.UnitX + Vector2.UnitY, + SandstoneSideTexture + Vector2.UnitY, + SandstoneSideTexture, + SandstoneSideTexture + Vector2.UnitX, + // Negative X + SandstoneSideTexture + Vector2.UnitX + Vector2.UnitY, + SandstoneSideTexture + Vector2.UnitY, + SandstoneSideTexture, + SandstoneSideTexture + Vector2.UnitX, + // Negative Y + SandstoneTopTexture + Vector2.UnitX + Vector2.UnitY, + SandstoneTopTexture + Vector2.UnitY, + SandstoneTopTexture, + SandstoneTopTexture + Vector2.UnitX, + // Negative Y + SandstoneBottomTexture + Vector2.UnitX + Vector2.UnitY, + SandstoneBottomTexture + Vector2.UnitY, + SandstoneBottomTexture, + SandstoneBottomTexture + Vector2.UnitX, + }; + + private static Vector2[] WoodTextureMap = + { + // Positive Z + WoodSideTexture + Vector2.UnitX + Vector2.UnitY, + WoodSideTexture + Vector2.UnitY, + WoodSideTexture, + WoodSideTexture + Vector2.UnitX, + // Negative Z + WoodSideTexture + Vector2.UnitX + Vector2.UnitY, + WoodSideTexture + Vector2.UnitY, + WoodSideTexture, + WoodSideTexture + Vector2.UnitX, + // Positive X + WoodSideTexture + Vector2.UnitX + Vector2.UnitY, + WoodSideTexture + Vector2.UnitY, + WoodSideTexture, + WoodSideTexture + Vector2.UnitX, + // Negative X + WoodSideTexture + Vector2.UnitX + Vector2.UnitY, + WoodSideTexture + Vector2.UnitY, + WoodSideTexture, + WoodSideTexture + Vector2.UnitX, + // Negative Y + WoodTopTexture + Vector2.UnitX + Vector2.UnitY, + WoodTopTexture + Vector2.UnitY, + WoodTopTexture, + WoodTopTexture + Vector2.UnitX, + // Negative Y + WoodBottomTexture + Vector2.UnitX + Vector2.UnitY, + WoodBottomTexture + Vector2.UnitY, + WoodBottomTexture, + WoodBottomTexture + Vector2.UnitX, + }; + + private static Vector2[] CobbleTextureMap = + { + // Positive Z + CobbleSideTexture + Vector2.UnitX + Vector2.UnitY, + CobbleSideTexture + Vector2.UnitY, + CobbleSideTexture, + CobbleSideTexture + Vector2.UnitX, + // Negative Z + CobbleSideTexture + Vector2.UnitX + Vector2.UnitY, + CobbleSideTexture + Vector2.UnitY, + CobbleSideTexture, + CobbleSideTexture + Vector2.UnitX, + // Positive X + CobbleSideTexture + Vector2.UnitX + Vector2.UnitY, + CobbleSideTexture + Vector2.UnitY, + CobbleSideTexture, + CobbleSideTexture + Vector2.UnitX, + // Negative X + CobbleSideTexture + Vector2.UnitX + Vector2.UnitY, + CobbleSideTexture + Vector2.UnitY, + CobbleSideTexture, + CobbleSideTexture + Vector2.UnitX, + // Negative Y + CobbleTopTexture + Vector2.UnitX + Vector2.UnitY, + CobbleTopTexture + Vector2.UnitY, + CobbleTopTexture, + CobbleTopTexture + Vector2.UnitX, + // Negative Y + CobbleBottomTexture + Vector2.UnitX + Vector2.UnitY, + CobbleBottomTexture + Vector2.UnitY, + CobbleBottomTexture, + CobbleBottomTexture + Vector2.UnitX, + }; + static SlabRenderer() { - BlockRenderer.RegisterRenderer(StoneSlabBlock.BlockID, new SlabRenderer()); - BlockRenderer.RegisterRenderer(DoubleStoneSlabBlock.BlockID, new SlabRenderer()); - } + BlockRenderer.RegisterRenderer(SlabBlock.BlockID, new SlabRenderer()); + BlockRenderer.RegisterRenderer(DoubleSlabBlock.BlockID, new SlabRenderer()); - public enum SlabType : byte - { - Stone = 0, - Sandstone = 1, - Wood =2, - Cobblestone = 3 - } - - protected virtual Vector2 GetSideTexture(SlabType type) - { - switch (type) + for (int i = 0; i < StoneTextureMap.Length; i++) { - case SlabType.Stone: - return new Vector2(5, 0); - - case SlabType.Sandstone: - return new Vector2(0, 12); - - case SlabType.Wood: - return new Vector2(4, 0); - - case SlabType.Cobblestone: - return new Vector2(1, 0); - - default: - return Vector2.Zero; + StoneTextureMap[i] *= new Vector2(16f / 256f); + SandstoneTextureMap[i] *= new Vector2(16f / 256f); + WoodTextureMap[i] *= new Vector2(16f / 256f); + CobbleTextureMap[i] *= new Vector2(16f / 256f); } } - protected virtual Vector2 GetTopTexture(SlabType type) + protected virtual Vector2[] GetTextureMap(SlabBlock.SlabMaterial material) { - switch (type) + switch (material) { - case SlabType.Stone: - return new Vector2(6, 0); - - case SlabType.Sandstone: - return new Vector2(0, 13); - - case SlabType.Wood: - return new Vector2(4, 0); - - case SlabType.Cobblestone: - return new Vector2(1, 0); - + case SlabBlock.SlabMaterial.Stone: + return StoneTextureMap; + case SlabBlock.SlabMaterial.Standstone: + return SandstoneTextureMap; + case SlabBlock.SlabMaterial.Wooden: + return WoodTextureMap; + case SlabBlock.SlabMaterial.Cobblestone: + return CobbleTextureMap; default: - return Vector2.Zero; + return null; } } - protected virtual Vector2 GetBottomTexture(SlabType type) - { - switch (type) - { - case SlabType.Stone: - return new Vector2(6, 0); - - case SlabType.Sandstone: - return new Vector2(0, 14); - - case SlabType.Wood: - return new Vector2(4, 0); - - case SlabType.Cobblestone: - return new Vector2(1, 0); - - default: - return Vector2.Zero; - } - } - - protected virtual Vector2[] GetTextureMap(SlabType type, bool isDouble) - { - var sideTexture = GetSideTexture(type); - var topTexture = GetTopTexture(type); - var bottomTexture = GetBottomTexture(type); - - var result = new Vector2[] - { - // Positive Z - sideTexture + Vector2.UnitX + ((isDouble) ? Vector2.UnitY : Vector2.UnitY / 2), - sideTexture + ((isDouble) ? Vector2.UnitY : Vector2.UnitY / 2), - sideTexture, - sideTexture + Vector2.UnitX, - // Negative Z - sideTexture + Vector2.UnitX + ((isDouble) ? Vector2.UnitY : Vector2.UnitY / 2), - sideTexture + ((isDouble) ? Vector2.UnitY : Vector2.UnitY / 2), - sideTexture, - sideTexture + Vector2.UnitX, - // Positive X - sideTexture + Vector2.UnitX + ((isDouble) ? Vector2.UnitY : Vector2.UnitY / 2), - sideTexture + ((isDouble) ? Vector2.UnitY : Vector2.UnitY / 2), - sideTexture, - sideTexture + Vector2.UnitX, - // Negative X - sideTexture + Vector2.UnitX + ((isDouble) ? Vector2.UnitY : Vector2.UnitY / 2), - sideTexture + ((isDouble) ? Vector2.UnitY : Vector2.UnitY / 2), - sideTexture, - sideTexture + Vector2.UnitX, - // Positive Y - topTexture + Vector2.UnitX + Vector2.UnitY, - topTexture + Vector2.UnitY, - topTexture, - topTexture + Vector2.UnitX, - // Negative Y - bottomTexture + Vector2.UnitX + Vector2.UnitY, - bottomTexture + Vector2.UnitY, - bottomTexture, - bottomTexture + Vector2.UnitX - }; - - for (int i = 0; i < result.Length; i++) - result[i] *= new Vector2(16f / 256f); - - return result; - } - - public static int Value = 0; - public override VertexPositionNormalColorTexture[] Render(BlockDescriptor descriptor, Vector3 offset, Tuple textureMap, int indiciesOffset, out int[] indicies) { - if (descriptor.ID == StoneSlabBlock.BlockID) + if (descriptor.ID == SlabBlock.BlockID) return RenderSlab(descriptor, offset, textureMap, indiciesOffset, out indicies); else return RenderDoubleSlab(descriptor, offset, textureMap, indiciesOffset, out indicies); @@ -143,7 +198,7 @@ namespace TrueCraft.Client.Rendering.Blocks protected virtual VertexPositionNormalColorTexture[] RenderSlab(BlockDescriptor descriptor, Vector3 offset, Tuple textureMap, int indiciesOffset, out int[] indicies) { - var result = CreateUniformCube(offset, GetTextureMap((SlabType)descriptor.Metadata, false), indiciesOffset, out indicies, Color.White); + var result = CreateUniformCube(offset, GetTextureMap((SlabBlock.SlabMaterial)descriptor.Metadata), indiciesOffset, out indicies, Color.White); for (int i = 0; i < 6; i++) { var face = (CubeFace)i; @@ -153,8 +208,13 @@ namespace TrueCraft.Client.Rendering.Blocks case CubeFace.NegativeZ: case CubeFace.PositiveX: case CubeFace.NegativeX: - for (int j = 2; j < 4; j++) - result[(i * 4) + j].Position.Y -= 0.5f; + for (int j = 0; j < 2; j++) + result[(i * 4) + j].Texture.Y -= (1f / 32f); + for (int k = 2; k < 4; k++) + { + result[(i * 4) + k].Position.Y -= 0.5f; + // result[(i * 4) + k].Texture.Y -= (1f / 16f); + } break; case CubeFace.PositiveY: @@ -169,7 +229,7 @@ namespace TrueCraft.Client.Rendering.Blocks protected virtual VertexPositionNormalColorTexture[] RenderDoubleSlab(BlockDescriptor descriptor, Vector3 offset, Tuple textureMap, int indiciesOffset, out int[] indicies) { - return CreateUniformCube(offset, GetTextureMap((SlabType)descriptor.Metadata, true), indiciesOffset, out indicies, Color.White); + return CreateUniformCube(offset, GetTextureMap((SlabBlock.SlabMaterial)descriptor.Metadata), indiciesOffset, out indicies, Color.White); } } } -- 2.47.2 From 1633d214c1f92bb4d56cdc1641e8e8c19b55c324 Mon Sep 17 00:00:00 2001 From: William Moorehouse Date: Sun, 21 Jun 2015 19:57:12 -0400 Subject: [PATCH 5/5] Don't crash when block values are invalid --- TrueCraft.Client/Rendering/Blocks/SlabRenderer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TrueCraft.Client/Rendering/Blocks/SlabRenderer.cs b/TrueCraft.Client/Rendering/Blocks/SlabRenderer.cs index 93ab160..06fc728 100644 --- a/TrueCraft.Client/Rendering/Blocks/SlabRenderer.cs +++ b/TrueCraft.Client/Rendering/Blocks/SlabRenderer.cs @@ -184,7 +184,7 @@ namespace TrueCraft.Client.Rendering.Blocks case SlabBlock.SlabMaterial.Cobblestone: return CobbleTextureMap; default: - return null; + return StoneTextureMap; } } -- 2.47.2