diff options
Diffstat (limited to 'server')
| -rw-r--r-- | server/level.go | 21 | ||||
| -rw-r--r-- | server/player.go | 6 |
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) |
