summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/block_def.go70
-rw-r--r--server/blocks.go47
2 files changed, 105 insertions, 12 deletions
diff --git a/server/block_def.go b/server/block_def.go
index a5adb40..cbd4596 100644
--- a/server/block_def.go
+++ b/server/block_def.go
@@ -70,15 +70,36 @@ type blockDef struct {
}
type rotateVariant int
+type slabMaterial struct{}
+type slabVariant bool
+
+func markVariants(variants map[any]blockType) {
+ for _, block := range variants {
+ def := blockDefinitions[block]
+ if def.Variants == nil {
+ def.Variants = make(map[any]blockType)
+ blockDefinitions[block] = def
+ }
+ for variation, block := range variants {
+ def.Variants[variation] = block
+ }
+ }
+}
+
+func assertNoDef(block blockType) {
+ if _, ok := blockDefinitions[block]; ok {
+ panic("variant would override existing block")
+ }
+}
var rotationNames = []string {"-N", "-E", "-S", "-W"}
func makeRotations(block blockType) {
- var variants = make(map[any]blockType)
oldDef := blockDefinitions[block]
+ variants := make(map[any]blockType)
for i := 0; i < 4; i++ {
newBlock := block + blockType(i)
- if _, ok := blockDefinitions[newBlock]; i != 0 && ok {
- panic("variant would override existing block")
+ if i != 0 {
+ assertNoDef(newBlock)
}
newDef := oldDef
for j := 0; j < 4; j++ {
@@ -106,9 +127,50 @@ func makeRotations(block blockType) {
newDef.Min = [3]byte {byte(minX), oldDef.Min[1], byte(minZ)}
newDef.Max = [3]byte {byte(maxX), oldDef.Max[1], byte(maxZ)}
newDef.Name = newDef.Name + rotationNames[i]
- newDef.Variants = variants
+ variants[rotateVariant(i)] = newBlock
blockDefinitions[newBlock] = newDef
}
+ markVariants(variants)
+}
+
+func makeSlabs(material blockType, slab blockType, name string) {
+ materialDef := blockDefinitions[material]
+ variants := make(map[any]blockType)
+ variants[slabMaterial{}] = material
+
+ if name == "" {
+ name = materialDef.Name + " Slab"
+ }
+
+ bottomSlab := materialDef
+ bottomSlab.Name = name + "-D"
+ bottomSlab.Shape = cuboidShape
+ bottomSlab.Min = [3]byte {0, 0, 0}
+ bottomSlab.Max = [3]byte {16, 8, 16}
+ switch material {
+ default:
+ assertNoDef(slab)
+ variants[slabVariant(false)] = slab
+ blockDefinitions[slab] = bottomSlab
+ case blockDoubleSlab:
+ variants[slabVariant(false)] = blockSlab
+ blockDefinitions[blockSlab] = bottomSlab
+ slab--
+ case blockCobblestone:
+ variants[slabVariant(false)] = blockCobblestoneSlab
+ blockDefinitions[blockCobblestoneSlab] = bottomSlab
+ slab--
+ }
+ topSlab := materialDef
+ topSlab.Name = name + "-U"
+ topSlab.Shape = cuboidShape
+ topSlab.Min = [3]byte {0, 8, 0}
+ topSlab.Max = [3]byte {16, 16, 16}
+ assertNoDef(slab + 1)
+ variants[slabVariant(true)] = slab + 1
+ blockDefinitions[slab + 1] = topSlab
+
+ markVariants(variants)
}
func getBlockDefPackets() iter.Seq[classic.Packet] {
diff --git a/server/blocks.go b/server/blocks.go
index 2d2ed20..c31d548 100644
--- a/server/blocks.go
+++ b/server/blocks.go
@@ -73,20 +73,47 @@ const (
blockPolishedStone
blockPumpkin
blockJackOLantern; _; _; _
- blockWoodPole
- blockStonePole
- blockCobblestonePole
-// blockSlabTop
-// blockStoneSlab
-// blockStoneSlabTop
-// blockWoodSlab
-// blockWoodSlabTop
+ blockTopSlab
+ blockStoneSlab; _
+ blockWoodSlab; _
+ blockCobblestoneTopSlab
+// blockWoodPole
+// blockStonePole
+// blockCobblestonePole
// blockWoodStair
// blockStoneStair
// blockCobblestoneStair
)
var blockDefinitions = map[blockType]blockDef {
+ blockStone: blockDef {
+ Name: "Stone",
+ Solidity: solid,
+ MovementSpeed: 128,
+ WalkSound: stoneSound,
+ Textures: [6]textureId {0x01, fillTextures},
+ },
+ blockPlanks: blockDef {
+ Name: "Wood",
+ Solidity: solid,
+ MovementSpeed: 128,
+ WalkSound: woodSound,
+ Textures: [6]textureId {0x04, fillTextures},
+ },
+ blockCobblestone: blockDef {
+ Name: "Cobblestone",
+ Solidity: solid,
+ MovementSpeed: 128,
+ WalkSound: stoneSound,
+ Textures: [6]textureId {0x10, fillTextures},
+ },
+ blockDoubleSlab: blockDef {
+ Name: "Double Polished Stone Slab",
+ Solidity: solid,
+ MovementSpeed: 128,
+ WalkSound: stoneSound,
+ Textures: [6]textureId {0x06, 0x05, 0x05, 0x05, 0x05, 0x06},
+ },
blockMossyStoneBricks: blockDef {
Name: "Mossy Stone Bricks",
Solidity: solid,
@@ -126,4 +153,8 @@ var blockDefinitions = map[blockType]blockDef {
func init() {
makeRotations(blockJackOLantern)
+ makeSlabs(blockDoubleSlab, blockTopSlab, "Polished Stone Slab")
+ makeSlabs(blockCobblestone, blockCobblestoneTopSlab, "")
+ makeSlabs(blockPlanks, blockWoodSlab, "")
+ makeSlabs(blockStone, blockStoneSlab, "")
}