72 lines
1.5 KiB
Go
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)
|
|
}
|