summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/level.go21
-rw-r--r--server/player.go6
2 files changed, 26 insertions, 1 deletions
diff --git a/server/level.go b/server/level.go
index 17f8eb8..7b03aca 100644
--- a/server/level.go
+++ b/server/level.go
@@ -236,6 +236,27 @@ func (l *level) SetBlock(from phony.Actor, pos blockPos, block blockType) {
})
}
+func (l *level) TrySetBlock(
+ from phony.Actor, pos blockPos, block blockType, auth authLevel,
+ reject func(realBlock blockType)) {
+ l.mapM.GetBlock(from, pos, func(curBlock blockType) {
+ if blockDefinitions[curBlock].AuthLevel > auth {
+ from.Act(nil, func() {reject(curBlock)})
+ return
+ }
+ def, ok := blockDefinitions[block]
+ if !ok && block > blockStoneBricks {
+ from.Act(nil, func() {reject(curBlock)})
+ return
+ }
+ if def.AuthLevel > auth {
+ from.Act(nil, func() {reject(curBlock)})
+ return
+ }
+ l.SetBlock(nil, pos, block)
+ })
+}
+
func (l *level) OnAddPlayer(from *player, name string, pos entityPos) {
l.Act(from, func() {
l.load()
diff --git a/server/player.go b/server/player.go
index 51ddf54..d2c6722 100644
--- a/server/player.go
+++ b/server/player.go
@@ -144,7 +144,11 @@ func (p *player) handlePacket(packet classic.Packet) {
blockCoord(pck.Y),
blockCoord(pck.Z),
}
- p.level.SetBlock(p, pos, block)
+ p.level.TrySetBlock(p, pos, block, p.state.Auth,
+ func(realBlock blockType) {
+ p.OnSetBlock(p.level, pos, realBlock)
+ },
+ )
case *classic.Message:
incomplete := pck.PlayerId == 1 && p.extensions["LongerMessages"]
message := p.currentMessage + classic.UnpadString(pck.Message)