Add bot API to handle experience updates

This commit is contained in:
Andrew Lanin
2020-08-01 23:07:18 +03:00
parent a42a623366
commit d45de88246
3 changed files with 31 additions and 0 deletions

View File

@ -18,6 +18,13 @@ type eventBroker struct {
PluginMessage func(channel string, data []byte) error PluginMessage func(channel string, data []byte) error
HeldItemChange func(slot int) error HeldItemChange func(slot int) error
// ExperienceChange will be called every time player's experience level updates.
// Parameters:
// bar - state of the experience bar from 0.0 to 1.0;
// level - current level;
// total - total amount of experience received from level 0.
ExperienceChange func(bar float32, level int32, total int32) error
WindowsItem func(id byte, slots []entity.Slot) error WindowsItem func(id byte, slots []entity.Slot) error
WindowsItemChange func(id byte, slotID int, slot entity.Slot) error WindowsItemChange func(id byte, slotID int, slot entity.Slot) error

View File

@ -130,6 +130,8 @@ func (c *Client) handlePacket(p pk.Packet) (disconnect bool, err error) {
err = handleSoundEffect(c, p) err = handleSoundEffect(c, p)
case data.NamedSoundEffect: case data.NamedSoundEffect:
err = handleNamedSoundEffect(c, p) err = handleNamedSoundEffect(c, p)
case data.SetExperience:
err = handleSetExperience(c, p)
default: default:
// fmt.Printf("ignore pack id %X\n", p.ID) // fmt.Printf("ignore pack id %X\n", p.ID)
} }
@ -612,6 +614,26 @@ func handleWindowItemsPacket(c *Client, p pk.Packet) (err error) {
return c.Events.WindowsItem(byte(windowID), slots) return c.Events.WindowsItem(byte(windowID), slots)
} }
func handleSetExperience(c *Client, p pk.Packet) (err error) {
var (
bar pk.Float
level pk.VarInt
total pk.VarInt
)
if err := p.Scan(&bar, &level, &total); err != nil {
return err
}
c.Level = int32(level)
if c.Events.ExperienceChange != nil {
return c.Events.ExperienceChange(float32(bar), int32(level), int32(total))
}
return nil
}
func sendPlayerPositionAndLookPacket(c *Client) { func sendPlayerPositionAndLookPacket(c *Client) {
c.conn.WritePacket(pk.Marshal( c.conn.WritePacket(pk.Marshal(
data.PlayerPositionAndLookServerbound, data.PlayerPositionAndLookServerbound,

View File

@ -16,4 +16,6 @@ type Player struct {
Health float32 //血量 Health float32 //血量
Food int32 //饱食度 Food int32 //饱食度
FoodSaturation float32 //食物饱和度 FoodSaturation float32 //食物饱和度
Level int32
} }