Fix chat and other players not showing up
This commit is contained in:
39
game/game.go
39
game/game.go
@ -24,6 +24,7 @@ type Game struct {
|
||||
loginScreen *LoginScreen
|
||||
isLoggedIn bool
|
||||
cleanupOnce sync.Once
|
||||
frameCounter int // For periodic logging
|
||||
}
|
||||
|
||||
func New() *Game {
|
||||
@ -129,7 +130,28 @@ func (g *Game) Update(deltaTime float32) {
|
||||
g.Player.MoveTowards(g.Player.TargetPath[0], deltaTime, GetMapGrid())
|
||||
}
|
||||
|
||||
// Periodically log information about other players
|
||||
g.frameCounter++
|
||||
if g.frameCounter%300 == 0 {
|
||||
rl.TraceLog(rl.LogInfo, "There are %d other players", len(g.OtherPlayers))
|
||||
for id, other := range g.OtherPlayers {
|
||||
rl.TraceLog(rl.LogInfo, "Other player ID: %d, Position: (%f, %f, %f), Has model: %v",
|
||||
id, other.PosActual.X, other.PosActual.Y, other.PosActual.Z, other.Model.Meshes != nil)
|
||||
}
|
||||
}
|
||||
|
||||
// Process other players
|
||||
for _, other := range g.OtherPlayers {
|
||||
if other == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
// Make sure other players have models assigned
|
||||
if other.Model.Meshes == nil {
|
||||
g.AssignModelToPlayer(other)
|
||||
}
|
||||
|
||||
// Update other player movement
|
||||
if len(other.TargetPath) > 0 {
|
||||
other.MoveTowards(other.TargetPath[0], deltaTime, GetMapGrid())
|
||||
}
|
||||
@ -167,8 +189,8 @@ func (g *Game) DrawMap() {
|
||||
}
|
||||
|
||||
func (g *Game) DrawPlayer(player *types.Player, model rl.Model) {
|
||||
player.Lock()
|
||||
defer player.Unlock()
|
||||
// No need for lock in rendering, we'll use a "take snapshot" approach
|
||||
// This avoids potential deadlocks and makes the rendering more consistent
|
||||
|
||||
// Check for invalid model
|
||||
if model.Meshes == nil || model.Meshes.VertexCount <= 0 {
|
||||
@ -196,14 +218,14 @@ func (g *Game) DrawPlayer(player *types.Player, model rl.Model) {
|
||||
if player.IsMoving && len(modelAsset.Animations.Walk) > 0 {
|
||||
anim := modelAsset.Animations.Walk[0] // Use first walk animation
|
||||
if anim.FrameCount > 0 {
|
||||
player.AnimationFrame = player.AnimationFrame % anim.FrameCount
|
||||
rl.UpdateModelAnimation(model, anim, player.AnimationFrame)
|
||||
currentFrame := player.AnimationFrame % anim.FrameCount
|
||||
rl.UpdateModelAnimation(model, anim, currentFrame)
|
||||
}
|
||||
} else if len(modelAsset.Animations.Idle) > 0 {
|
||||
anim := modelAsset.Animations.Idle[0] // Use first idle animation
|
||||
if anim.FrameCount > 0 {
|
||||
player.AnimationFrame = player.AnimationFrame % anim.FrameCount
|
||||
rl.UpdateModelAnimation(model, anim, player.AnimationFrame)
|
||||
currentFrame := player.AnimationFrame % anim.FrameCount
|
||||
rl.UpdateModelAnimation(model, anim, currentFrame)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -445,12 +467,15 @@ func (g *Game) AssignModelToPlayer(player *types.Player) {
|
||||
return
|
||||
}
|
||||
|
||||
modelIndex := int(player.ID) % len(g.Models)
|
||||
// Make sure model index is positive for consistent player appearances
|
||||
// Use abs value of ID to ensure consistent appearance for negative IDs
|
||||
modelIndex := abs(int(player.ID)) % len(g.Models)
|
||||
if modelIndex < 0 || modelIndex >= len(g.Models) {
|
||||
// Prevent out of bounds access
|
||||
modelIndex = 0
|
||||
}
|
||||
|
||||
rl.TraceLog(rl.LogInfo, "Assigning model %d to player %d", modelIndex, player.ID)
|
||||
modelAsset := g.Models[modelIndex]
|
||||
|
||||
// Validate model before assigning
|
||||
|
||||
Reference in New Issue
Block a user