102 lines
2.9 KiB
Go
102 lines
2.9 KiB
Go
package main
|
|
|
|
import (
|
|
"time"
|
|
|
|
pb "gitea.boner.be/bdnugget/goonserver/actions"
|
|
rl "github.com/gen2brain/raylib-go/raylib"
|
|
)
|
|
|
|
func DrawPlayer(player *Player, model rl.Model) {
|
|
// Draw the player based on its actual position (PosActual) and current tile height
|
|
playerPos := rl.Vector3{
|
|
X: player.PosActual.X,
|
|
Y: mapGrid[player.PosTile.X][player.PosTile.Y].Height*TileHeight + 16.0,
|
|
Z: player.PosActual.Z,
|
|
}
|
|
|
|
rl.DrawModel(model, playerPos, 16, rl.White)
|
|
|
|
// Draw highlight around target tile
|
|
if len(player.TargetPath) > 0 {
|
|
targetTile := player.TargetPath[len(player.TargetPath)-1] // last tile in the slice
|
|
targetPos := rl.Vector3{
|
|
X: float32(targetTile.X * TileSize),
|
|
Y: mapGrid[targetTile.X][targetTile.Y].Height * TileHeight,
|
|
Z: float32(targetTile.Y * TileSize),
|
|
}
|
|
rl.DrawCubeWires(targetPos, TileSize, TileHeight, TileSize, rl.Green)
|
|
|
|
nextTile := player.TargetPath[0] // first tile in the slice
|
|
nextPos := rl.Vector3{
|
|
X: float32(nextTile.X * TileSize),
|
|
Y: mapGrid[nextTile.X][nextTile.Y].Height * TileHeight,
|
|
Z: float32(nextTile.Y * TileSize),
|
|
}
|
|
rl.DrawCubeWires(nextPos, TileSize, TileHeight, TileSize, rl.Yellow)
|
|
}
|
|
}
|
|
|
|
func (player *Player) MoveTowards(target Tile, deltaTime float32) {
|
|
// Calculate the direction vector to the target tile
|
|
targetPos := rl.Vector3{
|
|
X: float32(target.X * TileSize),
|
|
Y: mapGrid[target.X][target.Y].Height * TileHeight,
|
|
Z: float32(target.Y * TileSize),
|
|
}
|
|
|
|
// Calculate direction and normalize it for smooth movement
|
|
direction := rl.Vector3Subtract(targetPos, player.PosActual)
|
|
distance := rl.Vector3Length(direction)
|
|
if distance > 0 {
|
|
direction = rl.Vector3Scale(direction, player.Speed*deltaTime/distance)
|
|
}
|
|
|
|
// Move the player towards the target tile
|
|
if distance > 1.0 {
|
|
player.PosActual = rl.Vector3Add(player.PosActual, direction)
|
|
} else {
|
|
// Snap to the target tile when close enough
|
|
player.PosActual = targetPos
|
|
player.PosTile = target // Update player's tile
|
|
if len(player.TargetPath) > 1 {
|
|
player.TargetPath = player.TargetPath[1:] // Move to next tile in path if any
|
|
}
|
|
}
|
|
}
|
|
|
|
func (p *Player) UpdatePosition(state *pb.PlayerState, tickRate time.Duration) {
|
|
targetTile := Tile{X: int(state.X), Y: int(state.Y)}
|
|
if p.PosTile != targetTile {
|
|
p.PosTile = targetTile
|
|
p.LastUpdateTime = time.Now()
|
|
p.InterpolationProgress = 0
|
|
p.TargetPath = []Tile{targetTile}
|
|
}
|
|
}
|
|
|
|
func (p *Player) ForceResync(state *pb.PlayerState) {
|
|
p.PosTile = Tile{X: int(state.X), Y: int(state.Y)}
|
|
p.PosActual = rl.Vector3{
|
|
X: float32(state.X * TileSize),
|
|
Y: float32(state.Y * TileHeight),
|
|
Z: float32(state.Y * TileSize),
|
|
}
|
|
p.TargetPath = nil
|
|
p.ActionQueue = nil
|
|
p.InterpolationProgress = 1.0
|
|
}
|
|
|
|
func NewPlayer(state *pb.PlayerState) *Player {
|
|
return &Player{
|
|
PosActual: rl.Vector3{
|
|
X: float32(state.X * TileSize),
|
|
Y: float32(state.Y * TileHeight),
|
|
Z: float32(state.Y * TileSize),
|
|
},
|
|
PosTile: Tile{X: int(state.X), Y: int(state.Y)},
|
|
Speed: 50.0,
|
|
ID: state.PlayerId,
|
|
}
|
|
}
|