From f63d6b40c9b6797cd631584f7c47f549051aa8ec Mon Sep 17 00:00:00 2001 From: effery Date: Tue, 24 Mar 2026 16:28:30 +1300 Subject: [PATCH 1/5] Add Basic Material Data interface class, and derived type Sign --- .../Material/Attachable.cs | 6 ++ .../Material/Directional.cs | 7 ++ .../Material/MaterialData.cs | 41 ++++++++ Minecraft.Server.FourKit/Material/Sign.cs | 98 +++++++++++++++++++ 4 files changed, 152 insertions(+) create mode 100644 Minecraft.Server.FourKit/Material/Attachable.cs create mode 100644 Minecraft.Server.FourKit/Material/Directional.cs create mode 100644 Minecraft.Server.FourKit/Material/MaterialData.cs create mode 100644 Minecraft.Server.FourKit/Material/Sign.cs diff --git a/Minecraft.Server.FourKit/Material/Attachable.cs b/Minecraft.Server.FourKit/Material/Attachable.cs new file mode 100644 index 000000000..59487e6b0 --- /dev/null +++ b/Minecraft.Server.FourKit/Material/Attachable.cs @@ -0,0 +1,6 @@ +namespace Minecraft.Server.FourKit.Material; + +public interface Attachable : Directional +{ + public BlockFace getAttachedFace(); +} \ No newline at end of file diff --git a/Minecraft.Server.FourKit/Material/Directional.cs b/Minecraft.Server.FourKit/Material/Directional.cs new file mode 100644 index 000000000..970752440 --- /dev/null +++ b/Minecraft.Server.FourKit/Material/Directional.cs @@ -0,0 +1,7 @@ +namespace Minecraft.Server.FourKit.Material; + +public interface Directional +{ + public void setFacingDirection(BlockFace face); + public BlockFace getFacing(); +} \ No newline at end of file diff --git a/Minecraft.Server.FourKit/Material/MaterialData.cs b/Minecraft.Server.FourKit/Material/MaterialData.cs new file mode 100644 index 000000000..8ba434daa --- /dev/null +++ b/Minecraft.Server.FourKit/Material/MaterialData.cs @@ -0,0 +1,41 @@ +namespace Minecraft.Server.FourKit.Material; + +public class MaterialData +{ + private readonly int _typeId; + private byte _data = 0; + + public MaterialData(int typeId) + { + this(typeId, (byte) 0) + } + + public MaterialData(Material type) + { + this((int) type, (byte) 0); + } + + public MaterialData(int typeId, byte data) + { + _typeId = typeId; + _data = data; + } + + public MaterialData(Material type, byte data) + { + this((int)type, data) + } + + public byte getData() => _data; + + public void setData(byte data) { + _data = data; + } + + public Material getItemType() => (Material)_typeId; + + public int getItemTypeId() => _typeId; + + + +} \ No newline at end of file diff --git a/Minecraft.Server.FourKit/Material/Sign.cs b/Minecraft.Server.FourKit/Material/Sign.cs new file mode 100644 index 000000000..bc8aa27ea --- /dev/null +++ b/Minecraft.Server.FourKit/Material/Sign.cs @@ -0,0 +1,98 @@ +namespace Minecraft.Server.FourKit.Material; + +public class Sign : MaterialData, Attachable +{ + public Sign() : base((int)Material.SIGN_POST) { } + + public Sign(int typeId) : base(typeId) { } + + public Sign(Material type) : base(type) { } + + public Sign(int typeId, byte data) : base(typeId, data) { } + + public Sign(Material type, byte data) : base(type, data) { } + + public bool isWallSign() + { + return getItemType() == Material.WALL_SIGN; + } + + public BlockFace getAttachedFace() + { + if (!isWallSign()) + { + return BlockFace.DOWN; + } + + return getData() switch{ + 0x2 => BlockFace.SOUTH, + 0x3 => BlockFace.NORTH, + 0x4 => BlockFace.EAST, + 0x5 => BlockFace.WEST, + _ => BlockFace.Self + }; + } + + public BlockFace getFacing() + { + if (isWallSign()) + { + return getAttachedFace().getOppositeFace(); + } + + return getData() switch + { + 0x0 => BlockFace.SOUTH, + 0x1 => BlockFace.SOUTH_SOUTH_WEST, + 0x2 => BlockFace.SOUTH_WEST, + 0x3 => BlockFace.WEST_SOUTH_WEST, + 0x4 => BlockFace.WEST, + 0x5 => BlockFace.WEST_NORTH_WEST, + 0x6 => BlockFace.NORTH_WEST, + 0x7 => BlockFace.NORTH_NORTH_WEST, + 0x8 => BlockFace.NORTH, + 0x9 => BlockFace.NORTH_NORTH_EAST, + 0xA => BlockFace.NORTH_EAST, + 0xB => BlockFace.EAST_NORTH_EAST, + 0xC => BlockFace.EAST, + 0xD => BlockFace.EAST_SOUTH_EAST, + 0xE => BlockFace.SOUTH_EAST, + 0xF => BlockFace.SOUTH_SOUTH_EAST, + _ => BlockFace.SELF + }; + } + + public void setFacingDirection(BlockFace face) + { + byte data = isWallSign() + ? face switch + { + BlockFace.NORTH => 0x2, + BlockFace.SOUTH => 0x3, + BlockFace.WEST => 0x4, + _ => 0x5 // EAST/default + } + : face switch + { + BlockFace.SOUTH => 0x0, + BlockFace.SOUTH_SOUTH_WEST => 0x1, + BlockFace.SOUTH_WEST => 0x2, + BlockFace.WEST_SOUTH_WEST => 0x3, + BlockFace.WEST => 0x4, + BlockFace.WEST_NORTH_WEST => 0x5, + BlockFace.NORTH_WEST => 0x6, + BlockFace.NORTH_NORTH_WEST => 0x7, + BlockFace.NORTH => 0x8, + BlockFace.NORTH_NORTH_EAST => 0x9, + BlockFace.NORTH_EAST => 0xA, + BlockFace.EAST_NORTH_EAST => 0xB, + BlockFace.EAST => 0xC, + BlockFace.EAST_SOUTH_EAST => 0xD, + BlockFace.SOUTH_SOUTH_EAST => 0xF, + _ => 0xE // SOUTH_EAST/default + }; + + setData(data); + } + +} \ No newline at end of file From 4da65462f3df97bfa2b03d1087455f5ebf50193c Mon Sep 17 00:00:00 2001 From: effery Date: Tue, 24 Mar 2026 16:32:36 +1300 Subject: [PATCH 2/5] the dreaded ; --- Minecraft.Server.FourKit/Material/MaterialData.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Minecraft.Server.FourKit/Material/MaterialData.cs b/Minecraft.Server.FourKit/Material/MaterialData.cs index 8ba434daa..65d1c535a 100644 --- a/Minecraft.Server.FourKit/Material/MaterialData.cs +++ b/Minecraft.Server.FourKit/Material/MaterialData.cs @@ -7,7 +7,7 @@ public class MaterialData public MaterialData(int typeId) { - this(typeId, (byte) 0) + this(typeId, (byte)0); } public MaterialData(Material type) @@ -23,7 +23,7 @@ public MaterialData(int typeId, byte data) public MaterialData(Material type, byte data) { - this((int)type, data) + this((int)type, data); } public byte getData() => _data; From 782b78eb8f512b0acac30b28ae898d27e1e1e2e4 Mon Sep 17 00:00:00 2001 From: effery Date: Tue, 24 Mar 2026 16:43:29 +1300 Subject: [PATCH 3/5] fix build errors --- .../Material/Attachable.cs | 3 +- .../Material/Directional.cs | 3 +- .../Material/MaterialData.cs | 19 ++---- Minecraft.Server.FourKit/Material/Sign.cs | 61 ++++++++++--------- 4 files changed, 40 insertions(+), 46 deletions(-) diff --git a/Minecraft.Server.FourKit/Material/Attachable.cs b/Minecraft.Server.FourKit/Material/Attachable.cs index 59487e6b0..1ce852f4f 100644 --- a/Minecraft.Server.FourKit/Material/Attachable.cs +++ b/Minecraft.Server.FourKit/Material/Attachable.cs @@ -1,4 +1,5 @@ -namespace Minecraft.Server.FourKit.Material; +using Minecraft.Server.FourKit.Block; +namespace Minecraft.Server.FourKit.material; public interface Attachable : Directional { diff --git a/Minecraft.Server.FourKit/Material/Directional.cs b/Minecraft.Server.FourKit/Material/Directional.cs index 970752440..b3ce21004 100644 --- a/Minecraft.Server.FourKit/Material/Directional.cs +++ b/Minecraft.Server.FourKit/Material/Directional.cs @@ -1,4 +1,5 @@ -namespace Minecraft.Server.FourKit.Material; +using Minecraft.Server.FourKit.Block; +namespace Minecraft.Server.FourKit.material; public interface Directional { diff --git a/Minecraft.Server.FourKit/Material/MaterialData.cs b/Minecraft.Server.FourKit/Material/MaterialData.cs index 65d1c535a..4cb80e82c 100644 --- a/Minecraft.Server.FourKit/Material/MaterialData.cs +++ b/Minecraft.Server.FourKit/Material/MaterialData.cs @@ -1,19 +1,13 @@ -namespace Minecraft.Server.FourKit.Material; +namespace Minecraft.Server.FourKit.material; public class MaterialData { private readonly int _typeId; private byte _data = 0; - public MaterialData(int typeId) - { - this(typeId, (byte)0); - } + public MaterialData(int typeId) : this(typeId, (byte)0) { } - public MaterialData(Material type) - { - this((int) type, (byte) 0); - } + public MaterialData(Material type) : this((int)type, (byte)0) { } public MaterialData(int typeId, byte data) { @@ -21,10 +15,7 @@ public MaterialData(int typeId, byte data) _data = data; } - public MaterialData(Material type, byte data) - { - this((int)type, data); - } + public MaterialData(Material type, byte data) : this((int)type, data) { } public byte getData() => _data; @@ -36,6 +27,4 @@ public void setData(byte data) { public int getItemTypeId() => _typeId; - - } \ No newline at end of file diff --git a/Minecraft.Server.FourKit/Material/Sign.cs b/Minecraft.Server.FourKit/Material/Sign.cs index bc8aa27ea..b46a8ebca 100644 --- a/Minecraft.Server.FourKit/Material/Sign.cs +++ b/Minecraft.Server.FourKit/Material/Sign.cs @@ -1,4 +1,6 @@ -namespace Minecraft.Server.FourKit.Material; +using Minecraft.Server.FourKit.Block; + +namespace Minecraft.Server.FourKit.material; public class Sign : MaterialData, Attachable { @@ -29,7 +31,7 @@ public BlockFace getAttachedFace() 0x3 => BlockFace.NORTH, 0x4 => BlockFace.EAST, 0x5 => BlockFace.WEST, - _ => BlockFace.Self + _ => BlockFace.SELF }; } @@ -64,33 +66,34 @@ public BlockFace getFacing() public void setFacingDirection(BlockFace face) { - byte data = isWallSign() - ? face switch - { - BlockFace.NORTH => 0x2, - BlockFace.SOUTH => 0x3, - BlockFace.WEST => 0x4, - _ => 0x5 // EAST/default - } - : face switch - { - BlockFace.SOUTH => 0x0, - BlockFace.SOUTH_SOUTH_WEST => 0x1, - BlockFace.SOUTH_WEST => 0x2, - BlockFace.WEST_SOUTH_WEST => 0x3, - BlockFace.WEST => 0x4, - BlockFace.WEST_NORTH_WEST => 0x5, - BlockFace.NORTH_WEST => 0x6, - BlockFace.NORTH_NORTH_WEST => 0x7, - BlockFace.NORTH => 0x8, - BlockFace.NORTH_NORTH_EAST => 0x9, - BlockFace.NORTH_EAST => 0xA, - BlockFace.EAST_NORTH_EAST => 0xB, - BlockFace.EAST => 0xC, - BlockFace.EAST_SOUTH_EAST => 0xD, - BlockFace.SOUTH_SOUTH_EAST => 0xF, - _ => 0xE // SOUTH_EAST/default - }; + byte data = (byte)( + isWallSign() + ? face switch + { + BlockFace.NORTH => 0x2, + BlockFace.SOUTH => 0x3, + BlockFace.WEST => 0x4, + _ => 0x5 // EAST/default + } + : face switch + { + BlockFace.SOUTH => 0x0, + BlockFace.SOUTH_SOUTH_WEST => 0x1, + BlockFace.SOUTH_WEST => 0x2, + BlockFace.WEST_SOUTH_WEST => 0x3, + BlockFace.WEST => 0x4, + BlockFace.WEST_NORTH_WEST => 0x5, + BlockFace.NORTH_WEST => 0x6, + BlockFace.NORTH_NORTH_WEST => 0x7, + BlockFace.NORTH => 0x8, + BlockFace.NORTH_NORTH_EAST => 0x9, + BlockFace.NORTH_EAST => 0xA, + BlockFace.EAST_NORTH_EAST => 0xB, + BlockFace.EAST => 0xC, + BlockFace.EAST_SOUTH_EAST => 0xD, + BlockFace.SOUTH_SOUTH_EAST => 0xF, + _ => 0xE // SOUTH_EAST/default + }); setData(data); } From 821e35fec6092b93bf326b0daddc453d443238ea Mon Sep 17 00:00:00 2001 From: effery Date: Tue, 24 Mar 2026 16:50:02 +1300 Subject: [PATCH 4/5] MaterialData Docs --- .../Material/MaterialData.cs | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/Minecraft.Server.FourKit/Material/MaterialData.cs b/Minecraft.Server.FourKit/Material/MaterialData.cs index 4cb80e82c..adb905186 100644 --- a/Minecraft.Server.FourKit/Material/MaterialData.cs +++ b/Minecraft.Server.FourKit/Material/MaterialData.cs @@ -17,14 +17,30 @@ public MaterialData(int typeId, byte data) public MaterialData(Material type, byte data) : this((int)type, data) { } - public byte getData() => _data; - - public void setData(byte data) { + /// + /// Gets the raw data in this material + /// + /// raw data + public byte getData() => _data; + + /// + /// Sets the raw data of this material + /// + /// New raw data + public void setData(byte data) { _data = data; } - public Material getItemType() => (Material)_typeId; + /// + /// Gets the Material that this MaterialData represents + /// + /// Material represented by this MaterialData + public Material getItemType() => (Material)_typeId; + /// + /// Gets the Material Id that this MaterialData represents + /// + /// Material Id represented by this MaterialData public int getItemTypeId() => _typeId; } \ No newline at end of file From bc3c6be59ec3e137514f0b677db75807a1d99377 Mon Sep 17 00:00:00 2001 From: effery Date: Tue, 24 Mar 2026 16:59:52 +1300 Subject: [PATCH 5/5] Add Sign.cs Docs and ToString overrides --- .../Material/MaterialData.cs | 2 ++ Minecraft.Server.FourKit/Material/Sign.cs | 30 ++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/Minecraft.Server.FourKit/Material/MaterialData.cs b/Minecraft.Server.FourKit/Material/MaterialData.cs index adb905186..54d701480 100644 --- a/Minecraft.Server.FourKit/Material/MaterialData.cs +++ b/Minecraft.Server.FourKit/Material/MaterialData.cs @@ -43,4 +43,6 @@ public void setData(byte data) { /// Material Id represented by this MaterialData public int getItemTypeId() => _typeId; + + public override string ToString() => $"{getItemType()}({getData()})"; } \ No newline at end of file diff --git a/Minecraft.Server.FourKit/Material/Sign.cs b/Minecraft.Server.FourKit/Material/Sign.cs index b46a8ebca..05cb0fcf5 100644 --- a/Minecraft.Server.FourKit/Material/Sign.cs +++ b/Minecraft.Server.FourKit/Material/Sign.cs @@ -14,12 +14,21 @@ public Sign(int typeId, byte data) : base(typeId, data) { } public Sign(Material type, byte data) : base(type, data) { } - public bool isWallSign() + /// + /// Check if this sign is attached to a wall + /// + /// true if this sign is attached to a wall, false if set on top of + /// a block + public bool isWallSign() { return getItemType() == Material.WALL_SIGN; } - public BlockFace getAttachedFace() + /// + /// Gets the face that this block is attached on + /// + /// BlockFace attached to + public BlockFace getAttachedFace() { if (!isWallSign()) { @@ -35,7 +44,11 @@ public BlockFace getAttachedFace() }; } - public BlockFace getFacing() + /// + /// Gets the direction that this sign is currently facing + /// + /// BlockFace indicating where this sign is facing + public BlockFace getFacing() { if (isWallSign()) { @@ -64,7 +77,11 @@ public BlockFace getFacing() }; } - public void setFacingDirection(BlockFace face) + /// + /// Sets the direction that this sign is currently facing + /// + /// BlockFace Direction to point + public void setFacingDirection(BlockFace face) { byte data = (byte)( isWallSign() @@ -98,4 +115,9 @@ public void setFacingDirection(BlockFace face) setData(data); } + public override string ToString() + { + return $"{base.ToString()} facing {getFacing()}"; + } + } \ No newline at end of file