#ifndef CLIENT_PLAYER_HH_ #define CLIENT_PLAYER_HH_ #include #include #include #include #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 receive_time; message(const std::string& message) noexcept { this->text = message; this->receive_time = std::chrono::steady_clock::now(); } }; std::optional message; private: glm::vec3 get_world_pos(const shared::player& lp) noexcept; public: player(shared::player&& p) noexcept : shared::player(std::forward(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& get_message() const noexcept { return this->message; } }; using players = std::vector; static inline client::player& get_localplayer(players& players) noexcept { return players[0]; } } // namespace client #endif