1
0
Fork 0
Univerxel/src/server/world/SharedUniverse.cpp

53 lines
2.3 KiB
C++

#include "SharedUniverse.hpp"
#include "SharedParts.hpp"
using namespace world::server;
SharedUniverse::SharedUniverse(const options &o, server_handle *const localHandle): Universe(o), localHandle(localHandle) {
// Local player
[[maybe_unused]]
const auto id = entities.at(PLAYER_ENTITY_ID).instances.emplace(Entity::Instance{spawnPoint});
assert(id == PLAYER_ENTITY_ID);
localHandle->teleport = spawnPoint;
movedPlayers.push_back(id);
localHandle->areas = (world::client::area_map*)(&areas); //WONT FIX: templated area
localHandle->emit = std::function([&](const world::action::packet &packet) {
if(const auto fill = std::get_if<world::action::Fill>(&packet)) {
this->set(fill->pos, fill->val);
} else if(const auto fillCube = std::get_if<world::action::FillCube>(&packet)) {
this->setCube(fillCube->pos, fillCube->val, fillCube->radius);
} else if(const auto move = std::get_if<world::action::Move>(&packet)) {
if(!movePlayer(PLAYER_ENTITY_ID, move->pos)) {
LOG_W("Bad move of player " << PLAYER_ENTITY_ID.index);
}
} else {
LOG_W("Bad packet");
}
});
localHandle->raycast = std::function([&](const geometry::Ray& ray){
return this->raycast(ray); });
localHandle->running = true;
}
SharedUniverse::~SharedUniverse() {
LOG_D("Breaking shared universe");
saveAll(true); //NOTE: save thread requires some virtual function calls
}
void SharedUniverse::loadChunk(area_<chunk_pos> area, chunk_pos diff, const world::ChunkContainer& chunks) {
if(localHandle->onUpdate)
localHandle->onUpdate(area, diff, chunks, Faces::All);
}
void SharedUniverse::updateChunk(area_map::iterator &it, world::ChunkContainer::iterator &it_c, chunk_pos diff, float deltaTime) {
if (const auto neighbors = std::dynamic_pointer_cast<SharedChunk>(it_c->second)->update(deltaTime, true)) {
localHandle->onUpdate(std::make_pair(it->first, it_c->first), diff, it->second->getChunks(), neighbors.value());
}
}
std::shared_ptr<Chunk> SharedUniverse::createChunk(const chunk_pos &pos, const std::unique_ptr<generator::Abstract> &rnd) const {
return std::make_shared<SharedChunk>(pos, rnd);
}
std::shared_ptr<Chunk> SharedUniverse::createChunk(std::istream &str) const {
return std::make_shared<SharedChunk>(str);
}