diff --git a/server/block/hopper.go b/server/block/hopper.go index b8bde1e83..dcc49ae7b 100644 --- a/server/block/hopper.go +++ b/server/block/hopper.go @@ -31,6 +31,8 @@ type Hopper struct { LastTick int64 // TransferCooldown is the duration until the hopper can transfer items again. TransferCooldown int64 + // CollectCooldown is the duration until the hopper can collect items again. + CollectCooldown int64 inventory *inventory.Inventory viewerMu *sync.RWMutex @@ -124,13 +126,16 @@ func (h Hopper) UseOnBlock(pos cube.Pos, face cube.Face, _ mgl64.Vec3, w *world. // Tick ... func (h Hopper) Tick(currentTick int64, pos cube.Pos, w *world.World) { h.TransferCooldown-- + h.CollectCooldown-- h.LastTick = currentTick - if h.TransferCooldown > 0 { + + if h.TransferCooldown > 0 || h.CollectCooldown >= 0 { w.SetBlock(pos, h, nil) return } h.TransferCooldown = 0 + h.CollectCooldown = 0 if h.Powered { w.SetBlock(pos, h, nil) return diff --git a/server/entity/item_behaviour.go b/server/entity/item_behaviour.go index f23d07ac7..89f9b5600 100644 --- a/server/entity/item_behaviour.go +++ b/server/entity/item_behaviour.go @@ -69,9 +69,10 @@ func (i *ItemBehaviour) Item() item.Stack { func (i *ItemBehaviour) Tick(e *Ent) *Movement { w := e.World() pos := cube.PosFromVec3(e.Position()) + blockPos := pos.Side(cube.FaceDown) - bl, ok := w.Block(pos.Side(cube.FaceDown)).(block.Hopper) - if ok && !bl.Powered { + bl, ok := w.Block(blockPos).(block.Hopper) + if ok && !bl.Powered && bl.CollectCooldown <= 0 { _, err := bl.Inventory().AddItem(i.i) if err != nil { // We couldn't add any of the item to the inventory, so we ignore it. @@ -79,6 +80,8 @@ func (i *ItemBehaviour) Tick(e *Ent) *Movement { } _ = e.Close() + bl.CollectCooldown = 4 + w.SetBlock(blockPos, bl, nil) } return i.passive.Tick(e) }