From 9b1349a274a0159fafb6fba08861163599baf617 Mon Sep 17 00:00:00 2001 From: Tnze Date: Tue, 28 Dec 2021 17:00:49 +0800 Subject: [PATCH] Send player join/left message --- chat/message.go | 25 +++++++++++++++++++++++++ server/chat.go | 39 ++++++++++++++++++++++++++++++--------- 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/chat/message.go b/chat/message.go index e3a15ee..c0af8ed 100644 --- a/chat/message.go +++ b/chat/message.go @@ -21,6 +21,26 @@ import ( pk "github.com/Tnze/go-mc/net/packet" ) +// Colors +const ( + Black = "black" + DarkBlue = "dark_blue" + DarkGreen = "dark_green" + DarkAqua = "dark_aqua" + DarkRed = "dark_red" + DarkPurple = "dark_purple" + Gold = "gold" + Gray = "gray" + DarkGray = "dark_gray" + Blue = "blue" + Green = "green" + Aqua = "aqua" + Red = "red" + LightPurple = "light_purple" + Yellow = "yellow" + White = "white" +) + // Message is a message sent by other type Message struct { Text string `json:"text,omitempty"` @@ -99,6 +119,11 @@ func (m Message) Append(extraMsg ...Message) Message { return m } +func (m Message) SetColor(color string) Message { + m.Color = color + return m +} + func Text(str string) Message { return Message{Text: str} } diff --git a/server/chat.go b/server/chat.go index 00b92b1..3cdd465 100644 --- a/server/chat.go +++ b/server/chat.go @@ -47,32 +47,53 @@ func (g *GlobalChat) Init(game *Game) { }) } +const ( + chatPosChat = iota + chatPosSystem + chatPosGameInfo +) + func (g *GlobalChat) Run(ctx context.Context) { for { select { case <-ctx.Done(): return case item := <-g.msg: - packet := Packet757(pk.Marshal( + g.broadcast(Packet757(pk.Marshal( packetid.ClientboundChat, item.toMessage(), - pk.Byte(0), + pk.Byte(chatPosChat), pk.UUID(item.p.UUID), - )) - for _, p := range g.players { - err := p.WritePacket(packet) - if err != nil { - p.PutErr(err) - } - } + ))) case p := <-g.join: + g.broadcast(Packet757(pk.Marshal( + packetid.ClientboundChat, + chat.TranslateMsg("multiplayer.player.joined", chat.Text(p.Name)).SetColor(chat.Yellow), + pk.Byte(chatPosSystem), + pk.UUID(uuid.Nil), + ))) g.players[p.UUID] = p case p := <-g.quit: + g.broadcast(Packet757(pk.Marshal( + packetid.ClientboundChat, + chat.TranslateMsg("multiplayer.player.left", chat.Text(p.Name)).SetColor(chat.Yellow), + pk.Byte(chatPosSystem), + pk.UUID(uuid.Nil), + ))) delete(g.players, p.UUID) } } } +func (g *GlobalChat) broadcast(packet Packet757) { + for _, p := range g.players { + err := p.WritePacket(packet) + if err != nil { + p.PutErr(err) + } + } +} + func (g *GlobalChat) AddPlayer(player *Player) { g.join <- player } func (g *GlobalChat) RemovePlayer(p *Player) { g.quit <- p }