116 lines
4.0 KiB
Go
116 lines
4.0 KiB
Go
package legacypacket
|
|
|
|
import (
|
|
"github.com/akmalfairuz/legacy-version/legacyver/proto"
|
|
"github.com/sandertv/gophertunnel/minecraft/protocol"
|
|
"github.com/sandertv/gophertunnel/minecraft/protocol/packet"
|
|
)
|
|
|
|
const (
|
|
BossEventShow = iota
|
|
BossEventRegisterPlayer
|
|
BossEventHide
|
|
BossEventUnregisterPlayer
|
|
BossEventHealthPercentage
|
|
BossEventTitle
|
|
BossEventAppearanceProperties
|
|
BossEventTexture
|
|
BossEventRequest
|
|
)
|
|
|
|
const (
|
|
BossEventColourGrey = iota
|
|
BossEventColourBlue
|
|
BossEventColourRed
|
|
BossEventColourGreen
|
|
BossEventColourYellow
|
|
BossEventColourPurple
|
|
BossEventColourWhite
|
|
)
|
|
|
|
// BossEvent is sent by the server to make a specific 'boss event' occur in the
|
|
// world. It includes features such as showing a boss bar to the player and
|
|
// turning the sky dark.
|
|
type BossEvent struct {
|
|
// BossEntityUniqueID is the unique ID of the boss entity that the boss
|
|
// event sent involves. By default, the health percentage and title of the
|
|
// boss bar depend on the health and name tag of this entity. If
|
|
// BossEntityUniqueID is the same as the client's entity unique ID, its
|
|
// HealthPercentage and BossBarTitle can be freely altered.
|
|
BossEntityUniqueID int64
|
|
// EventType is the type of the event. The fields written depend on the
|
|
// event type set, and some event types are sent by the client, whereas
|
|
// others are sent by the server. The event type is one of the constants
|
|
// above.
|
|
EventType uint32
|
|
// PlayerUniqueID is the unique ID of the player that is registered to or
|
|
// unregistered from the boss fight. It is set if EventType is either
|
|
// BossEventRegisterPlayer or BossEventUnregisterPlayer.
|
|
PlayerUniqueID int64
|
|
// BossBarTitle is the title shown above the boss bar. It may be set to set
|
|
// a different title if the BossEntityUniqueID matches the client's entity
|
|
// unique ID.
|
|
BossBarTitle string
|
|
// FilteredBossBarTitle is a filtered version of BossBarTitle with all the
|
|
// profanity removed. The client will use this over BossBarTitle if this
|
|
// field is not empty and they have the "Filter Profanity" setting enabled.
|
|
FilteredBossBarTitle string
|
|
// HealthPercentage is the percentage of health that is shown in the boss
|
|
// bar (0.0-1.0). The HealthPercentage may be set to a specific value if the
|
|
// BossEntityUniqueID matches the client's entity unique ID.
|
|
HealthPercentage float32
|
|
// ScreenDarkening currently seems not to do anything.
|
|
ScreenDarkening uint16
|
|
// Colour is the colour of the boss bar that is shown when a player is
|
|
// subscribed. It is only set if the EventType is BossEventShow,
|
|
// BossEventAppearanceProperties or BossEventTexture. This is functional as
|
|
// of 1.18 and can be any of the BossEventColour constants listed above.
|
|
Colour uint32
|
|
// Overlay is the overlay of the boss bar that is shown on top of the boss
|
|
// bar when a player is subscribed. It currently does not function. It is
|
|
// only set if the EventType is BossEventShow, BossEventAppearanceProperties
|
|
// or BossEventTexture.
|
|
Overlay uint32
|
|
}
|
|
|
|
// ID ...
|
|
func (*BossEvent) ID() uint32 {
|
|
return packet.IDBossEvent
|
|
}
|
|
|
|
func (pk *BossEvent) Marshal(io protocol.IO) {
|
|
io.Varint64(&pk.BossEntityUniqueID)
|
|
io.Varuint32(&pk.EventType)
|
|
switch pk.EventType {
|
|
case BossEventShow:
|
|
io.String(&pk.BossBarTitle)
|
|
if proto.IsProtoGTE(io, proto.ID776) {
|
|
io.String(&pk.FilteredBossBarTitle)
|
|
}
|
|
io.Float32(&pk.HealthPercentage)
|
|
io.Uint16(&pk.ScreenDarkening)
|
|
io.Varuint32(&pk.Colour)
|
|
io.Varuint32(&pk.Overlay)
|
|
case BossEventRegisterPlayer, BossEventUnregisterPlayer, BossEventRequest:
|
|
io.Varint64(&pk.PlayerUniqueID)
|
|
case BossEventHide:
|
|
// No extra payload for this boss event type.
|
|
case BossEventHealthPercentage:
|
|
io.Float32(&pk.HealthPercentage)
|
|
case BossEventTitle:
|
|
io.String(&pk.BossBarTitle)
|
|
if proto.IsProtoGTE(io, proto.ID776) {
|
|
io.String(&pk.FilteredBossBarTitle)
|
|
}
|
|
case BossEventAppearanceProperties:
|
|
io.Uint16(&pk.ScreenDarkening)
|
|
io.Varuint32(&pk.Colour)
|
|
io.Varuint32(&pk.Overlay)
|
|
case BossEventTexture:
|
|
io.Varuint32(&pk.Colour)
|
|
io.Varuint32(&pk.Overlay)
|
|
default:
|
|
io.UnknownEnumOption(pk.EventType, "boss event type")
|
|
}
|
|
}
|