164 lines
4.4 KiB
Go
164 lines
4.4 KiB
Go
package player
|
|
|
|
//import (
|
|
// "context"
|
|
// "io"
|
|
// "time"
|
|
//
|
|
// "github.com/Tnze/go-mc/data/packetid"
|
|
// pk "github.com/Tnze/go-mc/net/packet"
|
|
// "github.com/Tnze/go-mc/server"
|
|
// "github.com/Tnze/go-mc/server/ecs"
|
|
//)
|
|
//
|
|
//type PlayerInfo struct {
|
|
// updateDelay chan playerDelayUpdate
|
|
// quit chan clientAndPlayer
|
|
//}
|
|
//type clientAndPlayer struct {
|
|
// *server.Client
|
|
// *server.Player
|
|
//}
|
|
//
|
|
//type playerInfoList struct {
|
|
// players ecs.MaskedStorage[server.Player]
|
|
// delays ecs.MaskedStorage[server.ClientDelay]
|
|
//}
|
|
//
|
|
//func (p playerInfoList) WriteTo(w io.Writer) (n int64, err error) {
|
|
// n, err = pk.VarInt(p.players.Len).WriteTo(w)
|
|
// if err != nil {
|
|
// return
|
|
// }
|
|
// var n1 int64
|
|
// p.players.And(p.delays.BitSetLike).Range(func(eid ecs.Index) {
|
|
// p := playerDelayUpdate{
|
|
// player: p.players.Get(eid),
|
|
// delay: p.delays.Get(eid).Delay,
|
|
// }
|
|
// n1, err = p.WriteTo(w)
|
|
// n += n1
|
|
// if err != nil {
|
|
// return
|
|
// }
|
|
// })
|
|
// return
|
|
//}
|
|
//
|
|
//type playerDelayUpdate struct {
|
|
// player *server.Player
|
|
// delay time.Duration
|
|
//}
|
|
//
|
|
//func (p playerDelayUpdate) WriteTo(w io.Writer) (n int64, err error) {
|
|
// return pk.Tuple{
|
|
// pk.UUID(p.player.UUID),
|
|
// pk.VarInt(p.delay.Milliseconds()),
|
|
// }.WriteTo(w)
|
|
//}
|
|
//
|
|
//const (
|
|
// actionAddPlayer = iota
|
|
// actionUpdateGamemode
|
|
// actionUpdateLatency
|
|
// actionUpdateDisplayName
|
|
// actionRemovePlayer
|
|
//)
|
|
//
|
|
//type DelaySource interface {
|
|
// AddPlayerDelayUpdateHandler(f func(c *server.Client, p *server.Player, delay time.Duration))
|
|
//}
|
|
//
|
|
//func NewPlayerInfo(delaySource DelaySource) *PlayerInfo {
|
|
// updateChan := make(chan playerDelayUpdate)
|
|
// p := &PlayerInfo{
|
|
// updateDelay: updateChan,
|
|
// quit: make(chan clientAndPlayer),
|
|
// }
|
|
// if delaySource != nil {
|
|
// delaySource.AddPlayerDelayUpdateHandler(func(client *server.Client, player *server.Player, delay time.Duration) {
|
|
// updateChan <- playerDelayUpdate{player: player, delay: delay}
|
|
// })
|
|
// }
|
|
// return p
|
|
//}
|
|
//
|
|
//type playerInfoSystemJoin struct{}
|
|
//
|
|
//func (p playerInfoSystemJoin) Update(w *ecs.World) {
|
|
// clients := ecs.GetComponent[server.Client](w)
|
|
// players := ecs.GetComponent[server.Player](w)
|
|
// delays := ecs.GetComponent[server.ClientDelay](w)
|
|
//}
|
|
//
|
|
//func (p *PlayerInfo) Init(g *server.Game) {
|
|
// var delayBuffer []playerDelayUpdate
|
|
// clients := ecs.GetComponent[server.Client](g.World)
|
|
// players := ecs.GetComponent[server.Player](g.World)
|
|
// delays := ecs.GetComponent[server.ClientDelay](g.World)
|
|
// g.Dispatcher.Add(ecs.FuncSystem(func(client *server.Client, player *server.Player, delay server.ClientDelay) {
|
|
// info := server.ClientDelay{Delay: 0}
|
|
// pack := server.Packet758(pk.Marshal(
|
|
// packetid.ClientboundPlayerInfo,
|
|
// pk.VarInt(actionAddPlayer),
|
|
// pk.VarInt(1),
|
|
//
|
|
// pk.UUID(player.UUID),
|
|
// pk.String(player.Name),
|
|
// pk.Array([]pk.FieldEncoder{}),
|
|
// pk.VarInt(profile.Gamemode),
|
|
// pk.VarInt(0),
|
|
// pk.Boolean(false),
|
|
// ))
|
|
// delays.Set(client.Index, info)
|
|
// clients.Range(func(eid ecs.Index) {
|
|
// clients.Get(eid).WritePacket(pack)
|
|
// })
|
|
// client.WritePacket(server.Packet758(pk.Marshal(
|
|
// packetid.ClientboundPlayerInfo,
|
|
// pk.VarInt(actionAddPlayer),
|
|
// playerInfoList{players: players, delays: delays},
|
|
// )))
|
|
// }), "PlayerInfoSystem:Join", nil)
|
|
// g.Dispatcher.Add(ecs.FuncSystem(func() {
|
|
// for {
|
|
// select {
|
|
// case cp := <-p.quit:
|
|
// pack := server.Packet758(pk.Marshal(
|
|
// packetid.ClientboundPlayerInfo,
|
|
// pk.VarInt(actionRemovePlayer),
|
|
// pk.VarInt(1),
|
|
// pk.UUID(cp.UUID),
|
|
// ))
|
|
// for _, p := range players.list {
|
|
// cp.WritePacket(pack)
|
|
// }
|
|
// case change := <-p.updateDelay:
|
|
// delayBuffer = append(delayBuffer, change)
|
|
// default:
|
|
// if len(delayBuffer) > 0 {
|
|
// pack := server.Packet758(pk.Marshal(
|
|
// packetid.ClientboundPlayerInfo,
|
|
// pk.VarInt(actionUpdateLatency),
|
|
// pk.Array(&delayBuffer),
|
|
// ))
|
|
// players.Range(func(eid ecs.Index) {
|
|
// players.Get(eid).(*server.Client).WritePacket(pack)
|
|
// })
|
|
// delayBuffer = delayBuffer[:0]
|
|
// }
|
|
// return
|
|
// }
|
|
// }
|
|
// }), "PlayerInfoSystem", nil)
|
|
//}
|
|
//
|
|
//func (p *PlayerInfo) Run(context.Context) {}
|
|
//func (p *PlayerInfo) ClientJoin(client *server.Client, player *server.Player) {}
|
|
//func (p *PlayerInfo) ClientLeft(client *server.Client, player *server.Player) {
|
|
// p.quit <- clientAndPlayer{
|
|
// Client: client,
|
|
// Player: player,
|
|
// }
|
|
//}
|