package game import ( "fmt" "net" "server/game/packet" "time" ) // Player represents a logged in client. type Player struct { *Account game *Game authToken string address *net.UDPAddr lastPacket time.Time } // NewPlayer creates a new player. func NewPlayer(address *net.UDPAddr, account *Account, game *Game) *Player { return &Player{ Account: account, address: address, game: game, } } // String shows the client address. func (c *Player) String() string { return c.address.String() } // KeepAlive sets the last packet time to now. func (c *Player) KeepAlive() { c.lastPacket = time.Now() } // Tick is run on every tick. func (c *Player) Tick() { // ... } // State returns the player state (ID, name and position). func (player *Player) State() []byte { state := []byte{} state = AppendString(state, player.ID) state = AppendString(state, player.Name) state = AppendVector3(state, player.Position) return state } func (player *Player) OnConnect() { fmt.Printf("%s connected.\n", player.Name) players := player.game.players server := player.game.server players.Each(func(other *Player) bool { server.Send(packet.PlayerAdd, other.State(), player.address) if other != player { server.Send(packet.PlayerAdd, player.State(), other.address) } return true }) } func (player *Player) OnDisconnect() { fmt.Printf("%s disconnected.\n", player.Name) player.game.BroadcastOthers(packet.PlayerRemove, []byte(player.ID), player) }