Support disguised chat

This commit is contained in:
Tnze
2023-01-01 18:50:39 +08:00
parent bb98d90db3
commit 88356fd576
3 changed files with 37 additions and 10 deletions

View File

@ -34,16 +34,22 @@ func New(c *bot.Client, p *basic.Player, pl *playerlist.PlayerList, events Event
events: events, events: events,
SignatureCache: sign.NewSignatureCache(), SignatureCache: sign.NewSignatureCache(),
} }
c.Events.AddListener( if events.PlayerChatMessage != nil {
bot.PacketHandler{ c.Events.AddListener(bot.PacketHandler{
Priority: 64, ID: packetid.ClientboundPlayerChat, Priority: 64, ID: packetid.ClientboundPlayerChat,
F: m.handlePacket, F: m.handlePlayerChat,
}, })
) }
if events.DisguisedChat != nil {
c.Events.AddListener(bot.PacketHandler{
Priority: 64, ID: packetid.ClientboundDisguisedChat,
F: m.handleDisguisedChat,
})
}
return m return m
} }
func (m *Manager) handlePacket(packet pk.Packet) error { func (m *Manager) handlePlayerChat(packet pk.Packet) error {
var ( var (
sender pk.UUID sender pk.UUID
index pk.VarInt index pk.VarInt
@ -105,14 +111,28 @@ func (m *Manager) handlePacket(packet pk.Packet) error {
} else { } else {
content = chat.Text(body.PlainMsg) content = chat.Text(body.PlainMsg)
} }
if m.events.PlayerChatMessage == nil {
return nil
}
msg := chatType.Decorate(content, &ct.Chat) msg := chatType.Decorate(content, &ct.Chat)
return m.events.PlayerChatMessage(msg, validated) return m.events.PlayerChatMessage(msg, validated)
} }
func (m *Manager) handleDisguisedChat(packet pk.Packet) error {
var (
message chat.Message
chatType chat.Type
)
if err := packet.Scan(&message, &chatType); err != nil {
return err
}
ct := m.p.WorldInfo.RegistryCodec.ChatType.FindByID(chatType.ID)
if ct == nil {
return InvalidChatPacket
}
msg := chatType.Decorate(message, &ct.Chat)
return m.events.DisguisedChat(msg)
}
// SendMessage send chat message to server. // SendMessage send chat message to server.
// Currently only support offline-mode or "Not Secure" chat // Currently only support offline-mode or "Not Secure" chat
func (m *Manager) SendMessage(msg string) error { func (m *Manager) SendMessage(msg string) error {

View File

@ -4,4 +4,5 @@ import "github.com/Tnze/go-mc/chat"
type EventsHandler struct { type EventsHandler struct {
PlayerChatMessage func(msg chat.Message, validated bool) error PlayerChatMessage func(msg chat.Message, validated bool) error
DisguisedChat func(msg chat.Message) error
} }

View File

@ -57,6 +57,7 @@ func main() {
playerList = playerlist.New(client) playerList = playerlist.New(client)
chatHandler = msg.New(client, player, playerList, msg.EventsHandler{ chatHandler = msg.New(client, player, playerList, msg.EventsHandler{
PlayerChatMessage: onPlayerMsg, PlayerChatMessage: onPlayerMsg,
DisguisedChat: onDisguisedMsg,
}) })
worldManager = world.NewWorld(client, player, world.EventsListener{ worldManager = world.NewWorld(client, player, world.EventsListener{
LoadChunk: onChunkLoad, LoadChunk: onChunkLoad,
@ -125,6 +126,11 @@ func onPlayerMsg(msg chat.Message, validated bool) error {
return nil return nil
} }
func onDisguisedMsg(msg chat.Message) error {
log.Printf("Disguised: %v", msg)
return nil
}
func onSystemMsg(c chat.Message, overlay bool) error { func onSystemMsg(c chat.Message, overlay bool) error {
log.Printf("System: %v, Overlay: %v", c, overlay) log.Printf("System: %v, Overlay: %v", c, overlay)
return nil return nil