Files
mc/server/item/goat_horn.go
TarnaWijaya 26ed99fda6
Build and deploy / Build (push) Has been cancelled
Build and deploy / Update Contributors (push) Has been cancelled
Build and deploy / Deploy (push) Has been cancelled
up3
2026-07-09 08:33:57 +08:00

59 lines
1.4 KiB
Go

package item
import (
"github.com/df-mc/dragonfly/server/world"
"github.com/df-mc/dragonfly/server/world/sound"
"time"
)
// GoatHorn is an item dropped by goats. It has eight variants, and each plays a unique sound when used which can be
// heard by players in a large radius.
type GoatHorn struct {
nopReleasable
// Type is the type of the goat horn, determining the sound it plays.
Type sound.Horn
}
// MaxCount ...
func (GoatHorn) MaxCount() int {
return 1
}
// Cooldown ...
func (GoatHorn) Cooldown() time.Duration {
return time.Second * 7
}
// Use ...
func (g GoatHorn) Use(tx *world.Tx, user User, _ *UseContext) bool {
tx.PlaySound(user.Position(), sound.GoatHorn{Horn: g.Type})
time.AfterFunc(time.Second, func() {
user.H().ExecWorld(g.releaseItem)
})
return true
}
// releaseItem releases the goat horn item if a user is still using it.
func (g GoatHorn) releaseItem(_ *world.Tx, e world.Entity) {
user := e.(User)
if !user.UsingItem() {
// We aren't using the goat horn anymore.
return
}
held, _ := user.HeldItems()
if _, ok := held.Item().(GoatHorn); !ok {
// We aren't holding the goat horn anymore.
return
}
// The goat horn is forcefully released by the server after a second. If the
// client released the item itself, before a second, this shouldn't do
// anything.
user.ReleaseItem()
}
// EncodeItem ...
func (g GoatHorn) EncodeItem() (name string, meta int16) {
return "minecraft:goat_horn", int16(g.Type.Uint8())
}