summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--classic/ext_block_permissions.go10
-rw-r--r--server/block_def.go51
-rw-r--r--server/blocks.go12
-rw-r--r--server/player.go3
-rw-r--r--server/server.go1
5 files changed, 74 insertions, 3 deletions
diff --git a/classic/ext_block_permissions.go b/classic/ext_block_permissions.go
new file mode 100644
index 0000000..d0523da
--- /dev/null
+++ b/classic/ext_block_permissions.go
@@ -0,0 +1,10 @@
+package classic
+
+type SetBlockPermission struct {
+ BlockId byte
+ AllowPlacement byte
+ AllowDeletion byte
+}
+func (p *SetBlockPermission) PacketId() byte {
+ return 0x1c
+}
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",