From 9c864812fd5b502f72355c4f6ef857b563254b31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Mart=C3=ADnez=20Torres?= Date: Sun, 11 Aug 2024 13:36:04 -0600 Subject: [PATCH] player/handler.go: Introduce HandleFireExtinguish (#901) --- server/player/handler.go | 5 +++++ server/player/player.go | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/server/player/handler.go b/server/player/handler.go index d2baa2320..60112f75c 100644 --- a/server/player/handler.go +++ b/server/player/handler.go @@ -55,6 +55,10 @@ type Handler interface { // HandleSkinChange handles the player changing their skin. ctx.Cancel() may be called to cancel the skin // change. HandleSkinChange(ctx *event.Context, skin *skin.Skin) + // HandleFireExtinguish handles the player extinguishing a fire at a specific position. ctx.Cancel() may + // be called to cancel the fire being extinguished. + // cube.Pos can be used to see where was the fire extinguished, may be used to cancel this on specific positions. + HandleFireExtinguish(ctx *event.Context, pos cube.Pos) // HandleStartBreak handles the player starting to break a block at the position passed. ctx.Cancel() may // be called to stop the player from breaking the block completely. HandleStartBreak(ctx *event.Context, pos cube.Pos) @@ -152,6 +156,7 @@ func (NopHandler) HandleCommandExecution(*event.Context, cmd.Command, []string) func (NopHandler) HandleTransfer(*event.Context, *net.UDPAddr) {} func (NopHandler) HandleChat(*event.Context, *string) {} func (NopHandler) HandleSkinChange(*event.Context, *skin.Skin) {} +func (NopHandler) HandleFireExtinguish(*event.Context, cube.Pos) {} func (NopHandler) HandleStartBreak(*event.Context, cube.Pos) {} func (NopHandler) HandleBlockBreak(*event.Context, cube.Pos, *[]item.Stack, *int) {} func (NopHandler) HandleBlockPlace(*event.Context, cube.Pos, world.Block) {} diff --git a/server/player/player.go b/server/player/player.go index c6c114aec..0ad614bd2 100644 --- a/server/player/player.go +++ b/server/player/player.go @@ -1602,7 +1602,13 @@ func (p *Player) StartBreaking(pos cube.Pos, face cube.Face) { return } if _, ok := w.Block(pos.Side(face)).(block.Fire); ok { - // TODO: Add a way to cancel fire extinguishing. This is currently not possible to handle. + ctx := event.C() + if p.Handler().HandleFireExtinguish(ctx, pos); ctx.Cancelled() { + // Resend the block because on client side that was extinguished + p.resendBlocks(pos, w, face) + return + } + w.SetBlock(pos.Side(face), nil, nil) w.PlaySound(pos.Vec3(), sound.FireExtinguish{}) return