Implemented disconnects
This commit is contained in:
@ -40,7 +40,7 @@ func (game *Game) Login(data []byte, address *net.UDPAddr, server *Server) error
|
||||
return errors.New("login failure")
|
||||
}
|
||||
|
||||
player := game.players.Add(address, account)
|
||||
player := NewPlayer(address, account, game)
|
||||
player.authToken = createAuthToken()
|
||||
player.KeepAlive()
|
||||
|
||||
@ -49,24 +49,10 @@ func (game *Game) Login(data []byte, address *net.UDPAddr, server *Server) error
|
||||
response = AppendString(response, player.authToken)
|
||||
server.Send(packet.Login, response, address)
|
||||
|
||||
game.onLogin(player)
|
||||
game.players.Add(player)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Inform the newly logged in player about existing players.
|
||||
// Also inform existing players about the newly logged in player.
|
||||
func (game *Game) onLogin(player *Player) {
|
||||
game.players.Each(func(other *Player) bool {
|
||||
game.server.Send(packet.PlayerAdd, other.State(), player.address)
|
||||
|
||||
if other != player {
|
||||
game.server.Send(packet.PlayerAdd, player.State(), other.address)
|
||||
}
|
||||
|
||||
return true
|
||||
})
|
||||
}
|
||||
|
||||
func getLoginData(data []byte) (string, string, error) {
|
||||
loginRequest := [2]string{}
|
||||
err := json.Unmarshal(data, &loginRequest)
|
||||
|
@ -3,22 +3,25 @@ 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(account *Account, address *net.UDPAddr) *Player {
|
||||
func NewPlayer(address *net.UDPAddr, account *Account, game *Game) *Player {
|
||||
return &Player{
|
||||
Account: account,
|
||||
address: address,
|
||||
game: game,
|
||||
}
|
||||
}
|
||||
|
||||
@ -48,8 +51,21 @@ func (player *Player) State() []byte {
|
||||
|
||||
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)
|
||||
}
|
||||
|
@ -30,9 +30,9 @@ func NewPlayerManager() *PlayerManager {
|
||||
player := value.(*Player)
|
||||
|
||||
if !player.lastPacket.IsZero() && now.After(player.lastPacket.Add(timeout)) {
|
||||
player.OnDisconnect()
|
||||
m.players.Delete(key)
|
||||
m.count.Add(-1)
|
||||
player.OnDisconnect()
|
||||
}
|
||||
|
||||
return true
|
||||
@ -44,12 +44,10 @@ func NewPlayerManager() *PlayerManager {
|
||||
}
|
||||
|
||||
// Add adds a new player with the given address and account.
|
||||
func (m *PlayerManager) Add(address *net.UDPAddr, account *Account) *Player {
|
||||
player := NewPlayer(account, address)
|
||||
m.players.Store(address.String(), player)
|
||||
func (m *PlayerManager) Add(player *Player) {
|
||||
m.players.Store(player.address.String(), player)
|
||||
m.count.Add(1)
|
||||
player.OnConnect()
|
||||
return player
|
||||
}
|
||||
|
||||
// Contains tells you whether the address is already a registered client.
|
||||
|
Reference in New Issue
Block a user