Fuck yeah server is working :D

This commit is contained in:
2024-10-11 14:47:52 +02:00
parent de75b8ef52
commit be569be8a6
3 changed files with 135 additions and 28 deletions

129
main.go
View File

@ -2,9 +2,14 @@ package main
import (
"fmt"
"log"
"math"
"net"
"time"
pb "gitea.boner.be/bdnugget/goonserver/actions"
rl "github.com/gen2brain/raylib-go/raylib"
"google.golang.org/protobuf/proto"
)
const (
@ -12,6 +17,8 @@ const (
MapHeight = 50
TileSize = 32
TileHeight = 2.0
TickRate = 2600 * time.Millisecond // Server tick rate (600ms)
serverAddr = "localhost:6969"
)
var (
@ -26,11 +33,23 @@ type Tile struct {
Walkable bool
}
type ActionType int
const (
MoveAction ActionType = iota
)
type Action struct {
Type ActionType
X, Y int // Target position for movement
}
type Player struct {
PosActual rl.Vector3
PosTile Tile
TargetPath []Tile
Speed float32
PosActual rl.Vector3
PosTile Tile
TargetPath []Tile
Speed float32
ActionQueue []Action // Queue for player actions
}
// Initialize the map with some height data
@ -209,6 +228,7 @@ func HandleInput(player *Player, mapGrid [][]Tile, camera *rl.Camera) {
// Exclude the first tile (current position)
if len(path) > 1 {
player.TargetPath = path[1:]
player.ActionQueue = append(player.ActionQueue, Action{Type: MoveAction, X: clickedTile.X, Y: clickedTile.Y})
}
}
}
@ -267,18 +287,6 @@ func main() {
rl.InitAudioDevice()
defer rl.CloseAudioDevice()
playerModel := rl.LoadModel("resources/models/goonion.obj")
defer rl.UnloadModel(playerModel)
playerTexture := rl.LoadTexture("resources/models/goonion.png")
defer rl.UnloadTexture(playerTexture)
rl.SetMaterialTexture(playerModel.Materials, rl.MapDiffuse, playerTexture)
coomerModel := rl.LoadModel("resources/models/coomer.obj")
defer rl.UnloadModel(coomerModel)
coomerTexture := rl.LoadTexture("resources/models/coomer.png")
defer rl.UnloadTexture(coomerTexture)
rl.SetMaterialTexture(coomerModel.Materials, rl.MapDiffuse, coomerTexture)
mapGrid := InitMap()
player := Player{
@ -296,6 +304,27 @@ func main() {
Projection: rl.CameraPerspective,
}
conn, playerID, err := ConnectToServer()
if err != nil {
log.Fatalf("Failed to connect to server: %v", err)
}
log.Printf("Player ID: %d", playerID)
defer conn.Close()
go HandleServerCommunication(conn, playerID, &player)
playerModel := rl.LoadModel("resources/models/goonion.obj")
defer rl.UnloadModel(playerModel)
playerTexture := rl.LoadTexture("resources/models/goonion.png")
defer rl.UnloadTexture(playerTexture)
rl.SetMaterialTexture(playerModel.Materials, rl.MapDiffuse, playerTexture)
coomerModel := rl.LoadModel("resources/models/coomer.obj")
defer rl.UnloadModel(coomerModel)
coomerTexture := rl.LoadTexture("resources/models/coomer.png")
defer rl.UnloadTexture(coomerTexture)
rl.SetMaterialTexture(coomerModel.Materials, rl.MapDiffuse, coomerTexture)
rl.SetTargetFPS(60)
// Music
@ -305,6 +334,7 @@ func main() {
defer rl.UnloadMusicStream(music)
for !rl.WindowShouldClose() {
rl.UpdateMusicStream(music)
// Time management
@ -337,6 +367,73 @@ func main() {
}
}
func ConnectToServer() (net.Conn, int32, error) {
// Attempt to connect to the server
conn, err := net.Dial("tcp", serverAddr)
if err != nil {
log.Printf("Failed to dial server: %v", err)
return nil, 0, err
}
log.Println("Connected to server. Waiting for player ID...")
// Buffer for incoming server message
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
log.Printf("Error reading player ID from server: %v", err)
return nil, 0, err
}
log.Printf("Received data: %x", buf[:n])
// Unmarshal server message to extract the player ID
var response pb.ServerMessage
if err := proto.Unmarshal(buf[:n], &response); err != nil {
log.Printf("Failed to unmarshal server response: %v", err)
return nil, 0, err
}
playerID := response.GetPlayerId()
log.Printf("Successfully connected with player ID: %d", playerID)
return conn, playerID, nil
}
func HandleServerCommunication(conn net.Conn, playerID int32, player *Player) {
for {
// Check if there are actions in the player's queue
if len(player.ActionQueue) > 0 {
// Process the first action in the queue
actionData := player.ActionQueue[0]
action := &pb.Action{
PlayerId: playerID,
Type: pb.Action_MOVE,
X: int32(actionData.X),
Y: int32(actionData.Y),
}
// Serialize the action
data, err := proto.Marshal(action)
if err != nil {
log.Printf("Failed to marshal action: %v", err)
continue
}
// Send action to server
_, err = conn.Write(data)
if err != nil {
log.Printf("Failed to send action to server: %v", err)
return
}
// Remove the action from the queue once it's sent
player.ActionQueue = player.ActionQueue[1:]
}
// Add a delay based on the server's tick rate
time.Sleep(TickRate)
}
}
// pathfinding
type Node struct {
Tile Tile