package legacypacket import ( "github.com/akmalfairuz/legacy-version/legacyver/proto" "github.com/sandertv/gophertunnel/minecraft/protocol" "github.com/sandertv/gophertunnel/minecraft/protocol/packet" ) // PlayerArmourDamage is sent by the server to damage the armour of a player. It is a very efficient packet, // but generally it's much easier to just send a slot update for the damaged armour. type PlayerArmourDamage struct { // List ... List []protocol.PlayerArmourDamageEntry } // ID ... func (pk *PlayerArmourDamage) ID() uint32 { return packet.IDPlayerArmourDamage } func (pk *PlayerArmourDamage) Marshal(io protocol.IO) { if proto.IsProtoLT(io, proto.ID844) { var bitset uint8 flags := []uint8{packet.PlayerArmourDamageFlagHelmet, packet.PlayerArmourDamageFlagChestplate, packet.PlayerArmourDamageFlagLeggings, packet.PlayerArmourDamageFlagBoots} if proto.IsProtoGTE(io, proto.ID712) { flags = append(flags, packet.PlayerArmourDamageFlagBody) } if proto.IsReader(io) { io.Uint8(&bitset) pk.List = make([]protocol.PlayerArmourDamageEntry, 0, len(flags)) for _, flag := range flags { if bitset&flag != 0 { v := protocol.PlayerArmourDamageEntry{ ArmourSlot: int32(flag), } v2 := int32(0) io.Varint32(&v2) v.Damage = int16(v2) pk.List = append(pk.List, v) } } return } for _, entry := range pk.List { if entry.ArmourSlot == packet.PlayerArmourDamageFlagBody && !proto.IsProtoGTE(io, proto.ID712) { continue } bitset |= 1 << entry.ArmourSlot } io.Uint8(&bitset) for _, flag := range flags { if bitset&flag != 0 { damage := int32(0) for _, entry := range pk.List { if entry.ArmourSlot == int32(flag) { damage = int32(entry.Damage) break } } io.Varint32(&damage) } } return } protocol.Slice(io, &pk.List) }