Components now knows why client exist
This commit is contained in:
@ -22,21 +22,20 @@ var addr = flag.String("Address", "127.0.0.1:25565", "Listening address")
|
|||||||
var iconPath = flag.String("ServerIcon", "./server-icon.png", "The path to server icon")
|
var iconPath = flag.String("ServerIcon", "./server-icon.png", "The path to server icon")
|
||||||
var maxPlayer = flag.Int("MaxPlayer", 16384, "The maximum number of players")
|
var maxPlayer = flag.Int("MaxPlayer", 16384, "The maximum number of players")
|
||||||
var regionPath = flag.String("Regions", "./save/testdata/region/", "The region files")
|
var regionPath = flag.String("Regions", "./save/testdata/region/", "The region files")
|
||||||
|
var playerdataPath = flag.String("PlayerData", "./save/testdata/playerdata", "The player data files")
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
logger := Logger{log.Default()}
|
||||||
playerList := server.NewPlayerList(*maxPlayer)
|
playerList := server.NewPlayerList(*maxPlayer)
|
||||||
serverInfo, err := server.NewPingInfo(playerList, server.ProtocolName, server.ProtocolVersion, motd, readIcon())
|
serverInfo, err := server.NewPingInfo(playerList, server.ProtocolName, server.ProtocolVersion, motd, readIcon())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Set server info error: %v", err)
|
logger.Fatalf("Set server info error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
keepAlive := server.NewKeepAlive()
|
keepAlive := server.NewKeepAlive()
|
||||||
//playerInfo := player.NewPlayerInfo(keepAlive)
|
|
||||||
|
|
||||||
commands := command.NewGraph()
|
commands := command.NewGraph()
|
||||||
handleFunc := func(ctx context.Context, args []command.ParsedData) error {
|
handleFunc := func(ctx context.Context, args []command.ParsedData) error {
|
||||||
log.Printf("Command: args: %v", args)
|
logger.Printf("Command: args: %v", args)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
commands.AppendLiteral(commands.Literal("me").
|
commands.AppendLiteral(commands.Literal("me").
|
||||||
@ -53,8 +52,8 @@ func main() {
|
|||||||
HandleFunc(handleFunc),
|
HandleFunc(handleFunc),
|
||||||
)
|
)
|
||||||
game := server.NewGame(
|
game := server.NewGame(
|
||||||
|
logger,
|
||||||
playerList,
|
playerList,
|
||||||
//playerInfo,
|
|
||||||
keepAlive,
|
keepAlive,
|
||||||
commands,
|
commands,
|
||||||
)
|
)
|
||||||
@ -63,7 +62,7 @@ func main() {
|
|||||||
dimList.Add(game.CreateEntity(world.NewDimension(
|
dimList.Add(game.CreateEntity(world.NewDimension(
|
||||||
"minecraft:overworld", *regionPath,
|
"minecraft:overworld", *regionPath,
|
||||||
)), "minecraft:overworld")
|
)), "minecraft:overworld")
|
||||||
player.SpawnSystem(game, "./save/testdata/playerdata")
|
player.SpawnSystem(game, *playerdataPath)
|
||||||
player.PosAndRotSystem(game)
|
player.PosAndRotSystem(game)
|
||||||
go game.Run(context.Background())
|
go game.Run(context.Background())
|
||||||
|
|
||||||
@ -97,3 +96,21 @@ func readIcon() image.Image {
|
|||||||
}
|
}
|
||||||
return icon
|
return icon
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Logger struct{ *log.Logger }
|
||||||
|
|
||||||
|
func (l Logger) Init(g *server.Game) {
|
||||||
|
l.Print("Server init")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l Logger) Run(ctx context.Context) {
|
||||||
|
l.Print("Server is running")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l Logger) ClientJoin(c *server.Client, p *server.Player) {
|
||||||
|
l.Printf("Player join [%s]%v from %v", p.Name, p.UUID, c.Socket.RemoteAddr())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l Logger) ClientLeft(c *server.Client, p *server.Player, reason error) {
|
||||||
|
l.Printf("Player left [%s]%v reason: %v", p.Name, p.UUID, reason)
|
||||||
|
}
|
||||||
|
@ -84,6 +84,6 @@ func (c *ClientInformation) Init(g *server.Game) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *ClientInformation) Run(ctx context.Context) {}
|
func (c *ClientInformation) Run(ctx context.Context) {}
|
||||||
func (c *ClientInformation) ClientJoin(p *server.Client) {}
|
func (c *ClientInformation) ClientJoin(client *server.Client, player *server.Player) {}
|
||||||
func (c *ClientInformation) ClientLeft(p *server.Client) {}
|
func (c *ClientInformation) ClientLeft(client *server.Client, player *server.Player, reason error) {}
|
||||||
|
@ -41,4 +41,4 @@ func (g *Graph) ClientJoin(client *server.Client, _ *server.Player) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ClientLeft implement server.Component for Graph
|
// ClientLeft implement server.Component for Graph
|
||||||
func (g *Graph) ClientLeft(_ *server.Client, _ *server.Player) {}
|
func (g *Graph) ClientLeft(_ *server.Client, _ *server.Player, _ error) {}
|
||||||
|
@ -32,27 +32,27 @@ func FuncSystem(F any) System {
|
|||||||
}
|
}
|
||||||
return &funcsystem{
|
return &funcsystem{
|
||||||
update: func(w *World) {
|
update: func(w *World) {
|
||||||
storages := make([]Storage, in)
|
storages := make([]reflect.Value, in)
|
||||||
for i := 0; i < in; i++ {
|
for i := 0; i < in; i++ {
|
||||||
storages[i] = w.GetResourceRaw(argTypes[i]).(Storage)
|
storages[i] = reflect.ValueOf(w.GetResourceRaw(argTypes[i]))
|
||||||
}
|
}
|
||||||
args := make([]reflect.Value, len(storages))
|
args := make([]reflect.Value, len(storages))
|
||||||
if len(storages) > 0 {
|
if len(storages) > 0 {
|
||||||
set := reflect.ValueOf(storages[0]).FieldByName("BitSet").Addr()
|
set := reflect.Indirect(storages[0]).FieldByName("BitSet").Addr()
|
||||||
for _, v := range storages[1:] {
|
for _, v := range storages[1:] {
|
||||||
p := reflect.ValueOf(v).FieldByName("BitSet").Addr()
|
p := reflect.Indirect(v).FieldByName("BitSet").Addr()
|
||||||
set = set.MethodByName("And").Call([]reflect.Value{p})[0]
|
set = set.MethodByName("And").Call([]reflect.Value{p})[0]
|
||||||
}
|
}
|
||||||
set.MethodByName("Range").Call([]reflect.Value{
|
set.MethodByName("Range").Call([]reflect.Value{
|
||||||
reflect.ValueOf(func(eid Index) {
|
reflect.ValueOf(func(eid Index) {
|
||||||
for i := range args {
|
for i := range args {
|
||||||
arg := storages[i].GetValueAny(eid)
|
arg := storages[i].MethodByName("GetValue").Call([]reflect.Value{reflect.ValueOf(eid)})[0]
|
||||||
if arg == nil {
|
if arg.IsNil() {
|
||||||
args[i] = reflect.Zero(argTypes[i])
|
args[i] = reflect.Zero(argTypes[i])
|
||||||
} else if needCopy[i] {
|
} else if needCopy[i] {
|
||||||
args[i] = reflect.ValueOf(arg).Elem()
|
args[i] = arg.Elem()
|
||||||
} else {
|
} else {
|
||||||
args[i] = reflect.ValueOf(arg)
|
args[i] = arg
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
f.Call(args)
|
f.Call(args)
|
||||||
|
@ -40,7 +40,7 @@ type Component interface {
|
|||||||
Init(g *Game)
|
Init(g *Game)
|
||||||
Run(ctx context.Context)
|
Run(ctx context.Context)
|
||||||
ClientJoin(c *Client, p *Player)
|
ClientJoin(c *Client, p *Player)
|
||||||
ClientLeft(c *Client, p *Player)
|
ClientLeft(c *Client, p *Player, reason error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewGame(components ...Component) *Game {
|
func NewGame(components ...Component) *Game {
|
||||||
@ -112,21 +112,22 @@ func (g *Game) AcceptPlayer(name string, id uuid.UUID, protocol int32, conn *net
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
var err error
|
||||||
for _, component := range g.components {
|
for _, component := range g.components {
|
||||||
component.ClientJoin(c, p)
|
component.ClientJoin(c, p)
|
||||||
defer component.ClientLeft(c, p)
|
defer func(cmp Component) { cmp.ClientLeft(c, p, err) }(component)
|
||||||
}
|
}
|
||||||
|
|
||||||
var packet pk.Packet
|
var packet pk.Packet
|
||||||
for {
|
for {
|
||||||
if err := c.ReadPacket(&packet); err != nil {
|
if err = c.ReadPacket(&packet); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for _, ph := range g.handlers[packet.ID] {
|
for _, ph := range g.handlers[packet.ID] {
|
||||||
if err := ph.F(c, p, Packet758(packet)); err != nil {
|
if err = ph.F(c, p, Packet758(packet)); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if err := c.GetErr(); err != nil {
|
if err = c.GetErr(); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -100,7 +100,7 @@ func (k *KeepAlive) Run(ctx context.Context) {
|
|||||||
func (k *KeepAlive) ClientJoin(client *Client, _ *Player) { k.join <- client }
|
func (k *KeepAlive) ClientJoin(client *Client, _ *Player) { k.join <- client }
|
||||||
|
|
||||||
// ClientLeft implement Component for KeepAlive
|
// ClientLeft implement Component for KeepAlive
|
||||||
func (k *KeepAlive) ClientLeft(client *Client, _ *Player) { k.quit <- client }
|
func (k *KeepAlive) ClientLeft(client *Client, _ *Player, _ error) { k.quit <- client }
|
||||||
|
|
||||||
func (k KeepAlive) pushPlayer(p *Client) {
|
func (k KeepAlive) pushPlayer(p *Client) {
|
||||||
k.listIndex[p] = k.pingList.PushBack(
|
k.listIndex[p] = k.pingList.PushBack(
|
||||||
|
@ -54,7 +54,7 @@ func (p *PlayerList) ClientJoin(client *Client, player *Player) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ClientLeft implement Component for PlayerList
|
// ClientLeft implement Component for PlayerList
|
||||||
func (p *PlayerList) ClientLeft(_ *Client, player *Player) {
|
func (p *PlayerList) ClientLeft(_ *Client, player *Player, _ error) {
|
||||||
p.playersLock.Lock()
|
p.playersLock.Lock()
|
||||||
defer p.playersLock.Unlock()
|
defer p.playersLock.Unlock()
|
||||||
delete(p.clients, player.UUID)
|
delete(p.clients, player.UUID)
|
||||||
|
Reference in New Issue
Block a user