diff --git a/server/block/shulker_box.go b/server/block/shulker_box.go index d52721882..30b48298a 100644 --- a/server/block/shulker_box.go +++ b/server/block/shulker_box.go @@ -251,7 +251,15 @@ func shulkerPushDelta(facing cube.Face, shulkerBBox, entityBBox cube.BBox) (delt } func (s ShulkerBox) BreakInfo() BreakInfo { - return newBreakInfo(2, alwaysHarvestable, pickaxeEffective, oneOf(s)) + return newBreakInfo(2, alwaysHarvestable, pickaxeEffective, + func(_ item.Tool, _ []item.Enchantment) []item.Stack { return nil }). + // shulker box always has a drop, except when player in creative breaks empty box. + withBreakHandler(func(pos cube.Pos, tx *world.Tx, u item.User) { + if u != nil && u.GameMode().CreativeInventory() && s.Inventory(tx, pos).Empty() { + return + } + dropItem(tx, item.NewStack(s, 1), pos.Vec3Centre()) + }) } func (s ShulkerBox) MaxCount() int { diff --git a/server/item/item.go b/server/item/item.go index 33a503cd2..e7ee9715d 100644 --- a/server/item/item.go +++ b/server/item/item.go @@ -182,6 +182,7 @@ type User interface { UsingItem() bool ReleaseItem() UseItem() + GameMode() world.GameMode } // Carrier represents an entity that is able to carry an item.