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
|