[WorldController] Now saving block inventory and metadata.
This commit is contained in:
parent
2c18d3ba49
commit
0cdb08060a
@ -73,10 +73,10 @@ void Chunk::setBlock(int x, int y, int z, u16 type) {
|
|||||||
|
|
||||||
const Block &block = Registry::getInstance().getBlock(type);
|
const Block &block = Registry::getInstance().getBlock(type);
|
||||||
if (block.canUpdate()) {
|
if (block.canUpdate()) {
|
||||||
m_tickingBlocks.emplace(x + y * width + z * (width * height), block);
|
addTickingBlock(x, y, z, block);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
auto it = m_tickingBlocks.find(x + y * width + z * (width * height));
|
auto it = m_tickingBlocks.find(gk::Vector3i{x, y, z});
|
||||||
if (it != m_tickingBlocks.end())
|
if (it != m_tickingBlocks.end())
|
||||||
m_tickingBlocks.erase(it);
|
m_tickingBlocks.erase(it);
|
||||||
}
|
}
|
||||||
|
@ -83,6 +83,8 @@ class Chunk : public gk::NonCopyable {
|
|||||||
bool areAllNeighboursLoaded() const;
|
bool areAllNeighboursLoaded() const;
|
||||||
bool areAllNeighboursInitialized() const;
|
bool areAllNeighboursInitialized() const;
|
||||||
|
|
||||||
|
void addTickingBlock(int x, int y, int z, const Block &block) { m_tickingBlocks.emplace(gk::Vector3i{x, y, z}, block); }
|
||||||
|
|
||||||
bool hasChanged() const { return m_hasChanged; }
|
bool hasChanged() const { return m_hasChanged; }
|
||||||
void setChanged(bool hasChanged) { m_hasChanged = hasChanged; }
|
void setChanged(bool hasChanged) { m_hasChanged = hasChanged; }
|
||||||
|
|
||||||
@ -124,8 +126,7 @@ class Chunk : public gk::NonCopyable {
|
|||||||
std::atomic_bool m_hasLightChanged{false};
|
std::atomic_bool m_hasLightChanged{false};
|
||||||
std::atomic_bool m_isInitialized{false};
|
std::atomic_bool m_isInitialized{false};
|
||||||
|
|
||||||
std::unordered_map<std::size_t, const Block&> m_tickingBlocks;
|
std::unordered_map<gk::Vector3i, const Block&> m_tickingBlocks;
|
||||||
|
|
||||||
std::unordered_map<gk::Vector3i, std::unique_ptr<BlockData>> m_blockData;
|
std::unordered_map<gk::Vector3i, std::unique_ptr<BlockData>> m_blockData;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -165,6 +165,8 @@ int ServerApplication::run(bool isProtected) {
|
|||||||
|
|
||||||
m_serverCommandHandler.sendServerClosed("Server closed.");
|
m_serverCommandHandler.sendServerClosed("Server closed.");
|
||||||
|
|
||||||
|
m_server.disconnectAllClients();
|
||||||
|
|
||||||
m_registry.clear();
|
m_registry.clear();
|
||||||
m_worldController.clearEntities();
|
m_worldController.clearEntities();
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,11 @@ void Server::init(u16 port) {
|
|||||||
m_selector.add(m_tcpListener);
|
m_selector.add(m_tcpListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Server::disconnectAllClients() {
|
||||||
|
for (auto &it : m_info.clients())
|
||||||
|
disconnectClient(it);
|
||||||
|
}
|
||||||
|
|
||||||
void Server::handleGameEvents() {
|
void Server::handleGameEvents() {
|
||||||
if (m_selector.wait(sf::milliseconds(10))) {
|
if (m_selector.wait(sf::milliseconds(10))) {
|
||||||
if (m_selector.isReady(m_tcpListener)) {
|
if (m_selector.isReady(m_tcpListener)) {
|
||||||
|
@ -43,6 +43,8 @@ class Server {
|
|||||||
public:
|
public:
|
||||||
void init(u16 port = 4242);
|
void init(u16 port = 4242);
|
||||||
|
|
||||||
|
void disconnectAllClients();
|
||||||
|
|
||||||
void handleGameEvents();
|
void handleGameEvents();
|
||||||
|
|
||||||
void sendToAllClients(Network::Packet &packet) const;
|
void sendToAllClients(Network::Packet &packet) const;
|
||||||
|
@ -54,11 +54,13 @@ void ServerChunk::onBlockDestroyed(int x, int y, int z, const Block &block) {
|
|||||||
void ServerChunk::tick(World &world, ServerCommandHandler &server) {
|
void ServerChunk::tick(World &world, ServerCommandHandler &server) {
|
||||||
if (!m_tickingBlocks.empty()) {
|
if (!m_tickingBlocks.empty()) {
|
||||||
for (auto &it : m_tickingBlocks) {
|
for (auto &it : m_tickingBlocks) {
|
||||||
int z = it.first / (width * height);
|
|
||||||
int y = (it.first - z * (width * height)) / width;
|
|
||||||
int x = (it.first - z * (width * height)) % width;
|
|
||||||
((ServerBlock &)it.second).onTick(
|
((ServerBlock &)it.second).onTick(
|
||||||
glm::ivec3{x + m_x * width, y + m_y * depth, z + m_z * height}, *this, world, server);
|
glm::ivec3{
|
||||||
|
it.first.x + m_x * width,
|
||||||
|
it.first.y + m_y * depth,
|
||||||
|
it.first.z + m_z * height
|
||||||
|
},
|
||||||
|
*this, world, server);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -82,6 +82,14 @@ void WorldController::load(const std::string &name) {
|
|||||||
for (u8 z = 0 ; z < Chunk::height ; ++z) {
|
for (u8 z = 0 ; z < Chunk::height ; ++z) {
|
||||||
for (u8 y = 0 ; y < Chunk::depth ; ++y) {
|
for (u8 y = 0 ; y < Chunk::depth ; ++y) {
|
||||||
for (u8 x = 0 ; x < Chunk::width ; ++x) {
|
for (u8 x = 0 ; x < Chunk::width ; ++x) {
|
||||||
|
bool hasMetadata;
|
||||||
|
save >> hasMetadata;
|
||||||
|
|
||||||
|
if (hasMetadata) {
|
||||||
|
BlockData *blockData = chunk.addBlockData(x, y, z);
|
||||||
|
save >> blockData->inventory >> blockData->meta >> blockData->useAltTiles;
|
||||||
|
}
|
||||||
|
|
||||||
u32 data;
|
u32 data;
|
||||||
u8 light;
|
u8 light;
|
||||||
save >> data >> light;
|
save >> data >> light;
|
||||||
@ -89,6 +97,10 @@ void WorldController::load(const std::string &name) {
|
|||||||
chunk.setBlockRaw(x, y, z, data & 0xffff);
|
chunk.setBlockRaw(x, y, z, data & 0xffff);
|
||||||
chunk.setData(x, y, z, data >> 16);
|
chunk.setData(x, y, z, data >> 16);
|
||||||
chunk.lightmap().setLightData(x, y, z, light);
|
chunk.lightmap().setLightData(x, y, z, light);
|
||||||
|
|
||||||
|
const Block &block = Registry::getInstance().getBlock(data & 0xffff);
|
||||||
|
if (block.canUpdate())
|
||||||
|
chunk.addTickingBlock(x, y, z, block);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -124,6 +136,12 @@ void WorldController::save(const std::string &name) {
|
|||||||
for (u8 z = 0 ; z < Chunk::height ; ++z) {
|
for (u8 z = 0 ; z < Chunk::height ; ++z) {
|
||||||
for (u8 y = 0 ; y < Chunk::depth ; ++y) {
|
for (u8 y = 0 ; y < Chunk::depth ; ++y) {
|
||||||
for (u8 x = 0 ; x < Chunk::width ; ++x) {
|
for (u8 x = 0 ; x < Chunk::width ; ++x) {
|
||||||
|
BlockData *blockData = it.second->getBlockData(x, y, z);
|
||||||
|
if (blockData)
|
||||||
|
chunks << true << blockData->inventory << blockData->meta << blockData->useAltTiles;
|
||||||
|
else
|
||||||
|
chunks << false;
|
||||||
|
|
||||||
chunks << u32(data[z][y][x])
|
chunks << u32(data[z][y][x])
|
||||||
<< u8(it.second->lightmap().getLightData(x, y, z));
|
<< u8(it.second->lightmap().getLightData(x, y, z));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user