Seems to be working, but some trees are incomplete.
This commit is contained in:
parent
b3b00038eb
commit
b4f210de3a
@ -125,9 +125,9 @@ void ClientCommandHandler::sendItemActivated(const glm::ivec4 &selectedBlock) {
|
|||||||
m_client.send(packet);
|
m_client.send(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientCommandHandler::sendChunkRequest(s32 chunkX, s32 chunkY, s32 chunkZ) {
|
void ClientCommandHandler::sendChunkUnload(s32 chunkX, s32 chunkY, s32 chunkZ) {
|
||||||
Network::Packet packet;
|
Network::Packet packet;
|
||||||
packet << Network::Command::ChunkRequest;
|
packet << Network::Command::ChunkUnload;
|
||||||
packet << chunkX << chunkY << chunkZ;
|
packet << chunkX << chunkY << chunkZ;
|
||||||
m_client.send(packet);
|
m_client.send(packet);
|
||||||
}
|
}
|
||||||
|
@ -57,6 +57,7 @@ class ClientCommandHandler {
|
|||||||
void sendBlockInvUpdate(Inventory &inventory);
|
void sendBlockInvUpdate(Inventory &inventory);
|
||||||
void sendItemActivated(const glm::ivec4 &selectedBlock);
|
void sendItemActivated(const glm::ivec4 &selectedBlock);
|
||||||
void sendChunkRequest(s32 chunkX, s32 chunkY, s32 chunkZ);
|
void sendChunkRequest(s32 chunkX, s32 chunkY, s32 chunkZ);
|
||||||
|
void sendChunkUnload(s32 chunkX, s32 chunkY, s32 chunkZ);
|
||||||
void sendChatMessage(const std::string &message);
|
void sendChatMessage(const std::string &message);
|
||||||
void sendKeyPressed(u16 keyID);
|
void sendKeyPressed(u16 keyID);
|
||||||
|
|
||||||
|
@ -49,6 +49,8 @@ void ClientWorld::update(bool allowWorldReload) {
|
|||||||
for (auto it = m_chunks.begin() ; it != m_chunks.end() ;) {
|
for (auto it = m_chunks.begin() ; it != m_chunks.end() ;) {
|
||||||
// If chunk is too far, remove it
|
// If chunk is too far, remove it
|
||||||
if (it->second->isTooFar() && (it->second->isInitialized() || it->second->areAllNeighboursTooFar())) {
|
if (it->second->isTooFar() && (it->second->isInitialized() || it->second->areAllNeighboursTooFar())) {
|
||||||
|
// gkDebug() << "Chunk removed at" << it->second->x() << it->second->y() << it->second->z();
|
||||||
|
m_client->sendChunkUnload(it->second->x(), it->second->y(), it->second->z());
|
||||||
removeChunk(it);
|
removeChunk(it);
|
||||||
}
|
}
|
||||||
// Otherwise, update the chunk
|
// Otherwise, update the chunk
|
||||||
@ -284,7 +286,10 @@ void ClientWorld::draw(gk::RenderTarget &target, gk::RenderStates states) const
|
|||||||
|
|
||||||
// Nope, too far, don't render it
|
// Nope, too far, don't render it
|
||||||
if(glm::length(center) > (Config::renderDistance + 1) * CHUNK_WIDTH) {
|
if(glm::length(center) > (Config::renderDistance + 1) * CHUNK_WIDTH) {
|
||||||
it.second->setTooFar(true);
|
// If it is way too far, mark it for deletion
|
||||||
|
if(glm::length(center) > (Config::renderDistance + 3) * CHUNK_WIDTH)
|
||||||
|
it.second->setTooFar(true);
|
||||||
|
// gkDebug() << "Chunk at" << it.second->x() << it.second->y() << it.second->z() << "is too far:" << glm::length(center) << ">" << ((Config::renderDistance + 1) * CHUNK_WIDTH);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ std::string Network::commandToString(Network::Command command) {
|
|||||||
{Network::Command::ServerClosed, "ServerClosed"},
|
{Network::Command::ServerClosed, "ServerClosed"},
|
||||||
|
|
||||||
{Network::Command::ChunkData, "ChunkData"},
|
{Network::Command::ChunkData, "ChunkData"},
|
||||||
{Network::Command::ChunkRequest, "ChunkRequest"},
|
{Network::Command::ChunkUnload, "ChunkUnload"},
|
||||||
|
|
||||||
{Network::Command::PlayerPlaceBlock, "PlayerPlaceBlock"},
|
{Network::Command::PlayerPlaceBlock, "PlayerPlaceBlock"},
|
||||||
{Network::Command::PlayerDigBlock, "PlayerDigBlock"},
|
{Network::Command::PlayerDigBlock, "PlayerDigBlock"},
|
||||||
|
@ -44,7 +44,7 @@ namespace Network {
|
|||||||
ServerClosed = 0x11,
|
ServerClosed = 0x11,
|
||||||
|
|
||||||
ChunkData = 0x20,
|
ChunkData = 0x20,
|
||||||
ChunkRequest = 0x21,
|
ChunkUnload = 0x21,
|
||||||
|
|
||||||
PlayerPlaceBlock = 0x30,
|
PlayerPlaceBlock = 0x30,
|
||||||
PlayerDigBlock = 0x31,
|
PlayerDigBlock = 0x31,
|
||||||
|
@ -36,7 +36,7 @@ u8 ServerConfig::maxPlayers = 5;
|
|||||||
u16 ServerConfig::maxItemStackSize = 64;
|
u16 ServerConfig::maxItemStackSize = 64;
|
||||||
|
|
||||||
// World
|
// World
|
||||||
u8 ServerConfig::renderDistance = 5;
|
u8 ServerConfig::renderDistance = 8;
|
||||||
|
|
||||||
// Mod-defined options
|
// Mod-defined options
|
||||||
std::unordered_map<std::string, sol::object> ServerConfig::options;
|
std::unordered_map<std::string, sol::object> ServerConfig::options;
|
||||||
|
@ -277,11 +277,16 @@ void ServerCommandHandler::setupCallbacks() {
|
|||||||
m_players.disconnectPlayer(client.playerName);
|
m_players.disconnectPlayer(client.playerName);
|
||||||
});
|
});
|
||||||
|
|
||||||
m_server.setCommandCallback(Network::Command::ChunkRequest, [this](ClientInfo &client, Network::Packet &packet) {
|
m_server.setCommandCallback(Network::Command::ChunkUnload, [this](ClientInfo &client, Network::Packet &packet) {
|
||||||
s32 cx, cy, cz;
|
s32 cx, cy, cz;
|
||||||
packet >> cx >> cy >> cz;
|
packet >> cx >> cy >> cz;
|
||||||
|
|
||||||
// getWorldForClient(client.id).sendRequestedData(client, cx, cy, cz);
|
ServerPlayer *player = m_players.getPlayerFromClientID(client.id);
|
||||||
|
if (player) {
|
||||||
|
player->removeLoadedChunk(gk::Vector3i{cx, cy, cz});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
gkError() << ("Failed to unload chunk for player " + std::to_string(client.id) + ": Player not found").c_str();
|
||||||
});
|
});
|
||||||
|
|
||||||
m_server.setCommandCallback(Network::Command::PlayerInvUpdate, [this](ClientInfo &client, Network::Packet &packet) {
|
m_server.setCommandCallback(Network::Command::PlayerInvUpdate, [this](ClientInfo &client, Network::Packet &packet) {
|
||||||
|
@ -51,13 +51,12 @@ void ServerWorld::update(bool doTick) {
|
|||||||
{
|
{
|
||||||
for (auto &it : m_players) {
|
for (auto &it : m_players) {
|
||||||
if (it.second.isReady() && it.second.dimension() == m_dimension.id()) {
|
if (it.second.isReady() && it.second.dimension() == m_dimension.id()) {
|
||||||
it.second.sentChunks.clear();
|
|
||||||
|
|
||||||
gk::Vector3i currentChunk = it.second.getCurrentChunk();
|
gk::Vector3i currentChunk = it.second.getCurrentChunk();
|
||||||
if (!it.second.isChunkLoaded(currentChunk) || it.second.lastChunkUpdate != currentChunk) {
|
if (!it.second.isChunkLoaded(currentChunk) || it.second.lastChunkUpdate != currentChunk) {
|
||||||
|
it.second.sentChunks.clear();
|
||||||
m_chunksToSend.emplace(std::make_pair(currentChunk, std::ref(it.second)));
|
m_chunksToSend.emplace(std::make_pair(currentChunk, std::ref(it.second)));
|
||||||
it.second.lastChunkUpdate = currentChunk;
|
it.second.lastChunkUpdate = currentChunk;
|
||||||
gkWarning() << "coucou";
|
gkWarning() << "Player changed chunk";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -75,8 +74,18 @@ void ServerWorld::update(bool doTick) {
|
|||||||
player.addLoadedChunk(chunkPos);
|
player.addLoadedChunk(chunkPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
gk::Vector3i playerChunkPos = player.getCurrentChunk();
|
glm::dvec3 chunkWorldPos{
|
||||||
if ((playerChunkPos - chunkPos).length() < ServerConfig::renderDistance) {
|
chunkPos.x * CHUNK_WIDTH + CHUNK_WIDTH / 2.f,
|
||||||
|
chunkPos.y * CHUNK_DEPTH + CHUNK_DEPTH / 2.f,
|
||||||
|
chunkPos.z * CHUNK_HEIGHT + CHUNK_HEIGHT / 2.f
|
||||||
|
};
|
||||||
|
glm::dvec3 playerPos{
|
||||||
|
player.x(),
|
||||||
|
player.y(),
|
||||||
|
player.z()
|
||||||
|
};
|
||||||
|
if (glm::length(playerPos - chunkWorldPos) < (ServerConfig::renderDistance + 1) * CHUNK_WIDTH) {
|
||||||
|
// gkDebug() << "OK for chunk" << chunkPos.x << chunkPos.y << chunkPos.z << ":" << glm::length(playerPos - chunkWorldPos) << "<" << (int)ServerConfig::renderDistance * CHUNK_WIDTH;
|
||||||
addChunkToSend(chunkPos, 1, 0, 0, player);
|
addChunkToSend(chunkPos, 1, 0, 0, player);
|
||||||
addChunkToSend(chunkPos, -1, 0, 0, player);
|
addChunkToSend(chunkPos, -1, 0, 0, player);
|
||||||
addChunkToSend(chunkPos, 0, 1, 0, player);
|
addChunkToSend(chunkPos, 0, 1, 0, player);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user