aboutsummaryrefslogtreecommitdiff
path: root/src/client/entity/player.hh
blob: d9bdc183a24b585efe7e96d8ecf3f8ce571df29e (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
65
66
67
68
69
70
71
72
73
#ifndef CLIENT_ENTITY_PLAYER_HH_
#define CLIENT_ENTITY_PLAYER_HH_

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

#include "client/entity/moveable.hh"
#include "client/entity/entity.hh"
#include "client/item/block.hh"
#include "client/item/items.hh"
#include "client/math.hh"
#include "client/render/camera.hh"
#include "client/render/model.hh"
#include "client/render/program.hh"

namespace client {

// Renderable player, similar to client::chunk. We also store the message the
// player wants to say.
class player : virtual public shared::player, public client::moveable {
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 client::player& lp) noexcept;

public:
    player(shared::player&& p) noexcept
        : shared::entity(p), shared::animate(p), shared::player(p),
          client::entity(p), client::animate(std::move(p)) {

        // upgrade our inventory contents to client::item::item
        for (auto& item : this->inventory.contents) {
            if (item == nullptr) {
                continue;
            }

            item = client::item::make_item(item->get_type(), item->quantity);
        }
    }
    player(const proto::animate& proto) noexcept
        : shared::entity(proto.entity()), shared::animate(proto),
          shared::player(proto), client::entity(proto.entity()),
          client::animate(proto) {}

    virtual void draw(const client::player& localplayer) noexcept override;
    virtual void draw_wts(const client::player& localplayer) noexcept override;

    const std::optional<struct message>& get_message() noexcept {
        if (this->message.has_value()) {
            const auto now = std::chrono::steady_clock::now();
            if (now > this->message->receive_time + player::MSG_SHOW_TIME) {
                this->message.reset();
            }
        }
        return this->message;
    }
};

} // namespace client

#endif