Added player identification

This commit is contained in:
2024-01-26 12:50:46 +01:00
parent 0172a81bdf
commit 2cd93f2a39
12 changed files with 153 additions and 73 deletions

View File

@ -3,61 +3,75 @@ package game
import (
"crypto/rand"
"encoding/base64"
"encoding/binary"
"encoding/json"
"errors"
"net"
"server/game/packet"
)
var (
LoginSuccess = []byte{0}
LoginFailure = []byte{1}
const (
Success = 0
Failure = 1
)
// Login checks the account credentials and gives a network peer access to an account.
func (game *Game) Login(data []byte, address *net.UDPAddr, server *Server) error {
if game.players.Get(address) != nil {
server.Send(packet.Login, []byte{Failure}, address)
return errors.New("already logged in")
}
username, password, err := getLoginData(data)
if err != nil {
server.Send(packet.Login, LoginFailure, address)
server.Send(packet.Login, []byte{Failure}, address)
return err
}
account := GetAccountByName(username)
if account == nil {
server.Send(packet.Login, []byte{Failure}, address)
return errors.New("unknown account name")
}
if password != "password" {
server.Send(packet.Login, LoginFailure, address)
server.Send(packet.Login, []byte{Failure}, address)
return errors.New("login failure")
}
player := game.players.Get(address)
player.AuthToken = createAuthToken()
player.Name = username
player := game.players.Add(address, account)
player.authToken = createAuthToken()
player.KeepAlive()
if username == "user0" {
player.Position.X = 5.0
}
response := []byte{Success}
response = appendString(response, account.ID)
response = appendString(response, player.authToken)
server.Send(packet.Login, response, address)
if username == "user1" {
player.Position.X = -5.0
}
game.onLogin(player)
return nil
}
if username == "user2" {
player.Position.Z = -5.0
}
if username == "user3" {
player.Position.Z = 5.0
}
server.Send(packet.Login, append(LoginSuccess, []byte(player.AuthToken)...), address)
player.OnConnect()
func appendString(data []byte, str string) []byte {
data = binary.LittleEndian.AppendUint32(data, uint32(len(str)))
data = append(data, []byte(str)...)
return data
}
// 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 {
server.Send(packet.PlayerState, other.State(), address)
game.server.Send(packet.PlayerAdd, other.State(), player.address)
if other != player {
game.server.Send(packet.PlayerAdd, player.State(), other.address)
}
return true
})
return nil
}
func getLoginData(data []byte) (string, string, error) {