save more entity data

This commit is contained in:
olebeck 2023-03-24 20:45:53 +01:00
parent d7b559a7a8
commit ae496e9238
6 changed files with 116 additions and 23 deletions

View File

@ -23,6 +23,7 @@ if GITHUB_OUTPUT:
with open("./subcommands/resourcepack-d/resourcepack-d.go", "rb") as f:
PACK_SUPPORT = f.read(100).count(b"package ") > 0
print(f"Pack Support: {PACK_SUPPORT}")
print(flush=True)
LDFLAGS = f"-s -w -X github.com/bedrock-tool/bedrocktool/utils.Version={TAG}"

View File

@ -2,6 +2,7 @@ package world
import (
"github.com/bedrock-tool/bedrocktool/utils/behaviourpack"
"github.com/bedrock-tool/bedrocktool/utils/nbtconv"
"github.com/df-mc/dragonfly/server/block/cube"
"github.com/df-mc/dragonfly/server/world"
"github.com/go-gl/mathgl/mgl32"
@ -19,7 +20,13 @@ type entityState struct {
HeadYaw, BodyYaw float32
Velocity mgl32.Vec3
Metadata protocol.EntityMetadata
Metadata protocol.EntityMetadata
Inventory map[byte]map[byte]protocol.ItemInstance
Helmet *protocol.ItemInstance
Chestplate *protocol.ItemInstance
Leggings *protocol.ItemInstance
Boots *protocol.ItemInstance
}
type serverEntityType struct {
@ -84,6 +91,27 @@ func (w *WorldState) processAddActor(pk *packet.AddActor) {
}
}
var flagNames = map[uint8]string{
protocol.EntityDataFlagSheared: "Sheared",
protocol.EntityDataFlagCaptain: "IsIllagerCaptain",
protocol.EntityDataFlagSitting: "Sitting",
protocol.EntityDataFlagBaby: "IsBaby",
protocol.EntityDataFlagTamed: "IsTamed",
protocol.EntityDataFlagTrusting: "IsTrusting",
protocol.EntityDataFlagOrphaned: "IsOrphaned",
protocol.EntityDataFlagAngry: "IsAngry",
protocol.EntityDataFlagOutOfControl: "IsOutOfControl",
protocol.EntityDataFlagSaddled: "Saddled",
protocol.EntityDataFlagChested: "Chested",
protocol.EntityDataFlagShowBottom: "ShowBottom",
protocol.EntityDataFlagGliding: "IsGliding",
protocol.EntityDataFlagSwimming: "IsSwimming",
protocol.EntityDataFlagEating: "IsEating",
protocol.EntityDataFlagScared: "IsScared",
protocol.EntityDataFlagStunned: "IsStunned",
protocol.EntityDataFlagRoaring: "IsRoaring",
}
func entityMetadataToNBT(metadata protocol.EntityMetadata, nbt map[string]any) {
if variant, ok := metadata[protocol.EntityDataKeyVariant]; ok {
nbt["Variant"] = variant
@ -108,6 +136,49 @@ func entityMetadataToNBT(metadata protocol.EntityMetadata, nbt map[string]any) {
nbt["CustomNameVisible"] = false
}
}
if metadata.Flag(protocol.EntityDataKeyFlags, protocol.EntityDataFlagNoAI) {
nbt["IsAutonomous"] = false
}
for k, v := range flagNames {
nbt[v] = metadata.Flag(protocol.EntityDataKeyFlags, k)
}
AlwaysShowName := metadata.Flag(protocol.EntityDataKeyFlags, protocol.EntityDataFlagAlwaysShowName)
if AlwaysShowName {
nbt["CustomNameVisible"] = true
}
type effect struct {
Id byte
Amplifier byte
Duration int32
DurationEasy int32
DurationNormal int32
DurationHard int32
Ambient bool
ShowParticles bool
DisplayOnScreenTextureAnimation bool
}
activeEffects := []effect{}
addEffect := func(id int, showParticles bool) {
activeEffects = append(activeEffects, effect{
Id: byte(id),
Amplifier: 1,
Duration: 10000000,
ShowParticles: false,
})
}
invisible := metadata.Flag(protocol.EntityDataKeyFlags, protocol.EntityDataFlagInvisible)
if invisible {
addEffect(packet.EffectInvisibility, false)
}
if len(activeEffects) > 0 {
nbt["ActiveEffects"] = activeEffects
}
}
func vec3float32(x mgl32.Vec3) []float32 {
@ -127,6 +198,16 @@ func (s *entityState) ToServerEntity() serverEntity {
},
}
entityMetadataToNBT(s.Metadata, e.EntityType.NBT)
if s.Helmet != nil || s.Chestplate != nil || s.Leggings != nil || s.Boots != nil {
armor := make([]map[string]any, 0, 4)
armor = append(armor, nbtconv.WriteItem(stackToItem(s.Helmet.Stack), true))
armor = append(armor, nbtconv.WriteItem(stackToItem(s.Chestplate.Stack), true))
armor = append(armor, nbtconv.WriteItem(stackToItem(s.Leggings.Stack), true))
armor = append(armor, nbtconv.WriteItem(stackToItem(s.Boots.Stack), true))
e.EntityType.NBT["Armor"] = armor
}
return e
}
@ -176,6 +257,24 @@ func (w *WorldState) ProcessEntityPackets(pk packet.Packet) packet.Packet {
e.Pitch = pk.Rotation.X()
e.Yaw = pk.Rotation.Y()
}
case *packet.MobEquipment:
e, ok := w.entities[pk.EntityRuntimeID]
if ok {
w, ok := e.Inventory[pk.WindowID]
if !ok {
w = make(map[byte]protocol.ItemInstance)
e.Inventory[pk.WindowID] = w
}
w[pk.HotBarSlot] = pk.NewItem
}
case *packet.MobArmourEquipment:
e, ok := w.entities[pk.EntityRuntimeID]
if ok {
e.Helmet = &pk.Helmet
e.Chestplate = &pk.Chestplate
e.Leggings = &pk.Chestplate
e.Boots = &pk.Boots
}
}
return pk
}

