aboutsummaryrefslogtreecommitdiff
path: root/src/client/player.hh
blob: c41ba238540071ec8d5c4dc641647ac9a86d70fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#ifndef CLIENT_PLAYER_HH_
#define CLIENT_PLAYER_HH_

#include <chrono>
#include <optional>
#include <string>
#include <utility>

#include "client/math.hh"
#include "client/render/camera.hh"
#include "client/render/model.hh"
#include "client/render/program.hh"
#include "shared/player.hh"

namespace client {

// Renderable player, similar to client::chunk. We also store the message the
// player wants to say.
class player : public shared::player {
public:
    static constexpr auto MSG_SHOW_TIME = std::chrono::seconds(15); 
    struct message {
        std::string text;
        std::chrono::time_point<std::chrono::steady_clock> receive_time;
        message(const std::string& message) noexcept {
            this->text = message;
            this->receive_time = std::chrono::steady_clock::now();
        }
    };
    std::optional<message> message;

private:
    glm::vec3 get_world_pos(const shared::player& lp) noexcept;

public:
    player(shared::player&& p) noexcept
        : shared::player(std::forward<shared::player>(p)) {}
    player(const shared::player& p) noexcept : shared::player(p) {}

    void update(const shared::player& p) noexcept {
        this->index = p.index; // there is no syntax for doing this in one line
        this->commands = p.commands;
        this->chunk_pos = p.chunk_pos;
        this->local_pos = p.local_pos;
        this->viewangles = p.viewangles;
        this->velocity = p.velocity;
    }

    void draw_playermodel(const shared::player& localplayer) noexcept;
    void draw_message(const shared::player& localplayer) noexcept;

    const std::optional<struct message>& get_message() const noexcept {
        return this->message;
    }
};

using players = std::vector<player>;
static inline client::player& get_localplayer(players& players) noexcept {
    return players[0];
}

} // namespace client

#endif