From 5130dafed153210d01388f36b440c6156ae127b8 Mon Sep 17 00:00:00 2001 From: raven Date: Wed, 25 Mar 2026 16:08:04 -0500 Subject: BlockPermissions --- server/block_def.go | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- server/blocks.go | 12 +++++++++++- server/player.go | 3 +++ server/server.go | 1 + 4 files changed, 64 insertions(+), 3 deletions(-) (limited to 'server') diff --git a/server/block_def.go b/server/block_def.go index 631a388..28ae0ef 100644 --- a/server/block_def.go +++ b/server/block_def.go @@ -66,6 +66,7 @@ type blockDef struct { Opacity blockOpacity FogDensity byte FogColor [3]byte + AuthLevel authLevel Variants map[any]blockType } @@ -248,17 +249,63 @@ func getBlockDefPackets() iter.Seq[classic.Packet] { func getInventoryPackets(inventoryList []blockType) iter.Seq[classic.Packet] { return func(yield func(classic.Packet) bool) { + var ok bool for i := 0; i < 256; i++ { // clear inventory first - yield(&classic.InventoryOrder { + ok = yield(&classic.InventoryOrder { Order: 0, BlockId: byte(i), }) } for i, block := range inventoryList { - yield(&classic.InventoryOrder { + ok = yield(&classic.InventoryOrder { Order: byte(i + 1), BlockId: byte(block), }) } + if !ok { + return + } + } +} + +func getBlockPermissionPackets(auth authLevel) iter.Seq[classic.Packet] { + return func(yield func(classic.Packet) bool) { + for block, def := range blockDefinitions { + var packet classic.Packet + if auth < def.AuthLevel { + packet = &classic.SetBlockPermission { + BlockId: byte(block), + AllowPlacement: 0, + AllowDeletion: 0, + } + } else { + packet = &classic.SetBlockPermission { + BlockId: byte(block), + AllowPlacement: 1, + AllowDeletion: 1, + } + } + if !yield(packet) { + return + } + } + var placeLiquids byte + if auth >= defaultAuth { + placeLiquids = 1 + } + var ok bool + ok = yield(&classic.SetBlockPermission { + BlockId: blockWater, + AllowPlacement: placeLiquids, + AllowDeletion: placeLiquids, + }) + if !ok { + return + } + yield(&classic.SetBlockPermission { + BlockId: blockLava, + AllowPlacement: placeLiquids, + AllowDeletion: placeLiquids, + }) } } diff --git a/server/blocks.go b/server/blocks.go index bd4bbda..7bf7add 100644 --- a/server/blocks.go +++ b/server/blocks.go @@ -77,6 +77,7 @@ const ( blockStoneSlab; _ blockWoodSlab; _ blockCobblestoneTopSlab + blockBedrockSlab; _ // blockWoodPole // blockStonePole // blockCobblestonePole @@ -86,6 +87,14 @@ const ( ) var blockDefinitions = map[blockType]blockDef { + blockBedrock: blockDef { + Name: "Bedrock", + Solidity: solid, + MovementSpeed: 128, + WalkSound: stoneSound, + Textures: [6]textureId {0x11, fillTextures}, + AuthLevel: cheatAuth, + }, blockStone: blockDef { Name: "Stone", Solidity: solid, @@ -157,6 +166,7 @@ func init() { makeSlabs(blockCobblestone, blockCobblestoneTopSlab, "") makeSlabs(blockPlanks, blockWoodSlab, "") makeSlabs(blockStone, blockStoneSlab, "") + makeSlabs(blockBedrock, blockBedrockSlab, "") } var inventoryList = []blockType { @@ -175,5 +185,5 @@ var inventoryList = []blockType { blockTile, blockMagma, blockPillar, blockCrate, blockStoneBricks, blockMossyStoneBricks, blockCrackedStoneBricks, blockPolishedStone, blockDoubleSlab, blockSlab, blockStoneSlab, blockCobblestoneSlab, - blockWoodSlab, blockPumpkin, blockJackOLantern, + blockWoodSlab, blockBedrockSlab, blockPumpkin, blockJackOLantern, } diff --git a/server/player.go b/server/player.go index 358381d..51ddf54 100644 --- a/server/player.go +++ b/server/player.go @@ -110,6 +110,9 @@ func (p *player) sendAuthInfo() { JumpHeight: 40, }) } + if p.extensions["BlockPermissions"] { + p.client.SendPackets(p, getBlockPermissionPackets(p.state.Auth)) + } } func (p *player) handlePacket(packet classic.Packet) { diff --git a/server/server.go b/server/server.go index 1ee7994..7aee35c 100644 --- a/server/server.go +++ b/server/server.go @@ -26,6 +26,7 @@ var supportedExtensions = []string { "BlockDefinitions", "BlockDefinitionsExt.2", "InventoryOrder", + "BlockPermissions", } var requiredExtensions = []string { "ExtEntityPositions", -- cgit v1.2.3