Files
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

61 lines
2.2 KiB
Go

package entity
import (
"github.com/df-mc/dragonfly/server/block/cube"
"github.com/df-mc/dragonfly/server/internal/nbtconv"
"github.com/df-mc/dragonfly/server/item"
"github.com/df-mc/dragonfly/server/world"
)
// NewFirework creates a firework entity. Firework is an item (and entity) used
// for creating decorative explosions, boosting when flying with elytra, and
// loading into a crossbow as ammunition.
func NewFirework(opts world.EntitySpawnOpts, firework item.Firework) *world.EntityHandle {
return newFirework(opts, firework, nil, 1.15, 0.04, false)
}
// NewFireworkAttached creates a firework entity with an owner that the firework
// may be attached to.
func NewFireworkAttached(opts world.EntitySpawnOpts, firework item.Firework, owner world.Entity) *world.EntityHandle {
return newFirework(opts, firework, owner, 0, 0, true)
}
func newFirework(opts world.EntitySpawnOpts, firework item.Firework, owner world.Entity, sidewaysVelocityMultiplier, upwardsAcceleration float64, attached bool) *world.EntityHandle {
conf := fireworkConf
conf.SidewaysVelocityMultiplier = sidewaysVelocityMultiplier
conf.UpwardsAcceleration = upwardsAcceleration
conf.Firework = firework
conf.ExistenceDuration = firework.RandomisedDuration()
conf.Attached = attached
if attached {
conf.Owner = owner.H()
}
return opts.New(FireworkType, conf)
}
var fireworkConf = FireworkBehaviourConfig{}
// FireworkType is a world.EntityType implementation for Firework.
var FireworkType fireworkType
type fireworkType struct{}
func (t fireworkType) Open(tx *world.Tx, handle *world.EntityHandle, data *world.EntityData) world.Entity {
return &Ent{tx: tx, handle: handle, data: data}
}
func (fireworkType) EncodeEntity() string { return "minecraft:fireworks_rocket" }
func (fireworkType) BBox(world.Entity) cube.BBox { return cube.BBox{} }
func (fireworkType) DecodeNBT(m map[string]any, data *world.EntityData) {
conf := fireworkConf
conf.Firework = nbtconv.MapItem(m, "Item").Item().(item.Firework)
conf.ExistenceDuration = conf.Firework.RandomisedDuration()
data.Data = conf.New()
}
func (fireworkType) EncodeNBT(data *world.EntityData) map[string]any {
return map[string]any{"Item": nbtconv.WriteItem(item.NewStack(data.Data.(*FireworkBehaviour).Firework(), 1), true)}
}