diff --git a/build.py b/build.py index 2ccb099..587df1a 100644 --- a/build.py +++ b/build.py @@ -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}" diff --git a/subcommands/resourcepack-d/resourcepack-d.go b/subcommands/resourcepack-d/resourcepack-d.go index ca60d6d..5a03082 100644 Binary files a/subcommands/resourcepack-d/resourcepack-d.go and b/subcommands/resourcepack-d/resourcepack-d.go differ diff --git a/subcommands/world/entity.go b/subcommands/world/entity.go index a6fb800..0309890 100644 --- a/subcommands/world/entity.go +++ b/subcommands/world/entity.go @@ -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 } diff --git a/subcommands/world/world.go b/subcommands/world/world.go index 7e84932..2a7c9d8 100644 --- a/subcommands/world/world.go +++ b/subcommands/world/world.go @@ -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) } } } diff --git a/ui/gui/pages/worlds/map.go b/ui/gui/pages/worlds/map.go index b8a283b..4f25341 100644 --- a/ui/gui/pages/worlds/map.go +++ b/ui/gui/pages/worlds/map.go @@ -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) } diff --git a/utils/resourcepack.go b/utils/resourcepack.go index e1bb7d3..98f1101 100644 --- a/utils/resourcepack.go +++ b/utils/resourcepack.go @@ -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