1
0
Fork 0
Univerxel/src/client/world/DistantUniverse.hpp

54 lines
1.6 KiB
C++

#pragma once
#include "Universe.hpp"
#include "../../core/net/Client.hpp"
#include "../../core/utils/zctx.hpp"
namespace world::client {
class Area;
/// Whole universe container in network client
class DistantUniverse final: public Universe {
public:
DistantUniverse(const connection&, const options &, const std::string&);
~DistantUniverse();
void update(voxel_pos, float) override;
void emit(const action::packet &) override;
ray_result raycast(const geometry::Ray &) const override;
void getEntitiesModels(const std::function<void(size_t, const std::vector<glm::mat4>&)>&,
const std::optional<geometry::Frustum>& frustum, const glm::llvec3& offset, int density) override;
bool isDisconnected() const override { return peer.isDisconnected(); }
size_t getPlayerId() const override { return playerId; }
protected:
void pullNetwork(voxel_pos);
/// Alive areas containing chunks
area_map areas;
/// Entities without generation
struct Entity {
Entity(glm::vec3 size, glm::vec3 scale): size(size), scale(scale) { }
glm::vec3 size;
glm::vec3 scale;
data::generational::view_vector<Universe::Entity::Instance> instances;
};
data::generational::view_vector<Entity> entities;
/// Player entity instance index
size_t playerId;
net::Client peer;
std::optional<zstd::read_dict_ctx> dict;
chunk_pos last_chunk = chunk_pos(INT_MAX);
uint16_t loadDistance;
uint16_t keepDistance;
uint16_t serverDistance;
};
}