Send player join/left message

This commit is contained in:
Tnze
2021-12-28 17:00:49 +08:00
parent 147778ef38
commit 9b1349a274
2 changed files with 55 additions and 9 deletions

View File

@ -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}
}

View File

@ -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 }