From be1e49cfe088e3fe88f5c7ecfb50ab946a0f154d Mon Sep 17 00:00:00 2001 From: Quentin Bazin Date: Sun, 8 Mar 2020 15:28:46 +0100 Subject: [PATCH] [blocks.lua] Portal block added. Send PlayerChangeDimension on right-click. --- .../source/network/ClientCommandHandler.cpp | 10 ++++ common/source/network/Network.cpp | 43 +++++++++--------- common/source/network/Network.hpp | 43 +++++++++--------- mods/default/blocks.lua | 17 +++++++ mods/default/furnace.lua | 4 +- mods/default/init.lua | 2 + mods/default/textures/blocks/clay.png | Bin 1892 -> 2708 bytes mods/default/textures/blocks/portal.png | Bin 0 -> 2731 bytes mods/default/textures_mc/blocks/portal.png | Bin 0 -> 976 bytes mods/default/workbench.lua | 2 +- server/source/core/ServerApplication.cpp | 2 +- server/source/lua/ScriptEngine.cpp | 14 +++++- .../source/network/ServerCommandHandler.cpp | 14 +++++- .../source/network/ServerCommandHandler.hpp | 1 + server/source/world/ServerBlock.cpp | 8 ++-- server/source/world/ServerBlock.hpp | 4 +- server/source/world/ServerChunk.cpp | 5 +- server/source/world/ServerChunk.hpp | 2 +- server/source/world/ServerWorld.cpp | 4 +- server/source/world/ServerWorld.hpp | 2 +- server/source/world/WorldController.cpp | 4 +- server/source/world/WorldController.hpp | 2 +- 22 files changed, 119 insertions(+), 64 deletions(-) create mode 100644 mods/default/textures/blocks/portal.png create mode 100644 mods/default/textures_mc/blocks/portal.png diff --git a/client/source/network/ClientCommandHandler.cpp b/client/source/network/ClientCommandHandler.cpp index 0b783919b..4dac40c70 100644 --- a/client/source/network/ClientCommandHandler.cpp +++ b/client/source/network/ClientCommandHandler.cpp @@ -173,6 +173,16 @@ void ClientCommandHandler::setupCallbacks() { } }); + m_client.setCommandCallback(Network::Command::PlayerChangeDimension, [this](sf::Packet &packet) { + u16 clientId, dimension; + s32 x, y, z; + packet >> clientId >> x >> y >> z >> dimension; + + if (clientId == m_client.id()) { + DEBUG("PlayerChangeDimension received:", clientId, x, y, z, dimension); + } + }); + m_client.setCommandCallback(Network::Command::BlockGUIData, [this](sf::Packet &packet) { gk::ApplicationStateStack::getInstance().push(*this, m_player, m_world, packet, &gk::ApplicationStateStack::getInstance().top()); }); diff --git a/common/source/network/Network.cpp b/common/source/network/Network.cpp index dcfb107d4..4358b4552 100644 --- a/common/source/network/Network.cpp +++ b/common/source/network/Network.cpp @@ -32,33 +32,34 @@ std::string Network::commandToString(Network::Command command) { std::map commandNames = { - {Network::Command::ClientConnect, "ClientConnect"}, - {Network::Command::ClientDisconnect, "ClientDisconnect"}, - {Network::Command::ClientOk, "ClientOk"}, - {Network::Command::ClientRefused, "ClientRefused"}, + {Network::Command::ClientConnect, "ClientConnect"}, + {Network::Command::ClientDisconnect, "ClientDisconnect"}, + {Network::Command::ClientOk, "ClientOk"}, + {Network::Command::ClientRefused, "ClientRefused"}, - {Network::Command::KeyState, "KeyState"}, + {Network::Command::KeyState, "KeyState"}, - {Network::Command::ChunkData, "ChunkData"}, - {Network::Command::ChunkRequest, "ChunkRequest"}, + {Network::Command::ChunkData, "ChunkData"}, + {Network::Command::ChunkRequest, "ChunkRequest"}, - {Network::Command::PlayerPlaceBlock, "PlayerPlaceBlock"}, - {Network::Command::PlayerDigBlock, "PlayerDigBlock"}, - {Network::Command::PlayerInvUpdate, "PlayerInvUpdate"}, - {Network::Command::PlayerPosUpdate, "PlayerPosUpdate"}, - {Network::Command::PlayerSpawn, "PlayerSpawn"}, - {Network::Command::PlayerInventory, "PlayerInventory"}, - {Network::Command::PlayerCreativeWindow, "PlayerCreativeWindow"}, + {Network::Command::PlayerPlaceBlock, "PlayerPlaceBlock"}, + {Network::Command::PlayerDigBlock, "PlayerDigBlock"}, + {Network::Command::PlayerInvUpdate, "PlayerInvUpdate"}, + {Network::Command::PlayerPosUpdate, "PlayerPosUpdate"}, + {Network::Command::PlayerSpawn, "PlayerSpawn"}, + {Network::Command::PlayerInventory, "PlayerInventory"}, + {Network::Command::PlayerCreativeWindow, "PlayerCreativeWindow"}, + {Network::Command::PlayerChangeDimension, "PlayerChangeDimension"}, - {Network::Command::BlockUpdate, "BlockUpdate"}, - {Network::Command::BlockActivated, "BlockActivated"}, - {Network::Command::BlockGUIData, "BlockGUIData"}, - {Network::Command::BlockInvUpdate, "BlockInvUpdate"}, - {Network::Command::BlockDataUpdate, "BlockDataUpdate"}, + {Network::Command::BlockUpdate, "BlockUpdate"}, + {Network::Command::BlockActivated, "BlockActivated"}, + {Network::Command::BlockGUIData, "BlockGUIData"}, + {Network::Command::BlockInvUpdate, "BlockInvUpdate"}, + {Network::Command::BlockDataUpdate, "BlockDataUpdate"}, - {Network::Command::RegistryData, "RegistryData"}, + {Network::Command::RegistryData, "RegistryData"}, - {Network::Command::ChatMessage, "ChatMessage"} + {Network::Command::ChatMessage, "ChatMessage"} }; return commandNames[command]; } diff --git a/common/source/network/Network.hpp b/common/source/network/Network.hpp index c57e5053d..f57ec25ee 100644 --- a/common/source/network/Network.hpp +++ b/common/source/network/Network.hpp @@ -32,39 +32,40 @@ namespace Network { enum class Command { // Client commands - ClientConnect = 0, // [NetworkCommand][u16 udp port] (from Client only) - ClientDisconnect = 1, // [NetworkCommand] (from Client only) - ClientOk = 2, // [NetworkCommand][u16 client id] (from Server only) - ClientRefused = 3, // [NetworkCommand] (from Server only) + ClientConnect = 0, // [NetworkCommand][u16 udp port] (from Client only) + ClientDisconnect = 1, // [NetworkCommand] (from Client only) + ClientOk = 2, // [NetworkCommand][u16 client id] (from Server only) + ClientRefused = 3, // [NetworkCommand] (from Server only) // Input commands - KeyState = 4, // [NetworkCommand][u32 timestamp][u16 client id][u32 keycode][bool isPressed]... + KeyState = 4, // [NetworkCommand][u32 timestamp][u16 client id][u32 keycode][bool isPressed]... // Chunk commands - ChunkData = 5, // [NetworkCommand][s32 cx, cy, cz][u32...] (from Server only) - ChunkRequest = 6, // [NetworkCommand][s32 cx, cy, cz] (from Client only) + ChunkData = 5, // [NetworkCommand][s32 cx, cy, cz][u32...] (from Server only) + ChunkRequest = 6, // [NetworkCommand][s32 cx, cy, cz] (from Client only) // Player commands - PlayerPlaceBlock = 7, // [NetworkCommand][s32 x, y, z][u32 block] (from Client only) - PlayerDigBlock = 8, // [NetworkCommand][s32 x, y, z] (from Client only) - PlayerInvUpdate = 9, // [NetworkCommand][u16 client id][[std::string item][u16 amount][u8 x, y]...] (both) [FIXME] - PlayerPosUpdate = 10, // [NetworkCommand][u16 client id][s32 x, y, z][bool isTeleportation] (both) // FIXME - PlayerSpawn = 11, // [NetworkCommand][u16 client id][s32 x, y, z] (from Server only) - PlayerInventory = 12, // [NetworkCommand][u16 screenWidth, screenHeight][u8 guiScale] (from Client only) - PlayerCreativeWindow = 13, // [NetworkCommand][u16 screenWidth, screenHeight][u8 guiScale] (from Client only) + PlayerPlaceBlock = 7, // [NetworkCommand][s32 x, y, z][u32 block] (from Client only) + PlayerDigBlock = 8, // [NetworkCommand][s32 x, y, z] (from Client only) + PlayerInvUpdate = 9, // [NetworkCommand][u16 client id][[std::string item][u16 amount][u8 x, y]...] (both) [FIXME] + PlayerPosUpdate = 10, // [NetworkCommand][u16 client id][s32 x, y, z][bool isTeleportation] (both) // FIXME + PlayerSpawn = 11, // [NetworkCommand][u16 client id][s32 x, y, z] (from Server only) + PlayerInventory = 12, // [NetworkCommand][u16 screenWidth, screenHeight][u8 guiScale] (from Client only) + PlayerCreativeWindow = 13, // [NetworkCommand][u16 screenWidth, screenHeight][u8 guiScale] (from Client only) + PlayerChangeDimension = 14, // [NetworkCommand][u16 client id][s32 x, y, z][u16 dimension] (from Server only) // Block commands - BlockUpdate = 14, // [NetworkCommand][s32 x, y, z][u32 block] (from Server only) - BlockActivated = 15, // [NetworkCommand][s32 x, y, z][u16 screenWidth, screenHeight][u8 guiScale] (from Client only) - BlockGUIData = 16, // [NetworkCommand][LuaGUIData data] (from Server only) - BlockInvUpdate = 17, // [NetworkCommand][s32 x, y, z][[std::string item][u16 amount][u8 x, y]...] (both) [FIXME] - BlockDataUpdate = 18, // [NetworkCommand][s32 x, y, z][u64 data] (both) [FIXME] + BlockUpdate = 15, // [NetworkCommand][s32 x, y, z][u32 block] (from Server only) + BlockActivated = 16, // [NetworkCommand][s32 x, y, z][u16 screenWidth, screenHeight][u8 guiScale] (from Client only) + BlockGUIData = 17, // [NetworkCommand][LuaGUIData data] (from Server only) + BlockInvUpdate = 18, // [NetworkCommand][s32 x, y, z][[std::string item][u16 amount][u8 x, y]...] (both) [FIXME] + BlockDataUpdate = 19, // [NetworkCommand][s32 x, y, z][u64 data] (both) [FIXME] // Registry commands - RegistryData = 19, // [NetworkCommand][Block block] (from Server only) + RegistryData = 20, // [NetworkCommand][Block block] (from Server only) // Chat commands - ChatMessage = 20, // [NetworkCommand][u16 client id][std::string message] (both) + ChatMessage = 21, // [NetworkCommand][u16 client id][std::string message] (both) }; std::string commandToString(Command command); diff --git a/mods/default/blocks.lua b/mods/default/blocks.lua index 8319ef051..9419c4e45 100644 --- a/mods/default/blocks.lua +++ b/mods/default/blocks.lua @@ -194,3 +194,20 @@ mod:block { bounding_box = {0, 0, 0, 1, 1, 0.5} } +mod:block { + id = "portal", + name = "Portal", + tiles = "portal.png", + + -- FIXME: Use another layer for transparent blocks like this one + draw_type = "glass", + is_opaque = false, + + on_block_activated = function(pos, player, world, client, server, screen_width, screen_height, gui_scale) + local dim = (player:dimension() + 1) % 2 + + server:send_player_change_dimension(client.id, 0, 0, 20, dim, client); + player:set_dimension(dim); + end, +} + diff --git a/mods/default/furnace.lua b/mods/default/furnace.lua index ce842a72f..7520fa945 100644 --- a/mods/default/furnace.lua +++ b/mods/default/furnace.lua @@ -36,7 +36,7 @@ mod:block { world:add_block_data(pos.x, pos.y, pos.z, 3, 1) end, - on_block_activated = function(pos, player, world, client, screen_width, screen_height, gui_scale) + on_block_activated = function(pos, player, world, client, server, screen_width, screen_height, gui_scale) local gui = LuaGUI.new() gui:set_size(176, 166) @@ -155,7 +155,7 @@ mod:block { gui:show(client) end, - on_tick = function(pos, player, chunk, world) + on_tick = function(pos, chunk, world) local data = world:get_block_data(pos.x, pos.y, pos.z) if not data then return end diff --git a/mods/default/init.lua b/mods/default/init.lua index af73e3c06..8373a0d90 100644 --- a/mods/default/init.lua +++ b/mods/default/init.lua @@ -55,6 +55,7 @@ function init(player) player_inv:add_stack("default:iron_ore", 64); player_inv:add_stack("default:coal", 64); player_inv:add_stack("default:oak_slab", 64); + player_inv:add_stack("default:portal", 64); player_inv:add_stack("default:iron_ingot", 64); player_inv:add_stack("default:gold_ingot", 64); @@ -160,6 +161,7 @@ function show_creative_window(client, screen_width, screen_height, gui_scale) {"default:bricks"}, {"default:clay"}, {"default:oak_slab"}, + {"default:portal"}, -- Items {"default:stick"}, diff --git a/mods/default/textures/blocks/clay.png b/mods/default/textures/blocks/clay.png index b7589b95d33cb0077c02767999155f1b0f0da43d..558bea6aa9026506c5d7b2c738536c2cdd7392fe 100644 GIT binary patch delta 2654 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 literal 0 HcmV?d00001 diff --git a/mods/default/textures_mc/blocks/portal.png b/mods/default/textures_mc/blocks/portal.png new file mode 100644 index 0000000000000000000000000000000000000000..b74793ad0efde3d7f0639e09c9b6b48ba1d44707 GIT binary patch literal 976 zcmV;>126oEP)ffB+I(%=yZ|q6+ZMFy?))+jfx^r;zmi5 zF_upQdw~F`jjP^-}wKlJc?(UQ*>3NICj$)EqkGeQRbXv85+ z_SYUh?6(YK_|b7rmV?3E55o+yY|boeKHd2=@P-#0SRTS^B_mlz0O&Fv4o@a`cijz5ds6T901zTaTfhE7b5TS&C0{*g zG_J?1)jNAI06<7bW<^1&st{SKOO;BHvE0pV+jkM#Zk5ZaCkUjI9vw}B`8>$OF!B(( zS-Eb?87rV-G2lV4XS7-f0O_hMSEM!VE^-_%_q=;6Nd!U&t`t;N!HP@}p^S6R0l11( zl>y5W@O?rs-s@H>`+F5*wpw`U`NgRT=T0<4%n_g=(jI-?c-_z42w=4lDAtoFiHiSl9rj$;`VVEWv1BS7J6ls6G yR;NG(mQu27HX2dP*x&b8R|%|q1=dOoIR772FyY7tSzzD*0000("Player", - "inventory", &Player::inventory + "inventory", &Player::inventory, + + "dimension", &Player::dimension, + "set_dimension", &Player::setDimension ); m_lua.new_usertype("ServerPlayer", @@ -124,6 +128,14 @@ void ScriptEngine::initUsertypes() { "set_int", &BlockMetadata::setInt ); + m_lua.new_usertype("ClientInfo", + "id", &ClientInfo::id + ); + + m_lua.new_usertype("ServerCommandHandler", + "send_player_change_dimension", &ServerCommandHandler::sendPlayerChangeDimension + ); + LuaCore::initUsertype(m_lua); LuaMod::initUsertype(m_lua); LuaGUI::initUsertype(m_lua); diff --git a/server/source/network/ServerCommandHandler.cpp b/server/source/network/ServerCommandHandler.cpp index 4a4465f9d..75d5c499a 100644 --- a/server/source/network/ServerCommandHandler.cpp +++ b/server/source/network/ServerCommandHandler.cpp @@ -69,6 +69,17 @@ void ServerCommandHandler::sendPlayerPosUpdate(u16 clientID, bool isTeleportatio client->tcpSocket->send(packet); } +void ServerCommandHandler::sendPlayerChangeDimension(u16 clientID, s32 x, s32 y, s32 z, u16 dimension, const ClientInfo *client) const { + sf::Packet packet; + packet << Network::Command::PlayerChangeDimension; + packet << clientID << x << y << z << dimension; + + if (!client) + m_server.sendToAllClients(packet); + else + client->tcpSocket->send(packet); +} + void ServerCommandHandler::sendChatMessage(u16 clientID, const std::string &message, const ClientInfo *client) const { sf::Packet packet; packet << Network::Command::ChatMessage << clientID << message; @@ -209,7 +220,8 @@ void ServerCommandHandler::setupCallbacks() { ServerWorld &world = getWorldForClient(client.id); u16 id = world.getBlock(x, y, z); - ((ServerBlock &)(m_registry.getBlock(id))).onBlockActivated({x, y, z}, m_players.at(client.id), world, client, screenWidth, screenHeight, guiScale); + ServerBlock &block = (ServerBlock &)(m_registry.getBlock(id)); + block.onBlockActivated({x, y, z}, m_players.at(client.id), world, client, *this, screenWidth, screenHeight, guiScale); }); m_server.setCommandCallback(Network::Command::BlockInvUpdate, [this](ClientInfo &client, sf::Packet &packet) { diff --git a/server/source/network/ServerCommandHandler.hpp b/server/source/network/ServerCommandHandler.hpp index a417559ba..874b35c26 100644 --- a/server/source/network/ServerCommandHandler.hpp +++ b/server/source/network/ServerCommandHandler.hpp @@ -50,6 +50,7 @@ class ServerCommandHandler { void sendBlockDataUpdate(s32 x, s32 y, s32 z, const BlockData *blockData, const ClientInfo *client = nullptr) const; void sendBlockInvUpdate(s32 x, s32 y, s32 z, const Inventory &inventory, const ClientInfo *client = nullptr) const; void sendPlayerPosUpdate(u16 clientID, bool isTeleportation = false, const ClientInfo *client = nullptr) const; + void sendPlayerChangeDimension(u16 clientID, s32 x, s32 y, s32 z, u16 dimension, const ClientInfo *client = nullptr) const; void sendChatMessage(u16 clientID, const std::string &message, const ClientInfo *client = nullptr) const; void setupCallbacks(); diff --git a/server/source/world/ServerBlock.cpp b/server/source/world/ServerBlock.cpp index 81ffdc9c3..3dde31c5a 100644 --- a/server/source/world/ServerBlock.cpp +++ b/server/source/world/ServerBlock.cpp @@ -31,10 +31,10 @@ #include "ServerPlayer.hpp" #include "World.hpp" -void ServerBlock::onTick(const glm::ivec3 &pos, std::unordered_map &players, Chunk &chunk, World &world, ServerCommandHandler &server) const { +void ServerBlock::onTick(const glm::ivec3 &pos, Chunk &chunk, World &world, ServerCommandHandler &server) const { try { if (m_onTick && m_onTickEnabled) { - m_onTick(pos, players, chunk, world); + m_onTick(pos, chunk, world); BlockData *blockData = world.getBlockData(pos.x, pos.y, pos.z); if (blockData) { @@ -55,10 +55,10 @@ void ServerBlock::onTick(const glm::ivec3 &pos, std::unordered_map &, Chunk &, World &, ServerCommandHandler &) const; - bool onBlockActivated(const glm::ivec3 &pos, Player &player, World &world, ClientInfo &client, u16 screenWidth, u16 screenHeight, u8 guiScale) const; + void onTick(const glm::ivec3 &, Chunk &, World &, ServerCommandHandler &) const; + bool onBlockActivated(const glm::ivec3 &pos, Player &player, World &world, ClientInfo &client, ServerCommandHandler &server, u16 screenWidth, u16 screenHeight, u8 guiScale) const; void onBlockPlaced(const glm::ivec3 &pos, World &world) const; bool canUpdate() const { return m_onTick.valid(); } diff --git a/server/source/world/ServerChunk.cpp b/server/source/world/ServerChunk.cpp index 3959df6a5..f4c16cf24 100644 --- a/server/source/world/ServerChunk.cpp +++ b/server/source/world/ServerChunk.cpp @@ -42,15 +42,14 @@ void ServerChunk::onBlockPlaced(int x, int y, int z, const Block &block) const { serverBlock.onBlockPlaced(glm::ivec3{x + m_x * CHUNK_WIDTH, y + m_y * CHUNK_DEPTH, z + m_z * CHUNK_HEIGHT}, m_world); } -void ServerChunk::tick(std::unordered_map &players, World &world, ServerCommandHandler &server) { +void ServerChunk::tick(World &world, ServerCommandHandler &server) { if (!m_tickingBlocks.empty()) { 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( - glm::ivec3{x + m_x * width, y + m_y * depth, z + m_z * height}, - players, *this, world, server); + glm::ivec3{x + m_x * width, y + m_y * depth, z + m_z * height}, *this, world, server); } } } diff --git a/server/source/world/ServerChunk.hpp b/server/source/world/ServerChunk.hpp index aed5d6c49..a57fa0d6a 100644 --- a/server/source/world/ServerChunk.hpp +++ b/server/source/world/ServerChunk.hpp @@ -41,7 +41,7 @@ class ServerChunk : public Chunk { void updateLights(); void onBlockPlaced(int x, int y, int z, const Block &block) const; - void tick(std::unordered_map &players, World &world, ServerCommandHandler &server); + void tick(World &world, ServerCommandHandler &server); bool isSent() const { return m_isSent; } void setSent(bool isSent) { m_isSent = isSent; } diff --git a/server/source/world/ServerWorld.cpp b/server/source/world/ServerWorld.cpp index 03a6e067c..79736df7c 100644 --- a/server/source/world/ServerWorld.cpp +++ b/server/source/world/ServerWorld.cpp @@ -33,12 +33,12 @@ #include "ServerPlayer.hpp" #include "ServerWorld.hpp" -void ServerWorld::update(std::unordered_map &players) { +void ServerWorld::update() { if (m_lastTick < gk::GameClock::getTicks() / 50) { m_lastTick = gk::GameClock::getTicks() / 50; for (auto &it : m_chunks) { - it.second->tick(players, *this, *m_server); + it.second->tick(*this, *m_server); if (it.second->areAllNeighboursLoaded()) it.second->updateLights(); diff --git a/server/source/world/ServerWorld.hpp b/server/source/world/ServerWorld.hpp index 46886c356..168a46bff 100644 --- a/server/source/world/ServerWorld.hpp +++ b/server/source/world/ServerWorld.hpp @@ -44,7 +44,7 @@ class ServerWorld : public World { public: ServerWorld(const Dimension &dimension) : m_dimension(dimension) {} - void update(std::unordered_map &players); + void update(); void createChunkNeighbours(ServerChunk *chunk); void sendChunkData(const ClientInfo &client, ServerChunk *chunk); diff --git a/server/source/world/WorldController.cpp b/server/source/world/WorldController.cpp index 69d08db0d..637f50a77 100644 --- a/server/source/world/WorldController.cpp +++ b/server/source/world/WorldController.cpp @@ -34,8 +34,8 @@ void WorldController::init() { } } -void WorldController::update(std::unordered_map &players) { +void WorldController::update() { for (auto &it : m_worldList) - it.update(players); + it.update(); } diff --git a/server/source/world/WorldController.hpp b/server/source/world/WorldController.hpp index 08ba5af9e..468337dc1 100644 --- a/server/source/world/WorldController.hpp +++ b/server/source/world/WorldController.hpp @@ -40,7 +40,7 @@ class WorldController { void init(); - void update(std::unordered_map &players); + void update(); ServerWorld &getWorld(u16 dimension) { return m_worldList.at(dimension); }