61 lines
2.2 KiB
Go
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)}
|
||
|
|
}
|