diff --git a/game/chat.go b/game/chat.go index b91213f..e4a163f 100644 --- a/game/chat.go +++ b/game/chat.go @@ -23,6 +23,7 @@ type Chat struct { isTyping bool cursorPos int scrollOffset int + userData interface{} } func NewChat() *Chat { @@ -61,6 +62,25 @@ func (c *Chat) HandleServerMessages(messages []*pb.ChatMessage) { c.messages = c.messages[1:] } c.messages = append(c.messages, localMsg) + + // Add floating message to the player + if game, ok := c.userData.(*Game); ok { + if msg.PlayerId == game.Player.ID { + game.Player.Lock() + game.Player.FloatingMessage = &types.FloatingMessage{ + Content: msg.Content, + ExpireTime: time.Now().Add(6 * time.Second), + } + game.Player.Unlock() + } else if otherPlayer, exists := game.OtherPlayers[msg.PlayerId]; exists { + otherPlayer.Lock() + otherPlayer.FloatingMessage = &types.FloatingMessage{ + Content: msg.Content, + ExpireTime: time.Now().Add(6 * time.Second), + } + otherPlayer.Unlock() + } + } } } } diff --git a/game/game.go b/game/game.go index 9690cb4..8220586 100644 --- a/game/game.go +++ b/game/game.go @@ -1,6 +1,8 @@ package game import ( + "time" + "gitea.boner.be/bdnugget/goonscape/assets" "gitea.boner.be/bdnugget/goonscape/types" pb "gitea.boner.be/bdnugget/goonserver/actions" @@ -37,6 +39,7 @@ func New() *Game { Chat: NewChat(), } game.Player.UserData = game + game.Chat.userData = game return game } @@ -122,6 +125,18 @@ func (g *Game) DrawPlayer(player *types.Player, model rl.Model) { rl.DrawModel(model, playerPos, 16, rl.White) + if player.FloatingMessage != nil && time.Now().Before(player.FloatingMessage.ExpireTime) { + screenPos := rl.GetWorldToScreen(rl.Vector3{ + X: playerPos.X, + Y: playerPos.Y + 24.0, + Z: playerPos.Z, + }, g.Camera) + + player.FloatingMessage.ScreenPos = screenPos + } else if player.FloatingMessage != nil { + player.FloatingMessage = nil + } + if len(player.TargetPath) > 0 { targetTile := player.TargetPath[len(player.TargetPath)-1] targetPos := rl.Vector3{ @@ -144,16 +159,43 @@ func (g *Game) DrawPlayer(player *types.Player, model rl.Model) { func (g *Game) Render() { rl.BeginDrawing() rl.ClearBackground(rl.RayWhite) - rl.BeginMode3D(g.Camera) + rl.BeginMode3D(g.Camera) g.DrawMap() g.DrawPlayer(g.Player, g.Player.Model) - for id, other := range g.OtherPlayers { g.DrawPlayer(other, g.Models[int(id)%len(g.Models)].Model) } - rl.EndMode3D() + + drawFloatingMessage := func(msg *types.FloatingMessage) { + if msg == nil || time.Now().After(msg.ExpireTime) { + return + } + pos := msg.ScreenPos + text := msg.Content + textWidth := rl.MeasureText(text, 20) + + for offsetX := -2; offsetX <= 2; offsetX++ { + for offsetY := -2; offsetY <= 2; offsetY++ { + rl.DrawText(text, + int32(pos.X)-textWidth/2+int32(offsetX), + int32(pos.Y)+int32(offsetY), + 20, + rl.Black) + } + } + rl.DrawText(text, int32(pos.X)-textWidth/2, int32(pos.Y), 20, rl.Yellow) + } + + if g.Player.FloatingMessage != nil { + drawFloatingMessage(g.Player.FloatingMessage) + } + + for _, other := range g.OtherPlayers { + drawFloatingMessage(other.FloatingMessage) + } + rl.DrawFPS(10, 10) g.Chat.Draw(int32(rl.GetScreenWidth()), int32(rl.GetScreenHeight())) rl.EndDrawing() diff --git a/types/types.go b/types/types.go index 6d649c4..9462593 100644 --- a/types/types.go +++ b/types/types.go @@ -28,6 +28,7 @@ type Player struct { LastUpdateTime time.Time InterpolationProgress float32 UserData interface{} // Used to store reference to game + FloatingMessage *FloatingMessage } type ModelAsset struct { @@ -41,6 +42,12 @@ type ChatMessage struct { Time time.Time } +type FloatingMessage struct { + Content string + ExpireTime time.Time + ScreenPos rl.Vector2 // Store the screen position for 2D rendering +} + const ( MapWidth = 50 MapHeight = 50 @@ -51,5 +58,6 @@ const ( ServerTickRate = 600 * time.Millisecond ClientTickRate = 50 * time.Millisecond MaxTickDesync = 5 - ServerAddr = "localhost:6969" + // ServerAddr = "localhost:6969" + ServerAddr = "boner.be:6969" )