View File

@ -482,6 +482,10 @@ func (w *WorldState) SaveAndReset() {
} else {
var rdeps []dep
for k, p := range packs {
if p.Encrypted() && !p.CanDecrypt() {
logrus.Warnf("Cant add %s, it is encrypted", p.Name())
continue
}
logrus.Infof(locale.Loc("adding_pack", locale.Strmap{"Name": k}))
packFolder := path.Join(folder, "resource_packs", p.Name())
os.MkdirAll(packFolder, 0o755)
@ -495,7 +499,7 @@ func (w *WorldState) SaveAndReset() {
})
}
if len(rdeps) > 0 {
addPacksJSON("world_resource_packs.json", rdeps)
//addPacksJSON("world_resource_packs.json", rdeps)
}
}
}

View File

@ -40,18 +40,15 @@ func (m *Map) HandlePointerEvent(e pointer.Event) {
case pointer.Release:
m.grabbed = false
case pointer.Scroll:
m.HandleScrollEvent(e)
scaleFactor := float32(math.Pow(1.01, float64(e.Scroll.Y)))
m.transform = m.transform.Scale(e.Position.Sub(m.center), f32.Pt(scaleFactor, scaleFactor))
m.scaleFactor *= scaleFactor
}
}
func (m *Map) HandleScrollEvent(e pointer.Event) {
scaleFactor := float32(math.Pow(1.01, float64(e.Scroll.Y)))
m.transform = m.transform.Scale(e.Position.Sub(m.center), f32.Pt(scaleFactor, scaleFactor))
m.scaleFactor *= scaleFactor
}
func (m *Map) Layout(gtx layout.Context) layout.Dimensions {
// here we loop through all the events associated with this button.
m.center = f32.Pt(float32(gtx.Constraints.Max.X), float32(gtx.Constraints.Max.Y)).Div(2)
for _, e := range gtx.Events(m) {
if e, ok := e.(pointer.Event); ok {
m.HandlePointerEvent(e)
@ -64,17 +61,9 @@ func (m *Map) Layout(gtx layout.Context) layout.Dimensions {
dy := float32(m.MapImage.Bounds().Dy())
size := f32.Pt(dx*m.scaleFactor, dy*m.scaleFactor)
m.center = f32.Pt(
float32(gtx.Constraints.Max.X),
float32(gtx.Constraints.Max.Y),
).Div(2)
// Calculate the offset required to center the image within the widget.
offset := m.center.Sub(size.Div(2))
// Draw the image at the correct position and scale.
defer clip.Rect{Max: gtx.Constraints.Max}.Push(gtx.Ops).Pop()
op.Affine(m.transform.Offset(offset)).Add(gtx.Ops)
op.Affine(m.transform.Offset(m.center.Sub(size.Div(2)))).Add(gtx.Ops)
m.imageOp.Add(gtx.Ops)
paint.PaintOp{}.Add(gtx.Ops)
}

View File

@ -60,8 +60,8 @@ var PackFromBase = func(pack *resource.Pack) Pack {
return b
}
func GetPacks(server *minecraft.Conn) (packs map[string]*resource.Pack, err error) {
packs = make(map[string]*resource.Pack)
func GetPacks(server *minecraft.Conn) (packs map[string]Pack, err error) {
packs = make(map[string]Pack)
for _, pack := range server.ResourcePacks() {
pack := PackFromBase(pack)
if pack.Encrypted() && pack.CanDecrypt() {
@ -73,9 +73,9 @@ func GetPacks(server *minecraft.Conn) (packs map[string]*resource.Pack, err erro
if err != nil {
return nil, err
}
packs[pack.Name()] = pack2
packs[pack.Name()] = &Packb{pack2}
} else {
packs[pack.Name()] = pack.Base()
packs[pack.Name()] = pack
}
}
return