72 lines
1.5 KiB
Go

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