From 76afde861de0afa4c69020b16cf52b023ac88de5 Mon Sep 17 00:00:00 2001 From: Maksim Date: Tue, 21 Jul 2020 14:16:25 +0200 Subject: [PATCH 001/177] Android: Fix ConfirmRegistration and PasswordChange input and scale size (#10182) --- src/gui/guiConfirmRegistration.cpp | 19 +++++++++++++++---- src/gui/guiPasswordChange.cpp | 19 ++++++++++++++----- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/gui/guiConfirmRegistration.cpp b/src/gui/guiConfirmRegistration.cpp index 55c111df8..020a2796a 100644 --- a/src/gui/guiConfirmRegistration.cpp +++ b/src/gui/guiConfirmRegistration.cpp @@ -73,7 +73,11 @@ void GUIConfirmRegistration::regenerateGui(v2u32 screensize) /* Calculate new sizes and positions */ +#ifdef __ANDROID__ + const float s = m_gui_scale * porting::getDisplayDensity() / 2; +#else const float s = m_gui_scale; +#endif DesiredRect = core::rect( screensize.X / 2 - 600 * s / 2, screensize.Y / 2 - 360 * s / 2, @@ -257,12 +261,19 @@ bool GUIConfirmRegistration::getAndroidUIInput() if (!hasAndroidUIInput() || m_jni_field_name != "password") return false; - std::string text = porting::getInputDialogValue(); - gui::IGUIElement *e = getElementFromId(ID_confirmPassword); - if (e) - e->setText(utf8_to_wide(text).c_str()); + // still waiting + if (porting::getInputDialogState() == -1) + return true; m_jni_field_name.clear(); + + gui::IGUIElement *e = getElementFromId(ID_confirmPassword); + + if (!e || e->getType() != irr::gui::EGUIET_EDIT_BOX) + return false; + + std::string text = porting::getInputDialogValue(); + e->setText(utf8_to_wide(text).c_str()); return false; } #endif diff --git a/src/gui/guiPasswordChange.cpp b/src/gui/guiPasswordChange.cpp index 5311c6fef..74cd62f5b 100644 --- a/src/gui/guiPasswordChange.cpp +++ b/src/gui/guiPasswordChange.cpp @@ -79,7 +79,11 @@ void GUIPasswordChange::regenerateGui(v2u32 screensize) /* Calculate new sizes and positions */ +#ifdef __ANDROID__ + const float s = m_gui_scale * porting::getDisplayDensity() / 2; +#else const float s = m_gui_scale; +#endif DesiredRect = core::rect( screensize.X / 2 - 580 * s / 2, screensize.Y / 2 - 300 * s / 2, @@ -289,6 +293,10 @@ bool GUIPasswordChange::getAndroidUIInput() if (!hasAndroidUIInput()) return false; + // still waiting + if (porting::getInputDialogState() == -1) + return true; + gui::IGUIElement *e = nullptr; if (m_jni_field_name == "old_password") e = getElementFromId(ID_oldPassword); @@ -296,12 +304,13 @@ bool GUIPasswordChange::getAndroidUIInput() e = getElementFromId(ID_newPassword1); else if (m_jni_field_name == "new_password_2") e = getElementFromId(ID_newPassword2); - - if (e) { - std::string text = porting::getInputDialogValue(); - e->setText(utf8_to_wide(text).c_str()); - } m_jni_field_name.clear(); + + if (!e || e->getType() != irr::gui::EGUIET_EDIT_BOX) + return false; + + std::string text = porting::getInputDialogValue(); + e->setText(utf8_to_wide(text).c_str()); return false; } #endif From 8ca602150d4fdce6dcc63fa13e22aeaac5b927cc Mon Sep 17 00:00:00 2001 From: sfan5 Date: Thu, 23 Jul 2020 19:47:58 +0200 Subject: [PATCH 002/177] Replace std::list in networking code (#10215) --- src/network/connection.cpp | 3 ++- src/network/connection.h | 6 +++--- src/network/connectionthreads.cpp | 26 ++++++++++++-------------- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/network/connection.cpp b/src/network/connection.cpp index 3692e45a9..1875d1461 100644 --- a/src/network/connection.cpp +++ b/src/network/connection.cpp @@ -1269,7 +1269,8 @@ bool Connection::deletePeer(session_t peer_id, bool timeout) return false; peer = m_peers[peer_id]; m_peers.erase(peer_id); - m_peer_ids.remove(peer_id); + auto it = std::find(m_peer_ids.begin(), m_peer_ids.end(), peer_id); + m_peer_ids.erase(it); } Address peer_address; diff --git a/src/network/connection.h b/src/network/connection.h index 47b0805ce..2dc6d4397 100644 --- a/src/network/connection.h +++ b/src/network/connection.h @@ -30,7 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "networkprotocol.h" #include #include -#include +#include #include class NetworkPacket; @@ -795,7 +795,7 @@ protected: void PrintInfo(std::ostream &out); - std::list getPeerIDs() + std::vector getPeerIDs() { MutexAutoLock peerlock(m_peers_mutex); return m_peer_ids; @@ -816,7 +816,7 @@ private: u32 m_protocol_id; std::map m_peers; - std::list m_peer_ids; + std::vector m_peer_ids; std::mutex m_peers_mutex; std::unique_ptr m_sendThread; diff --git a/src/network/connectionthreads.cpp b/src/network/connectionthreads.cpp index 9a6617a1c..28ed798d9 100644 --- a/src/network/connectionthreads.cpp +++ b/src/network/connectionthreads.cpp @@ -144,7 +144,7 @@ void ConnectionSendThread::Trigger() bool ConnectionSendThread::packetsQueued() { - std::list peerIds = m_connection->getPeerIDs(); + std::vector peerIds = m_connection->getPeerIDs(); if (!m_outgoing_queue.empty() && !peerIds.empty()) return true; @@ -171,8 +171,8 @@ bool ConnectionSendThread::packetsQueued() void ConnectionSendThread::runTimeouts(float dtime) { - std::list timeouted_peers; - std::list peerIds = m_connection->getPeerIDs(); + std::vector timeouted_peers; + std::vector peerIds = m_connection->getPeerIDs(); for (session_t &peerId : peerIds) { PeerHelper peer = m_connection->getPeerNoEx(peerId); @@ -548,7 +548,7 @@ void ConnectionSendThread::disconnect() // Send to all - std::list peerids = m_connection->getPeerIDs(); + std::vector peerids = m_connection->getPeerIDs(); for (session_t peerid : peerids) { sendAsPacket(peerid, 0, data, false); @@ -620,7 +620,7 @@ void ConnectionSendThread::sendReliable(ConnectionCommand &c) void ConnectionSendThread::sendToAll(u8 channelnum, const SharedBuffer &data) { - std::list peerids = m_connection->getPeerIDs(); + std::vector peerids = m_connection->getPeerIDs(); for (session_t peerid : peerids) { send(peerid, channelnum, data); @@ -629,7 +629,7 @@ void ConnectionSendThread::sendToAll(u8 channelnum, const SharedBuffer &data void ConnectionSendThread::sendToAllReliable(ConnectionCommand &c) { - std::list peerids = m_connection->getPeerIDs(); + std::vector peerids = m_connection->getPeerIDs(); for (session_t peerid : peerids) { PeerHelper peer = m_connection->getPeerNoEx(peerid); @@ -643,8 +643,8 @@ void ConnectionSendThread::sendToAllReliable(ConnectionCommand &c) void ConnectionSendThread::sendPackets(float dtime) { - std::list peerIds = m_connection->getPeerIDs(); - std::list pendingDisconnect; + std::vector peerIds = m_connection->getPeerIDs(); + std::vector pendingDisconnect; std::map pending_unreliable; const unsigned int peer_packet_quota = m_iteration_packets_avaialble @@ -843,13 +843,11 @@ void *ConnectionReceiveThread::run() if (debug_print_timer > 20.0) { debug_print_timer -= 20.0; - std::list peerids = m_connection->getPeerIDs(); + std::vector peerids = m_connection->getPeerIDs(); - for (std::list::iterator i = peerids.begin(); - i != peerids.end(); - i++) + for (auto id : peerids) { - PeerHelper peer = m_connection->getPeerNoEx(*i); + PeerHelper peer = m_connection->getPeerNoEx(id); if (!peer) continue; @@ -1039,7 +1037,7 @@ void ConnectionReceiveThread::receive(SharedBuffer &packetdata, bool ConnectionReceiveThread::getFromBuffers(session_t &peer_id, SharedBuffer &dst) { - std::list peerids = m_connection->getPeerIDs(); + std::vector peerids = m_connection->getPeerIDs(); for (session_t peerid : peerids) { PeerHelper peer = m_connection->getPeerNoEx(peerid); From 808fa5ecb3ddfd5d993000cc6b4c972257e182db Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 23 Jul 2020 19:54:58 +0200 Subject: [PATCH 003/177] Improve default inventory+wield images of node drawtypes (#9299) --- doc/texture_packs.txt | 1 + src/client/content_mapblock.cpp | 4 +- src/client/content_mapblock.h | 2 +- src/client/wieldmesh.cpp | 207 +++++++++++----------- src/nodedef.h | 16 ++ textures/base/pack/no_texture_airlike.png | Bin 0 -> 178 bytes 6 files changed, 126 insertions(+), 104 deletions(-) create mode 100644 textures/base/pack/no_texture_airlike.png diff --git a/doc/texture_packs.txt b/doc/texture_packs.txt index e7a7dfd3c..79d65a339 100644 --- a/doc/texture_packs.txt +++ b/doc/texture_packs.txt @@ -90,6 +90,7 @@ by texture packs. All existing fallback textures can be found in the directory * `minimap_mask_square.png`: mask used for the square minimap * `minimap_overlay_round.png`: overlay texture for the round minimap * `minimap_overlay_square.png`: overlay texture for the square minimap +* `no_texture_airlike.png`: fallback inventory image for airlike nodes * `object_marker_red.png`: texture for players on the minimap * `player_marker.png`: texture for the own player on the square minimap diff --git a/src/client/content_mapblock.cpp b/src/client/content_mapblock.cpp index 3d06584c4..65a85709b 100644 --- a/src/client/content_mapblock.cpp +++ b/src/client/content_mapblock.cpp @@ -1454,10 +1454,10 @@ void MapblockMeshGenerator::generate() } } -void MapblockMeshGenerator::renderSingle(content_t node) +void MapblockMeshGenerator::renderSingle(content_t node, u8 param2) { p = {0, 0, 0}; - n = MapNode(node, 0xff, 0x00); + n = MapNode(node, 0xff, param2); f = &nodedef->get(n); drawNode(); } diff --git a/src/client/content_mapblock.h b/src/client/content_mapblock.h index 97947cdbe..487d84a07 100644 --- a/src/client/content_mapblock.h +++ b/src/client/content_mapblock.h @@ -174,5 +174,5 @@ public: public: MapblockMeshGenerator(MeshMakeData *input, MeshCollector *output); void generate(); - void renderSingle(content_t node); + void renderSingle(content_t node, u8 param2 = 0x00); }; diff --git a/src/client/wieldmesh.cpp b/src/client/wieldmesh.cpp index 8cd3e29a9..a268895ed 100644 --- a/src/client/wieldmesh.cpp +++ b/src/client/wieldmesh.cpp @@ -303,13 +303,24 @@ void WieldMeshSceneNode::setExtruded(const std::string &imagename, } } -scene::SMesh *createSpecialNodeMesh(Client *client, content_t id, std::vector *colors) +scene::SMesh *createSpecialNodeMesh(Client *client, content_t id, std::vector *colors, const ContentFeatures &f) { MeshMakeData mesh_make_data(client, false, false); MeshCollector collector; mesh_make_data.setSmoothLighting(false); MapblockMeshGenerator gen(&mesh_make_data, &collector); - gen.renderSingle(id); + u8 param2 = 0; + if (f.param_type_2 == CPT2_WALLMOUNTED || + f.param_type_2 == CPT2_COLORED_WALLMOUNTED) { + if (f.drawtype == NDT_TORCHLIKE) + param2 = 1; + else if (f.drawtype == NDT_SIGNLIKE || + f.drawtype == NDT_NODEBOX || + f.drawtype == NDT_MESH) + param2 = 4; + } + gen.renderSingle(id, param2); + colors->clear(); scene::SMesh *mesh = new scene::SMesh(); for (auto &prebuffers : collector.prebuffers) @@ -319,8 +330,9 @@ scene::SMesh *createSpecialNodeMesh(Client *client, content_t id, std::vectorMaterial.setTexture(0, p.layer.texture); p.layer.applyMaterialOptions(buf->Material); @@ -368,73 +380,61 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client, bool che // Handle nodes // See also CItemDefManager::createClientCached() if (def.type == ITEM_NODE) { - if (f.mesh_ptr[0]) { - // e.g. mesh nodes and nodeboxes - mesh = cloneMesh(f.mesh_ptr[0]); - postProcessNodeMesh(mesh, f, m_enable_shaders, true, - &m_material_type, &m_colors); + bool cull_backface = f.needsBackfaceCulling(); + + // Select rendering method + switch (f.drawtype) { + case NDT_AIRLIKE: + setExtruded("no_texture_airlike.png", "", + v3f(1.0, 1.0, 1.0), tsrc, 1); + break; + case NDT_SIGNLIKE: + case NDT_TORCHLIKE: + case NDT_RAILLIKE: + case NDT_PLANTLIKE: + case NDT_PLANTLIKE_ROOTED: + case NDT_FLOWINGLIQUID: { + v3f wscale = def.wield_scale; + if (f.drawtype == NDT_FLOWINGLIQUID) + wscale.Z *= 0.1f; + setExtruded(tsrc->getTextureName(f.tiles[0].layers[0].texture_id), + tsrc->getTextureName(f.tiles[0].layers[1].texture_id), + wscale, tsrc, + f.tiles[0].layers[0].animation_frame_count); + // Add color + const TileLayer &l0 = f.tiles[0].layers[0]; + m_colors.emplace_back(l0.has_color, l0.color); + const TileLayer &l1 = f.tiles[0].layers[1]; + m_colors.emplace_back(l1.has_color, l1.color); + break; + } + case NDT_NORMAL: + case NDT_ALLFACES: + case NDT_LIQUID: + setCube(f, def.wield_scale); + break; + default: + // Render non-trivial drawtypes like the actual node + mesh = createSpecialNodeMesh(client, id, &m_colors, f); changeToMesh(mesh); mesh->drop(); - // mesh is pre-scaled by BS * f->visual_scale m_meshnode->setScale( - def.wield_scale * WIELD_SCALE_FACTOR - / (BS * f.visual_scale)); - } else { - switch (f.drawtype) { - case NDT_AIRLIKE: { - changeToMesh(nullptr); - break; - } - case NDT_PLANTLIKE: { - setExtruded(tsrc->getTextureName(f.tiles[0].layers[0].texture_id), - tsrc->getTextureName(f.tiles[0].layers[1].texture_id), - def.wield_scale, tsrc, - f.tiles[0].layers[0].animation_frame_count); - // Add color - const TileLayer &l0 = f.tiles[0].layers[0]; - m_colors.emplace_back(l0.has_color, l0.color); - const TileLayer &l1 = f.tiles[0].layers[1]; - m_colors.emplace_back(l1.has_color, l1.color); - break; - } - case NDT_PLANTLIKE_ROOTED: { - setExtruded(tsrc->getTextureName(f.special_tiles[0].layers[0].texture_id), - "", def.wield_scale, tsrc, - f.special_tiles[0].layers[0].animation_frame_count); - // Add color - const TileLayer &l0 = f.special_tiles[0].layers[0]; - m_colors.emplace_back(l0.has_color, l0.color); - break; - } - case NDT_NORMAL: - case NDT_ALLFACES: - case NDT_LIQUID: - case NDT_FLOWINGLIQUID: { - setCube(f, def.wield_scale); - break; - } - default: { - mesh = createSpecialNodeMesh(client, id, &m_colors); - changeToMesh(mesh); - mesh->drop(); - m_meshnode->setScale( - def.wield_scale * WIELD_SCALE_FACTOR - / (BS * f.visual_scale)); - } - } + def.wield_scale * WIELD_SCALE_FACTOR + / (BS * f.visual_scale)); + break; } + u32 material_count = m_meshnode->getMaterialCount(); for (u32 i = 0; i < material_count; ++i) { video::SMaterial &material = m_meshnode->getMaterial(i); material.MaterialType = m_material_type; material.MaterialTypeParam = 0.5f; - material.setFlag(video::EMF_BACK_FACE_CULLING, true); + material.setFlag(video::EMF_BACK_FACE_CULLING, cull_backface); material.setFlag(video::EMF_BILINEAR_FILTER, m_bilinear_filter); material.setFlag(video::EMF_TRILINEAR_FILTER, m_trilinear_filter); } return; - } - else if (!def.inventory_image.empty()) { + } else if (!def.inventory_image.empty()) { setExtruded(def.inventory_image, def.inventory_overlay, def.wield_scale, tsrc, 1); m_colors.emplace_back(); @@ -529,6 +529,8 @@ void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result) // Shading is on by default result->needs_shading = true; + bool cull_backface = f.needsBackfaceCulling(); + // If inventory_image is defined, it overrides everything else if (!def.inventory_image.empty()) { mesh = getExtrudedMesh(tsrc, def.inventory_image, @@ -538,51 +540,54 @@ void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result) result->buffer_colors.emplace_back(true, video::SColor(0xFFFFFFFF)); // Items with inventory images do not need shading result->needs_shading = false; + } else if (def.type == ITEM_NODE && f.drawtype == NDT_AIRLIKE) { + // Fallback image for airlike node + mesh = getExtrudedMesh(tsrc, "no_texture_airlike.png", + def.inventory_overlay); + result->needs_shading = false; } else if (def.type == ITEM_NODE) { - if (f.mesh_ptr[0]) { - mesh = cloneMesh(f.mesh_ptr[0]); - scaleMesh(mesh, v3f(0.12, 0.12, 0.12)); + switch (f.drawtype) { + case NDT_NORMAL: + case NDT_ALLFACES: + case NDT_LIQUID: + case NDT_FLOWINGLIQUID: { + scene::IMesh *cube = g_extrusion_mesh_cache->createCube(); + mesh = cloneMesh(cube); + cube->drop(); + if (f.drawtype == NDT_FLOWINGLIQUID) { + scaleMesh(mesh, v3f(1.2, 0.03, 1.2)); + translateMesh(mesh, v3f(0, -0.57, 0)); + } else + scaleMesh(mesh, v3f(1.2, 1.2, 1.2)); + // add overlays postProcessNodeMesh(mesh, f, false, false, nullptr, - &result->buffer_colors); - } else { - switch (f.drawtype) { - case NDT_PLANTLIKE: { - mesh = getExtrudedMesh(tsrc, - tsrc->getTextureName(f.tiles[0].layers[0].texture_id), - tsrc->getTextureName(f.tiles[0].layers[1].texture_id)); - // Add color - const TileLayer &l0 = f.tiles[0].layers[0]; - result->buffer_colors.emplace_back(l0.has_color, l0.color); - const TileLayer &l1 = f.tiles[0].layers[1]; - result->buffer_colors.emplace_back(l1.has_color, l1.color); - break; - } - case NDT_PLANTLIKE_ROOTED: { - mesh = getExtrudedMesh(tsrc, - tsrc->getTextureName(f.special_tiles[0].layers[0].texture_id), ""); - // Add color - const TileLayer &l0 = f.special_tiles[0].layers[0]; - result->buffer_colors.emplace_back(l0.has_color, l0.color); - break; - } - case NDT_NORMAL: - case NDT_ALLFACES: - case NDT_LIQUID: - case NDT_FLOWINGLIQUID: { - scene::IMesh *cube = g_extrusion_mesh_cache->createCube(); - mesh = cloneMesh(cube); - cube->drop(); - scaleMesh(mesh, v3f(1.2, 1.2, 1.2)); - // add overlays - postProcessNodeMesh(mesh, f, false, false, nullptr, - &result->buffer_colors); - break; - } - default: { - mesh = createSpecialNodeMesh(client, id, &result->buffer_colors); - scaleMesh(mesh, v3f(0.12, 0.12, 0.12)); - } - } + &result->buffer_colors, true); + break; + } + case NDT_PLANTLIKE: { + mesh = getExtrudedMesh(tsrc, + tsrc->getTextureName(f.tiles[0].layers[0].texture_id), + tsrc->getTextureName(f.tiles[0].layers[1].texture_id)); + // Add color + const TileLayer &l0 = f.tiles[0].layers[0]; + result->buffer_colors.emplace_back(l0.has_color, l0.color); + const TileLayer &l1 = f.tiles[0].layers[1]; + result->buffer_colors.emplace_back(l1.has_color, l1.color); + break; + } + case NDT_PLANTLIKE_ROOTED: { + mesh = getExtrudedMesh(tsrc, + tsrc->getTextureName(f.special_tiles[0].layers[0].texture_id), ""); + // Add color + const TileLayer &l0 = f.special_tiles[0].layers[0]; + result->buffer_colors.emplace_back(l0.has_color, l0.color); + break; + } + default: + // Render non-trivial drawtypes like the actual node + mesh = createSpecialNodeMesh(client, id, &result->buffer_colors, f); + scaleMesh(mesh, v3f(0.12, 0.12, 0.12)); + break; } u32 mc = mesh->getMeshBufferCount(); @@ -593,7 +598,7 @@ void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result) material.MaterialTypeParam = 0.5f; material.setFlag(video::EMF_BILINEAR_FILTER, false); material.setFlag(video::EMF_TRILINEAR_FILTER, false); - material.setFlag(video::EMF_BACK_FACE_CULLING, true); + material.setFlag(video::EMF_BACK_FACE_CULLING, cull_backface); material.setFlag(video::EMF_LIGHTING, false); } diff --git a/src/nodedef.h b/src/nodedef.h index cf03abaae..ff52f976f 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -425,6 +425,22 @@ struct ContentFeatures /* Some handy methods */ + bool needsBackfaceCulling() const + { + switch (drawtype) { + case NDT_TORCHLIKE: + case NDT_SIGNLIKE: + case NDT_FIRELIKE: + case NDT_RAILLIKE: + case NDT_PLANTLIKE: + case NDT_PLANTLIKE_ROOTED: + case NDT_MESH: + return false; + default: + return true; + } + } + bool isLiquid() const{ return (liquid_type != LIQUID_NONE); } diff --git a/textures/base/pack/no_texture_airlike.png b/textures/base/pack/no_texture_airlike.png new file mode 100644 index 0000000000000000000000000000000000000000..634ee8ca552b07a2b0bc7ecdc1848a480175a18d GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar*{sC$aJ!FyJ}z>A$$Y ziJG@KD|_m7*4uAta_96tZl18^Z{qXgHB#yR4(m!b3OF&d&S{>hKRdx8K>R&px(#!~ zffVN*)lDX*2N(>wuJ_GkZK^V5aA^3+`Qw*K5|_7xi*(0th1?{8yI$Km8~HCrZtdM| b=~G@PGsEDqVDx&RBN#kg{an^LB{Ts5xq&{0 literal 0 HcmV?d00001 From ae83edd16581b2b5426b565e703a8766e88dbbf6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 27 Jul 2020 19:40:33 +0200 Subject: [PATCH 004/177] Play place_failed sound if occupied or cannot attach (#9486) --- doc/lua_api.txt | 7 +++++-- src/client/game.cpp | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index e0c895c97..5fe02b452 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -7217,10 +7217,13 @@ Used by `minetest.register_node`. -- Node was placed. Also played after falling place_failed = , - -- When node placement failed + -- When node placement failed. + -- Note: This happens if the _built-in_ node placement failed. + -- This sound will still be played if the node is placed in the + -- `on_place` callback manually. fall = , - -- When node starts to fall + -- When node starts to fall or is detached }, drop = "", diff --git a/src/client/game.cpp b/src/client/game.cpp index 42d60b21c..20d2c6f90 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -3379,6 +3379,7 @@ bool Game::nodePlacement(const ItemDefinition &selected_def, } else { node = map.getNode(p, &is_valid_position); if (is_valid_position && !nodedef->get(node).buildable_to) { + soundmaker->m_player_rightpunch_sound = selected_def.sound_place_failed; // Report to server client->interact(INTERACT_PLACE, pointed); return false; @@ -3451,6 +3452,7 @@ bool Game::nodePlacement(const ItemDefinition &selected_def, pp = p + v3s16(0, -1, 0); if (!nodedef->get(map.getNode(pp)).walkable) { + soundmaker->m_player_rightpunch_sound = selected_def.sound_place_failed; // Report to server client->interact(INTERACT_PLACE, pointed); return false; From f948e2c58570df6bc77226b6066fec5ed90051ee Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Tue, 28 Jul 2020 17:01:52 +0100 Subject: [PATCH 005/177] Fix incorrect view URL for games package.id is a sanitised combination of author and basename, used to compare remote and local content. Minetest ignores `_game` when comparing game names, so package.id has `_game` removed. This meant that the wrong URL was being generated for View. --- builtin/mainmenu/dlg_contentstore.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/builtin/mainmenu/dlg_contentstore.lua b/builtin/mainmenu/dlg_contentstore.lua index 01c42be0b..37ceeb6c8 100644 --- a/builtin/mainmenu/dlg_contentstore.lua +++ b/builtin/mainmenu/dlg_contentstore.lua @@ -505,8 +505,9 @@ function store.handle_submit(this, fields) end if fields["view_" .. i] then - local url = ("%s/packages/%s?protocol_version=%d"):format( - core.settings:get("contentdb_url"), package.id, core.get_max_supp_proto()) + local url = ("%s/packages/%s/%s?protocol_version=%d"):format( + core.settings:get("contentdb_url"), + package.author, package.name, core.get_max_supp_proto()) core.open_url(url) return true end From 3ce03d1c2a63d261c83f5962cd13212697f19472 Mon Sep 17 00:00:00 2001 From: Hugues Ross Date: Tue, 28 Jul 2020 13:16:57 -0400 Subject: [PATCH 006/177] Sanitize world directory names on create. Keep original name separate (#9432) Blacklisted characters are replaced by '_' in the path. The display name is stored in world.mt, and duplicate file names are resolved by adding an incrementing suffix (_1, _2, _3, etc). --- src/content/subgames.cpp | 54 +++++++++++++++++++----- src/content/subgames.h | 5 ++- src/script/lua_api/l_mainmenu.cpp | 9 ++-- src/server.cpp | 9 +++- src/util/string.cpp | 68 +++++++++++++++++++++++++++++++ src/util/string.h | 8 ++++ 6 files changed, 136 insertions(+), 17 deletions(-) diff --git a/src/content/subgames.cpp b/src/content/subgames.cpp index 170f54e20..695ba431f 100644 --- a/src/content/subgames.cpp +++ b/src/content/subgames.cpp @@ -31,6 +31,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "client/tile.h" // getImagePath #endif +// The maximum number of identical world names allowed +#define MAX_WORLD_NAMES 100 + bool getGameMinetestConfig(const std::string &game_path, Settings &conf) { std::string conf_path = game_path + DIR_DELIM + "minetest.conf"; @@ -213,6 +216,21 @@ bool getWorldExists(const std::string &world_path) fs::PathExists(world_path + DIR_DELIM + "world.mt")); } +//! Try to get the displayed name of a world +std::string getWorldName(const std::string &world_path, const std::string &default_name) +{ + std::string conf_path = world_path + DIR_DELIM + "world.mt"; + Settings conf; + bool succeeded = conf.readConfigFile(conf_path.c_str()); + if (!succeeded) { + return default_name; + } + + if (!conf.exists("world_name")) + return default_name; + return conf.get("world_name"); +} + std::string getWorldGameId(const std::string &world_path, bool can_be_legacy) { std::string conf_path = world_path + DIR_DELIM + "world.mt"; @@ -259,7 +277,7 @@ std::vector getAvailableWorlds() if (!dln.dir) continue; std::string fullpath = worldspath + DIR_DELIM + dln.name; - std::string name = dln.name; + std::string name = getWorldName(fullpath, dln.name); // Just allow filling in the gameid always for now bool can_be_legacy = true; std::string gameid = getWorldGameId(fullpath, can_be_legacy); @@ -288,8 +306,24 @@ std::vector getAvailableWorlds() return worlds; } -bool loadGameConfAndInitWorld(const std::string &path, const SubgameSpec &gamespec) +void loadGameConfAndInitWorld(const std::string &path, const std::string &name, + const SubgameSpec &gamespec, bool create_world) { + std::string final_path = path; + + // If we're creating a new world, ensure that the path isn't already taken + if (create_world) { + int counter = 1; + while (fs::PathExists(final_path) && counter < MAX_WORLD_NAMES) { + final_path = path + "_" + std::to_string(counter); + counter++; + } + + if (fs::PathExists(final_path)) { + throw BaseException("Too many similar filenames"); + } + } + // Override defaults with those provided by the game. // We clear and reload the defaults because the defaults // might have been overridden by other subgame config @@ -300,15 +334,16 @@ bool loadGameConfAndInitWorld(const std::string &path, const SubgameSpec &gamesp getGameMinetestConfig(gamespec.path, game_defaults); g_settings->overrideDefaults(&game_defaults); - infostream << "Initializing world at " << path << std::endl; + infostream << "Initializing world at " << final_path << std::endl; - fs::CreateAllDirs(path); + fs::CreateAllDirs(final_path); // Create world.mt if does not already exist - std::string worldmt_path = path + DIR_DELIM "world.mt"; + std::string worldmt_path = final_path + DIR_DELIM "world.mt"; if (!fs::PathExists(worldmt_path)) { Settings conf; + conf.set("world_name", name); conf.set("gameid", gamespec.id); conf.set("backend", "sqlite3"); conf.set("player_backend", "sqlite3"); @@ -316,16 +351,16 @@ bool loadGameConfAndInitWorld(const std::string &path, const SubgameSpec &gamesp conf.setBool("creative_mode", g_settings->getBool("creative_mode")); conf.setBool("enable_damage", g_settings->getBool("enable_damage")); - if (!conf.updateConfigFile(worldmt_path.c_str())) - return false; + if (!conf.updateConfigFile(worldmt_path.c_str())) { + throw BaseException("Failed to update the config file"); + } } // Create map_meta.txt if does not already exist - std::string map_meta_path = path + DIR_DELIM + "map_meta.txt"; + std::string map_meta_path = final_path + DIR_DELIM + "map_meta.txt"; if (!fs::PathExists(map_meta_path)) { verbosestream << "Creating map_meta.txt (" << map_meta_path << ")" << std::endl; - fs::CreateAllDirs(path); std::ostringstream oss(std::ios_base::binary); Settings conf; @@ -338,5 +373,4 @@ bool loadGameConfAndInitWorld(const std::string &path, const SubgameSpec &gamesp fs::safeWriteToFile(map_meta_path, oss.str()); } - return true; } diff --git a/src/content/subgames.h b/src/content/subgames.h index 4198ea860..35b619aaf 100644 --- a/src/content/subgames.h +++ b/src/content/subgames.h @@ -63,6 +63,8 @@ std::set getAvailableGameIds(); std::vector getAvailableGames(); bool getWorldExists(const std::string &world_path); +//! Try to get the displayed name of a world +std::string getWorldName(const std::string &world_path, const std::string &default_name); std::string getWorldGameId(const std::string &world_path, bool can_be_legacy = false); struct WorldSpec @@ -88,4 +90,5 @@ std::vector getAvailableWorlds(); // loads the subgame's config and creates world directory // and world.mt if they don't exist -bool loadGameConfAndInitWorld(const std::string &path, const SubgameSpec &gamespec); +void loadGameConfAndInitWorld(const std::string &path, const std::string &name, + const SubgameSpec &gamespec, bool create_world); diff --git a/src/script/lua_api/l_mainmenu.cpp b/src/script/lua_api/l_mainmenu.cpp index f32c477c2..e49ec4052 100644 --- a/src/script/lua_api/l_mainmenu.cpp +++ b/src/script/lua_api/l_mainmenu.cpp @@ -618,7 +618,7 @@ int ModApiMainMenu::l_create_world(lua_State *L) std::string path = porting::path_user + DIR_DELIM "worlds" + DIR_DELIM - + name; + + sanitizeDirName(name, "world_"); std::vector games = getAvailableGames(); @@ -626,10 +626,11 @@ int ModApiMainMenu::l_create_world(lua_State *L) (gameidx < (int) games.size())) { // Create world if it doesn't exist - if (!loadGameConfAndInitWorld(path, games[gameidx])) { - lua_pushstring(L, "Failed to initialize world"); - } else { + try { + loadGameConfAndInitWorld(path, name, games[gameidx], true); lua_pushnil(L); + } catch (const BaseException &e) { + lua_pushstring(L, (std::string("Failed to initialize world: ") + e.what()).c_str()); } } else { lua_pushstring(L, "Invalid game index"); diff --git a/src/server.cpp b/src/server.cpp index fe2bb3840..53ee8c444 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -356,8 +356,13 @@ void Server::init() infostream << "- game: " << m_gamespec.path << std::endl; // Create world if it doesn't exist - if (!loadGameConfAndInitWorld(m_path_world, m_gamespec)) - throw ServerError("Failed to initialize world"); + try { + loadGameConfAndInitWorld(m_path_world, + fs::GetFilenameFromPath(m_path_world.c_str()), + m_gamespec, false); + } catch (const BaseException &e) { + throw ServerError(std::string("Failed to initialize world: ") + e.what()); + } // Create emerge manager m_emerge = new EmergeManager(this); diff --git a/src/util/string.cpp b/src/util/string.cpp index 6e1db798c..8381a29c5 100644 --- a/src/util/string.cpp +++ b/src/util/string.cpp @@ -27,6 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "translation.h" #include +#include #include #include #include @@ -889,3 +890,70 @@ std::wstring translate_string(const std::wstring &s) return translate_string(s, g_client_translations); #endif } + +static const std::array disallowed_dir_names = { + // Problematic filenames from here: + // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#file-and-directory-names + L"CON", + L"PRN", + L"AUX", + L"NUL", + L"COM1", + L"COM2", + L"COM3", + L"COM4", + L"COM5", + L"COM6", + L"COM7", + L"COM8", + L"COM9", + L"LPT1", + L"LPT2", + L"LPT3", + L"LPT4", + L"LPT5", + L"LPT6", + L"LPT7", + L"LPT8", + L"LPT9", +}; + +/** + * List of characters that are blacklisted from created directories + */ +static const std::wstring disallowed_path_chars = L"<>:\"/\\|?*."; + +/** + * Sanitize the name of a new directory. This consists of two stages: + * 1. Check for 'reserved filenames' that can't be used on some filesystems + * and add a prefix to them + * 2. Remove 'unsafe' characters from the name by replacing them with '_' + */ +std::string sanitizeDirName(const std::string &str, const std::string &optional_prefix) +{ + std::wstring safe_name = utf8_to_wide(str); + + for (std::wstring disallowed_name : disallowed_dir_names) { + if (str_equal(safe_name, disallowed_name, true)) { + safe_name = utf8_to_wide(optional_prefix) + safe_name; + break; + } + } + + for (unsigned long i = 0; i < safe_name.length(); i++) { + bool is_valid = true; + + // Unlikely, but control characters should always be blacklisted + if (safe_name[i] < 32) { + is_valid = false; + } else if (safe_name[i] < 128) { + is_valid = disallowed_path_chars.find_first_of(safe_name[i]) + == std::wstring::npos; + } + + if (!is_valid) + safe_name[i] = '_'; + } + + return wide_to_utf8(safe_name); +} diff --git a/src/util/string.h b/src/util/string.h index 185fb55e2..6fd11fadc 100644 --- a/src/util/string.h +++ b/src/util/string.h @@ -746,3 +746,11 @@ inline irr::core::stringw utf8_to_stringw(const std::string &input) std::wstring str = utf8_to_wide(input); return irr::core::stringw(str.c_str()); } + +/** + * Sanitize the name of a new directory. This consists of two stages: + * 1. Check for 'reserved filenames' that can't be used on some filesystems + * and prefix them + * 2. Remove 'unsafe' characters from the name by replacing them with '_' + */ +std::string sanitizeDirName(const std::string &str, const std::string &optional_prefix); From f34abaedd2b9277c1862cd9b82ca3338747f104e Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Wed, 29 Jul 2020 20:46:36 +0200 Subject: [PATCH 007/177] decode_base64: Allow '=' padding character '=' is a valid character, but minetest.decode_base64 returned nil when it was used for padding. --- src/util/base64.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/util/base64.cpp b/src/util/base64.cpp index c75f98598..6e1584410 100644 --- a/src/util/base64.cpp +++ b/src/util/base64.cpp @@ -34,8 +34,9 @@ static const std::string base64_chars = "0123456789+/"; -static inline bool is_base64(unsigned char c) { - return (isalnum(c) || (c == '+') || (c == '/')); +static inline bool is_base64(unsigned char c) +{ + return isalnum(c) || c == '+' || c == '/' || c == '='; } bool base64_is_valid(std::string const& s) From 715a123a33db7b0f191259ba68cbc9c565d0d4e8 Mon Sep 17 00:00:00 2001 From: Lejo Date: Thu, 30 Jul 2020 00:16:21 +0300 Subject: [PATCH 008/177] Add PUT and DELETE request + specific method value to HTTP API (#9909) --- doc/lua_api.txt | 12 +++++-- src/client/clientmedia.cpp | 3 +- src/httpfetch.cpp | 66 +++++++++++++++++++++-------------- src/httpfetch.h | 22 +++++++++--- src/network/networkprotocol.h | 2 +- src/script/lua_api/l_http.cpp | 29 +++++++++++++-- src/script/lua_api/l_http.h | 4 +-- src/serverlist.cpp | 4 +-- 8 files changed, 98 insertions(+), 44 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 5fe02b452..2d22dc899 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -8071,11 +8071,13 @@ Used by `HTTPApiTable.fetch` and `HTTPApiTable.fetch_async`. timeout = 10, -- Timeout for connection in seconds. Default is 3 seconds. - post_data = "Raw POST request data string" OR {field1 = "data1", field2 = "data2"}, - -- Optional, if specified a POST request with post_data is performed. + method = "GET", "POST", "PUT" or "DELETE" + -- The http method to use. Defaults to "GET". + + data = "Raw request data string" OR {field1 = "data1", field2 = "data2"}, + -- Data for the POST, PUT or DELETE request. -- Accepts both a string and a table. If a table is specified, encodes -- table as x-www-form-urlencoded key-value pairs. - -- If post_data is not specified, a GET request is performed instead. user_agent = "ExampleUserAgent", -- Optional, if specified replaces the default minetest user agent with @@ -8089,6 +8091,10 @@ Used by `HTTPApiTable.fetch` and `HTTPApiTable.fetch_async`. multipart = boolean -- Optional, if true performs a multipart HTTP request. -- Default is false. + -- Post only, data must be array + + post_data = "Raw POST request data string" OR {field1 = "data1", field2 = "data2"}, + -- Deprecated, use `data` instead. Forces `method = "POST"`. } `HTTPRequestResult` definition diff --git a/src/client/clientmedia.cpp b/src/client/clientmedia.cpp index 8cd3b6bcc..c4c08c05d 100644 --- a/src/client/clientmedia.cpp +++ b/src/client/clientmedia.cpp @@ -260,7 +260,8 @@ void ClientMediaDownloader::initialStep(Client *client) fetch_request.request_id = m_httpfetch_next_id; // == i fetch_request.timeout = m_httpfetch_timeout; fetch_request.connect_timeout = m_httpfetch_timeout; - fetch_request.post_data = required_hash_set; + fetch_request.method = HTTP_POST; + fetch_request.raw_data = required_hash_set; fetch_request.extra_headers.emplace_back( "Content-Type: application/octet-stream"); diff --git a/src/httpfetch.cpp b/src/httpfetch.cpp index 326b5052f..65202ce3e 100644 --- a/src/httpfetch.cpp +++ b/src/httpfetch.cpp @@ -294,13 +294,11 @@ HTTPFetchOngoing::HTTPFetchOngoing(const HTTPFetchRequest &request_, curl_easy_setopt(curl, CURLOPT_WRITEDATA, &oss); } - // Set POST (or GET) data - if (request.post_fields.empty() && request.post_data.empty()) { - curl_easy_setopt(curl, CURLOPT_HTTPGET, 1); - } else if (request.multipart) { + // Set data from fields or raw_data + if (request.multipart) { curl_httppost *last = NULL; - for (StringMap::iterator it = request.post_fields.begin(); - it != request.post_fields.end(); ++it) { + for (StringMap::iterator it = request.fields.begin(); + it != request.fields.end(); ++it) { curl_formadd(&post, &last, CURLFORM_NAMELENGTH, it->first.size(), CURLFORM_PTRNAME, it->first.c_str(), @@ -311,28 +309,42 @@ HTTPFetchOngoing::HTTPFetchOngoing(const HTTPFetchRequest &request_, curl_easy_setopt(curl, CURLOPT_HTTPPOST, post); // request.post_fields must now *never* be // modified until CURLOPT_HTTPPOST is cleared - } else if (request.post_data.empty()) { - curl_easy_setopt(curl, CURLOPT_POST, 1); - std::string str; - for (auto &post_field : request.post_fields) { - if (!str.empty()) - str += "&"; - str += urlencode(post_field.first); - str += "="; - str += urlencode(post_field.second); - } - curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, - str.size()); - curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, - str.c_str()); } else { - curl_easy_setopt(curl, CURLOPT_POST, 1); - curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, - request.post_data.size()); - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, - request.post_data.c_str()); - // request.post_data must now *never* be - // modified until CURLOPT_POSTFIELDS is cleared + switch (request.method) { + case HTTP_GET: + curl_easy_setopt(curl, CURLOPT_HTTPGET, 1); + break; + case HTTP_POST: + curl_easy_setopt(curl, CURLOPT_POST, 1); + break; + case HTTP_PUT: + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT"); + break; + case HTTP_DELETE: + curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE"); + break; + } + if (request.method != HTTP_GET) { + if (!request.raw_data.empty()) { + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, + request.raw_data.size()); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, + request.raw_data.c_str()); + } else if (!request.fields.empty()) { + std::string str; + for (auto &field : request.fields) { + if (!str.empty()) + str += "&"; + str += urlencode(field.first); + str += "="; + str += urlencode(field.second); + } + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, + str.size()); + curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, + str.c_str()); + } + } } // Set additional HTTP headers for (const std::string &extra_header : request.extra_headers) { diff --git a/src/httpfetch.h b/src/httpfetch.h index ae8b5afb5..3b9f17f0a 100644 --- a/src/httpfetch.h +++ b/src/httpfetch.h @@ -28,6 +28,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #define HTTPFETCH_DISCARD 0 #define HTTPFETCH_SYNC 1 +// Methods +enum HttpMethod : u8 +{ + HTTP_GET, + HTTP_POST, + HTTP_PUT, + HTTP_DELETE, +}; + struct HTTPFetchRequest { std::string url = ""; @@ -50,12 +59,15 @@ struct HTTPFetchRequest // application/x-www-form-urlencoded. POST-only. bool multipart = false; - // POST fields. Fields are escaped properly. - // If this is empty a GET request is done instead. - StringMap post_fields; + // The Method to use default = GET + // Avaible methods GET, POST, PUT, DELETE + HttpMethod method = HTTP_GET; - // Raw POST data, overrides post_fields. - std::string post_data; + // Fields of the request + StringMap fields; + + // Raw data of the request overrides fields + std::string raw_data; // If not empty, should contain entries such as "Accept: text/html" std::vector extra_headers; diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h index 28abf02c0..05600cda9 100644 --- a/src/network/networkprotocol.h +++ b/src/network/networkprotocol.h @@ -1034,7 +1034,7 @@ const static std::string accessDeniedStrings[SERVER_ACCESSDENIED_MAX] = { "This server has experienced an internal error. You will now be disconnected." }; -enum PlayerListModifer: u8 +enum PlayerListModifer : u8 { PLAYER_LIST_INIT, PLAYER_LIST_ADD, diff --git a/src/script/lua_api/l_http.cpp b/src/script/lua_api/l_http.cpp index ec43bf174..5ea3b3f99 100644 --- a/src/script/lua_api/l_http.cpp +++ b/src/script/lua_api/l_http.cpp @@ -49,17 +49,40 @@ void ModApiHttp::read_http_fetch_request(lua_State *L, HTTPFetchRequest &req) req.multipart = getboolfield_default(L, 1, "multipart", false); req.timeout = getintfield_default(L, 1, "timeout", 3) * 1000; - // post_data: if table, post form data, otherwise raw data + lua_getfield(L, 1, "method"); + if (lua_isstring(L, -1)) { + std::string mth = getstringfield_default(L, 1, "method", ""); + if (mth == "GET") + req.method = HTTP_GET; + else if (mth == "POST") + req.method = HTTP_POST; + else if (mth == "PUT") + req.method = HTTP_PUT; + else if (mth == "DELETE") + req.method = HTTP_DELETE; + } + lua_pop(L, 1); + + // post_data: if table, post form data, otherwise raw data DEPRECATED use data and method instead lua_getfield(L, 1, "post_data"); + if (lua_isnil(L, 2)) { + lua_pop(L, 1); + lua_getfield(L, 1, "data"); + } + else { + req.method = HTTP_POST; + } + if (lua_istable(L, 2)) { lua_pushnil(L); while (lua_next(L, 2) != 0) { - req.post_fields[readParam(L, -2)] = readParam(L, -1); + req.fields[readParam(L, -2)] = readParam(L, -1); lua_pop(L, 1); } } else if (lua_isstring(L, 2)) { - req.post_data = readParam(L, 2); + req.raw_data = readParam(L, 2); } + lua_pop(L, 1); lua_getfield(L, 1, "extra_headers"); diff --git a/src/script/lua_api/l_http.h b/src/script/lua_api/l_http.h index de6e51b37..c3a2a5276 100644 --- a/src/script/lua_api/l_http.h +++ b/src/script/lua_api/l_http.h @@ -32,10 +32,10 @@ private: static void read_http_fetch_request(lua_State *L, HTTPFetchRequest &req); static void push_http_fetch_result(lua_State *L, HTTPFetchResult &res, bool completed = true); - // http_fetch_sync({url=, timeout=, post_data=}) + // http_fetch_sync({url=, timeout=, data=}) static int l_http_fetch_sync(lua_State *L); - // http_fetch_async({url=, timeout=, post_data=}) + // http_fetch_async({url=, timeout=, data=}) static int l_http_fetch_async(lua_State *L); // http_fetch_async_get(handle) diff --git a/src/serverlist.cpp b/src/serverlist.cpp index 18264e933..2f6ab2e61 100644 --- a/src/serverlist.cpp +++ b/src/serverlist.cpp @@ -261,11 +261,11 @@ void sendAnnounce(AnnounceAction action, HTTPFetchRequest fetch_request; fetch_request.url = g_settings->get("serverlist_url") + std::string("/announce"); - fetch_request.post_fields["json"] = fastWriteJson(server); + fetch_request.method = HTTP_POST; + fetch_request.fields["json"] = fastWriteJson(server); fetch_request.multipart = true; httpfetch_async(fetch_request); } #endif } // namespace ServerList - From 470f32821627a56b682ea1947ab5a50ef57c1c10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= <34514239+appgurueu@users.noreply.github.com> Date: Wed, 29 Jul 2020 23:17:52 +0200 Subject: [PATCH 009/177] Revert "Get rid of non-ascii characters in the debug display code (#8821)" (#9828) This reverts commit 4f9ccd89b347dad3db5ce63d3405a8d60c163af5. --- src/client/gameui.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/gameui.cpp b/src/client/gameui.cpp index c216f405d..81c268e44 100644 --- a/src/client/gameui.cpp +++ b/src/client/gameui.cpp @@ -133,9 +133,9 @@ void GameUI::update(const RunStats &stats, Client *client, MapDrawControl *draw_ << "pos: (" << (player_position.X / BS) << ", " << (player_position.Y / BS) << ", " << (player_position.Z / BS) - << ") | yaw: " << (wrapDegrees_0_360(cam.camera_yaw)) << "\xC2\xB0 " + << ") | yaw: " << (wrapDegrees_0_360(cam.camera_yaw)) << "° " << yawToDirectionString(cam.camera_yaw) - << " | pitch: " << (-wrapDegrees_180(cam.camera_pitch)) << "\xC2\xB0" + << " | pitch: " << (-wrapDegrees_180(cam.camera_pitch)) << "°" << " | seed: " << ((u64)client->getMapSeed()); if (pointed_old.type == POINTEDTHING_NODE) { From e5725dfb8e476a5a6f63f020a23a53ca3ef610e9 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Wed, 29 Jul 2020 23:20:01 +0200 Subject: [PATCH 010/177] Allow starting local server using --go again (#10229) --- src/client/clientlauncher.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/client/clientlauncher.cpp b/src/client/clientlauncher.cpp index ce16797e6..29427f609 100644 --- a/src/client/clientlauncher.cpp +++ b/src/client/clientlauncher.cpp @@ -327,13 +327,13 @@ void ClientLauncher::init_args(GameStartData &start_data, const Settings &cmd_ar // Join a remote server start_data.address = cmd_args.get("address"); start_data.world_path.clear(); + start_data.name = g_settings->get("name"); } if (!start_data.world_path.empty()) { // Start a singleplayer instance start_data.address = ""; } - start_data.name = g_settings->get("name"); if (cmd_args.exists("name")) start_data.name = cmd_args.get("name"); @@ -419,7 +419,6 @@ bool ClientLauncher::launch_game(std::string &error_message, /* Show the GUI menu */ std::string server_name, server_description; - start_data.local_server = false; if (!skip_main_menu) { // Initialize menu data // TODO: Re-use existing structs (GameStartData) @@ -467,6 +466,9 @@ bool ClientLauncher::launch_game(std::string &error_message, start_data.local_server = !menudata.simple_singleplayer_mode && start_data.address.empty(); + } else { + start_data.local_server = !start_data.world_path.empty() && + start_data.address.empty() && !start_data.name.empty(); } if (!RenderingEngine::run()) From 9bba52c4000a06043f5100dbb0ef66d869707ffc Mon Sep 17 00:00:00 2001 From: sfan5 Date: Thu, 30 Jul 2020 17:39:57 +0200 Subject: [PATCH 011/177] content_cao: Support texture animation for upright_sprite (#10020) --- doc/lua_api.txt | 18 ++++++------- games/devtest/mods/testentities/visuals.lua | 16 ++++++++++-- src/client/content_cao.cpp | 28 ++++++++++++++++++--- src/client/mesh.cpp | 9 +++++++ src/client/mesh.h | 7 ++++++ 5 files changed, 64 insertions(+), 14 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 2d22dc899..8ac3ad7f2 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -6077,15 +6077,15 @@ object you are working with still exists. * `get_yaw()`: returns number in radians * `set_texture_mod(mod)` * `get_texture_mod()` returns current texture modifier -* `set_sprite(p, num_frames, framelength, select_horiz_by_yawpitch)` - * Select sprite from spritesheet with optional animation and Dungeon Master - style texture selection based on yaw relative to camera - * `p`: {x=number, y=number}, the coordinate of the first frame - (x: column, y: row), default: `{x=0, y=0}` - * `num_frames`: number, default: `1` - * `framelength`: number, default: `0.2` - * `select_horiz_by_yawpitch`: boolean, this was once used for the Dungeon - Master mob, default: `false` +* `set_sprite(p, num_frames, framelength, select_x_by_camera)` + * Specifies and starts a sprite animation + * Animations iterate along the frame `y` position. + * `p`: {x=column number, y=row number}, the coordinate of the first frame + default: `{x=0, y=0}` + * `num_frames`: Total frames in the texture, default: `1` + * `framelength`: Time per animated frame in seconds, default: `0.2` + * `select_x_by_camera`: Only for visual = `sprite`. Changes the frame `x` + position according to the view direction. default: `false`. * `get_entity_name()` (**Deprecated**: Will be removed in a future version) * `get_luaentity()` diff --git a/games/devtest/mods/testentities/visuals.lua b/games/devtest/mods/testentities/visuals.lua index 83f361f16..8848ba49f 100644 --- a/games/devtest/mods/testentities/visuals.lua +++ b/games/devtest/mods/testentities/visuals.lua @@ -68,7 +68,7 @@ minetest.register_entity("testentities:mesh_unshaded", { -- Advanced visual tests --- A test entity for testing animated and yaw-modulated sprites +-- An entity for testing animated and yaw-modulated sprites minetest.register_entity("testentities:yawsprite", { initial_properties = { selectionbox = {-0.3, -0.5, -0.3, 0.3, 0.3, 0.3}, @@ -79,6 +79,18 @@ minetest.register_entity("testentities:yawsprite", { initial_sprite_basepos = {x=0, y=0}, }, on_activate = function(self, staticdata) - self.object:set_sprite({x=0, y=0}, 1, 0, true) + self.object:set_sprite({x=0, y=0}, 3, 0.5, true) + end, +}) + +-- An entity for testing animated upright sprites +minetest.register_entity("testentities:upright_animated", { + initial_properties = { + visual = "upright_sprite", + textures = {"testnodes_anim.png"}, + spritediv = {x = 1, y = 4}, + }, + on_activate = function(self) + self.object:set_sprite({x=0, y=0}, 4, 1.0, false) end, }) diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index 4f949f6b0..88688d18c 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -1176,6 +1176,7 @@ void GenericCAO::updateTexturePos() int row = m_tx_basepos.Y; int col = m_tx_basepos.X; + // Yawpitch goes rightwards if (m_tx_select_horiz_by_yawpitch) { if (cam_to_entity.Y > 0.75) col += 5; @@ -1206,6 +1207,27 @@ void GenericCAO::updateTexturePos() float tys = m_tx_size.Y; setBillboardTextureMatrix(m_spritenode, txs, tys, col, row); } + + else if (m_meshnode) { + if (m_prop.visual == "upright_sprite") { + int row = m_tx_basepos.Y; + int col = m_tx_basepos.X; + + // Animation goes downwards + row += m_anim_frame; + + const auto &tx = m_tx_size; + v2f t[4] = { // cf. vertices in GenericCAO::addToScene() + tx * v2f(col+1, row+1), + tx * v2f(col, row+1), + tx * v2f(col, row), + tx * v2f(col+1, row), + }; + auto mesh = m_meshnode->getMesh(); + setMeshBufferTextureCoords(mesh->getMeshBuffer(0), t, 4); + setMeshBufferTextureCoords(mesh->getMeshBuffer(1), t, 4); + } + } } // Do not pass by reference, see header. @@ -1247,7 +1269,7 @@ void GenericCAO::updateTextures(std::string mod) } } - if (m_animated_meshnode) { + else if (m_animated_meshnode) { if (m_prop.visual == "mesh") { for (u32 i = 0; i < m_prop.textures.size() && i < m_animated_meshnode->getMaterialCount(); ++i) { @@ -1296,8 +1318,8 @@ void GenericCAO::updateTextures(std::string mod) } } } - if(m_meshnode) - { + + else if (m_meshnode) { if(m_prop.visual == "cube") { for (u32 i = 0; i < 6; ++i) diff --git a/src/client/mesh.cpp b/src/client/mesh.cpp index e1ec22068..2400a374c 100644 --- a/src/client/mesh.cpp +++ b/src/client/mesh.cpp @@ -203,6 +203,15 @@ void setMeshColor(scene::IMesh *mesh, const video::SColor &color) setMeshBufferColor(mesh->getMeshBuffer(j), color); } +void setMeshBufferTextureCoords(scene::IMeshBuffer *buf, const v2f *uv, u32 count) +{ + const u32 stride = getVertexPitchFromType(buf->getVertexType()); + assert(buf->getVertexCount() >= count); + u8 *vertices = (u8 *) buf->getVertices(); + for (u32 i = 0; i < count; i++) + ((video::S3DVertex*) (vertices + i * stride))->TCoords = uv[i]; +} + template static void applyToMesh(scene::IMesh *mesh, const F &fn) { diff --git a/src/client/mesh.h b/src/client/mesh.h index 103c61e45..dbc091a06 100644 --- a/src/client/mesh.h +++ b/src/client/mesh.h @@ -58,6 +58,13 @@ void setMeshBufferColor(scene::IMeshBuffer *buf, const video::SColor &color); */ void setMeshColor(scene::IMesh *mesh, const video::SColor &color); + +/* + Sets texture coords for vertices in the mesh buffer. + `uv[]` must have `count` elements +*/ +void setMeshBufferTextureCoords(scene::IMeshBuffer *buf, const v2f *uv, u32 count); + /* Set a constant color for an animated mesh */ From aba8c3753162320c7cc8a66913ad82f4f1fd0d8b Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Thu, 30 Jul 2020 19:03:48 +0200 Subject: [PATCH 012/177] Falling: Fix error caused by missing param2 Falling nodes that were spawned prior the recent falling node changes did not require param2. Default to param2 = 0 when none is found in the node data. --- builtin/game/falling.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/builtin/game/falling.lua b/builtin/game/falling.lua index 714506a5f..4bfcca9e7 100644 --- a/builtin/game/falling.lua +++ b/builtin/game/falling.lua @@ -52,6 +52,7 @@ core.register_entity(":__builtin:falling_node", { floats = false, set_node = function(self, node, meta) + node.param2 = node.param2 or 0 self.node = node meta = meta or {} if type(meta.to_table) == "function" then From 542df11bed89ebad786220f1162597353ecc277d Mon Sep 17 00:00:00 2001 From: Paul Ouellette Date: Sat, 1 Aug 2020 11:25:33 -0400 Subject: [PATCH 013/177] Fix GCC class-memaccess warnings (#10239) --- src/client/mapblock_mesh.cpp | 7 +++++++ src/noise.cpp | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/client/mapblock_mesh.cpp b/src/client/mapblock_mesh.cpp index 1020e35f5..2f96ca61f 100644 --- a/src/client/mapblock_mesh.cpp +++ b/src/client/mapblock_mesh.cpp @@ -419,7 +419,14 @@ static void getNodeVertexDirs(const v3s16 &dir, v3s16 *vertex_dirs) u8 idx = (dir.X + 2 * dir.Y + 3 * dir.Z) & 7; idx = (idx - 1) * 4; +#if defined(__GNUC__) && !defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wclass-memaccess" +#endif memcpy(vertex_dirs, &vertex_dirs_table[idx], 4 * sizeof(v3s16)); +#if defined(__GNUC__) && !defined(__clang__) +#pragma GCC diagnostic pop +#endif } static void getNodeTextureCoords(v3f base, const v3f &scale, const v3s16 &dir, float *u, float *v) diff --git a/src/noise.cpp b/src/noise.cpp index 5a1d989cb..e16564b05 100644 --- a/src/noise.cpp +++ b/src/noise.cpp @@ -424,7 +424,7 @@ float NoisePerlin3D(NoiseParams *np, float x, float y, float z, s32 seed) Noise::Noise(NoiseParams *np_, s32 seed, u32 sx, u32 sy, u32 sz) { - memcpy(&np, np_, sizeof(np)); + np = *np_; this->seed = seed; this->sx = sx; this->sy = sy; From d22fd6fc348ecf393f535c9b172410f4a82a2d52 Mon Sep 17 00:00:00 2001 From: Seeker Date: Mon, 3 Aug 2020 14:38:45 -0700 Subject: [PATCH 014/177] Fix build for Visual Studio (explicitly cast pointers) (#10256) --- src/util/md32_common.h | 2 +- src/util/sha256.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/util/md32_common.h b/src/util/md32_common.h index a4c2099c9..2c050b72a 100644 --- a/src/util/md32_common.h +++ b/src/util/md32_common.h @@ -301,7 +301,7 @@ int HASH_UPDATE(HASH_CTX *c, const void *data_, size_t len) { - const unsigned char *data = data_; + const unsigned char *data = (const unsigned char *)data_; unsigned char *p; HASH_LONG l; size_t n; diff --git a/src/util/sha256.c b/src/util/sha256.c index 4241f31f3..5c8266f9a 100644 --- a/src/util/sha256.c +++ b/src/util/sha256.c @@ -18,13 +18,13 @@ const char SHA256_version[] = "SHA-256" OPENSSL_VERSION_PTEXT; unsigned static char cleanse_ctr = 0; static void OPENSSL_cleanse(void *ptr, size_t len) { - unsigned char *p = ptr; + unsigned char *p = (unsigned char *)ptr; size_t loop = len, ctr = cleanse_ctr; while (loop--) { *(p++) = (unsigned char)ctr; ctr += (17 + ((size_t)p & 0xF)); } - p = memchr(ptr, (unsigned char)ctr, len); + p = (unsigned char *)memchr(ptr, (unsigned char)ctr, len); if (p) ctr += (63 + (size_t)p); cleanse_ctr = (unsigned char)ctr; @@ -262,7 +262,7 @@ static void sha256_block_data_order(SHA256_CTX *ctx, const void *in, unsigned MD32_REG_T a, b, c, d, e, f, g, h, s0, s1, T1; SHA_LONG X[16]; int i; - const unsigned char *data = in; + const unsigned char *data = (const unsigned char *)in; const union { long one; char little; From 93ecc589bc49a80187705f6e06df23a71263d3d7 Mon Sep 17 00:00:00 2001 From: Hugues Ross Date: Tue, 4 Aug 2020 14:12:47 -0400 Subject: [PATCH 015/177] Implement override.txt support for special tiles (#10140) Add override targets for all special_tiles entries in node definitions, allowing texture packs to replace these textures. This makes overrides work properly with a variety of drawtypes. The targets are named special1 through special6, covering the the current length of the special_tiles array. --- doc/texture_packs.txt | 18 +++++++++++++++++- src/nodedef.cpp | 21 +++++++++++++++++++++ src/nodedef.h | 5 +++++ src/texture_override.cpp | 38 ++++++++++++++++++++++++++------------ src/texture_override.h | 18 +++++++++++++++--- util/ci/lint.sh | 0 6 files changed, 84 insertions(+), 16 deletions(-) mode change 100644 => 100755 util/ci/lint.sh diff --git a/doc/texture_packs.txt b/doc/texture_packs.txt index 79d65a339..8af2cbad6 100644 --- a/doc/texture_packs.txt +++ b/doc/texture_packs.txt @@ -195,11 +195,27 @@ Here are targets you can choose from: | bottom | y- face | | sides | x-, x+, z-, z+ faces | | all | All faces. You can also use '*' instead of 'all'. | +| special1 | The first entry in the special_tiles list | +| special2 | The second entry in the special_tiles list | +| special3 | The third entry in the special_tiles list | +| special4 | The fourth entry in the special_tiles list | +| special5 | The fifth entry in the special_tiles list | +| special6 | The sixth entry in the special_tiles list | | inventory | The inventory texture | | wield | The texture used when held by the player | Nodes support all targets, but other items only support 'inventory' -and 'wield' +and 'wield'. + +### Using the special targets + +The special* targets only apply to specific drawtypes: + +* `flowingliquid`: special1 sets the top texture, special2 sets the side texture +* `allfaces_optional`: special1 is used by simple mode, see below +* `glasslike_framed`: When containing a liquid, special1 sets the liquid texture +* `glasslike_framed_optional`: Same as `glasslike_framed` +* `plantlike_rooted`: special1 sets the plant's texture Designing leaves textures for the leaves rendering options ---------------------------------------------------------- diff --git a/src/nodedef.cpp b/src/nodedef.cpp index e5cd2c2a7..82c4581fa 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -1337,6 +1337,7 @@ void NodeDefManager::applyTextureOverrides(const std::vector &o ContentFeatures &nodedef = m_content_features[id]; + // Override tiles if (texture_override.hasTarget(OverrideTarget::TOP)) nodedef.tiledef[0].name = texture_override.texture; @@ -1354,6 +1355,26 @@ void NodeDefManager::applyTextureOverrides(const std::vector &o if (texture_override.hasTarget(OverrideTarget::FRONT)) nodedef.tiledef[5].name = texture_override.texture; + + + // Override special tiles, if applicable + if (texture_override.hasTarget(OverrideTarget::SPECIAL_1)) + nodedef.tiledef_special[0].name = texture_override.texture; + + if (texture_override.hasTarget(OverrideTarget::SPECIAL_2)) + nodedef.tiledef_special[1].name = texture_override.texture; + + if (texture_override.hasTarget(OverrideTarget::SPECIAL_3)) + nodedef.tiledef_special[2].name = texture_override.texture; + + if (texture_override.hasTarget(OverrideTarget::SPECIAL_4)) + nodedef.tiledef_special[3].name = texture_override.texture; + + if (texture_override.hasTarget(OverrideTarget::SPECIAL_5)) + nodedef.tiledef_special[4].name = texture_override.texture; + + if (texture_override.hasTarget(OverrideTarget::SPECIAL_6)) + nodedef.tiledef_special[5].name = texture_override.texture; } } diff --git a/src/nodedef.h b/src/nodedef.h index ff52f976f..d0da367ee 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -261,6 +261,11 @@ struct TileDef NodeDrawType drawtype); }; +// Defines the number of special tiles per nodedef +// +// NOTE: When changing this value, the enum entries of OverrideTarget and +// parser in TextureOverrideSource must be updated so that all special +// tiles can be overridden. #define CF_SPECIAL_COUNT 6 struct ContentFeatures diff --git a/src/texture_override.cpp b/src/texture_override.cpp index 10d129b87..effdb0efd 100644 --- a/src/texture_override.cpp +++ b/src/texture_override.cpp @@ -24,6 +24,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include +#define override_cast static_cast + TextureOverrideSource::TextureOverrideSource(std::string filepath) { std::ifstream infile(filepath.c_str()); @@ -56,25 +58,37 @@ TextureOverrideSource::TextureOverrideSource(std::string filepath) std::vector targets = str_split(splitted[1], ','); for (const std::string &target : targets) { if (target == "top") - texture_override.target |= static_cast(OverrideTarget::TOP); + texture_override.target |= override_cast(OverrideTarget::TOP); else if (target == "bottom") - texture_override.target |= static_cast(OverrideTarget::BOTTOM); + texture_override.target |= override_cast(OverrideTarget::BOTTOM); else if (target == "left") - texture_override.target |= static_cast(OverrideTarget::LEFT); + texture_override.target |= override_cast(OverrideTarget::LEFT); else if (target == "right") - texture_override.target |= static_cast(OverrideTarget::RIGHT); + texture_override.target |= override_cast(OverrideTarget::RIGHT); else if (target == "front") - texture_override.target |= static_cast(OverrideTarget::FRONT); + texture_override.target |= override_cast(OverrideTarget::FRONT); else if (target == "back") - texture_override.target |= static_cast(OverrideTarget::BACK); + texture_override.target |= override_cast(OverrideTarget::BACK); else if (target == "inventory") - texture_override.target |= static_cast(OverrideTarget::INVENTORY); + texture_override.target |= override_cast(OverrideTarget::INVENTORY); else if (target == "wield") - texture_override.target |= static_cast(OverrideTarget::WIELD); + texture_override.target |= override_cast(OverrideTarget::WIELD); + else if (target == "special1") + texture_override.target |= override_cast(OverrideTarget::SPECIAL_1); + else if (target == "special2") + texture_override.target |= override_cast(OverrideTarget::SPECIAL_2); + else if (target == "special3") + texture_override.target |= override_cast(OverrideTarget::SPECIAL_3); + else if (target == "special4") + texture_override.target |= override_cast(OverrideTarget::SPECIAL_4); + else if (target == "special5") + texture_override.target |= override_cast(OverrideTarget::SPECIAL_5); + else if (target == "special6") + texture_override.target |= override_cast(OverrideTarget::SPECIAL_6); else if (target == "sides") - texture_override.target |= static_cast(OverrideTarget::SIDES); + texture_override.target |= override_cast(OverrideTarget::SIDES); else if (target == "all" || target == "*") - texture_override.target |= static_cast(OverrideTarget::ALL_FACES); + texture_override.target |= override_cast(OverrideTarget::ALL_FACES); else { // Report invalid target warningstream << filepath << ":" << line_index @@ -85,7 +99,7 @@ TextureOverrideSource::TextureOverrideSource(std::string filepath) } // If there are no valid targets, skip adding this override - if (texture_override.target == static_cast(OverrideTarget::INVALID)) { + if (texture_override.target == override_cast(OverrideTarget::INVALID)) { continue; } @@ -112,7 +126,7 @@ std::vector TextureOverrideSource::getNodeTileOverrides() std::vector found_overrides; for (const TextureOverride &texture_override : m_overrides) { - if (texture_override.hasTarget(OverrideTarget::ALL_FACES)) + if (texture_override.hasTarget(OverrideTarget::NODE_TARGETS)) found_overrides.push_back(texture_override); } diff --git a/src/texture_override.h b/src/texture_override.h index db03bd014..bdc95e732 100644 --- a/src/texture_override.h +++ b/src/texture_override.h @@ -23,8 +23,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include +typedef u16 override_t; + //! Bitmask enum specifying what a texture override should apply to -enum class OverrideTarget : u8 +enum class OverrideTarget : override_t { INVALID = 0, TOP = 1 << 0, @@ -35,23 +37,33 @@ enum class OverrideTarget : u8 BACK = 1 << 5, INVENTORY = 1 << 6, WIELD = 1 << 7, + SPECIAL_1 = 1 << 8, + SPECIAL_2 = 1 << 9, + SPECIAL_3 = 1 << 10, + SPECIAL_4 = 1 << 11, + SPECIAL_5 = 1 << 12, + SPECIAL_6 = 1 << 13, + // clang-format off SIDES = LEFT | RIGHT | FRONT | BACK, ALL_FACES = TOP | BOTTOM | SIDES, + ALL_SPECIAL = SPECIAL_1 | SPECIAL_2 | SPECIAL_3 | SPECIAL_4 | SPECIAL_5 | SPECIAL_6, + NODE_TARGETS = ALL_FACES | ALL_SPECIAL, ITEM_TARGETS = INVENTORY | WIELD, + // clang-format on }; struct TextureOverride { std::string id; std::string texture; - u8 target; + override_t target; // Helper function for checking if an OverrideTarget is found in // a TextureOverride without casting inline bool hasTarget(OverrideTarget overrideTarget) const { - return (target & static_cast(overrideTarget)) != 0; + return (target & static_cast(overrideTarget)) != 0; } }; diff --git a/util/ci/lint.sh b/util/ci/lint.sh old mode 100644 new mode 100755 From f92a393f6f949377b1d78630a8f7d24e78e6ff9d Mon Sep 17 00:00:00 2001 From: Paramat Date: Wed, 5 Aug 2020 05:00:00 +0100 Subject: [PATCH 016/177] Mapgen Flat: Add caverns, disabled by default (#9913) Add the caverns used in V5, V7, Valleys, Carpathian. Disabled by default to not be force-enabled in existing worlds. --- builtin/mainmenu/dlg_create_world.lua | 1 + builtin/settingtypes.txt | 14 +++++- src/mapgen/mapgen_flat.cpp | 66 +++++++++++++++++++-------- src/mapgen/mapgen_flat.h | 24 ++++++---- 4 files changed, 77 insertions(+), 28 deletions(-) diff --git a/builtin/mainmenu/dlg_create_world.lua b/builtin/mainmenu/dlg_create_world.lua index 36df23cce..b2e706b6b 100644 --- a/builtin/mainmenu/dlg_create_world.lua +++ b/builtin/mainmenu/dlg_create_world.lua @@ -61,6 +61,7 @@ local flag_checkboxes = { fgettext("Low humidity and high heat causes shallow or dry rivers") }, }, flat = { + cb_caverns, { "hills", fgettext("Hills"), "hills" }, { "lakes", fgettext("Lakes"), "lakes" }, }, diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index c0620542d..01736f586 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -1860,7 +1860,7 @@ mgcarpathian_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 50 # Map generation attributes specific to Mapgen Flat. # Occasional lakes and hills can be added to the flat world. -mgflat_spflags (Mapgen Flat specific flags) flags nolakes,nohills lakes,hills,nolakes,nohills +mgflat_spflags (Mapgen Flat specific flags) flags nolakes,nohills,nocaverns lakes,hills,caverns,nolakes,nohills,nocaverns # Y of flat ground. mgflat_ground_level (Ground level) int 8 @@ -1904,6 +1904,15 @@ mgflat_hill_threshold (Hill threshold) float 0.45 # Controls steepness/height of hills. mgflat_hill_steepness (Hill steepness) float 64.0 +# Y-level of cavern upper limit. +mgflat_cavern_limit (Cavern limit) int -256 + +# Y-distance over which caverns expand to full size. +mgflat_cavern_taper (Cavern taper) int 256 + +# Defines full size of caverns, smaller values create larger caverns. +mgflat_cavern_threshold (Cavern threshold) float 0.7 + # Lower Y limit of dungeons. mgflat_dungeon_ymin (Dungeon minimum Y) int -31000 @@ -1924,6 +1933,9 @@ mgflat_np_cave1 (Cave1 noise) noise_params_3d 0, 12, (61, 61, 61), 52534, 3, 0.5 # Second of two 3D noises that together define tunnels. mgflat_np_cave2 (Cave2 noise) noise_params_3d 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0 +# 3D noise defining giant caverns. +mgflat_np_cavern (Cavern noise) noise_params_3d 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0 + # 3D noise that determines number of dungeons per mapchunk. mgflat_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 500), 0, 2, 0.8, 2.0 diff --git a/src/mapgen/mapgen_flat.cpp b/src/mapgen/mapgen_flat.cpp index 369777ad2..df6469ad9 100644 --- a/src/mapgen/mapgen_flat.cpp +++ b/src/mapgen/mapgen_flat.cpp @@ -1,7 +1,7 @@ /* Minetest -Copyright (C) 2015-2018 paramat -Copyright (C) 2015-2018 kwolekr, Ryan Kwolek +Copyright (C) 2015-2020 paramat +Copyright (C) 2015-2016 kwolekr, Ryan Kwolek This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -39,8 +39,9 @@ with this program; if not, write to the Free Software Foundation, Inc., FlagDesc flagdesc_mapgen_flat[] = { - {"lakes", MGFLAT_LAKES}, - {"hills", MGFLAT_HILLS}, + {"lakes", MGFLAT_LAKES}, + {"hills", MGFLAT_HILLS}, + {"caverns", MGFLAT_CAVERNS}, {NULL, 0} }; @@ -52,17 +53,21 @@ MapgenFlat::MapgenFlat(MapgenFlatParams *params, EmergeParams *emerge) { spflags = params->spflags; ground_level = params->ground_level; - large_cave_depth = params->large_cave_depth; - small_cave_num_min = params->small_cave_num_min; - small_cave_num_max = params->small_cave_num_max; - large_cave_num_min = params->large_cave_num_min; - large_cave_num_max = params->large_cave_num_max; - large_cave_flooded = params->large_cave_flooded; - cave_width = params->cave_width; lake_threshold = params->lake_threshold; lake_steepness = params->lake_steepness; hill_threshold = params->hill_threshold; hill_steepness = params->hill_steepness; + + cave_width = params->cave_width; + small_cave_num_min = params->small_cave_num_min; + small_cave_num_max = params->small_cave_num_max; + large_cave_num_min = params->large_cave_num_min; + large_cave_num_max = params->large_cave_num_max; + large_cave_depth = params->large_cave_depth; + large_cave_flooded = params->large_cave_flooded; + cavern_limit = params->cavern_limit; + cavern_taper = params->cavern_taper; + cavern_threshold = params->cavern_threshold; dungeon_ymin = params->dungeon_ymin; dungeon_ymax = params->dungeon_ymax; @@ -71,9 +76,11 @@ MapgenFlat::MapgenFlat(MapgenFlatParams *params, EmergeParams *emerge) if ((spflags & MGFLAT_LAKES) || (spflags & MGFLAT_HILLS)) noise_terrain = new Noise(¶ms->np_terrain, seed, csize.X, csize.Z); + // 3D noise MapgenBasic::np_cave1 = params->np_cave1; MapgenBasic::np_cave2 = params->np_cave2; + MapgenBasic::np_cavern = params->np_cavern; MapgenBasic::np_dungeons = params->np_dungeons; } @@ -88,11 +95,12 @@ MapgenFlat::~MapgenFlat() MapgenFlatParams::MapgenFlatParams(): - np_terrain (0, 1, v3f(600, 600, 600), 7244, 5, 0.6, 2.0), - np_filler_depth (0, 1.2, v3f(150, 150, 150), 261, 3, 0.7, 2.0), - np_cave1 (0, 12, v3f(61, 61, 61), 52534, 3, 0.5, 2.0), - np_cave2 (0, 12, v3f(67, 67, 67), 10325, 3, 0.5, 2.0), - np_dungeons (0.9, 0.5, v3f(500, 500, 500), 0, 2, 0.8, 2.0) + np_terrain (0, 1, v3f(600, 600, 600), 7244, 5, 0.6, 2.0), + np_filler_depth (0, 1.2, v3f(150, 150, 150), 261, 3, 0.7, 2.0), + np_cavern (0.0, 1.0, v3f(384, 128, 384), 723, 5, 0.63, 2.0), + np_cave1 (0, 12, v3f(61, 61, 61), 52534, 3, 0.5, 2.0), + np_cave2 (0, 12, v3f(67, 67, 67), 10325, 3, 0.5, 2.0), + np_dungeons (0.9, 0.5, v3f(500, 500, 500), 0, 2, 0.8, 2.0) { } @@ -112,11 +120,15 @@ void MapgenFlatParams::readParams(const Settings *settings) settings->getFloatNoEx("mgflat_lake_steepness", lake_steepness); settings->getFloatNoEx("mgflat_hill_threshold", hill_threshold); settings->getFloatNoEx("mgflat_hill_steepness", hill_steepness); + settings->getS16NoEx("mgflat_cavern_limit", cavern_limit); + settings->getS16NoEx("mgflat_cavern_taper", cavern_taper); + settings->getFloatNoEx("mgflat_cavern_threshold", cavern_threshold); settings->getS16NoEx("mgflat_dungeon_ymin", dungeon_ymin); settings->getS16NoEx("mgflat_dungeon_ymax", dungeon_ymax); settings->getNoiseParams("mgflat_np_terrain", np_terrain); settings->getNoiseParams("mgflat_np_filler_depth", np_filler_depth); + settings->getNoiseParams("mgflat_np_cavern", np_cavern); settings->getNoiseParams("mgflat_np_cave1", np_cave1); settings->getNoiseParams("mgflat_np_cave2", np_cave2); settings->getNoiseParams("mgflat_np_dungeons", np_dungeons); @@ -138,11 +150,15 @@ void MapgenFlatParams::writeParams(Settings *settings) const settings->setFloat("mgflat_lake_steepness", lake_steepness); settings->setFloat("mgflat_hill_threshold", hill_threshold); settings->setFloat("mgflat_hill_steepness", hill_steepness); + settings->setS16("mgflat_cavern_limit", cavern_limit); + settings->setS16("mgflat_cavern_taper", cavern_taper); + settings->setFloat("mgflat_cavern_threshold", cavern_threshold); settings->setS16("mgflat_dungeon_ymin", dungeon_ymin); settings->setS16("mgflat_dungeon_ymax", dungeon_ymax); settings->setNoiseParams("mgflat_np_terrain", np_terrain); settings->setNoiseParams("mgflat_np_filler_depth", np_filler_depth); + settings->setNoiseParams("mgflat_np_cavern", np_cavern); settings->setNoiseParams("mgflat_np_cave1", np_cave1); settings->setNoiseParams("mgflat_np_cave2", np_cave2); settings->setNoiseParams("mgflat_np_dungeons", np_dungeons); @@ -226,11 +242,25 @@ void MapgenFlat::makeChunk(BlockMakeData *data) generateBiomes(); } + // Generate tunnels, caverns and large randomwalk caves if (flags & MG_CAVES) { - // Generate tunnels + // Generate tunnels first as caverns confuse them generateCavesNoiseIntersection(stone_surface_max_y); + + // Generate caverns + bool near_cavern = false; + if (spflags & MGFLAT_CAVERNS) + near_cavern = generateCavernsNoise(stone_surface_max_y); + // Generate large randomwalk caves - generateCavesRandomWalk(stone_surface_max_y, large_cave_depth); + if (near_cavern) + // Disable large randomwalk caves in this mapchunk by setting + // 'large cave depth' to world base. Avoids excessive liquid in + // large caverns and floating blobs of overgenerated liquid. + generateCavesRandomWalk(stone_surface_max_y, + -MAX_MAP_GENERATION_LIMIT); + else + generateCavesRandomWalk(stone_surface_max_y, large_cave_depth); } // Generate the registered ores diff --git a/src/mapgen/mapgen_flat.h b/src/mapgen/mapgen_flat.h index 4902a802c..4b46aff27 100644 --- a/src/mapgen/mapgen_flat.h +++ b/src/mapgen/mapgen_flat.h @@ -1,7 +1,7 @@ /* Minetest -Copyright (C) 2015-2018 paramat -Copyright (C) 2015-2018 kwolekr, Ryan Kwolek +Copyright (C) 2015-2020 paramat +Copyright (C) 2015-2016 kwolekr, Ryan Kwolek This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -25,6 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., /////// Mapgen Flat flags #define MGFLAT_LAKES 0x01 #define MGFLAT_HILLS 0x02 +#define MGFLAT_CAVERNS 0x04 class BiomeManager; @@ -33,22 +34,27 @@ extern FlagDesc flagdesc_mapgen_flat[]; struct MapgenFlatParams : public MapgenParams { s16 ground_level = 8; - s16 large_cave_depth = -33; - u16 small_cave_num_min = 0; - u16 small_cave_num_max = 0; - u16 large_cave_num_min = 0; - u16 large_cave_num_max = 2; - float large_cave_flooded = 0.5f; - float cave_width = 0.09f; float lake_threshold = -0.45f; float lake_steepness = 48.0f; float hill_threshold = 0.45f; float hill_steepness = 64.0f; + + float cave_width = 0.09f; + u16 small_cave_num_min = 0; + u16 small_cave_num_max = 0; + u16 large_cave_num_min = 0; + u16 large_cave_num_max = 2; + s16 large_cave_depth = -33; + float large_cave_flooded = 0.5f; + s16 cavern_limit = -256; + s16 cavern_taper = 256; + float cavern_threshold = 0.7f; s16 dungeon_ymin = -31000; s16 dungeon_ymax = 31000; NoiseParams np_terrain; NoiseParams np_filler_depth; + NoiseParams np_cavern; NoiseParams np_cave1; NoiseParams np_cave2; NoiseParams np_dungeons; From abfea69e5f68c0f2c946bfcd4444f8cb32e781cf Mon Sep 17 00:00:00 2001 From: Emojigit <55009343+Emojigit@users.noreply.github.com> Date: Fri, 7 Aug 2020 01:30:41 +0800 Subject: [PATCH 017/177] Change `last-login` command to show player name in output (#10263) --- builtin/game/chat.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/builtin/game/chat.lua b/builtin/game/chat.lua index aae811794..8131a6860 100644 --- a/builtin/game/chat.lua +++ b/builtin/game/chat.lua @@ -1070,10 +1070,10 @@ core.register_chatcommand("last-login", { local pauth = core.get_auth_handler().get_auth(param) if pauth and pauth.last_login and pauth.last_login ~= -1 then -- Time in UTC, ISO 8601 format - return true, "Last login time was " .. + return true, param.."'s last login time was " .. os.date("!%Y-%m-%dT%H:%M:%SZ", pauth.last_login) end - return false, "Last login time is unknown" + return false, param.."'s last login time is unknown" end, }) From cd0e213a3640e980e15735f97dd874754f0dc679 Mon Sep 17 00:00:00 2001 From: v-rob Date: Tue, 11 Aug 2020 11:07:17 -0700 Subject: [PATCH 018/177] Add font styling options to tables and textlists (#10203) --- src/gui/guiFormSpecMenu.cpp | 2 ++ src/gui/guiTable.cpp | 27 ++++++++++++++++++++++++++- src/gui/guiTable.h | 6 ++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/gui/guiFormSpecMenu.cpp b/src/gui/guiFormSpecMenu.cpp index 601c5c18e..98392f3c0 100644 --- a/src/gui/guiFormSpecMenu.cpp +++ b/src/gui/guiFormSpecMenu.cpp @@ -1225,6 +1225,7 @@ void GUIFormSpecMenu::parseTable(parserData* data, const std::string &element) auto style = getDefaultStyleForElement("table", name); e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); + e->setOverrideFont(style.getFont()); m_tables.emplace_back(spec, e); m_fields.push_back(spec); @@ -1302,6 +1303,7 @@ void GUIFormSpecMenu::parseTextList(parserData* data, const std::string &element auto style = getDefaultStyleForElement("textlist", name); e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); + e->setOverrideFont(style.getFont()); m_tables.emplace_back(spec, e); m_fields.push_back(spec); diff --git a/src/gui/guiTable.cpp b/src/gui/guiTable.cpp index c705e17fb..cab2e19fd 100644 --- a/src/gui/guiTable.cpp +++ b/src/gui/guiTable.cpp @@ -56,7 +56,7 @@ GUITable::GUITable(gui::IGUIEnvironment *env, m_font = skin->getFont(); if (m_font) { m_font->grab(); - m_rowheight = m_font->getDimension(L"A").Height + 4; + m_rowheight = m_font->getDimension(L"Ay").Height + 4; m_rowheight = MYMAX(m_rowheight, 1); } @@ -586,6 +586,31 @@ void GUITable::setSelected(s32 index) } } +void GUITable::setOverrideFont(IGUIFont *font) +{ + if (m_font == font) + return; + + if (font == nullptr) + font = Environment->getSkin()->getFont(); + + if (m_font) + m_font->drop(); + + m_font = font; + m_font->grab(); + + m_rowheight = m_font->getDimension(L"Ay").Height + 4; + m_rowheight = MYMAX(m_rowheight, 1); + + updateScrollBar(); +} + +IGUIFont *GUITable::getOverrideFont() const +{ + return m_font; +} + GUITable::DynamicData GUITable::getDynamicData() const { DynamicData dyndata; diff --git a/src/gui/guiTable.h b/src/gui/guiTable.h index 11093ea72..76a0e94d0 100644 --- a/src/gui/guiTable.h +++ b/src/gui/guiTable.h @@ -123,6 +123,12 @@ public: // Autoscroll to make the selected row fully visible void setSelected(s32 index); + //! Sets another skin independent font. If this is set to zero, the button uses the font of the skin. + virtual void setOverrideFont(gui::IGUIFont *font = nullptr); + + //! Gets the override font (if any) + virtual gui::IGUIFont *getOverrideFont() const; + /* Get selection, scroll position and opened (sub)trees */ DynamicData getDynamicData() const; From 1c38027c3a72402d752a8150701a44753e22990e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= <34514239+appgurueu@users.noreply.github.com> Date: Wed, 12 Aug 2020 11:51:50 +0200 Subject: [PATCH 019/177] Fix precision not working in hud_change (#10186) --- games/devtest/mods/util_commands/init.lua | 56 +++++++++++++++++++++++ src/hud.cpp | 1 + src/script/common/c_content.cpp | 5 +- 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/games/devtest/mods/util_commands/init.lua b/games/devtest/mods/util_commands/init.lua index 3a0e91a41..f2a155fb2 100644 --- a/games/devtest/mods/util_commands/init.lua +++ b/games/devtest/mods/util_commands/init.lua @@ -112,6 +112,62 @@ minetest.register_chatcommand("detach", { end, }) +-- Use this to test waypoint capabilities +minetest.register_chatcommand("test_waypoints", { + params = "[change_immediate]", + description = "tests waypoint capabilities", + func = function(name, params) + local player = minetest.get_player_by_name(name) + local regular = player:hud_add { + hud_elem_type = "waypoint", + name = "regular waypoint", + text = "m", + number = 0xFF0000, + world_pos = vector.add(player:get_pos(), {x = 0, y = 1.5, z = 0}) + } + local reduced_precision = player:hud_add { + hud_elem_type = "waypoint", + name = "better waypoint", + text = "m (0.5 steps, precision = 2)", + precision = 10, + number = 0xFFFF00, + world_pos = vector.add(player:get_pos(), {x = 0, y = 1, z = 0}) + } + local function change() + if regular then + player:hud_change(regular, "world_pos", vector.add(player:get_pos(), {x = 0, y = 3, z = 0})) + end + if reduced_precision then + player:hud_change(reduced_precision, "precision", 2) + end + end + if params ~= "" then + -- change immediate + change() + else + minetest.after(0.5, change) + end + regular = regular or "error" + reduced_precision = reduced_precision or "error" + local hidden_distance = player:hud_add { + hud_elem_type = "waypoint", + name = "waypoint with hidden distance", + text = "this text is hidden as well (precision = 0)", + precision = 0, + number = 0x0000FF, + world_pos = vector.add(player:get_pos(), {x = 0, y = 0.5, z = 0}) + } or "error" + local image_waypoint = player:hud_add { + hud_elem_type = "image_waypoint", + text = "wieldhand.png", + world_pos = player:get_pos(), + scale = {x = 10, y = 10}, + offset = {x = 0, y = -32} + } or "error" + minetest.chat_send_player(name, "Waypoint IDs: regular: " .. regular .. ", reduced precision: " .. reduced_precision .. + ", hidden distance: " .. hidden_distance .. ", image waypoint: " .. image_waypoint) + end +}) -- Unlimited node placement minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) diff --git a/src/hud.cpp b/src/hud.cpp index 3079b5cd8..4830c56a4 100644 --- a/src/hud.cpp +++ b/src/hud.cpp @@ -40,6 +40,7 @@ const struct EnumString es_HudElementStat[] = {HUD_STAT_TEXT, "text"}, {HUD_STAT_NUMBER, "number"}, {HUD_STAT_ITEM, "item"}, + {HUD_STAT_ITEM, "precision"}, {HUD_STAT_DIR, "direction"}, {HUD_STAT_ALIGN, "alignment"}, {HUD_STAT_OFFSET, "offset"}, diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp index 3dfd7ce61..774b6a326 100644 --- a/src/script/common/c_content.cpp +++ b/src/script/common/c_content.cpp @@ -1959,9 +1959,10 @@ void push_hud_element(lua_State *L, HudElement *elem) HudElementStat read_hud_change(lua_State *L, HudElement *elem, void **value) { HudElementStat stat = HUD_STAT_NUMBER; + std::string statstr; if (lua_isstring(L, 3)) { int statint; - std::string statstr = lua_tostring(L, 3); + statstr = lua_tostring(L, 3); stat = string_to_enum(es_HudElementStat, statint, statstr) ? (HudElementStat)statint : stat; } @@ -1989,6 +1990,8 @@ HudElementStat read_hud_change(lua_State *L, HudElement *elem, void **value) break; case HUD_STAT_ITEM: elem->item = luaL_checknumber(L, 4); + if (elem->type == HUD_ELEM_WAYPOINT && statstr == "precision") + elem->item++; *value = &elem->item; break; case HUD_STAT_DIR: From fff03931871b68e092e12bfce9056f760e8ec9dd Mon Sep 17 00:00:00 2001 From: sfan5 Date: Wed, 12 Aug 2020 11:52:50 +0200 Subject: [PATCH 020/177] Render nodeboxes with opaque material if possible (#10122) --- doc/lua_api.txt | 2 ++ src/nodedef.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++++++--- src/nodedef.h | 12 +++++++++++ 3 files changed, 68 insertions(+), 3 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 8ac3ad7f2..6366a34c3 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -7065,6 +7065,8 @@ Used by `minetest.register_node`. use_texture_alpha = false, -- Use texture's alpha channel + -- If this is set to false, the node will be rendered fully opaque + -- regardless of any texture transparency. palette = "palette.png", -- The node's `param2` is used to select a pixel from the image. diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 82c4581fa..392f5eb98 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -695,9 +695,54 @@ static void fillTileAttribs(ITextureSource *tsrc, TileLayer *layer, } } } -#endif -#ifndef SERVER +bool ContentFeatures::textureAlphaCheck(ITextureSource *tsrc, const TileDef *tiles, int length) +{ + video::IVideoDriver *driver = RenderingEngine::get_video_driver(); + static thread_local bool long_warning_printed = false; + std::set seen; + for (int i = 0; i < length; i++) { + if (seen.find(tiles[i].name) != seen.end()) + continue; + seen.insert(tiles[i].name); + + // Load the texture and see if there's any transparent pixels + video::ITexture *texture = tsrc->getTexture(tiles[i].name); + video::IImage *image = driver->createImage(texture, + core::position2d(0, 0), texture->getOriginalSize()); + if (!image) + continue; + core::dimension2d dim = image->getDimension(); + bool ok = true; + for (u16 x = 0; x < dim.Width; x++) { + for (u16 y = 0; y < dim.Height; y++) { + if (image->getPixel(x, y).getAlpha() < 255) { + ok = false; + goto break_loop; + } + } + } + +break_loop: + image->drop(); + if (!ok) { + warningstream << "Texture \"" << tiles[i].name << "\" of " + << name << " has transparent pixels, assuming " + "use_texture_alpha = true." << std::endl; + if (!long_warning_printed) { + warningstream << " This warning can be a false-positive if " + "unused pixels in the texture are transparent. However if " + "it is meant to be transparent, you *MUST* update the " + "nodedef and set use_texture_alpha = true! This compatibility " + "code will be removed in a few releases." << std::endl; + long_warning_printed = true; + } + return true; + } + } + return false; +} + bool isWorldAligned(AlignStyle style, WorldAlignMode mode, NodeDrawType drawtype) { if (style == ALIGN_STYLE_WORLD) @@ -814,13 +859,19 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc break; case NDT_MESH: case NDT_NODEBOX: + if (alpha == 255 && textureAlphaCheck(tsrc, tdef, 6)) + alpha = 0; + solidness = 0; if (waving == 1) material_type = TILE_MATERIAL_WAVING_PLANTS; else if (waving == 2) material_type = TILE_MATERIAL_WAVING_LEAVES; else if (waving == 3) - material_type = TILE_MATERIAL_WAVING_LIQUID_BASIC; + material_type = (alpha == 255) ? TILE_MATERIAL_WAVING_LIQUID_OPAQUE : + TILE_MATERIAL_WAVING_LIQUID_BASIC; + else if (alpha == 255) + material_type = TILE_MATERIAL_OPAQUE; break; case NDT_TORCHLIKE: case NDT_SIGNLIKE: diff --git a/src/nodedef.h b/src/nodedef.h index d0da367ee..71c56bda9 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -418,6 +418,7 @@ struct ContentFeatures void reset(); void serialize(std::ostream &os, u16 protocol_version) const; void deSerialize(std::istream &is); + /*! * Since vertex alpha is no longer supported, this method * adds opacity directly to the texture pixels. @@ -427,6 +428,17 @@ struct ContentFeatures */ void correctAlpha(TileDef *tiles, int length); +#ifndef SERVER + /* + * Checks if any tile texture has any transparent pixels. + * Prints a warning and returns true if that is the case, false otherwise. + * This is supposed to be used for use_texture_alpha backwards compatibility. + */ + bool textureAlphaCheck(ITextureSource *tsrc, const TileDef *tiles, + int length); +#endif + + /* Some handy methods */ From 291a6b70d674d9003f522b5875a60f7e2753e32b Mon Sep 17 00:00:00 2001 From: ANAND Date: Fri, 5 Jun 2020 18:36:35 +0530 Subject: [PATCH 021/177] Allow binding dig, place actions to keys; remove LMB/RMB hardcoding Co-authored-by: Sam Caulfield --- builtin/settingtypes.txt | 14 ++- doc/client_lua_api.txt | 4 +- doc/lua_api.txt | 24 ++-- src/client/client.cpp | 2 +- src/client/content_cao.cpp | 12 +- src/client/game.cpp | 162 +++++++++++++------------- src/client/inputhandler.cpp | 166 +++++++++++++-------------- src/client/inputhandler.h | 156 +++++++++---------------- src/client/keys.h | 2 + src/defaultsettings.cpp | 4 +- src/network/serverpackethandler.cpp | 23 ++-- src/player.h | 12 +- src/script/lua_api/l_localplayer.cpp | 4 +- src/script/lua_api/l_object.cpp | 9 +- 14 files changed, 284 insertions(+), 310 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 01736f586..3aa113190 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -110,9 +110,9 @@ doubletap_jump (Double tap jump for fly) bool false # enabled. always_fly_fast (Always fly and fast) bool true -# The time in seconds it takes between repeated right clicks when holding the right -# mouse button. -repeat_rightclick_time (Rightclick repetition interval) float 0.25 0.001 +# The time in seconds it takes between repeated node placements when holding +# the place button. +repeat_place_time (Place repetition interval) float 0.25 0.001 # Automatically jump up single-node obstacles. autojump (Automatic jumping) bool false @@ -182,6 +182,14 @@ keymap_jump (Jump key) key KEY_SPACE # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 keymap_sneak (Sneak key) key KEY_LSHIFT +# Key for digging. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +keymap_dig (Dig key) key KEY_LBUTTON + +# Key for placing. +# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 +keymap_place (Place key) key KEY_RBUTTON + # Key for opening the inventory. # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 keymap_inventory (Inventory key) key KEY_KEY_I diff --git a/doc/client_lua_api.txt b/doc/client_lua_api.txt index 3b0046b4f..4c5231b79 100644 --- a/doc/client_lua_api.txt +++ b/doc/client_lua_api.txt @@ -1100,8 +1100,8 @@ Methods: aux1 = boolean, sneak = boolean, zoom = boolean, - LMB = boolean, - RMB = boolean, + dig = boolean, + place = boolean, } ``` diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 6366a34c3..88d99fcd5 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -6163,15 +6163,23 @@ object you are working with still exists. * Only affects formspecs shown after this is called. * `get_formspec_prepend(formspec)`: returns a formspec string. * `get_player_control()`: returns table with player pressed keys - * The table consists of fields with boolean value representing the pressed - keys, the fields are jump, right, left, LMB, RMB, sneak, aux1, down, up, zoom. - * example: `{jump=false, right=true, left=false, LMB=false, RMB=false, - sneak=true, aux1=false, down=false, up=false, zoom=false}` - * The `zoom` field is available since 5.3 + * The table consists of fields with the following boolean values + representing the pressed keys: `up`, `down`, `left`, `right`, `jump`, + `aux1`, `sneak`, `dig`, `place`, `LMB`, `RMB`, and `zoom`. + * The fields `LMB` and `RMB` are equal to `dig` and `place` respectively, + and exist only to preserve backwards compatibility. * `get_player_control_bits()`: returns integer with bit packed player pressed - keys. - * bit nr/meaning: 0/up, 1/down, 2/left, 3/right, 4/jump, 5/aux1, 6/sneak, - 7/LMB, 8/RMB, 9/zoom (zoom available since 5.3) + keys. Bits: + * 0 - up + * 1 - down + * 2 - left + * 3 - right + * 4 - jump + * 5 - aux1 + * 6 - sneak + * 7 - dig + * 8 - place + * 9 - zoom * `set_physics_override(override_table)` * `override_table` is a table with the following fields: * `speed`: multiplier to default walking speed value (default: `1`) diff --git a/src/client/client.cpp b/src/client/client.cpp index 65e5b3d8c..745cce900 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -1307,7 +1307,7 @@ void Client::sendPlayerPos() player->last_pitch == player->getPitch() && player->last_yaw == player->getYaw() && player->last_keyPressed == player->keyPressed && - player->last_camera_fov == camera_fov && + player->last_camera_fov == camera_fov && player->last_wanted_range == wanted_range) return; diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index 88688d18c..599139aa3 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -975,13 +975,13 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) if (controls.sneak && walking) new_speed /= 2; - if (walking && (controls.LMB || controls.RMB)) { + if (walking && (controls.dig || controls.place)) { new_anim = player->local_animations[3]; player->last_animation = WD_ANIM; - } else if(walking) { + } else if (walking) { new_anim = player->local_animations[1]; player->last_animation = WALK_ANIM; - } else if(controls.LMB || controls.RMB) { + } else if (controls.dig || controls.place) { new_anim = player->local_animations[2]; player->last_animation = DIG_ANIM; } @@ -1004,9 +1004,9 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) // Update local player animations if ((player->last_animation != old_anim || - m_animation_speed != old_anim_speed) && - player->last_animation != NO_ANIM && allow_update) - updateAnimation(); + m_animation_speed != old_anim_speed) && + player->last_animation != NO_ANIM && allow_update) + updateAnimation(); } } diff --git a/src/client/game.cpp b/src/client/game.cpp index 20d2c6f90..0d3a0ca15 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -604,7 +604,6 @@ public: #endif /**************************************************************************** - ****************************************************************************/ const float object_hit_delay = 0.2; @@ -625,15 +624,15 @@ struct GameRunData { u16 new_playeritem; PointedThing pointed_old; bool digging; - bool ldown_for_dig; + bool punching; + bool btn_down_for_dig; bool dig_instantly; bool digging_blocked; - bool left_punch; bool reset_jump_timer; float nodig_delay_timer; float dig_time; float dig_time_complete; - float repeat_rightclick_timer; + float repeat_place_timer; float object_hit_delay_timer; float time_from_last_punch; ClientActiveObject *selected_object; @@ -787,6 +786,14 @@ protected: { return input->wasKeyDown(k); } + inline bool wasKeyPressed(GameKeyType k) + { + return input->wasKeyPressed(k); + } + inline bool wasKeyReleased(GameKeyType k) + { + return input->wasKeyReleased(k); + } #ifdef __ANDROID__ void handleAndroidChatInput(); @@ -900,7 +907,7 @@ private: bool m_cache_enable_free_move; f32 m_cache_mouse_sensitivity; f32 m_cache_joystick_frustum_sensitivity; - f32 m_repeat_right_click_time; + f32 m_repeat_place_time; f32 m_cache_cam_smoothing; f32 m_cache_fog_start; @@ -934,7 +941,7 @@ Game::Game() : &settingChangedCallback, this); g_settings->registerChangedCallback("joystick_frustum_sensitivity", &settingChangedCallback, this); - g_settings->registerChangedCallback("repeat_rightclick_time", + g_settings->registerChangedCallback("repeat_place_time", &settingChangedCallback, this); g_settings->registerChangedCallback("noclip", &settingChangedCallback, this); @@ -992,7 +999,7 @@ Game::~Game() &settingChangedCallback, this); g_settings->deregisterChangedCallback("mouse_sensitivity", &settingChangedCallback, this); - g_settings->deregisterChangedCallback("repeat_rightclick_time", + g_settings->deregisterChangedCallback("repeat_place_time", &settingChangedCallback, this); g_settings->deregisterChangedCallback("noclip", &settingChangedCallback, this); @@ -2465,8 +2472,8 @@ void Game::updatePlayerControl(const CameraOrientation &cam) isKeyDown(KeyType::SPECIAL1), isKeyDown(KeyType::SNEAK), isKeyDown(KeyType::ZOOM), - input->getLeftState(), - input->getRightState(), + isKeyDown(KeyType::DIG), + isKeyDown(KeyType::PLACE), cam.camera_pitch, cam.camera_yaw, input->joystick.getAxisWithoutDead(JA_SIDEWARD_MOVE), @@ -2481,8 +2488,8 @@ void Game::updatePlayerControl(const CameraOrientation &cam) ( (u32)(isKeyDown(KeyType::JUMP) & 0x1) << 4) | ( (u32)(isKeyDown(KeyType::SPECIAL1) & 0x1) << 5) | ( (u32)(isKeyDown(KeyType::SNEAK) & 0x1) << 6) | - ( (u32)(input->getLeftState() & 0x1) << 7) | - ( (u32)(input->getRightState() & 0x1) << 8) | + ( (u32)(isKeyDown(KeyType::DIG) & 0x1) << 7) | + ( (u32)(isKeyDown(KeyType::PLACE) & 0x1) << 8) | ( (u32)(isKeyDown(KeyType::ZOOM) & 0x1) << 9) ); @@ -3064,7 +3071,7 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug) PointedThing pointed = updatePointedThing(shootline, selected_def.liquids_pointable, - !runData.ldown_for_dig, + !runData.btn_down_for_dig, camera_offset); if (pointed != runData.pointed_old) { @@ -3072,20 +3079,18 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug) hud->updateSelectionMesh(camera_offset); } - if (runData.digging_blocked && !input->getLeftState()) { - // allow digging again if button is not pressed + // Allow digging again if button is not pressed + if (runData.digging_blocked && !isKeyDown(KeyType::DIG)) runData.digging_blocked = false; - } /* Stop digging when - - releasing left mouse button + - releasing dig button - pointing away from node */ if (runData.digging) { - if (input->getLeftReleased()) { - infostream << "Left button released" - << " (stopped digging)" << std::endl; + if (wasKeyReleased(KeyType::DIG)) { + infostream << "Dig button released (stopped digging)" << std::endl; runData.digging = false; } else if (pointed != runData.pointed_old) { if (pointed.type == POINTEDTHING_NODE @@ -3095,8 +3100,7 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug) // Still pointing to the same node, but a different face. // Don't reset. } else { - infostream << "Pointing away from node" - << " (stopped digging)" << std::endl; + infostream << "Pointing away from node (stopped digging)" << std::endl; runData.digging = false; hud->updateSelectionMesh(camera_offset); } @@ -3107,55 +3111,57 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug) client->setCrack(-1, v3s16(0, 0, 0)); runData.dig_time = 0.0; } - } else if (runData.dig_instantly && input->getLeftReleased()) { - // Remove e.g. torches faster when clicking instead of holding LMB + } else if (runData.dig_instantly && wasKeyReleased(KeyType::DIG)) { + // Remove e.g. torches faster when clicking instead of holding dig button runData.nodig_delay_timer = 0; runData.dig_instantly = false; } - if (!runData.digging && runData.ldown_for_dig && !input->getLeftState()) { - runData.ldown_for_dig = false; - } + if (!runData.digging && runData.btn_down_for_dig && !isKeyDown(KeyType::DIG)) + runData.btn_down_for_dig = false; - runData.left_punch = false; + runData.punching = false; soundmaker->m_player_leftpunch_sound.name = ""; // Prepare for repeating, unless we're not supposed to - if (input->getRightState() && !g_settings->getBool("safe_dig_and_place")) - runData.repeat_rightclick_timer += dtime; + if (isKeyDown(KeyType::PLACE) && !g_settings->getBool("safe_dig_and_place")) + runData.repeat_place_timer += dtime; else - runData.repeat_rightclick_timer = 0; + runData.repeat_place_timer = 0; - if (selected_def.usable && input->getLeftState()) { - if (input->getLeftClicked() && (!client->modsLoaded() - || !client->getScript()->on_item_use(selected_item, pointed))) + if (selected_def.usable && isKeyDown(KeyType::DIG)) { + if (wasKeyPressed(KeyType::DIG) && (!client->modsLoaded() || + !client->getScript()->on_item_use(selected_item, pointed))) client->interact(INTERACT_USE, pointed); } else if (pointed.type == POINTEDTHING_NODE) { handlePointingAtNode(pointed, selected_item, hand_item, dtime); } else if (pointed.type == POINTEDTHING_OBJECT) { v3f player_position = player->getPosition(); handlePointingAtObject(pointed, tool_item, player_position, show_debug); - } else if (input->getLeftState()) { + } else if (isKeyDown(KeyType::DIG)) { // When button is held down in air, show continuous animation - runData.left_punch = true; + runData.punching = true; // Run callback even though item is not usable - if (input->getLeftClicked() && client->modsLoaded()) + if (wasKeyPressed(KeyType::DIG) && client->modsLoaded()) client->getScript()->on_item_use(selected_item, pointed); - } else if (input->getRightClicked()) { + } else if (wasKeyPressed(KeyType::PLACE)) { handlePointingAtNothing(selected_item); } runData.pointed_old = pointed; - if (runData.left_punch || input->getLeftClicked()) - camera->setDigging(0); // left click animation + if (runData.punching || wasKeyPressed(KeyType::DIG)) + camera->setDigging(0); // dig animation - input->resetLeftClicked(); - input->resetRightClicked(); + input->clearWasKeyPressed(); + input->clearWasKeyReleased(); - input->resetLeftReleased(); - input->resetRightReleased(); + input->joystick.clearWasKeyDown(KeyType::MOUSE_L); + input->joystick.clearWasKeyDown(KeyType::MOUSE_R); + + input->joystick.clearWasKeyReleased(KeyType::MOUSE_L); + input->joystick.clearWasKeyReleased(KeyType::MOUSE_R); } @@ -3255,7 +3261,7 @@ PointedThing Game::updatePointedThing( void Game::handlePointingAtNothing(const ItemStack &playerItem) { - infostream << "Right Clicked in Air" << std::endl; + infostream << "Attempted to place item while pointing at nothing" << std::endl; PointedThing fauxPointed; fauxPointed.type = POINTEDTHING_NOTHING; client->interact(INTERACT_ACTIVATE, fauxPointed); @@ -3274,7 +3280,7 @@ void Game::handlePointingAtNode(const PointedThing &pointed, ClientMap &map = client->getEnv().getClientMap(); - if (runData.nodig_delay_timer <= 0.0 && input->getLeftState() + if (runData.nodig_delay_timer <= 0.0 && isKeyDown(KeyType::DIG) && !runData.digging_blocked && client->checkPrivilege("interact")) { handleDigging(pointed, nodepos, selected_item, hand_item, dtime); @@ -3295,13 +3301,14 @@ void Game::handlePointingAtNode(const PointedThing &pointed, } } - if ((input->getRightClicked() || - runData.repeat_rightclick_timer >= m_repeat_right_click_time) && + if ((wasKeyPressed(KeyType::PLACE) || + runData.repeat_place_timer >= m_repeat_place_time) && client->checkPrivilege("interact")) { - runData.repeat_rightclick_timer = 0; - infostream << "Ground right-clicked" << std::endl; + runData.repeat_place_timer = 0; + infostream << "Place button pressed while looking at ground" << std::endl; - camera->setDigging(1); // right click animation (always shown for feedback) + // Placing animation (always shown for feedback) + camera->setDigging(1); soundmaker->m_player_rightpunch_sound = SimpleSoundSpec(); @@ -3367,8 +3374,7 @@ bool Game::nodePlacement(const ItemDefinition &selected_def, } verbosestream << "Node placement prediction for " - << selected_def.name << " is " - << prediction << std::endl; + << selected_def.name << " is " << prediction << std::endl; v3s16 p = neighbourpos; // Place inside node itself if buildable_to @@ -3529,7 +3535,7 @@ void Game::handlePointingAtObject(const PointedThing &pointed, m_game_ui->setInfoText(infotext); - if (input->getLeftState()) { + if (isKeyDown(KeyType::DIG)) { bool do_punch = false; bool do_punch_damage = false; @@ -3539,12 +3545,12 @@ void Game::handlePointingAtObject(const PointedThing &pointed, runData.object_hit_delay_timer = object_hit_delay; } - if (input->getLeftClicked()) + if (wasKeyPressed(KeyType::DIG)) do_punch = true; if (do_punch) { - infostream << "Left-clicked object" << std::endl; - runData.left_punch = true; + infostream << "Punched object" << std::endl; + runData.punching = true; } if (do_punch_damage) { @@ -3559,8 +3565,8 @@ void Game::handlePointingAtObject(const PointedThing &pointed, if (!disable_send) client->interact(INTERACT_START_DIGGING, pointed); } - } else if (input->getRightClicked()) { - infostream << "Right-clicked object" << std::endl; + } else if (wasKeyDown(KeyType::PLACE)) { + infostream << "Pressed place button while pointing at object" << std::endl; client->interact(INTERACT_PLACE, pointed); // place } } @@ -3606,7 +3612,7 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos, return; client->interact(INTERACT_START_DIGGING, pointed); runData.digging = true; - runData.ldown_for_dig = true; + runData.btn_down_for_dig = true; } if (!runData.dig_instantly) { @@ -3700,7 +3706,7 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos, client->setCrack(-1, nodepos); } - camera->setDigging(0); // left click animation + camera->setDigging(0); // Dig animation } @@ -4039,7 +4045,7 @@ void Game::readSettings() m_cache_enable_fog = g_settings->getBool("enable_fog"); m_cache_mouse_sensitivity = g_settings->getFloat("mouse_sensitivity"); m_cache_joystick_frustum_sensitivity = g_settings->getFloat("joystick_frustum_sensitivity"); - m_repeat_right_click_time = g_settings->getFloat("repeat_rightclick_time"); + m_repeat_place_time = g_settings->getFloat("repeat_place_time"); m_cache_enable_noclip = g_settings->getBool("noclip"); m_cache_enable_free_move = g_settings->getBool("free_move"); @@ -4131,30 +4137,32 @@ void Game::showPauseMenu() "- %s: move backwards\n" "- %s: move left\n" "- %s: move right\n" - "- %s: jump/climb\n" - "- %s: sneak/go down\n" + "- %s: jump/climb up\n" + "- %s: dig/punch\n" + "- %s: place/use\n" + "- %s: sneak/climb down\n" "- %s: drop item\n" "- %s: inventory\n" "- Mouse: turn/look\n" - "- Mouse left: dig/punch\n" - "- Mouse right: place/use\n" "- Mouse wheel: select item\n" "- %s: chat\n" ); - char control_text_buf[600]; + char control_text_buf[600]; - porting::mt_snprintf(control_text_buf, sizeof(control_text_buf), control_text_template.c_str(), - GET_KEY_NAME(keymap_forward), - GET_KEY_NAME(keymap_backward), - GET_KEY_NAME(keymap_left), - GET_KEY_NAME(keymap_right), - GET_KEY_NAME(keymap_jump), - GET_KEY_NAME(keymap_sneak), - GET_KEY_NAME(keymap_drop), - GET_KEY_NAME(keymap_inventory), - GET_KEY_NAME(keymap_chat) - ); + porting::mt_snprintf(control_text_buf, sizeof(control_text_buf), control_text_template.c_str(), + GET_KEY_NAME(keymap_forward), + GET_KEY_NAME(keymap_backward), + GET_KEY_NAME(keymap_left), + GET_KEY_NAME(keymap_right), + GET_KEY_NAME(keymap_jump), + GET_KEY_NAME(keymap_dig), + GET_KEY_NAME(keymap_place), + GET_KEY_NAME(keymap_sneak), + GET_KEY_NAME(keymap_drop), + GET_KEY_NAME(keymap_inventory), + GET_KEY_NAME(keymap_chat) + ); std::string control_text = std::string(control_text_buf); str_formspec_escape(control_text); diff --git a/src/client/inputhandler.cpp b/src/client/inputhandler.cpp index a79b04a90..608a405a8 100644 --- a/src/client/inputhandler.cpp +++ b/src/client/inputhandler.cpp @@ -37,6 +37,8 @@ void KeyCache::populate() key[KeyType::JUMP] = getKeySetting("keymap_jump"); key[KeyType::SPECIAL1] = getKeySetting("keymap_special1"); key[KeyType::SNEAK] = getKeySetting("keymap_sneak"); + key[KeyType::DIG] = getKeySetting("keymap_dig"); + key[KeyType::PLACE] = getKeySetting("keymap_place"); key[KeyType::AUTOFORWARD] = getKeySetting("keymap_autoforward"); @@ -111,57 +113,81 @@ bool MyEventReceiver::OnEvent(const SEvent &event) if (event.EventType == irr::EET_KEY_INPUT_EVENT) { const KeyPress &keyCode = event.KeyInput; if (keysListenedFor[keyCode]) { + // If the key is being held down then the OS may + // send a continuous stream of keydown events. + // In this case, we don't want to let this + // stream reach the application as it will cause + // certain actions to repeat constantly. if (event.KeyInput.PressedDown) { + if (!IsKeyDown(keyCode)) { + keyWasDown.set(keyCode); + keyWasPressed.set(keyCode); + } keyIsDown.set(keyCode); - keyWasDown.set(keyCode); } else { + if (IsKeyDown(keyCode)) + keyWasReleased.set(keyCode); + keyIsDown.unset(keyCode); } + return true; } - } #ifdef HAVE_TOUCHSCREENGUI - // case of touchscreengui we have to handle different events - if (m_touchscreengui && event.EventType == irr::EET_TOUCH_INPUT_EVENT) { + } else if (m_touchscreengui && event.EventType == irr::EET_TOUCH_INPUT_EVENT) { + // In case of touchscreengui, we have to handle different events m_touchscreengui->translateEvent(event); return true; - } #endif - if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT) { + } else if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT) { /* TODO add a check like: if (event.JoystickEvent != joystick_we_listen_for) return false; */ return joystick->handleEvent(event.JoystickEvent); - } - // handle mouse events - if (event.EventType == irr::EET_MOUSE_INPUT_EVENT) { - if (isMenuActive()) { - left_active = false; - middle_active = false; - right_active = false; - } else { - left_active = event.MouseInput.isLeftPressed(); - middle_active = event.MouseInput.isMiddlePressed(); - right_active = event.MouseInput.isRightPressed(); - - if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) { - leftclicked = true; - } - if (event.MouseInput.Event == EMIE_RMOUSE_PRESSED_DOWN) { - rightclicked = true; - } - if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP) { - leftreleased = true; - } - if (event.MouseInput.Event == EMIE_RMOUSE_LEFT_UP) { - rightreleased = true; - } - if (event.MouseInput.Event == EMIE_MOUSE_WHEEL) { - mouse_wheel += event.MouseInput.Wheel; - } + } else if (event.EventType == irr::EET_MOUSE_INPUT_EVENT) { + // Handle mouse events + KeyPress key; + switch (event.MouseInput.Event) { + case EMIE_LMOUSE_PRESSED_DOWN: + key = "KEY_LBUTTON"; + keyIsDown.set(key); + keyWasDown.set(key); + keyWasPressed.set(key); + break; + case EMIE_MMOUSE_PRESSED_DOWN: + key = "KEY_MBUTTON"; + keyIsDown.set(key); + keyWasDown.set(key); + keyWasPressed.set(key); + break; + case EMIE_RMOUSE_PRESSED_DOWN: + key = "KEY_RBUTTON"; + keyIsDown.set(key); + keyWasDown.set(key); + keyWasPressed.set(key); + break; + case EMIE_LMOUSE_LEFT_UP: + key = "KEY_LBUTTON"; + keyIsDown.unset(key); + keyWasReleased.set(key); + break; + case EMIE_MMOUSE_LEFT_UP: + key = "KEY_MBUTTON"; + keyIsDown.unset(key); + keyWasReleased.set(key); + break; + case EMIE_RMOUSE_LEFT_UP: + key = "KEY_RBUTTON"; + keyIsDown.unset(key); + keyWasReleased.set(key); + break; + case EMIE_MOUSE_WHEEL: + mouse_wheel += event.MouseInput.Wheel; + break; + default: break; } } else if (event.EventType == irr::EET_LOG_TEXT_EVENT) { static const LogLevel irr_loglev_conv[] = { @@ -188,38 +214,28 @@ s32 RandomInputHandler::Rand(s32 min, s32 max) return (myrand() % (max - min + 1)) + min; } +struct RandomInputHandlerSimData { + std::string key; + float counter; + int time_max; +}; + void RandomInputHandler::step(float dtime) { - { - static float counter1 = 0; - counter1 -= dtime; - if (counter1 < 0.0) { - counter1 = 0.1 * Rand(1, 40); - keydown.toggle(getKeySetting("keymap_jump")); - } - } - { - static float counter1 = 0; - counter1 -= dtime; - if (counter1 < 0.0) { - counter1 = 0.1 * Rand(1, 40); - keydown.toggle(getKeySetting("keymap_special1")); - } - } - { - static float counter1 = 0; - counter1 -= dtime; - if (counter1 < 0.0) { - counter1 = 0.1 * Rand(1, 40); - keydown.toggle(getKeySetting("keymap_forward")); - } - } - { - static float counter1 = 0; - counter1 -= dtime; - if (counter1 < 0.0) { - counter1 = 0.1 * Rand(1, 40); - keydown.toggle(getKeySetting("keymap_left")); + static RandomInputHandlerSimData rnd_data[] = { + { "keymap_jump", 0.0f, 40 }, + { "keymap_special1", 0.0f, 40 }, + { "keymap_forward", 0.0f, 40 }, + { "keymap_left", 0.0f, 40 }, + { "keymap_dig", 0.0f, 30 }, + { "keymap_place", 0.0f, 15 } + }; + + for (auto &i : rnd_data) { + i.counter -= dtime; + if (i.counter < 0.0) { + i.counter = 0.1 * Rand(1, i.time_max); + keydown.toggle(getKeySetting(i.key.c_str())); } } { @@ -230,29 +246,5 @@ void RandomInputHandler::step(float dtime) mousespeed = v2s32(Rand(-20, 20), Rand(-15, 20)); } } - { - static float counter1 = 0; - counter1 -= dtime; - if (counter1 < 0.0) { - counter1 = 0.1 * Rand(1, 30); - leftdown = !leftdown; - if (leftdown) - leftclicked = true; - if (!leftdown) - leftreleased = true; - } - } - { - static float counter1 = 0; - counter1 -= dtime; - if (counter1 < 0.0) { - counter1 = 0.1 * Rand(1, 15); - rightdown = !rightdown; - if (rightdown) - rightclicked = true; - if (!rightdown) - rightreleased = true; - } - } mousepos += mousespeed; } diff --git a/src/client/inputhandler.h b/src/client/inputhandler.h index fc7998f20..def147a82 100644 --- a/src/client/inputhandler.h +++ b/src/client/inputhandler.h @@ -144,6 +144,14 @@ public: return b; } + // Checks whether a key was just pressed. State will be cleared + // in the subsequent iteration of Game::processPlayerInteraction + bool WasKeyPressed(const KeyPress &keycode) const { return keyWasPressed[keycode]; } + + // Checks whether a key was just released. State will be cleared + // in the subsequent iteration of Game::processPlayerInteraction + bool WasKeyReleased(const KeyPress &keycode) const { return keyWasReleased[keycode]; } + void listenForKey(const KeyPress &keyCode) { keysListenedFor.set(keyCode); } void dontListenForKeys() { keysListenedFor.clear(); } @@ -158,19 +166,22 @@ public: { keyIsDown.clear(); keyWasDown.clear(); - - leftclicked = false; - rightclicked = false; - leftreleased = false; - rightreleased = false; - - left_active = false; - middle_active = false; - right_active = false; + keyWasPressed.clear(); + keyWasReleased.clear(); mouse_wheel = 0; } + void clearWasKeyPressed() + { + keyWasPressed.clear(); + } + + void clearWasKeyReleased() + { + keyWasReleased.clear(); + } + MyEventReceiver() { #ifdef HAVE_TOUCHSCREENGUI @@ -178,15 +189,6 @@ public: #endif } - bool leftclicked = false; - bool rightclicked = false; - bool leftreleased = false; - bool rightreleased = false; - - bool left_active = false; - bool middle_active = false; - bool right_active = false; - s32 mouse_wheel = 0; JoystickController *joystick = nullptr; @@ -198,8 +200,16 @@ public: private: // The current state of keys KeyList keyIsDown; - // Whether a key has been pressed or not + + // Whether a key was down KeyList keyWasDown; + + // Whether a key has just been pressed + KeyList keyWasPressed; + + // Whether a key has just been released + KeyList keyWasReleased; + // List of keys we listen for // TODO perhaps the type of this is not really // performant as KeyList is designed for few but @@ -226,27 +236,19 @@ public: virtual bool isKeyDown(GameKeyType k) = 0; virtual bool wasKeyDown(GameKeyType k) = 0; + virtual bool wasKeyPressed(GameKeyType k) = 0; + virtual bool wasKeyReleased(GameKeyType k) = 0; virtual bool cancelPressed() = 0; + virtual void clearWasKeyPressed() {} + virtual void clearWasKeyReleased() {} + virtual void listenForKey(const KeyPress &keyCode) {} virtual void dontListenForKeys() {} virtual v2s32 getMousePos() = 0; virtual void setMousePos(s32 x, s32 y) = 0; - virtual bool getLeftState() = 0; - virtual bool getRightState() = 0; - - virtual bool getLeftClicked() = 0; - virtual bool getRightClicked() = 0; - virtual void resetLeftClicked() = 0; - virtual void resetRightClicked() = 0; - - virtual bool getLeftReleased() = 0; - virtual bool getRightReleased() = 0; - virtual void resetLeftReleased() = 0; - virtual void resetRightReleased() = 0; - virtual s32 getMouseWheel() = 0; virtual void step(float dtime) {} @@ -275,10 +277,26 @@ public: { return m_receiver->WasKeyDown(keycache.key[k]) || joystick.wasKeyDown(k); } + virtual bool wasKeyPressed(GameKeyType k) + { + return m_receiver->WasKeyPressed(keycache.key[k]) || joystick.wasKeyReleased(k); + } + virtual bool wasKeyReleased(GameKeyType k) + { + return m_receiver->WasKeyReleased(keycache.key[k]) || joystick.wasKeyReleased(k); + } virtual bool cancelPressed() { return wasKeyDown(KeyType::ESC) || m_receiver->WasKeyDown(CancelKey); } + virtual void clearWasKeyPressed() + { + m_receiver->clearWasKeyPressed(); + } + virtual void clearWasKeyReleased() + { + m_receiver->clearWasKeyReleased(); + } virtual void listenForKey(const KeyPress &keyCode) { m_receiver->listenForKey(keyCode); @@ -306,59 +324,6 @@ public: } } - virtual bool getLeftState() - { - return m_receiver->left_active || joystick.isKeyDown(KeyType::MOUSE_L); - } - virtual bool getRightState() - { - return m_receiver->right_active || joystick.isKeyDown(KeyType::MOUSE_R); - } - - virtual bool getLeftClicked() - { - return m_receiver->leftclicked || - joystick.getWasKeyDown(KeyType::MOUSE_L); - } - virtual bool getRightClicked() - { - return m_receiver->rightclicked || - joystick.getWasKeyDown(KeyType::MOUSE_R); - } - - virtual void resetLeftClicked() - { - m_receiver->leftclicked = false; - joystick.clearWasKeyDown(KeyType::MOUSE_L); - } - virtual void resetRightClicked() - { - m_receiver->rightclicked = false; - joystick.clearWasKeyDown(KeyType::MOUSE_R); - } - - virtual bool getLeftReleased() - { - return m_receiver->leftreleased || - joystick.wasKeyReleased(KeyType::MOUSE_L); - } - virtual bool getRightReleased() - { - return m_receiver->rightreleased || - joystick.wasKeyReleased(KeyType::MOUSE_R); - } - - virtual void resetLeftReleased() - { - m_receiver->leftreleased = false; - joystick.clearWasKeyReleased(KeyType::MOUSE_L); - } - virtual void resetRightReleased() - { - m_receiver->rightreleased = false; - joystick.clearWasKeyReleased(KeyType::MOUSE_R); - } - virtual s32 getMouseWheel() { return m_receiver->getMouseWheel(); } void clear() @@ -384,23 +349,12 @@ public: virtual bool isKeyDown(GameKeyType k) { return keydown[keycache.key[k]]; } virtual bool wasKeyDown(GameKeyType k) { return false; } + virtual bool wasKeyPressed(GameKeyType k) { return false; } + virtual bool wasKeyReleased(GameKeyType k) { return false; } virtual bool cancelPressed() { return false; } virtual v2s32 getMousePos() { return mousepos; } virtual void setMousePos(s32 x, s32 y) { mousepos = v2s32(x, y); } - virtual bool getLeftState() { return leftdown; } - virtual bool getRightState() { return rightdown; } - - virtual bool getLeftClicked() { return leftclicked; } - virtual bool getRightClicked() { return rightclicked; } - virtual void resetLeftClicked() { leftclicked = false; } - virtual void resetRightClicked() { rightclicked = false; } - - virtual bool getLeftReleased() { return leftreleased; } - virtual bool getRightReleased() { return rightreleased; } - virtual void resetLeftReleased() { leftreleased = false; } - virtual void resetRightReleased() { rightreleased = false; } - virtual s32 getMouseWheel() { return 0; } virtual void step(float dtime); @@ -411,10 +365,4 @@ private: KeyList keydown; v2s32 mousepos; v2s32 mousespeed; - bool leftdown = false; - bool rightdown = false; - bool leftclicked = false; - bool rightclicked = false; - bool leftreleased = false; - bool rightreleased = false; }; diff --git a/src/client/keys.h b/src/client/keys.h index 50d3d194b..b6ce59b4a 100644 --- a/src/client/keys.h +++ b/src/client/keys.h @@ -35,6 +35,8 @@ public: SPECIAL1, SNEAK, AUTOFORWARD, + DIG, + PLACE, ESC, diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 07bf0ebb8..103f0fb02 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -73,6 +73,8 @@ void set_default_settings(Settings *settings) settings->setDefault("keymap_right", "KEY_KEY_D"); settings->setDefault("keymap_jump", "KEY_SPACE"); settings->setDefault("keymap_sneak", "KEY_LSHIFT"); + settings->setDefault("keymap_dig", "KEY_LBUTTON"); + settings->setDefault("keymap_place", "KEY_RBUTTON"); settings->setDefault("keymap_drop", "KEY_KEY_Q"); settings->setDefault("keymap_zoom", "KEY_KEY_Z"); settings->setDefault("keymap_inventory", "KEY_KEY_I"); @@ -269,7 +271,7 @@ void set_default_settings(Settings *settings) // Input settings->setDefault("invert_mouse", "false"); settings->setDefault("mouse_sensitivity", "0.2"); - settings->setDefault("repeat_rightclick_time", "0.25"); + settings->setDefault("repeat_place_time", "0.25"); settings->setDefault("safe_dig_and_place", "false"); settings->setDefault("random_input", "false"); settings->setDefault("aux1_descends", "false"); diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index b3008bb50..dcbb114bf 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -491,17 +491,18 @@ void Server::process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao, playersao->setPlayerYaw(yaw); playersao->setFov(fov); playersao->setWantedRange(wanted_range); + player->keyPressed = keyPressed; - player->control.up = (keyPressed & 1); - player->control.down = (keyPressed & 2); - player->control.left = (keyPressed & 4); - player->control.right = (keyPressed & 8); - player->control.jump = (keyPressed & 16); - player->control.aux1 = (keyPressed & 32); - player->control.sneak = (keyPressed & 64); - player->control.LMB = (keyPressed & 128); - player->control.RMB = (keyPressed & 256); - player->control.zoom = (keyPressed & 512); + player->control.up = (keyPressed & (0x1 << 0)); + player->control.down = (keyPressed & (0x1 << 1)); + player->control.left = (keyPressed & (0x1 << 2)); + player->control.right = (keyPressed & (0x1 << 3)); + player->control.jump = (keyPressed & (0x1 << 4)); + player->control.aux1 = (keyPressed & (0x1 << 5)); + player->control.sneak = (keyPressed & (0x1 << 6)); + player->control.dig = (keyPressed & (0x1 << 7)); + player->control.place = (keyPressed & (0x1 << 8)); + player->control.zoom = (keyPressed & (0x1 << 9)); if (playersao->checkMovementCheat()) { // Call callbacks @@ -1670,7 +1671,7 @@ void Server::handleCommand_SrpBytesM(NetworkPacket* pkt) if (client->chosen_mech != AUTH_MECHANISM_SRP && client->chosen_mech != AUTH_MECHANISM_LEGACY_PASSWORD) { actionstream << "Server: got SRP _M packet, while auth" - << "is going on with mech " << client->chosen_mech << " from " + << "is going on with mech " << client->chosen_mech << " from " << addr_s << " (wantSudo=" << wantSudo << "). Denying." << std::endl; if (wantSudo) { DenySudoAccess(peer_id); diff --git a/src/player.h b/src/player.h index 3bc7762fa..ec068a8b1 100644 --- a/src/player.h +++ b/src/player.h @@ -57,8 +57,8 @@ struct PlayerControl bool a_aux1, bool a_sneak, bool a_zoom, - bool a_LMB, - bool a_RMB, + bool a_dig, + bool a_place, float a_pitch, float a_yaw, float a_sidew_move_joystick_axis, @@ -73,8 +73,8 @@ struct PlayerControl aux1 = a_aux1; sneak = a_sneak; zoom = a_zoom; - LMB = a_LMB; - RMB = a_RMB; + dig = a_dig; + place = a_place; pitch = a_pitch; yaw = a_yaw; sidew_move_joystick_axis = a_sidew_move_joystick_axis; @@ -88,8 +88,8 @@ struct PlayerControl bool aux1 = false; bool sneak = false; bool zoom = false; - bool LMB = false; - bool RMB = false; + bool dig = false; + bool place = false; float pitch = 0.0f; float yaw = 0.0f; float sidew_move_joystick_axis = 0.0f; diff --git a/src/script/lua_api/l_localplayer.cpp b/src/script/lua_api/l_localplayer.cpp index 851ede535..33fa27c8b 100644 --- a/src/script/lua_api/l_localplayer.cpp +++ b/src/script/lua_api/l_localplayer.cpp @@ -231,8 +231,8 @@ int LuaLocalPlayer::l_get_control(lua_State *L) set("aux1", c.aux1); set("sneak", c.sneak); set("zoom", c.zoom); - set("LMB", c.LMB); - set("RMB", c.RMB); + set("dig", c.dig); + set("place", c.place); return 1; } diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index e7394133a..495d8bced 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -1455,9 +1455,14 @@ int ObjectRef::l_get_player_control(lua_State *L) lua_setfield(L, -2, "aux1"); lua_pushboolean(L, control.sneak); lua_setfield(L, -2, "sneak"); - lua_pushboolean(L, control.LMB); + lua_pushboolean(L, control.dig); + lua_setfield(L, -2, "dig"); + lua_pushboolean(L, control.place); + lua_setfield(L, -2, "place"); + // Legacy fields to ensure mod compatibility + lua_pushboolean(L, control.dig); lua_setfield(L, -2, "LMB"); - lua_pushboolean(L, control.RMB); + lua_pushboolean(L, control.place); lua_setfield(L, -2, "RMB"); lua_pushboolean(L, control.zoom); lua_setfield(L, -2, "zoom"); From 7242de1d4bdb4cc98fce723044b2c8c5d9861c8b Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Mon, 17 Aug 2020 19:09:33 +0100 Subject: [PATCH 022/177] ContentDB: Add Update All and download queuing (#9995) --- builtin/mainmenu/dlg_contentstore.lua | 91 ++++++++++++++++++++++++--- builtin/settingtypes.txt | 3 + src/defaultsettings.cpp | 2 + 3 files changed, 86 insertions(+), 10 deletions(-) diff --git a/builtin/mainmenu/dlg_contentstore.lua b/builtin/mainmenu/dlg_contentstore.lua index 37ceeb6c8..6525f6013 100644 --- a/builtin/mainmenu/dlg_contentstore.lua +++ b/builtin/mainmenu/dlg_contentstore.lua @@ -45,6 +45,9 @@ local filter_types_titles = { fgettext("Texture packs"), } +local number_downloading = 0 +local download_queue = {} + local filter_types_type = { nil, "game", @@ -67,12 +70,14 @@ local function download_package(param) end end -local function start_install(calling_dialog, package) +local function start_install(package) local params = { package = package, filename = os.tempfolder() .. "_MODNAME_" .. package.name .. ".zip", } + number_downloading = number_downloading + 1 + local function callback(result) if result.successful then local path, msg = pkgmgr.install(package.type, @@ -121,9 +126,20 @@ local function start_install(calling_dialog, package) end package.downloading = false + + number_downloading = number_downloading - 1 + + local next = download_queue[1] + if next then + table.remove(download_queue, 1) + + start_install(next) + end + ui.update() end + package.queued = false package.downloading = true if not core.handle_async(download_package, params, callback) then @@ -133,6 +149,16 @@ local function start_install(calling_dialog, package) end end +local function queue_download(package) + local max_concurrent_downloads = tonumber(minetest.settings:get("contentdb_max_concurrent_downloads")) + if number_downloading < max_concurrent_downloads then + start_install(package) + else + table.insert(download_queue, package) + package.queued = true + end +end + local function get_file_extension(path) local parts = path:split(".") return parts[#parts] @@ -279,7 +305,7 @@ function store.filter_packages(query) table.insert(keywords, word) end - local function matches_keywords(package, keywords) + local function matches_keywords(package) for k = 1, #keywords do local keyword = keywords[k] @@ -296,7 +322,7 @@ function store.filter_packages(query) store.packages = {} for _, package in pairs(store.packages_full) do - if (query == "" or matches_keywords(package, keywords)) and + if (query == "" or matches_keywords(package)) and (filter_type == 1 or package.type == filter_types_type[filter_type]) then store.packages[#store.packages + 1] = package end @@ -321,11 +347,14 @@ function store.get_formspec(dlgdata) "formspec_version[3]", "size[15.75,9.5]", "position[0.5,0.55]", + + "style[status;border=false]", + "container[0.375,0.375]", - "field[0,0;10.225,0.8;search_string;;", core.formspec_escape(search_string), "]", + "field[0,0;7.225,0.8;search_string;;", core.formspec_escape(search_string), "]", "field_close_on_enter[search_string;false]", - "button[10.225,0;2,0.8;search;", fgettext("Search"), "]", - "dropdown[12.6,0;2.4,0.8;type;", table.concat(filter_types_titles, ","), ";", filter_type, "]", + "button[7.225,0;2,0.8;search;", fgettext("Search"), "]", + "dropdown[9.6,0;2.4,0.8;type;", table.concat(filter_types_titles, ","), ";", filter_type, "]", "container_end[]", -- Page nav buttons @@ -344,6 +373,35 @@ function store.get_formspec(dlgdata) "container_end[]", } + if number_downloading > 0 then + formspec[#formspec + 1] = "button[12.75,0.375;2.625,0.8;status;" + if #download_queue > 0 then + formspec[#formspec + 1] = fgettext("$1 downloading,\n$2 queued", number_downloading, #download_queue) + else + formspec[#formspec + 1] = fgettext("$1 downloading...", number_downloading) + end + formspec[#formspec + 1] = "]" + else + local num_avail_updates = 0 + for i=1, #store.packages_full do + local package = store.packages_full[i] + if package.path and package.installed_release < package.release and + not (package.downloading or package.queued) then + num_avail_updates = num_avail_updates + 1 + end + end + + if num_avail_updates == 0 then + formspec[#formspec + 1] = "button[12.75,0.375;2.625,0.8;status;" + formspec[#formspec + 1] = fgettext("No updates") + formspec[#formspec + 1] = "]" + else + formspec[#formspec + 1] = "button[12.75,0.375;2.625,0.8;update_all;" + formspec[#formspec + 1] = fgettext("Update All [$1]", num_avail_updates) + formspec[#formspec + 1] = "]" + end + end + if #store.packages == 0 then formspec[#formspec + 1] = "label[4,3;" formspec[#formspec + 1] = fgettext("No results") @@ -386,11 +444,13 @@ function store.get_formspec(dlgdata) formspec[#formspec + 1] = ",0.1]" if package.downloading then - formspec[#formspec + 1] = "style[download;border=false]" - - formspec[#formspec + 1] = "button[-3.5,0;2,0.8;download;" + formspec[#formspec + 1] = "button[-3.5,0;2,0.8;status;" formspec[#formspec + 1] = fgettext("Downloading...") formspec[#formspec + 1] = "]" + elseif package.queued then + formspec[#formspec + 1] = "button[-3.5,0;2,0.8;status;" + formspec[#formspec + 1] = fgettext("Queued") + formspec[#formspec + 1] = "]" elseif not package.path then formspec[#formspec + 1] = "button[-3,0;1.5,0.8;install_" formspec[#formspec + 1] = tostring(i) @@ -485,6 +545,17 @@ function store.handle_submit(this, fields) end end + if fields.update_all then + for i=1, #store.packages_full do + local package = store.packages_full[i] + if package.path and package.installed_release < package.release and + not (package.downloading or package.queued) then + queue_download(package) + end + end + return true + end + local start_idx = (cur_page - 1) * num_per_page + 1 assert(start_idx ~= nil) for i=start_idx, math.min(#store.packages, start_idx+num_per_page-1) do @@ -492,7 +563,7 @@ function store.handle_submit(this, fields) assert(package) if fields["install_" .. i] then - start_install(this, package) + queue_download(package) return true end diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 3aa113190..1f71e4cb9 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -2220,3 +2220,6 @@ contentdb_url (ContentDB URL) string https://content.minetest.net # These flags are independent from Minetest versions, # so see a full list at https://content.minetest.net/help/content_flags/ contentdb_flag_blacklist (ContentDB Flag Blacklist) string nonfree, desktop_default + +# Maximum number of concurrent downloads. Downloads exceeding this limit will be queued. +contentdb_max_concurrent_downloads (ContentDB Max Concurrent Downloads) int 3 diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 103f0fb02..8b6de0412 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -330,6 +330,8 @@ void set_default_settings(Settings *settings) // ContentDB settings->setDefault("contentdb_url", "https://content.minetest.net"); + settings->setDefault("contentdb_max_concurrent_downloads", "3"); + #ifdef __ANDROID__ settings->setDefault("contentdb_flag_blacklist", "nonfree, android_default"); #else From 649211bf272df2dc7057347992c2653cf1c3a6fb Mon Sep 17 00:00:00 2001 From: Lars Date: Wed, 12 Aug 2020 16:02:07 -0700 Subject: [PATCH 023/177] Allow the ABM time budget to be configurable. --- builtin/settingtypes.txt | 4 ++++ src/defaultsettings.cpp | 1 + src/environment.cpp | 1 + src/environment.h | 1 + src/serverenvironment.cpp | 4 ++-- 5 files changed, 9 insertions(+), 2 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 1f71e4cb9..af4dc1def 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -1282,6 +1282,10 @@ active_block_mgmt_interval (Active block management interval) float 2.0 # Length of time between Active Block Modifier (ABM) execution cycles abm_interval (ABM interval) float 1.0 +# The time budget allowed for ABMs to execute on each step +# (as a fraction of the ABM Interval) +abm_time_budget (ABM time budget) float 0.2 0.1 0.9 + # Length of time between NodeTimer execution cycles nodetimer_interval (NodeTimer interval) float 0.2 diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 8b6de0412..87c272630 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -403,6 +403,7 @@ void set_default_settings(Settings *settings) settings->setDefault("dedicated_server_step", "0.09"); settings->setDefault("active_block_mgmt_interval", "2.0"); settings->setDefault("abm_interval", "1.0"); + settings->setDefault("abm_time_budget", "0.2"); settings->setDefault("nodetimer_interval", "0.2"); settings->setDefault("ignore_world_load_errors", "false"); settings->setDefault("remote_media", ""); diff --git a/src/environment.cpp b/src/environment.cpp index 6751f39e4..06f2b8bf9 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -36,6 +36,7 @@ Environment::Environment(IGameDef *gamedef): m_cache_active_block_mgmt_interval = g_settings->getFloat("active_block_mgmt_interval"); m_cache_abm_interval = g_settings->getFloat("abm_interval"); m_cache_nodetimer_interval = g_settings->getFloat("nodetimer_interval"); + m_cache_abm_time_budget = g_settings->getFloat("abm_time_budget"); m_time_of_day = g_settings->getU32("world_start_time"); m_time_of_day_f = (float)m_time_of_day / 24000.0f; diff --git a/src/environment.h b/src/environment.h index 91c33ba15..b4884fdb3 100644 --- a/src/environment.h +++ b/src/environment.h @@ -147,6 +147,7 @@ protected: float m_cache_active_block_mgmt_interval; float m_cache_abm_interval; float m_cache_nodetimer_interval; + float m_cache_abm_time_budget; IGameDef *m_gamedef; diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp index ad2ffc9a4..320042e19 100644 --- a/src/serverenvironment.cpp +++ b/src/serverenvironment.cpp @@ -1354,8 +1354,8 @@ void ServerEnvironment::step(float dtime) std::shuffle(output.begin(), output.end(), m_rgen); int i = 0; - // The time budget for ABMs is 20%. - u32 max_time_ms = m_cache_abm_interval * 1000 / 5; + // determine the time budget for ABMs + u32 max_time_ms = m_cache_abm_interval * 1000 * m_cache_abm_time_budget; for (const v3s16 &p : output) { MapBlock *block = m_map->getBlockNoCreateNoEx(p); if (!block) From 5bda36143f9bd332b6ba420d9b91be1713092eae Mon Sep 17 00:00:00 2001 From: hecks <42101236+hecktest@users.noreply.github.com> Date: Wed, 19 Aug 2020 19:26:37 +0200 Subject: [PATCH 024/177] Clean up sound_fade (#10119) Add proper documentation and correct gain reduction calculations. Co-authored-by: hecktest <> --- doc/lua_api.txt | 7 +++-- src/client/sound_openal.cpp | 55 ++++++++++++++++++++----------------- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 88d99fcd5..ba55033dd 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -5238,9 +5238,12 @@ Sounds * `minetest.sound_fade(handle, step, gain)` * `handle` is a handle returned by `minetest.sound_play` * `step` determines how fast a sound will fade. - Negative step will lower the sound volume, positive step will increase - the sound volume. + The gain will change by this much per second, + until it reaches the target gain. + Note: Older versions used a signed step. This is deprecated, but old + code will still work. (the client uses abs(step) to correct it) * `gain` the target gain for the fade. + Fading to zero will delete the sound. Timing ------ diff --git a/src/client/sound_openal.cpp b/src/client/sound_openal.cpp index 20a651c1d..c1c916e68 100644 --- a/src/client/sound_openal.cpp +++ b/src/client/sound_openal.cpp @@ -337,14 +337,12 @@ private: }; std::unordered_map m_sounds_fading; - float m_fade_delay; public: OpenALSoundManager(SoundManagerSingleton *smg, OnDemandSoundFetcher *fetcher): m_fetcher(fetcher), m_device(smg->m_device.get()), m_context(smg->m_context.get()), - m_next_id(1), - m_fade_delay(0) + m_next_id(1) { infostream << "Audio: Initialized: OpenAL " << std::endl; } @@ -616,38 +614,45 @@ public: void fadeSound(int soundid, float step, float gain) { - m_sounds_fading[soundid] = FadeState(step, getSoundGain(soundid), gain); + // Ignore the command if step isn't valid. + if (step == 0) + return; + float current_gain = getSoundGain(soundid); + step = gain - current_gain > 0 ? abs(step) : -abs(step); + if (m_sounds_fading.find(soundid) != m_sounds_fading.end()) { + auto current_fade = m_sounds_fading[soundid]; + // Do not replace the fade if it's equivalent. + if (current_fade.target_gain == gain && current_fade.step == step) + return; + m_sounds_fading.erase(soundid); + } + gain = rangelim(gain, 0, 1); + m_sounds_fading[soundid] = FadeState(step, current_gain, gain); } void doFades(float dtime) { - m_fade_delay += dtime; + for (auto i = m_sounds_fading.begin(); i != m_sounds_fading.end();) { + FadeState& fade = i->second; + assert(fade.step != 0); + fade.current_gain += (fade.step * dtime); - if (m_fade_delay < 0.1f) - return; - - float chkGain = 0; - for (auto i = m_sounds_fading.begin(); - i != m_sounds_fading.end();) { - if (i->second.step < 0.f) - chkGain = -(i->second.current_gain); + if (fade.step < 0.f) + fade.current_gain = std::max(fade.current_gain, fade.target_gain); else - chkGain = i->second.current_gain; + fade.current_gain = std::min(fade.current_gain, fade.target_gain); - if (chkGain < i->second.target_gain) { - i->second.current_gain += (i->second.step * m_fade_delay); - i->second.current_gain = rangelim(i->second.current_gain, 0, 1); - - updateSoundGain(i->first, i->second.current_gain); - ++i; - } else { - if (i->second.target_gain <= 0.f) - stopSound(i->first); + if (fade.current_gain <= 0.f) + stopSound(i->first); + else + updateSoundGain(i->first, fade.current_gain); + // The increment must happen during the erase call, or else it'll segfault. + if (fade.current_gain == fade.target_gain) m_sounds_fading.erase(i++); - } + else + i++; } - m_fade_delay = 0; } bool soundExists(int sound) From 471497fa9198695becae26a83097ec80643b4cc5 Mon Sep 17 00:00:00 2001 From: v-rob Date: Wed, 19 Aug 2020 16:13:29 -0700 Subject: [PATCH 025/177] Optimize formspec form size (#10144) --- src/gui/guiFormSpecMenu.cpp | 66 ++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/gui/guiFormSpecMenu.cpp b/src/gui/guiFormSpecMenu.cpp index 98392f3c0..f702b40bf 100644 --- a/src/gui/guiFormSpecMenu.cpp +++ b/src/gui/guiFormSpecMenu.cpp @@ -3112,42 +3112,42 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) // and default scaling (1.00). use_imgsize = 0.5555 * screen_dpi * gui_scaling; } else { - // In variable-size mode, we prefer to make the - // inventory image size 1/15 of screen height, - // multiplied by the gui_scaling config parameter. - // If the preferred size won't fit the whole - // form on the screen, either horizontally or - // vertically, then we scale it down to fit. - // (The magic numbers in the computation of what - // fits arise from the scaling factors in the - // following stanza, including the form border, - // help text space, and 0.1 inventory slot spare.) - // However, a minimum size is also set, that - // the image size can't be less than 0.3 inch - // multiplied by gui_scaling, even if this means - // the form doesn't fit the screen. + // Variables for the maximum imgsize that can fit in the screen. + double fitx_imgsize; + double fity_imgsize; + + // Pad the screensize with 5% of the screensize on all sides to ensure + // that even the largest formspecs don't touch the screen borders. + v2f padded_screensize( + mydata.screensize.X * 0.9f, + mydata.screensize.Y * 0.9f + ); + + if (mydata.real_coordinates) { + fitx_imgsize = padded_screensize.X / mydata.invsize.X; + fity_imgsize = padded_screensize.Y / mydata.invsize.Y; + } else { + // The maximum imgsize in the old coordinate system also needs to + // factor in padding and spacing along with 0.1 inventory slot spare + // and help text space, hence the magic numbers. + fitx_imgsize = padded_screensize.X / + ((5.0 / 4.0) * (0.5 + mydata.invsize.X)); + fity_imgsize = padded_screensize.Y / + ((15.0 / 13.0) * (0.85 + mydata.invsize.Y)); + } + #ifdef __ANDROID__ - // For mobile devices these magic numbers are - // different and forms should always use the - // maximum screen space available. - double prefer_imgsize = mydata.screensize.Y / 10 * gui_scaling; - double fitx_imgsize = mydata.screensize.X / - ((12.0 / 8.0) * (0.5 + mydata.invsize.X)); - double fity_imgsize = mydata.screensize.Y / - ((15.0 / 11.0) * (0.85 + mydata.invsize.Y)); - use_imgsize = MYMIN(prefer_imgsize, - MYMIN(fitx_imgsize, fity_imgsize)); + // In Android, the preferred imgsize should be larger to accommodate the + // smaller screensize. + double prefer_imgsize = padded_screensize.Y / 10 * gui_scaling; #else - double prefer_imgsize = mydata.screensize.Y / 15 * gui_scaling; - double fitx_imgsize = mydata.screensize.X / - ((5.0 / 4.0) * (0.5 + mydata.invsize.X)); - double fity_imgsize = mydata.screensize.Y / - ((15.0 / 13.0) * (0.85 * mydata.invsize.Y)); - double screen_dpi = RenderingEngine::getDisplayDensity() * 96; - double min_imgsize = 0.3 * screen_dpi * gui_scaling; - use_imgsize = MYMAX(min_imgsize, MYMIN(prefer_imgsize, - MYMIN(fitx_imgsize, fity_imgsize))); + // Desktop computers have more space, so try to fit 15 coordinates. + double prefer_imgsize = padded_screensize.Y / 15 * gui_scaling; #endif + // Try to use the preferred imgsize, but if that's bigger than the maximum + // size, use the maximum size. + use_imgsize = std::min(prefer_imgsize, + std::min(fitx_imgsize, fity_imgsize)); } // Everything else is scaled in proportion to the From 83d0c360cc648e02650aa4d341dbf5205c1e708f Mon Sep 17 00:00:00 2001 From: v-rob Date: Wed, 19 Aug 2020 18:14:47 -0700 Subject: [PATCH 026/177] Add gradients and borders to FormSpec boxes (#8676) --- doc/lua_api.txt | 43 +++++++++++++------ src/gui/StyleSpec.h | 64 +++++++++++++++++++++++++++ src/gui/guiBox.cpp | 86 +++++++++++++++++++++++++++++++++++-- src/gui/guiBox.h | 11 ++++- src/gui/guiFormSpecMenu.cpp | 65 +++++++++++++++------------- 5 files changed, 220 insertions(+), 49 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index ba55033dd..49fbe0d94 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2442,6 +2442,8 @@ Elements * Simple colored box * `color` is color specified as a `ColorString`. If the alpha component is left blank, the box will be semitransparent. + If the color is not specified, the box will use the options specified by + its style. If the color is specified, all styling options will be ignored. ### `dropdown[,;;;,, ...,;;]` @@ -2708,21 +2710,23 @@ Setting a property to nothing will reset it to the default value. For example: Some types may inherit styles from parent types. * animated_image, inherits from image +* box * button * button_exit, inherits from button * checkbox -* scrollbar -* table -* textlist * dropdown * field -* pwdfield, inherits from field -* textarea -* label -* vertlabel, inherits from field +* image * image_button * item_image_button +* label +* pwdfield, inherits from field +* scrollbar * tabheader +* table +* textarea +* textlist +* vertlabel, inherits from label ### Valid Properties @@ -2731,7 +2735,18 @@ Some types may inherit styles from parent types. * noclip - boolean, set to true to allow the element to exceed formspec bounds. * box * noclip - boolean, set to true to allow the element to exceed formspec bounds. - * Default to false in formspec_version version 3 or higher + * Defaults to false in formspec_version version 3 or higher + * **Note**: `colors`, `bordercolors`, and `borderwidths` accept multiple input types: + * Single value (e.g. `#FF0`): All corners/borders. + * Two values (e.g. `red,#FFAAFF`): top-left and bottom-right,top-right and bottom-left/ + top and bottom,left and right. + * Four values (e.g. `blue,#A0F,green,#FFFA`): top-left/top and rotates clockwise. + * These work similarly to CSS borders. + * colors - `ColorString`. Sets the color(s) of the box corners. Default `black`. + * bordercolors - `ColorString`. Sets the color(s) of the borders. Default `black`. + * borderwidths - Integer. Sets the width(s) of the borders in pixels. If the width is + negative, the border will extend inside the box, whereas positive extends outside + the box. A width of zero results in no border; this is default. * button, button_exit, image_button, item_image_button * alpha - boolean, whether to draw alpha in bgimg. Default true. * bgcolor - color, sets button tint. @@ -2767,12 +2782,6 @@ Some types may inherit styles from parent types. * textcolor - color, default white. * checkbox * noclip - boolean, set to true to allow the element to exceed formspec bounds. -* scrollbar - * noclip - boolean, set to true to allow the element to exceed formspec bounds. -* table, textlist - * font - Sets font type. See button `font` property for more information. - * font_size - Sets font size. See button `font_size` property for more information. - * noclip - boolean, set to true to allow the element to exceed formspec bounds. * dropdown * noclip - boolean, set to true to allow the element to exceed formspec bounds. * field, pwdfield, textarea @@ -2797,9 +2806,15 @@ Some types may inherit styles from parent types. * fgimg_pressed - image when pressed. Defaults to fgimg when not provided. * This is deprecated, use states instead. * NOTE: The parameters of any given image_button will take precedence over fgimg/fgimg_pressed +* scrollbar + * noclip - boolean, set to true to allow the element to exceed formspec bounds. * tabheader * noclip - boolean, set to true to allow the element to exceed formspec bounds. * textcolor - color. Default white. +* table, textlist + * font - Sets font type. See button `font` property for more information. + * font_size - Sets font size. See button `font_size` property for more information. + * noclip - boolean, set to true to allow the element to exceed formspec bounds. ### Valid States diff --git a/src/gui/StyleSpec.h b/src/gui/StyleSpec.h index 67caf4f7b..36ad51a89 100644 --- a/src/gui/StyleSpec.h +++ b/src/gui/StyleSpec.h @@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/string.h" #include #include +#include #pragma once @@ -50,6 +51,9 @@ public: PADDING, FONT, FONT_SIZE, + COLORS, + BORDERCOLORS, + BORDERWIDTHS, NUM_PROPERTIES, NONE }; @@ -106,6 +110,12 @@ public: return FONT; } else if (name == "font_size") { return FONT_SIZE; + } else if (name == "colors") { + return COLORS; + } else if (name == "bordercolors") { + return BORDERCOLORS; + } else if (name == "borderwidths") { + return BORDERWIDTHS; } else { return NONE; } @@ -187,6 +197,42 @@ public: return color; } + std::array getColorArray(Property prop, + std::array def) const + { + const auto &val = properties[prop]; + if (val.empty()) + return def; + + std::vector strs; + if (!parseArray(val, strs)) + return def; + + for (size_t i = 0; i <= 3; i++) { + video::SColor color; + if (parseColorString(strs[i], color, false, 0xff)) + def[i] = color; + } + + return def; + } + + std::array getIntArray(Property prop, std::array def) const + { + const auto &val = properties[prop]; + if (val.empty()) + return def; + + std::vector strs; + if (!parseArray(val, strs)) + return def; + + for (size_t i = 0; i <= 3; i++) + def[i] = stoi(strs[i]); + + return def; + } + irr::core::rect getRect(Property prop, irr::core::rect def) const { const auto &val = properties[prop]; @@ -334,6 +380,24 @@ public: } private: + bool parseArray(const std::string &value, std::vector &arr) const + { + std::vector strs = split(value, ','); + + if (strs.size() == 1) { + arr = {strs[0], strs[0], strs[0], strs[0]}; + } else if (strs.size() == 2) { + arr = {strs[0], strs[1], strs[0], strs[1]}; + } else if (strs.size() == 4) { + arr = strs; + } else { + warningstream << "Invalid array size (" << strs.size() + << " arguments): \"" << value << "\"" << std::endl; + return false; + } + return true; + } + bool parseRect(const std::string &value, irr::core::rect *parsed_rect) const { irr::core::rect rect; diff --git a/src/gui/guiBox.cpp b/src/gui/guiBox.cpp index 7f329cc32..99a115daf 100644 --- a/src/gui/guiBox.cpp +++ b/src/gui/guiBox.cpp @@ -20,9 +20,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "guiBox.h" GUIBox::GUIBox(gui::IGUIEnvironment *env, gui::IGUIElement *parent, s32 id, - const core::rect &rectangle, const video::SColor &color) : + const core::rect &rectangle, + const std::array &colors, + const std::array &bordercolors, + const std::array &borderwidths) : gui::IGUIElement(gui::EGUIET_ELEMENT, env, parent, id, rectangle), - m_color(color) + m_colors(colors), + m_bordercolors(bordercolors), + m_borderwidths(borderwidths) { } @@ -31,8 +36,81 @@ void GUIBox::draw() if (!IsVisible) return; - Environment->getVideoDriver()->draw2DRectangle(m_color, AbsoluteRect, - &AbsoluteClippingRect); + std::array negative_borders = {0, 0, 0, 0}; + std::array positive_borders = {0, 0, 0, 0}; + + for (size_t i = 0; i <= 3; i++) { + if (m_borderwidths[i] > 0) + positive_borders[i] = m_borderwidths[i]; + else + negative_borders[i] = m_borderwidths[i]; + } + + v2s32 upperleft = AbsoluteRect.UpperLeftCorner; + v2s32 lowerright = AbsoluteRect.LowerRightCorner; + + v2s32 topleft_border = { + upperleft.X - positive_borders[3], + upperleft.Y - positive_borders[0] + }; + v2s32 topleft_rect = { + upperleft.X - negative_borders[3], + upperleft.Y - negative_borders[0] + }; + + v2s32 lowerright_border = { + lowerright.X + positive_borders[1], + lowerright.Y + positive_borders[2] + }; + v2s32 lowerright_rect = { + lowerright.X + negative_borders[1], + lowerright.Y + negative_borders[2] + }; + + core::rect main_rect( + topleft_rect.X, + topleft_rect.Y, + lowerright_rect.X, + lowerright_rect.Y + ); + + std::array, 4> border_rects; + + border_rects[0] = core::rect( + topleft_border.X, + topleft_border.Y, + lowerright_border.X, + topleft_rect.Y + ); + + border_rects[1] = core::rect( + lowerright_rect.X, + topleft_rect.Y, + lowerright_border.X, + lowerright_rect.Y + ); + + border_rects[2] = core::rect( + topleft_border.X, + lowerright_rect.Y, + lowerright_border.X, + lowerright_border.Y + ); + + border_rects[3] = core::rect( + topleft_border.X, + topleft_rect.Y, + topleft_rect.X, + lowerright_rect.Y + ); + + video::IVideoDriver *driver = Environment->getVideoDriver(); + + driver->draw2DRectangle(main_rect, m_colors[0], m_colors[1], m_colors[3], + m_colors[2], nullptr); + + for (size_t i = 0; i <= 3; i++) + driver->draw2DRectangle(m_bordercolors[i], border_rects[i], nullptr); IGUIElement::draw(); } diff --git a/src/gui/guiBox.h b/src/gui/guiBox.h index 5306fdf65..ca8f83771 100644 --- a/src/gui/guiBox.h +++ b/src/gui/guiBox.h @@ -19,16 +19,23 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once +#include +#include #include "irrlichttypes_extrabloated.h" class GUIBox : public gui::IGUIElement { public: GUIBox(gui::IGUIEnvironment *env, gui::IGUIElement *parent, s32 id, - const core::rect &rectangle, const video::SColor &color); + const core::rect &rectangle, + const std::array &colors, + const std::array &bordercolors, + const std::array &borderwidths); virtual void draw() override; private: - video::SColor m_color; + std::array m_colors; + std::array m_bordercolors; + std::array m_borderwidths; }; diff --git a/src/gui/guiFormSpecMenu.cpp b/src/gui/guiFormSpecMenu.cpp index f702b40bf..9bd5f27fd 100644 --- a/src/gui/guiFormSpecMenu.cpp +++ b/src/gui/guiFormSpecMenu.cpp @@ -2211,16 +2211,16 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data, const std::string & void GUIFormSpecMenu::parseBox(parserData* data, const std::string &element) { - std::vector parts = split(element,';'); + std::vector parts = split(element, ';'); if ((parts.size() == 3) || ((parts.size() > 3) && (m_formspec_version > FORMSPEC_API_VERSION))) { - std::vector v_pos = split(parts[0],','); - std::vector v_geom = split(parts[1],','); + std::vector v_pos = split(parts[0], ','); + std::vector v_geom = split(parts[1], ','); - MY_CHECKPOS("box",0); - MY_CHECKGEOM("box",1); + MY_CHECKPOS("box", 0); + MY_CHECKGEOM("box", 1); v2s32 pos; v2s32 geom; @@ -2234,36 +2234,43 @@ void GUIFormSpecMenu::parseBox(parserData* data, const std::string &element) geom.Y = stof(v_geom[1]) * spacing.Y; } + FieldSpec spec( + "", + L"", + L"", + 258 + m_fields.size(), + -2 + ); + spec.ftype = f_Box; + + auto style = getDefaultStyleForElement("box", spec.fname); + video::SColor tmp_color; + std::array colors; + std::array bordercolors = {0x0, 0x0, 0x0, 0x0}; + std::array borderwidths = {0, 0, 0, 0}; - if (parseColorString(parts[2], tmp_color, false, 0x8C)) { - FieldSpec spec( - "", - L"", - L"", - 258 + m_fields.size(), - -2 - ); - spec.ftype = f_Box; - - core::rect rect(pos, pos + geom); - - GUIBox *e = new GUIBox(Environment, data->current_parent, spec.fid, - rect, tmp_color); - - auto style = getDefaultStyleForElement("box", spec.fname); - e->setNotClipped(style.getBool(StyleSpec::NOCLIP, m_formspec_version < 3)); - - e->drop(); - - m_fields.push_back(spec); - + if (parseColorString(parts[2], tmp_color, true, 0x8C)) { + colors = {tmp_color, tmp_color, tmp_color, tmp_color}; } else { - errorstream<< "Invalid Box element(" << parts.size() << "): '" << element << "' INVALID COLOR" << std::endl; + colors = style.getColorArray(StyleSpec::COLORS, {0x0, 0x0, 0x0, 0x0}); + bordercolors = style.getColorArray(StyleSpec::BORDERCOLORS, + {0x0, 0x0, 0x0, 0x0}); + borderwidths = style.getIntArray(StyleSpec::BORDERWIDTHS, {0, 0, 0, 0}); } + + core::rect rect(pos, pos + geom); + + GUIBox *e = new GUIBox(Environment, data->current_parent, spec.fid, rect, + colors, bordercolors, borderwidths); + e->setNotClipped(style.getBool(StyleSpec::NOCLIP, m_formspec_version < 3)); + e->drop(); + + m_fields.push_back(spec); return; } - errorstream<< "Invalid Box element(" << parts.size() << "): '" << element << "'" << std::endl; + errorstream << "Invalid Box element(" << parts.size() << "): '" << element + << "'" << std::endl; } void GUIFormSpecMenu::parseBackgroundColor(parserData* data, const std::string &element) From 71287894adbf3cbe092ded1cbf02755678305afb Mon Sep 17 00:00:00 2001 From: Pierre-Yves Rollo Date: Thu, 20 Aug 2020 12:25:02 +0200 Subject: [PATCH 027/177] Fix missing translation call in hypertext (#10296) --- src/gui/guiFormSpecMenu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/guiFormSpecMenu.cpp b/src/gui/guiFormSpecMenu.cpp index 9bd5f27fd..76441c645 100644 --- a/src/gui/guiFormSpecMenu.cpp +++ b/src/gui/guiFormSpecMenu.cpp @@ -1740,7 +1740,7 @@ void GUIFormSpecMenu::parseHyperText(parserData *data, const std::string &elemen FieldSpec spec( name, - utf8_to_wide(unescape_string(text)), + translate_string(utf8_to_wide(unescape_string(text))), L"", 258 + m_fields.size() ); From 9c7340104a7ec4007e3dfe0bb4482f3c8f9878e0 Mon Sep 17 00:00:00 2001 From: Sebastien Marie Date: Thu, 20 Aug 2020 19:10:58 +0200 Subject: [PATCH 028/177] Define environ variable on OpenBSD (#10302) --- src/porting.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/porting.cpp b/src/porting.cpp index d902d3737..b3c8cae99 100644 --- a/src/porting.cpp +++ b/src/porting.cpp @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "porting.h" -#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) +#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) #include #include extern char **environ; From 98faeac5a7b382e5d7ce0474bf7d52fc5975a23c Mon Sep 17 00:00:00 2001 From: DS Date: Thu, 20 Aug 2020 22:25:29 +0200 Subject: [PATCH 029/177] Load media from subfolders (#9065) --- doc/lua_api.txt | 24 +++++++++++------- .../dirt_with_grass/default_grass.png | Bin 0 -> 829 bytes .../default_grass_side.png | Bin .../textures/dirt_with_grass/info.txt | 3 +++ src/server.cpp | 16 ++++++++---- src/server/mods.cpp | 10 ++++---- src/unittest/test_servermodmanager.cpp | 2 -- 7 files changed, 34 insertions(+), 21 deletions(-) create mode 100644 games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass.png rename games/devtest/mods/basenodes/textures/{ => dirt_with_grass}/default_grass_side.png (100%) create mode 100644 games/devtest/mods/basenodes/textures/dirt_with_grass/info.txt diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 49fbe0d94..9770ae4a9 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -152,7 +152,11 @@ Mod directory structure │   ├── models │   ├── textures │   │   ├── modname_stuff.png - │   │   └── modname_something_else.png + │   │   ├── modname_something_else.png + │   │   ├── subfolder_foo + │   │   │ ├── modname_more_stuff.png + │   │   │ └── another_subfolder + │   │   └── bar_subfolder │   ├── sounds │   ├── media │   ├── locale @@ -221,18 +225,20 @@ registered callbacks. `minetest.settings` can be used to read custom or existing settings at load time, if necessary. (See [`Settings`]) -### `models` - -Models for entities or meshnodes. - -### `textures`, `sounds`, `media` +### `textures`, `sounds`, `media`, `models`, `locale` Media files (textures, sounds, whatever) that will be transferred to the -client and will be available for use by the mod. +client and will be available for use by the mod and translation files for +the clients (see [Translations]). -### `locale` +It is suggested to use the folders for the purpous they are thought for, +eg. put textures into `textures`, translation files into `locale`, +models for entities or meshnodes into `models` et cetera. -Translation files for the clients. (See [Translations]) +These folders and subfolders can contain subfolders. +Subfolders with names starting with `_` or `.` are ignored. +If a subfolder contains a media file with the same name as a media file +in one of its parents, the parent's file is used. Naming conventions ------------------ diff --git a/games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass.png b/games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass.png new file mode 100644 index 0000000000000000000000000000000000000000..29fde6b26a7689e0091c92f49355ab7072b7c056 GIT binary patch literal 829 zcmV-D1H$}?P)+ajpshR{=5W`0H1vO`a^tn z^HmA((KjzhfEz!)^)S)UHv!<<2ft&20N}#aXNn>Qfc>9duElEayO*wC{B{5P7vm}i zfG>V{Q@MEUoa>pc5p+$F7hLwxwD9=GnM}r65ueH&GYKIICc4=-gI+FmhfF5ibEvhZ5uK&W ziu3!yrfPY*M4Zlm$EDS*d+vqq7kWB$?XncF2BUlR@p5efxZ6R$t%2REYRDb^U zFU#9IcaMWjb$u(que|XX6D`pjj8)sFUP!4%_!3&#=wKU$2@S7$u}D^kVnP+X^OS%5 zAjcZEJ-tZk<+N-Y>DVq(tNX_@F2w0Gep%Mh&~^+rNwfa}tdL}?X}J{Q00000NkvXX Hu0mjfO)-U1 literal 0 HcmV?d00001 diff --git a/games/devtest/mods/basenodes/textures/default_grass_side.png b/games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass_side.png similarity index 100% rename from games/devtest/mods/basenodes/textures/default_grass_side.png rename to games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass_side.png diff --git a/games/devtest/mods/basenodes/textures/dirt_with_grass/info.txt b/games/devtest/mods/basenodes/textures/dirt_with_grass/info.txt new file mode 100644 index 000000000..8db21ed9c --- /dev/null +++ b/games/devtest/mods/basenodes/textures/dirt_with_grass/info.txt @@ -0,0 +1,3 @@ +This is for testing loading textures from subfolders. +If it works correctly, the default_grass_side.png file in this folder is used but +default_grass.png is not overwritten by the file in this folder. diff --git a/src/server.cpp b/src/server.cpp index 53ee8c444..ef36aedca 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2494,19 +2494,25 @@ void Server::fillMediaCache() // Collect all media file paths std::vector paths; - m_modmgr->getModsMediaPaths(paths); - fs::GetRecursiveDirs(paths, m_gamespec.path + DIR_DELIM + "textures"); + // The paths are ordered in descending priority fs::GetRecursiveDirs(paths, porting::path_user + DIR_DELIM + "textures" + DIR_DELIM + "server"); + fs::GetRecursiveDirs(paths, m_gamespec.path + DIR_DELIM + "textures"); + m_modmgr->getModsMediaPaths(paths); // Collect media file information from paths into cache for (const std::string &mediapath : paths) { std::vector dirlist = fs::GetDirListing(mediapath); for (const fs::DirListNode &dln : dirlist) { - if (dln.dir) // Ignore dirs + if (dln.dir) // Ignore dirs (already in paths) continue; + + const std::string &filename = dln.name; + if (m_media.find(filename) != m_media.end()) // Do not override + continue; + std::string filepath = mediapath; - filepath.append(DIR_DELIM).append(dln.name); - addMediaFile(dln.name, filepath); + filepath.append(DIR_DELIM).append(filename); + addMediaFile(filename, filepath); } } diff --git a/src/server/mods.cpp b/src/server/mods.cpp index 6ac530739..cf1467648 100644 --- a/src/server/mods.cpp +++ b/src/server/mods.cpp @@ -99,10 +99,10 @@ void ServerModManager::getModNames(std::vector &modlist) const void ServerModManager::getModsMediaPaths(std::vector &paths) const { for (const ModSpec &spec : m_sorted_mods) { - paths.push_back(spec.path + DIR_DELIM + "textures"); - paths.push_back(spec.path + DIR_DELIM + "sounds"); - paths.push_back(spec.path + DIR_DELIM + "media"); - paths.push_back(spec.path + DIR_DELIM + "models"); - paths.push_back(spec.path + DIR_DELIM + "locale"); + fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "textures"); + fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "sounds"); + fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "media"); + fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "models"); + fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "locale"); } } diff --git a/src/unittest/test_servermodmanager.cpp b/src/unittest/test_servermodmanager.cpp index 799936757..e3edb0c32 100644 --- a/src/unittest/test_servermodmanager.cpp +++ b/src/unittest/test_servermodmanager.cpp @@ -169,6 +169,4 @@ void TestServerModManager::testGetModMediaPaths() std::vector result; sm.getModsMediaPaths(result); UASSERTEQ(bool, result.empty(), false); - // We should have 5 folders for each mod (textures, media, locale, model, sounds) - UASSERTEQ(unsigned long, result.size() % 5, 0); } From cf5547227d9fffd9fb0043ce0b5633b831536eb6 Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Sun, 23 Aug 2020 14:39:32 +0100 Subject: [PATCH 030/177] Complete Haiku platform support. (#10311) Fixing linkage/libraries missing issue. Implements missing platform specifics. --- src/CMakeLists.txt | 4 ++++ src/network/CMakeLists.txt | 5 ----- src/porting.cpp | 10 ++++++++++ src/porting.h | 2 ++ src/threading/thread.cpp | 4 ++++ src/threading/thread.h | 4 ++++ 6 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3d6d1b0ea..7e1d0bd39 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -351,6 +351,10 @@ else() if (ICONV_LIBRARY) set(PLATFORM_LIBS ${PLATFORM_LIBS} ${ICONV_LIBRARY}) endif() + if (HAIKU) + set(PLATFORM_LIBS ${PLATFORM_LIBS} intl network) + endif() + endif() check_include_files(endian.h HAVE_ENDIAN_H) diff --git a/src/network/CMakeLists.txt b/src/network/CMakeLists.txt index c6995ab22..d2e2f52e9 100644 --- a/src/network/CMakeLists.txt +++ b/src/network/CMakeLists.txt @@ -16,8 +16,3 @@ if (BUILD_CLIENT) PARENT_SCOPE ) endif() - -# Haiku networking support -if(HAIKU) - set(PLATFORM_LIBS -lnetwork ${PLATFORM_LIBS}) -endif() diff --git a/src/porting.cpp b/src/porting.cpp index b3c8cae99..e7ed4e090 100644 --- a/src/porting.cpp +++ b/src/porting.cpp @@ -56,6 +56,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #endif +#if defined(__HAIKU__) + #include +#endif + #include "config.h" #include "debug.h" #include "filesys.h" @@ -321,6 +325,12 @@ bool getCurrentExecPath(char *buf, size_t len) return true; } +#elif defined(__HAIKU__) + +bool getCurrentExecPath(char *buf, size_t len) +{ + return find_path(B_APP_IMAGE_SYMBOL, B_FIND_PATH_IMAGE_PATH, NULL, buf, len) == B_OK; +} //// Solaris #elif defined(__sun) || defined(sun) diff --git a/src/porting.h b/src/porting.h index f50f0a950..c7adf12a2 100644 --- a/src/porting.h +++ b/src/porting.h @@ -309,6 +309,8 @@ inline const char *getPlatformName() #else "SunOS" #endif +#elif defined(__HAIKU__) + "Haiku" #elif defined(__CYGWIN__) "Cygwin" #elif defined(__unix__) || defined(__unix) diff --git a/src/threading/thread.cpp b/src/threading/thread.cpp index e0f808c4d..f678a09be 100644 --- a/src/threading/thread.cpp +++ b/src/threading/thread.cpp @@ -225,6 +225,10 @@ void Thread::setName(const std::string &name) pthread_setname_np(name.c_str()); +#elif defined(__HAIKU__) + + rename_thread(find_thread(NULL), name.c_str()); + #elif defined(_MSC_VER) // Windows itself doesn't support thread names, diff --git a/src/threading/thread.h b/src/threading/thread.h index cea92226f..3946335f5 100644 --- a/src/threading/thread.h +++ b/src/threading/thread.h @@ -36,6 +36,10 @@ DEALINGS IN THE SOFTWARE. #include // for tid_t #endif +#ifdef __HAIKU__ + #include +#endif + /* * On platforms using pthreads, these five priority classes correlate to * even divisions between the minimum and maximum reported thread priority. From f5a203fbcd3af358bc1639467014063ba8409d3e Mon Sep 17 00:00:00 2001 From: BenjaminRi <28017860+BenjaminRi@users.noreply.github.com> Date: Sun, 23 Aug 2020 15:39:55 +0200 Subject: [PATCH 031/177] Fix light overflow of u8 if light is saturated at 255 (#10305) --- src/light.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/light.cpp b/src/light.cpp index 8196fedff..d5389b450 100644 --- a/src/light.cpp +++ b/src/light.cpp @@ -18,6 +18,7 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "light.h" +#include #include #include "util/numeric.h" #include "settings.h" @@ -81,9 +82,11 @@ void set_light_table(float gamma) // Strictly speaking, rangelim is not necessary here—if the implementation // is conforming. But we don’t want problems in any case. light_LUT[i] = rangelim((s32)(255.0f * brightness), 0, 255); + // Ensure light brightens with each level - if (i > 1 && light_LUT[i] <= light_LUT[i - 1]) - light_LUT[i] = light_LUT[i - 1] + 1; + if (i > 0 && light_LUT[i] <= light_LUT[i - 1]) { + light_LUT[i] = std::min((u8)254, light_LUT[i - 1]) + 1; + } } } From 47948793c16fc293c1d6b4ccee05421bc0864360 Mon Sep 17 00:00:00 2001 From: Vincent Robinson Date: Sun, 23 Aug 2020 06:40:34 -0700 Subject: [PATCH 032/177] Auto focus on OK button in main menu error messages (#10300) --- builtin/fstk/ui.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/builtin/fstk/ui.lua b/builtin/fstk/ui.lua index 6d26aabf0..7eeebdd47 100644 --- a/builtin/fstk/ui.lua +++ b/builtin/fstk/ui.lua @@ -64,6 +64,7 @@ function ui.update() formspec = { "size[14,8]", "real_coordinates[true]", + "set_focus[btn_reconnect_yes;true]", "box[0.5,1.2;13,5;#000]", ("textarea[0.5,1.2;13,5;;%s;%s]"):format( fgettext("The server has requested a reconnect:"), error_message), @@ -82,6 +83,7 @@ function ui.update() formspec = { "size[14,8]", "real_coordinates[true]", + "set_focus[btn_error_confirm;true]", "box[0.5,1.2;13,5;#000]", ("textarea[0.5,1.2;13,5;;%s;%s]"):format( error_title, error_message), From 3c2890692bb4c292023a8260cf9ce70f82b2e780 Mon Sep 17 00:00:00 2001 From: adrido Date: Sun, 23 Aug 2020 15:41:04 +0200 Subject: [PATCH 033/177] Fix MSVC compiler warnings (#10197) --- src/client/fontengine.h | 2 +- src/gui/guiChatConsole.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/fontengine.h b/src/client/fontengine.h index 865b2d3ff..c6efa0df4 100644 --- a/src/client/fontengine.h +++ b/src/client/fontengine.h @@ -48,7 +48,7 @@ struct FontSpec { u16 getHash() { - return (mode << 2) | (bold << 1) | italic; + return (mode << 2) | (static_cast(bold) << 1) | static_cast(italic); } unsigned int size; diff --git a/src/gui/guiChatConsole.cpp b/src/gui/guiChatConsole.cpp index 8de00c12f..575c6ab25 100644 --- a/src/gui/guiChatConsole.cpp +++ b/src/gui/guiChatConsole.cpp @@ -545,7 +545,7 @@ bool GUIChatConsole::OnEvent(const SEvent& event) if (prompt.getCursorLength() <= 0) return true; std::wstring wselected = prompt.getSelection(); - std::string selected(wselected.begin(), wselected.end()); + std::string selected = wide_to_utf8(wselected); Environment->getOSOperator()->copyToClipboard(selected.c_str()); return true; } @@ -575,7 +575,7 @@ bool GUIChatConsole::OnEvent(const SEvent& event) if (prompt.getCursorLength() <= 0) return true; std::wstring wselected = prompt.getSelection(); - std::string selected(wselected.begin(), wselected.end()); + std::string selected = wide_to_utf8(wselected); Environment->getOSOperator()->copyToClipboard(selected.c_str()); prompt.cursorOperation( ChatPrompt::CURSOROP_DELETE, From 287f3fb2e3317bb6bd6d8608f1aa051c601aeca4 Mon Sep 17 00:00:00 2001 From: EvidenceB <49488517+EvidenceBKidscode@users.noreply.github.com> Date: Sun, 23 Aug 2020 22:50:14 +0200 Subject: [PATCH 034/177] Avoid drawing clipped out formspec elements (#10095) --- src/gui/guiFormSpecMenu.cpp | 10 +++++++--- src/gui/guiScrollContainer.cpp | 12 ++++++++++++ src/gui/guiScrollContainer.h | 2 ++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/gui/guiFormSpecMenu.cpp b/src/gui/guiFormSpecMenu.cpp index 76441c645..7e3ad3b15 100644 --- a/src/gui/guiFormSpecMenu.cpp +++ b/src/gui/guiFormSpecMenu.cpp @@ -3483,10 +3483,14 @@ void GUIFormSpecMenu::drawMenu() e->setVisible(true); /* - Call base class - (This is where all the drawing happens.) + This is where all the drawing happens. */ - gui::IGUIElement::draw(); + core::list::Iterator it = Children.begin(); + for (; it != Children.end(); ++it) + if ((*it)->isNotClipped() || + AbsoluteClippingRect.isRectCollided( + (*it)->getAbsolutePosition())) + (*it)->draw(); for (gui::IGUIElement *e : m_clickthrough_elements) e->setVisible(false); diff --git a/src/gui/guiScrollContainer.cpp b/src/gui/guiScrollContainer.cpp index 88cdc7057..0fe4c41bd 100644 --- a/src/gui/guiScrollContainer.cpp +++ b/src/gui/guiScrollContainer.cpp @@ -56,6 +56,18 @@ bool GUIScrollContainer::OnEvent(const SEvent &event) return IGUIElement::OnEvent(event); } +void GUIScrollContainer::draw() +{ + if (isVisible()) { + core::list::Iterator it = Children.begin(); + for (; it != Children.end(); ++it) + if ((*it)->isNotClipped() || + AbsoluteClippingRect.isRectCollided( + (*it)->getAbsolutePosition())) + (*it)->draw(); + } +} + void GUIScrollContainer::updateScrolling() { s32 pos = m_scrollbar->getPos(); diff --git a/src/gui/guiScrollContainer.h b/src/gui/guiScrollContainer.h index a0306291e..9e3ec6e93 100644 --- a/src/gui/guiScrollContainer.h +++ b/src/gui/guiScrollContainer.h @@ -32,6 +32,8 @@ public: virtual bool OnEvent(const SEvent &event) override; + virtual void draw() override; + inline void onScrollEvent(gui::IGUIElement *caller) { if (caller == m_scrollbar) From 3e5bce2251deb8e5fcbaa266431f8c0f10078bf2 Mon Sep 17 00:00:00 2001 From: Kezi Date: Sun, 23 Aug 2020 22:50:45 +0200 Subject: [PATCH 035/177] darken tabheader background color (#10299) --- src/gui/guiSkin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/guiSkin.cpp b/src/gui/guiSkin.cpp index 8892a00b4..e09209bd9 100644 --- a/src/gui/guiSkin.cpp +++ b/src/gui/guiSkin.cpp @@ -29,7 +29,7 @@ GUISkin::GUISkin(EGUI_SKIN_TYPE type, video::IVideoDriver* driver) { Colors[EGDC_3D_DARK_SHADOW] = video::SColor(101,50,50,50); Colors[EGDC_3D_SHADOW] = video::SColor(101,130,130,130); - Colors[EGDC_3D_FACE] = video::SColor(101,210,210,210); + Colors[EGDC_3D_FACE] = video::SColor(220,100,100,100); Colors[EGDC_3D_HIGH_LIGHT] = video::SColor(101,255,255,255); Colors[EGDC_3D_LIGHT] = video::SColor(101,210,210,210); Colors[EGDC_ACTIVE_BORDER] = video::SColor(101,16,14,115); From f27cf4777933f06f85fa2f013d56ca0a2cf1d588 Mon Sep 17 00:00:00 2001 From: Desour Date: Sun, 23 Aug 2020 19:44:25 +0200 Subject: [PATCH 036/177] Properly handle mod-errors in on_shutdown --- src/client/game.cpp | 3 ++- src/server.cpp | 17 +++++++++++++++-- src/server.h | 7 ++++++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/client/game.cpp b/src/client/game.cpp index 0d3a0ca15..920383aaf 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -1300,7 +1300,8 @@ bool Game::createSingleplayerServer(const std::string &map_dir, return false; } - server = new Server(map_dir, gamespec, simple_singleplayer_mode, bind_addr, false); + server = new Server(map_dir, gamespec, simple_singleplayer_mode, bind_addr, + false, nullptr, error_message); server->start(); return true; diff --git a/src/server.cpp b/src/server.cpp index ef36aedca..7b3978462 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -213,7 +213,8 @@ Server::Server( bool simple_singleplayer_mode, Address bind_addr, bool dedicated, - ChatInterface *iface + ChatInterface *iface, + std::string *on_shutdown_errmsg ): m_bind_addr(bind_addr), m_path_world(path_world), @@ -232,6 +233,7 @@ Server::Server( m_thread(new ServerThread(this)), m_clients(m_con), m_admin_chat(iface), + m_on_shutdown_errmsg(on_shutdown_errmsg), m_modchannel_mgr(new ModChannelMgr()) { if (m_path_world.empty()) @@ -314,7 +316,18 @@ Server::~Server() // Execute script shutdown hooks infostream << "Executing shutdown hooks" << std::endl; - m_script->on_shutdown(); + try { + m_script->on_shutdown(); + } catch (ModError &e) { + errorstream << "ModError: " << e.what() << std::endl; + if (m_on_shutdown_errmsg) { + if (m_on_shutdown_errmsg->empty()) { + *m_on_shutdown_errmsg = std::string("ModError: ") + e.what(); + } else { + *m_on_shutdown_errmsg += std::string("\nModError: ") + e.what(); + } + } + } infostream << "Server: Saving environment metadata" << std::endl; m_env->saveMeta(); diff --git a/src/server.h b/src/server.h index f44716531..be6f60abc 100644 --- a/src/server.h +++ b/src/server.h @@ -131,7 +131,8 @@ public: bool simple_singleplayer_mode, Address bind_addr, bool dedicated, - ChatInterface *iface = nullptr + ChatInterface *iface = nullptr, + std::string *on_shutdown_errmsg = nullptr ); ~Server(); DISABLE_CLASS_COPY(Server); @@ -596,6 +597,10 @@ private: ChatInterface *m_admin_chat; std::string m_admin_nick; + // if a mod-error occurs in the on_shutdown callback, the error message will + // be written into this + std::string *const m_on_shutdown_errmsg; + /* Map edit event queue. Automatically receives all map edits. The constructor of this class registers us to receive them through From 44c98089cf923fda924902bceec4edb01f36ce2c Mon Sep 17 00:00:00 2001 From: mntmn Date: Tue, 25 Aug 2020 20:49:51 +0200 Subject: [PATCH 037/177] shaders: Fix transparency on GC7000L (#10036) Workaround for the missing GL_ALPHA_TEST implementation in Mesa (etnaviv driver). --- .../shaders/nodes_shader/opengl_fragment.glsl | 8 ++++++++ .../shaders/object_shader/opengl_fragment.glsl | 8 ++++++++ src/client/shader.cpp | 18 ++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl index 19e6c2d86..7213612bd 100644 --- a/client/shaders/nodes_shader/opengl_fragment.glsl +++ b/client/shaders/nodes_shader/opengl_fragment.glsl @@ -190,6 +190,14 @@ void main(void) #endif vec4 base = texture2D(baseTexture, uv).rgba; +#ifdef USE_DISCARD + // If alpha is zero, we can just discard the pixel. This fixes transparency + // on GPUs like GC7000L, where GL_ALPHA_TEST is not implemented in mesa. + if (base.a == 0.0) { + discard; + } +#endif + #ifdef ENABLE_BUMPMAPPING if (use_normalmap) { vec3 L = normalize(lightVec); diff --git a/client/shaders/object_shader/opengl_fragment.glsl b/client/shaders/object_shader/opengl_fragment.glsl index 0534dc049..2d33ca439 100644 --- a/client/shaders/object_shader/opengl_fragment.glsl +++ b/client/shaders/object_shader/opengl_fragment.glsl @@ -129,6 +129,14 @@ void main(void) vec4 base = texture2D(baseTexture, uv).rgba; +#ifdef USE_DISCARD + // If alpha is zero, we can just discard the pixel. This fixes transparency + // on GPUs like GC7000L, where GL_ALPHA_TEST is not implemented in mesa. + if (base.a == 0.0) { + discard; + } +#endif + #ifdef ENABLE_BUMPMAPPING if (use_normalmap) { vec3 L = normalize(lightVec); diff --git a/src/client/shader.cpp b/src/client/shader.cpp index ee6079f7a..0aba7b118 100644 --- a/src/client/shader.cpp +++ b/src/client/shader.cpp @@ -38,6 +38,16 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "gamedef.h" #include "client/tile.h" +#if ENABLE_GLES +#ifdef _IRR_COMPILE_WITH_OGLES1_ +#include +#else +#include +#endif +#else +#include +#endif + /* A cache from shader name to shader path */ @@ -607,6 +617,14 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp // Create shaders header std::string shaders_header = "#version 120\n"; +#ifdef __unix__ + // For renderers that should use discard instead of GL_ALPHA_TEST + const char* gl_renderer = (const char*)glGetString(GL_RENDERER); + if (strstr(gl_renderer, "GC7000")) { + shaders_header += "#define USE_DISCARD\n"; + } +#endif + static const char* drawTypes[] = { "NDT_NORMAL", "NDT_AIRLIKE", From b262184acf34896f36b4270aba29546fc5b0e65b Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Tue, 25 Aug 2020 19:50:41 +0100 Subject: [PATCH 038/177] NetBSD build fix proposal. (#10308) Fixing thread naming call and let the class setting RANDOM_MIN/RANDOM_MAX. --- src/noise.h | 7 +++++++ src/threading/thread.cpp | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/noise.h b/src/noise.h index 7b5e83251..613879890 100644 --- a/src/noise.h +++ b/src/noise.h @@ -29,6 +29,13 @@ #include "exceptions.h" #include "util/string.h" +#if defined(RANDOM_MIN) +#undef RANDOM_MIN +#endif +#if defined(RANDOM_MAX) +#undef RANDOM_MAX +#endif + extern FlagDesc flagdesc_noiseparams[]; // Note: this class is not polymorphic so that its high level of diff --git a/src/threading/thread.cpp b/src/threading/thread.cpp index f678a09be..eb51516c6 100644 --- a/src/threading/thread.cpp +++ b/src/threading/thread.cpp @@ -219,7 +219,7 @@ void Thread::setName(const std::string &name) #elif defined(__NetBSD__) - pthread_setname_np(pthread_self(), name.c_str()); + pthread_setname_np(pthread_self(), "%s", const_cast(name.c_str())); #elif defined(__APPLE__) From 788f29759565f1eb35fb2189a79a6b2a41e1eb73 Mon Sep 17 00:00:00 2001 From: Maksim Date: Thu, 27 Aug 2020 21:46:57 +0200 Subject: [PATCH 039/177] Android: drop simple MainMenu (#10227) The default (PC-style) MainMenu works great on Android. Provides access to ContentDB and allows players to create many worlds in a few clicks. Makes the interface consistent and eliminates player confusion. --- builtin/mainmenu/init.lua | 102 ++++--------- builtin/mainmenu/tab_settings.lua | 67 +------- builtin/mainmenu/tab_simple_main.lua | 220 --------------------------- builtin/settingtypes.txt | 6 - src/defaultsettings.cpp | 1 - 5 files changed, 33 insertions(+), 363 deletions(-) delete mode 100644 builtin/mainmenu/tab_simple_main.lua diff --git a/builtin/mainmenu/init.lua b/builtin/mainmenu/init.lua index c17e79270..96d02d06c 100644 --- a/builtin/mainmenu/init.lua +++ b/builtin/mainmenu/init.lua @@ -22,7 +22,6 @@ mt_color_dark_green = "#25C191" local menupath = core.get_mainmenu_path() local basepath = core.get_builtin_path() -local menustyle = core.settings:get("main_menu_style") defaulttexturedir = core.get_texturepath_share() .. DIR_DELIM .. "base" .. DIR_DELIM .. "pack" .. DIR_DELIM @@ -39,24 +38,18 @@ dofile(menupath .. DIR_DELIM .. "textures.lua") dofile(menupath .. DIR_DELIM .. "dlg_config_world.lua") dofile(menupath .. DIR_DELIM .. "dlg_settings_advanced.lua") dofile(menupath .. DIR_DELIM .. "dlg_contentstore.lua") -if menustyle ~= "simple" then - dofile(menupath .. DIR_DELIM .. "dlg_create_world.lua") - dofile(menupath .. DIR_DELIM .. "dlg_delete_content.lua") - dofile(menupath .. DIR_DELIM .. "dlg_delete_world.lua") - dofile(menupath .. DIR_DELIM .. "dlg_rename_modpack.lua") -end +dofile(menupath .. DIR_DELIM .. "dlg_create_world.lua") +dofile(menupath .. DIR_DELIM .. "dlg_delete_content.lua") +dofile(menupath .. DIR_DELIM .. "dlg_delete_world.lua") +dofile(menupath .. DIR_DELIM .. "dlg_rename_modpack.lua") local tabs = {} tabs.settings = dofile(menupath .. DIR_DELIM .. "tab_settings.lua") tabs.content = dofile(menupath .. DIR_DELIM .. "tab_content.lua") tabs.credits = dofile(menupath .. DIR_DELIM .. "tab_credits.lua") -if menustyle == "simple" then - tabs.simple_main = dofile(menupath .. DIR_DELIM .. "tab_simple_main.lua") -else - tabs.local_game = dofile(menupath .. DIR_DELIM .. "tab_local.lua") - tabs.play_online = dofile(menupath .. DIR_DELIM .. "tab_online.lua") -end +tabs.local_game = dofile(menupath .. DIR_DELIM .. "tab_local.lua") +tabs.play_online = dofile(menupath .. DIR_DELIM .. "tab_online.lua") -------------------------------------------------------------------------------- local function main_event_handler(tabview, event) @@ -71,68 +64,35 @@ local function init_globals() -- Init gamedata gamedata.worldindex = 0 - if menustyle == "simple" then - local world_list = core.get_worlds() - local world_index - - local found_singleplayerworld = false - for i, world in ipairs(world_list) do - if world.name == "singleplayerworld" then - found_singleplayerworld = true - world_index = i - break - end + menudata.worldlist = filterlist.create( + core.get_worlds, + compare_worlds, + -- Unique id comparison function + function(element, uid) + return element.name == uid + end, + -- Filter function + function(element, gameid) + return element.gameid == gameid end + ) - if not found_singleplayerworld then - core.create_world("singleplayerworld", 1) + menudata.worldlist:add_sort_mechanism("alphabetic", sort_worlds_alphabetic) + menudata.worldlist:set_sortmode("alphabetic") - world_list = core.get_worlds() - - for i, world in ipairs(world_list) do - if world.name == "singleplayerworld" then - world_index = i - break - end - end - end - - gamedata.worldindex = world_index - else - menudata.worldlist = filterlist.create( - core.get_worlds, - compare_worlds, - -- Unique id comparison function - function(element, uid) - return element.name == uid - end, - -- Filter function - function(element, gameid) - return element.gameid == gameid - end - ) - - menudata.worldlist:add_sort_mechanism("alphabetic", sort_worlds_alphabetic) - menudata.worldlist:set_sortmode("alphabetic") - - if not core.settings:get("menu_last_game") then - local default_game = core.settings:get("default_game") or "minetest" - core.settings:set("menu_last_game", default_game) - end - - mm_texture.init() + if not core.settings:get("menu_last_game") then + local default_game = core.settings:get("default_game") or "minetest" + core.settings:set("menu_last_game", default_game) end + mm_texture.init() + -- Create main tabview local tv_main = tabview_create("maintab", {x = 12, y = 5.4}, {x = 0, y = 0}) - if menustyle == "simple" then - tv_main:add(tabs.simple_main) - else - tv_main:set_autosave_tab(true) - tv_main:add(tabs.local_game) - tv_main:add(tabs.play_online) - end + tv_main:set_autosave_tab(true) + tv_main:add(tabs.local_game) + tv_main:add(tabs.play_online) tv_main:add(tabs.content) tv_main:add(tabs.settings) @@ -141,11 +101,9 @@ local function init_globals() tv_main:set_global_event_handler(main_event_handler) tv_main:set_fixed_size(false) - if menustyle ~= "simple" then - local last_tab = core.settings:get("maintab_LAST") - if last_tab and tv_main.current_tab ~= last_tab then - tv_main:set_tab(last_tab) - end + local last_tab = core.settings:get("maintab_LAST") + if last_tab and tv_main.current_tab ~= last_tab then + tv_main:set_tab(last_tab) end ui.set_default("maintab") tv_main:show() diff --git a/builtin/mainmenu/tab_settings.lua b/builtin/mainmenu/tab_settings.lua index 1e5264904..02b15c81b 100644 --- a/builtin/mainmenu/tab_settings.lua +++ b/builtin/mainmenu/tab_settings.lua @@ -122,56 +122,6 @@ local function antialiasing_fname_to_name(fname) return 0 end -local function dlg_confirm_reset_formspec(data) - return "size[8,3]" .. - "label[1,1;" .. fgettext("Are you sure to reset your singleplayer world?") .. "]" .. - "button[1,2;2.6,0.5;dlg_reset_singleplayer_confirm;" .. fgettext("Yes") .. "]" .. - "button[4,2;2.8,0.5;dlg_reset_singleplayer_cancel;" .. fgettext("No") .. "]" -end - -local function dlg_confirm_reset_btnhandler(this, fields, dialogdata) - - if fields["dlg_reset_singleplayer_confirm"] ~= nil then - local worldlist = core.get_worlds() - local found_singleplayerworld = false - - for i = 1, #worldlist do - if worldlist[i].name == "singleplayerworld" then - found_singleplayerworld = true - gamedata.worldindex = i - end - end - - if found_singleplayerworld then - core.delete_world(gamedata.worldindex) - end - - core.create_world("singleplayerworld", 1) - worldlist = core.get_worlds() - - for i = 1, #worldlist do - if worldlist[i].name == "singleplayerworld" then - gamedata.worldindex = i - end - end - end - - this.parent:show() - this:hide() - this:delete() - return true -end - -local function showconfirm_reset(tabview) - local new_dlg = dialog_create("reset_spworld", - dlg_confirm_reset_formspec, - dlg_confirm_reset_btnhandler, - nil) - new_dlg:set_parent(tabview) - tabview:hide() - new_dlg:show() -end - local function formspec(tabview, name, tabdata) local tab_string = "box[0,0;3.75,4.5;#999999]" .. @@ -218,16 +168,9 @@ local function formspec(tabview, name, tabdata) fgettext("Shaders (unavailable)")) .. "]" end - if core.settings:get("main_menu_style") == "simple" then - -- 'Reset singleplayer world' only functions with simple menu - tab_string = tab_string .. - "button[8,4.75;3.95,1;btn_reset_singleplayer;" - .. fgettext("Reset singleplayer world") .. "]" - else - tab_string = tab_string .. - "button[8,4.75;3.95,1;btn_change_keys;" - .. fgettext("Change Keys") .. "]" - end + tab_string = tab_string .. + "button[8,4.75;3.95,1;btn_change_keys;" + .. fgettext("Change Keys") .. "]" tab_string = tab_string .. "button[0,4.75;3.95,1;btn_advanced_settings;" @@ -359,10 +302,6 @@ local function handle_settings_buttons(this, fields, tabname, tabdata) core.settings:set("touchtarget", fields["cb_touchscreen_target"]) return true end - if fields["btn_reset_singleplayer"] then - showconfirm_reset(this) - return true - end --Note dropdowns have to be handled LAST! local ddhandled = false diff --git a/builtin/mainmenu/tab_simple_main.lua b/builtin/mainmenu/tab_simple_main.lua deleted file mode 100644 index 7ec95158a..000000000 --- a/builtin/mainmenu/tab_simple_main.lua +++ /dev/null @@ -1,220 +0,0 @@ ---Minetest ---Copyright (C) 2013 sapier --- ---This program is free software; you can redistribute it and/or modify ---it under the terms of the GNU Lesser General Public License as published by ---the Free Software Foundation; either version 2.1 of the License, or ---(at your option) any later version. --- ---This program is distributed in the hope that it will be useful, ---but WITHOUT ANY WARRANTY; without even the implied warranty of ---MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ---GNU Lesser General Public License for more details. --- ---You should have received a copy of the GNU Lesser General Public License along ---with this program; if not, write to the Free Software Foundation, Inc., ---51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - --------------------------------------------------------------------------------- -local function get_formspec(tabview, name, tabdata) - -- Update the cached supported proto info, - -- it may have changed after a change by the settings menu. - common_update_cached_supp_proto() - local fav_selected = menudata.favorites[tabdata.fav_selected] - - local retval = - "label[9.5,0;".. fgettext("Name / Password") .. "]" .. - "field[0.25,3.35;5.5,0.5;te_address;;" .. - core.formspec_escape(core.settings:get("address")) .."]" .. - "field[5.75,3.35;2.25,0.5;te_port;;" .. - core.formspec_escape(core.settings:get("remote_port")) .."]" .. - "button[10,2.6;2,1.5;btn_mp_connect;".. fgettext("Connect") .. "]" .. - "field[9.8,1;2.6,0.5;te_name;;" .. - core.formspec_escape(core.settings:get("name")) .."]" .. - "pwdfield[9.8,2;2.6,0.5;te_pwd;]" - - - if tabdata.fav_selected and fav_selected then - if gamedata.fav then - retval = retval .. "button[7.7,2.6;2.3,1.5;btn_delete_favorite;" .. - fgettext("Del. Favorite") .. "]" - end - end - - retval = retval .. "tablecolumns[" .. - image_column(fgettext("Favorite"), "favorite") .. ";" .. - image_column(fgettext("Ping"), "") .. ",padding=0.25;" .. - "color,span=3;" .. - "text,align=right;" .. -- clients - "text,align=center,padding=0.25;" .. -- "/" - "text,align=right,padding=0.25;" .. -- clients_max - image_column(fgettext("Creative mode"), "creative") .. ",padding=1;" .. - image_column(fgettext("Damage enabled"), "damage") .. ",padding=0.25;" .. - image_column(fgettext("PvP enabled"), "pvp") .. ",padding=0.25;" .. - "color,span=1;" .. - "text,padding=1]" .. -- name - "table[-0.05,0;9.2,2.75;favourites;" - - if #menudata.favorites > 0 then - local favs = core.get_favorites("local") - if #favs > 0 then - for i = 1, #favs do - for j = 1, #menudata.favorites do - if menudata.favorites[j].address == favs[i].address and - menudata.favorites[j].port == favs[i].port then - table.insert(menudata.favorites, i, - table.remove(menudata.favorites, j)) - end - end - if favs[i].address ~= menudata.favorites[i].address then - table.insert(menudata.favorites, i, favs[i]) - end - end - end - retval = retval .. render_serverlist_row(menudata.favorites[1], (#favs > 0)) - for i = 2, #menudata.favorites do - retval = retval .. "," .. render_serverlist_row(menudata.favorites[i], (i <= #favs)) - end - end - - if tabdata.fav_selected then - retval = retval .. ";" .. tabdata.fav_selected .. "]" - else - retval = retval .. ";0]" - end - - -- separator - retval = retval .. "box[-0.28,3.75;12.4,0.1;#FFFFFF]" - - -- checkboxes - retval = retval .. - "checkbox[8.0,3.9;cb_creative;".. fgettext("Creative Mode") .. ";" .. - dump(core.settings:get_bool("creative_mode")) .. "]".. - "checkbox[8.0,4.4;cb_damage;".. fgettext("Enable Damage") .. ";" .. - dump(core.settings:get_bool("enable_damage")) .. "]" - -- buttons - retval = retval .. - "button[0,3.7;8,1.5;btn_start_singleplayer;" .. fgettext("Start Singleplayer") .. "]" .. - "button[0,4.5;8,1.5;btn_config_sp_world;" .. fgettext("Config mods") .. "]" - - return retval -end - --------------------------------------------------------------------------------- -local function main_button_handler(tabview, fields, name, tabdata) - if fields.btn_start_singleplayer then - gamedata.selected_world = gamedata.worldindex - gamedata.singleplayer = true - core.start() - return true - end - - if fields.favourites then - local event = core.explode_table_event(fields.favourites) - if event.type == "CHG" then - if event.row <= #menudata.favorites then - gamedata.fav = false - local favs = core.get_favorites("local") - local fav = menudata.favorites[event.row] - local address = fav.address - local port = fav.port - gamedata.serverdescription = fav.description - - for i = 1, #favs do - if fav.address == favs[i].address and - fav.port == favs[i].port then - gamedata.fav = true - end - end - - if address and port then - core.settings:set("address", address) - core.settings:set("remote_port", port) - end - tabdata.fav_selected = event.row - end - return true - end - end - - if fields.btn_delete_favorite then - local current_favourite = core.get_table_index("favourites") - if not current_favourite then return end - - core.delete_favorite(current_favourite) - asyncOnlineFavourites() - tabdata.fav_selected = nil - - core.settings:set("address", "") - core.settings:set("remote_port", "30000") - return true - end - - if fields.cb_creative then - core.settings:set("creative_mode", fields.cb_creative) - return true - end - - if fields.cb_damage then - core.settings:set("enable_damage", fields.cb_damage) - return true - end - - if fields.btn_mp_connect or fields.key_enter then - gamedata.playername = fields.te_name - gamedata.password = fields.te_pwd - gamedata.address = fields.te_address - gamedata.port = fields.te_port - local fav_idx = core.get_textlist_index("favourites") - - if fav_idx and fav_idx <= #menudata.favorites and - menudata.favorites[fav_idx].address == fields.te_address and - menudata.favorites[fav_idx].port == fields.te_port then - local fav = menudata.favorites[fav_idx] - gamedata.servername = fav.name - gamedata.serverdescription = fav.description - - if menudata.favorites_is_public and - not is_server_protocol_compat_or_error( - fav.proto_min, fav.proto_max) then - return true - end - else - gamedata.servername = "" - gamedata.serverdescription = "" - end - - gamedata.selected_world = 0 - - core.settings:set("address", fields.te_address) - core.settings:set("remote_port", fields.te_port) - - core.start() - return true - end - - if fields.btn_config_sp_world then - local configdialog = create_configure_world_dlg(1) - if configdialog then - configdialog:set_parent(tabview) - tabview:hide() - configdialog:show() - end - return true - end -end - --------------------------------------------------------------------------------- -local function on_activate(type,old_tab,new_tab) - if type == "LEAVE" then return end - asyncOnlineFavourites() -end - --------------------------------------------------------------------------------- -return { - name = "main", - caption = fgettext("Main"), - cbf_formspec = get_formspec, - cbf_button_handler = main_button_handler, - on_change = on_activate -} diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index af4dc1def..ef56f99bf 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -1446,12 +1446,6 @@ curl_file_download_timeout (cURL file download timeout) int 300000 # Makes DirectX work with LuaJIT. Disable if it causes troubles. high_precision_fpu (High-precision FPU) bool true -# Changes the main menu UI: -# - Full: Multiple singleplayer worlds, game choice, texture pack chooser, etc. -# - Simple: One singleplayer world, no game or texture pack choosers. May be -# necessary for smaller screens. -main_menu_style (Main menu style) enum full full,simple - # Replaces the default main menu with a custom one. main_menu_script (Main menu script) string diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 87c272630..c93af9506 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -290,7 +290,6 @@ void set_default_settings(Settings *settings) settings->setDefault("joystick_frustum_sensitivity", "170"); // Main menu - settings->setDefault("main_menu_style", "full"); settings->setDefault("main_menu_path", ""); settings->setDefault("serverlist_file", "favoriteservers.txt"); From d052593c7ab3c57f83ea250fc10f7c1927962c09 Mon Sep 17 00:00:00 2001 From: karamel59 Date: Thu, 27 Aug 2020 21:47:38 +0200 Subject: [PATCH 040/177] Lua API: Register missing get_texture_mod function (#10338) --- src/script/lua_api/l_object.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 495d8bced..24667e769 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -2299,6 +2299,7 @@ luaL_Reg ObjectRef::methods[] = { luamethod(ObjectRef, set_rotation), luamethod(ObjectRef, get_rotation), luamethod_aliased(ObjectRef, set_texture_mod, settexturemod), + luamethod(ObjectRef, get_texture_mod), luamethod_aliased(ObjectRef, set_sprite, setsprite), luamethod(ObjectRef, get_entity_name), luamethod(ObjectRef, get_luaentity), From 1eaff3dfa4091c638be7a1e9777d35b5f665972c Mon Sep 17 00:00:00 2001 From: karamel59 Date: Thu, 27 Aug 2020 21:48:18 +0200 Subject: [PATCH 041/177] Improve set_texture_mod documentation (#10339) Properly documents the select_x_by_camera values --- doc/lua_api.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 9770ae4a9..acbaf421e 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -6100,6 +6100,9 @@ object you are working with still exists. * `set_yaw(radians)`: sets the yaw (heading). * `get_yaw()`: returns number in radians * `set_texture_mod(mod)` + * Set a texture modifier to the base texture, for sprites and meshes. + * When calling `set_texture_mod` again, the previous one is discarded. + * `mod` the texture modifier. See [Texture modifiers]. * `get_texture_mod()` returns current texture modifier * `set_sprite(p, num_frames, framelength, select_x_by_camera)` * Specifies and starts a sprite animation @@ -6110,6 +6113,12 @@ object you are working with still exists. * `framelength`: Time per animated frame in seconds, default: `0.2` * `select_x_by_camera`: Only for visual = `sprite`. Changes the frame `x` position according to the view direction. default: `false`. + * First column: subject facing the camera + * Second column: subject looking to the left + * Third column: subject backing the camera + * Fourth column: subject looking to the right + * Fifth column: subject viewed from above + * Sixth column: subject viewed from below * `get_entity_name()` (**Deprecated**: Will be removed in a future version) * `get_luaentity()` From 454009a7f2a798dfa70d881a3c9811f7e29481f7 Mon Sep 17 00:00:00 2001 From: DS Date: Sat, 29 Aug 2020 00:14:19 +0200 Subject: [PATCH 042/177] Fix luacheck warnings in builtin/common/tests (#10322) --- .luacheckrc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.luacheckrc b/.luacheckrc index 3ab6e10c8..e010ab95c 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -72,3 +72,11 @@ files["builtin/mainmenu"] = { "PLATFORM", }, } + +files["builtin/common/tests"] = { + read_globals = { + "describe", + "it", + "assert", + }, +} From d28f1b01707dfa15e770096a26495452513bc56f Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sat, 29 Aug 2020 00:14:38 +0200 Subject: [PATCH 043/177] Mapgen: Fix on-by-default flags broken since eca6ee9 (#10318) --- src/map_settings_manager.cpp | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/map_settings_manager.cpp b/src/map_settings_manager.cpp index 4f070e910..9c447b3d0 100644 --- a/src/map_settings_manager.cpp +++ b/src/map_settings_manager.cpp @@ -32,6 +32,10 @@ MapSettingsManager::MapSettingsManager(Settings *user_settings, m_user_settings(user_settings) { assert(m_user_settings != NULL); + + Mapgen::setDefaultSettings(m_map_settings); + // This inherits the combined defaults provided by loadGameConfAndInitWorld. + m_map_settings->overrideDefaults(user_settings); } @@ -179,20 +183,8 @@ MapgenParams *MapSettingsManager::makeMapgenParams() params->mgtype = mgtype; - // Load the mapgen param defaults - /* FIXME: Why is it done like this? MapgenParams should just - * set the defaults in its constructor instead. */ - { - Settings default_settings; - Mapgen::setDefaultSettings(&default_settings); - params->MapgenParams::readParams(&default_settings); - params->readParams(&default_settings); - } - // Load the rest of the mapgen params from our active settings - params->MapgenParams::readParams(m_user_settings); params->MapgenParams::readParams(m_map_settings); - params->readParams(m_user_settings); params->readParams(m_map_settings); // Hold onto our params From 3693b6871eba268ecc79b3f52d00d3cefe761131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= <34514239+appgurueu@users.noreply.github.com> Date: Sat, 29 Aug 2020 17:41:03 +0200 Subject: [PATCH 044/177] Prevent players accessing inventories of other players (#10341) --- src/network/serverpackethandler.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index dcbb114bf..abd9deff0 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -630,13 +630,19 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) if (ma->from_inv != ma->to_inv) m_inventory_mgr->setInventoryModified(ma->to_inv); - bool from_inv_is_current_player = - (ma->from_inv.type == InventoryLocation::PLAYER) && - (ma->from_inv.name == player->getName()); - - bool to_inv_is_current_player = - (ma->to_inv.type == InventoryLocation::PLAYER) && - (ma->to_inv.name == player->getName()); + bool from_inv_is_current_player = false; + if (ma->from_inv.type == InventoryLocation::PLAYER) { + if (ma->from_inv.name != player->getName()) + return; + from_inv_is_current_player = true; + } + + bool to_inv_is_current_player = false; + if (ma->to_inv.type == InventoryLocation::PLAYER) { + if (ma->to_inv.name != player->getName()) + return; + to_inv_is_current_player = true; + } InventoryLocation *remote = from_inv_is_current_player ? &ma->to_inv : &ma->from_inv; From 9976f36b18b8d227e3240feb24000dda0916ee44 Mon Sep 17 00:00:00 2001 From: Hugues Ross Date: Sat, 29 Aug 2020 11:41:19 -0400 Subject: [PATCH 045/177] Make bgcolor tint button background images (#9818) --- games/devtest/mods/testformspec/formspec.lua | 2 +- src/client/guiscalingfilter.cpp | 5 +---- src/client/guiscalingfilter.h | 3 ++- src/gui/guiButton.cpp | 21 +++++++++++++------- src/gui/guiButton.h | 1 + 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/games/devtest/mods/testformspec/formspec.lua b/games/devtest/mods/testformspec/formspec.lua index 08c1b6dc0..87a05fc96 100644 --- a/games/devtest/mods/testformspec/formspec.lua +++ b/games/devtest/mods/testformspec/formspec.lua @@ -164,7 +164,7 @@ local style_fs = [[ style[one_btn14:hovered+pressed;textcolor=purple] image_button[0,9.6;1,1;testformspec_button_image.png;one_btn14;Bg] - style[one_btn15;border=false;bgimg=testformspec_bg.png;bgimg_hovered=testformspec_bg_hovered.png;bgimg_pressed=testformspec_bg_pressed.png] + style[one_btn15;border=false;bgcolor=#1cc;bgimg=testformspec_bg.png;bgimg_hovered=testformspec_bg_hovered.png;bgimg_pressed=testformspec_bg_pressed.png] item_image_button[1.25,9.6;1,1;testformspec:item;one_btn15;Bg] style[one_btn16;border=false;bgimg=testformspec_bg_9slice.png;bgimg_hovered=testformspec_bg_9slice_hovered.png;bgimg_pressed=testformspec_bg_9slice_pressed.png;bgimg_middle=4,6] diff --git a/src/client/guiscalingfilter.cpp b/src/client/guiscalingfilter.cpp index 4262331bd..406c096e6 100644 --- a/src/client/guiscalingfilter.cpp +++ b/src/client/guiscalingfilter.cpp @@ -172,11 +172,8 @@ void draw2DImageFilterScaled(video::IVideoDriver *driver, video::ITexture *txr, void draw2DImage9Slice(video::IVideoDriver *driver, video::ITexture *texture, const core::rect &rect, const core::rect &middle, - const core::rect *cliprect) + const core::rect *cliprect, const video::SColor *const colors) { - const video::SColor color(255,255,255,255); - const video::SColor colors[] = {color,color,color,color}; - auto originalSize = texture->getOriginalSize(); core::vector2di lowerRightOffset = core::vector2di(originalSize.Width, originalSize.Height) - middle.LowerRightCorner; diff --git a/src/client/guiscalingfilter.h b/src/client/guiscalingfilter.h index b703d91f0..379a4bdb0 100644 --- a/src/client/guiscalingfilter.h +++ b/src/client/guiscalingfilter.h @@ -54,4 +54,5 @@ void draw2DImageFilterScaled(video::IVideoDriver *driver, video::ITexture *txr, */ void draw2DImage9Slice(video::IVideoDriver *driver, video::ITexture *texture, const core::rect &rect, const core::rect &middle, - const core::rect *cliprect = nullptr); + const core::rect *cliprect = nullptr, + const video::SColor *const colors = nullptr); diff --git a/src/gui/guiButton.cpp b/src/gui/guiButton.cpp index e0d6337cd..b98e5de82 100644 --- a/src/gui/guiButton.cpp +++ b/src/gui/guiButton.cpp @@ -313,11 +313,12 @@ void GUIButton::draw() // PATCH video::ITexture* texture = ButtonImages[(u32)imageState].Texture; + video::SColor image_colors[] = { BgColor, BgColor, BgColor, BgColor }; if (BgMiddle.getArea() == 0) { driver->draw2DImage(texture, ScaleImage? AbsoluteRect : core::rect(pos, sourceRect.getSize()), sourceRect, &AbsoluteClippingRect, - 0, UseAlphaChannel); + image_colors, UseAlphaChannel); } else { core::rect middle = BgMiddle; // `-x` is interpreted as `w - x` @@ -327,7 +328,7 @@ void GUIButton::draw() middle.LowerRightCorner.Y += texture->getOriginalSize().Height; draw2DImage9Slice(driver, texture, ScaleImage ? AbsoluteRect : core::rect(pos, sourceRect.getSize()), - middle, &AbsoluteClippingRect); + middle, &AbsoluteClippingRect, image_colors); } // END PATCH } @@ -722,6 +723,8 @@ GUIButton* GUIButton::addButton(IGUIEnvironment *environment, void GUIButton::setColor(video::SColor color) { + BgColor = color; + float d = 0.65f; for (size_t i = 0; i < 4; i++) { video::SColor base = Environment->getSkin()->getColor((gui::EGUI_DEFAULT_COLOR)i); @@ -750,22 +753,26 @@ void GUIButton::setFromStyle(const StyleSpec& style) bool pressed = (style.getState() & StyleSpec::STATE_PRESSED) != 0; if (style.isNotDefault(StyleSpec::BGCOLOR)) { - setColor(style.getColor(StyleSpec::BGCOLOR)); // If we have a propagated hover/press color, we need to automatically // lighten/darken it if (!Styles[style.getState()].isNotDefault(StyleSpec::BGCOLOR)) { - for (size_t i = 0; i < 4; i++) { if (pressed) { - Colors[i] = multiplyColorValue(Colors[i], COLOR_PRESSED_MOD); + BgColor = multiplyColorValue(BgColor, COLOR_PRESSED_MOD); + + for (size_t i = 0; i < 4; i++) + Colors[i] = multiplyColorValue(Colors[i], COLOR_PRESSED_MOD); } else if (hovered) { - Colors[i] = multiplyColorValue(Colors[i], COLOR_HOVERED_MOD); + BgColor = multiplyColorValue(BgColor, COLOR_HOVERED_MOD); + + for (size_t i = 0; i < 4; i++) + Colors[i] = multiplyColorValue(Colors[i], COLOR_HOVERED_MOD); } - } } } else { + BgColor = video::SColor(255, 255, 255, 255); for (size_t i = 0; i < 4; i++) { video::SColor base = Environment->getSkin()->getColor((gui::EGUI_DEFAULT_COLOR)i); diff --git a/src/gui/guiButton.h b/src/gui/guiButton.h index 95fa1a2a1..4e1b04aac 100644 --- a/src/gui/guiButton.h +++ b/src/gui/guiButton.h @@ -338,5 +338,6 @@ private: core::rect BgMiddle; core::rect Padding; core::vector2d ContentOffset; + video::SColor BgColor; // END PATCH }; From 28e87ce9d5fdf163c1eb0daf83279e949f84765d Mon Sep 17 00:00:00 2001 From: DS Date: Sat, 29 Aug 2020 17:41:29 +0200 Subject: [PATCH 046/177] Add vector.offset (#10321) --- builtin/common/tests/vector_spec.lua | 4 ++++ builtin/common/vector.lua | 6 ++++++ doc/lua_api.txt | 10 ++++++---- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/builtin/common/tests/vector_spec.lua b/builtin/common/tests/vector_spec.lua index 6f308a4a8..0f287363a 100644 --- a/builtin/common/tests/vector_spec.lua +++ b/builtin/common/tests/vector_spec.lua @@ -44,6 +44,10 @@ describe("vector", function() assert.same({ x = 2, y = 4, z = 6 }, vector.add(vector.new(1, 2, 3), { x = 1, y = 2, z = 3 })) end) + it("offset()", function() + assert.same({ x = 41, y = 52, z = 63 }, vector.offset(vector.new(1, 2, 3), 40, 50, 60)) + end) + -- This function is needed because of floating point imprecision. local function almost_equal(a, b) if type(a) == "number" then diff --git a/builtin/common/vector.lua b/builtin/common/vector.lua index 1fd784ce2..d6437deda 100644 --- a/builtin/common/vector.lua +++ b/builtin/common/vector.lua @@ -137,6 +137,12 @@ function vector.divide(a, b) end end +function vector.offset(v, x, y, z) + return {x = v.x + x, + y = v.y + y, + z = v.z + z} +end + function vector.sort(a, b) return {x = math.min(a.x, b.x), y = math.min(a.y, b.y), z = math.min(a.z, b.z)}, {x = math.max(a.x, b.x), y = math.max(a.y, b.y), z = math.max(a.z, b.z)} diff --git a/doc/lua_api.txt b/doc/lua_api.txt index acbaf421e..5ed84fe9a 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -3062,10 +3062,12 @@ For the following functions, `v`, `v1`, `v2` are vectors, * Returns in order minp, maxp vectors of the cuboid defined by `v1`, `v2`. * `vector.angle(v1, v2)`: * Returns the angle between `v1` and `v2` in radians. -* `vector.dot(v1, v2)` - * Returns the dot product of `v1` and `v2` -* `vector.cross(v1, v2)` - * Returns the cross product of `v1` and `v2` +* `vector.dot(v1, v2)`: + * Returns the dot product of `v1` and `v2`. +* `vector.cross(v1, v2)`: + * Returns the cross product of `v1` and `v2`. +* `vector.offset(v, x, y, z)`: + * Returns the sum of the vectors `v` and `{x = x, y = y, z = z}`. For the following functions `x` can be either a vector or a number: From 386d5f778a299cc0d891eb476674f3eddb108376 Mon Sep 17 00:00:00 2001 From: HybridDog <3192173+HybridDog@users.noreply.github.com> Date: Sat, 29 Aug 2020 17:43:09 +0200 Subject: [PATCH 047/177] Document normalmap textures (#10096) --- doc/lua_api.txt | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 5ed84fe9a..08bdba03e 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -152,6 +152,7 @@ Mod directory structure │   ├── models │   ├── textures │   │   ├── modname_stuff.png + │   │   ├── modname_stuff_normal.png │   │   ├── modname_something_else.png │   │   ├── subfolder_foo │   │   │ ├── modname_more_stuff.png @@ -384,6 +385,36 @@ stripping out the file extension: * e.g. `foomod_foothing.png` * e.g. `foomod_foothing` + +Normalmap Textures +------------------ + +If shaders and bumpmapping or parallax occlusion is enabled, Minetest tries +to load normalmaps. +Those image files have to end with `_normal.png` and start with the same name +as their corresponding texture. +For example a normalmap for `foomod_foothing.png` has to be called +`foomod_foothing_normal.png`. + +The sRGB R, G and B colour values of a normalmap pixel are each directly +mapped from `{0, ..., 255}` to `[-1, 1]` and, taken together, +define the normal vector. +The alpha channel defines the heightmap for parallax occlusion. +To be safe, the alpha values should always be bigger than zero +because the colour values, which define the normal vector, +may be undefined for image formats where colour is discarded in fully +transparent pixels. + +Bumpmapping and parallax occlusion are currently experimental features: + +* Bumpmapping in Minetest happens in an obscure way; there are no light sources + defined in the shaders except the sunlight direction. +* Parallax occlusion with relief-mapping mode does not yet work correctly + together with Minetest's Fastfaces. +* The normalmap files must end with `.png`, so other image files are not + supported. + + Texture modifiers ----------------- From 5c4b560b6812bbdf7a9d3202c95bad5c9df97d66 Mon Sep 17 00:00:00 2001 From: EvidenceB <49488517+EvidenceBKidscode@users.noreply.github.com> Date: Sat, 29 Aug 2020 20:13:30 +0200 Subject: [PATCH 048/177] Add compass HUD element (#9312) Co-authored-by: Jean-Patrick Guerrero Co-authored-by: Pierre-Yves Rollo Co-authored-by: SmallJoker --- doc/lua_api.txt | 18 +++++- src/client/hud.cpp | 140 +++++++++++++++++++++++++++++++++++++++++++++ src/client/hud.h | 8 +++ src/hud.cpp | 1 + src/hud.h | 10 +++- 5 files changed, 175 insertions(+), 2 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 08bdba03e..c81824163 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -1451,7 +1451,23 @@ Same as `image`, but does not accept a `position`; the position is instead deter * `world_pos`: World position of the waypoint. * `offset`: offset in pixels from position. +### `compass` +Displays an image oriented or translated according to current heading direction. + +* `size`: The size of this element. Negative values represent percentage + of the screen; e.g. `x=-100` means 100% (width). +* `scale`: Scale of the translated image (used only for dir = 2 or dir = 3). +* `text`: The name of the texture to use. +* `alignment`: The alignment of the image. +* `offset`: Offset in pixels from position. +* `dir`: How the image is rotated/translated: + * 0 - Rotate as heading direction + * 1 - Rotate in reverse direction + * 2 - Translate as landscape direction + * 3 - Translate in reverse direction + +If translation is chosen, texture is repeated horizontally to fill the whole element. Representations of simple things ================================ @@ -7968,7 +7984,7 @@ Used by `Player:hud_add`. Returned by `Player:hud_get`. { hud_elem_type = "image", -- See HUD element types - -- Type of element, can be "image", "text", "statbar", or "inventory" + -- Type of element, can be "image", "text", "statbar", "inventory" or "compass" position = {x=0.5, y=0.5}, -- Left corner position of element diff --git a/src/client/hud.cpp b/src/client/hud.cpp index 2b347c1e0..d3038230c 100644 --- a/src/client/hud.cpp +++ b/src/client/hud.cpp @@ -114,6 +114,28 @@ Hud::Hud(gui::IGUIEnvironment *guienv, Client *client, LocalPlayer *player, } else { m_selection_material.MaterialType = video::EMT_SOLID; } + + // Prepare mesh for compass drawing + m_rotation_mesh_buffer.Vertices.set_used(4); + m_rotation_mesh_buffer.Indices.set_used(6); + + video::SColor white(255, 255, 255, 255); + v3f normal(0.f, 0.f, 1.f); + + m_rotation_mesh_buffer.Vertices[0] = video::S3DVertex(v3f(-1.f, -1.f, 0.f), normal, white, v2f(0.f, 1.f)); + m_rotation_mesh_buffer.Vertices[1] = video::S3DVertex(v3f(-1.f, 1.f, 0.f), normal, white, v2f(0.f, 0.f)); + m_rotation_mesh_buffer.Vertices[2] = video::S3DVertex(v3f( 1.f, 1.f, 0.f), normal, white, v2f(1.f, 0.f)); + m_rotation_mesh_buffer.Vertices[3] = video::S3DVertex(v3f( 1.f, -1.f, 0.f), normal, white, v2f(1.f, 1.f)); + + m_rotation_mesh_buffer.Indices[0] = 0; + m_rotation_mesh_buffer.Indices[1] = 1; + m_rotation_mesh_buffer.Indices[2] = 2; + m_rotation_mesh_buffer.Indices[3] = 2; + m_rotation_mesh_buffer.Indices[4] = 3; + m_rotation_mesh_buffer.Indices[5] = 0; + + m_rotation_mesh_buffer.getMaterial().Lighting = false; + m_rotation_mesh_buffer.getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; } Hud::~Hud() @@ -423,6 +445,54 @@ void Hud::drawLuaElements(const v3s16 &camera_offset) core::rect(core::position2d(0,0), imgsize), NULL, colors, true); break; } + case HUD_ELEM_COMPASS: { + video::ITexture *texture = tsrc->getTexture(e->text); + if (!texture) + continue; + + // Positionning : + v2s32 dstsize(e->size.X, e->size.Y); + if (e->size.X < 0) + dstsize.X = m_screensize.X * (e->size.X * -0.01); + if (e->size.Y < 0) + dstsize.Y = m_screensize.Y * (e->size.Y * -0.01); + + if (dstsize.X <= 0 || dstsize.Y <= 0) + return; // Avoid zero divides + + // Angle according to camera view + v3f fore(0.f, 0.f, 1.f); + scene::ICameraSceneNode *cam = RenderingEngine::get_scene_manager()->getActiveCamera(); + cam->getAbsoluteTransformation().rotateVect(fore); + int angle = - fore.getHorizontalAngle().Y; + + // Limit angle and ajust with given offset + angle = (angle + (int)e->number) % 360; + + core::rect dstrect(0, 0, dstsize.X, dstsize.Y); + dstrect += pos + v2s32( + (e->align.X - 1.0) * dstsize.X / 2, + (e->align.Y - 1.0) * dstsize.Y / 2) + + v2s32(e->offset.X * m_hud_scaling, e->offset.Y * m_hud_scaling); + + switch (e->dir) { + case HUD_COMPASS_ROTATE: + drawCompassRotate(e, texture, dstrect, angle); + break; + case HUD_COMPASS_ROTATE_REVERSE: + drawCompassRotate(e, texture, dstrect, -angle); + break; + case HUD_COMPASS_TRANSLATE: + drawCompassTranslate(e, texture, dstrect, angle); + break; + case HUD_COMPASS_TRANSLATE_REVERSE: + drawCompassTranslate(e, texture, dstrect, -angle); + break; + default: + break; + } + + break; } default: infostream << "Hud::drawLuaElements: ignoring drawform " << e->type << " of hud element ID " << i << " due to unrecognized type" << std::endl; @@ -430,6 +500,76 @@ void Hud::drawLuaElements(const v3s16 &camera_offset) } } +void Hud::drawCompassTranslate(HudElement *e, video::ITexture *texture, + const core::rect &rect, int angle) +{ + const video::SColor color(255, 255, 255, 255); + const video::SColor colors[] = {color, color, color, color}; + + // Compute source image scaling + core::dimension2di imgsize(texture->getOriginalSize()); + core::rect srcrect(0, 0, imgsize.Width, imgsize.Height); + + v2s32 dstsize(rect.getHeight() * e->scale.X * imgsize.Width / imgsize.Height, + rect.getHeight() * e->scale.Y); + + // Avoid infinite loop + if (dstsize.X <= 0 || dstsize.Y <= 0) + return; + + core::rect tgtrect(0, 0, dstsize.X, dstsize.Y); + tgtrect += v2s32( + (rect.getWidth() - dstsize.X) / 2, + (rect.getHeight() - dstsize.Y) / 2) + + rect.UpperLeftCorner; + + int offset = angle * dstsize.X / 360; + + tgtrect += v2s32(offset, 0); + + // Repeat image as much as needed + while (tgtrect.UpperLeftCorner.X > rect.UpperLeftCorner.X) + tgtrect -= v2s32(dstsize.X, 0); + + draw2DImageFilterScaled(driver, texture, tgtrect, srcrect, &rect, colors, true); + tgtrect += v2s32(dstsize.X, 0); + + while (tgtrect.UpperLeftCorner.X < rect.LowerRightCorner.X) { + draw2DImageFilterScaled(driver, texture, tgtrect, srcrect, &rect, colors, true); + tgtrect += v2s32(dstsize.X, 0); + } +} + +void Hud::drawCompassRotate(HudElement *e, video::ITexture *texture, + const core::rect &rect, int angle) +{ + core::dimension2di imgsize(texture->getOriginalSize()); + + core::rect oldViewPort = driver->getViewPort(); + core::matrix4 oldProjMat = driver->getTransform(video::ETS_PROJECTION); + core::matrix4 oldViewMat = driver->getTransform(video::ETS_VIEW); + + core::matrix4 Matrix; + Matrix.makeIdentity(); + Matrix.setRotationDegrees(v3f(0.f, 0.f, angle)); + + driver->setViewPort(rect); + driver->setTransform(video::ETS_PROJECTION, core::matrix4()); + driver->setTransform(video::ETS_VIEW, core::matrix4()); + driver->setTransform(video::ETS_WORLD, Matrix); + + video::SMaterial &material = m_rotation_mesh_buffer.getMaterial(); + material.TextureLayer[0].Texture = texture; + driver->setMaterial(material); + driver->drawMeshBuffer(&m_rotation_mesh_buffer); + + driver->setTransform(video::ETS_WORLD, core::matrix4()); + driver->setTransform(video::ETS_VIEW, oldViewMat); + driver->setTransform(video::ETS_PROJECTION, oldProjMat); + + // restore the view area + driver->setViewPort(oldViewPort); +} void Hud::drawStatbar(v2s32 pos, u16 corner, u16 drawdir, const std::string &texture, const std::string &bgtexture, diff --git a/src/client/hud.h b/src/client/hud.h index ba34d479d..cf83cb16e 100644 --- a/src/client/hud.h +++ b/src/client/hud.h @@ -95,6 +95,12 @@ private: void drawItem(const ItemStack &item, const core::rect &rect, bool selected); + void drawCompassTranslate(HudElement *e, video::ITexture *texture, + const core::rect &rect, int way); + + void drawCompassRotate(HudElement *e, video::ITexture *texture, + const core::rect &rect, int way); + float m_hud_scaling; // cached minetest setting float m_scale_factor; v3s16 m_camera_offset; @@ -115,6 +121,8 @@ private: video::SMaterial m_selection_material; + scene::SMeshBuffer m_rotation_mesh_buffer; + enum { HIGHLIGHT_BOX, diff --git a/src/hud.cpp b/src/hud.cpp index 4830c56a4..175701342 100644 --- a/src/hud.cpp +++ b/src/hud.cpp @@ -28,6 +28,7 @@ const struct EnumString es_HudElementType[] = {HUD_ELEM_INVENTORY, "inventory"}, {HUD_ELEM_WAYPOINT, "waypoint"}, {HUD_ELEM_IMAGE_WAYPOINT, "image_waypoint"}, + {HUD_ELEM_COMPASS, "compass"}, {0, NULL}, }; diff --git a/src/hud.h b/src/hud.h index e015baec1..0a6993c1b 100644 --- a/src/hud.h +++ b/src/hud.h @@ -60,7 +60,8 @@ enum HudElementType { HUD_ELEM_STATBAR = 2, HUD_ELEM_INVENTORY = 3, HUD_ELEM_WAYPOINT = 4, - HUD_ELEM_IMAGE_WAYPOINT = 5 + HUD_ELEM_IMAGE_WAYPOINT = 5, + HUD_ELEM_COMPASS = 6 }; enum HudElementStat { @@ -79,6 +80,13 @@ enum HudElementStat { HUD_STAT_TEXT2, }; +enum HudCompassDir { + HUD_COMPASS_ROTATE = 0, + HUD_COMPASS_ROTATE_REVERSE, + HUD_COMPASS_TRANSLATE, + HUD_COMPASS_TRANSLATE_REVERSE, +}; + struct HudElement { HudElementType type; v2f pos; From c18dbadcb898db6d1f68b72afec56c599af317ec Mon Sep 17 00:00:00 2001 From: LoneWolfHT Date: Sat, 29 Aug 2020 16:02:21 -0700 Subject: [PATCH 049/177] Fix dropped craftitems/tools not using light_source values (#9438) --- builtin/game/item_entity.lua | 2 +- doc/lua_api.txt | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/builtin/game/item_entity.lua b/builtin/game/item_entity.lua index 20dd18044..f380d071d 100644 --- a/builtin/game/item_entity.lua +++ b/builtin/game/item_entity.lua @@ -54,7 +54,7 @@ core.register_entity(":__builtin:item", { local max_count = stack:get_stack_max() local count = math.min(stack:get_count(), max_count) local size = 0.2 + 0.1 * (count / max_count) ^ (1 / 3) - local def = core.registered_nodes[itemname] + local def = core.registered_items[itemname] local glow = def and math.floor(def.light_source / 2 + 0.5) self.object:set_properties({ diff --git a/doc/lua_api.txt b/doc/lua_api.txt index c81824163..6341571c7 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -7026,6 +7026,13 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and liquids_pointable = false, + light_source = 0, + -- When used for nodes: Defines amount of light emitted by node. + -- Otherwise: Defines texture glow when viewed as a dropped item + -- To set the maximum (14), use the value 'minetest.LIGHT_MAX'. + -- A value outside the range 0 to minetest.LIGHT_MAX causes undefined + -- behavior. + -- See "Tools" section for an example including explanation tool_capabilities = { full_punch_interval = 1.0, @@ -7225,12 +7232,6 @@ Used by `minetest.register_node`. drowning = 0, -- Player will take this amount of damage if no bubbles are left - light_source = 0, - -- Amount of light emitted by node. - -- To set the maximum (14), use the value 'minetest.LIGHT_MAX'. - -- A value outside the range 0 to minetest.LIGHT_MAX causes undefined - -- behavior. - damage_per_second = 0, -- If player is inside node, this damage is caused From d3d218940bfbe7b0ac8edb280c7487b0a65c736e Mon Sep 17 00:00:00 2001 From: Pierre-Yves Rollo Date: Sun, 30 Aug 2020 15:34:28 +0200 Subject: [PATCH 050/177] Fix #10349 game crashing if dropped an item with undefined light_source (#10351) --- builtin/game/item_entity.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/builtin/game/item_entity.lua b/builtin/game/item_entity.lua index f380d071d..9b1b23bfd 100644 --- a/builtin/game/item_entity.lua +++ b/builtin/game/item_entity.lua @@ -55,7 +55,8 @@ core.register_entity(":__builtin:item", { local count = math.min(stack:get_count(), max_count) local size = 0.2 + 0.1 * (count / max_count) ^ (1 / 3) local def = core.registered_items[itemname] - local glow = def and math.floor(def.light_source / 2 + 0.5) + local glow = def and def.light_source and + math.floor(def.light_source / 2 + 0.5) self.object:set_properties({ is_visible = true, From f5df70764d560addf747c707c8f9db7f5b0aea4e Mon Sep 17 00:00:00 2001 From: HybridDog <3192173+HybridDog@users.noreply.github.com> Date: Tue, 1 Sep 2020 08:08:18 +0200 Subject: [PATCH 051/177] [2] Code cleanup in serverpackethandler (#9349) * Code cleanup in serverpackethandler * do not define p_under unless a node is pointed * use switch-case and reduce indentation --- src/network/serverpackethandler.cpp | 381 +++++++++++++--------------- 1 file changed, 181 insertions(+), 200 deletions(-) diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index abd9deff0..d133b4ff9 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -986,10 +986,6 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) // Update wielded item playersao->getPlayer()->setWieldIndex(item_i); - // Get pointed to node (undefined if not POINTEDTYPE_NODE) - v3s16 p_under = pointed.node_undersurface; - v3s16 p_above = pointed.node_abovesurface; - // Get pointed to object (NULL if not POINTEDTYPE_OBJECT) ServerActiveObject *pointed_object = NULL; if (pointed.type == POINTEDTHING_OBJECT) { @@ -1002,17 +998,6 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) } - v3f pointed_pos_under = player_pos; - v3f pointed_pos_above = player_pos; - if (pointed.type == POINTEDTHING_NODE) { - pointed_pos_under = intToFloat(p_under, BS); - pointed_pos_above = intToFloat(p_above, BS); - } - else if (pointed.type == POINTEDTHING_OBJECT) { - pointed_pos_under = pointed_object->getBasePosition(); - pointed_pos_above = pointed_pos_under; - } - /* Make sure the player is allowed to do it */ @@ -1020,16 +1005,19 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) actionstream << player->getName() << " attempted to interact with " << pointed.dump() << " without 'interact' privilege" << std::endl; + if (pointed.type != POINTEDTHING_NODE) + return; + // Re-send block to revert change on client-side RemoteClient *client = getClient(peer_id); // Digging completed -> under if (action == INTERACT_DIGGING_COMPLETED) { - v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_under, BS)); + v3s16 blockpos = getNodeBlockPos(pointed.node_undersurface); client->SetBlockNotSent(blockpos); } // Placement -> above else if (action == INTERACT_PLACE) { - v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_above, BS)); + v3s16 blockpos = getNodeBlockPos(pointed.node_abovesurface); client->SetBlockNotSent(blockpos); } return; @@ -1037,7 +1025,6 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) /* Check that target is reasonably close - (only when digging or placing things) */ static thread_local const bool enable_anticheat = !g_settings->getBool("disable_anticheat"); @@ -1045,12 +1032,19 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) if ((action == INTERACT_START_DIGGING || action == INTERACT_DIGGING_COMPLETED || action == INTERACT_PLACE || action == INTERACT_USE) && enable_anticheat && !isSingleplayer()) { - float d = playersao->getEyePosition().getDistanceFrom(pointed_pos_under); + v3f target_pos = player_pos; + if (pointed.type == POINTEDTHING_NODE) { + target_pos = intToFloat(pointed.node_undersurface, BS); + } else if (pointed.type == POINTEDTHING_OBJECT) { + target_pos = pointed_object->getBasePosition(); + } + float d = playersao->getEyePosition().getDistanceFrom(target_pos); - if (!checkInteractDistance(player, d, pointed.dump())) { + if (!checkInteractDistance(player, d, pointed.dump()) + && pointed.type == POINTEDTHING_NODE) { // Re-send block to revert change on client-side RemoteClient *client = getClient(peer_id); - v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_under, BS)); + v3s16 blockpos = getNodeBlockPos(pointed.node_undersurface); client->SetBlockNotSent(blockpos); return; } @@ -1062,20 +1056,20 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) RollbackScopeActor rollback_scope(m_rollback, std::string("player:")+player->getName()); - /* - 0: start digging or punch object - */ - if (action == INTERACT_START_DIGGING) { + switch (action) { + // Start digging or punch object + case INTERACT_START_DIGGING: { if (pointed.type == POINTEDTHING_NODE) { MapNode n(CONTENT_IGNORE); bool pos_ok; + v3s16 p_under = pointed.node_undersurface; n = m_env->getMap().getNode(p_under, &pos_ok); if (!pos_ok) { infostream << "Server: Not punching: Node not found. " "Adding block to emerge queue." << std::endl; - m_emerge->enqueueBlockEmerge(peer_id, getNodeBlockPos(p_above), - false); + m_emerge->enqueueBlockEmerge(peer_id, + getNodeBlockPos(pointed.node_abovesurface), false); } if (n.getContent() != CONTENT_IGNORE) @@ -1083,159 +1077,155 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) // Cheat prevention playersao->noCheatDigStart(p_under); - } - else if (pointed.type == POINTEDTHING_OBJECT) { - // Skip if object can't be interacted with anymore - if (pointed_object->isGone()) - return; - ItemStack selected_item, hand_item; - ItemStack tool_item = playersao->getWieldedItem(&selected_item, &hand_item); - ToolCapabilities toolcap = - tool_item.getToolCapabilities(m_itemdef); - v3f dir = (pointed_object->getBasePosition() - - (playersao->getBasePosition() + playersao->getEyeOffset()) - ).normalize(); - float time_from_last_punch = - playersao->resetTimeFromLastPunch(); - - u16 src_original_hp = pointed_object->getHP(); - u16 dst_origin_hp = playersao->getHP(); - - u16 wear = pointed_object->punch(dir, &toolcap, playersao, - time_from_last_punch); - - // Callback may have changed item, so get it again - playersao->getWieldedItem(&selected_item); - bool changed = selected_item.addWear(wear, m_itemdef); - if (changed) - playersao->setWieldedItem(selected_item); - - // If the object is a player and its HP changed - if (src_original_hp != pointed_object->getHP() && - pointed_object->getType() == ACTIVEOBJECT_TYPE_PLAYER) { - SendPlayerHPOrDie((PlayerSAO *)pointed_object, - PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, playersao)); - } - - // If the puncher is a player and its HP changed - if (dst_origin_hp != playersao->getHP()) - SendPlayerHPOrDie(playersao, - PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, pointed_object)); + return; } + // Skip if the object can't be interacted with anymore + if (pointed.type != POINTEDTHING_OBJECT || pointed_object->isGone()) + return; + + ItemStack selected_item, hand_item; + ItemStack tool_item = playersao->getWieldedItem(&selected_item, &hand_item); + ToolCapabilities toolcap = + tool_item.getToolCapabilities(m_itemdef); + v3f dir = (pointed_object->getBasePosition() - + (playersao->getBasePosition() + playersao->getEyeOffset()) + ).normalize(); + float time_from_last_punch = + playersao->resetTimeFromLastPunch(); + + u16 src_original_hp = pointed_object->getHP(); + u16 dst_origin_hp = playersao->getHP(); + + u16 wear = pointed_object->punch(dir, &toolcap, playersao, + time_from_last_punch); + + // Callback may have changed item, so get it again + playersao->getWieldedItem(&selected_item); + bool changed = selected_item.addWear(wear, m_itemdef); + if (changed) + playersao->setWieldedItem(selected_item); + + // If the object is a player and its HP changed + if (src_original_hp != pointed_object->getHP() && + pointed_object->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + SendPlayerHPOrDie((PlayerSAO *)pointed_object, + PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, playersao)); + } + + // If the puncher is a player and its HP changed + if (dst_origin_hp != playersao->getHP()) + SendPlayerHPOrDie(playersao, + PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, pointed_object)); + + return; } // action == INTERACT_START_DIGGING - /* - 1: stop digging - */ - else if (action == INTERACT_STOP_DIGGING) { - } // action == INTERACT_STOP_DIGGING + case INTERACT_STOP_DIGGING: + // Nothing to do + return; - /* - 2: Digging completed - */ - else if (action == INTERACT_DIGGING_COMPLETED) { + case INTERACT_DIGGING_COMPLETED: { // Only digging of nodes - if (pointed.type == POINTEDTHING_NODE) { - bool pos_ok; - MapNode n = m_env->getMap().getNode(p_under, &pos_ok); - if (!pos_ok) { - infostream << "Server: Not finishing digging: Node not found. " - "Adding block to emerge queue." << std::endl; - m_emerge->enqueueBlockEmerge(peer_id, getNodeBlockPos(p_above), - false); + if (pointed.type != POINTEDTHING_NODE) + return; + bool pos_ok; + v3s16 p_under = pointed.node_undersurface; + MapNode n = m_env->getMap().getNode(p_under, &pos_ok); + if (!pos_ok) { + infostream << "Server: Not finishing digging: Node not found. " + "Adding block to emerge queue." << std::endl; + m_emerge->enqueueBlockEmerge(peer_id, + getNodeBlockPos(pointed.node_abovesurface), false); + } + + /* Cheat prevention */ + bool is_valid_dig = true; + if (enable_anticheat && !isSingleplayer()) { + v3s16 nocheat_p = playersao->getNoCheatDigPos(); + float nocheat_t = playersao->getNoCheatDigTime(); + playersao->noCheatDigEnd(); + // If player didn't start digging this, ignore dig + if (nocheat_p != p_under) { + infostream << "Server: " << player->getName() + << " started digging " + << PP(nocheat_p) << " and completed digging " + << PP(p_under) << "; not digging." << std::endl; + is_valid_dig = false; + // Call callbacks + m_script->on_cheat(playersao, "finished_unknown_dig"); } - /* Cheat prevention */ - bool is_valid_dig = true; - if (enable_anticheat && !isSingleplayer()) { - v3s16 nocheat_p = playersao->getNoCheatDigPos(); - float nocheat_t = playersao->getNoCheatDigTime(); - playersao->noCheatDigEnd(); - // If player didn't start digging this, ignore dig - if (nocheat_p != p_under) { - infostream << "Server: " << player->getName() - << " started digging " - << PP(nocheat_p) << " and completed digging " - << PP(p_under) << "; not digging." << std::endl; - is_valid_dig = false; - // Call callbacks - m_script->on_cheat(playersao, "finished_unknown_dig"); - } + // Get player's wielded item + // See also: Game::handleDigging + ItemStack selected_item, hand_item; + playersao->getPlayer()->getWieldedItem(&selected_item, &hand_item); - // Get player's wielded item - // See also: Game::handleDigging - ItemStack selected_item, hand_item; - playersao->getPlayer()->getWieldedItem(&selected_item, &hand_item); - - // Get diggability and expected digging time - DigParams params = getDigParams(m_nodedef->get(n).groups, - &selected_item.getToolCapabilities(m_itemdef)); - // If can't dig, try hand - if (!params.diggable) { - params = getDigParams(m_nodedef->get(n).groups, - &hand_item.getToolCapabilities(m_itemdef)); - } - // If can't dig, ignore dig - if (!params.diggable) { - infostream << "Server: " << player->getName() - << " completed digging " << PP(p_under) - << ", which is not diggable with tool; not digging." - << std::endl; - is_valid_dig = false; - // Call callbacks - m_script->on_cheat(playersao, "dug_unbreakable"); - } - // Check digging time - // If already invalidated, we don't have to - if (!is_valid_dig) { - // Well not our problem then - } - // Clean and long dig - else if (params.time > 2.0 && nocheat_t * 1.2 > params.time) { - // All is good, but grab time from pool; don't care if - // it's actually available - playersao->getDigPool().grab(params.time); - } - // Short or laggy dig - // Try getting the time from pool - else if (playersao->getDigPool().grab(params.time)) { - // All is good - } - // Dig not possible - else { - infostream << "Server: " << player->getName() - << " completed digging " << PP(p_under) - << "too fast; not digging." << std::endl; - is_valid_dig = false; - // Call callbacks - m_script->on_cheat(playersao, "dug_too_fast"); - } + // Get diggability and expected digging time + DigParams params = getDigParams(m_nodedef->get(n).groups, + &selected_item.getToolCapabilities(m_itemdef)); + // If can't dig, try hand + if (!params.diggable) { + params = getDigParams(m_nodedef->get(n).groups, + &hand_item.getToolCapabilities(m_itemdef)); } - - /* Actually dig node */ - - if (is_valid_dig && n.getContent() != CONTENT_IGNORE) - m_script->node_on_dig(p_under, n, playersao); - - v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_under, BS)); - RemoteClient *client = getClient(peer_id); - // Send unusual result (that is, node not being removed) - if (m_env->getMap().getNode(p_under).getContent() != CONTENT_AIR) { - // Re-send block to revert change on client-side - client->SetBlockNotSent(blockpos); + // If can't dig, ignore dig + if (!params.diggable) { + infostream << "Server: " << player->getName() + << " completed digging " << PP(p_under) + << ", which is not diggable with tool; not digging." + << std::endl; + is_valid_dig = false; + // Call callbacks + m_script->on_cheat(playersao, "dug_unbreakable"); } + // Check digging time + // If already invalidated, we don't have to + if (!is_valid_dig) { + // Well not our problem then + } + // Clean and long dig + else if (params.time > 2.0 && nocheat_t * 1.2 > params.time) { + // All is good, but grab time from pool; don't care if + // it's actually available + playersao->getDigPool().grab(params.time); + } + // Short or laggy dig + // Try getting the time from pool + else if (playersao->getDigPool().grab(params.time)) { + // All is good + } + // Dig not possible else { - client->ResendBlockIfOnWire(blockpos); + infostream << "Server: " << player->getName() + << " completed digging " << PP(p_under) + << "too fast; not digging." << std::endl; + is_valid_dig = false; + // Call callbacks + m_script->on_cheat(playersao, "dug_too_fast"); } } + + /* Actually dig node */ + + if (is_valid_dig && n.getContent() != CONTENT_IGNORE) + m_script->node_on_dig(p_under, n, playersao); + + v3s16 blockpos = getNodeBlockPos(p_under); + RemoteClient *client = getClient(peer_id); + // Send unusual result (that is, node not being removed) + if (m_env->getMap().getNode(p_under).getContent() != CONTENT_AIR) + // Re-send block to revert change on client-side + client->SetBlockNotSent(blockpos); + else + client->ResendBlockIfOnWire(blockpos); + + return; } // action == INTERACT_DIGGING_COMPLETED - /* - 3: place block or right-click object - */ - else if (action == INTERACT_PLACE) { + // Place block or right-click object + case INTERACT_PLACE: { ItemStack selected_item; playersao->getWieldedItem(&selected_item, nullptr); @@ -1264,59 +1254,54 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) } pointed_object->rightClick(playersao); - } else if (m_script->item_OnPlace( - selected_item, playersao, pointed)) { + } else if (m_script->item_OnPlace(selected_item, playersao, pointed)) { // Placement was handled in lua // Apply returned ItemStack - if (playersao->setWieldedItem(selected_item)) { + if (playersao->setWieldedItem(selected_item)) SendInventory(playersao, true); - } } + if (pointed.type != POINTEDTHING_NODE) + return; + // If item has node placement prediction, always send the // blocks to make sure the client knows what exactly happened RemoteClient *client = getClient(peer_id); - v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_above, BS)); - v3s16 blockpos2 = getNodeBlockPos(floatToInt(pointed_pos_under, BS)); - if (!selected_item.getDefinition(m_itemdef).node_placement_prediction.empty()) { + v3s16 blockpos = getNodeBlockPos(pointed.node_abovesurface); + v3s16 blockpos2 = getNodeBlockPos(pointed.node_undersurface); + if (!selected_item.getDefinition(m_itemdef + ).node_placement_prediction.empty()) { client->SetBlockNotSent(blockpos); - if (blockpos2 != blockpos) { + if (blockpos2 != blockpos) client->SetBlockNotSent(blockpos2); - } - } - else { + } else { client->ResendBlockIfOnWire(blockpos); - if (blockpos2 != blockpos) { + if (blockpos2 != blockpos) client->ResendBlockIfOnWire(blockpos2); - } } + + return; } // action == INTERACT_PLACE - /* - 4: use - */ - else if (action == INTERACT_USE) { + case INTERACT_USE: { ItemStack selected_item; playersao->getWieldedItem(&selected_item, nullptr); actionstream << player->getName() << " uses " << selected_item.name << ", pointing at " << pointed.dump() << std::endl; - if (m_script->item_OnUse( - selected_item, playersao, pointed)) { + if (m_script->item_OnUse(selected_item, playersao, pointed)) { // Apply returned ItemStack - if (playersao->setWieldedItem(selected_item)) { + if (playersao->setWieldedItem(selected_item)) SendInventory(playersao, true); - } } - } // action == INTERACT_USE + return; + } - /* - 5: rightclick air - */ - else if (action == INTERACT_ACTIVATE) { + // Rightclick air + case INTERACT_ACTIVATE: { ItemStack selected_item; playersao->getWieldedItem(&selected_item, nullptr); @@ -1325,21 +1310,17 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) pointed.type = POINTEDTHING_NOTHING; // can only ever be NOTHING - if (m_script->item_OnSecondaryUse( - selected_item, playersao, pointed)) { - if (playersao->setWieldedItem(selected_item)) { + if (m_script->item_OnSecondaryUse(selected_item, playersao, pointed)) { + if (playersao->setWieldedItem(selected_item)) SendInventory(playersao, true); - } } - } // action == INTERACT_ACTIVATE + return; + } + + default: + warningstream << "Server: Invalid action " << action << std::endl; - /* - Catch invalid actions - */ - else { - warningstream << "Server: Invalid action " - << action << std::endl; } } From 9ed84cfa85fe9a03803f2f2aba041363db65672d Mon Sep 17 00:00:00 2001 From: DS Date: Tue, 1 Sep 2020 20:18:10 +0200 Subject: [PATCH 052/177] Mark multiply and divide with two vectors as deprecated (Schur product and quotient) (#10329) --- doc/lua_api.txt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 6341571c7..cc4af970c 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -3080,7 +3080,8 @@ Internally, it is implemented as a table with the 3 fields `x`, `y` and `z`. Example: `{x = 0, y = 1, z = 0}`. For the following functions, `v`, `v1`, `v2` are vectors, -`p1`, `p2` are positions: +`p1`, `p2` are positions, +`s` is a scalar (a number): * `vector.new(a[, b, c])`: * Returns a vector. @@ -3126,10 +3127,12 @@ For the following functions `x` can be either a vector or a number: * Returns a vector. * If `x` is a vector: Returns the difference of `v` subtracted by `x`. * If `x` is a number: Subtracts `x` from each component of `v`. -* `vector.multiply(v, x)`: - * Returns a scaled vector or Schur product. -* `vector.divide(v, x)`: - * Returns a scaled vector or Schur quotient. +* `vector.multiply(v, s)`: + * Returns a scaled vector. + * Deprecated: If `s` is a vector: Returns the Schur product. +* `vector.divide(v, s)`: + * Returns a scaled vector. + * Deprecated: If `s` is a vector: Returns the Schur quotient. For the following functions `a` is an angle in radians and `r` is a rotation vector ({x = , y = , z = }) where pitch, yaw and roll are From 74e22b72e1fc577d05ea703aed4bfa8c1e1f0599 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Tue, 1 Sep 2020 20:18:32 +0200 Subject: [PATCH 053/177] Change default ambient occlusion gamma to 1.8 (#10185) --- src/defaultsettings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index c93af9506..d2115c959 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -230,7 +230,7 @@ void set_default_settings(Settings *settings) settings->setDefault("show_entity_selectionbox", "false"); settings->setDefault("texture_clean_transparent", "false"); settings->setDefault("texture_min_size", "64"); - settings->setDefault("ambient_occlusion_gamma", "2.2"); + settings->setDefault("ambient_occlusion_gamma", "1.8"); #if ENABLE_GLES settings->setDefault("enable_shaders", "false"); #else From 4ba5046308d6bdf7b38394770c6f82b6927393f2 Mon Sep 17 00:00:00 2001 From: Paramat Date: Thu, 3 Sep 2020 01:28:40 +0100 Subject: [PATCH 054/177] Add 'ores' global mapgen flag (#10276) --- builtin/settingtypes.txt | 2 +- src/mapgen/mapgen.cpp | 3 ++- src/mapgen/mapgen.h | 1 + src/mapgen/mapgen_carpathian.cpp | 3 ++- src/mapgen/mapgen_flat.cpp | 3 ++- src/mapgen/mapgen_fractal.cpp | 3 ++- src/mapgen/mapgen_v5.cpp | 3 ++- src/mapgen/mapgen_v6.cpp | 3 ++- src/mapgen/mapgen_v7.cpp | 3 ++- src/mapgen/mapgen_valleys.cpp | 3 ++- 10 files changed, 18 insertions(+), 9 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index ef56f99bf..39cc22d62 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -1475,7 +1475,7 @@ mapgen_limit (Map generation limit) int 31000 0 31000 # Global map generation attributes. # In Mapgen v6 the 'decorations' flag controls all decorations except trees # and junglegrass, in all other mapgens this flag controls all decorations. -mg_flags (Mapgen flags) flags caves,dungeons,light,decorations,biomes caves,dungeons,light,decorations,biomes,nocaves,nodungeons,nolight,nodecorations,nobiomes +mg_flags (Mapgen flags) flags caves,dungeons,light,decorations,biomes,ores caves,dungeons,light,decorations,biomes,ores,nocaves,nodungeons,nolight,nodecorations,nobiomes,noores [*Biome API temperature and humidity noise parameters] diff --git a/src/mapgen/mapgen.cpp b/src/mapgen/mapgen.cpp index f57529082..52ef64e7e 100644 --- a/src/mapgen/mapgen.cpp +++ b/src/mapgen/mapgen.cpp @@ -58,6 +58,7 @@ FlagDesc flagdesc_mapgen[] = { {"light", MG_LIGHT}, {"decorations", MG_DECORATIONS}, {"biomes", MG_BIOMES}, + {"ores", MG_ORES}, {NULL, 0} }; @@ -217,7 +218,7 @@ void Mapgen::getMapgenNames(std::vector *mgnames, bool include_hid void Mapgen::setDefaultSettings(Settings *settings) { settings->setDefault("mg_flags", flagdesc_mapgen, - MG_CAVES | MG_DUNGEONS | MG_LIGHT | MG_DECORATIONS | MG_BIOMES); + MG_CAVES | MG_DUNGEONS | MG_LIGHT | MG_DECORATIONS | MG_BIOMES | MG_ORES); for (int i = 0; i < (int)MAPGEN_INVALID; ++i) { MapgenParams *params = createMapgenParams((MapgenType)i); diff --git a/src/mapgen/mapgen.h b/src/mapgen/mapgen.h index a92b3b0d0..0f2977c4c 100644 --- a/src/mapgen/mapgen.h +++ b/src/mapgen/mapgen.h @@ -37,6 +37,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #define MG_LIGHT 0x10 #define MG_DECORATIONS 0x20 #define MG_BIOMES 0x40 +#define MG_ORES 0x80 typedef u16 biome_t; // copy from mg_biome.h to avoid an unnecessary include diff --git a/src/mapgen/mapgen_carpathian.cpp b/src/mapgen/mapgen_carpathian.cpp index feb9b428c..74ed263ba 100644 --- a/src/mapgen/mapgen_carpathian.cpp +++ b/src/mapgen/mapgen_carpathian.cpp @@ -315,7 +315,8 @@ void MapgenCarpathian::makeChunk(BlockMakeData *data) } // Generate the registered ores - m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max); + if (flags & MG_ORES) + m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max); // Generate dungeons if (flags & MG_DUNGEONS) diff --git a/src/mapgen/mapgen_flat.cpp b/src/mapgen/mapgen_flat.cpp index df6469ad9..d62548014 100644 --- a/src/mapgen/mapgen_flat.cpp +++ b/src/mapgen/mapgen_flat.cpp @@ -264,7 +264,8 @@ void MapgenFlat::makeChunk(BlockMakeData *data) } // Generate the registered ores - m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max); + if (flags & MG_ORES) + m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max); if (flags & MG_DUNGEONS) generateDungeons(stone_surface_max_y); diff --git a/src/mapgen/mapgen_fractal.cpp b/src/mapgen/mapgen_fractal.cpp index cb55bc288..3b6bbd6c1 100644 --- a/src/mapgen/mapgen_fractal.cpp +++ b/src/mapgen/mapgen_fractal.cpp @@ -250,7 +250,8 @@ void MapgenFractal::makeChunk(BlockMakeData *data) } // Generate the registered ores - m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max); + if (flags & MG_ORES) + m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max); // Generate dungeons if (flags & MG_DUNGEONS) diff --git a/src/mapgen/mapgen_v5.cpp b/src/mapgen/mapgen_v5.cpp index 124667e5d..0f6a19fa1 100644 --- a/src/mapgen/mapgen_v5.cpp +++ b/src/mapgen/mapgen_v5.cpp @@ -257,7 +257,8 @@ void MapgenV5::makeChunk(BlockMakeData *data) } // Generate the registered ores - m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max); + if (flags & MG_ORES) + m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max); // Generate dungeons and desert temples if (flags & MG_DUNGEONS) diff --git a/src/mapgen/mapgen_v6.cpp b/src/mapgen/mapgen_v6.cpp index e9692246c..8bea5eb69 100644 --- a/src/mapgen/mapgen_v6.cpp +++ b/src/mapgen/mapgen_v6.cpp @@ -652,7 +652,8 @@ void MapgenV6::makeChunk(BlockMakeData *data) m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max); // Generate the registered ores - m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max); + if (flags & MG_ORES) + m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max); // Calculate lighting if (flags & MG_LIGHT) diff --git a/src/mapgen/mapgen_v7.cpp b/src/mapgen/mapgen_v7.cpp index e93dc9140..a1fe25ab6 100644 --- a/src/mapgen/mapgen_v7.cpp +++ b/src/mapgen/mapgen_v7.cpp @@ -377,7 +377,8 @@ void MapgenV7::makeChunk(BlockMakeData *data) } // Generate the registered ores - m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max); + if (flags & MG_ORES) + m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max); // Generate dungeons if (flags & MG_DUNGEONS) diff --git a/src/mapgen/mapgen_valleys.cpp b/src/mapgen/mapgen_valleys.cpp index efcc8ee85..d7b6f738f 100644 --- a/src/mapgen/mapgen_valleys.cpp +++ b/src/mapgen/mapgen_valleys.cpp @@ -268,7 +268,8 @@ void MapgenValleys::makeChunk(BlockMakeData *data) } // Generate the registered ores - m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max); + if (flags & MG_ORES) + m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max); // Dungeon creation if (flags & MG_DUNGEONS) From 050964bed6005f8d816ddf362b9fc8675581d190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= <34514239+appgurueu@users.noreply.github.com> Date: Fri, 4 Sep 2020 20:49:07 +0200 Subject: [PATCH 055/177] Fix inventory swapping not calling all callbacks (#9923) "Predicts" whether something will be swapped for allow callbacks, then calls callbacks a second time with swapped properties. Co-authored-by: SmallJoker --- doc/lua_api.txt | 25 ++++ src/inventory.cpp | 9 +- src/inventorymanager.cpp | 301 ++++++++++++++++++++++----------------- src/inventorymanager.h | 12 ++ 4 files changed, 209 insertions(+), 138 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index cc4af970c..86627c19e 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -5888,6 +5888,31 @@ An `InvRef` is a reference to an inventory. `minetest.get_inventory(location)`. * returns `{type="undefined"}` in case location is not known +### Callbacks + +Detached & nodemeta inventories provide the following callbacks for move actions: + +#### Before + +The `allow_*` callbacks return how many items can be moved. + +* `allow_move`/`allow_metadata_inventory_move`: Moving items in the inventory +* `allow_take`/`allow_metadata_inventory_take`: Taking items from the inventory +* `allow_put`/`allow_metadata_inventory_put`: Putting items to the inventory + +#### After + +The `on_*` callbacks are called after the items have been placed in the inventories. + +* `on_move`/`on_metadata_inventory_move`: Moving items in the inventory +* `on_take`/`on_metadata_inventory_take`: Taking items from the inventory +* `on_put`/`on_metadata_inventory_put`: Putting items to the inventory + +#### Swapping + +When a player tries to put an item to a place where another item is, the items are *swapped*. +This means that all callbacks will be called twice (once for each action). + `ItemStack` ----------- diff --git a/src/inventory.cpp b/src/inventory.cpp index 349ee503d..cf72cb005 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -732,17 +732,17 @@ void InventoryList::moveItemSomewhere(u32 i, InventoryList *dest, u32 count) u32 InventoryList::moveItem(u32 i, InventoryList *dest, u32 dest_i, u32 count, bool swap_if_needed, bool *did_swap) { - if(this == dest && i == dest_i) + if (this == dest && i == dest_i) return count; // Take item from source list ItemStack item1; - if(count == 0) + if (count == 0) item1 = changeItem(i, ItemStack()); else item1 = takeItem(i, count); - if(item1.empty()) + if (item1.empty()) return 0; // Try to add the item to destination list @@ -750,8 +750,7 @@ u32 InventoryList::moveItem(u32 i, InventoryList *dest, u32 dest_i, item1 = dest->addItem(dest_i, item1); // If something is returned, the item was not fully added - if(!item1.empty()) - { + if (!item1.empty()) { // If olditem is returned, nothing was added. bool nothing_added = (item1.count == oldcount); diff --git a/src/inventorymanager.cpp b/src/inventorymanager.cpp index b6f464901..635bd2e4b 100644 --- a/src/inventorymanager.cpp +++ b/src/inventorymanager.cpp @@ -154,6 +154,93 @@ IMoveAction::IMoveAction(std::istream &is, bool somewhere) : } } +void IMoveAction::swapDirections() +{ + std::swap(from_inv, to_inv); + std::swap(from_list, to_list); + std::swap(from_i, to_i); +} + +void IMoveAction::onPutAndOnTake(const ItemStack &src_item, ServerActiveObject *player) const +{ + ServerScripting *sa = PLAYER_TO_SA(player); + if (to_inv.type == InventoryLocation::DETACHED) + sa->detached_inventory_OnPut(*this, src_item, player); + else if (to_inv.type == InventoryLocation::NODEMETA) + sa->nodemeta_inventory_OnPut(*this, src_item, player); + else if (to_inv.type == InventoryLocation::PLAYER) + sa->player_inventory_OnPut(*this, src_item, player); + else + assert(false); + + if (from_inv.type == InventoryLocation::DETACHED) + sa->detached_inventory_OnTake(*this, src_item, player); + else if (from_inv.type == InventoryLocation::NODEMETA) + sa->nodemeta_inventory_OnTake(*this, src_item, player); + else if (from_inv.type == InventoryLocation::PLAYER) + sa->player_inventory_OnTake(*this, src_item, player); + else + assert(false); +} + +void IMoveAction::onMove(int count, ServerActiveObject *player) const +{ + ServerScripting *sa = PLAYER_TO_SA(player); + if (from_inv.type == InventoryLocation::DETACHED) + sa->detached_inventory_OnMove(*this, count, player); + else if (from_inv.type == InventoryLocation::NODEMETA) + sa->nodemeta_inventory_OnMove(*this, count, player); + else if (from_inv.type == InventoryLocation::PLAYER) + sa->player_inventory_OnMove(*this, count, player); + else + assert(false); +} + +int IMoveAction::allowPut(const ItemStack &dst_item, ServerActiveObject *player) const +{ + ServerScripting *sa = PLAYER_TO_SA(player); + int dst_can_put_count = 0xffff; + if (to_inv.type == InventoryLocation::DETACHED) + dst_can_put_count = sa->detached_inventory_AllowPut(*this, dst_item, player); + else if (to_inv.type == InventoryLocation::NODEMETA) + dst_can_put_count = sa->nodemeta_inventory_AllowPut(*this, dst_item, player); + else if (to_inv.type == InventoryLocation::PLAYER) + dst_can_put_count = sa->player_inventory_AllowPut(*this, dst_item, player); + else + assert(false); + return dst_can_put_count; +} + +int IMoveAction::allowTake(const ItemStack &src_item, ServerActiveObject *player) const +{ + ServerScripting *sa = PLAYER_TO_SA(player); + int src_can_take_count = 0xffff; + if (from_inv.type == InventoryLocation::DETACHED) + src_can_take_count = sa->detached_inventory_AllowTake(*this, src_item, player); + else if (from_inv.type == InventoryLocation::NODEMETA) + src_can_take_count = sa->nodemeta_inventory_AllowTake(*this, src_item, player); + else if (from_inv.type == InventoryLocation::PLAYER) + src_can_take_count = sa->player_inventory_AllowTake(*this, src_item, player); + else + assert(false); + return src_can_take_count; +} + +int IMoveAction::allowMove(int try_take_count, ServerActiveObject *player) const +{ + ServerScripting *sa = PLAYER_TO_SA(player); + int src_can_take_count = 0xffff; + if (from_inv.type == InventoryLocation::DETACHED) + src_can_take_count = sa->detached_inventory_AllowMove(*this, try_take_count, player); + else if (from_inv.type == InventoryLocation::NODEMETA) + src_can_take_count = sa->nodemeta_inventory_AllowMove(*this, try_take_count, player); + else if (from_inv.type == InventoryLocation::PLAYER) + src_can_take_count = sa->player_inventory_AllowMove(*this, try_take_count, player); + else + assert(false); + return src_can_take_count; +} + void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGameDef *gamedef) { Inventory *inv_from = mgr->getInventory(from_inv); @@ -251,93 +338,80 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame Collect information of endpoints */ - int try_take_count = count; - if (try_take_count == 0) - try_take_count = list_from->getItem(from_i).count; + ItemStack src_item = list_from->getItem(from_i); + if (count > 0) + src_item.count = count; + if (src_item.empty()) + return; int src_can_take_count = 0xffff; int dst_can_put_count = 0xffff; - /* Query detached inventories */ + // this is needed for swapping items inside one inventory to work + ItemStack restitem; + bool allow_swap = !list_to->itemFits(to_i, src_item, &restitem) + && restitem.count == src_item.count + && !caused_by_move_somewhere; - // Move occurs in the same detached inventory - if (from_inv.type == InventoryLocation::DETACHED && - from_inv == to_inv) { - src_can_take_count = PLAYER_TO_SA(player)->detached_inventory_AllowMove( - *this, try_take_count, player); - dst_can_put_count = src_can_take_count; - } else { - // Destination is detached - if (to_inv.type == InventoryLocation::DETACHED) { - ItemStack src_item = list_from->getItem(from_i); - src_item.count = try_take_count; - dst_can_put_count = PLAYER_TO_SA(player)->detached_inventory_AllowPut( - *this, src_item, player); - } - // Source is detached - if (from_inv.type == InventoryLocation::DETACHED) { - ItemStack src_item = list_from->getItem(from_i); - src_item.count = try_take_count; - src_can_take_count = PLAYER_TO_SA(player)->detached_inventory_AllowTake( - *this, src_item, player); - } + // Shift-click: Cannot fill this stack, proceed with next slot + if (caused_by_move_somewhere && restitem.count == src_item.count) + return; + + if (allow_swap) { + // Swap will affect the entire stack if it can performed. + src_item = list_from->getItem(from_i); + count = src_item.count; } - /* Query node metadata inventories */ + if (from_inv == to_inv) { + // Move action within the same inventory + src_can_take_count = allowMove(src_item.count, player); - // Both endpoints are nodemeta - // Move occurs in the same nodemeta inventory - if (from_inv.type == InventoryLocation::NODEMETA && - from_inv == to_inv) { - src_can_take_count = PLAYER_TO_SA(player)->nodemeta_inventory_AllowMove( - *this, try_take_count, player); - dst_can_put_count = src_can_take_count; + bool swap_expected = allow_swap; + allow_swap = allow_swap + && (src_can_take_count == -1 || src_can_take_count >= src_item.count); + if (allow_swap) { + int try_put_count = list_to->getItem(to_i).count; + swapDirections(); + dst_can_put_count = allowMove(try_put_count, player); + allow_swap = allow_swap + && (dst_can_put_count == -1 || dst_can_put_count >= try_put_count); + swapDirections(); + } else { + dst_can_put_count = src_can_take_count; + } + if (swap_expected != allow_swap) + src_can_take_count = dst_can_put_count = 0; } else { - // Destination is nodemeta - if (to_inv.type == InventoryLocation::NODEMETA) { - ItemStack src_item = list_from->getItem(from_i); - src_item.count = try_take_count; - dst_can_put_count = PLAYER_TO_SA(player)->nodemeta_inventory_AllowPut( - *this, src_item, player); - } - // Source is nodemeta - if (from_inv.type == InventoryLocation::NODEMETA) { - ItemStack src_item = list_from->getItem(from_i); - src_item.count = try_take_count; - src_can_take_count = PLAYER_TO_SA(player)->nodemeta_inventory_AllowTake( - *this, src_item, player); - } - } + // Take from one inventory, put into another + dst_can_put_count = allowPut(src_item, player); + src_can_take_count = allowTake(src_item, player); + + bool swap_expected = allow_swap; + allow_swap = allow_swap + && (src_can_take_count == -1 || src_can_take_count >= src_item.count) + && (dst_can_put_count == -1 || dst_can_put_count >= src_item.count); + // A swap is expected, which means that we have to + // run the "allow" callbacks a second time with swapped inventories + if (allow_swap) { + ItemStack dst_item = list_to->getItem(to_i); + swapDirections(); - // Query player inventories - - // Move occurs in the same player inventory - if (from_inv.type == InventoryLocation::PLAYER && - from_inv == to_inv) { - src_can_take_count = PLAYER_TO_SA(player)->player_inventory_AllowMove( - *this, try_take_count, player); - dst_can_put_count = src_can_take_count; - } else { - // Destination is a player - if (to_inv.type == InventoryLocation::PLAYER) { - ItemStack src_item = list_from->getItem(from_i); - src_item.count = try_take_count; - dst_can_put_count = PLAYER_TO_SA(player)->player_inventory_AllowPut( - *this, src_item, player); - } - // Source is a player - if (from_inv.type == InventoryLocation::PLAYER) { - ItemStack src_item = list_from->getItem(from_i); - src_item.count = try_take_count; - src_can_take_count = PLAYER_TO_SA(player)->player_inventory_AllowTake( - *this, src_item, player); + int src_can_take = allowPut(dst_item, player); + int dst_can_put = allowTake(dst_item, player); + allow_swap = allow_swap + && (src_can_take == -1 || src_can_take >= dst_item.count) + && (dst_can_put == -1 || dst_can_put >= dst_item.count); + swapDirections(); } + if (swap_expected != allow_swap) + src_can_take_count = dst_can_put_count = 0; } int old_count = count; /* Modify count according to collected data */ - count = try_take_count; + count = src_item.count; if (src_can_take_count != -1 && count > src_can_take_count) count = src_can_take_count; if (dst_can_put_count != -1 && count > dst_can_put_count) @@ -367,7 +441,7 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame return; } - ItemStack src_item = list_from->getItem(from_i); + src_item = list_from->getItem(from_i); src_item.count = count; ItemStack from_stack_was = list_from->getItem(from_i); ItemStack to_stack_was = list_to->getItem(to_i); @@ -380,7 +454,8 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame */ bool did_swap = false; move_count = list_from->moveItem(from_i, - list_to, to_i, count, !caused_by_move_somewhere, &did_swap); + list_to, to_i, count, allow_swap, &did_swap); + assert(allow_swap == did_swap); // If source is infinite, reset it's stack if (src_can_take_count == -1) { @@ -471,69 +546,29 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame Report move to endpoints */ - /* Detached inventories */ - - // Both endpoints are same detached - if (from_inv.type == InventoryLocation::DETACHED && - from_inv == to_inv) { - PLAYER_TO_SA(player)->detached_inventory_OnMove( - *this, count, player); + // Source = destination => move + if (from_inv == to_inv) { + onMove(count, player); + if (did_swap) { + // Item is now placed in source list + src_item = list_from->getItem(from_i); + swapDirections(); + onMove(src_item.count, player); + swapDirections(); + } + mgr->setInventoryModified(from_inv); } else { - // Destination is detached - if (to_inv.type == InventoryLocation::DETACHED) { - PLAYER_TO_SA(player)->detached_inventory_OnPut( - *this, src_item, player); + onPutAndOnTake(src_item, player); + if (did_swap) { + // Item is now placed in source list + src_item = list_from->getItem(from_i); + swapDirections(); + onPutAndOnTake(src_item, player); + swapDirections(); } - // Source is detached - if (from_inv.type == InventoryLocation::DETACHED) { - PLAYER_TO_SA(player)->detached_inventory_OnTake( - *this, src_item, player); - } - } - - /* Node metadata inventories */ - - // Both endpoints are same nodemeta - if (from_inv.type == InventoryLocation::NODEMETA && - from_inv == to_inv) { - PLAYER_TO_SA(player)->nodemeta_inventory_OnMove( - *this, count, player); - } else { - // Destination is nodemeta - if (to_inv.type == InventoryLocation::NODEMETA) { - PLAYER_TO_SA(player)->nodemeta_inventory_OnPut( - *this, src_item, player); - } - // Source is nodemeta - if (from_inv.type == InventoryLocation::NODEMETA) { - PLAYER_TO_SA(player)->nodemeta_inventory_OnTake( - *this, src_item, player); - } - } - - // Player inventories - - // Both endpoints are same player inventory - if (from_inv.type == InventoryLocation::PLAYER && - from_inv == to_inv) { - PLAYER_TO_SA(player)->player_inventory_OnMove( - *this, count, player); - } else { - // Destination is player inventory - if (to_inv.type == InventoryLocation::PLAYER) { - PLAYER_TO_SA(player)->player_inventory_OnPut( - *this, src_item, player); - } - // Source is player inventory - if (from_inv.type == InventoryLocation::PLAYER) { - PLAYER_TO_SA(player)->player_inventory_OnTake( - *this, src_item, player); - } - } - - mgr->setInventoryModified(from_inv); - if (inv_from != inv_to) mgr->setInventoryModified(to_inv); + mgr->setInventoryModified(from_inv); + } } void IMoveAction::clientApply(InventoryManager *mgr, IGameDef *gamedef) diff --git a/src/inventorymanager.h b/src/inventorymanager.h index 69bf30169..4ad5d3f49 100644 --- a/src/inventorymanager.h +++ b/src/inventorymanager.h @@ -183,6 +183,18 @@ struct IMoveAction : public InventoryAction, public MoveAction void apply(InventoryManager *mgr, ServerActiveObject *player, IGameDef *gamedef); void clientApply(InventoryManager *mgr, IGameDef *gamedef); + + void swapDirections(); + + void onPutAndOnTake(const ItemStack &src_item, ServerActiveObject *player) const; + + void onMove(int count, ServerActiveObject *player) const; + + int allowPut(const ItemStack &dst_item, ServerActiveObject *player) const; + + int allowTake(const ItemStack &src_item, ServerActiveObject *player) const; + + int allowMove(int try_take_count, ServerActiveObject *player) const; }; struct IDropAction : public InventoryAction, public MoveAction From b3ace8f19746b53f839e7b0bdff0843c83866f64 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 4 Sep 2020 20:49:50 +0200 Subject: [PATCH 056/177] Scale inventory image for scaled allfaces nodes (#10225) The inventory image size of the inventory image of nodes with drawtype allfaces (and related) is scaled as well if visual_scale is set (previously, the inventory image size was always the same) --- games/devtest/mods/testnodes/drawtypes.lua | 9 +++++++++ src/client/wieldmesh.cpp | 2 ++ 2 files changed, 11 insertions(+) diff --git a/games/devtest/mods/testnodes/drawtypes.lua b/games/devtest/mods/testnodes/drawtypes.lua index 6bf57fa37..82d862819 100644 --- a/games/devtest/mods/testnodes/drawtypes.lua +++ b/games/devtest/mods/testnodes/drawtypes.lua @@ -514,6 +514,15 @@ local scale = function(subname, desc_double, desc_half) minetest.register_node("testnodes:"..subname.."_half", def) end +scale("allfaces", + S("Double-sized Allfaces Drawtype Test Node"), + S("Half-sized Allfaces Drawtype Test Node")) +scale("allfaces_optional", + S("Double-sized Allfaces Optional Drawtype Test Node"), + S("Half-sized Allfaces Optional Drawtype Test Node")) +scale("allfaces_optional_waving", + S("Double-sized Waving Allfaces Optional Drawtype Test Node"), + S("Half-sized Waving Allfaces Optional Drawtype Test Node")) scale("plantlike", S("Double-sized Plantlike Drawtype Test Node"), S("Half-sized Plantlike Drawtype Test Node")) diff --git a/src/client/wieldmesh.cpp b/src/client/wieldmesh.cpp index a268895ed..285cc38e5 100644 --- a/src/client/wieldmesh.cpp +++ b/src/client/wieldmesh.cpp @@ -562,6 +562,8 @@ void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result) // add overlays postProcessNodeMesh(mesh, f, false, false, nullptr, &result->buffer_colors, true); + if (f.drawtype == NDT_ALLFACES) + scaleMesh(mesh, v3f(f.visual_scale)); break; } case NDT_PLANTLIKE: { From 9faeca329039f33f7e2af99eb021cea5b18beceb Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Fri, 4 Sep 2020 20:50:03 +0200 Subject: [PATCH 057/177] Devtest: Extend tooltips of many items and tools (#10312) Also show error message when using tools wrong --- games/devtest/README.md | 2 +- games/devtest/mods/basenodes/init.lua | 23 ++++-- games/devtest/mods/basetools/init.lua | 72 ++++++++++++------ games/devtest/mods/bucket/init.lua | 3 +- games/devtest/mods/chest/init.lua | 3 +- .../devtest/mods/chest_of_everything/init.lua | 3 +- games/devtest/mods/experimental/items.lua | 6 +- games/devtest/mods/soundstuff/init.lua | 7 +- games/devtest/mods/testentities/armor.lua | 2 +- games/devtest/mods/testnodes/light.lua | 6 +- games/devtest/mods/testpathfinder/init.lua | 6 +- games/devtest/mods/testtools/init.lua | 74 ++++++++++++++----- 12 files changed, 147 insertions(+), 60 deletions(-) diff --git a/games/devtest/README.md b/games/devtest/README.md index a7e93cf11..8b71da625 100644 --- a/games/devtest/README.md +++ b/games/devtest/README.md @@ -25,7 +25,7 @@ Basically, just create a world and start. A few important things to note: * Check out the game settings and server commands for additional tests and features * Creative Mode does nothing (apart from default engine behavior) -Confused by a certain node or item? Check out for inline code comments. +Confused by a certain node or item? Check out for inline code comments. The usages of most tools are explained in their tooltips. ### Example tests diff --git a/games/devtest/mods/basenodes/init.lua b/games/devtest/mods/basenodes/init.lua index 8156c4bec..7ffbadbea 100644 --- a/games/devtest/mods/basenodes/init.lua +++ b/games/devtest/mods/basenodes/init.lua @@ -124,7 +124,8 @@ minetest.register_node("basenodes:pine_needles", { }) minetest.register_node("basenodes:water_source", { - description = "Water Source", + description = "Water Source".."\n".. + "Drowning damage: 1", drawtype = "liquid", tiles = {"default_water.png"}, special_tiles = { @@ -148,7 +149,8 @@ minetest.register_node("basenodes:water_source", { }) minetest.register_node("basenodes:water_flowing", { - description = "Flowing Water", + description = "Flowing Water".."\n".. + "Drowning damage: 1", drawtype = "flowingliquid", tiles = {"default_water_flowing.png"}, special_tiles = { @@ -173,7 +175,8 @@ minetest.register_node("basenodes:water_flowing", { }) minetest.register_node("basenodes:river_water_source", { - description = "River Water Source", + description = "River Water Source".."\n".. + "Drowning damage: 1", drawtype = "liquid", tiles = { "default_river_water.png" }, special_tiles = { @@ -199,7 +202,8 @@ minetest.register_node("basenodes:river_water_source", { }) minetest.register_node("basenodes:river_water_flowing", { - description = "Flowing River Water", + description = "Flowing River Water".."\n".. + "Drowning damage: 1", drawtype = "flowingliquid", tiles = {"default_river_water_flowing.png"}, special_tiles = { @@ -226,7 +230,9 @@ minetest.register_node("basenodes:river_water_flowing", { }) minetest.register_node("basenodes:lava_flowing", { - description = "Flowing Lava", + description = "Flowing Lava".."\n".. + "4 damage per second".."\n".. + "Drowning damage: 1", drawtype = "flowingliquid", tiles = {"default_lava_flowing.png"}, special_tiles = { @@ -251,7 +257,9 @@ minetest.register_node("basenodes:lava_flowing", { }) minetest.register_node("basenodes:lava_source", { - description = "Lava Source", + description = "Lava Source".."\n".. + "4 damage per second".."\n".. + "Drowning damage: 1", drawtype = "liquid", tiles = { "default_lava.png" }, special_tiles = { @@ -290,7 +298,8 @@ minetest.register_node("basenodes:mossycobble", { }) minetest.register_node("basenodes:apple", { - description = "Apple", + description = "Apple".."\n".. + "Food (+2)", drawtype = "plantlike", tiles ={"default_apple.png"}, inventory_image = "default_apple.png", diff --git a/games/devtest/mods/basetools/init.lua b/games/devtest/mods/basetools/init.lua index c5b4cd76c..e4a36ca46 100644 --- a/games/devtest/mods/basetools/init.lua +++ b/games/devtest/mods/basetools/init.lua @@ -42,7 +42,8 @@ minetest.register_item(":", { -- Mese Pickaxe: special tool that digs "everything" instantly minetest.register_tool("basetools:pick_mese", { - description = "Mese Pickaxe", + description = "Mese Pickaxe".."\n".. + "Digs diggable nodes instantly", inventory_image = "basetools_mesepick.png", tool_capabilities = { full_punch_interval = 1.0, @@ -65,7 +66,9 @@ minetest.register_tool("basetools:pick_mese", { -- This should break after only 1 use minetest.register_tool("basetools:pick_dirt", { - description = "Dirt Pickaxe", + description = "Dirt Pickaxe".."\n".. + "Digs cracky=3".."\n".. + "1 use only", inventory_image = "basetools_dirtpick.png", tool_capabilities = { max_drop_level=0, @@ -76,7 +79,8 @@ minetest.register_tool("basetools:pick_dirt", { }) minetest.register_tool("basetools:pick_wood", { - description = "Wooden Pickaxe", + description = "Wooden Pickaxe".."\n".. + "Digs cracky=3", inventory_image = "basetools_woodpick.png", tool_capabilities = { max_drop_level=0, @@ -86,7 +90,8 @@ minetest.register_tool("basetools:pick_wood", { }, }) minetest.register_tool("basetools:pick_stone", { - description = "Stone Pickaxe", + description = "Stone Pickaxe".."\n".. + "Digs cracky=2..3", inventory_image = "basetools_stonepick.png", tool_capabilities = { max_drop_level=0, @@ -96,7 +101,8 @@ minetest.register_tool("basetools:pick_stone", { }, }) minetest.register_tool("basetools:pick_steel", { - description = "Steel Pickaxe", + description = "Steel Pickaxe".."\n".. + "Digs cracky=1..3", inventory_image = "basetools_steelpick.png", tool_capabilities = { max_drop_level=1, @@ -106,7 +112,9 @@ minetest.register_tool("basetools:pick_steel", { }, }) minetest.register_tool("basetools:pick_steel_l1", { - description = "Steel Pickaxe Level 1", + description = "Steel Pickaxe Level 1".."\n".. + "Digs cracky=1..3".."\n".. + "maxlevel=1", inventory_image = "basetools_steelpick_l1.png", tool_capabilities = { max_drop_level=1, @@ -116,7 +124,9 @@ minetest.register_tool("basetools:pick_steel_l1", { }, }) minetest.register_tool("basetools:pick_steel_l2", { - description = "Steel Pickaxe Level 2", + description = "Steel Pickaxe Level 2".."\n".. + "Digs cracky=1..3".."\n".. + "maxlevel=2", inventory_image = "basetools_steelpick_l2.png", tool_capabilities = { max_drop_level=1, @@ -131,7 +141,8 @@ minetest.register_tool("basetools:pick_steel_l2", { -- minetest.register_tool("basetools:shovel_wood", { - description = "Wooden Shovel", + description = "Wooden Shovel".."\n".. + "Digs crumbly=3", inventory_image = "basetools_woodshovel.png", tool_capabilities = { max_drop_level=0, @@ -141,7 +152,8 @@ minetest.register_tool("basetools:shovel_wood", { }, }) minetest.register_tool("basetools:shovel_stone", { - description = "Stone Shovel", + description = "Stone Shovel".."\n".. + "Digs crumbly=2..3", inventory_image = "basetools_stoneshovel.png", tool_capabilities = { max_drop_level=0, @@ -151,7 +163,8 @@ minetest.register_tool("basetools:shovel_stone", { }, }) minetest.register_tool("basetools:shovel_steel", { - description = "Steel Shovel", + description = "Steel Shovel".."\n".. + "Digs crumbly=1..3", inventory_image = "basetools_steelshovel.png", tool_capabilities = { max_drop_level=1, @@ -166,7 +179,8 @@ minetest.register_tool("basetools:shovel_steel", { -- minetest.register_tool("basetools:axe_wood", { - description = "Wooden Axe", + description = "Wooden Axe".."\n".. + "Digs choppy=3", inventory_image = "basetools_woodaxe.png", tool_capabilities = { max_drop_level=0, @@ -176,7 +190,8 @@ minetest.register_tool("basetools:axe_wood", { }, }) minetest.register_tool("basetools:axe_stone", { - description = "Stone Axe", + description = "Stone Axe".."\n".. + "Digs choppy=2..3", inventory_image = "basetools_stoneaxe.png", tool_capabilities = { max_drop_level=0, @@ -186,7 +201,8 @@ minetest.register_tool("basetools:axe_stone", { }, }) minetest.register_tool("basetools:axe_steel", { - description = "Steel Axe", + description = "Steel Axe".."\n".. + "Digs choppy=1..3", inventory_image = "basetools_steelaxe.png", tool_capabilities = { max_drop_level=1, @@ -201,7 +217,8 @@ minetest.register_tool("basetools:axe_steel", { -- minetest.register_tool("basetools:shears_wood", { - description = "Wooden Shears", + description = "Wooden Shears".."\n".. + "Digs snappy=3", inventory_image = "basetools_woodshears.png", tool_capabilities = { max_drop_level=0, @@ -211,7 +228,8 @@ minetest.register_tool("basetools:shears_wood", { }, }) minetest.register_tool("basetools:shears_stone", { - description = "Stone Shears", + description = "Stone Shears".."\n".. + "Digs snappy=2..3", inventory_image = "basetools_stoneshears.png", tool_capabilities = { max_drop_level=0, @@ -221,7 +239,8 @@ minetest.register_tool("basetools:shears_stone", { }, }) minetest.register_tool("basetools:shears_steel", { - description = "Steel Shears", + description = "Steel Shears".."\n".. + "Digs snappy=1..3", inventory_image = "basetools_steelshears.png", tool_capabilities = { max_drop_level=1, @@ -236,7 +255,8 @@ minetest.register_tool("basetools:shears_steel", { -- minetest.register_tool("basetools:sword_wood", { - description = "Wooden Sword", + description = "Wooden Sword".."\n".. + "Damage: fleshy=2", inventory_image = "basetools_woodsword.png", tool_capabilities = { full_punch_interval = 1.0, @@ -244,7 +264,8 @@ minetest.register_tool("basetools:sword_wood", { } }) minetest.register_tool("basetools:sword_stone", { - description = "Stone Sword", + description = "Stone Sword".."\n".. + "Damage: fleshy=4", inventory_image = "basetools_stonesword.png", tool_capabilities = { full_punch_interval = 1.0, @@ -253,7 +274,8 @@ minetest.register_tool("basetools:sword_stone", { } }) minetest.register_tool("basetools:sword_steel", { - description = "Steel Sword", + description = "Steel Sword".."\n".. + "Damage: fleshy=6", inventory_image = "basetools_steelsword.png", tool_capabilities = { full_punch_interval = 1.0, @@ -264,7 +286,8 @@ minetest.register_tool("basetools:sword_steel", { -- Fire/Ice sword: Deal damage to non-fleshy damage groups minetest.register_tool("basetools:sword_fire", { - description = "Fire Sword", + description = "Fire Sword".."\n".. + "Damage: icy=6", inventory_image = "basetools_firesword.png", tool_capabilities = { full_punch_interval = 1.0, @@ -273,12 +296,13 @@ minetest.register_tool("basetools:sword_fire", { } }) minetest.register_tool("basetools:sword_ice", { - description = "Ice Sword", + description = "Ice Sword".."\n".. + "Damage: fiery=6", inventory_image = "basetools_icesword.png", tool_capabilities = { full_punch_interval = 1.0, max_drop_level=0, - damage_groups = {firy=6}, + damage_groups = {fiery=6}, } }) @@ -286,7 +310,9 @@ minetest.register_tool("basetools:sword_ice", { -- Dagger: Low damage, fast punch interval -- minetest.register_tool("basetools:dagger_steel", { - description = "Steel Dagger", + description = "Steel Dagger".."\n".. + "Damage: fleshy=2".."\n".. + "Full Punch Interval: 0.5s", inventory_image = "basetools_steeldagger.png", tool_capabilities = { full_punch_interval = 0.5, diff --git a/games/devtest/mods/bucket/init.lua b/games/devtest/mods/bucket/init.lua index 3189d4aa6..ff58b0669 100644 --- a/games/devtest/mods/bucket/init.lua +++ b/games/devtest/mods/bucket/init.lua @@ -1,7 +1,8 @@ -- Bucket: Punch liquid source or flowing liquid to collect it minetest.register_tool("bucket:bucket", { - description = "Bucket", + description = "Bucket".."\n".. + "Picks up liquid nodes", inventory_image = "bucket.png", stack_max = 1, liquids_pointable = true, diff --git a/games/devtest/mods/chest/init.lua b/games/devtest/mods/chest/init.lua index c44522cb9..fc92bfdd1 100644 --- a/games/devtest/mods/chest/init.lua +++ b/games/devtest/mods/chest/init.lua @@ -1,5 +1,6 @@ minetest.register_node("chest:chest", { - description = "Chest", + description = "Chest" .. "\n" .. + "32 inventory slots", tiles ={"chest_chest.png^[sheet:2x2:0,0", "chest_chest.png^[sheet:2x2:0,0", "chest_chest.png^[sheet:2x2:1,0", "chest_chest.png^[sheet:2x2:1,0", "chest_chest.png^[sheet:2x2:1,0", "chest_chest.png^[sheet:2x2:0,1"}, diff --git a/games/devtest/mods/chest_of_everything/init.lua b/games/devtest/mods/chest_of_everything/init.lua index 7d61abebf..3e9d2678a 100644 --- a/games/devtest/mods/chest_of_everything/init.lua +++ b/games/devtest/mods/chest_of_everything/init.lua @@ -43,7 +43,8 @@ local function get_chest_formspec(page) end minetest.register_node("chest_of_everything:chest", { - description = "Chest of Everything", + description = "Chest of Everything" .. "\n" .. + "Grants access to all items", tiles ={"chest_of_everything_chest.png^[sheet:2x2:0,0", "chest_of_everything_chest.png^[sheet:2x2:0,0", "chest_of_everything_chest.png^[sheet:2x2:1,0", "chest_of_everything_chest.png^[sheet:2x2:1,0", "chest_of_everything_chest.png^[sheet:2x2:1,0", "chest_of_everything_chest.png^[sheet:2x2:0,1"}, diff --git a/games/devtest/mods/experimental/items.lua b/games/devtest/mods/experimental/items.lua index 51b063ba2..94be71cf7 100644 --- a/games/devtest/mods/experimental/items.lua +++ b/games/devtest/mods/experimental/items.lua @@ -44,7 +44,8 @@ minetest.register_node("experimental:callback_node", { }) minetest.register_tool("experimental:privatizer", { - description = "Node Meta Privatizer", + description = "Node Meta Privatizer".."\n".. + "Punch: Marks 'infotext' and 'formspec' meta fields of chest as private", inventory_image = "experimental_tester_tool_1.png", groups = { testtool = 1, disable_repair = 1 }, on_use = function(itemstack, user, pointed_thing) @@ -67,7 +68,8 @@ minetest.register_tool("experimental:privatizer", { }) minetest.register_tool("experimental:particle_spawner", { - description = "Particle Spawner", + description = "Particle Spawner".."\n".. + "Punch: Spawn random test particle", inventory_image = "experimental_tester_tool_1.png^[invert:g", groups = { testtool = 1, disable_repair = 1 }, on_use = function(itemstack, user, pointed_thing) diff --git a/games/devtest/mods/soundstuff/init.lua b/games/devtest/mods/soundstuff/init.lua index 22012ba14..40ad8f562 100644 --- a/games/devtest/mods/soundstuff/init.lua +++ b/games/devtest/mods/soundstuff/init.lua @@ -107,7 +107,8 @@ minetest.register_node("soundstuff:footstep_climbable", { minetest.register_craftitem("soundstuff:eat", { - description = "Eat Sound Item", + description = "Eat Sound Item".."\n".. + "Makes a sound when 'eaten' (with punch key)", inventory_image = "soundstuff_eat.png", on_use = minetest.item_eat(0), sound = { @@ -116,7 +117,9 @@ minetest.register_craftitem("soundstuff:eat", { }) minetest.register_tool("soundstuff:breaks", { - description = "Break Sound Tool", + description = "Break Sound Tool".."\n".. + "Digs cracky=3 and more".."\n".. + "Makes a sound when it breaks", inventory_image = "soundstuff_node_dug.png", sound = { breaks = { name = "soundstuff_mono", gain = 1.0 }, diff --git a/games/devtest/mods/testentities/armor.lua b/games/devtest/mods/testentities/armor.lua index 4c30cec8d..306953d50 100644 --- a/games/devtest/mods/testentities/armor.lua +++ b/games/devtest/mods/testentities/armor.lua @@ -3,7 +3,7 @@ local phasearmor = { [0]={icy=100}, - [1]={firy=100}, + [1]={fiery=100}, [2]={fleshy=100}, [3]={immortal=1}, [4]={punch_operable=1}, diff --git a/games/devtest/mods/testnodes/light.lua b/games/devtest/mods/testnodes/light.lua index 94409e83f..8ab4416d9 100644 --- a/games/devtest/mods/testnodes/light.lua +++ b/games/devtest/mods/testnodes/light.lua @@ -22,7 +22,8 @@ end -- Lets light through, but not sunlight, leading to a -- reduction in light level when light passes through minetest.register_node("testnodes:sunlight_filter", { - description = S("Sunlight Filter"), + description = S("Sunlight Filter") .."\n".. + S("Lets light through, but weakens sunlight"), paramtype = "light", @@ -35,7 +36,8 @@ minetest.register_node("testnodes:sunlight_filter", { -- Lets light and sunlight through without obstruction minetest.register_node("testnodes:sunlight_propagator", { - description = S("Sunlight Propagator"), + description = S("Sunlight Propagator") .."\n".. + S("Lets all light through"), paramtype = "light", sunlight_propagates = true, diff --git a/games/devtest/mods/testpathfinder/init.lua b/games/devtest/mods/testpathfinder/init.lua index f94848236..67748afca 100644 --- a/games/devtest/mods/testpathfinder/init.lua +++ b/games/devtest/mods/testpathfinder/init.lua @@ -121,7 +121,11 @@ end -- Sneak+punch: Select pathfinding algorithm -- Place: Select destination node minetest.register_tool("testpathfinder:testpathfinder", { - description = S("Pathfinder Tester"), + description = S("Pathfinder Tester") .."\n".. + S("Finds path between 2 points") .."\n".. + S("Place on node: Select destination") .."\n".. + S("Punch: Find path from here") .."\n".. + S("Sneak+Punch: Change algorithm"), inventory_image = "testpathfinder_testpathfinder.png", groups = { testtool = 1, disable_repair = 1 }, on_use = find_path_or_set_algorithm, diff --git a/games/devtest/mods/testtools/init.lua b/games/devtest/mods/testtools/init.lua index d68a086b9..df5bc8e55 100644 --- a/games/devtest/mods/testtools/init.lua +++ b/games/devtest/mods/testtools/init.lua @@ -3,13 +3,13 @@ local F = minetest.formspec_escape -- TODO: Add a Node Metadata tool --- Param 2 Tool: Set param2 value of tools --- Punch: +1 --- Punch+Shift: +8 --- Place: -1 --- Place+Shift: -8 minetest.register_tool("testtools:param2tool", { - description = S("Param2 Tool"), + description = S("Param2 Tool") .."\n".. + S("Modify param2 value of nodes") .."\n".. + S("Punch: +1") .."\n".. + S("Sneak+Punch: +8") .."\n".. + S("Place: -1") .."\n".. + S("Sneak+Place: -8"), inventory_image = "testtools_param2tool.png", groups = { testtool = 1, disable_repair = 1 }, on_use = function(itemstack, user, pointed_thing) @@ -47,7 +47,11 @@ minetest.register_tool("testtools:param2tool", { }) minetest.register_tool("testtools:node_setter", { - description = S("Node Setter"), + description = S("Node Setter") .."\n".. + S("Replace pointed node with something else") .."\n".. + S("Punch: Select pointed node") .."\n".. + S("Place on node: Replace node with selected node") .."\n".. + S("Place in air: Manually select a node"), inventory_image = "testtools_node_setter.png", groups = { testtool = 1, disable_repair = 1 }, on_use = function(itemstack, user, pointed_thing) @@ -125,7 +129,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end) minetest.register_tool("testtools:remover", { - description = S("Remover"), + description = S("Remover") .."\n".. + S("Punch: Remove pointed node or object"), inventory_image = "testtools_remover.png", groups = { testtool = 1, disable_repair = 1 }, on_use = function(itemstack, user, pointed_thing) @@ -136,13 +141,17 @@ minetest.register_tool("testtools:remover", { local obj = pointed_thing.ref if not obj:is_player() then obj:remove() + else + minetest.chat_send_player(user:get_player_name(), S("Can't remove players!")) end end end, }) minetest.register_tool("testtools:falling_node_tool", { - description = S("Falling Node Tool"), + description = S("Falling Node Tool") .."\n".. + S("Punch: Make pointed node fall") .."\n".. + S("Place: Move pointed node 2 units upwards, then make it fall"), inventory_image = "testtools_falling_node_tool.png", groups = { testtool = 1, disable_repair = 1 }, on_place = function(itemstack, user, pointed_thing) @@ -191,7 +200,11 @@ minetest.register_tool("testtools:falling_node_tool", { }) minetest.register_tool("testtools:rotator", { - description = S("Entity Rotator"), + description = S("Entity Rotator") .. "\n" .. + S("Rotate pointed entity") .."\n".. + S("Punch: Yaw") .."\n".. + S("Sneak+Punch: Pitch") .."\n".. + S("Aux1+Punch: Roll"), inventory_image = "testtools_entity_rotator.png", groups = { testtool = 1, disable_repair = 1 }, on_use = function(itemstack, user, pointed_thing) @@ -244,7 +257,12 @@ local mover_config = function(itemstack, user, pointed_thing) end minetest.register_tool("testtools:object_mover", { - description = S("Object Mover"), + description = S("Object Mover") .."\n".. + S("Move pointed object towards or away from you") .."\n".. + S("Punch: Move by distance").."\n".. + S("Sneak+Punch: Move by negative distance").."\n".. + S("Place: Increase distance").."\n".. + S("Sneak+Place: Decrease distance"), inventory_image = "testtools_object_mover.png", groups = { testtool = 1, disable_repair = 1 }, on_place = mover_config, @@ -287,7 +305,10 @@ minetest.register_tool("testtools:object_mover", { minetest.register_tool("testtools:entity_scaler", { - description = S("Entity Visual Scaler"), + description = S("Entity Visual Scaler") .."\n".. + S("Scale visual size of entities") .."\n".. + S("Punch: Increase size") .."\n".. + S("Sneak+Punch: Decrease scale"), inventory_image = "testtools_entity_scaler.png", groups = { testtool = 1, disable_repair = 1 }, on_use = function(itemstack, user, pointed_thing) @@ -342,14 +363,21 @@ local function get_entity_list() return entity_list end minetest.register_tool("testtools:entity_spawner", { - description = S("Entity Spawner"), + description = S("Entity Spawner") .."\n".. + S("Spawns entities") .."\n".. + S("Punch: Select entity to spawn") .."\n".. + S("Place: Spawn selected entity"), inventory_image = "testtools_entity_spawner.png", groups = { testtool = 1, disable_repair = 1 }, on_place = function(itemstack, user, pointed_thing) local name = user:get_player_name() - if selections[name] and pointed_thing.type == "node" then - local pos = pointed_thing.above - minetest.add_entity(pos, get_entity_list()[selections[name]]) + if pointed_thing.type == "node" then + if selections[name] then + local pos = pointed_thing.above + minetest.add_entity(pos, get_entity_list()[selections[name]]) + else + minetest.chat_send_player(name, S("Select an entity first (with punch key)!")) + end end end, on_use = function(itemstack, user, pointed_thing) @@ -435,7 +463,10 @@ local editor_formspec = function(playername, obj, value, sel) end minetest.register_tool("testtools:object_editor", { - description = S("Object Property Editor"), + description = S("Object Property Editor") .."\n".. + S("Edit properties of objects") .."\n".. + S("Punch object: Edit object") .."\n".. + S("Punch air: Edit yourself"), inventory_image = "testtools_object_editor.png", groups = { testtool = 1, disable_repair = 1 }, on_use = function(itemstack, user, pointed_thing) @@ -515,7 +546,14 @@ local attacher_config = function(itemstack, user, pointed_thing) end minetest.register_tool("testtools:object_attacher", { - description = S("Object Attacher"), + description = S("Object Attacher") .."\n".. + S("Attach object to another") .."\n".. + S("Punch objects to first select parent object, then the child object to attach") .."\n".. + S("Punch air to select yourself") .."\n".. + S("Place: Incease attachment Y offset") .."\n".. + S("Sneak+Place: Decease attachment Y offset") .."\n".. + S("Aux1+Place: Incease attachment rotation") .."\n".. + S("Aux1+Sneak+Place: Decrease attachment rotation"), inventory_image = "testtools_object_attacher.png", groups = { testtool = 1, disable_repair = 1 }, on_place = attacher_config, From 6dcc9e63318f815a3de8c9db2ee7b845066e0135 Mon Sep 17 00:00:00 2001 From: Lejo Date: Fri, 4 Sep 2020 20:50:33 +0200 Subject: [PATCH 058/177] Prevent interacting with items out of the hotbar (#10359) --- src/network/serverpackethandler.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index d133b4ff9..fe70d376e 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -636,7 +636,7 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) return; from_inv_is_current_player = true; } - + bool to_inv_is_current_player = false; if (ma->to_inv.type == InventoryLocation::PLAYER) { if (ma->to_inv.name != player->getName()) @@ -869,6 +869,15 @@ void Server::handleCommand_PlayerItem(NetworkPacket* pkt) *pkt >> item; + if (item >= player->getHotbarItemcount()) { + actionstream << "Player: " << player->getName() + << " tried to access item=" << item + << " out of hotbar_itemcount=" + << player->getHotbarItemcount() + << "; ignoring." << std::endl; + return; + } + playersao->getPlayer()->setWieldIndex(item); } @@ -984,6 +993,16 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) v3f player_pos = playersao->getLastGoodPosition(); // Update wielded item + + if (item_i >= player->getHotbarItemcount()) { + actionstream << "Player: " << player->getName() + << " tried to access item=" << item_i + << " out of hotbar_itemcount=" + << player->getHotbarItemcount() + << "; ignoring." << std::endl; + return; + } + playersao->getPlayer()->setWieldIndex(item_i); // Get pointed to object (NULL if not POINTEDTYPE_OBJECT) From 0d128ab344e3d04d2b30dbd5e047f4ac700013b7 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Mon, 7 Sep 2020 21:19:38 +0200 Subject: [PATCH 059/177] Inventory: Protect Craft and Drop actions (#10353) Change dangerous pointer to unique_ptr for automated deletion. --- src/network/serverpackethandler.cpp | 79 +++++++++++++---------------- 1 file changed, 35 insertions(+), 44 deletions(-) diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index fe70d376e..0bd09e637 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -600,7 +600,7 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) << std::endl; std::istringstream is(datastring, std::ios_base::binary); // Create an action - InventoryAction *a = InventoryAction::deSerialize(is); + std::unique_ptr a(InventoryAction::deSerialize(is)); if (!a) { infostream << "TOSERVER_INVENTORY_ACTION: " << "InventoryAction::deSerialize() returned NULL" @@ -617,11 +617,30 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) where the client made a bad prediction. */ + const bool player_has_interact = checkPriv(player->getName(), "interact"); + + auto check_inv_access = [player, player_has_interact] ( + const InventoryLocation &loc) -> bool { + if (loc.type == InventoryLocation::CURRENT_PLAYER) + return false; // Only used internally on the client, never sent + if (loc.type == InventoryLocation::PLAYER) { + // Allow access to own inventory in all cases + return loc.name == player->getName(); + } + + if (!player_has_interact) { + infostream << "Cannot modify foreign inventory: " + << "No interact privilege" << std::endl; + return false; + } + return true; + }; + /* Handle restrictions and special cases of the move action */ if (a->getType() == IAction::Move) { - IMoveAction *ma = (IMoveAction*)a; + IMoveAction *ma = (IMoveAction*)a.get(); ma->from_inv.applyCurrentPlayer(player->getName()); ma->to_inv.applyCurrentPlayer(player->getName()); @@ -630,21 +649,11 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) if (ma->from_inv != ma->to_inv) m_inventory_mgr->setInventoryModified(ma->to_inv); - bool from_inv_is_current_player = false; - if (ma->from_inv.type == InventoryLocation::PLAYER) { - if (ma->from_inv.name != player->getName()) - return; - from_inv_is_current_player = true; - } + if (!check_inv_access(ma->from_inv) || + !check_inv_access(ma->to_inv)) + return; - bool to_inv_is_current_player = false; - if (ma->to_inv.type == InventoryLocation::PLAYER) { - if (ma->to_inv.name != player->getName()) - return; - to_inv_is_current_player = true; - } - - InventoryLocation *remote = from_inv_is_current_player ? + InventoryLocation *remote = ma->from_inv.type == InventoryLocation::PLAYER ? &ma->to_inv : &ma->from_inv; // Check for out-of-range interaction @@ -664,7 +673,6 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) << (ma->from_inv.dump()) << ":" << ma->from_list << " to " << (ma->to_inv.dump()) << ":" << ma->to_list << " because src is " << ma->from_list << std::endl; - delete a; return; } @@ -676,18 +684,6 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) << (ma->from_inv.dump()) << ":" << ma->from_list << " to " << (ma->to_inv.dump()) << ":" << ma->to_list << " because dst is " << ma->to_list << std::endl; - delete a; - return; - } - - // Disallow moving items in elsewhere than player's inventory - // if not allowed to interact - if (!checkPriv(player->getName(), "interact") && - (!from_inv_is_current_player || - !to_inv_is_current_player)) { - infostream << "Cannot move outside of player's inventory: " - << "No interact privilege" << std::endl; - delete a; return; } } @@ -695,7 +691,7 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) Handle restrictions and special cases of the drop action */ else if (a->getType() == IAction::Drop) { - IDropAction *da = (IDropAction*)a; + IDropAction *da = (IDropAction*)a.get(); da->from_inv.applyCurrentPlayer(player->getName()); @@ -708,22 +704,18 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) infostream << "Ignoring IDropAction from " << (da->from_inv.dump()) << ":" << da->from_list << " because src is " << da->from_list << std::endl; - delete a; return; } // Disallow dropping items if not allowed to interact - if (!checkPriv(player->getName(), "interact")) { - delete a; + if (!player_has_interact || !check_inv_access(da->from_inv)) return; - } // Disallow dropping items if dead if (playersao->isDead()) { infostream << "Ignoring IDropAction from " << (da->from_inv.dump()) << ":" << da->from_list << " because player is dead." << std::endl; - delete a; return; } } @@ -731,29 +723,28 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt) Handle restrictions and special cases of the craft action */ else if (a->getType() == IAction::Craft) { - ICraftAction *ca = (ICraftAction*)a; + ICraftAction *ca = (ICraftAction*)a.get(); ca->craft_inv.applyCurrentPlayer(player->getName()); m_inventory_mgr->setInventoryModified(ca->craft_inv); - //bool craft_inv_is_current_player = - // (ca->craft_inv.type == InventoryLocation::PLAYER) && - // (ca->craft_inv.name == player->getName()); - // Disallow crafting if not allowed to interact - if (!checkPriv(player->getName(), "interact")) { + if (!player_has_interact) { infostream << "Cannot craft: " << "No interact privilege" << std::endl; - delete a; return; } + + if (!check_inv_access(ca->craft_inv)) + return; + } else { + // Unknown action. Ignored. + return; } // Do the action a->apply(m_inventory_mgr.get(), playersao, this); - // Eat the action - delete a; } void Server::handleCommand_ChatMessage(NetworkPacket* pkt) From 62913b872ea1b21a5aada55ed323476fbcea61dc Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Wed, 9 Sep 2020 18:12:03 +0100 Subject: [PATCH 060/177] Darwin platform build fix (#10376) the event header seemingly being generic with libevent thus renaming it. openal and opengl are deprecated on newer mac os releases thus suppressing the build warnings. --- src/client/camera.cpp | 2 +- src/client/clientenvironment.cpp | 2 +- src/client/event_manager.h | 2 +- src/client/localplayer.cpp | 2 +- src/client/shader.cpp | 5 +++++ src/client/sound_openal.cpp | 1 + src/{event.h => mtevent.h} | 0 7 files changed, 10 insertions(+), 4 deletions(-) rename src/{event.h => mtevent.h} (100%) diff --git a/src/client/camera.cpp b/src/client/camera.cpp index abc55e4b7..11f8a1c90 100644 --- a/src/client/camera.cpp +++ b/src/client/camera.cpp @@ -30,7 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "wieldmesh.h" #include "noise.h" // easeCurve #include "sound.h" -#include "event.h" +#include "mtevent.h" #include "nodedef.h" #include "util/numeric.h" #include "constants.h" diff --git a/src/client/clientenvironment.cpp b/src/client/clientenvironment.cpp index 895b0193c..0b7e92325 100644 --- a/src/client/clientenvironment.cpp +++ b/src/client/clientenvironment.cpp @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "clientmap.h" #include "scripting_client.h" #include "mapblock_mesh.h" -#include "event.h" +#include "mtevent.h" #include "collision.h" #include "nodedef.h" #include "profiler.h" diff --git a/src/client/event_manager.h b/src/client/event_manager.h index 3762e89bf..16f7bcf07 100644 --- a/src/client/event_manager.h +++ b/src/client/event_manager.h @@ -19,7 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once -#include "event.h" +#include "mtevent.h" #include #include diff --git a/src/client/localplayer.cpp b/src/client/localplayer.cpp index 1e7040d57..f3eb1a2dd 100644 --- a/src/client/localplayer.cpp +++ b/src/client/localplayer.cpp @@ -19,7 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "localplayer.h" #include -#include "event.h" +#include "mtevent.h" #include "collision.h" #include "nodedef.h" #include "settings.h" diff --git a/src/client/shader.cpp b/src/client/shader.cpp index 0aba7b118..fc0a72319 100644 --- a/src/client/shader.cpp +++ b/src/client/shader.cpp @@ -45,7 +45,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #endif #else +#ifndef __APPLE__ #include +#else +#define GL_SILENCE_DEPRECATION +#include +#endif #endif /* diff --git a/src/client/sound_openal.cpp b/src/client/sound_openal.cpp index c1c916e68..f4e61f93e 100644 --- a/src/client/sound_openal.cpp +++ b/src/client/sound_openal.cpp @@ -28,6 +28,7 @@ with this program; ifnot, write to the Free Software Foundation, Inc., #include //#include #elif defined(__APPLE__) + #define OPENAL_DEPRECATED #include #include //#include diff --git a/src/event.h b/src/mtevent.h similarity index 100% rename from src/event.h rename to src/mtevent.h From 0683bea283d456253de343f37720789382ece6b2 Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Wed, 9 Sep 2020 18:12:58 +0100 Subject: [PATCH 061/177] Add NetBSD cpu affinity support code (#10378) --- src/threading/thread.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/threading/thread.cpp b/src/threading/thread.cpp index eb51516c6..e19e6ae60 100644 --- a/src/threading/thread.cpp +++ b/src/threading/thread.cpp @@ -33,6 +33,8 @@ DEALINGS IN THE SOFTWARE. #include #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) #include +#elif defined(__NetBSD__) + #include #elif defined(_MSC_VER) struct THREADNAME_INFO { DWORD dwType; // Must be 0x1000 @@ -285,7 +287,14 @@ bool Thread::bindToProcessor(unsigned int proc_number) CPU_SET(proc_number, &cpuset); return pthread_setaffinity_np(getThreadHandle(), sizeof(cpuset), &cpuset) == 0; +#elif defined(__NetBSD__) + cpuset_t *cpuset = cpuset_create(); + if (cpuset == NULL) + return false; + int r = pthread_setaffinity_np(getThreadHandle(), cpuset_size(cpuset), cpuset); + cpuset_destroy(cpuset); + return r == 0; #elif defined(__sun) || defined(sun) return processor_bind(P_LWPID, P_MYID, proc_number, NULL) == 0 From 3fb1f45301880a3aa901b752af1ecc912efe5915 Mon Sep 17 00:00:00 2001 From: Sebastien Marie Date: Thu, 10 Sep 2020 12:19:18 +0200 Subject: [PATCH 062/177] Remove Thread::kill() and related unittest (#10317) Closes: #6065 --- src/threading/thread.cpp | 54 ++++++++++++++------------------- src/threading/thread.h | 8 ----- src/unittest/test_threading.cpp | 25 --------------- 3 files changed, 22 insertions(+), 65 deletions(-) diff --git a/src/threading/thread.cpp b/src/threading/thread.cpp index e19e6ae60..5cfc60995 100644 --- a/src/threading/thread.cpp +++ b/src/threading/thread.cpp @@ -73,7 +73,28 @@ Thread::Thread(const std::string &name) : Thread::~Thread() { - kill(); + // kill the thread if running + if (!m_running) { + wait(); + } else { + + m_running = false; + +#if defined(_WIN32) + // See https://msdn.microsoft.com/en-us/library/hh920601.aspx#thread__native_handle_method + TerminateThread((HANDLE) m_thread_obj->native_handle(), 0); + CloseHandle((HANDLE) m_thread_obj->native_handle()); +#else + // We need to pthread_kill instead on Android since NDKv5's pthread + // implementation is incomplete. +# ifdef __ANDROID__ + pthread_kill(getThreadHandle(), SIGKILL); +# else + pthread_cancel(getThreadHandle()); +# endif + wait(); +#endif + } // Make sure start finished mutex is unlocked before it's destroyed if (m_start_finished_mutex.try_lock()) @@ -138,37 +159,6 @@ bool Thread::wait() } -bool Thread::kill() -{ - if (!m_running) { - wait(); - return false; - } - - m_running = false; - -#if defined(_WIN32) - // See https://msdn.microsoft.com/en-us/library/hh920601.aspx#thread__native_handle_method - TerminateThread((HANDLE) m_thread_obj->native_handle(), 0); - CloseHandle((HANDLE) m_thread_obj->native_handle()); -#else - // We need to pthread_kill instead on Android since NDKv5's pthread - // implementation is incomplete. -# ifdef __ANDROID__ - pthread_kill(getThreadHandle(), SIGKILL); -# else - pthread_cancel(getThreadHandle()); -# endif - wait(); -#endif - - m_retval = nullptr; - m_joinable = false; - m_request_stop = false; - - return true; -} - bool Thread::getReturnValue(void **ret) { diff --git a/src/threading/thread.h b/src/threading/thread.h index 3946335f5..45fb171da 100644 --- a/src/threading/thread.h +++ b/src/threading/thread.h @@ -74,14 +74,6 @@ public: */ bool stop(); - /* - * Immediately terminates the thread. - * This should be used with extreme caution, as the thread will not have - * any opportunity to release resources it may be holding (such as memory - * or locks). - */ - bool kill(); - /* * Waits for thread to finish. * Note: This does not stop a thread, you have to do this on your own. diff --git a/src/unittest/test_threading.cpp b/src/unittest/test_threading.cpp index 8d4d814fd..65ef7c02d 100644 --- a/src/unittest/test_threading.cpp +++ b/src/unittest/test_threading.cpp @@ -31,7 +31,6 @@ public: void runTests(IGameDef *gamedef); void testStartStopWait(); - void testThreadKill(); void testAtomicSemaphoreThread(); }; @@ -40,7 +39,6 @@ static TestThreading g_test_instance; void TestThreading::runTests(IGameDef *gamedef) { TEST(testStartStopWait); - TEST(testThreadKill); TEST(testAtomicSemaphoreThread); } @@ -111,29 +109,6 @@ void TestThreading::testStartStopWait() } -void TestThreading::testThreadKill() -{ - SimpleTestThread *thread = new SimpleTestThread(300); - - UASSERT(thread->start() == true); - - // kill()ing is quite violent, so let's make sure our victim is sleeping - // before we do this... so we don't corrupt the rest of the program's state - sleep_ms(100); - UASSERT(thread->kill() == true); - - // The state of the thread object should be reset if all went well - UASSERT(thread->isRunning() == false); - UASSERT(thread->start() == true); - UASSERT(thread->stop() == true); - UASSERT(thread->wait() == true); - - // kill() after already waiting should fail. - UASSERT(thread->kill() == false); - - delete thread; -} - class AtomicTestThread : public Thread { public: From fcff9f291103411af6d8f946fbb275b6fa0583b9 Mon Sep 17 00:00:00 2001 From: hecks <42101236+hecktest@users.noreply.github.com> Date: Mon, 14 Sep 2020 19:27:25 +0200 Subject: [PATCH 063/177] Remove "generate normal maps" feature (#10313) Erase all traces of normal "generation" from fragment shaders Remove the "feature" from the engine and default config Remove any leftover documentation of it --- builtin/mainmenu/tab_settings.lua | 22 +++------ builtin/settingtypes.txt | 14 +----- .../shaders/nodes_shader/opengl_fragment.glsl | 47 +------------------ .../object_shader/opengl_fragment.glsl | 31 ------------ minetest.conf.example | 17 +------ src/client/shader.cpp | 28 ----------- src/defaultsettings.cpp | 3 -- src/settings_translation_file.cpp | 8 +--- 8 files changed, 12 insertions(+), 158 deletions(-) diff --git a/builtin/mainmenu/tab_settings.lua b/builtin/mainmenu/tab_settings.lua index 02b15c81b..510346f8d 100644 --- a/builtin/mainmenu/tab_settings.lua +++ b/builtin/mainmenu/tab_settings.lua @@ -191,15 +191,13 @@ local function formspec(tabview, name, tabdata) .. dump(core.settings:get_bool("enable_bumpmapping")) .. "]" .. "checkbox[8.25,1;cb_tonemapping;" .. fgettext("Tone Mapping") .. ";" .. dump(core.settings:get_bool("tone_mapping")) .. "]" .. - "checkbox[8.25,1.5;cb_generate_normalmaps;" .. fgettext("Generate Normal Maps") .. ";" - .. dump(core.settings:get_bool("generate_normalmaps")) .. "]" .. - "checkbox[8.25,2;cb_parallax;" .. fgettext("Parallax Occlusion") .. ";" + "checkbox[8.25,1.5;cb_parallax;" .. fgettext("Parallax Occlusion") .. ";" .. dump(core.settings:get_bool("enable_parallax_occlusion")) .. "]" .. - "checkbox[8.25,2.5;cb_waving_water;" .. fgettext("Waving Liquids") .. ";" + "checkbox[8.25,2;cb_waving_water;" .. fgettext("Waving Liquids") .. ";" .. dump(core.settings:get_bool("enable_waving_water")) .. "]" .. - "checkbox[8.25,3;cb_waving_leaves;" .. fgettext("Waving Leaves") .. ";" + "checkbox[8.25,2.5;cb_waving_leaves;" .. fgettext("Waving Leaves") .. ";" .. dump(core.settings:get_bool("enable_waving_leaves")) .. "]" .. - "checkbox[8.25,3.5;cb_waving_plants;" .. fgettext("Waving Plants") .. ";" + "checkbox[8.25,3;cb_waving_plants;" .. fgettext("Waving Plants") .. ";" .. dump(core.settings:get_bool("enable_waving_plants")) .. "]" else tab_string = tab_string .. @@ -208,14 +206,12 @@ local function formspec(tabview, name, tabdata) "label[8.38,1.2;" .. core.colorize("#888888", fgettext("Tone Mapping")) .. "]" .. "label[8.38,1.7;" .. core.colorize("#888888", - fgettext("Generate Normal Maps")) .. "]" .. - "label[8.38,2.2;" .. core.colorize("#888888", fgettext("Parallax Occlusion")) .. "]" .. - "label[8.38,2.7;" .. core.colorize("#888888", + "label[8.38,2.2;" .. core.colorize("#888888", fgettext("Waving Liquids")) .. "]" .. - "label[8.38,3.2;" .. core.colorize("#888888", + "label[8.38,2.7;" .. core.colorize("#888888", fgettext("Waving Leaves")) .. "]" .. - "label[8.38,3.7;" .. core.colorize("#888888", + "label[8.38,3.2;" .. core.colorize("#888888", fgettext("Waving Plants")) .. "]" end @@ -275,10 +271,6 @@ local function handle_settings_buttons(this, fields, tabname, tabdata) core.settings:set("tone_mapping", fields["cb_tonemapping"]) return true end - if fields["cb_generate_normalmaps"] then - core.settings:set("generate_normalmaps", fields["cb_generate_normalmaps"]) - return true - end if fields["cb_parallax"] then core.settings:set("enable_parallax_occlusion", fields["cb_parallax"]) return true diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 39cc22d62..6d9c6f573 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -543,22 +543,10 @@ tone_mapping (Filmic tone mapping) bool false [***Bumpmapping] -# Enables bumpmapping for textures. Normalmaps need to be supplied by the texture pack -# or need to be auto-generated. +# Enables bumpmapping for textures. Normalmaps need to be supplied by the texture pack. # Requires shaders to be enabled. enable_bumpmapping (Bumpmapping) bool false -# Enables on the fly normalmap generation (Emboss effect). -# Requires bumpmapping to be enabled. -generate_normalmaps (Generate normalmaps) bool false - -# Strength of generated normalmaps. -normalmaps_strength (Normalmaps strength) float 0.6 - -# Defines sampling step of texture. -# A higher value results in smoother normal maps. -normalmaps_smooth (Normalmaps sampling) int 0 0 2 - [***Parallax Occlusion] # Enables parallax occlusion mapping. diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl index 7213612bd..437b325d3 100644 --- a/client/shaders/nodes_shader/opengl_fragment.glsl +++ b/client/shaders/nodes_shader/opengl_fragment.glsl @@ -71,16 +71,6 @@ void get_texture_flags() } } -float intensity(vec3 color) -{ - return (color.r + color.g + color.b) / 3.0; -} - -float get_rgb_height(vec2 uv) -{ - return intensity(texture2D(baseTexture, uv).rgb); -} - vec4 get_normal_map(vec2 uv) { vec4 bump = texture2D(normalTexture, uv).rgba; @@ -115,19 +105,6 @@ float find_intersection(vec2 dp, vec2 ds) return best_depth; } -float find_intersectionRGB(vec2 dp, vec2 ds) -{ - const float depth_step = 1.0 / 24.0; - float depth = 1.0; - for (int i = 0 ; i < 24 ; i++) { - float h = get_rgb_height(dp + ds * depth); - if (h >= depth) - break; - depth -= depth_step; - } - return depth; -} - void main(void) { vec3 color; @@ -149,21 +126,17 @@ void main(void) float h = normal.a * scale - bias; uv += h * normal.z * eyeRay; } + } #endif - #if PARALLAX_OCCLUSION_MODE == 1 // Relief mapping if (normalTexturePresent && area_enable_parallax > 0.0) { vec2 ds = eyeRay * PARALLAX_OCCLUSION_SCALE; float dist = find_intersection(uv, ds); uv += dist * ds; -#endif - } else if (GENERATE_NORMALMAPS == 1 && area_enable_parallax > 0.0) { - vec2 ds = eyeRay * PARALLAX_OCCLUSION_SCALE; - float dist = find_intersectionRGB(uv, ds); - uv += dist * ds; } #endif +#endif #if USE_NORMALMAPS == 1 if (normalTexturePresent) { @@ -172,22 +145,6 @@ void main(void) } #endif -#if GENERATE_NORMALMAPS == 1 - if (normalTexturePresent == false) { - float tl = get_rgb_height(vec2(uv.x - SAMPLE_STEP, uv.y + SAMPLE_STEP)); - float t = get_rgb_height(vec2(uv.x - SAMPLE_STEP, uv.y - SAMPLE_STEP)); - float tr = get_rgb_height(vec2(uv.x + SAMPLE_STEP, uv.y + SAMPLE_STEP)); - float r = get_rgb_height(vec2(uv.x + SAMPLE_STEP, uv.y)); - float br = get_rgb_height(vec2(uv.x + SAMPLE_STEP, uv.y - SAMPLE_STEP)); - float b = get_rgb_height(vec2(uv.x, uv.y - SAMPLE_STEP)); - float bl = get_rgb_height(vec2(uv.x -SAMPLE_STEP, uv.y - SAMPLE_STEP)); - float l = get_rgb_height(vec2(uv.x - SAMPLE_STEP, uv.y)); - float dX = (tr + 2.0 * r + br) - (tl + 2.0 * l + bl); - float dY = (bl + 2.0 * b + br) - (tl + 2.0 * t + tr); - bump = vec4(normalize(vec3 (dX, dY, NORMALMAPS_STRENGTH)), 1.0); - use_normalmap = true; - } -#endif vec4 base = texture2D(baseTexture, uv).rgba; #ifdef USE_DISCARD diff --git a/client/shaders/object_shader/opengl_fragment.glsl b/client/shaders/object_shader/opengl_fragment.glsl index 2d33ca439..a8a43e1e2 100644 --- a/client/shaders/object_shader/opengl_fragment.glsl +++ b/client/shaders/object_shader/opengl_fragment.glsl @@ -74,20 +74,6 @@ void get_texture_flags() } } -float intensity(vec3 color) -{ - return (color.r + color.g + color.b) / 3.0; -} - -float get_rgb_height(vec2 uv) -{ - if (texSeamless) { - return intensity(texture2D(baseTexture, uv).rgb); - } else { - return intensity(texture2D(baseTexture, clamp(uv, 0.0, 0.999)).rgb); - } -} - vec4 get_normal_map(vec2 uv) { vec4 bump = texture2D(normalTexture, uv).rgba; @@ -110,23 +96,6 @@ void main(void) } #endif -#if GENERATE_NORMALMAPS == 1 - if (normalTexturePresent == false) { - float tl = get_rgb_height(vec2(uv.x - SAMPLE_STEP, uv.y + SAMPLE_STEP)); - float t = get_rgb_height(vec2(uv.x - SAMPLE_STEP, uv.y - SAMPLE_STEP)); - float tr = get_rgb_height(vec2(uv.x + SAMPLE_STEP, uv.y + SAMPLE_STEP)); - float r = get_rgb_height(vec2(uv.x + SAMPLE_STEP, uv.y)); - float br = get_rgb_height(vec2(uv.x + SAMPLE_STEP, uv.y - SAMPLE_STEP)); - float b = get_rgb_height(vec2(uv.x, uv.y - SAMPLE_STEP)); - float bl = get_rgb_height(vec2(uv.x -SAMPLE_STEP, uv.y - SAMPLE_STEP)); - float l = get_rgb_height(vec2(uv.x - SAMPLE_STEP, uv.y)); - float dX = (tr + 2.0 * r + br) - (tl + 2.0 * l + bl); - float dY = (bl + 2.0 * b + br) - (tl + 2.0 * t + tr); - bump = vec4(normalize(vec3 (dX, dY, NORMALMAPS_STRENGTH)), 1.0); - use_normalmap = true; - } -#endif - vec4 base = texture2D(baseTexture, uv).rgba; #ifdef USE_DISCARD diff --git a/minetest.conf.example b/minetest.conf.example index 520125713..6b315b6ea 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -604,26 +604,11 @@ #### Bumpmapping -# Enables bumpmapping for textures. Normalmaps need to be supplied by the texture pack -# or need to be auto-generated. +# Enables bumpmapping for textures. Normalmaps need to be supplied by the texture pack. # Requires shaders to be enabled. # type: bool # enable_bumpmapping = false -# Enables on the fly normalmap generation (Emboss effect). -# Requires bumpmapping to be enabled. -# type: bool -# generate_normalmaps = false - -# Strength of generated normalmaps. -# type: float -# normalmaps_strength = 0.6 - -# Defines sampling step of texture. -# A higher value results in smoother normal maps. -# type: int min: 0 max: 2 -# normalmaps_smooth = 0 - #### Parallax Occlusion # Enables parallax occlusion mapping. diff --git a/src/client/shader.cpp b/src/client/shader.cpp index fc0a72319..c5fe5dfe0 100644 --- a/src/client/shader.cpp +++ b/src/client/shader.cpp @@ -688,34 +688,6 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp shaders_header += itos(drawtype); shaders_header += "\n"; - if (g_settings->getBool("generate_normalmaps")) { - shaders_header += "#define GENERATE_NORMALMAPS 1\n"; - } else { - shaders_header += "#define GENERATE_NORMALMAPS 0\n"; - } - shaders_header += "#define NORMALMAPS_STRENGTH "; - shaders_header += ftos(g_settings->getFloat("normalmaps_strength")); - shaders_header += "\n"; - float sample_step; - int smooth = (int)g_settings->getFloat("normalmaps_smooth"); - switch (smooth){ - case 0: - sample_step = 0.0078125; // 1.0 / 128.0 - break; - case 1: - sample_step = 0.00390625; // 1.0 / 256.0 - break; - case 2: - sample_step = 0.001953125; // 1.0 / 512.0 - break; - default: - sample_step = 0.0078125; - break; - } - shaders_header += "#define SAMPLE_STEP "; - shaders_header += ftos(sample_step); - shaders_header += "\n"; - if (g_settings->getBool("enable_bumpmapping")) shaders_header += "#define ENABLE_BUMPMAPPING\n"; diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index d2115c959..3a0b88dc2 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -253,9 +253,6 @@ void set_default_settings(Settings *settings) settings->setDefault("tone_mapping", "false"); settings->setDefault("enable_bumpmapping", "false"); settings->setDefault("enable_parallax_occlusion", "false"); - settings->setDefault("generate_normalmaps", "false"); - settings->setDefault("normalmaps_strength", "0.6"); - settings->setDefault("normalmaps_smooth", "1"); settings->setDefault("parallax_occlusion_mode", "1"); settings->setDefault("parallax_occlusion_iterations", "4"); settings->setDefault("parallax_occlusion_scale", "0.08"); diff --git a/src/settings_translation_file.cpp b/src/settings_translation_file.cpp index febfbb9d3..0cd772337 100644 --- a/src/settings_translation_file.cpp +++ b/src/settings_translation_file.cpp @@ -242,13 +242,7 @@ fake_function() { gettext("Enables Hable's 'Uncharted 2' filmic tone mapping.\nSimulates the tone curve of photographic film and how this approximates the\nappearance of high dynamic range images. Mid-range contrast is slightly\nenhanced, highlights and shadows are gradually compressed."); gettext("Bumpmapping"); gettext("Bumpmapping"); - gettext("Enables bumpmapping for textures. Normalmaps need to be supplied by the texture pack\nor need to be auto-generated.\nRequires shaders to be enabled."); - gettext("Generate normalmaps"); - gettext("Enables on the fly normalmap generation (Emboss effect).\nRequires bumpmapping to be enabled."); - gettext("Normalmaps strength"); - gettext("Strength of generated normalmaps."); - gettext("Normalmaps sampling"); - gettext("Defines sampling step of texture.\nA higher value results in smoother normal maps."); + gettext("Enables bumpmapping for textures. Normalmaps need to be supplied by the texture pack.\nRequires shaders to be enabled."); gettext("Parallax Occlusion"); gettext("Parallax occlusion"); gettext("Enables parallax occlusion mapping.\nRequires shaders to be enabled."); From c8303f790ccb03857d031ecb73de7f9f59a6ceba Mon Sep 17 00:00:00 2001 From: Zughy <63455151+Zughy@users.noreply.github.com> Date: Wed, 16 Sep 2020 15:47:20 +0200 Subject: [PATCH 064/177] lua_api.txt: author, release and title fields when downloading from ContentDB (#10129) Co-authored-by: Marco <4279489-marco_a@users.noreply.gitlab.com> Co-authored-by: rubenwardy --- doc/lua_api.txt | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 86627c19e..a1baadf6d 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -62,12 +62,12 @@ Where `` is unique to each game. The game directory can contain the following files: * `game.conf`, with the following keys: - * `name`: Required, human readable name e.g. `name = Minetest` + * `name`: Required, a human readable title to address the game, e.g. `name = Minetest`. * `description`: Short description to be shown in the content tab * `allowed_mapgens = ` e.g. `allowed_mapgens = v5,v6,flat` - Mapgens not in this list are removed from the list of mapgens for - the game. + Mapgens not in this list are removed from the list of mapgens for the + game. If not specified, all mapgens are allowed. * `disallowed_mapgens = ` e.g. `disallowed_mapgens = v5,v6,flat` @@ -79,6 +79,10 @@ The game directory can contain the following files: e.g. `disallowed_mapgen_settings = mgv5_spflags` These settings are hidden for this game in the world creation dialog and game start menu. + * `author`: The author of the game. It only appears when downloaded from + ContentDB. + * `release`: Ignore this: Should only ever be set by ContentDB, as it is + an internal ID used to track versions. * `minetest.conf`: Used to set default settings when running this game. * `settingtypes.txt`: @@ -134,9 +138,15 @@ Mods can be put in a subdirectory, if the parent directory, which otherwise should be a mod, contains a file named `modpack.conf`. The file is a key-value store of modpack details. -* `name`: The modpack name. +* `name`: The modpack name. Allows Minetest to determine the modpack name even + if the folder is wrongly named. * `description`: Description of mod to be shown in the Mods tab of the main menu. +* `author`: The author of the modpack. It only appears when downloaded from + ContentDB. +* `release`: Ignore this: Should only ever be set by ContentDB, as it is an + internal ID used to track versions. +* `title`: A human-readable title to address the modpack. Note: to support 0.4.x, please also create an empty modpack.txt file. @@ -181,6 +191,11 @@ A `Settings` file that provides meta information about the mod. loaded before this mod. * `optional_depends`: A comma separated list of optional dependencies. Like a dependency, but no error if the mod doesn't exist. +* `author`: The author of the mod. It only appears when downloaded from + ContentDB. +* `release`: Ignore this: Should only ever be set by ContentDB, as it is an + internal ID used to track versions. +* `title`: A human-readable title to address the mod. Note: to support 0.4.x, please also provide depends.txt. From 9ec75d77651c333eca3c5b46a3a56c8353fed464 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Wed, 16 Sep 2020 14:51:11 +0100 Subject: [PATCH 065/177] Clean up server-side translations, remove global variable (#10075) --- src/client/client.cpp | 9 ++---- src/filesys.cpp | 15 ++++++++++ src/filesys.h | 2 ++ src/script/lua_api/l_env.cpp | 6 ++-- src/server.cpp | 53 +++++++++++++++--------------------- src/server.h | 7 +++-- src/serverlist.cpp | 10 +------ src/translation.cpp | 8 ------ src/translation.h | 5 ---- 9 files changed, 50 insertions(+), 65 deletions(-) diff --git a/src/client/client.cpp b/src/client/client.cpp index 745cce900..d6e529c40 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -238,18 +238,13 @@ void Client::scanModSubfolder(const std::string &mod_name, const std::string &mo infostream << "Client::scanModSubfolder(): Loading \"" << real_path << "\" as \"" << vfs_path << "\"." << std::endl; - std::ifstream is(real_path, std::ios::binary | std::ios::ate); - if(!is.good()) { + std::string contents; + if (!fs::ReadFile(real_path, contents)) { errorstream << "Client::scanModSubfolder(): Can't read file \"" << real_path << "\"." << std::endl; continue; } - auto size = is.tellg(); - std::string contents(size, '\0'); - is.seekg(0); - is.read(&contents[0], size); - infostream << " size: " << size << " bytes" << std::endl; m_mod_vfs.emplace(vfs_path, contents); } } diff --git a/src/filesys.cpp b/src/filesys.cpp index 0bc351669..2470b1b64 100644 --- a/src/filesys.cpp +++ b/src/filesys.cpp @@ -750,6 +750,21 @@ bool safeWriteToFile(const std::string &path, const std::string &content) return true; } +bool ReadFile(const std::string &path, std::string &out) +{ + std::ifstream is(path, std::ios::binary | std::ios::ate); + if (!is.good()) { + return false; + } + + auto size = is.tellg(); + out.resize(size); + is.seekg(0); + is.read(&out[0], size); + + return true; +} + bool Rename(const std::string &from, const std::string &to) { return rename(from.c_str(), to.c_str()) == 0; diff --git a/src/filesys.h b/src/filesys.h index 09f129aa3..b2c800c55 100644 --- a/src/filesys.h +++ b/src/filesys.h @@ -128,6 +128,8 @@ const char *GetFilenameFromPath(const char *path); bool safeWriteToFile(const std::string &path, const std::string &content); +bool ReadFile(const std::string &path, std::string &out); + bool Rename(const std::string &from, const std::string &to); } // namespace fs diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp index b2bc8c5f6..138e88ae8 100644 --- a/src/script/lua_api/l_env.cpp +++ b/src/script/lua_api/l_env.cpp @@ -1340,9 +1340,9 @@ int ModApiEnvMod::l_get_translated_string(lua_State * L) GET_ENV_PTR; std::string lang_code = luaL_checkstring(L, 1); std::string string = luaL_checkstring(L, 2); - getServer(L)->loadTranslationLanguage(lang_code); - string = wide_to_utf8(translate_string(utf8_to_wide(string), - &(*g_server_translations)[lang_code])); + + auto *translations = getServer(L)->getTranslationLanguage(lang_code); + string = wide_to_utf8(translate_string(utf8_to_wide(string), translations)); lua_pushstring(L, string.c_str()); return 1; } diff --git a/src/server.cpp b/src/server.cpp index 7b3978462..b8a99f6ae 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2451,31 +2451,14 @@ bool Server::addMediaFile(const std::string &filename, // Ok, attempt to load the file and add to cache // Read data - std::ifstream fis(filepath.c_str(), std::ios_base::binary); - if (!fis.good()) { - errorstream << "Server::addMediaFile(): Could not open \"" - << filename << "\" for reading" << std::endl; - return false; - } std::string filedata; - bool bad = false; - for (;;) { - char buf[1024]; - fis.read(buf, sizeof(buf)); - std::streamsize len = fis.gcount(); - filedata.append(buf, len); - if (fis.eof()) - break; - if (!fis.good()) { - bad = true; - break; - } - } - if (bad) { - errorstream << "Server::addMediaFile(): Failed to read \"" - << filename << "\"" << std::endl; + if (!fs::ReadFile(filepath, filedata)) { + errorstream << "Server::addMediaFile(): Failed to open \"" + << filename << "\" for reading" << std::endl; return false; - } else if (filedata.empty()) { + } + + if (filedata.empty()) { errorstream << "Server::addMediaFile(): Empty file \"" << filepath << "\"" << std::endl; return false; @@ -3890,19 +3873,27 @@ void Server::broadcastModChannelMessage(const std::string &channel, } } -void Server::loadTranslationLanguage(const std::string &lang_code) +Translations *Server::getTranslationLanguage(const std::string &lang_code) { - if (g_server_translations->count(lang_code)) - return; // Already loaded + if (lang_code.empty()) + return nullptr; + + auto it = server_translations.find(lang_code); + if (it != server_translations.end()) + return &it->second; // Already loaded + + // [] will create an entry + auto *translations = &server_translations[lang_code]; std::string suffix = "." + lang_code + ".tr"; for (const auto &i : m_media) { if (str_ends_with(i.first, suffix)) { - std::ifstream t(i.second.path); - std::string data((std::istreambuf_iterator(t)), - std::istreambuf_iterator()); - - (*g_server_translations)[lang_code].loadTranslation(data); + std::string data; + if (fs::ReadFile(i.second.path, data)) { + translations->loadTranslation(data); + } } } + + return translations; } diff --git a/src/server.h b/src/server.h index be6f60abc..258d75eaf 100644 --- a/src/server.h +++ b/src/server.h @@ -38,6 +38,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "serverenvironment.h" #include "clientiface.h" #include "chatmessage.h" +#include "translation.h" #include #include #include @@ -343,8 +344,8 @@ public: // Send block to specific player only bool SendBlock(session_t peer_id, const v3s16 &blockpos); - // Load translations for a language - void loadTranslationLanguage(const std::string &lang_code); + // Get or load translations for a language + Translations *getTranslationLanguage(const std::string &lang_code); // Bind address Address m_bind_addr; @@ -557,6 +558,8 @@ private: // Mods std::unique_ptr m_modmgr; + std::unordered_map server_translations; + /* Threads */ diff --git a/src/serverlist.cpp b/src/serverlist.cpp index 2f6ab2e61..c7fe2d888 100644 --- a/src/serverlist.cpp +++ b/src/serverlist.cpp @@ -52,15 +52,7 @@ std::vector getLocal() { std::string path = ServerList::getFilePath(); std::string liststring; - if (fs::PathExists(path)) { - std::ifstream istream(path.c_str()); - if (istream.is_open()) { - std::ostringstream ostream; - ostream << istream.rdbuf(); - liststring = ostream.str(); - istream.close(); - } - } + fs::ReadFile(path, liststring); return deSerialize(liststring); } diff --git a/src/translation.cpp b/src/translation.cpp index 8bbaee0a3..82e813a5d 100644 --- a/src/translation.cpp +++ b/src/translation.cpp @@ -29,14 +29,6 @@ Translations client_translations; Translations *g_client_translations = &client_translations; #endif -// Per language server translations -std::unordered_map server_translations; -std::unordered_map *g_server_translations = &server_translations; - -Translations::~Translations() -{ - clear(); -} void Translations::clear() { diff --git a/src/translation.h b/src/translation.h index 71423b15e..f1a336fca 100644 --- a/src/translation.h +++ b/src/translation.h @@ -23,7 +23,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include class Translations; -extern std::unordered_map *g_server_translations; #ifndef SERVER extern Translations *g_client_translations; #endif @@ -31,10 +30,6 @@ extern Translations *g_client_translations; class Translations { public: - Translations() = default; - - ~Translations(); - void loadTranslation(const std::string &data); void clear(); const std::wstring &getTranslation( From 49117de47658cd6c885f88010c9328f8ce3e6e93 Mon Sep 17 00:00:00 2001 From: Lars Date: Sun, 20 Sep 2020 12:51:12 -0700 Subject: [PATCH 066/177] Record player existence in dymmy database. --- src/database/database-dummy.cpp | 23 +++++++++++++++++++++++ src/database/database-dummy.h | 9 +++++---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/database/database-dummy.cpp b/src/database/database-dummy.cpp index a3d8cd579..b56f341c5 100644 --- a/src/database/database-dummy.cpp +++ b/src/database/database-dummy.cpp @@ -22,6 +22,7 @@ Dummy database class */ #include "database-dummy.h" +#include "remoteplayer.h" bool Database_Dummy::saveBlock(const v3s16 &pos, const std::string &data) @@ -57,3 +58,25 @@ void Database_Dummy::listAllLoadableBlocks(std::vector &dst) } } +void Database_Dummy::savePlayer(RemotePlayer *player) +{ + m_player_database.insert(player->getName()); +} + +bool Database_Dummy::loadPlayer(RemotePlayer *player, PlayerSAO *sao) +{ + return m_player_database.find(player->getName()) != m_player_database.end(); +} + +bool Database_Dummy::removePlayer(const std::string &name) +{ + m_player_database.erase(name); + return true; +} + +void Database_Dummy::listPlayers(std::vector &res) +{ + for (const auto &player : m_player_database) { + res.emplace_back(player); + } +} diff --git a/src/database/database-dummy.h b/src/database/database-dummy.h index 2d87d58f6..b69919f84 100644 --- a/src/database/database-dummy.h +++ b/src/database/database-dummy.h @@ -32,14 +32,15 @@ public: bool deleteBlock(const v3s16 &pos); void listAllLoadableBlocks(std::vector &dst); - void savePlayer(RemotePlayer *player) {} - bool loadPlayer(RemotePlayer *player, PlayerSAO *sao) { return true; } - bool removePlayer(const std::string &name) { return true; } - void listPlayers(std::vector &res) {} + void savePlayer(RemotePlayer *player); + bool loadPlayer(RemotePlayer *player, PlayerSAO *sao); + bool removePlayer(const std::string &name); + void listPlayers(std::vector &res); void beginSave() {} void endSave() {} private: std::map m_database; + std::set m_player_database; }; From e7f33ee2f1c57b2b5c48d1a54a5f9e4c72a3275c Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Mon, 21 Sep 2020 19:10:44 +0200 Subject: [PATCH 067/177] Settings: Fix crash on exit due to group double-free --- src/settings.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/settings.cpp b/src/settings.cpp index 55404319e..473a216bf 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -824,13 +824,21 @@ bool Settings::setDefault(const std::string &name, const std::string &value) bool Settings::setGroup(const std::string &name, Settings *group) { - return setEntry(name, &group, true, false); + // Settings must own the group pointer + // avoid double-free by copying the source + Settings *copy = new Settings(); + *copy = *group; + return setEntry(name, ©, true, false); } bool Settings::setGroupDefault(const std::string &name, Settings *group) { - return setEntry(name, &group, true, true); + // Settings must own the group pointer + // avoid double-free by copying the source + Settings *copy = new Settings(); + *copy = *group; + return setEntry(name, ©, true, true); } From 55e2dd911b16a70ee976e067cf34a48922db9dcb Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 22 Sep 2020 18:38:33 +0200 Subject: [PATCH 068/177] Fix chat/infotext overlap if many chat lines (#10399) Moves the infotext depending on the value of the recent_chat_messages value + 2 additional lines to account for the 2 debug mode lines + 1 additional line as "buffer" for better readability if chat is full. --- src/client/gameui.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/client/gameui.cpp b/src/client/gameui.cpp index 81c268e44..75e7d15b9 100644 --- a/src/client/gameui.cpp +++ b/src/client/gameui.cpp @@ -61,17 +61,6 @@ void GameUI::init() m_guitext2 = gui::StaticText::add(guienv, L"", core::rect(0, 0, 0, 0), false, false, guiroot); - // At the middle of the screen - // Object infos are shown in this - m_guitext_info = gui::StaticText::add(guienv, L"", - core::rect(0, 0, 400, g_fontengine->getTextHeight() * 5 + 5) - + v2s32(100, 200), false, true, guiroot); - - // Status text (displays info when showing and hiding GUI stuff, etc.) - m_guitext_status = gui::StaticText::add(guienv, L"", - core::rect(0, 0, 0, 0), false, false, guiroot); - m_guitext_status->setVisible(false); - // Chat text m_guitext_chat = gui::StaticText::add(guienv, L"", core::rect(0, 0, 0, 0), //false, false); // Disable word wrap as of now @@ -82,6 +71,20 @@ void GameUI::init() chat_font_size, FM_Unspecified)); } + // At the middle of the screen + // Object infos are shown in this + u32 chat_font_height = m_guitext_chat->getActiveFont()->getDimension(L"Ay").Height; + m_guitext_info = gui::StaticText::add(guienv, L"", + core::rect(0, 0, 400, g_fontengine->getTextHeight() * 5 + 5) + + v2s32(100, chat_font_height * + (g_settings->getU16("recent_chat_messages") + 3)), + false, true, guiroot); + + // Status text (displays info when showing and hiding GUI stuff, etc.) + m_guitext_status = gui::StaticText::add(guienv, L"", + core::rect(0, 0, 0, 0), false, false, guiroot); + m_guitext_status->setVisible(false); + // Profiler text (size is updated when text is updated) m_guitext_profiler = gui::StaticText::add(guienv, L"", core::rect(0, 0, 0, 0), false, false, guiroot); From add68369a59af90f8b4203b53695521c6d657d6b Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Tue, 22 Sep 2020 18:40:34 +0200 Subject: [PATCH 069/177] Settings: Fix unittest memory leak, change input types --- src/settings.cpp | 10 +++++----- src/settings.h | 4 ++-- src/unittest/test_settings.cpp | 16 ++++++++-------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/settings.cpp b/src/settings.cpp index 473a216bf..28b72c4e3 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -822,22 +822,22 @@ bool Settings::setDefault(const std::string &name, const std::string &value) } -bool Settings::setGroup(const std::string &name, Settings *group) +bool Settings::setGroup(const std::string &name, const Settings &group) { // Settings must own the group pointer // avoid double-free by copying the source Settings *copy = new Settings(); - *copy = *group; + *copy = group; return setEntry(name, ©, true, false); } -bool Settings::setGroupDefault(const std::string &name, Settings *group) +bool Settings::setGroupDefault(const std::string &name, const Settings &group) { // Settings must own the group pointer // avoid double-free by copying the source Settings *copy = new Settings(); - *copy = *group; + *copy = group; return setEntry(name, ©, true, true); } @@ -1060,7 +1060,7 @@ void Settings::overrideDefaults(Settings *other) { for (const auto &setting : other->m_settings) { if (setting.second.is_group) { - setGroupDefault(setting.first, setting.second.group); + setGroupDefault(setting.first, *setting.second.group); continue; } const FlagDesc *flagdesc = getFlagDescFallback(setting.first); diff --git a/src/settings.h b/src/settings.h index 0c9a155db..ccc252049 100644 --- a/src/settings.h +++ b/src/settings.h @@ -192,8 +192,8 @@ public: bool set_group, bool set_default); bool set(const std::string &name, const std::string &value); bool setDefault(const std::string &name, const std::string &value); - bool setGroup(const std::string &name, Settings *group); - bool setGroupDefault(const std::string &name, Settings *group); + bool setGroup(const std::string &name, const Settings &group); + bool setGroupDefault(const std::string &name, const Settings &group); bool setBool(const std::string &name, bool value); bool setS16(const std::string &name, s16 value); bool setU16(const std::string &name, u16 value); diff --git a/src/unittest/test_settings.cpp b/src/unittest/test_settings.cpp index aa56f3e06..f91ba5b67 100644 --- a/src/unittest/test_settings.cpp +++ b/src/unittest/test_settings.cpp @@ -149,15 +149,15 @@ void TestSettings::testAllSettings() UASSERT(group->getS16("a") == 5); UASSERT(fabs(group->getFloat("bb") - 2.5) < 0.001); - Settings *group3 = new Settings; - group3->set("cat", "meow"); - group3->set("dog", "woof"); + Settings group3; + group3.set("cat", "meow"); + group3.set("dog", "woof"); - Settings *group2 = new Settings; - group2->setS16("num_apples", 4); - group2->setS16("num_oranges", 53); - group2->setGroup("animals", group3); - group2->set("animals", "cute"); //destroys group 3 + Settings group2; + group2.setS16("num_apples", 4); + group2.setS16("num_oranges", 53); + group2.setGroup("animals", group3); + group2.set("animals", "cute"); //destroys group 3 s.setGroup("groupy_thing", group2); // Test set failure conditions From 34e3ede8eeb05e193e64ba3d055fc67959d87d86 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Wed, 23 Sep 2020 18:11:56 +0100 Subject: [PATCH 070/177] Ability to remove minetest.after once set (#10103) --- builtin/common/after.lua | 6 ++++-- doc/lua_api.txt | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/builtin/common/after.lua b/builtin/common/after.lua index b314711c9..e20f292f0 100644 --- a/builtin/common/after.lua +++ b/builtin/common/after.lua @@ -31,11 +31,13 @@ function core.after(after, func, ...) assert(tonumber(after) and type(func) == "function", "Invalid minetest.after invocation") local expire = time + after - jobs[#jobs + 1] = { + local new_job = { func = func, expire = expire, arg = {...}, - mod_origin = core.get_last_run_mod() + mod_origin = core.get_last_run_mod(), } + jobs[#jobs + 1] = new_job time_next = math.min(time_next, expire) + return { cancel = function() new_job.func = function() end end } end diff --git a/doc/lua_api.txt b/doc/lua_api.txt index a1baadf6d..bd845aad3 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -5336,10 +5336,13 @@ Sounds Timing ------ -* `minetest.after(time, func, ...)` +* `minetest.after(time, func, ...)` : returns job table to use as below. * Call the function `func` after `time` seconds, may be fractional * Optional: Variable number of arguments that are passed to `func` +* `job:cancel()` + * Cancels the job function from being called + Server ------ From 787561b29afdbc78769f68c2f5c4f2cff1b32340 Mon Sep 17 00:00:00 2001 From: Vincent Robinson Date: Wed, 23 Sep 2020 10:12:20 -0700 Subject: [PATCH 071/177] Replace MyEventReceiver KeyList with std::unordered_set (#10419) --- src/client/inputhandler.cpp | 48 ++++++++-------- src/client/inputhandler.h | 108 +++++++----------------------------- src/client/keycode.h | 19 +++++++ 3 files changed, 64 insertions(+), 111 deletions(-) diff --git a/src/client/inputhandler.cpp b/src/client/inputhandler.cpp index 608a405a8..ee3e37ae9 100644 --- a/src/client/inputhandler.cpp +++ b/src/client/inputhandler.cpp @@ -112,7 +112,7 @@ bool MyEventReceiver::OnEvent(const SEvent &event) // Remember whether each key is down or up if (event.EventType == irr::EET_KEY_INPUT_EVENT) { const KeyPress &keyCode = event.KeyInput; - if (keysListenedFor[keyCode]) { + if (keysListenedFor.count(keyCode)) { // If the key is being held down then the OS may // send a continuous stream of keydown events. // In this case, we don't want to let this @@ -120,15 +120,15 @@ bool MyEventReceiver::OnEvent(const SEvent &event) // certain actions to repeat constantly. if (event.KeyInput.PressedDown) { if (!IsKeyDown(keyCode)) { - keyWasDown.set(keyCode); - keyWasPressed.set(keyCode); + keyWasDown.insert(keyCode); + keyWasPressed.insert(keyCode); } - keyIsDown.set(keyCode); + keyIsDown.insert(keyCode); } else { if (IsKeyDown(keyCode)) - keyWasReleased.set(keyCode); + keyWasReleased.insert(keyCode); - keyIsDown.unset(keyCode); + keyIsDown.erase(keyCode); } return true; @@ -153,36 +153,36 @@ bool MyEventReceiver::OnEvent(const SEvent &event) switch (event.MouseInput.Event) { case EMIE_LMOUSE_PRESSED_DOWN: key = "KEY_LBUTTON"; - keyIsDown.set(key); - keyWasDown.set(key); - keyWasPressed.set(key); + keyIsDown.insert(key); + keyWasDown.insert(key); + keyWasPressed.insert(key); break; case EMIE_MMOUSE_PRESSED_DOWN: key = "KEY_MBUTTON"; - keyIsDown.set(key); - keyWasDown.set(key); - keyWasPressed.set(key); + keyIsDown.insert(key); + keyWasDown.insert(key); + keyWasPressed.insert(key); break; case EMIE_RMOUSE_PRESSED_DOWN: key = "KEY_RBUTTON"; - keyIsDown.set(key); - keyWasDown.set(key); - keyWasPressed.set(key); + keyIsDown.insert(key); + keyWasDown.insert(key); + keyWasPressed.insert(key); break; case EMIE_LMOUSE_LEFT_UP: key = "KEY_LBUTTON"; - keyIsDown.unset(key); - keyWasReleased.set(key); + keyIsDown.erase(key); + keyWasReleased.insert(key); break; case EMIE_MMOUSE_LEFT_UP: key = "KEY_MBUTTON"; - keyIsDown.unset(key); - keyWasReleased.set(key); + keyIsDown.erase(key); + keyWasReleased.insert(key); break; case EMIE_RMOUSE_LEFT_UP: key = "KEY_RBUTTON"; - keyIsDown.unset(key); - keyWasReleased.set(key); + keyIsDown.erase(key); + keyWasReleased.insert(key); break; case EMIE_MOUSE_WHEEL: mouse_wheel += event.MouseInput.Wheel; @@ -235,7 +235,11 @@ void RandomInputHandler::step(float dtime) i.counter -= dtime; if (i.counter < 0.0) { i.counter = 0.1 * Rand(1, i.time_max); - keydown.toggle(getKeySetting(i.key.c_str())); + KeyPress k = getKeySetting(i.key.c_str()); + if (keydown.count(k)) + keydown.erase(k); + else + keydown.insert(k); } } { diff --git a/src/client/inputhandler.h b/src/client/inputhandler.h index def147a82..885f34e05 100644 --- a/src/client/inputhandler.h +++ b/src/client/inputhandler.h @@ -21,9 +21,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_extrabloated.h" #include "joystick_controller.h" -#include #include "keycode.h" #include "renderingengine.h" +#include #ifdef HAVE_TOUCHSCREENGUI #include "gui/touchscreengui.h" @@ -61,98 +61,32 @@ struct KeyCache InputHandler *handler; }; -class KeyList : private std::list -{ - typedef std::list super; - typedef super::iterator iterator; - typedef super::const_iterator const_iterator; - - virtual const_iterator find(const KeyPress &key) const - { - const_iterator f(begin()); - const_iterator e(end()); - - while (f != e) { - if (*f == key) - return f; - - ++f; - } - - return e; - } - - virtual iterator find(const KeyPress &key) - { - iterator f(begin()); - iterator e(end()); - - while (f != e) { - if (*f == key) - return f; - - ++f; - } - - return e; - } - -public: - void clear() { super::clear(); } - - void set(const KeyPress &key) - { - if (find(key) == end()) - push_back(key); - } - - void unset(const KeyPress &key) - { - iterator p(find(key)); - - if (p != end()) - erase(p); - } - - void toggle(const KeyPress &key) - { - iterator p(this->find(key)); - - if (p != end()) - erase(p); - else - push_back(key); - } - - bool operator[](const KeyPress &key) const { return find(key) != end(); } -}; - class MyEventReceiver : public IEventReceiver { public: // This is the one method that we have to implement virtual bool OnEvent(const SEvent &event); - bool IsKeyDown(const KeyPress &keyCode) const { return keyIsDown[keyCode]; } + bool IsKeyDown(const KeyPress &keyCode) const { return keyIsDown.count(keyCode); } // Checks whether a key was down and resets the state bool WasKeyDown(const KeyPress &keyCode) { - bool b = keyWasDown[keyCode]; + bool b = keyWasDown.count(keyCode); if (b) - keyWasDown.unset(keyCode); + keyWasDown.erase(keyCode); return b; } // Checks whether a key was just pressed. State will be cleared // in the subsequent iteration of Game::processPlayerInteraction - bool WasKeyPressed(const KeyPress &keycode) const { return keyWasPressed[keycode]; } + bool WasKeyPressed(const KeyPress &keycode) const { return keyWasPressed.count(keycode); } // Checks whether a key was just released. State will be cleared // in the subsequent iteration of Game::processPlayerInteraction - bool WasKeyReleased(const KeyPress &keycode) const { return keyWasReleased[keycode]; } + bool WasKeyReleased(const KeyPress &keycode) const { return keyWasReleased.count(keycode); } - void listenForKey(const KeyPress &keyCode) { keysListenedFor.set(keyCode); } + void listenForKey(const KeyPress &keyCode) { keysListenedFor.insert(keyCode); } void dontListenForKeys() { keysListenedFor.clear(); } s32 getMouseWheel() @@ -198,24 +132,20 @@ public: #endif private: - // The current state of keys - KeyList keyIsDown; + //! The current state of keys + std::unordered_set keyIsDown; - // Whether a key was down - KeyList keyWasDown; + //! Whether a key was down + std::unordered_set keyWasDown; - // Whether a key has just been pressed - KeyList keyWasPressed; + //! Whether a key has just been pressed + std::unordered_set keyWasPressed; - // Whether a key has just been released - KeyList keyWasReleased; + //! Whether a key has just been released + std::unordered_set keyWasReleased; - // List of keys we listen for - // TODO perhaps the type of this is not really - // performant as KeyList is designed for few but - // often changing keys, and keysListenedFor is expected - // to change seldomly but contain lots of keys. - KeyList keysListenedFor; + //! List of keys we listen for + std::unordered_set keysListenedFor; }; class InputHandler @@ -347,7 +277,7 @@ public: return true; } - virtual bool isKeyDown(GameKeyType k) { return keydown[keycache.key[k]]; } + virtual bool isKeyDown(GameKeyType k) { return keydown.count(keycache.key[k]); } virtual bool wasKeyDown(GameKeyType k) { return false; } virtual bool wasKeyPressed(GameKeyType k) { return false; } virtual bool wasKeyReleased(GameKeyType k) { return false; } @@ -362,7 +292,7 @@ public: s32 Rand(s32 min, s32 max); private: - KeyList keydown; + std::unordered_set keydown; v2s32 mousepos; v2s32 mousespeed; }; diff --git a/src/client/keycode.h b/src/client/keycode.h index 7036705d1..263b722c7 100644 --- a/src/client/keycode.h +++ b/src/client/keycode.h @@ -24,12 +24,20 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include +class KeyPress; +namespace std +{ + template <> struct hash; +} + /* A key press, consisting of either an Irrlicht keycode or an actual char */ class KeyPress { public: + friend struct std::hash; + KeyPress() = default; KeyPress(const char *name); @@ -55,6 +63,17 @@ protected: std::string m_name = ""; }; +namespace std +{ + template <> struct hash + { + size_t operator()(const KeyPress &key) const + { + return key.Key; + } + }; +} + extern const KeyPress EscapeKey; extern const KeyPress CancelKey; From 9bff154cba14686f5a3b56f4cba405824b88c402 Mon Sep 17 00:00:00 2001 From: Paramat Date: Thu, 24 Sep 2020 00:10:50 +0100 Subject: [PATCH 072/177] Fix horizontal/vertical merging bug of hardware-colored framed glass (#10417) Previously, the param2-controlled horizontal/vertical merge feature (which was undocumented and forgotten) was always active, causing uses of param2 other than "glasslikeliquidlevel" to affect H/V merging. Only respect H/V merge bits when paramtype2 = "glasslikeliquidlevel". H/V merge bits and liquid level bits are designed to be used simultaneously. --- src/client/content_mapblock.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/client/content_mapblock.cpp b/src/client/content_mapblock.cpp index 65a85709b..df2748212 100644 --- a/src/client/content_mapblock.cpp +++ b/src/client/content_mapblock.cpp @@ -723,7 +723,8 @@ void MapblockMeshGenerator::drawGlasslikeFramedNode() for (auto &glass_tile : glass_tiles) glass_tile = tiles[4]; - u8 param2 = n.getParam2(); + // Only respect H/V merge bits when paramtype2 = "glasslikeliquidlevel" (liquid tank) + u8 param2 = (f->param_type_2 == CPT2_GLASSLIKE_LIQUID_LEVEL) ? n.getParam2() : 0; bool H_merge = !(param2 & 128); bool V_merge = !(param2 & 64); param2 &= 63; From c6e3050357e8378ad15e7fa7a9aa80f3936fbc2d Mon Sep 17 00:00:00 2001 From: Buckaroo Banzai <39065740+BuckarooBanzay@users.noreply.github.com> Date: Fri, 25 Sep 2020 18:52:42 +0200 Subject: [PATCH 073/177] Correct erroneous reported max lag with prometheus (#10427) Co-authored-by: BuckarooBanzay --- src/server.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/server.cpp b/src/server.cpp index b8a99f6ae..456edfeb8 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -653,7 +653,12 @@ void Server::AsyncRunStep(bool initial_step) } m_clients.step(dtime); - m_lag_gauge->increment((m_lag_gauge->get() > dtime ? -1 : 1) * dtime/100); + // increase/decrease lag gauge gradually + if (m_lag_gauge->get() > dtime) { + m_lag_gauge->decrement(dtime/100); + } else { + m_lag_gauge->increment(dtime/100); + } #if USE_CURL // send masterserver announce { From 09af0c5946c7082fc82563faf0ad9ef144fb9a06 Mon Sep 17 00:00:00 2001 From: luk3yx Date: Sun, 27 Sep 2020 01:31:54 +1200 Subject: [PATCH 074/177] Remove null bytes from TOCLIENT_BLOCKDATA (#10433) --- src/server.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server.cpp b/src/server.cpp index 456edfeb8..d40ff259f 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2338,7 +2338,7 @@ void Server::SendBlockNoLock(session_t peer_id, MapBlock *block, u8 ver, block->serializeNetworkSpecific(os); std::string s = os.str(); - NetworkPacket pkt(TOCLIENT_BLOCKDATA, 2 + 2 + 2 + 2 + s.size(), peer_id); + NetworkPacket pkt(TOCLIENT_BLOCKDATA, 2 + 2 + 2 + s.size(), peer_id); pkt << block->getPos(); pkt.putRawString(s.c_str(), s.size()); From 9eb4516cbc6a5a790dcb77178e1f1408ec0b06d0 Mon Sep 17 00:00:00 2001 From: Buckaroo Banzai <39065740+BuckarooBanzay@users.noreply.github.com> Date: Sat, 26 Sep 2020 15:32:49 +0200 Subject: [PATCH 075/177] Enable LuaJIT on the Docker image (#10414) --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 72343ab9c..871ca9825 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,7 +21,7 @@ WORKDIR /usr/src/minetest RUN apk add --no-cache git build-base irrlicht-dev cmake bzip2-dev libpng-dev \ jpeg-dev libxxf86vm-dev mesa-dev sqlite-dev libogg-dev \ libvorbis-dev openal-soft-dev curl-dev freetype-dev zlib-dev \ - gmp-dev jsoncpp-dev postgresql-dev ca-certificates && \ + gmp-dev jsoncpp-dev postgresql-dev luajit-dev ca-certificates && \ git clone --depth=1 -b ${MINETEST_GAME_VERSION} https://github.com/minetest/minetest_game.git ./games/minetest_game && \ rm -fr ./games/minetest_game/.git @@ -51,7 +51,7 @@ RUN mkdir build && \ FROM alpine:3.11 -RUN apk add --no-cache sqlite-libs curl gmp libstdc++ libgcc libpq && \ +RUN apk add --no-cache sqlite-libs curl gmp libstdc++ libgcc libpq luajit && \ adduser -D minetest --uid 30000 -h /var/lib/minetest && \ chown -R minetest:minetest /var/lib/minetest From 917e357bcaf5b7ebb77afe16b8c8fbe53b827e79 Mon Sep 17 00:00:00 2001 From: Tyler Schwend Date: Sat, 26 Sep 2020 12:41:16 -0400 Subject: [PATCH 076/177] Log server announce on updates and deletes too (#10177) --- src/serverlist.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/serverlist.cpp b/src/serverlist.cpp index c7fe2d888..80a8c2f1a 100644 --- a/src/serverlist.cpp +++ b/src/serverlist.cpp @@ -245,12 +245,19 @@ void sendAnnounce(AnnounceAction action, for (const ModSpec &mod : mods) { server["mods"].append(mod.name); } - actionstream << "Announcing to " << g_settings->get("serverlist_url") << std::endl; } else if (action == AA_UPDATE) { if (lag) server["lag"] = lag; } + if (action == AA_START) { + actionstream << "Announcing " << aa_names[action] << " to " << + g_settings->get("serverlist_url") << std::endl; + } else { + infostream << "Announcing " << aa_names[action] << " to " << + g_settings->get("serverlist_url") << std::endl; + } + HTTPFetchRequest fetch_request; fetch_request.url = g_settings->get("serverlist_url") + std::string("/announce"); fetch_request.method = HTTP_POST; From 65c15e137fe584edb38edea21c49873be00d554c Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein <54945686+EliasFleckenstein03@users.noreply.github.com> Date: Sat, 26 Sep 2020 18:41:44 +0200 Subject: [PATCH 077/177] Patch fast/teleport vulnerability when attached to an entity (#10340) --- src/server/player_sao.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/server/player_sao.cpp b/src/server/player_sao.cpp index 67efed210..e5b239bba 100644 --- a/src/server/player_sao.cpp +++ b/src/server/player_sao.cpp @@ -558,11 +558,34 @@ void PlayerSAO::setMaxSpeedOverride(const v3f &vel) bool PlayerSAO::checkMovementCheat() { - if (isAttached() || m_is_singleplayer || + if (m_is_singleplayer || g_settings->getBool("disable_anticheat")) { m_last_good_position = m_base_position; return false; } + if (UnitSAO *parent = dynamic_cast(getParent())) { + v3f attachment_pos; + { + int parent_id; + std::string bone; + v3f attachment_rot; + getAttachment(&parent_id, &bone, &attachment_pos, &attachment_rot); + } + + v3f parent_pos = parent->getBasePosition(); + f32 diff = m_base_position.getDistanceFromSQ(parent_pos) - attachment_pos.getLengthSQ(); + const f32 maxdiff = 4.0f * BS; // fair trade-off value for various latencies + + if (diff > maxdiff * maxdiff) { + setBasePosition(parent_pos); + actionstream << "Server: " << m_player->getName() + << " moved away from parent; diff=" << sqrtf(diff) / BS + << " resetting position." << std::endl; + return true; + } + // Player movement is locked to the entity. Skip further checks + return false; + } bool cheated = false; /* From 4298d95b16ab9a795b912f3d911c7b9ad2e3b03d Mon Sep 17 00:00:00 2001 From: Maksim Date: Sat, 26 Sep 2020 18:42:22 +0200 Subject: [PATCH 078/177] Android: replace InputDialogActivity on simple dialog window (#10034) --- .../android/app/src/main/AndroidManifest.xml | 7 +- .../net/minetest/minetest/CustomEditText.java | 45 +++++++++ .../net/minetest/minetest/GameActivity.java | 73 +++++++++----- .../minetest/InputDialogActivity.java | 98 ------------------- .../app/src/main/res/values/styles.xml | 9 +- 5 files changed, 95 insertions(+), 137 deletions(-) create mode 100644 build/android/app/src/main/java/net/minetest/minetest/CustomEditText.java delete mode 100644 build/android/app/src/main/java/net/minetest/minetest/InputDialogActivity.java diff --git a/build/android/app/src/main/AndroidManifest.xml b/build/android/app/src/main/AndroidManifest.xml index 0a7c8d95a..fa93e7069 100644 --- a/build/android/app/src/main/AndroidManifest.xml +++ b/build/android/app/src/main/AndroidManifest.xml @@ -17,8 +17,8 @@ android:allowBackup="false" android:icon="@mipmap/ic_launcher" android:label="@string/label" - android:resizeableActivity="false" android:requestLegacyExternalStorage="true" + android:resizeableActivity="false" tools:ignore="UnusedAttribute"> - - +Copyright (C) 2014-2020 ubulem, Bektur Mambetov + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +package net.minetest.minetest; + +import android.content.Context; +import android.view.KeyEvent; +import android.view.inputmethod.InputMethodManager; + +import androidx.appcompat.widget.AppCompatEditText; + +import java.util.Objects; + +public class CustomEditText extends AppCompatEditText { + public CustomEditText(Context context) { + super(context); + } + + @Override + public boolean onKeyPreIme(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + InputMethodManager mgr = (InputMethodManager) + getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + Objects.requireNonNull(mgr).hideSoftInputFromWindow(this.getWindowToken(), 0); + } + return false; + } +} diff --git a/build/android/app/src/main/java/net/minetest/minetest/GameActivity.java b/build/android/app/src/main/java/net/minetest/minetest/GameActivity.java index 635512569..db126a2b9 100644 --- a/build/android/app/src/main/java/net/minetest/minetest/GameActivity.java +++ b/build/android/app/src/main/java/net/minetest/minetest/GameActivity.java @@ -25,8 +25,16 @@ import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.text.InputType; +import android.view.KeyEvent; import android.view.View; import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; + +import androidx.appcompat.app.AlertDialog; + +import java.util.Objects; public class GameActivity extends NativeActivity { static { @@ -34,8 +42,8 @@ public class GameActivity extends NativeActivity { System.loadLibrary("Minetest"); } - private int messageReturnCode; - private String messageReturnValue; + private int messageReturnCode = -1; + private String messageReturnValue = ""; public static native void putMessageBoxResult(String text); @@ -43,8 +51,6 @@ public class GameActivity extends NativeActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - messageReturnCode = -1; - messageReturnValue = ""; } private void makeFullScreen() { @@ -73,29 +79,46 @@ public class GameActivity extends NativeActivity { // Ignore the back press so Minetest can handle it } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == 101) { - if (resultCode == RESULT_OK) { - String text = data.getStringExtra("text"); - messageReturnCode = 0; - messageReturnValue = text; - } else - messageReturnCode = 1; - } + public void showDialog(String acceptButton, String hint, String current, int editType) { + runOnUiThread(() -> showDialogUI(hint, current, editType)); } - public void showDialog(String acceptButton, String hint, String current, int editType) { - Intent intent = new Intent(this, InputDialogActivity.class); - Bundle params = new Bundle(); - params.putString("acceptButton", acceptButton); - params.putString("hint", hint); - params.putString("current", current); - params.putInt("editType", editType); - intent.putExtras(params); - startActivityForResult(intent, 101); - messageReturnValue = ""; - messageReturnCode = -1; + private void showDialogUI(String hint, String current, int editType) { + final AlertDialog.Builder builder = new AlertDialog.Builder(this); + EditText editText = new CustomEditText(this); + builder.setView(editText); + AlertDialog alertDialog = builder.create(); + editText.requestFocus(); + editText.setHint(hint); + editText.setText(current); + final InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + Objects.requireNonNull(imm).toggleSoftInput(InputMethodManager.SHOW_FORCED, + InputMethodManager.HIDE_IMPLICIT_ONLY); + if (editType == 1) + editText.setInputType(InputType.TYPE_CLASS_TEXT | + InputType.TYPE_TEXT_FLAG_MULTI_LINE); + else if (editType == 3) + editText.setInputType(InputType.TYPE_CLASS_TEXT | + InputType.TYPE_TEXT_VARIATION_PASSWORD); + else + editText.setInputType(InputType.TYPE_CLASS_TEXT); + editText.setSelection(editText.getText().length()); + editText.setOnKeyListener((view, KeyCode, event) -> { + if (KeyCode == KeyEvent.KEYCODE_ENTER) { + imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); + messageReturnCode = 0; + messageReturnValue = editText.getText().toString(); + alertDialog.dismiss(); + return true; + } + return false; + }); + alertDialog.show(); + alertDialog.setOnCancelListener(dialog -> { + getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); + messageReturnValue = current; + messageReturnCode = -1; + }); } public int getDialogState() { diff --git a/build/android/app/src/main/java/net/minetest/minetest/InputDialogActivity.java b/build/android/app/src/main/java/net/minetest/minetest/InputDialogActivity.java deleted file mode 100644 index 7c6aa111d..000000000 --- a/build/android/app/src/main/java/net/minetest/minetest/InputDialogActivity.java +++ /dev/null @@ -1,98 +0,0 @@ -/* -Minetest -Copyright (C) 2014-2020 MoNTE48, Maksim Gamarnik -Copyright (C) 2014-2020 ubulem, Bektur Mambetov - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -package net.minetest.minetest; - -import android.app.Activity; -import android.content.Intent; -import android.os.Build; -import android.os.Bundle; -import android.text.InputType; -import android.view.KeyEvent; -import android.view.View; -import android.view.inputmethod.InputMethodManager; -import android.widget.EditText; - -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; - -import java.util.Objects; - -public class InputDialogActivity extends AppCompatActivity { - private AlertDialog alertDialog; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - Bundle b = getIntent().getExtras(); - int editType = Objects.requireNonNull(b).getInt("editType"); - String hint = b.getString("hint"); - String current = b.getString("current"); - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - EditText editText = new EditText(this); - builder.setView(editText); - editText.requestFocus(); - editText.setHint(hint); - editText.setText(current); - final InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); - Objects.requireNonNull(imm).toggleSoftInput(InputMethodManager.SHOW_FORCED, - InputMethodManager.HIDE_IMPLICIT_ONLY); - if (editType == 3) - editText.setInputType(InputType.TYPE_CLASS_TEXT | - InputType.TYPE_TEXT_VARIATION_PASSWORD); - else - editText.setInputType(InputType.TYPE_CLASS_TEXT); - editText.setOnKeyListener((view, KeyCode, event) -> { - if (KeyCode == KeyEvent.KEYCODE_ENTER) { - imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); - pushResult(editText.getText().toString()); - return true; - } - return false; - }); - alertDialog = builder.create(); - if (!this.isFinishing()) - alertDialog.show(); - alertDialog.setOnCancelListener(dialog -> { - pushResult(editText.getText().toString()); - setResult(Activity.RESULT_CANCELED); - alertDialog.dismiss(); - makeFullScreen(); - finish(); - }); - } - - private void pushResult(String text) { - Intent resultData = new Intent(); - resultData.putExtra("text", text); - setResult(AppCompatActivity.RESULT_OK, resultData); - alertDialog.dismiss(); - makeFullScreen(); - finish(); - } - - private void makeFullScreen() { - if (Build.VERSION.SDK_INT >= 19) - this.getWindow().getDecorView().setSystemUiVisibility( - View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | - View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | - View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); - } -} diff --git a/build/android/app/src/main/res/values/styles.xml b/build/android/app/src/main/res/values/styles.xml index 618507e63..291a4eaf1 100644 --- a/build/android/app/src/main/res/values/styles.xml +++ b/build/android/app/src/main/res/values/styles.xml @@ -8,15 +8,8 @@ shortEdges - - - From d3e327a853d0cbe339e7e76d0c29c1c941644de0 Mon Sep 17 00:00:00 2001 From: LoneWolfHT Date: Tue, 29 Sep 2020 10:39:36 -0700 Subject: [PATCH 079/177] Update wording of game descriptions in installer (#10441) --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fec9709d4..31f548be7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -249,15 +249,15 @@ cpack_add_component(Docs cpack_add_component(SUBGAME_MINETEST_GAME DISPLAY_NAME "Minetest Game" - DESCRIPTION "The official subgame for the Minetest engine, that can easily extended by mods." - GROUP "Subgames" + DESCRIPTION "The default game bundled in the Minetest engine. Mainly used as a modding base." + GROUP "Games" ) cpack_add_component(SUBGAME_MINIMAL DISPLAY_NAME "Development Test" - DESCRIPTION "A minimal test game helping to develop the engine." + DESCRIPTION "A basic testing environment used for engine development and sometimes for testing mods." DISABLED #DISABLED does not mean it is disabled, and is just not selected by default. - GROUP "Subgames" + GROUP "Games" ) cpack_add_component_group(Subgames From 995d4052610b98821e1dcaf5031477de6f202bef Mon Sep 17 00:00:00 2001 From: "k.h.lai" Date: Wed, 30 Sep 2020 01:39:53 +0800 Subject: [PATCH 080/177] Improve MSVC cmake and update vcpkg instruction (#10407) Remove unnecessary compiler flag for clang-cl Update vcpkg instruction in README.md --- README.md | 5 +++-- src/CMakeLists.txt | 26 ++++++++++++++++---------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 6a3c11f40..a06c3e257 100644 --- a/README.md +++ b/README.md @@ -314,13 +314,14 @@ It is highly recommended to use vcpkg as package manager. After you successfully built vcpkg you can easily install the required libraries: ```powershell -vcpkg install irrlicht zlib curl[winssl] openal-soft libvorbis libogg sqlite3 freetype luajit --triplet x64-windows +vcpkg install irrlicht zlib curl[winssl] openal-soft libvorbis libogg sqlite3 freetype luajit gmp jsoncpp --triplet x64-windows ``` - `curl` is optional, but required to read the serverlist, `curl[winssl]` is required to use the content store. - `openal-soft`, `libvorbis` and `libogg` are optional, but required to use sound. - `freetype` is optional, it allows true-type font rendering. - `luajit` is optional, it replaces the integrated Lua interpreter with a faster just-in-time interpreter. +- `gmp` and `jsoncpp` are optional, otherwise the bundled versions will be compiled There are other optional libraries, but they are not tested if they can build and link correctly. @@ -353,7 +354,7 @@ This is outdated and not recommended. Follow the instructions on https://dev.min Run the following script in PowerShell: ```powershell -cmake . -G"Visual Studio 15 2017 Win64" -DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_GETTEXT=0 -DENABLE_CURSES=0 +cmake . -G"Visual Studio 15 2017 Win64" -DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_GETTEXT=OFF -DENABLE_CURSES=OFF -DENABLE_SYSTEM_JSONCPP=ON cmake --build . --config Release ``` Make sure that the right compiler is selected and the path to the vcpkg toolchain is correct. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7e1d0bd39..b5d4fae0e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -701,21 +701,14 @@ include(CheckCSourceCompiles) if(MSVC) # Visual Studio - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D WIN32_LEAN_AND_MEAN /MP") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D WIN32_LEAN_AND_MEAN") # EHa enables SEH exceptions (used for catching segfaults) - set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /GL /FD /MD /GS- /Zi /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP") + set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /MD /GS- /Zi /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0") if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /arch:SSE") endif() - - if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF") - else() - set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF") - endif() - - set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1") @@ -726,6 +719,19 @@ if(MSVC) # Flags for C files (sqlite) # /MD = dynamically link to MSVCRxxx.dll set(CMAKE_C_FLAGS_RELEASE "/O2 /Ob2 /MD") + + # Flags that cannot be shared between cl and clang-cl + # https://clang.llvm.org/docs/UsersManual.html#clang-cl + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=lld") + + # Disable pragma-pack warning + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wno-pragma-pack") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /TP /FD /GL") + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG") + endif() else() # GCC or compatible compilers such as Clang set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") From a69bc67ce26348198a29997d076df3a852a3447e Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 29 Sep 2020 23:37:03 +0100 Subject: [PATCH 081/177] Improve layout of main menu 'local' tab (#10366) --- builtin/mainmenu/tab_local.lua | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/builtin/mainmenu/tab_local.lua b/builtin/mainmenu/tab_local.lua index a21cf12b1..1aee246fc 100644 --- a/builtin/mainmenu/tab_local.lua +++ b/builtin/mainmenu/tab_local.lua @@ -114,45 +114,44 @@ local function get_formspec(tabview, name, tabdata) ) retval = retval .. - "button[4,3.95;2.6,1;world_delete;".. fgettext("Delete") .. "]" .. - "button[6.5,3.95;2.8,1;world_configure;".. fgettext("Configure") .. "]" .. - "button[9.2,3.95;2.5,1;world_create;".. fgettext("New") .. "]" .. - "label[4,-0.25;".. fgettext("Select World:") .. "]".. - "checkbox[0.25,0.25;cb_creative_mode;".. fgettext("Creative Mode") .. ";" .. + "button[3.9,3.8;2.8,1;world_delete;".. fgettext("Delete") .. "]" .. + "button[6.55,3.8;2.8,1;world_configure;".. fgettext("Configure") .. "]" .. + "button[9.2,3.8;2.8,1;world_create;".. fgettext("New") .. "]" .. + "label[3.9,-0.05;".. fgettext("Select World:") .. "]".. + "checkbox[0,-0.20;cb_creative_mode;".. fgettext("Creative Mode") .. ";" .. dump(core.settings:get_bool("creative_mode")) .. "]".. - "checkbox[0.25,0.7;cb_enable_damage;".. fgettext("Enable Damage") .. ";" .. + "checkbox[0,0.25;cb_enable_damage;".. fgettext("Enable Damage") .. ";" .. dump(core.settings:get_bool("enable_damage")) .. "]".. - "checkbox[0.25,1.15;cb_server;".. fgettext("Host Server") ..";" .. + "checkbox[0,0.7;cb_server;".. fgettext("Host Server") ..";" .. dump(core.settings:get_bool("enable_server")) .. "]" .. - "textlist[4,0.25;7.5,3.7;sp_worlds;" .. + "textlist[3.9,0.4;7.9,3.45;sp_worlds;" .. menu_render_worldlist() .. ";" .. index .. "]" if core.settings:get_bool("enable_server") then retval = retval .. - "button[8.5,4.8;3.2,1;play;".. fgettext("Host Game") .. "]" .. - "checkbox[0.25,1.6;cb_server_announce;" .. fgettext("Announce Server") .. ";" .. + "button[7.9,4.75;4.1,1;play;".. fgettext("Host Game") .. "]" .. + "checkbox[0,1.15;cb_server_announce;" .. fgettext("Announce Server") .. ";" .. dump(core.settings:get_bool("server_announce")) .. "]" .. - "label[0.25,2.2;" .. fgettext("Name/Password") .. "]" .. - "field[0.55,3.2;3.5,0.5;te_playername;;" .. + "field[0.3,2.85;3.8,0.5;te_playername;" .. fgettext("Name") .. ";" .. core.formspec_escape(core.settings:get("name")) .. "]" .. - "pwdfield[0.55,4;3.5,0.5;te_passwd;]" + "pwdfield[0.3,4.05;3.8,0.5;te_passwd;" .. fgettext("Password") .. "]" local bind_addr = core.settings:get("bind_address") if bind_addr ~= nil and bind_addr ~= "" then retval = retval .. - "field[0.55,5.2;2.25,0.5;te_serveraddr;" .. fgettext("Bind Address") .. ";" .. + "field[0.3,5.25;2.5,0.5;te_serveraddr;" .. fgettext("Bind Address") .. ";" .. core.formspec_escape(core.settings:get("bind_address")) .. "]" .. - "field[2.8,5.2;1.25,0.5;te_serverport;" .. fgettext("Port") .. ";" .. + "field[2.85,5.25;1.25,0.5;te_serverport;" .. fgettext("Port") .. ";" .. core.formspec_escape(core.settings:get("port")) .. "]" else retval = retval .. - "field[0.55,5.2;3.5,0.5;te_serverport;" .. fgettext("Server Port") .. ";" .. + "field[0.3,5.25;3.8,0.5;te_serverport;" .. fgettext("Server Port") .. ";" .. core.formspec_escape(core.settings:get("port")) .. "]" end else retval = retval .. - "button[8.5,4.8;3.2,1;play;".. fgettext("Play Game") .. "]" + "button[7.9,4.75;4.1,1;play;" .. fgettext("Play Game") .. "]" end return retval From 79414aa3e5591fdaffa0956a08610a2228042941 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 20 Sep 2020 12:52:35 +0200 Subject: [PATCH 082/177] Settings: Remove unused functions Make Settings-internal functions private --- src/settings.cpp | 87 +++++------------------------------------------- src/settings.h | 49 ++++++++++++++------------- 2 files changed, 33 insertions(+), 103 deletions(-) diff --git a/src/settings.cpp b/src/settings.cpp index 28b72c4e3..56ab9e12b 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -45,7 +45,13 @@ Settings::~Settings() Settings & Settings::operator += (const Settings &other) { - update(other); + if (&other == this) + return *this; + + MutexAutoLock lock(m_mutex); + MutexAutoLock lock2(other.m_mutex); + + updateNoLock(other); return *this; } @@ -512,25 +518,6 @@ u32 Settings::getFlagStr(const std::string &name, const FlagDesc *flagdesc, return flags; } -// N.B. if getStruct() is used to read a non-POD aggregate type, -// the behavior is undefined. -bool Settings::getStruct(const std::string &name, const std::string &format, - void *out, size_t olen) const -{ - std::string valstr; - - try { - valstr = get(name); - } catch (SettingNotFoundException &e) { - return false; - } - - if (!deSerializeStringToStruct(valstr, format, out, olen)) - return false; - - return true; -} - bool Settings::getNoiseParams(const std::string &name, NoiseParams &np) const { @@ -546,6 +533,7 @@ bool Settings::getNoiseParamsFromValue(const std::string &name, if (!getNoEx(name, value)) return false; + // Format: f32,f32,(f32,f32,f32),s32,s32,f32[,f32] Strfnd f(value); np.offset = stof(f.next(",")); @@ -615,28 +603,6 @@ std::vector Settings::getNames() const * Getters that don't throw exceptions * ***************************************/ -bool Settings::getEntryNoEx(const std::string &name, SettingsEntry &val) const -{ - try { - val = getEntry(name); - return true; - } catch (SettingNotFoundException &e) { - return false; - } -} - - -bool Settings::getEntryDefaultNoEx(const std::string &name, SettingsEntry &val) const -{ - try { - val = getEntryDefault(name); - return true; - } catch (SettingNotFoundException &e) { - return false; - } -} - - bool Settings::getGroupNoEx(const std::string &name, Settings *&val) const { try { @@ -908,17 +874,6 @@ bool Settings::setFlagStr(const std::string &name, u32 flags, } -bool Settings::setStruct(const std::string &name, const std::string &format, - void *value) -{ - std::string structstr; - if (!serializeStructToString(&structstr, format, value)) - return false; - - return set(name, structstr); -} - - bool Settings::setNoiseParams(const std::string &name, const NoiseParams &np, bool set_default) { @@ -969,32 +924,6 @@ void Settings::clearDefaults() clearDefaultsNoLock(); } -void Settings::updateValue(const Settings &other, const std::string &name) -{ - if (&other == this) - return; - - MutexAutoLock lock(m_mutex); - - try { - m_settings[name] = other.get(name); - } catch (SettingNotFoundException &e) { - } -} - - -void Settings::update(const Settings &other) -{ - if (&other == this) - return; - - MutexAutoLock lock(m_mutex); - MutexAutoLock lock2(other.m_mutex); - - updateNoLock(other); -} - - SettingsParseEvent Settings::parseConfigObject(const std::string &line, const std::string &end, std::string &name, std::string &value) { diff --git a/src/settings.h b/src/settings.h index ccc252049..7db5539b2 100644 --- a/src/settings.h +++ b/src/settings.h @@ -113,23 +113,10 @@ public: bool parseConfigLines(std::istream &is, const std::string &end = ""); void writeLines(std::ostream &os, u32 tab_depth=0) const; - SettingsParseEvent parseConfigObject(const std::string &line, - const std::string &end, std::string &name, std::string &value); - bool updateConfigObject(std::istream &is, std::ostream &os, - const std::string &end, u32 tab_depth=0); - - static bool checkNameValid(const std::string &name); - static bool checkValueValid(const std::string &value); - static std::string getMultiline(std::istream &is, size_t *num_lines=NULL); - static void printEntry(std::ostream &os, const std::string &name, - const SettingsEntry &entry, u32 tab_depth=0); - /*********** * Getters * ***********/ - const SettingsEntry &getEntry(const std::string &name) const; - const SettingsEntry &getEntryDefault(const std::string &name) const; Settings *getGroup(const std::string &name) const; const std::string &get(const std::string &name) const; const std::string &getDefault(const std::string &name) const; @@ -144,10 +131,6 @@ public: v3f getV3F(const std::string &name) const; u32 getFlagStr(const std::string &name, const FlagDesc *flagdesc, u32 *flagmask) const; - // N.B. if getStruct() is used to read a non-POD aggregate type, - // the behavior is undefined. - bool getStruct(const std::string &name, const std::string &format, - void *out, size_t olen) const; bool getNoiseParams(const std::string &name, NoiseParams &np) const; bool getNoiseParamsFromValue(const std::string &name, NoiseParams &np) const; bool getNoiseParamsFromGroup(const std::string &name, NoiseParams &np) const; @@ -161,8 +144,6 @@ public: * Getters that don't throw exceptions * ***************************************/ - bool getEntryNoEx(const std::string &name, SettingsEntry &val) const; - bool getEntryDefaultNoEx(const std::string &name, SettingsEntry &val) const; bool getGroupNoEx(const std::string &name, Settings *&val) const; bool getNoEx(const std::string &name, std::string &val) const; bool getDefaultNoEx(const std::string &name, std::string &val) const; @@ -206,16 +187,11 @@ public: const FlagDesc *flagdesc = nullptr, u32 flagmask = U32_MAX); bool setNoiseParams(const std::string &name, const NoiseParams &np, bool set_default=false); - // N.B. if setStruct() is used to write a non-POD aggregate type, - // the behavior is undefined. - bool setStruct(const std::string &name, const std::string &format, void *value); // remove a setting bool remove(const std::string &name); void clear(); void clearDefaults(); - void updateValue(const Settings &other, const std::string &name); - void update(const Settings &other); /************** * Miscellany * @@ -232,6 +208,31 @@ public: SettingsChangedCallback cbf, void *userdata = NULL); private: + /*********************** + * Reading and writing * + ***********************/ + + SettingsParseEvent parseConfigObject(const std::string &line, + const std::string &end, std::string &name, std::string &value); + bool updateConfigObject(std::istream &is, std::ostream &os, + const std::string &end, u32 tab_depth=0); + + static bool checkNameValid(const std::string &name); + static bool checkValueValid(const std::string &value); + static std::string getMultiline(std::istream &is, size_t *num_lines=NULL); + static void printEntry(std::ostream &os, const std::string &name, + const SettingsEntry &entry, u32 tab_depth=0); + + /*********** + * Getters * + ***********/ + + const SettingsEntry &getEntry(const std::string &name) const; + const SettingsEntry &getEntryDefault(const std::string &name) const; + + // Allow TestSettings to run sanity checks using private functions. + friend class TestSettings; + void updateNoLock(const Settings &other); void clearNoLock(); void clearDefaultsNoLock(); From ca5c2dbefab3676514e48b445b36de50993de9f1 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 20 Sep 2020 13:04:01 +0200 Subject: [PATCH 083/177] Clean up serialization This reverts 1a5b4b3 and further functions in serialize.cpp that are unused The intend for a sane NetworkPacket/stream replacement was good, but a wrapper class around i/ostream might be more versatile than introducing a new vector-based serialization class. --- src/unittest/test_serialization.cpp | 324 -------------------------- src/util/serialize.cpp | 349 ---------------------------- src/util/serialize.h | 242 ------------------- 3 files changed, 915 deletions(-) diff --git a/src/unittest/test_serialization.cpp b/src/unittest/test_serialization.cpp index 51e28f144..d72bf0d4c 100644 --- a/src/unittest/test_serialization.cpp +++ b/src/unittest/test_serialization.cpp @@ -32,18 +32,12 @@ public: void buildTestStrings(); void testSerializeString(); - void testSerializeWideString(); void testSerializeLongString(); void testSerializeJsonString(); - void testSerializeHex(); void testDeSerializeString(); - void testDeSerializeWideString(); void testDeSerializeLongString(); void testStreamRead(); void testStreamWrite(); - void testVecPut(); - void testStringLengthLimits(); - void testBufReader(); void testFloatFormat(); std::string teststring2; @@ -61,17 +55,11 @@ void TestSerialization::runTests(IGameDef *gamedef) TEST(testSerializeString); TEST(testDeSerializeString); - TEST(testSerializeWideString); - TEST(testDeSerializeWideString); TEST(testSerializeLongString); TEST(testDeSerializeLongString); TEST(testSerializeJsonString); - TEST(testSerializeHex); TEST(testStreamRead); TEST(testStreamWrite); - TEST(testVecPut); - TEST(testStringLengthLimits); - TEST(testBufReader); TEST(testFloatFormat); } @@ -136,50 +124,6 @@ void TestSerialization::testDeSerializeString() } } -void TestSerialization::testSerializeWideString() -{ - // Test blank string - UASSERT(serializeWideString(L"") == mkstr("\0\0")); - - // Test basic string - UASSERT(serializeWideString(utf8_to_wide("Hello world!")) == - mkstr("\0\14\0H\0e\0l\0l\0o\0 \0w\0o\0r\0l\0d\0!")); - - // Test character range - UASSERT(serializeWideString(teststring2_w) == - mkstr("\1\0") + teststring2_w_encoded); -} - -void TestSerialization::testDeSerializeWideString() -{ - // Test deserialize - { - std::istringstream is(serializeWideString(teststring2_w), std::ios::binary); - UASSERT(deSerializeWideString(is) == teststring2_w); - UASSERT(!is.eof()); - is.get(); - UASSERT(is.eof()); - } - - // Test deserialize an incomplete length specifier - { - std::istringstream is(mkstr("\x53"), std::ios::binary); - EXCEPTION_CHECK(SerializationError, deSerializeWideString(is)); - } - - // Test deserialize a string with an incomplete character - { - std::istringstream is(mkstr("\x00\x07\0a\0b\0c\0d\0e\0f\0"), std::ios::binary); - EXCEPTION_CHECK(SerializationError, deSerializeWideString(is)); - } - - // Test deserialize a string with incomplete data - { - std::istringstream is(mkstr("\x00\x08\0a\0b\0c\0d\0e\0f"), std::ios::binary); - EXCEPTION_CHECK(SerializationError, deSerializeWideString(is)); - } -} - void TestSerialization::testSerializeLongString() { // Test blank string @@ -268,25 +212,6 @@ void TestSerialization::testSerializeJsonString() UASSERT(is.eof()); } -void TestSerialization::testSerializeHex() -{ - // Test blank string - UASSERT(serializeHexString("") == ""); - UASSERT(serializeHexString("", true) == ""); - - // Test basic string - UASSERT(serializeHexString("Hello world!") == - "48656c6c6f20776f726c6421"); - UASSERT(serializeHexString("Hello world!", true) == - "48 65 6c 6c 6f 20 77 6f 72 6c 64 21"); - - // Test binary string - UASSERT(serializeHexString(mkstr("\x00\x0a\xb0\x63\x1f\x00\xff")) == - "000ab0631f00ff"); - UASSERT(serializeHexString(mkstr("\x00\x0a\xb0\x63\x1f\x00\xff"), true) == - "00 0a b0 63 1f 00 ff"); -} - void TestSerialization::testStreamRead() { @@ -376,255 +301,6 @@ void TestSerialization::testStreamWrite() } -void TestSerialization::testVecPut() -{ - std::vector buf; - - putU8(&buf, 0x11); - putU16(&buf, 0x2233); - putU32(&buf, 0x44556677); - putU64(&buf, 0x8899AABBCCDDEEFFLL); - - putS8(&buf, -128); - putS16(&buf, 30000); - putS32(&buf, -6); - putS64(&buf, -43); - - putF1000(&buf, 53.53467f); - putF1000(&buf, -300000.32f); - putF1000(&buf, F1000_MIN); - putF1000(&buf, F1000_MAX); - - putString(&buf, "foobar!"); - - putV2S16(&buf, v2s16(500, 500)); - putV3S16(&buf, v3s16(4207, 604, -30)); - putV2S32(&buf, v2s32(1920, 1080)); - putV3S32(&buf, v3s32(-400, 6400054, 290549855)); - - putWideString(&buf, L"\x02~woof~\x5455"); - - putV3F1000(&buf, v3f(500, 10024.2f, -192.54f)); - putARGB8(&buf, video::SColor(255, 128, 50, 128)); - - putLongString(&buf, "some longer string here"); - - putU16(&buf, 0xF00D); - - UASSERT(buf.size() == sizeof(test_serialized_data)); - UASSERT(!memcmp(&buf[0], test_serialized_data, sizeof(test_serialized_data))); -} - - -void TestSerialization::testStringLengthLimits() -{ - std::vector buf; - std::string too_long(STRING_MAX_LEN + 1, 'A'); - std::string way_too_large(LONG_STRING_MAX_LEN + 1, 'B'); - std::wstring too_long_wide(WIDE_STRING_MAX_LEN + 1, L'C'); - - EXCEPTION_CHECK(SerializationError, putString(&buf, too_long)); - - putLongString(&buf, too_long); - too_long.resize(too_long.size() - 1); - putString(&buf, too_long); - - EXCEPTION_CHECK(SerializationError, putWideString(&buf, too_long_wide)); - too_long_wide.resize(too_long_wide.size() - 1); - putWideString(&buf, too_long_wide); -} - - -void TestSerialization::testBufReader() -{ - u8 u8_data; - u16 u16_data; - u32 u32_data; - u64 u64_data; - s8 s8_data; - s16 s16_data; - s32 s32_data; - s64 s64_data; - f32 f32_data, f32_data2, f32_data3, f32_data4; - video::SColor scolor_data; - v2s16 v2s16_data; - v3s16 v3s16_data; - v2s32 v2s32_data; - v3s32 v3s32_data; - v3f v3f_data; - std::string string_data; - std::wstring widestring_data; - std::string longstring_data; - u8 raw_data[10] = {0}; - - BufReader buf(test_serialized_data, sizeof(test_serialized_data)); - - // Try reading data like normal - UASSERT(buf.getU8() == 0x11); - UASSERT(buf.getU16() == 0x2233); - UASSERT(buf.getU32() == 0x44556677); - UASSERT(buf.getU64() == 0x8899AABBCCDDEEFFLL); - UASSERT(buf.getS8() == -128); - UASSERT(buf.getS16() == 30000); - UASSERT(buf.getS32() == -6); - UASSERT(buf.getS64() == -43); - UASSERT(buf.getF1000() == 53.534f); - UASSERT(buf.getF1000() == -300000.32f); - UASSERT(buf.getF1000() == F1000_MIN); - UASSERT(buf.getF1000() == F1000_MAX); - UASSERT(buf.getString() == "foobar!"); - UASSERT(buf.getV2S16() == v2s16(500, 500)); - UASSERT(buf.getV3S16() == v3s16(4207, 604, -30)); - UASSERT(buf.getV2S32() == v2s32(1920, 1080)); - UASSERT(buf.getV3S32() == v3s32(-400, 6400054, 290549855)); - UASSERT(buf.getWideString() == L"\x02~woof~\x5455"); - UASSERT(buf.getV3F1000() == v3f(500, 10024.2f, -192.54f)); - UASSERT(buf.getARGB8() == video::SColor(255, 128, 50, 128)); - UASSERT(buf.getLongString() == "some longer string here"); - - // Verify the offset and data is unchanged after a failed read - size_t orig_pos = buf.pos; - u32_data = 0; - UASSERT(buf.getU32NoEx(&u32_data) == false); - UASSERT(buf.pos == orig_pos); - UASSERT(u32_data == 0); - - // Now try the same for a failed string read - UASSERT(buf.getStringNoEx(&string_data) == false); - UASSERT(buf.pos == orig_pos); - UASSERT(string_data == ""); - - // Now try the same for a failed string read - UASSERT(buf.getWideStringNoEx(&widestring_data) == false); - UASSERT(buf.pos == orig_pos); - UASSERT(widestring_data == L""); - - UASSERT(buf.getU16() == 0xF00D); - - UASSERT(buf.remaining() == 0); - - // Check to make sure these each blow exceptions as they're supposed to - EXCEPTION_CHECK(SerializationError, buf.getU8()); - EXCEPTION_CHECK(SerializationError, buf.getU16()); - EXCEPTION_CHECK(SerializationError, buf.getU32()); - EXCEPTION_CHECK(SerializationError, buf.getU64()); - - EXCEPTION_CHECK(SerializationError, buf.getS8()); - EXCEPTION_CHECK(SerializationError, buf.getS16()); - EXCEPTION_CHECK(SerializationError, buf.getS32()); - EXCEPTION_CHECK(SerializationError, buf.getS64()); - - EXCEPTION_CHECK(SerializationError, buf.getF1000()); - EXCEPTION_CHECK(SerializationError, buf.getARGB8()); - - EXCEPTION_CHECK(SerializationError, buf.getV2S16()); - EXCEPTION_CHECK(SerializationError, buf.getV3S16()); - EXCEPTION_CHECK(SerializationError, buf.getV2S32()); - EXCEPTION_CHECK(SerializationError, buf.getV3S32()); - EXCEPTION_CHECK(SerializationError, buf.getV3F1000()); - - EXCEPTION_CHECK(SerializationError, buf.getString()); - EXCEPTION_CHECK(SerializationError, buf.getWideString()); - EXCEPTION_CHECK(SerializationError, buf.getLongString()); - EXCEPTION_CHECK(SerializationError, - buf.getRawData(raw_data, sizeof(raw_data))); - - // See if we can skip backwards - buf.pos = 5; - UASSERT(buf.getRawDataNoEx(raw_data, 3) == true); - UASSERT(raw_data[0] == 0x66); - UASSERT(raw_data[1] == 0x77); - UASSERT(raw_data[2] == 0x88); - - UASSERT(buf.getU32() == 0x99AABBCC); - UASSERT(buf.pos == 12); - - // Now let's try it all over again using the NoEx variants - buf.pos = 0; - - UASSERT(buf.getU8NoEx(&u8_data)); - UASSERT(buf.getU16NoEx(&u16_data)); - UASSERT(buf.getU32NoEx(&u32_data)); - UASSERT(buf.getU64NoEx(&u64_data)); - - UASSERT(buf.getS8NoEx(&s8_data)); - UASSERT(buf.getS16NoEx(&s16_data)); - UASSERT(buf.getS32NoEx(&s32_data)); - UASSERT(buf.getS64NoEx(&s64_data)); - - UASSERT(buf.getF1000NoEx(&f32_data)); - UASSERT(buf.getF1000NoEx(&f32_data2)); - UASSERT(buf.getF1000NoEx(&f32_data3)); - UASSERT(buf.getF1000NoEx(&f32_data4)); - - UASSERT(buf.getStringNoEx(&string_data)); - UASSERT(buf.getV2S16NoEx(&v2s16_data)); - UASSERT(buf.getV3S16NoEx(&v3s16_data)); - UASSERT(buf.getV2S32NoEx(&v2s32_data)); - UASSERT(buf.getV3S32NoEx(&v3s32_data)); - UASSERT(buf.getWideStringNoEx(&widestring_data)); - UASSERT(buf.getV3F1000NoEx(&v3f_data)); - UASSERT(buf.getARGB8NoEx(&scolor_data)); - - UASSERT(buf.getLongStringNoEx(&longstring_data)); - - // and make sure we got the correct data - UASSERT(u8_data == 0x11); - UASSERT(u16_data == 0x2233); - UASSERT(u32_data == 0x44556677); - UASSERT(u64_data == 0x8899AABBCCDDEEFFLL); - UASSERT(s8_data == -128); - UASSERT(s16_data == 30000); - UASSERT(s32_data == -6); - UASSERT(s64_data == -43); - UASSERT(f32_data == 53.534f); - UASSERT(f32_data2 == -300000.32f); - UASSERT(f32_data3 == F1000_MIN); - UASSERT(f32_data4 == F1000_MAX); - UASSERT(string_data == "foobar!"); - UASSERT(v2s16_data == v2s16(500, 500)); - UASSERT(v3s16_data == v3s16(4207, 604, -30)); - UASSERT(v2s32_data == v2s32(1920, 1080)); - UASSERT(v3s32_data == v3s32(-400, 6400054, 290549855)); - UASSERT(widestring_data == L"\x02~woof~\x5455"); - UASSERT(v3f_data == v3f(500, 10024.2f, -192.54f)); - UASSERT(scolor_data == video::SColor(255, 128, 50, 128)); - UASSERT(longstring_data == "some longer string here"); - - UASSERT(buf.remaining() == 2); - UASSERT(buf.getRawDataNoEx(raw_data, 3) == false); - UASSERT(buf.remaining() == 2); - UASSERT(buf.getRawDataNoEx(raw_data, 2) == true); - UASSERT(raw_data[0] == 0xF0); - UASSERT(raw_data[1] == 0x0D); - UASSERT(buf.remaining() == 0); - - // Make sure no more available data causes a failure - UASSERT(!buf.getU8NoEx(&u8_data)); - UASSERT(!buf.getU16NoEx(&u16_data)); - UASSERT(!buf.getU32NoEx(&u32_data)); - UASSERT(!buf.getU64NoEx(&u64_data)); - - UASSERT(!buf.getS8NoEx(&s8_data)); - UASSERT(!buf.getS16NoEx(&s16_data)); - UASSERT(!buf.getS32NoEx(&s32_data)); - UASSERT(!buf.getS64NoEx(&s64_data)); - - UASSERT(!buf.getF1000NoEx(&f32_data)); - UASSERT(!buf.getARGB8NoEx(&scolor_data)); - - UASSERT(!buf.getV2S16NoEx(&v2s16_data)); - UASSERT(!buf.getV3S16NoEx(&v3s16_data)); - UASSERT(!buf.getV2S32NoEx(&v2s32_data)); - UASSERT(!buf.getV3S32NoEx(&v3s32_data)); - UASSERT(!buf.getV3F1000NoEx(&v3f_data)); - - UASSERT(!buf.getStringNoEx(&string_data)); - UASSERT(!buf.getWideStringNoEx(&widestring_data)); - UASSERT(!buf.getLongStringNoEx(&longstring_data)); - UASSERT(!buf.getRawDataNoEx(raw_data, sizeof(raw_data))); -} - void TestSerialization::testFloatFormat() { FloatType type = getFloatSerializationType(); diff --git a/src/util/serialize.cpp b/src/util/serialize.cpp index 5b276668d..fd5cbda21 100644 --- a/src/util/serialize.cpp +++ b/src/util/serialize.cpp @@ -30,74 +30,6 @@ with this program; if not, write to the Free Software Foundation, Inc., FloatType g_serialize_f32_type = FLOATTYPE_UNKNOWN; -//// -//// BufReader -//// - -bool BufReader::getStringNoEx(std::string *val) -{ - u16 num_chars; - if (!getU16NoEx(&num_chars)) - return false; - - if (pos + num_chars > size) { - pos -= sizeof(num_chars); - return false; - } - - val->assign((const char *)data + pos, num_chars); - pos += num_chars; - - return true; -} - -bool BufReader::getWideStringNoEx(std::wstring *val) -{ - u16 num_chars; - if (!getU16NoEx(&num_chars)) - return false; - - if (pos + num_chars * 2 > size) { - pos -= sizeof(num_chars); - return false; - } - - for (size_t i = 0; i != num_chars; i++) { - val->push_back(readU16(data + pos)); - pos += 2; - } - - return true; -} - -bool BufReader::getLongStringNoEx(std::string *val) -{ - u32 num_chars; - if (!getU32NoEx(&num_chars)) - return false; - - if (pos + num_chars > size) { - pos -= sizeof(num_chars); - return false; - } - - val->assign((const char *)data + pos, num_chars); - pos += num_chars; - - return true; -} - -bool BufReader::getRawDataNoEx(void *val, size_t len) -{ - if (pos + len > size) - return false; - - memcpy(val, data + pos, len); - pos += len; - - return true; -} - //// //// String @@ -404,284 +336,3 @@ std::string deSerializeJsonStringIfNeeded(std::istream &is) return tmp_os.str(); } -//// -//// String/Struct conversions -//// - -bool deSerializeStringToStruct(std::string valstr, - std::string format, void *out, size_t olen) -{ - size_t len = olen; - std::vector strs_alloced; - std::string *str; - char *f, *snext; - size_t pos; - - char *s = &valstr[0]; - char *buf = new char[len]; - char *bufpos = buf; - - char *fmtpos, *fmt = &format[0]; - while ((f = strtok_r(fmt, ",", &fmtpos)) && s) { - fmt = nullptr; - - bool is_unsigned = false; - int width = 0; - char valtype = *f; - - width = (int)strtol(f + 1, &f, 10); - if (width && valtype == 's') - valtype = 'i'; - - switch (valtype) { - case 'u': - is_unsigned = true; - /* FALLTHROUGH */ - case 'i': - if (width == 16) { - bufpos += PADDING(bufpos, u16); - if ((bufpos - buf) + sizeof(u16) <= len) { - if (is_unsigned) - *(u16 *)bufpos = (u16)strtoul(s, &s, 10); - else - *(s16 *)bufpos = (s16)strtol(s, &s, 10); - } - bufpos += sizeof(u16); - } else if (width == 32) { - bufpos += PADDING(bufpos, u32); - if ((bufpos - buf) + sizeof(u32) <= len) { - if (is_unsigned) - *(u32 *)bufpos = (u32)strtoul(s, &s, 10); - else - *(s32 *)bufpos = (s32)strtol(s, &s, 10); - } - bufpos += sizeof(u32); - } else if (width == 64) { - bufpos += PADDING(bufpos, u64); - if ((bufpos - buf) + sizeof(u64) <= len) { - if (is_unsigned) - *(u64 *)bufpos = (u64)strtoull(s, &s, 10); - else - *(s64 *)bufpos = (s64)strtoll(s, &s, 10); - } - bufpos += sizeof(u64); - } - s = strchr(s, ','); - break; - case 'b': - snext = strchr(s, ','); - if (snext) - *snext++ = 0; - - bufpos += PADDING(bufpos, bool); - if ((bufpos - buf) + sizeof(bool) <= len) - *(bool *)bufpos = is_yes(std::string(s)); - bufpos += sizeof(bool); - - s = snext; - break; - case 'f': - bufpos += PADDING(bufpos, float); - if ((bufpos - buf) + sizeof(float) <= len) - *(float *)bufpos = strtof(s, &s); - bufpos += sizeof(float); - - s = strchr(s, ','); - break; - case 's': - while (*s == ' ' || *s == '\t') - s++; - if (*s++ != '"') //error, expected string - goto fail; - snext = s; - - while (snext[0] && !(snext[-1] != '\\' && snext[0] == '"')) - snext++; - *snext++ = 0; - - bufpos += PADDING(bufpos, std::string *); - - str = new std::string(s); - pos = 0; - while ((pos = str->find("\\\"", pos)) != std::string::npos) - str->erase(pos, 1); - - if ((bufpos - buf) + sizeof(std::string *) <= len) - *(std::string **)bufpos = str; - bufpos += sizeof(std::string *); - strs_alloced.push_back(str); - - s = *snext ? snext + 1 : nullptr; - break; - case 'v': - while (*s == ' ' || *s == '\t') - s++; - if (*s++ != '(') //error, expected vector - goto fail; - - if (width == 2) { - bufpos += PADDING(bufpos, v2f); - - if ((bufpos - buf) + sizeof(v2f) <= len) { - v2f *v = (v2f *)bufpos; - v->X = strtof(s, &s); - s++; - v->Y = strtof(s, &s); - } - - bufpos += sizeof(v2f); - } else if (width == 3) { - bufpos += PADDING(bufpos, v3f); - if ((bufpos - buf) + sizeof(v3f) <= len) { - v3f *v = (v3f *)bufpos; - v->X = strtof(s, &s); - s++; - v->Y = strtof(s, &s); - s++; - v->Z = strtof(s, &s); - } - - bufpos += sizeof(v3f); - } - s = strchr(s, ','); - break; - default: //error, invalid format specifier - goto fail; - } - - if (s && *s == ',') - s++; - - if ((size_t)(bufpos - buf) > len) //error, buffer too small - goto fail; - } - - if (f && *f) { //error, mismatched number of fields and values -fail: - for (size_t i = 0; i != strs_alloced.size(); i++) - delete strs_alloced[i]; - delete[] buf; - return false; - } - - memcpy(out, buf, olen); - delete[] buf; - return true; -} - -// Casts *buf to a signed or unsigned fixed-width integer of 'w' width -#define SIGN_CAST(w, buf) (is_unsigned ? *((u##w *) buf) : *((s##w *) buf)) - -bool serializeStructToString(std::string *out, - std::string format, void *value) -{ - std::ostringstream os; - std::string str; - char *f; - size_t strpos; - - char *bufpos = (char *) value; - char *fmtpos, *fmt = &format[0]; - while ((f = strtok_r(fmt, ",", &fmtpos))) { - fmt = nullptr; - bool is_unsigned = false; - int width = 0; - char valtype = *f; - - width = (int)strtol(f + 1, &f, 10); - if (width && valtype == 's') - valtype = 'i'; - - switch (valtype) { - case 'u': - is_unsigned = true; - /* FALLTHROUGH */ - case 'i': - if (width == 16) { - bufpos += PADDING(bufpos, u16); - os << SIGN_CAST(16, bufpos); - bufpos += sizeof(u16); - } else if (width == 32) { - bufpos += PADDING(bufpos, u32); - os << SIGN_CAST(32, bufpos); - bufpos += sizeof(u32); - } else if (width == 64) { - bufpos += PADDING(bufpos, u64); - os << SIGN_CAST(64, bufpos); - bufpos += sizeof(u64); - } - break; - case 'b': - bufpos += PADDING(bufpos, bool); - os << std::boolalpha << *((bool *) bufpos); - bufpos += sizeof(bool); - break; - case 'f': - bufpos += PADDING(bufpos, float); - os << *((float *) bufpos); - bufpos += sizeof(float); - break; - case 's': - bufpos += PADDING(bufpos, std::string *); - str = **((std::string **) bufpos); - - strpos = 0; - while ((strpos = str.find('"', strpos)) != std::string::npos) { - str.insert(strpos, 1, '\\'); - strpos += 2; - } - - os << str; - bufpos += sizeof(std::string *); - break; - case 'v': - if (width == 2) { - bufpos += PADDING(bufpos, v2f); - v2f *v = (v2f *) bufpos; - os << '(' << v->X << ", " << v->Y << ')'; - bufpos += sizeof(v2f); - } else { - bufpos += PADDING(bufpos, v3f); - v3f *v = (v3f *) bufpos; - os << '(' << v->X << ", " << v->Y << ", " << v->Z << ')'; - bufpos += sizeof(v3f); - } - break; - default: - return false; - } - os << ", "; - } - *out = os.str(); - - // Trim off the trailing comma and space - if (out->size() >= 2) - out->resize(out->size() - 2); - - return true; -} - -#undef SIGN_CAST - -//// -//// Other -//// - -std::string serializeHexString(const std::string &data, bool insert_spaces) -{ - std::string result; - result.reserve(data.size() * (2 + insert_spaces)); - - static const char hex_chars[] = "0123456789abcdef"; - - const size_t len = data.size(); - for (size_t i = 0; i != len; i++) { - u8 byte = data[i]; - result.push_back(hex_chars[(byte >> 4) & 0x0F]); - result.push_back(hex_chars[(byte >> 0) & 0x0F]); - if (insert_spaces && i != len - 1) - result.push_back(' '); - } - - return result; -} diff --git a/src/util/serialize.h b/src/util/serialize.h index a4b5a234a..a988a8f78 100644 --- a/src/util/serialize.h +++ b/src/util/serialize.h @@ -442,15 +442,9 @@ MAKE_STREAM_WRITE_FXN(video::SColor, ARGB8, 4); // Creates a string with the length as the first two bytes std::string serializeString(const std::string &plain); -// Creates a string with the length as the first two bytes from wide string -std::string serializeWideString(const std::wstring &plain); - // Reads a string with the length as the first two bytes std::string deSerializeString(std::istream &is); -// Reads a wide string with the length as the first two bytes -std::wstring deSerializeWideString(std::istream &is); - // Creates a string with the length as the first four bytes std::string serializeLongString(const std::string &plain); @@ -469,239 +463,3 @@ std::string serializeJsonStringIfNeeded(const std::string &s); // Parses a string serialized by serializeJsonStringIfNeeded. std::string deSerializeJsonStringIfNeeded(std::istream &is); - -// Creates a string consisting of the hexadecimal representation of `data` -std::string serializeHexString(const std::string &data, bool insert_spaces=false); - -// Creates a string containing comma delimited values of a struct whose layout is -// described by the parameter format -bool serializeStructToString(std::string *out, - std::string format, void *value); - -// Reads a comma delimited string of values into a struct whose layout is -// decribed by the parameter format -bool deSerializeStringToStruct(std::string valstr, - std::string format, void *out, size_t olen); - -//// -//// BufReader -//// - -#define MAKE_BUFREADER_GETNOEX_FXN(T, N, S) \ - inline bool get ## N ## NoEx(T *val) \ - { \ - if (pos + S > size) \ - return false; \ - *val = read ## N(data + pos); \ - pos += S; \ - return true; \ - } - -#define MAKE_BUFREADER_GET_FXN(T, N) \ - inline T get ## N() \ - { \ - T val; \ - if (!get ## N ## NoEx(&val)) \ - throw SerializationError("Attempted read past end of data"); \ - return val; \ - } - -class BufReader { -public: - BufReader(const u8 *data_, size_t size_) : - data(data_), - size(size_) - { - } - - MAKE_BUFREADER_GETNOEX_FXN(u8, U8, 1); - MAKE_BUFREADER_GETNOEX_FXN(u16, U16, 2); - MAKE_BUFREADER_GETNOEX_FXN(u32, U32, 4); - MAKE_BUFREADER_GETNOEX_FXN(u64, U64, 8); - MAKE_BUFREADER_GETNOEX_FXN(s8, S8, 1); - MAKE_BUFREADER_GETNOEX_FXN(s16, S16, 2); - MAKE_BUFREADER_GETNOEX_FXN(s32, S32, 4); - MAKE_BUFREADER_GETNOEX_FXN(s64, S64, 8); - MAKE_BUFREADER_GETNOEX_FXN(f32, F1000, 4); - MAKE_BUFREADER_GETNOEX_FXN(v2s16, V2S16, 4); - MAKE_BUFREADER_GETNOEX_FXN(v3s16, V3S16, 6); - MAKE_BUFREADER_GETNOEX_FXN(v2s32, V2S32, 8); - MAKE_BUFREADER_GETNOEX_FXN(v3s32, V3S32, 12); - MAKE_BUFREADER_GETNOEX_FXN(v3f, V3F1000, 12); - MAKE_BUFREADER_GETNOEX_FXN(video::SColor, ARGB8, 4); - - bool getStringNoEx(std::string *val); - bool getWideStringNoEx(std::wstring *val); - bool getLongStringNoEx(std::string *val); - bool getRawDataNoEx(void *data, size_t len); - - MAKE_BUFREADER_GET_FXN(u8, U8); - MAKE_BUFREADER_GET_FXN(u16, U16); - MAKE_BUFREADER_GET_FXN(u32, U32); - MAKE_BUFREADER_GET_FXN(u64, U64); - MAKE_BUFREADER_GET_FXN(s8, S8); - MAKE_BUFREADER_GET_FXN(s16, S16); - MAKE_BUFREADER_GET_FXN(s32, S32); - MAKE_BUFREADER_GET_FXN(s64, S64); - MAKE_BUFREADER_GET_FXN(f32, F1000); - MAKE_BUFREADER_GET_FXN(v2s16, V2S16); - MAKE_BUFREADER_GET_FXN(v3s16, V3S16); - MAKE_BUFREADER_GET_FXN(v2s32, V2S32); - MAKE_BUFREADER_GET_FXN(v3s32, V3S32); - MAKE_BUFREADER_GET_FXN(v3f, V3F1000); - MAKE_BUFREADER_GET_FXN(video::SColor, ARGB8); - MAKE_BUFREADER_GET_FXN(std::string, String); - MAKE_BUFREADER_GET_FXN(std::wstring, WideString); - MAKE_BUFREADER_GET_FXN(std::string, LongString); - - inline void getRawData(void *val, size_t len) - { - if (!getRawDataNoEx(val, len)) - throw SerializationError("Attempted read past end of data"); - } - - inline size_t remaining() - { - assert(pos <= size); - return size - pos; - } - - const u8 *data; - size_t size; - size_t pos = 0; -}; - -#undef MAKE_BUFREADER_GET_FXN -#undef MAKE_BUFREADER_GETNOEX_FXN - - -//// -//// Vector-based write routines -//// - -inline void putU8(std::vector *dest, u8 val) -{ - dest->push_back((val >> 0) & 0xFF); -} - -inline void putU16(std::vector *dest, u16 val) -{ - dest->push_back((val >> 8) & 0xFF); - dest->push_back((val >> 0) & 0xFF); -} - -inline void putU32(std::vector *dest, u32 val) -{ - dest->push_back((val >> 24) & 0xFF); - dest->push_back((val >> 16) & 0xFF); - dest->push_back((val >> 8) & 0xFF); - dest->push_back((val >> 0) & 0xFF); -} - -inline void putU64(std::vector *dest, u64 val) -{ - dest->push_back((val >> 56) & 0xFF); - dest->push_back((val >> 48) & 0xFF); - dest->push_back((val >> 40) & 0xFF); - dest->push_back((val >> 32) & 0xFF); - dest->push_back((val >> 24) & 0xFF); - dest->push_back((val >> 16) & 0xFF); - dest->push_back((val >> 8) & 0xFF); - dest->push_back((val >> 0) & 0xFF); -} - -inline void putS8(std::vector *dest, s8 val) -{ - putU8(dest, val); -} - -inline void putS16(std::vector *dest, s16 val) -{ - putU16(dest, val); -} - -inline void putS32(std::vector *dest, s32 val) -{ - putU32(dest, val); -} - -inline void putS64(std::vector *dest, s64 val) -{ - putU64(dest, val); -} - -inline void putF1000(std::vector *dest, f32 val) -{ - putS32(dest, val * FIXEDPOINT_FACTOR); -} - -inline void putV2S16(std::vector *dest, v2s16 val) -{ - putS16(dest, val.X); - putS16(dest, val.Y); -} - -inline void putV3S16(std::vector *dest, v3s16 val) -{ - putS16(dest, val.X); - putS16(dest, val.Y); - putS16(dest, val.Z); -} - -inline void putV2S32(std::vector *dest, v2s32 val) -{ - putS32(dest, val.X); - putS32(dest, val.Y); -} - -inline void putV3S32(std::vector *dest, v3s32 val) -{ - putS32(dest, val.X); - putS32(dest, val.Y); - putS32(dest, val.Z); -} - -inline void putV3F1000(std::vector *dest, v3f val) -{ - putF1000(dest, val.X); - putF1000(dest, val.Y); - putF1000(dest, val.Z); -} - -inline void putARGB8(std::vector *dest, video::SColor val) -{ - putU32(dest, val.color); -} - -inline void putString(std::vector *dest, const std::string &val) -{ - if (val.size() > STRING_MAX_LEN) - throw SerializationError("String too long"); - - putU16(dest, val.size()); - dest->insert(dest->end(), val.begin(), val.end()); -} - -inline void putWideString(std::vector *dest, const std::wstring &val) -{ - if (val.size() > WIDE_STRING_MAX_LEN) - throw SerializationError("String too long"); - - putU16(dest, val.size()); - for (size_t i = 0; i != val.size(); i++) - putU16(dest, val[i]); -} - -inline void putLongString(std::vector *dest, const std::string &val) -{ - if (val.size() > LONG_STRING_MAX_LEN) - throw SerializationError("String too long"); - - putU32(dest, val.size()); - dest->insert(dest->end(), val.begin(), val.end()); -} - -inline void putRawData(std::vector *dest, const void *src, size_t len) -{ - dest->insert(dest->end(), (u8 *)src, (u8 *)src + len); -} From 947466ab28129fd69e6630974c6c4e901f2bebc6 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 20 Sep 2020 13:12:55 +0200 Subject: [PATCH 084/177] (se)SerializeString: Include max length in the name This commit clarifies the maximal length of the serialized strings. It will avoid accidental use of serializeString() when a larger string can be expected. Removes unused Wide String serialization functions --- src/client/content_cao.cpp | 12 +++--- src/content_nodemeta.cpp | 18 ++++----- src/database/database-leveldb.cpp | 16 ++++---- src/itemdef.cpp | 52 ++++++++++++------------ src/mapblock.cpp | 4 +- src/mapgen/mg_schematic.cpp | 4 +- src/nameidmapping.cpp | 4 +- src/network/clientpackethandler.cpp | 8 ++-- src/nodedef.cpp | 40 +++++++++--------- src/nodemetadata.cpp | 8 ++-- src/object_properties.cpp | 28 ++++++------- src/particles.cpp | 4 +- src/server.cpp | 4 +- src/server/luaentity_sao.cpp | 28 ++++++------- src/server/player_sao.cpp | 16 ++++---- src/server/serveractiveobject.cpp | 2 +- src/server/unit_sao.cpp | 6 +-- src/sound.h | 4 +- src/staticobject.cpp | 4 +- src/tool.cpp | 8 ++-- src/unittest/test_serialization.cpp | 50 ++++++++++------------- src/util/serialize.cpp | 63 ++++------------------------- src/util/serialize.h | 8 ++-- 23 files changed, 168 insertions(+), 223 deletions(-) diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index 599139aa3..71a9d4b54 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -371,7 +371,7 @@ void GenericCAO::processInitData(const std::string &data) } // PROTOCOL_VERSION >= 37 - m_name = deSerializeString(is); + m_name = deSerializeString16(is); m_is_player = readU8(is); m_id = readU16(is); m_position = readV3F32(is); @@ -381,7 +381,7 @@ void GenericCAO::processInitData(const std::string &data) const u8 num_messages = readU8(is); for (int i = 0; i < num_messages; i++) { - std::string message = deSerializeLongString(is); + std::string message = deSerializeString32(is); processMessage(message); } @@ -1657,7 +1657,7 @@ void GenericCAO::processMessage(const std::string &data) rot_translator.update(m_rotation, false, update_interval); updateNodePos(); } else if (cmd == AO_CMD_SET_TEXTURE_MOD) { - std::string mod = deSerializeString(is); + std::string mod = deSerializeString16(is); // immediately reset a engine issued texture modifier if a mod sends a different one if (m_reset_textures_timer > 0) { @@ -1735,7 +1735,7 @@ void GenericCAO::processMessage(const std::string &data) m_animation_speed = readF32(is); updateAnimationSpeed(); } else if (cmd == AO_CMD_SET_BONE_POSITION) { - std::string bone = deSerializeString(is); + std::string bone = deSerializeString16(is); v3f position = readV3F32(is); v3f rotation = readV3F32(is); m_bone_position[bone] = core::vector2d(position, rotation); @@ -1743,7 +1743,7 @@ void GenericCAO::processMessage(const std::string &data) // updateBonePosition(); now called every step } else if (cmd == AO_CMD_ATTACH_TO) { u16 parent_id = readS16(is); - std::string bone = deSerializeString(is); + std::string bone = deSerializeString16(is); v3f position = readV3F32(is); v3f rotation = readV3F32(is); @@ -1793,7 +1793,7 @@ void GenericCAO::processMessage(const std::string &data) int armor_groups_size = readU16(is); for(int i=0; igetInventory()->deSerialize(is); - deSerializeLongString(is); // m_text - deSerializeString(is); // m_owner + deSerializeString32(is); // m_text + deSerializeString16(is); // m_owner - meta->setString("infotext",deSerializeString(is)); - meta->setString("formspec",deSerializeString(is)); + meta->setString("infotext",deSerializeString16(is)); + meta->setString("formspec",deSerializeString16(is)); readU8(is); // m_allow_text_input readU8(is); // m_allow_removal readU8(is); // m_enforce_owner int num_vars = readU32(is); for(int i=0; isetString(name, var); } return false; } else if(id == NODEMETA_SIGN) // SignNodeMetadata { - meta->setString("text", deSerializeString(is)); + meta->setString("text", deSerializeString16(is)); //meta->setString("infotext","\"${text}\""); meta->setString("infotext", std::string("\"") + meta->getString("text") + "\""); @@ -87,7 +87,7 @@ static bool content_nodemeta_deserialize_legacy_body( } else if(id == NODEMETA_LOCKABLE_CHEST) // LockingChestNodeMetadata { - meta->setString("owner", deSerializeString(is)); + meta->setString("owner", deSerializeString16(is)); meta->getInventory()->deSerialize(is); // Rename inventory list "0" to "main" @@ -138,7 +138,7 @@ static bool content_nodemeta_deserialize_legacy_meta( s16 id = readS16(is); // Read data - std::string data = deSerializeString(is); + std::string data = deSerializeString16(is); std::istringstream tmp_is(data, std::ios::binary); return content_nodemeta_deserialize_legacy_body(tmp_is, id, meta); } diff --git a/src/database/database-leveldb.cpp b/src/database/database-leveldb.cpp index 1976ae13d..73cd63f6d 100644 --- a/src/database/database-leveldb.cpp +++ b/src/database/database-leveldb.cpp @@ -145,8 +145,8 @@ void PlayerDatabaseLevelDB::savePlayer(RemotePlayer *player) StringMap stringvars = sao->getMeta().getStrings(); writeU32(os, stringvars.size()); for (const auto &it : stringvars) { - os << serializeString(it.first); - os << serializeLongString(it.second); + os << serializeString16(it.first); + os << serializeString32(it.second); } player->inventory.serialize(os); @@ -183,8 +183,8 @@ bool PlayerDatabaseLevelDB::loadPlayer(RemotePlayer *player, PlayerSAO *sao) u32 attribute_count = readU32(is); for (u32 i = 0; i < attribute_count; i++) { - std::string name = deSerializeString(is); - std::string value = deSerializeLongString(is); + std::string name = deSerializeString16(is); + std::string value = deSerializeString32(is); sao->getMeta().setString(name, value); } sao->getMeta().setModified(false); @@ -247,13 +247,13 @@ bool AuthDatabaseLevelDB::getAuth(const std::string &name, AuthEntry &res) res.id = 1; res.name = name; - res.password = deSerializeString(is); + res.password = deSerializeString16(is); u16 privilege_count = readU16(is); res.privileges.clear(); res.privileges.reserve(privilege_count); for (u16 i = 0; i < privilege_count; i++) { - res.privileges.push_back(deSerializeString(is)); + res.privileges.push_back(deSerializeString16(is)); } res.last_login = readS64(is); @@ -264,14 +264,14 @@ bool AuthDatabaseLevelDB::saveAuth(const AuthEntry &authEntry) { std::ostringstream os; writeU8(os, 1); - os << serializeString(authEntry.password); + os << serializeString16(authEntry.password); size_t privilege_count = authEntry.privileges.size(); FATAL_ERROR_IF(privilege_count > U16_MAX, "Unsupported number of privileges"); writeU16(os, privilege_count); for (const std::string &privilege : authEntry.privileges) { - os << serializeString(privilege); + os << serializeString16(privilege); } writeS64(os, authEntry.last_login); diff --git a/src/itemdef.cpp b/src/itemdef.cpp index 8e0492827..df20bdf15 100644 --- a/src/itemdef.cpp +++ b/src/itemdef.cpp @@ -128,10 +128,10 @@ void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const u8 version = 6; writeU8(os, version); writeU8(os, type); - os << serializeString(name); - os << serializeString(description); - os << serializeString(inventory_image); - os << serializeString(wield_image); + os << serializeString16(name); + os << serializeString16(description); + os << serializeString16(inventory_image); + os << serializeString16(wield_image); writeV3F32(os, wield_scale); writeS16(os, stack_max); writeU8(os, usable); @@ -143,25 +143,25 @@ void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const tool_capabilities->serialize(tmp_os, protocol_version); tool_capabilities_s = tmp_os.str(); } - os << serializeString(tool_capabilities_s); + os << serializeString16(tool_capabilities_s); writeU16(os, groups.size()); for (const auto &group : groups) { - os << serializeString(group.first); + os << serializeString16(group.first); writeS16(os, group.second); } - os << serializeString(node_placement_prediction); + os << serializeString16(node_placement_prediction); // Version from ContentFeatures::serialize to keep in sync sound_place.serialize(os, CONTENTFEATURES_VERSION); sound_place_failed.serialize(os, CONTENTFEATURES_VERSION); writeF32(os, range); - os << serializeString(palette_image); + os << serializeString16(palette_image); writeARGB8(os, color); - os << serializeString(inventory_overlay); - os << serializeString(wield_overlay); + os << serializeString16(inventory_overlay); + os << serializeString16(wield_overlay); } void ItemDefinition::deSerialize(std::istream &is) @@ -175,16 +175,16 @@ void ItemDefinition::deSerialize(std::istream &is) throw SerializationError("unsupported ItemDefinition version"); type = (enum ItemType)readU8(is); - name = deSerializeString(is); - description = deSerializeString(is); - inventory_image = deSerializeString(is); - wield_image = deSerializeString(is); + name = deSerializeString16(is); + description = deSerializeString16(is); + inventory_image = deSerializeString16(is); + wield_image = deSerializeString16(is); wield_scale = readV3F32(is); stack_max = readS16(is); usable = readU8(is); liquids_pointable = readU8(is); - std::string tool_capabilities_s = deSerializeString(is); + std::string tool_capabilities_s = deSerializeString16(is); if (!tool_capabilities_s.empty()) { std::istringstream tmp_is(tool_capabilities_s, std::ios::binary); tool_capabilities = new ToolCapabilities; @@ -194,22 +194,22 @@ void ItemDefinition::deSerialize(std::istream &is) groups.clear(); u32 groups_size = readU16(is); for(u32 i=0; iserialize(tmp_os, protocol_version); - os << serializeString(tmp_os.str()); + os << serializeString16(tmp_os.str()); } writeU16(os, m_aliases.size()); for (const auto &it : m_aliases) { - os << serializeString(it.first); - os << serializeString(it.second); + os << serializeString16(it.first); + os << serializeString16(it.second); } } void deSerialize(std::istream &is) @@ -543,7 +543,7 @@ public: for(u16 i=0; iidef()); } else { - //std::string data = deSerializeLongString(is); + //std::string data = deSerializeString32(is); std::ostringstream oss(std::ios_base::binary); decompressZlib(is, oss); std::istringstream iss(oss.str(), std::ios_base::binary); diff --git a/src/mapgen/mg_schematic.cpp b/src/mapgen/mg_schematic.cpp index ba102d997..dfd414709 100644 --- a/src/mapgen/mg_schematic.cpp +++ b/src/mapgen/mg_schematic.cpp @@ -314,7 +314,7 @@ bool Schematic::deserializeFromMts(std::istream *is, //// Read node names u16 nidmapcount = readU16(ss); for (int i = 0; i != nidmapcount; i++) { - std::string name = deSerializeString(ss); + std::string name = deSerializeString16(ss); // Instances of "ignore" from v1 are converted to air (and instances // are fixed to have MTSCHEM_PROB_NEVER later on). @@ -372,7 +372,7 @@ bool Schematic::serializeToMts(std::ostream *os, writeU16(ss, names.size()); // name count for (size_t i = 0; i != names.size(); i++) - ss << serializeString(names[i]); // node names + ss << serializeString16(names[i]); // node names // compressed bulk node data MapNode::serializeBulk(ss, SER_FMT_VER_HIGHEST_WRITE, diff --git a/src/nameidmapping.cpp b/src/nameidmapping.cpp index bd5bb1fc8..05cfae069 100644 --- a/src/nameidmapping.cpp +++ b/src/nameidmapping.cpp @@ -27,7 +27,7 @@ void NameIdMapping::serialize(std::ostream &os) const writeU16(os, m_id_to_name.size()); for (const auto &i : m_id_to_name) { writeU16(os, i.first); - os << serializeString(i.second); + os << serializeString16(i.second); } } @@ -41,7 +41,7 @@ void NameIdMapping::deSerialize(std::istream &is) m_name_to_id.clear(); for (u32 i = 0; i < count; i++) { u16 id = readU16(is); - std::string name = deSerializeString(is); + std::string name = deSerializeString16(is); m_id_to_name[id] = name; m_name_to_id[name] = id; } diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp index 8d87ff8f2..5683564a0 100644 --- a/src/network/clientpackethandler.cpp +++ b/src/network/clientpackethandler.cpp @@ -497,7 +497,7 @@ void Client::handleCommand_ActiveObjectMessages(NetworkPacket* pkt) if (!is.good()) break; - std::string message = deSerializeString(is); + std::string message = deSerializeString16(is); // Pass on to the environment m_env.processActiveObjectMessage(id, message); @@ -994,7 +994,7 @@ void Client::handleCommand_AddParticleSpawner(NetworkPacket* pkt) p.minsize = readF32(is); p.maxsize = readF32(is); p.collisiondetection = readU8(is); - p.texture = deSerializeLongString(is); + p.texture = deSerializeString32(is); server_id = readU32(is); @@ -1207,11 +1207,11 @@ void Client::handleCommand_HudSetSky(NetworkPacket* pkt) SkyboxParams skybox; skybox.bgcolor = video::SColor(readARGB8(is)); - skybox.type = std::string(deSerializeString(is)); + skybox.type = std::string(deSerializeString16(is)); u16 count = readU16(is); for (size_t i = 0; i < count; i++) - skybox.textures.emplace_back(deSerializeString(is)); + skybox.textures.emplace_back(deSerializeString16(is)); skybox.clouds = true; try { diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 392f5eb98..3a5934cf3 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -207,7 +207,7 @@ void TileDef::serialize(std::ostream &os, u16 protocol_version) const u8 version = 6; writeU8(os, version); - os << serializeString(name); + os << serializeString16(name); animation.serialize(os, version); bool has_scale = scale > 0; u16 flags = 0; @@ -241,7 +241,7 @@ void TileDef::deSerialize(std::istream &is, u8 contentfeatures_version, int version = readU8(is); if (version < 6) throw SerializationError("unsupported TileDef version"); - name = deSerializeString(is); + name = deSerializeString16(is); animation.deSerialize(is, version); u16 flags = readU16(is); backface_culling = flags & TILE_FLAG_BACKFACE_CULLING; @@ -416,10 +416,10 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const writeU8(os, version); // general - os << serializeString(name); + os << serializeString16(name); writeU16(os, groups.size()); for (const auto &group : groups) { - os << serializeString(group.first); + os << serializeString16(group.first); writeS16(os, group.second); } writeU8(os, param_type); @@ -427,7 +427,7 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const // visual writeU8(os, drawtype); - os << serializeString(mesh); + os << serializeString16(mesh); writeF32(os, visual_scale); writeU8(os, 6); for (const TileDef &td : tiledef) @@ -442,7 +442,7 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const writeU8(os, color.getRed()); writeU8(os, color.getGreen()); writeU8(os, color.getBlue()); - os << serializeString(palette_name); + os << serializeString16(palette_name); writeU8(os, waving); writeU8(os, connect_sides); writeU16(os, connects_to_ids.size()); @@ -470,8 +470,8 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const // liquid writeU8(os, liquid_type); - os << serializeString(liquid_alternative_flowing); - os << serializeString(liquid_alternative_source); + os << serializeString16(liquid_alternative_flowing); + os << serializeString16(liquid_alternative_source); writeU8(os, liquid_viscosity); writeU8(os, liquid_renewable); writeU8(os, liquid_range); @@ -492,7 +492,7 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const writeU8(os, legacy_facedir_simple); writeU8(os, legacy_wallmounted); - os << serializeString(node_dig_prediction); + os << serializeString16(node_dig_prediction); writeU8(os, leveled_max); } @@ -519,11 +519,11 @@ void ContentFeatures::deSerialize(std::istream &is) throw SerializationError("unsupported ContentFeatures version"); // general - name = deSerializeString(is); + name = deSerializeString16(is); groups.clear(); u32 groups_size = readU16(is); for (u32 i = 0; i < groups_size; i++) { - std::string name = deSerializeString(is); + std::string name = deSerializeString16(is); int value = readS16(is); groups[name] = value; } @@ -532,7 +532,7 @@ void ContentFeatures::deSerialize(std::istream &is) // visual drawtype = (enum NodeDrawType) readU8(is); - mesh = deSerializeString(is); + mesh = deSerializeString16(is); visual_scale = readF32(is); if (readU8(is) != 6) throw SerializationError("unsupported tile count"); @@ -548,7 +548,7 @@ void ContentFeatures::deSerialize(std::istream &is) color.setRed(readU8(is)); color.setGreen(readU8(is)); color.setBlue(readU8(is)); - palette_name = deSerializeString(is); + palette_name = deSerializeString16(is); waving = readU8(is); connect_sides = readU8(is); u16 connects_to_size = readU16(is); @@ -578,8 +578,8 @@ void ContentFeatures::deSerialize(std::istream &is) // liquid liquid_type = (enum LiquidType) readU8(is); - liquid_alternative_flowing = deSerializeString(is); - liquid_alternative_source = deSerializeString(is); + liquid_alternative_flowing = deSerializeString16(is); + liquid_alternative_source = deSerializeString16(is); liquid_viscosity = readU8(is); liquid_renewable = readU8(is); liquid_range = readU8(is); @@ -601,7 +601,7 @@ void ContentFeatures::deSerialize(std::istream &is) legacy_wallmounted = readU8(is); try { - node_dig_prediction = deSerializeString(is); + node_dig_prediction = deSerializeString16(is); u8 tmp_leveled_max = readU8(is); if (is.eof()) /* readU8 doesn't throw exceptions so we have to do this */ throw SerializationError(""); @@ -1472,7 +1472,7 @@ void NodeDefManager::serialize(std::ostream &os, u16 protocol_version) const // strict version incompatibilities std::ostringstream wrapper_os(std::ios::binary); f->serialize(wrapper_os, protocol_version); - os2<= 2) writeU8(os, (priv) ? 1 : 0); } @@ -63,8 +63,8 @@ void NodeMetadata::deSerialize(std::istream &is, u8 version) clear(); int num_vars = readU32(is); for(int i=0; i= 2) { if (readU8(is) == 1) diff --git a/src/object_properties.cpp b/src/object_properties.cpp index 8d51bcbfa..c31c667e7 100644 --- a/src/object_properties.cpp +++ b/src/object_properties.cpp @@ -84,11 +84,11 @@ void ObjectProperties::serialize(std::ostream &os) const writeV3F32(os, selectionbox.MinEdge); writeV3F32(os, selectionbox.MaxEdge); writeU8(os, pointable); - os << serializeString(visual); + os << serializeString16(visual); writeV3F32(os, visual_size); writeU16(os, textures.size()); for (const std::string &texture : textures) { - os << serializeString(texture); + os << serializeString16(texture); } writeV2S16(os, spritediv); writeV2S16(os, initial_sprite_basepos); @@ -96,7 +96,7 @@ void ObjectProperties::serialize(std::ostream &os) const writeU8(os, makes_footstep_sound); writeF32(os, automatic_rotate); // Added in protocol version 14 - os << serializeString(mesh); + os << serializeString16(mesh); writeU16(os, colors.size()); for (video::SColor color : colors) { writeARGB8(os, color); @@ -106,17 +106,17 @@ void ObjectProperties::serialize(std::ostream &os) const writeU8(os, automatic_face_movement_dir); writeF32(os, automatic_face_movement_dir_offset); writeU8(os, backface_culling); - os << serializeString(nametag); + os << serializeString16(nametag); writeARGB8(os, nametag_color); writeF32(os, automatic_face_movement_max_rotation_per_sec); - os << serializeString(infotext); - os << serializeString(wield_item); + os << serializeString16(infotext); + os << serializeString16(wield_item); writeS8(os, glow); writeU16(os, breath_max); writeF32(os, eye_height); writeF32(os, zoom_fov); writeU8(os, use_texture_alpha); - os << serializeString(damage_texture_modifier); + os << serializeString16(damage_texture_modifier); writeU8(os, shaded); // Add stuff only at the bottom. @@ -137,19 +137,19 @@ void ObjectProperties::deSerialize(std::istream &is) selectionbox.MinEdge = readV3F32(is); selectionbox.MaxEdge = readV3F32(is); pointable = readU8(is); - visual = deSerializeString(is); + visual = deSerializeString16(is); visual_size = readV3F32(is); textures.clear(); u32 texture_count = readU16(is); for (u32 i = 0; i < texture_count; i++){ - textures.push_back(deSerializeString(is)); + textures.push_back(deSerializeString16(is)); } spritediv = readV2S16(is); initial_sprite_basepos = readV2S16(is); is_visible = readU8(is); makes_footstep_sound = readU8(is); automatic_rotate = readF32(is); - mesh = deSerializeString(is); + mesh = deSerializeString16(is); colors.clear(); u32 color_count = readU16(is); for (u32 i = 0; i < color_count; i++){ @@ -160,18 +160,18 @@ void ObjectProperties::deSerialize(std::istream &is) automatic_face_movement_dir = readU8(is); automatic_face_movement_dir_offset = readF32(is); backface_culling = readU8(is); - nametag = deSerializeString(is); + nametag = deSerializeString16(is); nametag_color = readARGB8(is); automatic_face_movement_max_rotation_per_sec = readF32(is); - infotext = deSerializeString(is); - wield_item = deSerializeString(is); + infotext = deSerializeString16(is); + wield_item = deSerializeString16(is); glow = readS8(is); breath_max = readU16(is); eye_height = readF32(is); zoom_fov = readF32(is); use_texture_alpha = readU8(is); try { - damage_texture_modifier = deSerializeString(is); + damage_texture_modifier = deSerializeString16(is); u8 tmp = readU8(is); if (is.eof()) throw SerializationError(""); diff --git a/src/particles.cpp b/src/particles.cpp index fd81238dc..14c987958 100644 --- a/src/particles.cpp +++ b/src/particles.cpp @@ -28,7 +28,7 @@ void ParticleParameters::serialize(std::ostream &os, u16 protocol_ver) const writeF32(os, expirationtime); writeF32(os, size); writeU8(os, collisiondetection); - os << serializeLongString(texture); + os << serializeString32(texture); writeU8(os, vertical); writeU8(os, collision_removal); animation.serialize(os, 6); /* NOT the protocol ver */ @@ -47,7 +47,7 @@ void ParticleParameters::deSerialize(std::istream &is, u16 protocol_ver) expirationtime = readF32(is); size = readF32(is); collisiondetection = readU8(is); - texture = deSerializeLongString(is); + texture = deSerializeString32(is); vertical = readU8(is); collision_removal = readU8(is); animation.deSerialize(is, 6); /* NOT the protocol ver */ diff --git a/src/server.cpp b/src/server.cpp index d40ff259f..982f904f4 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -802,7 +802,7 @@ void Server::AsyncRunStep(bool initial_step) // u16 id // std::string data buffer.append(idbuf, sizeof(idbuf)); - buffer.append(serializeString(aom.datastring)); + buffer.append(serializeString16(aom.datastring)); } } /* @@ -1993,7 +1993,7 @@ void Server::SendActiveObjectRemoveAdd(RemoteClient *client, PlayerSAO *playersa writeU8((u8*)buf, type); data.append(buf, 1); - data.append(serializeLongString( + data.append(serializeString32( obj->getClientInitializationData(client->net_proto_version))); // Add to known objects diff --git a/src/server/luaentity_sao.cpp b/src/server/luaentity_sao.cpp index d504c42ca..f20914f7f 100644 --- a/src/server/luaentity_sao.cpp +++ b/src/server/luaentity_sao.cpp @@ -42,8 +42,8 @@ LuaEntitySAO::LuaEntitySAO(ServerEnvironment *env, v3f pos, const std::string &d u8 version2 = 0; u8 version = readU8(is); - name = deSerializeString(is); - state = deSerializeLongString(is); + name = deSerializeString16(is); + state = deSerializeString32(is); if (version < 1) break; @@ -225,7 +225,7 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version) // PROTOCOL_VERSION >= 37 writeU8(os, 1); // version - os << serializeString(""); // name + os << serializeString16(""); // name writeU8(os, 0); // is_player writeU16(os, getId()); //id writeV3F32(os, m_base_position); @@ -233,26 +233,26 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version) writeU16(os, m_hp); std::ostringstream msg_os(std::ios::binary); - msg_os << serializeLongString(getPropertyPacket()); // message 1 - msg_os << serializeLongString(generateUpdateArmorGroupsCommand()); // 2 - msg_os << serializeLongString(generateUpdateAnimationCommand()); // 3 + msg_os << serializeString32(getPropertyPacket()); // message 1 + msg_os << serializeString32(generateUpdateArmorGroupsCommand()); // 2 + msg_os << serializeString32(generateUpdateAnimationCommand()); // 3 for (const auto &bone_pos : m_bone_position) { - msg_os << serializeLongString(generateUpdateBonePositionCommand( + msg_os << serializeString32(generateUpdateBonePositionCommand( bone_pos.first, bone_pos.second.X, bone_pos.second.Y)); // m_bone_position.size } - msg_os << serializeLongString(generateUpdateAttachmentCommand()); // 4 + msg_os << serializeString32(generateUpdateAttachmentCommand()); // 4 int message_count = 4 + m_bone_position.size(); for (const auto &id : getAttachmentChildIds()) { if (ServerActiveObject *obj = m_env->getActiveObject(id)) { message_count++; - msg_os << serializeLongString(obj->generateUpdateInfantCommand( + msg_os << serializeString32(obj->generateUpdateInfantCommand( id, protocol_version)); } } - msg_os << serializeLongString(generateSetTextureModCommand()); + msg_os << serializeString32(generateSetTextureModCommand()); message_count++; writeU8(os, message_count); @@ -270,14 +270,14 @@ void LuaEntitySAO::getStaticData(std::string *result) const // version must be 1 to keep backwards-compatibility. See version2 writeU8(os, 1); // name - os<getScriptIface()-> luaentity_GetStaticdata(m_id); - os<= 15 writeU8(os, 1); // version - os << serializeString(m_player->getName()); // name + os << serializeString16(m_player->getName()); // name writeU8(os, 1); // is_player writeS16(os, getId()); // id writeV3F32(os, m_base_position); @@ -117,22 +117,22 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version) writeU16(os, getHP()); std::ostringstream msg_os(std::ios::binary); - msg_os << serializeLongString(getPropertyPacket()); // message 1 - msg_os << serializeLongString(generateUpdateArmorGroupsCommand()); // 2 - msg_os << serializeLongString(generateUpdateAnimationCommand()); // 3 + msg_os << serializeString32(getPropertyPacket()); // message 1 + msg_os << serializeString32(generateUpdateArmorGroupsCommand()); // 2 + msg_os << serializeString32(generateUpdateAnimationCommand()); // 3 for (const auto &bone_pos : m_bone_position) { - msg_os << serializeLongString(generateUpdateBonePositionCommand( + msg_os << serializeString32(generateUpdateBonePositionCommand( bone_pos.first, bone_pos.second.X, bone_pos.second.Y)); // m_bone_position.size } - msg_os << serializeLongString(generateUpdateAttachmentCommand()); // 4 - msg_os << serializeLongString(generateUpdatePhysicsOverrideCommand()); // 5 + msg_os << serializeString32(generateUpdateAttachmentCommand()); // 4 + msg_os << serializeString32(generateUpdatePhysicsOverrideCommand()); // 5 int message_count = 5 + m_bone_position.size(); for (const auto &id : getAttachmentChildIds()) { if (ServerActiveObject *obj = m_env->getActiveObject(id)) { message_count++; - msg_os << serializeLongString(obj->generateUpdateInfantCommand( + msg_os << serializeString32(obj->generateUpdateInfantCommand( id, protocol_version)); } } diff --git a/src/server/serveractiveobject.cpp b/src/server/serveractiveobject.cpp index 3341dc008..8cb59b2d6 100644 --- a/src/server/serveractiveobject.cpp +++ b/src/server/serveractiveobject.cpp @@ -61,7 +61,7 @@ std::string ServerActiveObject::generateUpdateInfantCommand(u16 infant_id, u16 p // Clients since 4aa9a66 so no longer need this data // Version 38 is the first bump after that commit. // See also: ClientEnvironment::addActiveObject - os << serializeLongString(getClientInitializationData(protocol_version)); + os << serializeString32(getClientInitializationData(protocol_version)); } return os.str(); } diff --git a/src/server/unit_sao.cpp b/src/server/unit_sao.cpp index ef0e87f2c..d906e885e 100644 --- a/src/server/unit_sao.cpp +++ b/src/server/unit_sao.cpp @@ -242,7 +242,7 @@ std::string UnitSAO::generateUpdateAttachmentCommand() const writeU8(os, AO_CMD_ATTACH_TO); // parameters writeS16(os, m_attachment_parent_id); - os << serializeString(m_attachment_bone); + os << serializeString16(m_attachment_bone); writeV3F32(os, m_attachment_position); writeV3F32(os, m_attachment_rotation); return os.str(); @@ -255,7 +255,7 @@ std::string UnitSAO::generateUpdateBonePositionCommand( // command writeU8(os, AO_CMD_SET_BONE_POSITION); // parameters - os << serializeString(bone); + os << serializeString16(bone); writeV3F32(os, position); writeV3F32(os, rotation); return os.str(); @@ -291,7 +291,7 @@ std::string UnitSAO::generateUpdateArmorGroupsCommand() const writeU8(os, AO_CMD_UPDATE_ARMOR_GROUPS); writeU16(os, m_armor_groups.size()); for (const auto &armor_group : m_armor_groups) { - os << serializeString(armor_group.first); + os << serializeString16(armor_group.first); writeS16(os, armor_group.second); } return os.str(); diff --git a/src/sound.h b/src/sound.h index 6cbd55e8f..6f7b0a1af 100644 --- a/src/sound.h +++ b/src/sound.h @@ -39,7 +39,7 @@ struct SimpleSoundSpec // keep in sync with item definitions void serialize(std::ostream &os, u8 cf_version) const { - os << serializeString(name); + os << serializeString16(name); writeF32(os, gain); writeF32(os, pitch); writeF32(os, fade); @@ -49,7 +49,7 @@ struct SimpleSoundSpec void deSerialize(std::istream &is, u8 cf_version) { - name = deSerializeString(is); + name = deSerializeString16(is); gain = readF32(is); pitch = readF32(is); fade = readF32(is); diff --git a/src/staticobject.cpp b/src/staticobject.cpp index 5ccb7baf5..86e455b9f 100644 --- a/src/staticobject.cpp +++ b/src/staticobject.cpp @@ -35,7 +35,7 @@ void StaticObject::serialize(std::ostream &os) // pos writeV3F1000(os, pos); // data - os<uses); writeS16(os, cap->maxlevel); writeU32(os, cap->times.size()); @@ -79,7 +79,7 @@ void ToolCapabilities::serialize(std::ostream &os, u16 protocol_version) const writeU32(os, damageGroups.size()); for (const auto &damageGroup : damageGroups) { - os << serializeString(damageGroup.first); + os << serializeString16(damageGroup.first); writeS16(os, damageGroup.second); } @@ -98,7 +98,7 @@ void ToolCapabilities::deSerialize(std::istream &is) groupcaps.clear(); u32 groupcaps_size = readU32(is); for (u32 i = 0; i < groupcaps_size; i++) { - std::string name = deSerializeString(is); + std::string name = deSerializeString16(is); ToolGroupCap cap; cap.uses = readS16(is); cap.maxlevel = readS16(is); @@ -113,7 +113,7 @@ void ToolCapabilities::deSerialize(std::istream &is) u32 damage_groups_size = readU32(is); for (u32 i = 0; i < damage_groups_size; i++) { - std::string name = deSerializeString(is); + std::string name = deSerializeString16(is); s16 rating = readS16(is); damageGroups[name] = rating; } diff --git a/src/unittest/test_serialization.cpp b/src/unittest/test_serialization.cpp index d72bf0d4c..660d77d02 100644 --- a/src/unittest/test_serialization.cpp +++ b/src/unittest/test_serialization.cpp @@ -44,7 +44,7 @@ public: std::wstring teststring2_w; std::string teststring2_w_encoded; - static const u8 test_serialized_data[12 * 13 - 8]; + static const u8 test_serialized_data[12 * 11 - 2]; }; static TestSerialization g_test_instance; @@ -91,21 +91,21 @@ void TestSerialization::buildTestStrings() void TestSerialization::testSerializeString() { // Test blank string - UASSERT(serializeString("") == mkstr("\0\0")); + UASSERT(serializeString16("") == mkstr("\0\0")); // Test basic string - UASSERT(serializeString("Hello world!") == mkstr("\0\14Hello world!")); + UASSERT(serializeString16("Hello world!") == mkstr("\0\14Hello world!")); // Test character range - UASSERT(serializeString(teststring2) == mkstr("\1\0") + teststring2); + UASSERT(serializeString16(teststring2) == mkstr("\1\0") + teststring2); } void TestSerialization::testDeSerializeString() { // Test deserialize { - std::istringstream is(serializeString(teststring2), std::ios::binary); - UASSERT(deSerializeString(is) == teststring2); + std::istringstream is(serializeString16(teststring2), std::ios::binary); + UASSERT(deSerializeString16(is) == teststring2); UASSERT(!is.eof()); is.get(); UASSERT(is.eof()); @@ -114,34 +114,34 @@ void TestSerialization::testDeSerializeString() // Test deserialize an incomplete length specifier { std::istringstream is(mkstr("\x53"), std::ios::binary); - EXCEPTION_CHECK(SerializationError, deSerializeString(is)); + EXCEPTION_CHECK(SerializationError, deSerializeString16(is)); } // Test deserialize a string with incomplete data { std::istringstream is(mkstr("\x00\x55 abcdefg"), std::ios::binary); - EXCEPTION_CHECK(SerializationError, deSerializeString(is)); + EXCEPTION_CHECK(SerializationError, deSerializeString16(is)); } } void TestSerialization::testSerializeLongString() { // Test blank string - UASSERT(serializeLongString("") == mkstr("\0\0\0\0")); + UASSERT(serializeString32("") == mkstr("\0\0\0\0")); // Test basic string - UASSERT(serializeLongString("Hello world!") == mkstr("\0\0\0\14Hello world!")); + UASSERT(serializeString32("Hello world!") == mkstr("\0\0\0\14Hello world!")); // Test character range - UASSERT(serializeLongString(teststring2) == mkstr("\0\0\1\0") + teststring2); + UASSERT(serializeString32(teststring2) == mkstr("\0\0\1\0") + teststring2); } void TestSerialization::testDeSerializeLongString() { // Test deserialize { - std::istringstream is(serializeLongString(teststring2), std::ios::binary); - UASSERT(deSerializeLongString(is) == teststring2); + std::istringstream is(serializeString32(teststring2), std::ios::binary); + UASSERT(deSerializeString32(is) == teststring2); UASSERT(!is.eof()); is.get(); UASSERT(is.eof()); @@ -150,19 +150,19 @@ void TestSerialization::testDeSerializeLongString() // Test deserialize an incomplete length specifier { std::istringstream is(mkstr("\x53"), std::ios::binary); - EXCEPTION_CHECK(SerializationError, deSerializeLongString(is)); + EXCEPTION_CHECK(SerializationError, deSerializeString32(is)); } // Test deserialize a string with incomplete data { std::istringstream is(mkstr("\x00\x00\x00\x05 abc"), std::ios::binary); - EXCEPTION_CHECK(SerializationError, deSerializeLongString(is)); + EXCEPTION_CHECK(SerializationError, deSerializeString32(is)); } // Test deserialize a string with a length too large { std::istringstream is(mkstr("\xFF\xFF\xFF\xFF blah"), std::ios::binary); - EXCEPTION_CHECK(SerializationError, deSerializeLongString(is)); + EXCEPTION_CHECK(SerializationError, deSerializeString32(is)); } } @@ -235,19 +235,17 @@ void TestSerialization::testStreamRead() UASSERT(readF1000(is) == F1000_MIN); UASSERT(readF1000(is) == F1000_MAX); - UASSERT(deSerializeString(is) == "foobar!"); + UASSERT(deSerializeString16(is) == "foobar!"); UASSERT(readV2S16(is) == v2s16(500, 500)); UASSERT(readV3S16(is) == v3s16(4207, 604, -30)); UASSERT(readV2S32(is) == v2s32(1920, 1080)); UASSERT(readV3S32(is) == v3s32(-400, 6400054, 290549855)); - UASSERT(deSerializeWideString(is) == L"\x02~woof~\x5455"); - UASSERT(readV3F1000(is) == v3f(500, 10024.2f, -192.54f)); UASSERT(readARGB8(is) == video::SColor(255, 128, 50, 128)); - UASSERT(deSerializeLongString(is) == "some longer string here"); + UASSERT(deSerializeString32(is) == "some longer string here"); UASSERT(is.rdbuf()->in_avail() == 2); UASSERT(readU16(is) == 0xF00D); @@ -275,7 +273,7 @@ void TestSerialization::testStreamWrite() writeF1000(os, F1000_MIN); writeF1000(os, F1000_MAX); - os << serializeString("foobar!"); + os << serializeString16("foobar!"); data = os.str(); UASSERT(data.size() < sizeof(test_serialized_data)); @@ -286,12 +284,10 @@ void TestSerialization::testStreamWrite() writeV2S32(os, v2s32(1920, 1080)); writeV3S32(os, v3s32(-400, 6400054, 290549855)); - os << serializeWideString(L"\x02~woof~\x5455"); - writeV3F1000(os, v3f(500, 10024.2f, -192.54f)); writeARGB8(os, video::SColor(255, 128, 50, 128)); - os << serializeLongString("some longer string here"); + os << serializeString32("some longer string here"); writeU16(os, 0xF00D); @@ -384,7 +380,7 @@ void TestSerialization::testFloatFormat() UASSERT(test_single(i)); } -const u8 TestSerialization::test_serialized_data[12 * 13 - 8] = { +const u8 TestSerialization::test_serialized_data[12 * 11 - 2] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x80, 0x75, 0x30, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x00, 0x00, 0xd1, 0x1e, 0xee, 0x1e, @@ -392,9 +388,7 @@ const u8 TestSerialization::test_serialized_data[12 * 13 - 8] = { 0x66, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x21, 0x01, 0xf4, 0x01, 0xf4, 0x10, 0x6f, 0x02, 0x5c, 0xff, 0xe2, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x04, 0x38, 0xff, 0xff, 0xfe, 0x70, 0x00, 0x61, 0xa8, 0x36, 0x11, 0x51, 0x70, - 0x5f, 0x00, 0x08, 0x00, - 0x02, 0x00, 0x7e, 0x00, 'w', 0x00, 'o', 0x00, 'o', 0x00, 'f', 0x00, // \x02~woof~\x5455 - 0x7e, 0x54, 0x55, 0x00, 0x07, 0xa1, 0x20, 0x00, 0x98, 0xf5, 0x08, 0xff, + 0x5f, 0x00, 0x07, 0xa1, 0x20, 0x00, 0x98, 0xf5, 0x08, 0xff, 0xfd, 0x0f, 0xe4, 0xff, 0x80, 0x32, 0x80, 0x00, 0x00, 0x00, 0x17, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x65, 0x72, 0x65, 0xF0, 0x0D, diff --git a/src/util/serialize.cpp b/src/util/serialize.cpp index fd5cbda21..d770101f2 100644 --- a/src/util/serialize.cpp +++ b/src/util/serialize.cpp @@ -35,13 +35,13 @@ FloatType g_serialize_f32_type = FLOATTYPE_UNKNOWN; //// String //// -std::string serializeString(const std::string &plain) +std::string serializeString16(const std::string &plain) { std::string s; char buf[2]; if (plain.size() > STRING_MAX_LEN) - throw SerializationError("String too long for serializeString"); + throw SerializationError("String too long for serializeString16"); s.reserve(2 + plain.size()); writeU16((u8 *)&buf[0], plain.size()); @@ -51,14 +51,14 @@ std::string serializeString(const std::string &plain) return s; } -std::string deSerializeString(std::istream &is) +std::string deSerializeString16(std::istream &is) { std::string s; char buf[2]; is.read(buf, 2); if (is.gcount() != 2) - throw SerializationError("deSerializeString: size not read"); + throw SerializationError("deSerializeString16: size not read"); u16 s_size = readU16((u8 *)buf); if (s_size == 0) @@ -67,66 +67,17 @@ std::string deSerializeString(std::istream &is) s.resize(s_size); is.read(&s[0], s_size); if (is.gcount() != s_size) - throw SerializationError("deSerializeString: couldn't read all chars"); + throw SerializationError("deSerializeString16: couldn't read all chars"); return s; } -//// -//// Wide String -//// - -std::string serializeWideString(const std::wstring &plain) -{ - std::string s; - char buf[2]; - - if (plain.size() > WIDE_STRING_MAX_LEN) - throw SerializationError("String too long for serializeWideString"); - s.reserve(2 + 2 * plain.size()); - - writeU16((u8 *)buf, plain.size()); - s.append(buf, 2); - - for (wchar_t i : plain) { - writeU16((u8 *)buf, i); - s.append(buf, 2); - } - return s; -} - -std::wstring deSerializeWideString(std::istream &is) -{ - std::wstring s; - char buf[2]; - - is.read(buf, 2); - if (is.gcount() != 2) - throw SerializationError("deSerializeWideString: size not read"); - - u16 s_size = readU16((u8 *)buf); - if (s_size == 0) - return s; - - s.reserve(s_size); - for (u32 i = 0; i < s_size; i++) { - is.read(&buf[0], 2); - if (is.gcount() != 2) { - throw SerializationError( - "deSerializeWideString: couldn't read all chars"); - } - - wchar_t c16 = readU16((u8 *)buf); - s.append(&c16, 1); - } - return s; -} //// //// Long String //// -std::string serializeLongString(const std::string &plain) +std::string serializeString32(const std::string &plain) { std::string s; char buf[4]; @@ -141,7 +92,7 @@ std::string serializeLongString(const std::string &plain) return s; } -std::string deSerializeLongString(std::istream &is) +std::string deSerializeString32(std::istream &is) { std::string s; char buf[4]; diff --git a/src/util/serialize.h b/src/util/serialize.h index a988a8f78..b3ec28eab 100644 --- a/src/util/serialize.h +++ b/src/util/serialize.h @@ -440,16 +440,16 @@ MAKE_STREAM_WRITE_FXN(video::SColor, ARGB8, 4); //// // Creates a string with the length as the first two bytes -std::string serializeString(const std::string &plain); +std::string serializeString16(const std::string &plain); // Reads a string with the length as the first two bytes -std::string deSerializeString(std::istream &is); +std::string deSerializeString16(std::istream &is); // Creates a string with the length as the first four bytes -std::string serializeLongString(const std::string &plain); +std::string serializeString32(const std::string &plain); // Reads a string with the length as the first four bytes -std::string deSerializeLongString(std::istream &is); +std::string deSerializeString32(std::istream &is); // Creates a string encoded in JSON format (almost equivalent to a C string literal) std::string serializeJsonString(const std::string &plain); From 4b423ee9b12aabe6ccd6a8e7dbc7db1d89dc365b Mon Sep 17 00:00:00 2001 From: HybridDog <3192173+HybridDog@users.noreply.github.com> Date: Sat, 3 Oct 2020 18:33:43 +0200 Subject: [PATCH 085/177] Chatcommand: Show help message if func returns false without message #9440 --- builtin/game/chat.lua | 13 +++++++++++-- doc/lua_api.txt | 2 ++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/builtin/game/chat.lua b/builtin/game/chat.lua index 8131a6860..1d277730a 100644 --- a/builtin/game/chat.lua +++ b/builtin/game/chat.lua @@ -66,8 +66,17 @@ core.register_on_chat_message(function(name, message) local has_privs, missing_privs = core.check_player_privs(name, cmd_def.privs) if has_privs then core.set_last_run_mod(cmd_def.mod_origin) - local _, result = cmd_def.func(name, param) - if result then + local success, result = cmd_def.func(name, param) + if success == false and result == nil then + core.chat_send_player(name, "-!- Invalid command usage") + local help_def = core.registered_chatcommands["help"] + if help_def then + local _, helpmsg = help_def.func(name, cmd) + if helpmsg then + core.chat_send_player(name, helpmsg) + end + end + elseif result then core.chat_send_player(name, result) end else diff --git a/doc/lua_api.txt b/doc/lua_api.txt index bd845aad3..edacfe05f 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -7949,6 +7949,8 @@ Used by `minetest.register_chatcommand`. func = function(name, param), -- Called when command is run. Returns boolean success and text output. + -- Special case: The help message is shown to the player if `func` + -- returns false without a text output. } Note that in params, use of symbols is as follows: From 9dc29a75b416c6dab27ce93d0129383309cbf2c2 Mon Sep 17 00:00:00 2001 From: HybridDog <3192173+HybridDog@users.noreply.github.com> Date: Sat, 3 Oct 2020 18:33:51 +0200 Subject: [PATCH 086/177] Reduce the FPS when the window is unfocused (#8837) --- builtin/settingtypes.txt | 4 ++-- src/client/game.cpp | 7 ++++--- src/defaultsettings.cpp | 4 ++-- src/gui/guiEngine.cpp | 17 +++++++++-------- src/gui/guiEngine.h | 2 +- 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 6d9c6f573..7f2d12be5 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -606,8 +606,8 @@ arm_inertia (Arm inertia) bool true # to not waste CPU power for no benefit. fps_max (Maximum FPS) int 60 1 -# Maximum FPS when game is paused. -pause_fps_max (FPS in pause menu) int 20 1 +# Maximum FPS when the window is not focused, or when the game is paused. +fps_max_unfocused (FPS when unfocused or paused) int 20 1 # Open the pause menu when the window's focus is lost. Does not pause if a formspec is # open. diff --git a/src/client/game.cpp b/src/client/game.cpp index 920383aaf..8f9d51417 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -3996,9 +3996,10 @@ inline void Game::limitFps(FpsControl *fps_timings, f32 *dtime) else fps_timings->busy_time = 0; - u32 frametime_min = 1000 / (g_menumgr.pausesGame() - ? g_settings->getFloat("pause_fps_max") - : g_settings->getFloat("fps_max")); + u32 frametime_min = 1000 / ( + device->isWindowFocused() && !g_menumgr.pausesGame() + ? g_settings->getFloat("fps_max") + : g_settings->getFloat("fps_max_unfocused")); if (fps_timings->busy_time < frametime_min) { fps_timings->sleep_time = frametime_min - fps_timings->busy_time; diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 3a0b88dc2..8f5ed3e17 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -165,7 +165,7 @@ void set_default_settings(Settings *settings) settings->setDefault("tooltip_show_delay", "400"); settings->setDefault("tooltip_append_itemname", "false"); settings->setDefault("fps_max", "60"); - settings->setDefault("pause_fps_max", "20"); + settings->setDefault("fps_max_unfocused", "20"); settings->setDefault("viewing_range", "100"); #if ENABLE_GLES settings->setDefault("near_plane", "0.1"); @@ -477,7 +477,7 @@ void set_default_settings(Settings *settings) settings->setDefault("max_block_generate_distance", "5"); settings->setDefault("enable_3d_clouds", "false"); settings->setDefault("fps_max", "30"); - settings->setDefault("pause_fps_max", "10"); + settings->setDefault("fps_max_unfocused", "10"); settings->setDefault("max_objects_per_block", "20"); settings->setDefault("sqlite_synchronous", "1"); settings->setDefault("server_map_save_interval", "15"); diff --git a/src/gui/guiEngine.cpp b/src/gui/guiEngine.cpp index b40707d01..4a13f0b11 100644 --- a/src/gui/guiEngine.cpp +++ b/src/gui/guiEngine.cpp @@ -297,10 +297,14 @@ void GUIEngine::run() driver->endScene(); + IrrlichtDevice *device = RenderingEngine::get_raw_device(); + u32 frametime_min = 1000 / (device->isWindowFocused() + ? g_settings->getFloat("fps_max") + : g_settings->getFloat("fps_max_unfocused")); if (m_clouds_enabled) - cloudPostProcess(); + cloudPostProcess(frametime_min, device); else - sleep_ms(25); + sleep_ms(frametime_min); m_script->step(); @@ -367,9 +371,8 @@ void GUIEngine::cloudPreProcess() } /******************************************************************************/ -void GUIEngine::cloudPostProcess() +void GUIEngine::cloudPostProcess(u32 frametime_min, IrrlichtDevice *device) { - float fps_max = g_settings->getFloat("pause_fps_max"); // Time of frame without fps limit u32 busytime_u32; @@ -380,12 +383,10 @@ void GUIEngine::cloudPostProcess() else busytime_u32 = 0; - // FPS limiter - u32 frametime_min = 1000./fps_max; - + // FPS limit if (busytime_u32 < frametime_min) { u32 sleeptime = frametime_min - busytime_u32; - RenderingEngine::get_raw_device()->sleep(sleeptime); + device->sleep(sleeptime); } } diff --git a/src/gui/guiEngine.h b/src/gui/guiEngine.h index f9ad0fb0a..e5b3edce7 100644 --- a/src/gui/guiEngine.h +++ b/src/gui/guiEngine.h @@ -277,7 +277,7 @@ private: /** do preprocessing for cloud subsystem */ void cloudPreProcess(); /** do postprocessing for cloud subsystem */ - void cloudPostProcess(); + void cloudPostProcess(u32 frametime_min, IrrlichtDevice *device); /** internam data required for drawing clouds */ struct clouddata { From 07500479191ed927ab661b3758ffcd2fd43158c5 Mon Sep 17 00:00:00 2001 From: random-geek <35757396+random-geek@users.noreply.github.com> Date: Sat, 3 Oct 2020 09:34:34 -0700 Subject: [PATCH 087/177] Fix scroll bar overlapping text (again) (#9058) --- src/gui/guiEditBoxWithScrollbar.cpp | 4 +--- src/gui/intlGUIEditBox.cpp | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/gui/guiEditBoxWithScrollbar.cpp b/src/gui/guiEditBoxWithScrollbar.cpp index 442406688..169425a9a 100644 --- a/src/gui/guiEditBoxWithScrollbar.cpp +++ b/src/gui/guiEditBoxWithScrollbar.cpp @@ -1028,7 +1028,7 @@ void GUIEditBoxWithScrollBar::breakText() s32 last_line_start = 0; s32 size = Text.size(); s32 length = 0; - s32 el_width = RelativeRect.getWidth() - 6; + s32 el_width = RelativeRect.getWidth() - m_scrollbar_width - 10; wchar_t c; for (s32 i = 0; i < size; ++i) { @@ -1399,8 +1399,6 @@ void GUIEditBoxWithScrollBar::createVScrollBar() m_scrollbar_width = skin ? skin->getSize(gui::EGDS_SCROLLBAR_SIZE) : 16; - RelativeRect.LowerRightCorner.X -= m_scrollbar_width + 4; - irr::core::rect scrollbarrect = m_frame_rect; scrollbarrect.UpperLeftCorner.X += m_frame_rect.getWidth() - m_scrollbar_width; m_vscrollbar = new GUIScrollBar(Environment, getParent(), -1, diff --git a/src/gui/intlGUIEditBox.cpp b/src/gui/intlGUIEditBox.cpp index 10395423c..8be63fd6f 100644 --- a/src/gui/intlGUIEditBox.cpp +++ b/src/gui/intlGUIEditBox.cpp @@ -1165,7 +1165,7 @@ void intlGUIEditBox::breakText() s32 lastLineStart = 0; s32 size = Text.size(); s32 length = 0; - s32 elWidth = RelativeRect.getWidth() - 6; + s32 elWidth = RelativeRect.getWidth() - m_scrollbar_width - 10; wchar_t c; for (s32 i=0; i scrollbarrect = FrameRect; scrollbarrect.UpperLeftCorner.X += FrameRect.getWidth() - m_scrollbar_width; m_vscrollbar = new GUIScrollBar(Environment, getParent(), -1, From 7d3641021b755be133dea58404fcb039211fbe52 Mon Sep 17 00:00:00 2001 From: Elijah Duffy Date: Sat, 3 Oct 2020 09:38:08 -0700 Subject: [PATCH 088/177] Lua API: Add register_on_chatcommand to SSM and CSM (#7862) Allows catching a chatcommand call just after the command and the parameters are parsed but before its existence is checked and before the corresponding function is run. Returning `true` from a callback function will prevent default handling of the command leaving mods to handle the command manually. --- builtin/client/chatcommands.lua | 5 +++++ builtin/client/register.lua | 1 + builtin/game/chat.lua | 5 +++++ builtin/game/register.lua | 1 + clientmods/preview/init.lua | 4 ++++ doc/client_lua_api.txt | 5 +++++ doc/lua_api.txt | 5 +++++ games/devtest/mods/experimental/commands.lua | 3 +++ 8 files changed, 29 insertions(+) diff --git a/builtin/client/chatcommands.lua b/builtin/client/chatcommands.lua index 5cb1b40bb..0e8d4dd03 100644 --- a/builtin/client/chatcommands.lua +++ b/builtin/client/chatcommands.lua @@ -23,6 +23,11 @@ core.register_on_sending_chat_message(function(message) return true end + -- Run core.registered_on_chatcommand callbacks. + if core.run_callbacks(core.registered_on_chatcommand, 5, cmd, param) then + return true + end + local cmd_def = core.registered_chatcommands[cmd] if cmd_def then core.set_last_run_mod(cmd_def.mod_origin) diff --git a/builtin/client/register.lua b/builtin/client/register.lua index c1b4965c1..acd36ab36 100644 --- a/builtin/client/register.lua +++ b/builtin/client/register.lua @@ -63,6 +63,7 @@ core.registered_on_mods_loaded, core.register_on_mods_loaded = make_registration core.registered_on_shutdown, core.register_on_shutdown = make_registration() core.registered_on_receiving_chat_message, core.register_on_receiving_chat_message = make_registration() core.registered_on_sending_chat_message, core.register_on_sending_chat_message = make_registration() +core.registered_on_chatcommand, core.register_on_chatcommand = make_registration() core.registered_on_death, core.register_on_death = make_registration() core.registered_on_hp_modification, core.register_on_hp_modification = make_registration() core.registered_on_damage_taken, core.register_on_damage_taken = make_registration() diff --git a/builtin/game/chat.lua b/builtin/game/chat.lua index 1d277730a..945707623 100644 --- a/builtin/game/chat.lua +++ b/builtin/game/chat.lua @@ -58,6 +58,11 @@ core.register_on_chat_message(function(name, message) param = param or "" + -- Run core.registered_on_chatcommands callbacks. + if core.run_callbacks(core.registered_on_chatcommands, 5, name, cmd, param) then + return true + end + local cmd_def = core.registered_chatcommands[cmd] if not cmd_def then core.chat_send_player(name, "-!- Invalid command: " .. cmd) diff --git a/builtin/game/register.lua b/builtin/game/register.lua index 1034d4f2b..3de67c04b 100644 --- a/builtin/game/register.lua +++ b/builtin/game/register.lua @@ -584,6 +584,7 @@ core.unregister_biome = make_wrap_deregistration(core.register_biome, core.clear_registered_biomes, core.registered_biomes) core.registered_on_chat_messages, core.register_on_chat_message = make_registration() +core.registered_on_chatcommands, core.register_on_chatcommand = make_registration() core.registered_globalsteps, core.register_globalstep = make_registration() core.registered_playerevents, core.register_playerevent = make_registration() core.registered_on_mods_loaded, core.register_on_mods_loaded = make_registration() diff --git a/clientmods/preview/init.lua b/clientmods/preview/init.lua index 089955d2f..977ed0ec3 100644 --- a/clientmods/preview/init.lua +++ b/clientmods/preview/init.lua @@ -109,6 +109,10 @@ core.register_on_sending_chat_message(function(message) return false end) +core.register_on_chatcommand(function(command, params) + print("[PREVIEW] caught command '"..command.."'. Parameters: '"..params.."'") +end) + -- This is an example function to ensure it's working properly, should be removed before merge core.register_on_hp_modification(function(hp) print("[PREVIEW] HP modified " .. hp) diff --git a/doc/client_lua_api.txt b/doc/client_lua_api.txt index 4c5231b79..32be2fabf 100644 --- a/doc/client_lua_api.txt +++ b/doc/client_lua_api.txt @@ -686,6 +686,11 @@ Call these functions only at load time! * Adds definition to minetest.registered_chatcommands * `minetest.unregister_chatcommand(name)` * Unregisters a chatcommands registered with register_chatcommand. +* `minetest.register_on_chatcommand(function(command, params))` + * Called always when a chatcommand is triggered, before `minetest.registered_chatcommands` + is checked to see if that the command exists, but after the input is parsed. + * Return `true` to mark the command as handled, which means that the default + handlers will be prevented. * `minetest.register_on_death(function())` * Called when the local player dies * `minetest.register_on_hp_modification(function(hp))` diff --git a/doc/lua_api.txt b/doc/lua_api.txt index edacfe05f..e8eb403c4 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -4606,6 +4606,11 @@ Call these functions only at load time! * Called always when a player says something * Return `true` to mark the message as handled, which means that it will not be sent to other players. +* `minetest.register_on_chatcommand(function(name, command, params))` + * Called always when a chatcommand is triggered, before `minetest.registered_chatcommands` + is checked to see if the command exists, but after the input is parsed. + * Return `true` to mark the command as handled, which means that the default + handlers will be prevented. * `minetest.register_on_player_receive_fields(function(player, formname, fields))` * Called when the server received input from `player` in a formspec with the given `formname`. Specifically, this is called on any of the diff --git a/games/devtest/mods/experimental/commands.lua b/games/devtest/mods/experimental/commands.lua index 158e5039d..132b08b0b 100644 --- a/games/devtest/mods/experimental/commands.lua +++ b/games/devtest/mods/experimental/commands.lua @@ -214,3 +214,6 @@ minetest.register_chatcommand("test_place_nodes", { end, }) +core.register_on_chatcommand(function(name, command, params) + minetest.log("caught command '"..command.."', issued by '"..name.."'. Parameters: '"..params.."'") +end) From 962438717913498bc44ec98d37bccc7a4798bca2 Mon Sep 17 00:00:00 2001 From: LoneWolfHT Date: Sat, 3 Oct 2020 10:00:08 -0700 Subject: [PATCH 089/177] Add note to docs on how to override privileges (#9792) --- doc/lua_api.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index e8eb403c4..5d5e4b93a 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -5767,6 +5767,9 @@ Global tables * Map of registered tool definitions, indexed by name * `minetest.registered_entities` * Map of registered entity prototypes, indexed by name + * Values in this table may be modified directly. + Note: changes to initial properties will only affect entities spawned afterwards, + as they are only read when spawning. * `minetest.object_refs` * Map of object references, indexed by active object id * `minetest.luaentities` @@ -5797,6 +5800,7 @@ Global tables * Map of registered chat command definitions, indexed by name * `minetest.registered_privileges` * Map of registered privilege definitions, indexed by name + * Registered privileges can be modified directly in this table. ### Registered callback tables From 41a6136f774a30364b6d3fd2042c9dbeb34f2109 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 3 Oct 2020 19:01:38 +0200 Subject: [PATCH 090/177] Document builtin entities (#9453) This PR adds a new text file doc/builtin_entities.txt which explains how the two builtin entities __builtin:item and __builtin:falling_node work. --- doc/builtin_entities.txt | 101 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 doc/builtin_entities.txt diff --git a/doc/builtin_entities.txt b/doc/builtin_entities.txt new file mode 100644 index 000000000..be3f73357 --- /dev/null +++ b/doc/builtin_entities.txt @@ -0,0 +1,101 @@ +# Builtin Entities +Minetest registers two entities by default: Falling nodes and dropped items. +This document describes how they behave and what you can do with them. + +## Falling node (`__builtin:falling_node`) + +This entity is created by `minetest.check_for_falling` in place of a node +with the special group `falling_node=1`. Falling nodes can also be created +artificially with `minetest.spawn_falling_node`. + +Needs manual initialization when spawned using `/spawnentity`. + +Default behaviour: + +* Falls down in a straight line (gravity = `movement_gravity` setting) +* Collides with `walkable` node +* Collides with all physical objects except players +* If the node group `float=1` is set, it also collides with liquid nodes +* When it hits a solid (=`walkable`) node, it will try to place itself as a + node, replacing the node above. + * If the falling node cannot replace the destination node, it is dropped. + * If the destination node is a leveled node (`paramtype2="leveled"`) of the + same node name, the levels of both are summed. + +### Entity fields + +* `set_node(self, node[, meta])` + * Function to initialize the falling node + * `node` and `meta` are explained below. + * The `meta` argument is optional. +* `node`: Node table of the node (`name`, `param1`, `param2`) that this + entity represents. Read-only. +* `meta`: Node metadata of the falling node. Will be used when the falling + nodes tries to place itself as a node. Read-only. + +### Rendering / supported nodes + +Falling nodes have visuals to look as close as possible to the original node. +This works for most drawtypes, but there are limitations. + +Supported drawtypes: + +* `normal` +* `signlike` +* `torchlike` +* `nodebox` +* `raillike` +* `glasslike` +* `glasslike_framed` +* `glasslike_framed_optional` +* `allfaces` +* `allfaces_optional` +* `firelike` +* `mesh` +* `fencelike` +* `liquid` +* `airlike` (not pointable) + +Other drawtypes still kinda work, but they might look weird. + +Supported `paramtype2` values: + +* `wallmounted` +* `facedir` +* `colorwallmounted` +* `colorfacedir` +* `color` + +## Dropped item stack (`__builtin:item`) + +This is an item stack in a collectable form. + +Common cases that spawn a dropped item: + +* Item dropped by player +* The root node of a node with the group `attached_node=1` is removed +* `minetest.add_item` is called + +Needs manual initialization when spawned using `/spawnentity`. + +### Behavior + +* Players can collect it by punching +* Lifespan is defined by the setting `item_entity_ttl` +* Slides on `slippery` nodes +* Subject to gravity (uses `movement_gravity` setting) +* Collides with `walkable` nodes +* Does not collide physical objects +* When it's inside a solid (`walkable=true`) node, it tries to escape to a + neighboring non-solid (`walkable=false`) node + +### Entity fields + +* `set_item(self, item)`: + * Function to initialize the dropped item + * `item` (type `ItemStack`) specifies the item to represent +* `age`: Age in seconds. Behaviour according to the setting `item_entity_ttl` +* `itemstring`: Itemstring of the item that this item entity represents. + Read-only. + +Other fields are for internal use only. From 3250b37e32f264db04c1ca449d9feefc22fd38b7 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sun, 4 Oct 2020 00:33:45 +0100 Subject: [PATCH 091/177] Deprecate get_player_velocity and add_player_velocity (#10173) --- builtin/game/features.lua | 1 + doc/lua_api.txt | 31 +++++++------ src/script/lua_api/l_base.cpp | 5 +- src/script/lua_api/l_object.cpp | 82 +++++++++++++++------------------ src/script/lua_api/l_object.h | 6 --- 5 files changed, 58 insertions(+), 67 deletions(-) diff --git a/builtin/game/features.lua b/builtin/game/features.lua index a15475333..4d3c90ff0 100644 --- a/builtin/game/features.lua +++ b/builtin/game/features.lua @@ -17,6 +17,7 @@ core.features = { area_store_persistent_ids = true, pathfinder_works = true, object_step_has_moveresult = true, + direct_velocity_on_players = true, } function core.has_feature(arg) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 5d5e4b93a..c21da1871 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -4340,6 +4340,8 @@ Utilities pathfinder_works = true, -- Whether Collision info is available to an objects' on_step (5.3.0) object_step_has_moveresult = true, + -- Whether get_velocity() and add_velocity() can be used on players (5.4.0) + direct_velocity_on_players = true, } * `minetest.has_feature(arg)`: returns `boolean, missing_features` @@ -6118,6 +6120,19 @@ object you are working with still exists. * `get_pos()`: returns `{x=num, y=num, z=num}` * `set_pos(pos)`: `pos`=`{x=num, y=num, z=num}` +* `get_velocity()`: returns the velocity, a vector. +* `add_velocity(vel)` + * `vel` is a vector, e.g. `{x=0.0, y=2.3, z=1.0}` + * In comparison to using get_velocity, adding the velocity and then using + set_velocity, add_velocity is supposed to avoid synchronization problems. + Additionally, players also do not support set_velocity. + * If a player: + * Does not apply during free_move. + * Note that since the player speed is normalized at each move step, + increasing e.g. Y velocity beyond what would usually be achieved + (see: physics overrides) will cause existing X/Z velocity to be reduced. + * Example: `add_velocity({x=0, y=6.5, z=0})` is equivalent to + pressing the jump key (assuming default settings) * `move_to(pos, continuous=false)` * Does an interpolated move for Lua entities for visually smooth transitions. * If `continuous` is true, the Lua entity will not be moved to the current @@ -6189,11 +6204,6 @@ object you are working with still exists. no effect and returning `nil`. * `set_velocity(vel)` * `vel` is a vector, e.g. `{x=0.0, y=2.3, z=1.0}` -* `add_velocity(vel)` - * `vel` is a vector, e.g. `{x=0.0, y=2.3, z=1.0}` - * In comparison to using get_velocity, adding the velocity and then using - set_velocity, add_velocity is supposed to avoid synchronization problems. -* `get_velocity()`: returns the velocity, a vector * `set_acceleration(acc)` * `acc` is a vector * `get_acceleration()`: returns the acceleration, a vector @@ -6229,16 +6239,9 @@ object you are working with still exists. #### Player only (no-op for other objects) * `get_player_name()`: returns `""` if is not a player -* `get_player_velocity()`: returns `nil` if is not a player, otherwise a +* `get_player_velocity()`: **DEPRECATED**, use get_velocity() instead. table {x, y, z} representing the player's instantaneous velocity in nodes/s -* `add_player_velocity(vel)` - * Adds to player velocity, this happens client-side and only once. - * Does not apply during free_move. - * Note that since the player speed is normalized at each move step, - increasing e.g. Y velocity beyond what would usually be achieved - (see: physics overrides) will cause existing X/Z velocity to be reduced. - * Example: `add_player_velocity({x=0, y=6.5, z=0})` is equivalent to - pressing the jump key (assuming default settings) +* `add_player_velocity(vel)`: **DEPRECATED**, use add_velocity(vel) instead. * `get_look_dir()`: get camera direction as a unit vector * `get_look_vertical()`: pitch in radians * Angle ranges between -pi/2 and pi/2, which are straight up and down diff --git a/src/script/lua_api/l_base.cpp b/src/script/lua_api/l_base.cpp index 2bee09436..03ef5447a 100644 --- a/src/script/lua_api/l_base.cpp +++ b/src/script/lua_api/l_base.cpp @@ -170,10 +170,11 @@ void ModApiBase::markAliasDeprecated(luaL_Reg *reg) m_deprecated_wrappers.emplace( std::pair(reg->name, original_reg)); reg->func = l_deprecated_function; + } else { + last_func = reg->func; + last_name = reg->name; } - last_func = reg->func; - last_name = reg->name; ++reg; } } diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 24667e769..303b1175b 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -863,12 +863,21 @@ int ObjectRef::l_add_velocity(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (!co) + v3f vel = checkFloatPos(L, 2); + + ServerActiveObject *obj = getobject(ref); + if (obj == nullptr) return 0; - v3f pos = checkFloatPos(L, 2); - // Do it - co->addVelocity(pos); + + if (obj->getType() == ACTIVEOBJECT_TYPE_LUAENTITY) { + LuaEntitySAO *co = dynamic_cast(obj); + co->addVelocity(vel); + } else if (obj->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + PlayerSAO *player = dynamic_cast(obj); + player->setMaxSpeedOverride(vel); + getServer(L)->SendPlayerSpeed(player->getPeerID(), vel); + } + return 0; } @@ -877,11 +886,23 @@ int ObjectRef::l_get_velocity(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (co == NULL) return 0; - // Do it - v3f v = co->getVelocity(); - pushFloatPos(L, v); + + ServerActiveObject *obj = getobject(ref); + if (obj == nullptr) + return 0; + + if (obj->getType() == ACTIVEOBJECT_TYPE_LUAENTITY) { + LuaEntitySAO *co = dynamic_cast(obj); + v3f v = co->getVelocity(); + pushFloatPos(L, v); + return 1; + } else if (obj->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + RemotePlayer *player = dynamic_cast(obj)->getPlayer(); + push_v3f(L, player->getSpeed() / BS); + return 1; + } + + lua_pushnil(L); return 1; } @@ -1082,38 +1103,6 @@ int ObjectRef::l_get_player_name(lua_State *L) return 1; } -// get_player_velocity(self) -int ObjectRef::l_get_player_velocity(lua_State *L) -{ - NO_MAP_LOCK_REQUIRED; - ObjectRef *ref = checkobject(L, 1); - RemotePlayer *player = getplayer(ref); - if (player == NULL) { - lua_pushnil(L); - return 1; - } - // Do it - push_v3f(L, player->getSpeed() / BS); - return 1; -} - -// add_player_velocity(self, {x=num, y=num, z=num}) -int ObjectRef::l_add_player_velocity(lua_State *L) -{ - NO_MAP_LOCK_REQUIRED; - ObjectRef *ref = checkobject(L, 1); - v3f vel = checkFloatPos(L, 2); - - PlayerSAO *co = getplayersao(ref); - if (!co) - return 0; - - // Do it - co->setMaxSpeedOverride(vel); - getServer(L)->SendPlayerSpeed(co->getPeerID(), vel); - return 0; -} - // get_look_dir(self) int ObjectRef::l_get_look_dir(lua_State *L) { @@ -2288,10 +2277,14 @@ luaL_Reg ObjectRef::methods[] = { luamethod(ObjectRef, get_properties), luamethod(ObjectRef, set_nametag_attributes), luamethod(ObjectRef, get_nametag_attributes), - // LuaEntitySAO-only + luamethod_aliased(ObjectRef, set_velocity, setvelocity), luamethod(ObjectRef, add_velocity), + {"add_player_velocity", ObjectRef::l_add_velocity}, luamethod_aliased(ObjectRef, get_velocity, getvelocity), + {"get_player_velocity", ObjectRef::l_get_velocity}, + + // LuaEntitySAO-only luamethod_aliased(ObjectRef, set_acceleration, setacceleration), luamethod_aliased(ObjectRef, get_acceleration, getacceleration), luamethod_aliased(ObjectRef, set_yaw, setyaw), @@ -2307,8 +2300,7 @@ luaL_Reg ObjectRef::methods[] = { luamethod(ObjectRef, is_player), luamethod(ObjectRef, is_player_connected), luamethod(ObjectRef, get_player_name), - luamethod(ObjectRef, get_player_velocity), - luamethod(ObjectRef, add_player_velocity), + luamethod(ObjectRef, get_look_dir), luamethod(ObjectRef, get_look_pitch), luamethod(ObjectRef, get_look_yaw), diff --git a/src/script/lua_api/l_object.h b/src/script/lua_api/l_object.h index a75c59fd9..126719b1f 100644 --- a/src/script/lua_api/l_object.h +++ b/src/script/lua_api/l_object.h @@ -209,12 +209,6 @@ private: // get_player_name(self) static int l_get_player_name(lua_State *L); - // get_player_velocity(self) - static int l_get_player_velocity(lua_State *L); - - // add_player_velocity(self, {x=num, y=num, z=num}) - static int l_add_player_velocity(lua_State *L); - // get_fov(self) static int l_get_fov(lua_State *L); From 0f98b54aa4b2361575002d92b29fe222703ba557 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= <34514239+appgurueu@users.noreply.github.com> Date: Sun, 4 Oct 2020 15:09:12 +0200 Subject: [PATCH 092/177] Fix short 180 degree rotation when using set_bone_position (#10405) --- src/client/content_cao.cpp | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index 71a9d4b54..c1715a289 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -1460,24 +1460,17 @@ void GenericCAO::updateBonePosition() if (!bone) continue; - //If bone is manually positioned there is no need to perform the bug check - bool skip = false; - for (auto &it : m_bone_position) { - if (it.first == bone->getName()) { - skip = true; - break; - } - } - if (skip) - continue; - // Workaround for Irrlicht bug // We check each bone to see if it has been rotated ~180deg from its expected position due to a bug in Irricht // when using EJUOR_CONTROL joint control. If the bug is detected we update the bone to the proper position // and update the bones transformation. v3f bone_rot = bone->getRelativeTransformation().getRotationDegrees(); - float offset = fabsf(bone_rot.X - bone->getRotation().X); - if (offset > 179.9f && offset < 180.1f) { + float offset_X = fabsf(bone_rot.X - bone->getRotation().X); + float offset_Y = fabsf(bone_rot.Y - bone->getRotation().Y); + float offset_Z = fabsf(bone_rot.Z - bone->getRotation().Z); + if ((offset_X > 179.9f && offset_X < 180.1f) + || (offset_Y > 179.9f && offset_Y < 180.1f) + || (offset_Z > 179.9f && offset_Z < 180.1f)) { bone->setRotation(bone_rot); bone->updateAbsolutePosition(); } From 3068853e8a58ccc7370a5ce977c08223601c497a Mon Sep 17 00:00:00 2001 From: Jordan Snelling Date: Sun, 4 Oct 2020 14:10:34 +0100 Subject: [PATCH 093/177] Add First Person Attachments (#10360) Fixes some other third person camera specific attachments. Implements a single new flag for entities to be forced visible in first person mode. Old mods do not need to be updated to use the new flag and are fully backwards compatible. --- doc/lua_api.txt | 8 +++-- src/activeobject.h | 4 +-- src/client/content_cao.cpp | 56 +++++++++++++++++++++++++++++---- src/client/content_cao.h | 8 +++++ src/client/game.cpp | 3 +- src/clientiface.cpp | 5 +-- src/script/lua_api/l_camera.cpp | 3 +- src/script/lua_api/l_object.cpp | 14 ++++++--- src/server/luaentity_sao.cpp | 4 +-- src/server/player_sao.cpp | 9 +++--- src/server/unit_sao.cpp | 17 +++++----- src/server/unit_sao.h | 5 +-- 12 files changed, 101 insertions(+), 35 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index c21da1871..77fb4a654 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -6167,12 +6167,14 @@ object you are working with still exists. `frame_loop`. * `set_animation_frame_speed(frame_speed)` * `frame_speed`: number, default: `15.0` -* `set_attach(parent, bone, position, rotation)` +* `set_attach(parent, bone, position, rotation, forced_visible)` * `bone`: string * `position`: `{x=num, y=num, z=num}` (relative) * `rotation`: `{x=num, y=num, z=num}` = Rotation on each axis, in degrees -* `get_attach()`: returns parent, bone, position, rotation or nil if it isn't - attached. + * `forced_visible`: Boolean to control whether the attached entity + should appear in first person. +* `get_attach()`: returns parent, bone, position, rotation, forced_visible, + or nil if it isn't attached. * `set_detach()` * `set_bone_position(bone, position, rotation)` * `bone`: string diff --git a/src/activeobject.h b/src/activeobject.h index 85e160d10..0829858ad 100644 --- a/src/activeobject.h +++ b/src/activeobject.h @@ -120,9 +120,9 @@ public: virtual void setAttachment(int parent_id, const std::string &bone, v3f position, - v3f rotation) {} + v3f rotation, bool force_visible) {} virtual void getAttachment(int *parent_id, std::string *bone, v3f *position, - v3f *rotation) const {} + v3f *rotation, bool *force_visible) const {} virtual void clearChildAttachments() {} virtual void clearParentAttachment() {} virtual void addAttachmentChild(int child_id) {} diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index c1715a289..fae06554a 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -456,7 +456,8 @@ void GenericCAO::setChildrenVisible(bool toset) for (u16 cao_id : m_attachment_child_ids) { GenericCAO *obj = m_env->getGenericCAO(cao_id); if (obj) { - obj->setVisible(toset); + // Check if the entity is forced to appear in first person. + obj->setVisible(obj->isForcedVisible() ? true : toset); } } } @@ -477,8 +478,6 @@ void GenericCAO::setAttachment(int parent_id, const std::string &bone, v3f posit if (parent) parent->addAttachmentChild(m_id); } - - updateAttachments(); } @@ -498,7 +497,7 @@ void GenericCAO::clearChildAttachments() int child_id = *m_attachment_child_ids.begin(); if (ClientActiveObject *child = m_env->getActiveObject(child_id)) - child->setAttachment(0, "", v3f(), v3f()); + child->setAttachment(0, "", v3f(), v3f(), false); removeAttachmentChild(child_id); } @@ -800,6 +799,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc) updateBonePosition(); updateAttachments(); setNodeLight(m_last_light); + updateMeshCulling(); } void GenericCAO::updateLight(u32 day_night_ratio) @@ -1411,6 +1411,9 @@ void GenericCAO::updateTextures(std::string mod) setMeshColor(mesh, m_prop.colors[0]); } } + // Prevent showing the player after changing texture + if (m_is_local_player) + updateMeshCulling(); } void GenericCAO::updateAnimation() @@ -1739,12 +1742,25 @@ void GenericCAO::processMessage(const std::string &data) std::string bone = deSerializeString16(is); v3f position = readV3F32(is); v3f rotation = readV3F32(is); + m_force_visible = readU8(is); // Returns false for EOF setAttachment(parent_id, bone, position, rotation); + // Forcibly show attachments if required by set_attach + if (m_force_visible) + m_is_visible = true; // localplayer itself can't be attached to localplayer - if (!m_is_local_player) - m_is_visible = !m_attached_to_local; + else if (!m_is_local_player) { + // Objects attached to the local player should be hidden in first + // person provided the forced boolean isn't set. + m_is_visible = !m_attached_to_local || + m_client->getCamera()->getCameraMode() != CAMERA_MODE_FIRST; + m_force_visible = false; + } else { + // Local players need to have this set, + // otherwise first person attachments fail. + m_is_visible = true; + } } else if (cmd == AO_CMD_PUNCHED) { u16 result_hp = readU16(is); @@ -1858,5 +1874,33 @@ std::string GenericCAO::debugInfoText() return os.str(); } +void GenericCAO::updateMeshCulling() +{ + if (!m_is_local_player) + return; + + // Grab the active player scene node so we know there's + // at least a mesh to occlude from the camera. + irr::scene::ISceneNode *node = getSceneNode(); + if (!node) + return; + + if (m_client->getCamera()->getCameraMode() == CAMERA_MODE_FIRST) { + // Hide the mesh by culling both front and + // back faces. Serious hackyness but it works for our + // purposes. This also preserves the skeletal armature. + node->setMaterialFlag(video::EMF_BACK_FACE_CULLING, + true); + node->setMaterialFlag(video::EMF_FRONT_FACE_CULLING, + true); + } else { + // Restore mesh visibility. + node->setMaterialFlag(video::EMF_BACK_FACE_CULLING, + m_prop.backface_culling); + node->setMaterialFlag(video::EMF_FRONT_FACE_CULLING, + false); + } +} + // Prototype GenericCAO proto_GenericCAO(NULL, NULL); diff --git a/src/client/content_cao.h b/src/client/content_cao.h index 974ff9a1e..daf697767 100644 --- a/src/client/content_cao.h +++ b/src/client/content_cao.h @@ -124,6 +124,7 @@ private: float m_step_distance_counter = 0.0f; u8 m_last_light = 255; bool m_is_visible = false; + bool m_force_visible = false; s8 m_glow = 0; // Material video::E_MATERIAL_TYPE m_material_type; @@ -215,6 +216,11 @@ public: m_is_visible = toset; } + inline bool isForcedVisible() const + { + return m_force_visible; + } + void setChildrenVisible(bool toset); void setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation); void getAttachment(int *parent_id, std::string *bone, v3f *position, @@ -275,4 +281,6 @@ public: { return m_prop.infotext; } + + void updateMeshCulling(); }; diff --git a/src/client/game.cpp b/src/client/game.cpp index 8f9d51417..366464467 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -2950,7 +2950,8 @@ void Game::updateCamera(u32 busy_time, f32 dtime) camera->toggleCameraMode(); - playercao->setVisible(camera->getCameraMode() > CAMERA_MODE_FIRST); + // Make the player visible depending on camera mode. + playercao->updateMeshCulling(); playercao->setChildrenVisible(camera->getCameraMode() > CAMERA_MODE_FIRST); } diff --git a/src/clientiface.cpp b/src/clientiface.cpp index 602a44c90..28a0ee770 100644 --- a/src/clientiface.cpp +++ b/src/clientiface.cpp @@ -80,10 +80,11 @@ LuaEntitySAO *getAttachedObject(PlayerSAO *sao, ServerEnvironment *env) int id; std::string bone; v3f dummy; - sao->getAttachment(&id, &bone, &dummy, &dummy); + bool force_visible; + sao->getAttachment(&id, &bone, &dummy, &dummy, &force_visible); ServerActiveObject *ao = env->getActiveObject(id); while (id && ao) { - ao->getAttachment(&id, &bone, &dummy, &dummy); + ao->getAttachment(&id, &bone, &dummy, &dummy, &force_visible); if (id) ao = env->getActiveObject(id); } diff --git a/src/script/lua_api/l_camera.cpp b/src/script/lua_api/l_camera.cpp index bfa60be67..40251154c 100644 --- a/src/script/lua_api/l_camera.cpp +++ b/src/script/lua_api/l_camera.cpp @@ -63,7 +63,8 @@ int LuaCamera::l_set_camera_mode(lua_State *L) return 0; camera->setCameraMode((CameraMode)((int)lua_tonumber(L, 2))); - playercao->setVisible(camera->getCameraMode() > CAMERA_MODE_FIRST); + // Make the player visible depending on camera mode. + playercao->updateMeshCulling(); playercao->setChildrenVisible(camera->getCameraMode() > CAMERA_MODE_FIRST); return 0; } diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 303b1175b..fead4e849 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -664,7 +664,7 @@ int ObjectRef::l_get_bone_position(lua_State *L) return 2; } -// set_attach(self, parent, bone, position, rotation) +// set_attach(self, parent, bone, position, rotation, force_visible) int ObjectRef::l_set_attach(lua_State *L) { GET_ENV_PTR; @@ -687,7 +687,8 @@ int ObjectRef::l_set_attach(lua_State *L) std::string bone; v3f position = v3f(0, 0, 0); v3f rotation = v3f(0, 0, 0); - co->getAttachment(&parent_id, &bone, &position, &rotation); + bool force_visible; + co->getAttachment(&parent_id, &bone, &position, &rotation, &force_visible); if (parent_id) { ServerActiveObject *old_parent = env->getActiveObject(parent_id); old_parent->removeAttachmentChild(co->getId()); @@ -702,7 +703,8 @@ int ObjectRef::l_set_attach(lua_State *L) rotation = v3f(0, 0, 0); if (!lua_isnil(L, 5)) rotation = read_v3f(L, 5); - co->setAttachment(parent->getId(), bone, position, rotation); + force_visible = readParam(L, 6, false); + co->setAttachment(parent->getId(), bone, position, rotation, force_visible); parent->addAttachmentChild(co->getId()); return 0; } @@ -722,7 +724,8 @@ int ObjectRef::l_get_attach(lua_State *L) std::string bone; v3f position = v3f(0, 0, 0); v3f rotation = v3f(0, 0, 0); - co->getAttachment(&parent_id, &bone, &position, &rotation); + bool force_visible; + co->getAttachment(&parent_id, &bone, &position, &rotation, &force_visible); if (!parent_id) return 0; ServerActiveObject *parent = env->getActiveObject(parent_id); @@ -731,7 +734,8 @@ int ObjectRef::l_get_attach(lua_State *L) lua_pushlstring(L, bone.c_str(), bone.size()); push_v3f(L, position); push_v3f(L, rotation); - return 4; + lua_pushboolean(L, force_visible); + return 5; } // set_detach(self) diff --git a/src/server/luaentity_sao.cpp b/src/server/luaentity_sao.cpp index f20914f7f..b39797531 100644 --- a/src/server/luaentity_sao.cpp +++ b/src/server/luaentity_sao.cpp @@ -238,9 +238,9 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version) msg_os << serializeString32(generateUpdateAnimationCommand()); // 3 for (const auto &bone_pos : m_bone_position) { msg_os << serializeString32(generateUpdateBonePositionCommand( - bone_pos.first, bone_pos.second.X, bone_pos.second.Y)); // m_bone_position.size + bone_pos.first, bone_pos.second.X, bone_pos.second.Y)); // 3 + N } - msg_os << serializeString32(generateUpdateAttachmentCommand()); // 4 + msg_os << serializeString32(generateUpdateAttachmentCommand()); // 4 + m_bone_position.size int message_count = 4 + m_bone_position.size(); diff --git a/src/server/player_sao.cpp b/src/server/player_sao.cpp index 8d4938c3c..344d18a20 100644 --- a/src/server/player_sao.cpp +++ b/src/server/player_sao.cpp @@ -122,10 +122,10 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version) msg_os << serializeString32(generateUpdateAnimationCommand()); // 3 for (const auto &bone_pos : m_bone_position) { msg_os << serializeString32(generateUpdateBonePositionCommand( - bone_pos.first, bone_pos.second.X, bone_pos.second.Y)); // m_bone_position.size + bone_pos.first, bone_pos.second.X, bone_pos.second.Y)); // 3 + N } - msg_os << serializeString32(generateUpdateAttachmentCommand()); // 4 - msg_os << serializeString32(generateUpdatePhysicsOverrideCommand()); // 5 + msg_os << serializeString32(generateUpdateAttachmentCommand()); // 4 + m_bone_position.size + msg_os << serializeString32(generateUpdatePhysicsOverrideCommand()); // 5 + m_bone_position.size int message_count = 5 + m_bone_position.size(); @@ -569,7 +569,8 @@ bool PlayerSAO::checkMovementCheat() int parent_id; std::string bone; v3f attachment_rot; - getAttachment(&parent_id, &bone, &attachment_pos, &attachment_rot); + bool force_visible; + getAttachment(&parent_id, &bone, &attachment_pos, &attachment_rot, &force_visible); } v3f parent_pos = parent->getBasePosition(); diff --git a/src/server/unit_sao.cpp b/src/server/unit_sao.cpp index d906e885e..2371640ca 100644 --- a/src/server/unit_sao.cpp +++ b/src/server/unit_sao.cpp @@ -121,8 +121,8 @@ void UnitSAO::sendOutdatedData() } // clang-format on -void UnitSAO::setAttachment( - int parent_id, const std::string &bone, v3f position, v3f rotation) +void UnitSAO::setAttachment(int parent_id, const std::string &bone, v3f position, + v3f rotation, bool force_visible) { // Attachments need to be handled on both the server and client. // If we just attach on the server, we can only copy the position of the parent. @@ -137,6 +137,7 @@ void UnitSAO::setAttachment( m_attachment_bone = bone; m_attachment_position = position; m_attachment_rotation = rotation; + m_force_visible = force_visible; m_attachment_sent = false; if (parent_id != old_parent) { @@ -145,13 +146,14 @@ void UnitSAO::setAttachment( } } -void UnitSAO::getAttachment( - int *parent_id, std::string *bone, v3f *position, v3f *rotation) const +void UnitSAO::getAttachment(int *parent_id, std::string *bone, v3f *position, + v3f *rotation, bool *force_visible) const { *parent_id = m_attachment_parent_id; *bone = m_attachment_bone; *position = m_attachment_position; *rotation = m_attachment_rotation; + *force_visible = m_force_visible; } void UnitSAO::clearChildAttachments() @@ -159,7 +161,7 @@ void UnitSAO::clearChildAttachments() for (int child_id : m_attachment_child_ids) { // Child can be NULL if it was deleted earlier if (ServerActiveObject *child = m_env->getActiveObject(child_id)) - child->setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0)); + child->setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0), false); } m_attachment_child_ids.clear(); } @@ -169,9 +171,9 @@ void UnitSAO::clearParentAttachment() ServerActiveObject *parent = nullptr; if (m_attachment_parent_id) { parent = m_env->getActiveObject(m_attachment_parent_id); - setAttachment(0, "", m_attachment_position, m_attachment_rotation); + setAttachment(0, "", m_attachment_position, m_attachment_rotation, false); } else { - setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0)); + setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0), false); } // Do it if (parent) @@ -245,6 +247,7 @@ std::string UnitSAO::generateUpdateAttachmentCommand() const os << serializeString16(m_attachment_bone); writeV3F32(os, m_attachment_position); writeV3F32(os, m_attachment_rotation); + writeU8(os, m_force_visible); return os.str(); } diff --git a/src/server/unit_sao.h b/src/server/unit_sao.h index 3cb7f0ad5..a21e055c5 100644 --- a/src/server/unit_sao.h +++ b/src/server/unit_sao.h @@ -64,9 +64,9 @@ public: ServerActiveObject *getParent() const; inline bool isAttached() const { return getParent(); } void setAttachment(int parent_id, const std::string &bone, v3f position, - v3f rotation); + v3f rotation, bool force_visible); void getAttachment(int *parent_id, std::string *bone, v3f *position, - v3f *rotation) const; + v3f *rotation, bool *force_visible) const; void clearChildAttachments(); void clearParentAttachment(); void addAttachmentChild(int child_id); @@ -133,4 +133,5 @@ private: v3f m_attachment_position; v3f m_attachment_rotation; bool m_attachment_sent = false; + bool m_force_visible = false; }; From 81c66d6efb9fb0ab8a03b40e2bc22aa49eff9a04 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Rollo Date: Sun, 4 Oct 2020 15:24:29 +0200 Subject: [PATCH 094/177] Minimap as HUD element with API control Features: * Define Minimap available modes (surface/radar, scale) from Lua, using player:set_minimap_modes() * New HUD elements for displaying minimap with custom size and placing * New minimap mode for displaying a texture instead of the map --- doc/lua_api.txt | 33 +++- src/client/client.cpp | 1 + src/client/client.h | 1 + src/client/game.cpp | 75 ++++----- src/client/hud.cpp | 30 +++- src/client/hud.h | 2 + src/client/mapblock_mesh.cpp | 2 +- src/client/minimap.cpp | 237 +++++++++++++++++++++------- src/client/minimap.h | 41 ++--- src/hud.cpp | 1 + src/hud.h | 13 +- src/network/clientopcodes.cpp | 1 + src/network/clientpackethandler.cpp | 44 +++++- src/network/networkprotocol.h | 14 +- src/network/serveropcodes.cpp | 1 + src/script/lua_api/l_minimap.cpp | 24 +-- src/script/lua_api/l_object.cpp | 62 ++++++++ src/script/lua_api/l_object.h | 3 + src/server.cpp | 17 ++ src/server.h | 12 ++ 20 files changed, 470 insertions(+), 144 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 77fb4a654..9e9af20da 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -1484,6 +1484,15 @@ Displays an image oriented or translated according to current heading direction. If translation is chosen, texture is repeated horizontally to fill the whole element. +### `minimap` + +Displays a minimap on the HUD. + +* `size`: Size of the minimap to display. Minimap should be a square to avoid + distortion. +* `alignment`: The alignment of the minimap. +* `offset`: offset in pixels from position. + Representations of simple things ================================ @@ -6366,6 +6375,27 @@ object you are working with still exists. * `hud_set_hotbar_selected_image(texturename)` * sets image for selected item of hotbar * `hud_get_hotbar_selected_image`: returns texturename +* `set_minimap_modes({mode, mode, ...}, selected_mode)` + * Overrides the available minimap modes (and toggle order), and changes the + selected mode. + * `mode` is a table consisting of up to four fields: + * `type`: Available type: + * `off`: Minimap off + * `surface`: Minimap in surface mode + * `radar`: Minimap in radar mode + * `texture`: Texture to be displayed instead of terrain map + (texture is centered around 0,0 and can be scaled). + Texture size is limited to 512 x 512 pixel. + * `label`: Optional label to display on minimap mode toggle + The translation must be handled within the mod. + * `size`: Sidelength or diameter, in number of nodes, of the terrain + displayed in minimap + * `texture`: Only for texture type, name of the texture to display + * `scale`: Only for texture type, scale of the texture map in nodes per + pixel (for example a `scale` of 2 means each pixel represents a 2x2 + nodes square) + * `selected_mode` is the mode index to be selected after modes have been changed + (0 is the first mode). * `set_sky(parameters)` * `parameters` is a table with the following optional fields: * `base_color`: ColorSpec, changes fog in "skybox" and "plain". @@ -8047,7 +8077,8 @@ Used by `Player:hud_add`. Returned by `Player:hud_get`. { hud_elem_type = "image", -- See HUD element types - -- Type of element, can be "image", "text", "statbar", "inventory" or "compass" + -- Type of element, can be "image", "text", "statbar", "inventory", + -- "compass" or "minimap" position = {x=0.5, y=0.5}, -- Left corner position of element diff --git a/src/client/client.cpp b/src/client/client.cpp index d6e529c40..7fafe0da9 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -129,6 +129,7 @@ Client::Client( if (g_settings->getBool("enable_minimap")) { m_minimap = new Minimap(this); } + m_cache_save_interval = g_settings->getU16("server_map_save_interval"); } diff --git a/src/client/client.h b/src/client/client.h index 733634db1..8f4aac6e3 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -223,6 +223,7 @@ public: void handleCommand_CSMRestrictionFlags(NetworkPacket *pkt); void handleCommand_PlayerSpeed(NetworkPacket *pkt); void handleCommand_MediaPush(NetworkPacket *pkt); + void handleCommand_MinimapModes(NetworkPacket *pkt); void ProcessData(NetworkPacket *pkt); diff --git a/src/client/game.cpp b/src/client/game.cpp index 366464467..54e0c9f20 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -1416,11 +1416,9 @@ bool Game::createClient(const GameStartData &start_data) } mapper = client->getMinimap(); - if (mapper) { - mapper->setMinimapMode(MINIMAP_MODE_OFF); - if (client->modsLoaded()) - client->getScript()->on_minimap_ready(mapper); - } + + if (mapper && client->modsLoaded()) + client->getScript()->on_minimap_ready(mapper); return true; } @@ -2222,52 +2220,37 @@ void Game::toggleMinimap(bool shift_pressed) if (!mapper || !m_game_ui->m_flags.show_hud || !g_settings->getBool("enable_minimap")) return; - if (shift_pressed) { + if (shift_pressed) mapper->toggleMinimapShape(); - return; - } + else + mapper->nextMode(); + // TODO: When legacy minimap is deprecated, keep only HUD minimap stuff here + + // Not so satisying code to keep compatibility with old fixed mode system + // --> u32 hud_flags = client->getEnv().getLocalPlayer()->hud_flags; - MinimapMode mode = MINIMAP_MODE_OFF; - if (hud_flags & HUD_FLAG_MINIMAP_VISIBLE) { - mode = mapper->getMinimapMode(); - mode = (MinimapMode)((int)mode + 1); - // If radar is disabled and in, or switching to, radar mode - if (!(hud_flags & HUD_FLAG_MINIMAP_RADAR_VISIBLE) && mode > 3) - mode = MINIMAP_MODE_OFF; - } + if (!(hud_flags & HUD_FLAG_MINIMAP_VISIBLE)) { + m_game_ui->m_flags.show_minimap = false; + } else { - m_game_ui->m_flags.show_minimap = true; - switch (mode) { - case MINIMAP_MODE_SURFACEx1: - m_game_ui->showTranslatedStatusText("Minimap in surface mode, Zoom x1"); - break; - case MINIMAP_MODE_SURFACEx2: - m_game_ui->showTranslatedStatusText("Minimap in surface mode, Zoom x2"); - break; - case MINIMAP_MODE_SURFACEx4: - m_game_ui->showTranslatedStatusText("Minimap in surface mode, Zoom x4"); - break; - case MINIMAP_MODE_RADARx1: - m_game_ui->showTranslatedStatusText("Minimap in radar mode, Zoom x1"); - break; - case MINIMAP_MODE_RADARx2: - m_game_ui->showTranslatedStatusText("Minimap in radar mode, Zoom x2"); - break; - case MINIMAP_MODE_RADARx4: - m_game_ui->showTranslatedStatusText("Minimap in radar mode, Zoom x4"); - break; - default: - mode = MINIMAP_MODE_OFF; - m_game_ui->m_flags.show_minimap = false; - if (hud_flags & HUD_FLAG_MINIMAP_VISIBLE) - m_game_ui->showTranslatedStatusText("Minimap hidden"); - else - m_game_ui->showTranslatedStatusText("Minimap currently disabled by game or mod"); - } + // If radar is disabled, try to find a non radar mode or fall back to 0 + if (!(hud_flags & HUD_FLAG_MINIMAP_RADAR_VISIBLE)) + while (mapper->getModeIndex() && + mapper->getModeDef().type == MINIMAP_TYPE_RADAR) + mapper->nextMode(); - mapper->setMinimapMode(mode); + m_game_ui->m_flags.show_minimap = mapper->getModeDef().type != + MINIMAP_TYPE_OFF; + } + // <-- + // End of 'not so satifying code' + if ((hud_flags & HUD_FLAG_MINIMAP_VISIBLE) || + (hud && hud->hasElementOfType(HUD_ELEM_MINIMAP))) + m_game_ui->showStatusText(utf8_to_wide(mapper->getModeDef().label)); + else + m_game_ui->showTranslatedStatusText("Minimap currently disabled by game or mod"); } void Game::toggleFog() @@ -3954,7 +3937,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, /* Update minimap pos and rotation */ - if (mapper && m_game_ui->m_flags.show_minimap && m_game_ui->m_flags.show_hud) { + if (mapper && m_game_ui->m_flags.show_hud) { mapper->setPos(floatToInt(player->getPosition(), BS)); mapper->setAngle(player->getYaw()); } diff --git a/src/client/hud.cpp b/src/client/hud.cpp index d3038230c..f6497fe25 100644 --- a/src/client/hud.cpp +++ b/src/client/hud.cpp @@ -36,6 +36,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mesh.h" #include "wieldmesh.h" #include "client/renderingengine.h" +#include "client/minimap.h" #ifdef HAVE_TOUCHSCREENGUI #include "gui/touchscreengui.h" @@ -297,6 +298,18 @@ void Hud::drawItems(v2s32 upperleftpos, v2s32 screen_offset, s32 itemcount, } } +bool Hud::hasElementOfType(HudElementType type) +{ + for (size_t i = 0; i != player->maxHudId(); i++) { + HudElement *e = player->getHud(i); + if (!e) + continue; + if (e->type == type) + return true; + } + return false; +} + // Calculates screen position of waypoint. Returns true if waypoint is visible (in front of the player), else false. bool Hud::calculateScreenPos(const v3s16 &camera_offset, HudElement *e, v2s32 *pos) { @@ -491,7 +504,22 @@ void Hud::drawLuaElements(const v3s16 &camera_offset) default: break; } - + break; } + case HUD_ELEM_MINIMAP: { + if (e->size.X <= 0 || e->size.Y <= 0) + break; + if (!client->getMinimap()) + break; + // Draw a minimap of size "size" + v2s32 dstsize(e->size.X * m_scale_factor, + e->size.Y * m_scale_factor); + // (no percent size as minimap would likely be anamorphosed) + v2s32 offset((e->align.X - 1.0) * dstsize.X / 2, + (e->align.Y - 1.0) * dstsize.Y / 2); + core::rect rect(0, 0, dstsize.X, dstsize.Y); + rect += pos + offset + v2s32(e->offset.X * m_scale_factor, + e->offset.Y * m_scale_factor); + client->getMinimap()->drawMinimap(rect); break; } default: infostream << "Hud::drawLuaElements: ignoring drawform " << e->type << diff --git a/src/client/hud.h b/src/client/hud.h index cf83cb16e..d46545d71 100644 --- a/src/client/hud.h +++ b/src/client/hud.h @@ -81,6 +81,8 @@ public: m_selected_face_normal = face_normal; } + bool hasElementOfType(HudElementType type); + void drawLuaElements(const v3s16 &camera_offset); private: diff --git a/src/client/mapblock_mesh.cpp b/src/client/mapblock_mesh.cpp index 2f96ca61f..b59679523 100644 --- a/src/client/mapblock_mesh.cpp +++ b/src/client/mapblock_mesh.cpp @@ -1044,7 +1044,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): m_use_tangent_vertices = data->m_use_tangent_vertices; m_enable_vbo = g_settings->getBool("enable_vbo"); - if (g_settings->getBool("enable_minimap")) { + if (data->m_client->getMinimap()) { m_minimap_mapblock = new MinimapMapblock; m_minimap_mapblock->getMinimapNodes( &data->m_vmanip, data->m_blockpos * MAP_BLOCKSIZE); diff --git a/src/client/minimap.cpp b/src/client/minimap.cpp index 68770ec19..6bae408b4 100644 --- a/src/client/minimap.cpp +++ b/src/client/minimap.cpp @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "shader.h" #include "mapblock.h" #include "client/renderingengine.h" - +#include "gettext.h" //// //// MinimapUpdateThread @@ -108,8 +108,11 @@ void MinimapUpdateThread::doUpdate() } } - if (data->map_invalidated && data->mode != MINIMAP_MODE_OFF) { - getMap(data->pos, data->map_size, data->scan_height); + + if (data->map_invalidated && ( + data->mode.type == MINIMAP_TYPE_RADAR || + data->mode.type == MINIMAP_TYPE_SURFACE)) { + getMap(data->pos, data->mode.map_size, data->mode.scan_height); data->map_invalidated = false; } } @@ -181,19 +184,26 @@ Minimap::Minimap(Client *client) this->m_ndef = client->getNodeDefManager(); m_angle = 0.f; + m_current_mode_index = 0; // Initialize static settings m_enable_shaders = g_settings->getBool("enable_shaders"); m_surface_mode_scan_height = g_settings->getBool("minimap_double_scan_height") ? 256 : 128; + // Initialize minimap modes + addMode(MINIMAP_TYPE_OFF); + addMode(MINIMAP_TYPE_SURFACE, 256); + addMode(MINIMAP_TYPE_SURFACE, 128); + addMode(MINIMAP_TYPE_SURFACE, 64); + addMode(MINIMAP_TYPE_RADAR, 512); + addMode(MINIMAP_TYPE_RADAR, 256); + addMode(MINIMAP_TYPE_RADAR, 128); + // Initialize minimap data data = new MinimapData; - data->mode = MINIMAP_MODE_OFF; - data->is_radar = false; - data->map_invalidated = true; - data->texture = NULL; - data->heightmap_texture = NULL; + data->map_invalidated = true; + data->minimap_shape_round = g_settings->getBool("minimap_shape_round"); // Get round minimap textures @@ -215,6 +225,8 @@ Minimap::Minimap(Client *client) // Create object marker texture data->object_marker_red = m_tsrc->getTexture("object_marker_red.png"); + setModeIndex(0); + // Create mesh buffer for minimap m_meshbuffer = getMinimapMeshBuffer(); @@ -280,29 +292,101 @@ MinimapShape Minimap::getMinimapShape() return MINIMAP_SHAPE_SQUARE; } -void Minimap::setMinimapMode(MinimapMode mode) +void Minimap::setModeIndex(size_t index) { - static const MinimapModeDef modedefs[MINIMAP_MODE_COUNT] = { - {false, 0, 0}, - {false, m_surface_mode_scan_height, 256}, - {false, m_surface_mode_scan_height, 128}, - {false, m_surface_mode_scan_height, 64}, - {true, 32, 128}, - {true, 32, 64}, - {true, 32, 32} - }; - - if (mode >= MINIMAP_MODE_COUNT) - return; - MutexAutoLock lock(m_mutex); - data->is_radar = modedefs[mode].is_radar; - data->scan_height = modedefs[mode].scan_height; - data->map_size = modedefs[mode].map_size; - data->mode = mode; + if (index < m_modes.size()) { + data->mode = m_modes[index]; + m_current_mode_index = index; + } else { + data->mode = MinimapModeDef{MINIMAP_TYPE_OFF, N_("Minimap hidden"), 0, 0, ""}; + m_current_mode_index = 0; + } - m_minimap_update_thread->deferUpdate(); + data->map_invalidated = true; + + if (m_minimap_update_thread) + m_minimap_update_thread->deferUpdate(); +} + +void Minimap::addMode(MinimapModeDef mode) +{ + // Check validity + if (mode.type == MINIMAP_TYPE_TEXTURE) { + if (mode.texture.empty()) + return; + if (mode.scale < 1) + mode.scale = 1; + } + + int zoom = -1; + + // Build a default standard label + if (mode.label == "") { + switch (mode.type) { + case MINIMAP_TYPE_OFF: + mode.label = N_("Minimap hidden"); + break; + case MINIMAP_TYPE_SURFACE: + mode.label = N_("Minimap in surface mode, Zoom x%d"); + if (mode.map_size > 0) + zoom = 256 / mode.map_size; + break; + case MINIMAP_TYPE_RADAR: + mode.label = N_("Minimap in radar mode, Zoom x%d"); + if (mode.map_size > 0) + zoom = 512 / mode.map_size; + break; + case MINIMAP_TYPE_TEXTURE: + mode.label = N_("Minimap in texture mode"); + break; + default: + break; + } + } + + if (zoom >= 0) { + char label_buf[1024]; + porting::mt_snprintf(label_buf, sizeof(label_buf), + mode.label.c_str(), zoom); + mode.label = label_buf; + } + + m_modes.push_back(mode); +} + +void Minimap::addMode(MinimapType type, u16 size, std::string label, + std::string texture, u16 scale) +{ + MinimapModeDef mode; + mode.type = type; + mode.label = label; + mode.map_size = size; + mode.texture = texture; + mode.scale = scale; + switch (type) { + case MINIMAP_TYPE_SURFACE: + mode.scan_height = m_surface_mode_scan_height; + break; + case MINIMAP_TYPE_RADAR: + mode.scan_height = 32; + break; + default: + mode.scan_height = 0; + } + addMode(mode); +} + +void Minimap::nextMode() +{ + if (m_modes.empty()) + return; + m_current_mode_index++; + if (m_current_mode_index >= m_modes.size()) + m_current_mode_index = 0; + + setModeIndex(m_current_mode_index); } void Minimap::setPos(v3s16 pos) @@ -331,16 +415,16 @@ void Minimap::setAngle(f32 angle) void Minimap::blitMinimapPixelsToImageRadar(video::IImage *map_image) { video::SColor c(240, 0, 0, 0); - for (s16 x = 0; x < data->map_size; x++) - for (s16 z = 0; z < data->map_size; z++) { - MinimapPixel *mmpixel = &data->minimap_scan[x + z * data->map_size]; + for (s16 x = 0; x < data->mode.map_size; x++) + for (s16 z = 0; z < data->mode.map_size; z++) { + MinimapPixel *mmpixel = &data->minimap_scan[x + z * data->mode.map_size]; if (mmpixel->air_count > 0) c.setGreen(core::clamp(core::round32(32 + mmpixel->air_count * 8), 0, 255)); else c.setGreen(0); - map_image->setPixel(x, data->map_size - z - 1, c); + map_image->setPixel(x, data->mode.map_size - z - 1, c); } } @@ -349,9 +433,9 @@ void Minimap::blitMinimapPixelsToImageSurface( { // This variable creation/destruction has a 1% cost on rendering minimap video::SColor tilecolor; - for (s16 x = 0; x < data->map_size; x++) - for (s16 z = 0; z < data->map_size; z++) { - MinimapPixel *mmpixel = &data->minimap_scan[x + z * data->map_size]; + for (s16 x = 0; x < data->mode.map_size; x++) + for (s16 z = 0; z < data->mode.map_size; z++) { + MinimapPixel *mmpixel = &data->minimap_scan[x + z * data->mode.map_size]; const ContentFeatures &f = m_ndef->get(mmpixel->n); const TileDef *tile = &f.tiledef[0]; @@ -367,10 +451,10 @@ void Minimap::blitMinimapPixelsToImageSurface( tilecolor.setBlue(tilecolor.getBlue() * f.minimap_color.getBlue() / 255); tilecolor.setAlpha(240); - map_image->setPixel(x, data->map_size - z - 1, tilecolor); + map_image->setPixel(x, data->mode.map_size - z - 1, tilecolor); u32 h = mmpixel->height; - heightmap_image->setPixel(x,data->map_size - z - 1, + heightmap_image->setPixel(x,data->mode.map_size - z - 1, video::SColor(255, h, h, h)); } } @@ -378,21 +462,46 @@ void Minimap::blitMinimapPixelsToImageSurface( video::ITexture *Minimap::getMinimapTexture() { // update minimap textures when new scan is ready - if (data->map_invalidated) + if (data->map_invalidated && data->mode.type != MINIMAP_TYPE_TEXTURE) return data->texture; // create minimap and heightmap images in memory - core::dimension2d dim(data->map_size, data->map_size); + core::dimension2d dim(data->mode.map_size, data->mode.map_size); video::IImage *map_image = driver->createImage(video::ECF_A8R8G8B8, dim); video::IImage *heightmap_image = driver->createImage(video::ECF_A8R8G8B8, dim); video::IImage *minimap_image = driver->createImage(video::ECF_A8R8G8B8, core::dimension2d(MINIMAP_MAX_SX, MINIMAP_MAX_SY)); // Blit MinimapPixels to images - if (data->is_radar) - blitMinimapPixelsToImageRadar(map_image); - else + switch(data->mode.type) { + case MINIMAP_TYPE_OFF: + break; + case MINIMAP_TYPE_SURFACE: blitMinimapPixelsToImageSurface(map_image, heightmap_image); + break; + case MINIMAP_TYPE_RADAR: + blitMinimapPixelsToImageRadar(map_image); + break; + case MINIMAP_TYPE_TEXTURE: + // Want to use texture source, to : 1 find texture, 2 cache it + video::ITexture* texture = m_tsrc->getTexture(data->mode.texture); + video::IImage* image = driver->createImageFromData( + texture->getColorFormat(), texture->getSize(), texture->lock(), true, false); + texture->unlock(); + + auto dim = image->getDimension(); + + map_image->fill(video::SColor(255, 0, 0, 0)); + + image->copyTo(map_image, + irr::core::vector2d { + ((data->mode.map_size - (static_cast(dim.Width))) >> 1) + - data->pos.X / data->mode.scale, + ((data->mode.map_size - (static_cast(dim.Height))) >> 1) + + data->pos.Z / data->mode.scale + }); + image->drop(); + } map_image->copyToScaling(minimap_image); map_image->drop(); @@ -461,21 +570,31 @@ scene::SMeshBuffer *Minimap::getMinimapMeshBuffer() void Minimap::drawMinimap() { + // Non hud managed minimap drawing (legacy minimap) + v2u32 screensize = RenderingEngine::get_instance()->getWindowSize(); + const u32 size = 0.25 * screensize.Y; + + drawMinimap(core::rect( + screensize.X - size - 10, 10, + screensize.X - 10, size + 10)); +} + +void Minimap::drawMinimap(core::rect rect) { + video::ITexture *minimap_texture = getMinimapTexture(); if (!minimap_texture) return; + if (data->mode.type == MINIMAP_TYPE_OFF) + return; + updateActiveMarkers(); - v2u32 screensize = RenderingEngine::get_instance()->getWindowSize(); - const u32 size = 0.25 * screensize.Y; core::rect oldViewPort = driver->getViewPort(); core::matrix4 oldProjMat = driver->getTransform(video::ETS_PROJECTION); core::matrix4 oldViewMat = driver->getTransform(video::ETS_VIEW); - driver->setViewPort(core::rect( - screensize.X - size - 10, 10, - screensize.X - 10, size + 10)); + driver->setViewPort(rect); driver->setTransform(video::ETS_PROJECTION, core::matrix4()); driver->setTransform(video::ETS_VIEW, core::matrix4()); @@ -488,7 +607,7 @@ void Minimap::drawMinimap() material.TextureLayer[0].Texture = minimap_texture; material.TextureLayer[1].Texture = data->heightmap_texture; - if (m_enable_shaders && !data->is_radar) { + if (m_enable_shaders && data->mode.type == MINIMAP_TYPE_SURFACE) { u16 sid = m_shdrsrc->getShader("minimap_shader", 1, 1); material.MaterialType = m_shdrsrc->getShaderInfo(sid).material; } else { @@ -529,14 +648,14 @@ void Minimap::drawMinimap() driver->setViewPort(oldViewPort); // Draw player markers - v2s32 s_pos(screensize.X - size - 10, 10); + v2s32 s_pos(rect.UpperLeftCorner.X, rect.UpperLeftCorner.Y); core::dimension2di imgsize(data->object_marker_red->getOriginalSize()); core::rect img_rect(0, 0, imgsize.Width, imgsize.Height); static const video::SColor col(255, 255, 255, 255); static const video::SColor c[4] = {col, col, col, col}; f32 sin_angle = std::sin(m_angle * core::DEGTORAD); f32 cos_angle = std::cos(m_angle * core::DEGTORAD); - s32 marker_size2 = 0.025 * (float)size; + s32 marker_size2 = 0.025 * (float)rect.getWidth();; for (std::list::const_iterator i = m_active_markers.begin(); i != m_active_markers.end(); ++i) { @@ -547,8 +666,8 @@ void Minimap::drawMinimap() posf.X = t1; posf.Y = t2; } - posf.X = (posf.X + 0.5) * (float)size; - posf.Y = (posf.Y + 0.5) * (float)size; + posf.X = (posf.X + 0.5) * (float)rect.getWidth(); + posf.Y = (posf.Y + 0.5) * (float)rect.getHeight(); core::rect dest_rect( s_pos.X + posf.X - marker_size2, s_pos.Y + posf.Y - marker_size2, @@ -571,16 +690,16 @@ void Minimap::updateActiveMarkers() for (Nametag *nametag : nametags) { v3s16 pos = floatToInt(nametag->parent_node->getAbsolutePosition() + intToFloat(client->getCamera()->getOffset(), BS), BS); - pos -= data->pos - v3s16(data->map_size / 2, - data->scan_height / 2, - data->map_size / 2); - if (pos.X < 0 || pos.X > data->map_size || - pos.Y < 0 || pos.Y > data->scan_height || - pos.Z < 0 || pos.Z > data->map_size) { + pos -= data->pos - v3s16(data->mode.map_size / 2, + data->mode.scan_height / 2, + data->mode.map_size / 2); + if (pos.X < 0 || pos.X > data->mode.map_size || + pos.Y < 0 || pos.Y > data->mode.scan_height || + pos.Z < 0 || pos.Z > data->mode.map_size) { continue; } - pos.X = ((float)pos.X / data->map_size) * MINIMAP_MAX_SX; - pos.Z = ((float)pos.Z / data->map_size) * MINIMAP_MAX_SY; + pos.X = ((float)pos.X / data->mode.map_size) * MINIMAP_MAX_SX; + pos.Z = ((float)pos.Z / data->mode.map_size) * MINIMAP_MAX_SY; const video::SColor &mask_col = minimap_mask->getPixel(pos.X, pos.Z); if (!mask_col.getAlpha()) { continue; diff --git a/src/client/minimap.h b/src/client/minimap.h index 258d5330d..11374b116 100644 --- a/src/client/minimap.h +++ b/src/client/minimap.h @@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #pragma once +#include "../hud.h" #include "irrlichttypes_extrabloated.h" #include "util/thread.h" #include "voxel.h" @@ -33,26 +34,18 @@ class IShaderSource; #define MINIMAP_MAX_SX 512 #define MINIMAP_MAX_SY 512 -enum MinimapMode { - MINIMAP_MODE_OFF, - MINIMAP_MODE_SURFACEx1, - MINIMAP_MODE_SURFACEx2, - MINIMAP_MODE_SURFACEx4, - MINIMAP_MODE_RADARx1, - MINIMAP_MODE_RADARx2, - MINIMAP_MODE_RADARx4, - MINIMAP_MODE_COUNT, -}; - enum MinimapShape { MINIMAP_SHAPE_SQUARE, MINIMAP_SHAPE_ROUND, }; struct MinimapModeDef { - bool is_radar; + MinimapType type; + std::string label; u16 scan_height; u16 map_size; + std::string texture; + u16 scale; }; struct MinimapPixel { @@ -69,12 +62,9 @@ struct MinimapMapblock { }; struct MinimapData { - bool is_radar; - MinimapMode mode; + MinimapModeDef mode; v3s16 pos; v3s16 old_pos; - u16 scan_height; - u16 map_size; MinimapPixel minimap_scan[MINIMAP_MAX_SX * MINIMAP_MAX_SY]; bool map_invalidated; bool minimap_shape_round; @@ -127,12 +117,22 @@ public: v3s16 getPos() const { return data->pos; } void setAngle(f32 angle); f32 getAngle() const { return m_angle; } - void setMinimapMode(MinimapMode mode); - MinimapMode getMinimapMode() const { return data->mode; } void toggleMinimapShape(); void setMinimapShape(MinimapShape shape); MinimapShape getMinimapShape(); + void clearModes() { m_modes.clear(); }; + void addMode(MinimapModeDef mode); + void addMode(MinimapType type, u16 size = 0, std::string label = "", + std::string texture = "", u16 scale = 1); + + void setModeIndex(size_t index); + size_t getModeIndex() const { return m_current_mode_index; }; + size_t getMaxModeIndex() const { return m_modes.size() - 1; }; + void nextMode(); + + void setModesFromString(std::string modes_string); + MinimapModeDef getModeDef() const { return data->mode; } video::ITexture *getMinimapTexture(); @@ -144,6 +144,7 @@ public: void updateActiveMarkers(); void drawMinimap(); + void drawMinimap(core::rect rect); video::IVideoDriver *driver; Client* client; @@ -153,9 +154,11 @@ private: ITextureSource *m_tsrc; IShaderSource *m_shdrsrc; const NodeDefManager *m_ndef; - MinimapUpdateThread *m_minimap_update_thread; + MinimapUpdateThread *m_minimap_update_thread = nullptr; scene::SMeshBuffer *m_meshbuffer; bool m_enable_shaders; + std::vector m_modes; + size_t m_current_mode_index; u16 m_surface_mode_scan_height; f32 m_angle; std::mutex m_mutex; diff --git a/src/hud.cpp b/src/hud.cpp index 175701342..1791e04df 100644 --- a/src/hud.cpp +++ b/src/hud.cpp @@ -29,6 +29,7 @@ const struct EnumString es_HudElementType[] = {HUD_ELEM_WAYPOINT, "waypoint"}, {HUD_ELEM_IMAGE_WAYPOINT, "image_waypoint"}, {HUD_ELEM_COMPASS, "compass"}, + {HUD_ELEM_MINIMAP, "minimap"}, {0, NULL}, }; diff --git a/src/hud.h b/src/hud.h index 0a6993c1b..a0613ae98 100644 --- a/src/hud.h +++ b/src/hud.h @@ -51,7 +51,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #define HUD_HOTBAR_ITEMCOUNT_DEFAULT 8 #define HUD_HOTBAR_ITEMCOUNT_MAX 32 - #define HOTBAR_IMAGE_SIZE 48 enum HudElementType { @@ -61,7 +60,8 @@ enum HudElementType { HUD_ELEM_INVENTORY = 3, HUD_ELEM_WAYPOINT = 4, HUD_ELEM_IMAGE_WAYPOINT = 5, - HUD_ELEM_COMPASS = 6 + HUD_ELEM_COMPASS = 6, + HUD_ELEM_MINIMAP = 7 }; enum HudElementStat { @@ -108,3 +108,12 @@ extern const EnumString es_HudElementType[]; extern const EnumString es_HudElementStat[]; extern const EnumString es_HudBuiltinElement[]; +// Minimap stuff + +enum MinimapType { + MINIMAP_TYPE_OFF, + MINIMAP_TYPE_SURFACE, + MINIMAP_TYPE_RADAR, + MINIMAP_TYPE_TEXTURE, +}; + diff --git a/src/network/clientopcodes.cpp b/src/network/clientopcodes.cpp index f812a08a1..55cfdd4dc 100644 --- a/src/network/clientopcodes.cpp +++ b/src/network/clientopcodes.cpp @@ -122,6 +122,7 @@ const ToClientCommandHandler toClientCommandTable[TOCLIENT_NUM_MSG_TYPES] = null_command_handler, { "TOCLIENT_SRP_BYTES_S_B", TOCLIENT_STATE_NOT_CONNECTED, &Client::handleCommand_SrpBytesSandB }, // 0x60 { "TOCLIENT_FORMSPEC_PREPEND", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_FormspecPrepend }, // 0x61, + { "TOCLIENT_MINIMAP_MODES", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_MinimapModes }, // 0x62, }; const static ServerCommandFactory null_command_factory = { "TOSERVER_NULL", 0, false }; diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp index 5683564a0..65db02300 100644 --- a/src/network/clientpackethandler.cpp +++ b/src/network/clientpackethandler.cpp @@ -1164,15 +1164,24 @@ void Client::handleCommand_HudSetFlags(NetworkPacket* pkt) m_minimap_disabled_by_server = !(player->hud_flags & HUD_FLAG_MINIMAP_VISIBLE); bool m_minimap_radar_disabled_by_server = !(player->hud_flags & HUD_FLAG_MINIMAP_RADAR_VISIBLE); + // Not so satisying code to keep compatibility with old fixed mode system + // --> + // Hide minimap if it has been disabled by the server if (m_minimap && m_minimap_disabled_by_server && was_minimap_visible) // defers a minimap update, therefore only call it if really // needed, by checking that minimap was visible before - m_minimap->setMinimapMode(MINIMAP_MODE_OFF); + m_minimap->setModeIndex(0); - // Switch to surface mode if radar disabled by server - if (m_minimap && m_minimap_radar_disabled_by_server && was_minimap_radar_visible) - m_minimap->setMinimapMode(MINIMAP_MODE_SURFACEx1); + // If radar has been disabled, try to find a non radar mode or fall back to 0 + if (m_minimap && m_minimap_radar_disabled_by_server + && was_minimap_radar_visible) { + while (m_minimap->getModeIndex() > 0 && + m_minimap->getModeDef().type == MINIMAP_TYPE_RADAR) + m_minimap->nextMode(); + } + // <-- + // End of 'not so satifying code' } void Client::handleCommand_HudSetParam(NetworkPacket* pkt) @@ -1611,3 +1620,30 @@ void Client::handleCommand_ModChannelSignal(NetworkPacket *pkt) if (valid_signal) m_script->on_modchannel_signal(channel, signal); } + +void Client::handleCommand_MinimapModes(NetworkPacket *pkt) +{ + u16 count; // modes + u16 mode; // wanted current mode index after change + + *pkt >> count >> mode; + + if (m_minimap) + m_minimap->clearModes(); + + for (size_t index = 0; index < count; index++) { + u16 type; + std::string label; + u16 size; + std::string texture; + u16 scale; + + *pkt >> type >> label >> size >> texture >> scale; + + if (m_minimap) + m_minimap->addMode(MinimapType(type), size, label, texture, scale); + } + + if (m_minimap) + m_minimap->setModeIndex(mode); +} diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h index 05600cda9..666e75e45 100644 --- a/src/network/networkprotocol.h +++ b/src/network/networkprotocol.h @@ -204,6 +204,7 @@ with this program; if not, write to the Free Software Foundation, Inc., PROTOCOL VERSION 39: Updated set_sky packet Adds new sun, moon and stars packets + Minimap modes */ #define LATEST_PROTOCOL_VERSION 39 @@ -764,7 +765,18 @@ enum ToClientCommand u8[len] formspec */ - TOCLIENT_NUM_MSG_TYPES = 0x62, + TOCLIENT_MINIMAP_MODES = 0x62, + /* + u16 count // modes + u16 mode // wanted current mode index after change + for each mode + u16 type + std::string label + u16 size + std::string extra + */ + + TOCLIENT_NUM_MSG_TYPES = 0x63, }; enum ToServerCommand diff --git a/src/network/serveropcodes.cpp b/src/network/serveropcodes.cpp index 2fc3197c2..aea5d7174 100644 --- a/src/network/serveropcodes.cpp +++ b/src/network/serveropcodes.cpp @@ -221,4 +221,5 @@ const ClientCommandFactory clientCommandFactoryTable[TOCLIENT_NUM_MSG_TYPES] = null_command_factory, // 0x5f { "TOSERVER_SRP_BYTES_S_B", 0, true }, // 0x60 { "TOCLIENT_FORMSPEC_PREPEND", 0, true }, // 0x61 + { "TOCLIENT_MINIMAP_MODES", 0, true }, // 0x62 }; diff --git a/src/script/lua_api/l_minimap.cpp b/src/script/lua_api/l_minimap.cpp index 5fba76eb8..3bbb6e5e3 100644 --- a/src/script/lua_api/l_minimap.cpp +++ b/src/script/lua_api/l_minimap.cpp @@ -89,7 +89,7 @@ int LuaMinimap::l_get_mode(lua_State *L) LuaMinimap *ref = checkobject(L, 1); Minimap *m = getobject(ref); - lua_pushinteger(L, m->getMinimapMode()); + lua_pushinteger(L, m->getModeIndex()); return 1; } @@ -98,13 +98,11 @@ int LuaMinimap::l_set_mode(lua_State *L) LuaMinimap *ref = checkobject(L, 1); Minimap *m = getobject(ref); - s32 mode = lua_tointeger(L, 2); - if (mode < MINIMAP_MODE_OFF || - mode >= MINIMAP_MODE_COUNT) { + u32 mode = lua_tointeger(L, 2); + if (mode >= m->getMaxModeIndex()) return 0; - } - m->setMinimapMode((MinimapMode) mode); + m->setModeIndex(mode); return 1; } @@ -140,8 +138,11 @@ int LuaMinimap::l_show(lua_State *L) LuaMinimap *ref = checkobject(L, 1); Minimap *m = getobject(ref); - if (m->getMinimapMode() == MINIMAP_MODE_OFF) - m->setMinimapMode(MINIMAP_MODE_SURFACEx1); + // This is not very adapted to new minimap mode management. Btw, tried + // to do something compatible. + + if (m->getModeIndex() == 0 && m->getMaxModeIndex() > 0) + m->setModeIndex(1); client->showMinimap(true); return 1; @@ -155,8 +156,11 @@ int LuaMinimap::l_hide(lua_State *L) LuaMinimap *ref = checkobject(L, 1); Minimap *m = getobject(ref); - if (m->getMinimapMode() != MINIMAP_MODE_OFF) - m->setMinimapMode(MINIMAP_MODE_OFF); + // This is not very adapted to new minimap mode management. Btw, tried + // to do something compatible. + + if (m->getModeIndex() != 0) + m->setModeIndex(0); client->showMinimap(false); return 1; diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index fead4e849..57ed7e2cd 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -2199,6 +2199,67 @@ int ObjectRef::l_get_day_night_ratio(lua_State *L) return 1; } +// set_minimap_modes(self, modes, modeindex) +int ObjectRef::l_set_minimap_modes(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + + // Arg 1 should be a player + ObjectRef *ref = checkobject(L, 1); + RemotePlayer *player = getplayer(ref); + if (player == NULL) + return 0; + + // Arg 2 should be a table (of tables) + if (!lua_istable(L, 2)) { + return 0; + } + + // Arg 3 should be a number + s16 wantedmode = lua_tonumber(L, 3); + + std::vector modes; + + lua_pushnil(L); + while (lua_next(L, 2) != 0) { + /* key is at index -2, value is at index -1 */ + if (lua_istable(L, -1)) { + bool ok = true; + MinimapMode mode; + std::string type = getstringfield_default(L, -1, "type", ""); + if (type == "off") + mode.type = MINIMAP_TYPE_OFF; + else if (type == "surface") + mode.type = MINIMAP_TYPE_SURFACE; + else if (type == "radar") + mode.type = MINIMAP_TYPE_RADAR; + else if (type == "texture") { + mode.type = MINIMAP_TYPE_TEXTURE; + mode.texture = getstringfield_default(L, -1, "texture", ""); + mode.scale = getintfield_default(L, -1, "scale", 1); + } else { + warningstream << "Minimap mode of unknown type \"" << type.c_str() + << "\" ignored.\n" << std::endl; + ok = false; + } + + if (ok) { + mode.label = getstringfield_default(L, -1, "label", ""); + // Size is limited to 512. Performance gets poor if size too large, and + // segfaults have been experienced. + mode.size = rangelim(getintfield_default(L, -1, "size", 0), 1, 512); + modes.push_back(mode); + } + } + /* removes 'value'; keeps 'key' for next iteration */ + lua_pop(L, 1); + } + lua_pop(L, 1); // Remove key + + getServer(L)->SendMinimapModes(player->getPeerId(), modes, wantedmode); + return 0; +} + ObjectRef::ObjectRef(ServerActiveObject *object): m_object(object) { @@ -2359,5 +2420,6 @@ luaL_Reg ObjectRef::methods[] = { luamethod(ObjectRef, set_eye_offset), luamethod(ObjectRef, get_eye_offset), luamethod(ObjectRef, send_mapblock), + luamethod(ObjectRef, set_minimap_modes), {0,0} }; diff --git a/src/script/lua_api/l_object.h b/src/script/lua_api/l_object.h index 126719b1f..ca03dfa2e 100644 --- a/src/script/lua_api/l_object.h +++ b/src/script/lua_api/l_object.h @@ -377,4 +377,7 @@ private: // send_mapblock(pos) static int l_send_mapblock(lua_State *L); + + // set_minimap_modes(self, modes, wanted_mode) + static int l_set_minimap_modes(lua_State *L); }; diff --git a/src/server.cpp b/src/server.cpp index 982f904f4..8f6257afe 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2662,6 +2662,23 @@ void Server::sendRequestedMedia(session_t peer_id, } } +void Server::SendMinimapModes(session_t peer_id, + std::vector &modes, size_t wanted_mode) +{ + RemotePlayer *player = m_env->getPlayer(peer_id); + assert(player); + if (player->getPeerId() == PEER_ID_INEXISTENT) + return; + + NetworkPacket pkt(TOCLIENT_MINIMAP_MODES, 0, peer_id); + pkt << (u16)modes.size() << (u16)wanted_mode; + + for (auto &mode : modes) + pkt << (u16)mode.type << mode.label << mode.size << mode.texture << mode.scale; + + Send(&pkt); +} + void Server::sendDetachedInventory(Inventory *inventory, const std::string &name, session_t peer_id) { NetworkPacket pkt(TOCLIENT_DETACHED_INVENTORY, 0, peer_id); diff --git a/src/server.h b/src/server.h index 258d75eaf..4b3ac5cf7 100644 --- a/src/server.h +++ b/src/server.h @@ -118,6 +118,14 @@ struct ServerPlayingSound std::unordered_set clients; // peer ids }; +struct MinimapMode { + MinimapType type = MINIMAP_TYPE_OFF; + std::string label; + u16 size = 0; + std::string texture; + u16 scale = 1; +}; + class Server : public con::PeerHandler, public MapEventReceiver, public IGameDef { @@ -331,6 +339,10 @@ public: void SendPlayerSpeed(session_t peer_id, const v3f &added_vel); void SendPlayerFov(session_t peer_id); + void SendMinimapModes(session_t peer_id, + std::vector &modes, + size_t wanted_mode); + void sendDetachedInventories(session_t peer_id, bool incremental); virtual bool registerModStorage(ModMetadata *storage); From f46509d5e2c681b6da2abdeb27779be3c36a6916 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Mon, 5 Oct 2020 09:07:33 +0200 Subject: [PATCH 095/177] Remove unused functions reported by cppcheck (#10463) Run unused functions reported by cppcheck This change removes a few (but not all) unused functions. Some unused helper functions were not removed due to their complexity and potential of future use. --- src/chat.cpp | 15 ++--- src/chat.h | 2 - src/client/client.cpp | 5 -- src/client/client.h | 1 - src/client/clientenvironment.cpp | 15 ----- src/client/clientmap.cpp | 2 +- src/client/mapblock_mesh.cpp | 27 --------- src/client/mapblock_mesh.h | 5 -- src/content/CMakeLists.txt | 1 - src/content/packages.cpp | 69 ---------------------- src/content/packages.h | 52 ---------------- src/gui/guiChatConsole.cpp | 5 -- src/gui/guiChatConsole.h | 4 -- src/log.cpp | 11 +--- src/log.h | 10 ---- src/map.cpp | 63 +------------------- src/map.h | 21 +------ src/mapgen/mapgen.cpp | 33 ----------- src/mapgen/mapgen.h | 7 +-- src/mapgen/mapgen_v6.cpp | 6 -- src/mapgen/mapgen_v6.h | 1 - src/mapgen/treegen.cpp | 13 ---- src/mapgen/treegen.h | 2 - src/network/networkpacket.cpp | 7 --- src/network/networkpacket.h | 1 - src/script/common/c_converter.cpp | 45 -------------- src/script/common/c_converter.h | 2 - src/script/lua_api/l_mainmenu.cpp | 1 - src/unittest/test_map_settings_manager.cpp | 28 +-------- 29 files changed, 14 insertions(+), 440 deletions(-) delete mode 100644 src/content/packages.cpp delete mode 100644 src/content/packages.h diff --git a/src/chat.cpp b/src/chat.cpp index c3ed59804..2f65e68b3 100644 --- a/src/chat.cpp +++ b/src/chat.cpp @@ -123,16 +123,16 @@ void ChatBuffer::deleteByAge(f32 maxAge) deleteOldest(count); } -u32 ChatBuffer::getColumns() const -{ - return m_cols; -} - u32 ChatBuffer::getRows() const { return m_rows; } +void ChatBuffer::scrollTop() +{ + m_scroll = getTopScrollPos(); +} + void ChatBuffer::reformat(u32 cols, u32 rows) { if (cols == 0 || rows == 0) @@ -220,11 +220,6 @@ void ChatBuffer::scrollBottom() m_scroll = getBottomScrollPos(); } -void ChatBuffer::scrollTop() -{ - m_scroll = getTopScrollPos(); -} - u32 ChatBuffer::formatChatLine(const ChatLine& line, u32 cols, std::vector& destination) const { diff --git a/src/chat.h b/src/chat.h index f84ece206..0b98e4d3c 100644 --- a/src/chat.h +++ b/src/chat.h @@ -94,8 +94,6 @@ public: // Delete lines older than maxAge. void deleteByAge(f32 maxAge); - // Get number of columns, 0 if reformat has not been called yet. - u32 getColumns() const; // Get number of rows, 0 if reformat has not been called yet. u32 getRows() const; // Update console size and reformat all formatted lines. diff --git a/src/client/client.cpp b/src/client/client.cpp index 7fafe0da9..0bd98b256 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -1665,11 +1665,6 @@ ClientEvent *Client::getClientEvent() return event; } -bool Client::connectedToServer() -{ - return m_con->Connected(); -} - const Address Client::getServerAddress() { return m_con->GetPeerAddress(PEER_ID_SERVER); diff --git a/src/client/client.h b/src/client/client.h index 8f4aac6e3..bffdc7ec6 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -338,7 +338,6 @@ public: u16 getProtoVersion() { return m_proto_ver; } - bool connectedToServer(); void confirmRegistration(); bool m_is_registration_confirmation_state = false; bool m_simple_singleplayer_mode; diff --git a/src/client/clientenvironment.cpp b/src/client/clientenvironment.cpp index 0b7e92325..f831978a8 100644 --- a/src/client/clientenvironment.cpp +++ b/src/client/clientenvironment.cpp @@ -368,21 +368,6 @@ bool isFreeClientActiveObjectId(const u16 id, } -u16 getFreeClientActiveObjectId(ClientActiveObjectMap &objects) -{ - // try to reuse id's as late as possible - static u16 last_used_id = 0; - u16 startid = last_used_id; - for(;;) { - last_used_id ++; - if (isFreeClientActiveObjectId(last_used_id, objects)) - return last_used_id; - - if (last_used_id == startid) - return 0; - } -} - u16 ClientEnvironment::addActiveObject(ClientActiveObject *object) { // Register object. If failed return zero id diff --git a/src/client/clientmap.cpp b/src/client/clientmap.cpp index 3e4ab2e94..3124313e7 100644 --- a/src/client/clientmap.cpp +++ b/src/client/clientmap.cpp @@ -36,7 +36,7 @@ ClientMap::ClientMap( MapDrawControl &control, s32 id ): - Map(dout_client, client), + Map(client), scene::ISceneNode(RenderingEngine::get_scene_manager()->getRootSceneNode(), RenderingEngine::get_scene_manager(), id), m_client(client), diff --git a/src/client/mapblock_mesh.cpp b/src/client/mapblock_mesh.cpp index b59679523..f9332e399 100644 --- a/src/client/mapblock_mesh.cpp +++ b/src/client/mapblock_mesh.cpp @@ -81,33 +81,6 @@ void MeshMakeData::fill(MapBlock *block) } } -void MeshMakeData::fillSingleNode(MapNode *node) -{ - m_blockpos = v3s16(0,0,0); - - v3s16 blockpos_nodes = v3s16(0,0,0); - VoxelArea area(blockpos_nodes-v3s16(1,1,1)*MAP_BLOCKSIZE, - blockpos_nodes+v3s16(1,1,1)*MAP_BLOCKSIZE*2-v3s16(1,1,1)); - s32 volume = area.getVolume(); - s32 our_node_index = area.index(1,1,1); - - // Allocate this block + neighbors - m_vmanip.clear(); - m_vmanip.addArea(area); - - // Fill in data - MapNode *data = new MapNode[volume]; - for(s32 i = 0; i < volume; i++) - { - if (i == our_node_index) - data[i] = *node; - else - data[i] = MapNode(CONTENT_AIR, LIGHT_MAX, 0); - } - m_vmanip.copyFrom(data, area, area.MinEdge, area.MinEdge, area.getExtent()); - delete[] data; -} - void MeshMakeData::setCrack(int crack_level, v3s16 crack_pos) { if (crack_level >= 0) diff --git a/src/client/mapblock_mesh.h b/src/client/mapblock_mesh.h index 6af23a656..f8aed40dc 100644 --- a/src/client/mapblock_mesh.h +++ b/src/client/mapblock_mesh.h @@ -62,11 +62,6 @@ struct MeshMakeData */ void fill(MapBlock *block); - /* - Set up with only a single node at (1,1,1) - */ - void fillSingleNode(MapNode *node); - /* Set the (node) position of a crack */ diff --git a/src/content/CMakeLists.txt b/src/content/CMakeLists.txt index 5adcf6b1e..6dd049418 100644 --- a/src/content/CMakeLists.txt +++ b/src/content/CMakeLists.txt @@ -1,6 +1,5 @@ set(content_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/content.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/packages.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mods.cpp ${CMAKE_CURRENT_SOURCE_DIR}/subgames.cpp PARENT_SCOPE diff --git a/src/content/packages.cpp b/src/content/packages.cpp deleted file mode 100644 index 2d488eb76..000000000 --- a/src/content/packages.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* -Minetest -Copyright (C) 2018 rubenwardy - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include "content/packages.h" -#include "log.h" -#include "filesys.h" -#include "porting.h" -#include "settings.h" -#include "content/mods.h" -#include "content/subgames.h" - -std::string Package::getDownloadURL(const std::string &baseURL) const -{ - return baseURL + "/packages/" + author + "/" + name + "/releases/" + - std::to_string(release) + "/download/"; -} - -#if USE_CURL -std::vector getPackagesFromURL(const std::string &url) -{ - std::vector extra_headers; - extra_headers.emplace_back("Accept: application/json"); - - Json::Value json = fetchJsonValue(url, &extra_headers); - if (!json.isArray()) { - errorstream << "Invalid JSON download " << std::endl; - return std::vector(); - } - - std::vector packages; - - // Note: `unsigned int` is required to index JSON - for (unsigned int i = 0; i < json.size(); ++i) { - Package package; - - package.author = json[i]["author"].asString(); - package.name = json[i]["name"].asString(); - package.title = json[i]["title"].asString(); - package.type = json[i]["type"].asString(); - package.shortDesc = json[i]["shortDesc"].asString(); - package.release = json[i]["release"].asInt(); - if (json[i].isMember("thumbnail")) - package.thumbnail = json[i]["thumbnail"].asString(); - - if (package.valid()) - packages.push_back(package); - else - errorstream << "Invalid package at " << i << std::endl; - } - - return packages; -} -#endif diff --git a/src/content/packages.h b/src/content/packages.h deleted file mode 100644 index 9029475ef..000000000 --- a/src/content/packages.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -Minetest -Copyright (C) 2018 rubenwardy - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation; either version 2.1 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#pragma once -#include "config.h" -#include "convert_json.h" -#include "irrlichttypes.h" - -struct Package -{ - std::string author; - std::string name; // Technical name - std::string title; - std::string type; // One of "mod", "game", or "txp" - - std::string shortDesc; - u32 release; - std::string thumbnail; - - bool valid() const - { - return !(author.empty() || name.empty() || title.empty() || - type.empty() || release <= 0); - } - - std::string getDownloadURL(const std::string &baseURL) const; -}; - -#if USE_CURL -std::vector getPackagesFromURL(const std::string &url); -#else -inline std::vector getPackagesFromURL(const std::string &url) -{ - return std::vector(); -} -#endif diff --git a/src/gui/guiChatConsole.cpp b/src/gui/guiChatConsole.cpp index 575c6ab25..ef471106d 100644 --- a/src/gui/guiChatConsole.cpp +++ b/src/gui/guiChatConsole.cpp @@ -136,11 +136,6 @@ void GUIChatConsole::closeConsoleAtOnce() recalculateConsolePosition(); } -f32 GUIChatConsole::getDesiredHeight() const -{ - return m_desired_height_fraction; -} - void GUIChatConsole::replaceAndAddToHistory(const std::wstring &line) { ChatPrompt& prompt = m_chat_backend->getPrompt(); diff --git a/src/gui/guiChatConsole.h b/src/gui/guiChatConsole.h index 7be40e27c..204f9f9cc 100644 --- a/src/gui/guiChatConsole.h +++ b/src/gui/guiChatConsole.h @@ -55,10 +55,6 @@ public: // Set whether to close the console after the user presses enter. void setCloseOnEnter(bool close) { m_close_on_enter = close; } - // Return the desired height (fraction of screen size) - // Zero if the console is closed or getting closed - f32 getDesiredHeight() const; - // Replace actual line when adding the actual to the history (if there is any) void replaceAndAddToHistory(const std::wstring &line); diff --git a/src/log.cpp b/src/log.cpp index 54442c39b..3c61414e9 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -97,16 +97,7 @@ LogBuffer verbose_buf(g_logger, LL_VERBOSE); std::ostream *dout_con_ptr = &null_stream; std::ostream *derr_con_ptr = &verbosestream; -// Server -std::ostream *dout_server_ptr = &infostream; -std::ostream *derr_server_ptr = &errorstream; - -#ifndef SERVER -// Client -std::ostream *dout_client_ptr = &infostream; -std::ostream *derr_client_ptr = &errorstream; -#endif - +// Common streams std::ostream rawstream(&raw_buf); std::ostream dstream(&none_buf); std::ostream errorstream(&error_buf); diff --git a/src/log.h b/src/log.h index 856d3479b..6ed6b1fb7 100644 --- a/src/log.h +++ b/src/log.h @@ -192,14 +192,8 @@ extern std::ostream null_stream; extern std::ostream *dout_con_ptr; extern std::ostream *derr_con_ptr; -extern std::ostream *dout_server_ptr; extern std::ostream *derr_server_ptr; -#ifndef SERVER -extern std::ostream *dout_client_ptr; -extern std::ostream *derr_client_ptr; -#endif - extern Logger g_logger; // Writes directly to all LL_NONE log outputs for g_logger with no prefix. @@ -222,8 +216,4 @@ extern std::ostream dstream; #define dout_con (*dout_con_ptr) #define derr_con (*derr_con_ptr) -#define dout_server (*dout_server_ptr) -#ifndef SERVER - #define dout_client (*dout_client_ptr) -#endif diff --git a/src/map.cpp b/src/map.cpp index b9ab7c066..ef7eddb39 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -62,8 +62,7 @@ with this program; if not, write to the Free Software Foundation, Inc., Map */ -Map::Map(std::ostream &dout, IGameDef *gamedef): - m_dout(dout), +Map::Map(IGameDef *gamedef): m_gamedef(gamedef), m_nodedef(gamedef->ndef()) { @@ -1201,7 +1200,7 @@ bool Map::isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes) */ ServerMap::ServerMap(const std::string &savedir, IGameDef *gamedef, EmergeManager *emerge, MetricsBackend *mb): - Map(dout_server, gamedef), + Map(gamedef), settings_mgr(g_settings, savedir + DIR_DELIM + "map_meta.txt"), m_emerge(emerge) { @@ -1327,11 +1326,6 @@ u64 ServerMap::getSeed() return getMapgenParams()->seed; } -s16 ServerMap::getWaterLevel() -{ - return getMapgenParams()->water_level; -} - bool ServerMap::blockpos_over_mapgen_limit(v3s16 p) { const s16 mapgen_limit_bp = rangelim( @@ -1732,59 +1726,6 @@ void ServerMap::updateVManip(v3s16 pos) vm->m_is_dirty = true; } -s16 ServerMap::findGroundLevel(v2s16 p2d) -{ -#if 0 - /* - Uh, just do something random... - */ - // Find existing map from top to down - s16 max=63; - s16 min=-64; - v3s16 p(p2d.X, max, p2d.Y); - for(; p.Y>min; p.Y--) - { - MapNode n = getNodeNoEx(p); - if(n.getContent() != CONTENT_IGNORE) - break; - } - if(p.Y == min) - goto plan_b; - // If this node is not air, go to plan b - if(getNodeNoEx(p).getContent() != CONTENT_AIR) - goto plan_b; - // Search existing walkable and return it - for(; p.Y>min; p.Y--) - { - MapNode n = getNodeNoEx(p); - if(content_walkable(n.d) && n.getContent() != CONTENT_IGNORE) - return p.Y; - } - - // Move to plan b -plan_b: -#endif - - /* - Determine from map generator noise functions - */ - - s16 level = m_emerge->getGroundLevelAtPoint(p2d); - return level; - - //double level = base_rock_level_2d(m_seed, p2d) + AVERAGE_MUD_AMOUNT; - //return (s16)level; -} - -void ServerMap::createDirs(const std::string &path) -{ - if (!fs::CreateAllDirs(path)) { - m_dout<<"ServerMap: Failed to create directory " - <<"\""< *getSectorsPtr(){return &m_sectors;} - /* Variables */ @@ -283,8 +276,6 @@ public: protected: friend class LuaVoxelManip; - std::ostream &m_dout; // A bit deprecated, could be removed - IGameDef *m_gamedef; std::set m_event_receivers; @@ -374,15 +365,6 @@ public: */ MapBlock *getBlockOrEmerge(v3s16 p3d); - // Helper for placing objects on ground level - s16 findGroundLevel(v2s16 p2d); - - /* - Misc. helper functions for fiddling with directory and file - names when saving - */ - void createDirs(const std::string &path); - /* Database functions */ @@ -414,7 +396,6 @@ public: bool isSavingEnabled(){ return m_map_saving_enabled; } u64 getSeed(); - s16 getWaterLevel(); /*! * Fixes lighting in one map block. diff --git a/src/mapgen/mapgen.cpp b/src/mapgen/mapgen.cpp index 52ef64e7e..e0dfd2d71 100644 --- a/src/mapgen/mapgen.cpp +++ b/src/mapgen/mapgen.cpp @@ -244,26 +244,6 @@ u32 Mapgen::getBlockSeed2(v3s16 p, s32 seed) } -// Returns Y one under area minimum if not found -s16 Mapgen::findGroundLevelFull(v2s16 p2d) -{ - const v3s16 &em = vm->m_area.getExtent(); - s16 y_nodes_max = vm->m_area.MaxEdge.Y; - s16 y_nodes_min = vm->m_area.MinEdge.Y; - u32 i = vm->m_area.index(p2d.X, y_nodes_max, p2d.Y); - s16 y; - - for (y = y_nodes_max; y >= y_nodes_min; y--) { - MapNode &n = vm->m_data[i]; - if (ndef->get(n).walkable) - break; - - VoxelArea::add_y(em, i, -1); - } - return (y >= y_nodes_min) ? y : y_nodes_min - 1; -} - - // Returns -MAX_MAP_GENERATION_LIMIT if not found s16 Mapgen::findGroundLevel(v2s16 p2d, s16 ymin, s16 ymax) { @@ -984,19 +964,6 @@ GenerateNotifier::GenerateNotifier(u32 notify_on, } -void GenerateNotifier::setNotifyOn(u32 notify_on) -{ - m_notify_on = notify_on; -} - - -void GenerateNotifier::setNotifyOnDecoIds( - const std::set *notify_on_deco_ids) -{ - m_notify_on_deco_ids = notify_on_deco_ids; -} - - bool GenerateNotifier::addEvent(GenNotifyType type, v3s16 pos, u32 id) { if (!(m_notify_on & (1 << type))) diff --git a/src/mapgen/mapgen.h b/src/mapgen/mapgen.h index 0f2977c4c..1487731e2 100644 --- a/src/mapgen/mapgen.h +++ b/src/mapgen/mapgen.h @@ -88,19 +88,17 @@ struct GenNotifyEvent { class GenerateNotifier { public: + // Use only for temporary Mapgen objects with no map generation! GenerateNotifier() = default; GenerateNotifier(u32 notify_on, const std::set *notify_on_deco_ids); - void setNotifyOn(u32 notify_on); - void setNotifyOnDecoIds(const std::set *notify_on_deco_ids); - bool addEvent(GenNotifyType type, v3s16 pos, u32 id=0); void getEvents(std::map > &event_map); void clearEvents(); private: u32 m_notify_on = 0; - const std::set *m_notify_on_deco_ids; + const std::set *m_notify_on_deco_ids = nullptr; std::list m_notify_events; }; @@ -186,7 +184,6 @@ public: static u32 getBlockSeed(v3s16 p, s32 seed); static u32 getBlockSeed2(v3s16 p, s32 seed); - s16 findGroundLevelFull(v2s16 p2d); s16 findGroundLevel(v2s16 p2d, s16 ymin, s16 ymax); s16 findLiquidSurface(v2s16 p2d, s16 ymin, s16 ymax); void updateHeightmap(v3s16 nmin, v3s16 nmax); diff --git a/src/mapgen/mapgen_v6.cpp b/src/mapgen/mapgen_v6.cpp index 8bea5eb69..90a52e031 100644 --- a/src/mapgen/mapgen_v6.cpp +++ b/src/mapgen/mapgen_v6.cpp @@ -341,12 +341,6 @@ float MapgenV6::baseTerrainLevelFromMap(int index) } -s16 MapgenV6::find_ground_level_from_noise(u64 seed, v2s16 p2d, s16 precision) -{ - return baseTerrainLevelFromNoise(p2d) + MGV6_AVERAGE_MUD_AMOUNT; -} - - int MapgenV6::getGroundLevelAtPoint(v2s16 p) { return baseTerrainLevelFromNoise(p) + MGV6_AVERAGE_MUD_AMOUNT; diff --git a/src/mapgen/mapgen_v6.h b/src/mapgen/mapgen_v6.h index ff565edec..a6e6da8c6 100644 --- a/src/mapgen/mapgen_v6.h +++ b/src/mapgen/mapgen_v6.h @@ -150,7 +150,6 @@ public: s16 find_stone_level(v2s16 p2d); bool block_is_underground(u64 seed, v3s16 blockpos); - s16 find_ground_level_from_noise(u64 seed, v2s16 p2d, s16 precision); float getHumidity(v2s16 p); float getTreeAmount(v2s16 p); diff --git a/src/mapgen/treegen.cpp b/src/mapgen/treegen.cpp index e7e30c880..e633d800a 100644 --- a/src/mapgen/treegen.cpp +++ b/src/mapgen/treegen.cpp @@ -527,19 +527,6 @@ treegen::error make_ltree(MMVManip &vmanip, v3s16 p0, } -void tree_node_placement(MMVManip &vmanip, v3f p0, MapNode node) -{ - v3s16 p1 = v3s16(myround(p0.X), myround(p0.Y), myround(p0.Z)); - if (!vmanip.m_area.contains(p1)) - return; - u32 vi = vmanip.m_area.index(p1); - if (vmanip.m_data[vi].getContent() != CONTENT_AIR - && vmanip.m_data[vi].getContent() != CONTENT_IGNORE) - return; - vmanip.m_data[vmanip.m_area.index(p1)] = node; -} - - void tree_trunk_placement(MMVManip &vmanip, v3f p0, TreeDef &tree_definition) { v3s16 p1 = v3s16(myround(p0.X), myround(p0.Y), myround(p0.Z)); diff --git a/src/mapgen/treegen.h b/src/mapgen/treegen.h index 447baabb3..59a418824 100644 --- a/src/mapgen/treegen.h +++ b/src/mapgen/treegen.h @@ -76,8 +76,6 @@ namespace treegen { const NodeDefManager *ndef, const TreeDef &tree_definition); // L-System tree gen helper functions - void tree_node_placement(MMVManip &vmanip, v3f p0, - MapNode node); void tree_trunk_placement(MMVManip &vmanip, v3f p0, TreeDef &tree_definition); void tree_leaves_placement(MMVManip &vmanip, v3f p0, diff --git a/src/network/networkpacket.cpp b/src/network/networkpacket.cpp index 4d531b611..6d0abb12c 100644 --- a/src/network/networkpacket.cpp +++ b/src/network/networkpacket.cpp @@ -223,13 +223,6 @@ NetworkPacket& NetworkPacket::operator>>(char& dst) return *this; } -char NetworkPacket::getChar(u32 offset) -{ - checkReadOffset(offset, 1); - - return readU8(&m_data[offset]); -} - NetworkPacket& NetworkPacket::operator<<(char src) { checkDataSize(1); diff --git a/src/network/networkpacket.h b/src/network/networkpacket.h index fc8617651..e77bfb744 100644 --- a/src/network/networkpacket.h +++ b/src/network/networkpacket.h @@ -64,7 +64,6 @@ public: std::string readLongString(); - char getChar(u32 offset); NetworkPacket &operator>>(char &dst); NetworkPacket &operator<<(char src); diff --git a/src/script/common/c_converter.cpp b/src/script/common/c_converter.cpp index eb6ab5331..c00401b58 100644 --- a/src/script/common/c_converter.cpp +++ b/src/script/common/c_converter.cpp @@ -679,48 +679,3 @@ size_t write_array_slice_float( return elem_index - 1; } - - -size_t write_array_slice_u16( - lua_State *L, - int table_index, - u16 *data, - v3u16 data_size, - v3u16 slice_offset, - v3u16 slice_size) -{ - v3u16 pmin, pmax(data_size); - - if (slice_offset.X > 0) { - slice_offset.X--; - pmin.X = slice_offset.X; - pmax.X = MYMIN(slice_offset.X + slice_size.X, data_size.X); - } - - if (slice_offset.Y > 0) { - slice_offset.Y--; - pmin.Y = slice_offset.Y; - pmax.Y = MYMIN(slice_offset.Y + slice_size.Y, data_size.Y); - } - - if (slice_offset.Z > 0) { - slice_offset.Z--; - pmin.Z = slice_offset.Z; - pmax.Z = MYMIN(slice_offset.Z + slice_size.Z, data_size.Z); - } - - const u32 ystride = data_size.X; - const u32 zstride = data_size.X * data_size.Y; - - u32 elem_index = 1; - for (u32 z = pmin.Z; z != pmax.Z; z++) - for (u32 y = pmin.Y; y != pmax.Y; y++) - for (u32 x = pmin.X; x != pmax.X; x++) { - u32 i = z * zstride + y * ystride + x; - lua_pushinteger(L, data[i]); - lua_rawseti(L, table_index, elem_index); - elem_index++; - } - - return elem_index - 1; -} diff --git a/src/script/common/c_converter.h b/src/script/common/c_converter.h index a4a7079fd..6ad6f3212 100644 --- a/src/script/common/c_converter.h +++ b/src/script/common/c_converter.h @@ -136,5 +136,3 @@ void warn_if_field_exists(lua_State *L, int table, size_t write_array_slice_float(lua_State *L, int table_index, float *data, v3u16 data_size, v3u16 slice_offset, v3u16 slice_size); -size_t write_array_slice_u16(lua_State *L, int table_index, u16 *data, - v3u16 data_size, v3u16 slice_offset, v3u16 slice_size); diff --git a/src/script/lua_api/l_mainmenu.cpp b/src/script/lua_api/l_mainmenu.cpp index e49ec4052..0aa2760e9 100644 --- a/src/script/lua_api/l_mainmenu.cpp +++ b/src/script/lua_api/l_mainmenu.cpp @@ -29,7 +29,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "porting.h" #include "filesys.h" #include "convert_json.h" -#include "content/packages.h" #include "content/content.h" #include "content/subgames.h" #include "serverlist.h" diff --git a/src/unittest/test_map_settings_manager.cpp b/src/unittest/test_map_settings_manager.cpp index 0a5c971b9..3d642a9b4 100644 --- a/src/unittest/test_map_settings_manager.cpp +++ b/src/unittest/test_map_settings_manager.cpp @@ -65,31 +65,6 @@ void check_noise_params(const NoiseParams *np1, const NoiseParams *np2) } -std::string read_file_to_string(const std::string &filepath) -{ - std::string buf; - FILE *f = fopen(filepath.c_str(), "rb"); - if (!f) - return ""; - - fseek(f, 0, SEEK_END); - - long filesize = ftell(f); - if (filesize == -1) { - fclose(f); - return ""; - } - rewind(f); - - buf.resize(filesize); - - UASSERTEQ(size_t, fread(&buf[0], 1, filesize, f), 1); - - fclose(f); - return buf; -} - - void TestMapSettingsManager::makeUserConfig(Settings *conf) { conf->set("mg_name", "v7"); @@ -199,7 +174,8 @@ void TestMapSettingsManager::testMapSettingsManager() }; SHA1 ctx; - std::string metafile_contents = read_file_to_string(test_mapmeta_path); + std::string metafile_contents; + UASSERT(fs::ReadFile(test_mapmeta_path, metafile_contents)); ctx.addBytes(&metafile_contents[0], metafile_contents.size()); unsigned char *sha1_result = ctx.getDigest(); int resultdiff = memcmp(sha1_result, expected_contents_hash, 20); From e80fc22dd996e5b0efd8c4f67700c0920e323e46 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Tue, 6 Oct 2020 12:10:37 +0100 Subject: [PATCH 096/177] Prevent games from setting secure settings (#10460) --- src/content/subgames.cpp | 8 ++++++++ src/content/subgames.h | 3 --- src/settings.cpp | 13 +++++++++++++ src/settings.h | 2 ++ 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/content/subgames.cpp b/src/content/subgames.cpp index 695ba431f..c6350f2dd 100644 --- a/src/content/subgames.cpp +++ b/src/content/subgames.cpp @@ -34,12 +34,17 @@ with this program; if not, write to the Free Software Foundation, Inc., // The maximum number of identical world names allowed #define MAX_WORLD_NAMES 100 +namespace +{ + bool getGameMinetestConfig(const std::string &game_path, Settings &conf) { std::string conf_path = game_path + DIR_DELIM + "minetest.conf"; return conf.readConfigFile(conf_path.c_str()); } +} + struct GameFindPath { std::string path; @@ -330,8 +335,11 @@ void loadGameConfAndInitWorld(const std::string &path, const std::string &name, // files that were loaded before. g_settings->clearDefaults(); set_default_settings(g_settings); + Settings game_defaults; getGameMinetestConfig(gamespec.path, game_defaults); + game_defaults.removeSecureSettings(); + g_settings->overrideDefaults(&game_defaults); infostream << "Initializing world at " << final_path << std::endl; diff --git a/src/content/subgames.h b/src/content/subgames.h index 35b619aaf..60392639b 100644 --- a/src/content/subgames.h +++ b/src/content/subgames.h @@ -53,9 +53,6 @@ struct SubgameSpec bool isValid() const { return (!id.empty() && !path.empty()); } }; -// minetest.conf -bool getGameMinetestConfig(const std::string &game_path, Settings &conf); - SubgameSpec findSubgame(const std::string &id); SubgameSpec findWorldSubgame(const std::string &world_path); diff --git a/src/settings.cpp b/src/settings.cpp index 56ab9e12b..f30ef34e9 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -1039,6 +1039,19 @@ void Settings::deregisterChangedCallback(const std::string &name, } } +void Settings::removeSecureSettings() +{ + for (const auto &name : getNames()) { + if (name.compare(0, 7, "secure.") != 0) + continue; + + errorstream << "Secure setting " << name + << " isn't allowed, so was ignored." + << std::endl; + remove(name); + } +} + void Settings::doCallbacks(const std::string &name) const { MutexAutoLock lock(m_callback_mutex); diff --git a/src/settings.h b/src/settings.h index 7db5539b2..6db2f9481 100644 --- a/src/settings.h +++ b/src/settings.h @@ -207,6 +207,8 @@ public: void deregisterChangedCallback(const std::string &name, SettingsChangedCallback cbf, void *userdata = NULL); + void removeSecureSettings(); + private: /*********************** * Reading and writing * From 2f4037752b023f87ca1f8859a8dce4f833353967 Mon Sep 17 00:00:00 2001 From: HybridDog <3192173+HybridDog@users.noreply.github.com> Date: Tue, 6 Oct 2020 20:49:46 +0200 Subject: [PATCH 097/177] Add minetest.get_artificial_light and minetest.get_natural_light (#5680) Add more detailed light detection functions, a function to get the artificial light (torches) and a function to get the sunlight as seen by the player (you can specify timeofday). Co-authored-by: rubenwardy --- builtin/game/misc.lua | 6 ++ doc/lua_api.txt | 16 ++++ games/devtest/mods/testtools/init.lua | 2 + games/devtest/mods/testtools/light.lua | 22 +++++ .../textures/testtools_lighttool.png | Bin 0 -> 1659 bytes src/script/lua_api/l_env.cpp | 41 +++++++++ src/script/lua_api/l_env.h | 5 ++ src/serverenvironment.cpp | 85 ++++++++++++++++++ src/serverenvironment.h | 3 + 9 files changed, 180 insertions(+) create mode 100644 games/devtest/mods/testtools/light.lua create mode 100644 games/devtest/mods/testtools/textures/testtools_lighttool.png diff --git a/builtin/game/misc.lua b/builtin/game/misc.lua index 341e613c2..96a0a2dda 100644 --- a/builtin/game/misc.lua +++ b/builtin/game/misc.lua @@ -151,6 +151,12 @@ function core.setting_get_pos(name) end +-- See l_env.cpp for the other functions +function core.get_artificial_light(param1) + return math.floor(param1 / 16) +end + + -- To be overriden by protection mods function core.is_protected(pos, name) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 9e9af20da..c4eb56374 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -4824,6 +4824,22 @@ Environment access * `pos`: The position where to measure the light. * `timeofday`: `nil` for current time, `0` for night, `0.5` for day * Returns a number between `0` and `15` or `nil` + * `nil` is returned e.g. when the map isn't loaded at `pos` +* `minetest.get_natural_light(pos[, timeofday])` + * Figures out the sunlight (or moonlight) value at pos at the given time of + day. + * `pos`: The position of the node + * `timeofday`: `nil` for current time, `0` for night, `0.5` for day + * Returns a number between `0` and `15` or `nil` + * This function tests 203 nodes in the worst case, which happens very + unlikely +* `minetest.get_artificial_light(param1)` + * Calculates the artificial light (light from e.g. torches) value from the + `param1` value. + * `param1`: The param1 value of a `paramtype = "light"` node. + * Returns a number between `0` and `15` + * Currently it's the same as `math.floor(param1 / 16)`, except that it + ensures compatibility. * `minetest.place_node(pos, node)` * Place node with the same effects that a player would cause * `minetest.dig_node(pos)` diff --git a/games/devtest/mods/testtools/init.lua b/games/devtest/mods/testtools/init.lua index df5bc8e55..d578b264a 100644 --- a/games/devtest/mods/testtools/init.lua +++ b/games/devtest/mods/testtools/init.lua @@ -1,6 +1,8 @@ local S = minetest.get_translator("testtools") local F = minetest.formspec_escape +dofile(minetest.get_modpath("testtools") .. "/light.lua") + -- TODO: Add a Node Metadata tool minetest.register_tool("testtools:param2tool", { diff --git a/games/devtest/mods/testtools/light.lua b/games/devtest/mods/testtools/light.lua new file mode 100644 index 000000000..a9458ca6b --- /dev/null +++ b/games/devtest/mods/testtools/light.lua @@ -0,0 +1,22 @@ + +local S = minetest.get_translator("testtools") + +minetest.register_tool("testtools:lighttool", { + description = S("Light tool"), + inventory_image = "testtools_lighttool.png", + groups = { testtool = 1, disable_repair = 1 }, + on_use = function(itemstack, user, pointed_thing) + local pos = pointed_thing.above + if pointed_thing.type ~= "node" or not pos then + return + end + + local node = minetest.get_node(pos) + local time = minetest.get_timeofday() + local sunlight = minetest.get_natural_light(pos) + local artificial = minetest.get_artificial_light(node.param1) + local message = ("param1 0x%02x | time %.5f | sunlight %d | artificial %d") + :format(node.param1, time, sunlight, artificial) + minetest.chat_send_player(user:get_player_name(), message) + end +}) diff --git a/games/devtest/mods/testtools/textures/testtools_lighttool.png b/games/devtest/mods/testtools/textures/testtools_lighttool.png new file mode 100644 index 0000000000000000000000000000000000000000..6f744b7fa46d8a00e6a59c0929a591ea93add744 GIT binary patch literal 1659 zcmV->288*EP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+SOKDvg0ZY{MRaG2_OLy%fURVW(RlqBQWu?bDY?j zGe0+!4HiObx@8=w|NU<8OMi$c;5ELw2`g8IJ#k<6`A;RMXSHs`7Gq2W)v{u*MB^Q*@Fe}Qy zgPp!c9T%mX#4Q6%8%LeZzKWWff?i5)g z8&`@8d*v#Ou3W#XmkMIr)XfiqA8pEScJ-sBstWo+v*-qsS=JDXw_mkILuXPyul@Q~ zSl}`PC`FpvD;P_vfC*atHdw=mY_0MrDo|47NDdcOzdT zZq~C&h42)JRhvjj#d6MT{jd|Qq2$Rs?|ty>1$^`=P;kMA5IFQhE-|rV&w-hRBPSto z;w1=+NR$*YlAeJ+hR9K3j42@`O_VfNQvalu1s7V};+L@SB1>FS*7C_N`y4W7$uXyb zg^C^%B@`}FVoB9P)sv#S>T9T6rN)|?)>@VCYb zrdD8ngs}ZM@m(`j44qZQxhtRrja@S%);a9TbP=kic&eG5CMhV<>z`6>xe)T1paNYY`;ORkx! z4gCq1<_$^4G56jLZu;%qp8Itfe7x>OTKJo7oTY*HdG2oye$4W8gW<<^wbx*ZdzsbL z=@oO9=UKqd_V#ib&i8)A*jVP1m-2!q=#Y83C6`}p;0cHsE@F0g;T+J#{!Z}1d%$Ou zpW}x!1#So3A%lBVUL%7&wJ#{W>Ia2z!QpM7aKYhi3gLpo+sNRix+fGKs|zlx@uZ56 zC&P*#KH9(=ydXb&{WrXD_XxZ?vf#~`)t3IjI*%*QCNTeoYlI`#&nj^Txq;mMa9w;* z;DXNg5OgfL$XkRdL|6u#EY9D`%^q*yfKYo2-0#3ysHUIzt zglR)VP)S2WAaHVTW@&6?004NLeUUv#!$2IxUsH=xst$G#aR^eKS`Za+)G8FALZ}s5 zbuhVpLX(Ch#l=x@EjakGSaoo5*44pP5ClI!oE)7LU8KbSC509-9vt`M-Mz=%J3weu zm}+*71FB{jsYG1NWLL%RR|FA2A4U+BnW@i7QWBoy>mEM7-o<#9_qjhuZ!T{#z$X&V zGTpF@)hJ)cxSZp>#aXS?SnHnrg`vE*vdndw!$@EeOOPN!K@DY8U?E1UMv93P?Z-X* zLylh}mqM;G7&#VDg$mj6ga5(rZq35vgqswK1A!OY{ul+icY$Wzw!e>UyLkfmpMfi_ z?XNa~nNQN|Z7p&H^lt+f*KJMN11@)f!6#idWJmJT6bc34{fxdT3k=)>!8NzH);>-j zfHZZLya5glfw3ZGuY0_^r?an0U60WO;~d-o7e1-RLBt&={?ZX#e6zRbe%kztQDBP)|5LF^%}=d-j{iRZi~l5np8R>8|NGV^2O|3kaNXYA6WtrQzNscirN002ovPDHLk FV1hb0459!4 literal 0 HcmV?d00001 diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp index 138e88ae8..8d50d664d 100644 --- a/src/script/lua_api/l_env.cpp +++ b/src/script/lua_api/l_env.cpp @@ -407,6 +407,46 @@ int ModApiEnvMod::l_get_node_light(lua_State *L) return 1; } + +// get_natural_light(pos, timeofday) +// pos = {x=num, y=num, z=num} +// timeofday: nil = current time, 0 = night, 0.5 = day +int ModApiEnvMod::l_get_natural_light(lua_State *L) +{ + GET_ENV_PTR; + + v3s16 pos = read_v3s16(L, 1); + + bool is_position_ok; + MapNode n = env->getMap().getNode(pos, &is_position_ok); + if (!is_position_ok) + return 0; + + // If the daylight is 0, nothing needs to be calculated + u8 daylight = n.param1 & 0x0f; + if (daylight == 0) { + lua_pushinteger(L, 0); + return 1; + } + + u32 time_of_day; + if (lua_isnumber(L, 2)) { + time_of_day = 24000.0 * lua_tonumber(L, 2); + time_of_day %= 24000; + } else { + time_of_day = env->getTimeOfDay(); + } + u32 dnr = time_to_daynight_ratio(time_of_day, true); + + // If it's the same as the artificial light, the sunlight needs to be + // searched for because the value may not emanate from the sun + if (daylight == n.param1 >> 4) + daylight = env->findSunlight(pos); + + lua_pushinteger(L, dnr * daylight / 1000); + return 1; +} + // place_node(pos, node) // pos = {x=num, y=num, z=num} int ModApiEnvMod::l_place_node(lua_State *L) @@ -1358,6 +1398,7 @@ void ModApiEnvMod::Initialize(lua_State *L, int top) API_FCT(get_node); API_FCT(get_node_or_nil); API_FCT(get_node_light); + API_FCT(get_natural_light); API_FCT(place_node); API_FCT(dig_node); API_FCT(punch_node); diff --git a/src/script/lua_api/l_env.h b/src/script/lua_api/l_env.h index 07d4d2438..7f212b5fc 100644 --- a/src/script/lua_api/l_env.h +++ b/src/script/lua_api/l_env.h @@ -56,6 +56,11 @@ private: // timeofday: nil = current time, 0 = night, 0.5 = day static int l_get_node_light(lua_State *L); + // get_natural_light(pos, timeofday) + // pos = {x=num, y=num, z=num} + // timeofday: nil = current time, 0 = night, 0.5 = day + static int l_get_natural_light(lua_State *L); + // place_node(pos, node) // pos = {x=num, y=num, z=num} static int l_place_node(lua_State *L); diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp index 320042e19..6ef56efc8 100644 --- a/src/serverenvironment.cpp +++ b/src/serverenvironment.cpp @@ -1066,6 +1066,91 @@ bool ServerEnvironment::swapNode(v3s16 p, const MapNode &n) return true; } +u8 ServerEnvironment::findSunlight(v3s16 pos) const +{ + // Directions for neighbouring nodes with specified order + static const v3s16 dirs[] = { + v3s16(-1, 0, 0), v3s16(1, 0, 0), v3s16(0, 0, -1), v3s16(0, 0, 1), + v3s16(0, -1, 0), v3s16(0, 1, 0) + }; + + const NodeDefManager *ndef = m_server->ndef(); + + // found_light remembers the highest known sunlight value at pos + u8 found_light = 0; + + struct stack_entry { + v3s16 pos; + s16 dist; + }; + std::stack stack; + stack.push({pos, 0}); + + std::unordered_map dists; + dists[MapDatabase::getBlockAsInteger(pos)] = 0; + + while (!stack.empty()) { + struct stack_entry e = stack.top(); + stack.pop(); + + v3s16 currentPos = e.pos; + s8 dist = e.dist + 1; + + for (const v3s16& off : dirs) { + v3s16 neighborPos = currentPos + off; + s64 neighborHash = MapDatabase::getBlockAsInteger(neighborPos); + + // Do not walk neighborPos multiple times unless the distance to the start + // position is shorter + auto it = dists.find(neighborHash); + if (it != dists.end() && dist >= it->second) + continue; + + // Position to walk + bool is_position_ok; + MapNode node = m_map->getNode(neighborPos, &is_position_ok); + if (!is_position_ok) { + // This happens very rarely because the map at currentPos is loaded + m_map->emergeBlock(neighborPos, false); + node = m_map->getNode(neighborPos, &is_position_ok); + if (!is_position_ok) + continue; // not generated + } + + const ContentFeatures &def = ndef->get(node); + if (!def.sunlight_propagates) { + // Do not test propagation here again + dists[neighborHash] = -1; + continue; + } + + // Sunlight could have come from here + dists[neighborHash] = dist; + u8 daylight = node.param1 & 0x0f; + + // In the special case where sunlight shines from above and thus + // does not decrease with upwards distance, daylight is always + // bigger than nightlight, which never reaches 15 + int possible_finlight = daylight - dist; + if (possible_finlight <= found_light) { + // Light from here cannot make a brighter light at currentPos than + // found_light + continue; + } + + u8 nightlight = node.param1 >> 4; + if (daylight > nightlight) { + // Found a valid daylight + found_light = possible_finlight; + } else { + // Sunlight may be darker, so walk the neighbours + stack.push({neighborPos, dist}); + } + } + } + return found_light; +} + void ServerEnvironment::clearObjects(ClearObjectsMode mode) { infostream << "ServerEnvironment::clearObjects(): " diff --git a/src/serverenvironment.h b/src/serverenvironment.h index af742e290..cfd5b8f3e 100644 --- a/src/serverenvironment.h +++ b/src/serverenvironment.h @@ -322,6 +322,9 @@ public: bool removeNode(v3s16 p); bool swapNode(v3s16 p, const MapNode &n); + // Find the daylight value at pos with a Depth First Search + u8 findSunlight(v3s16 pos) const; + // Find all active objects inside a radius around a point void getObjectsInsideRadius(std::vector &objects, const v3f &pos, float radius, std::function include_obj_cb) From aae7d4ff8e4e2433b13225269de28e7dc10efe2c Mon Sep 17 00:00:00 2001 From: Hugo Locurcio Date: Tue, 6 Oct 2020 20:50:20 +0200 Subject: [PATCH 098/177] Improve the `fsaa` setting description (#10279) See https://github.com/minetest/minetest/issues/8459. --- builtin/settingtypes.txt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 7f2d12be5..1c28470d5 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -513,8 +513,13 @@ texture_clean_transparent (Clean transparent textures) bool false # texture autoscaling. texture_min_size (Minimum texture size) int 64 -# Experimental option, might cause visible spaces between blocks -# when set to higher number than 0. +# Use multi-sample antialiasing (MSAA) to smooth out block edges. +# This algorithm smooths out the 3D viewport while keeping the image sharp, +# but it doesn't affect the insides of textures +# (which is especially noticeable with transparent textures). +# This option is experimental and might cause visible spaces between blocks +# when set above 0. +# A restart is required after changing this option. fsaa (FSAA) enum 0 0,1,2,4,8,16 # Undersampling is similar to using a lower screen resolution, but it applies From a37e96eefc646f01f34d0c6d8948d4a9c4062cae Mon Sep 17 00:00:00 2001 From: Zughy <63455151+Zughy@users.noreply.github.com> Date: Tue, 6 Oct 2020 20:51:27 +0200 Subject: [PATCH 099/177] -Wmem-access only called when GCC > 7 (#10453) --- src/client/mapblock_mesh.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/client/mapblock_mesh.cpp b/src/client/mapblock_mesh.cpp index f9332e399..c7790f1e4 100644 --- a/src/client/mapblock_mesh.cpp +++ b/src/client/mapblock_mesh.cpp @@ -394,7 +394,9 @@ static void getNodeVertexDirs(const v3s16 &dir, v3s16 *vertex_dirs) #if defined(__GNUC__) && !defined(__clang__) #pragma GCC diagnostic push +#if __GNUC__ > 7 #pragma GCC diagnostic ignored "-Wclass-memaccess" +#endif #endif memcpy(vertex_dirs, &vertex_dirs_table[idx], 4 * sizeof(v3s16)); #if defined(__GNUC__) && !defined(__clang__) From f0b6f7909a6a760d946209891c3667799874b80a Mon Sep 17 00:00:00 2001 From: HybridDog <3192173+HybridDog@users.noreply.github.com> Date: Thu, 8 Oct 2020 19:44:27 +0200 Subject: [PATCH 100/177] Mention texture modifier colorspace (#10112) --- doc/lua_api.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index c4eb56374..60fea3817 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -434,7 +434,9 @@ Texture modifiers ----------------- There are various texture modifiers that can be used -to generate textures on-the-fly. +to let the client generate textures on-the-fly. +The modifiers are applied directly in sRGB colorspace, +i.e. without gamma-correction. ### Texture overlaying From b2f3f663858e6d2a2174066e425bb6f2edea910b Mon Sep 17 00:00:00 2001 From: DS Date: Thu, 8 Oct 2020 19:44:47 +0200 Subject: [PATCH 101/177] Fix box[]es not being clipped (#10473) Fixes a regression of #8676. --- src/gui/guiBox.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/gui/guiBox.cpp b/src/gui/guiBox.cpp index 99a115daf..443f1064f 100644 --- a/src/gui/guiBox.cpp +++ b/src/gui/guiBox.cpp @@ -107,10 +107,11 @@ void GUIBox::draw() video::IVideoDriver *driver = Environment->getVideoDriver(); driver->draw2DRectangle(main_rect, m_colors[0], m_colors[1], m_colors[3], - m_colors[2], nullptr); + m_colors[2], &AbsoluteClippingRect); for (size_t i = 0; i <= 3; i++) - driver->draw2DRectangle(m_bordercolors[i], border_rects[i], nullptr); + driver->draw2DRectangle(m_bordercolors[i], border_rects[i], + &AbsoluteClippingRect); IGUIElement::draw(); } From f3ae45b2b245dd0aeb4a7d9b76afaf078871104c Mon Sep 17 00:00:00 2001 From: DS Date: Fri, 9 Oct 2020 20:11:21 +0200 Subject: [PATCH 102/177] Add a short_description to be used by mods (#8980) --- builtin/game/register.lua | 6 +++ doc/lua_api.txt | 10 +++++ games/devtest/mods/unittests/init.lua | 2 + .../mods/unittests/itemdescription.lua | 44 +++++++++++++++++++ src/inventory.cpp | 14 ++++++ src/inventory.h | 1 + src/itemdef.cpp | 9 +++- src/itemdef.h | 1 + src/script/common/c_content.cpp | 3 ++ src/script/lua_api/l_item.cpp | 11 +++++ src/script/lua_api/l_item.h | 3 ++ 11 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 games/devtest/mods/unittests/itemdescription.lua diff --git a/builtin/game/register.lua b/builtin/game/register.lua index 3de67c04b..f00b76494 100644 --- a/builtin/game/register.lua +++ b/builtin/game/register.lua @@ -118,6 +118,12 @@ function core.register_item(name, itemdef) end itemdef.name = name + -- default description to item name + itemdef.description = itemdef.description or name + -- default short_description to first line of description + itemdef.short_description = itemdef.short_description or + itemdef.description:gsub("\n.*","") + -- Apply defaults and add to registered_* table if itemdef.type == "node" then -- Use the nodebox as selection box if it's not set manually diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 60fea3817..c8b294149 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2054,6 +2054,8 @@ Some of the values in the key-value store are handled specially: * `description`: Set the item stack's description. Defaults to `idef.description`. +* `short_description`: Set the item stack's short description. Defaults + to `idef.short_description`. * `color`: A `ColorString`, which sets the stack's color. * `palette_index`: If the item has a palette, this is used to get the current color from the palette. @@ -5994,6 +5996,8 @@ an itemstring, a table or `nil`. stack). * `set_metadata(metadata)`: (DEPRECATED) Returns true. * `get_description()`: returns the description shown in inventory list tooltips. +* `get_short_description()`: returns the short description. + * Unlike the description, this does not include new lines. * `clear()`: removes all items from the stack, making it empty. * `replace(item)`: replace the contents of this stack. * `item` can also be an itemstring or table. @@ -7096,6 +7100,12 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and { description = "Steel Axe", + -- Can contain new lines. "\n" has to be used as new line character. + -- Defaults to the item's name. + + short_description = "Steel Axe", + -- Must not contain new lines. + -- Defaults to the first line of description. groups = {}, -- key = name, value = rating; rating = 1..3. diff --git a/games/devtest/mods/unittests/init.lua b/games/devtest/mods/unittests/init.lua index 6c1728420..12c67f78b 100644 --- a/games/devtest/mods/unittests/init.lua +++ b/games/devtest/mods/unittests/init.lua @@ -5,10 +5,12 @@ dofile(modpath .. "/random.lua") dofile(modpath .. "/player.lua") dofile(modpath .. "/crafting_prepare.lua") dofile(modpath .. "/crafting.lua") +dofile(modpath .. "/itemdescription.lua") if minetest.settings:get_bool("devtest_unittests_autostart", false) then unittests.test_random() unittests.test_crafting() + unittests.test_short_desc() minetest.register_on_joinplayer(function(player) unittests.test_player(player) end) diff --git a/games/devtest/mods/unittests/itemdescription.lua b/games/devtest/mods/unittests/itemdescription.lua new file mode 100644 index 000000000..1d0826545 --- /dev/null +++ b/games/devtest/mods/unittests/itemdescription.lua @@ -0,0 +1,44 @@ +local full_description = "Colorful Pickaxe\nThe best pick." +minetest.register_tool("unittests:colorful_pick", { + description = full_description, + inventory_image = "basetools_mesepick.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=3, + groupcaps={ + cracky={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3}, + crumbly={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3}, + snappy={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3} + }, + damage_groups = {fleshy=4}, + }, +}) + +minetest.register_chatcommand("item_description", { + param = "", + description = "Show the short and full description of the wielded item.", + func = function(name) + local player = minetest.get_player_by_name(name) + local item = player:get_wielded_item() + return true, string.format("short_description: %s\ndescription: %s", + item:get_short_description(), item:get_description()) + end +}) + +function unittests.test_short_desc() + local stack = ItemStack("unittests:colorful_pick") + assert(stack:get_short_description() == "Colorful Pickaxe") + assert(stack:get_short_description() == minetest.registered_items["unittests:colorful_pick"].short_description) + assert(stack:get_description() == full_description) + assert(stack:get_description() == minetest.registered_items["unittests:colorful_pick"].description) + + stack:get_meta():set_string("description", "Hello World") + assert(stack:get_short_description() == "Colorful Pickaxe") + assert(stack:get_description() == "Hello World") + + stack:get_meta():set_string("short_description", "Foo Bar") + assert(stack:get_short_description() == "Foo Bar") + assert(stack:get_description() == "Hello World") + + return true +end diff --git a/src/inventory.cpp b/src/inventory.cpp index cf72cb005..1ef9b13cd 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -258,6 +258,20 @@ std::string ItemStack::getDescription(IItemDefManager *itemdef) const return desc.empty() ? name : desc; } +std::string ItemStack::getShortDescription(IItemDefManager *itemdef) const +{ + std::string desc = metadata.getString("short_description"); + if (desc.empty()) + desc = getDefinition(itemdef).short_description; + if (!desc.empty()) + return desc; + // no short_description because of old server version or modified builtin + // return first line of description + std::stringstream sstr(getDescription(itemdef)); + std::getline(sstr, desc, '\n'); + return desc; +} + ItemStack ItemStack::addItem(ItemStack newitem, IItemDefManager *itemdef) { diff --git a/src/inventory.h b/src/inventory.h index 67a7859ed..f36bc57cf 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -49,6 +49,7 @@ struct ItemStack std::string getItemString(bool include_meta = true) const; // Returns the tooltip std::string getDescription(IItemDefManager *itemdef) const; + std::string getShortDescription(IItemDefManager *itemdef) const; /* Quantity methods diff --git a/src/itemdef.cpp b/src/itemdef.cpp index df20bdf15..5fb1e4c47 100644 --- a/src/itemdef.cpp +++ b/src/itemdef.cpp @@ -62,6 +62,7 @@ ItemDefinition& ItemDefinition::operator=(const ItemDefinition &def) type = def.type; name = def.name; description = def.description; + short_description = def.short_description; inventory_image = def.inventory_image; inventory_overlay = def.inventory_overlay; wield_image = def.wield_image; @@ -102,6 +103,7 @@ void ItemDefinition::reset() type = ITEM_NONE; name = ""; description = ""; + short_description = ""; inventory_image = ""; inventory_overlay = ""; wield_image = ""; @@ -162,6 +164,8 @@ void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const writeARGB8(os, color); os << serializeString16(inventory_overlay); os << serializeString16(wield_overlay); + + os << serializeString16(short_description); } void ItemDefinition::deSerialize(std::istream &is) @@ -213,8 +217,9 @@ void ItemDefinition::deSerialize(std::istream &is) // If you add anything here, insert it primarily inside the try-catch // block to not need to increase the version. - //try { - //} catch(SerializationError &e) {}; + try { + short_description = deSerializeString16(is); + } catch(SerializationError &e) {}; } diff --git a/src/itemdef.h b/src/itemdef.h index f47e6cbe7..ebf0d3527 100644 --- a/src/itemdef.h +++ b/src/itemdef.h @@ -56,6 +56,7 @@ struct ItemDefinition ItemType type; std::string name; // "" = hand std::string description; // Shown in tooltip. + std::string short_description; /* Visual properties diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp index 774b6a326..147f6e3ed 100644 --- a/src/script/common/c_content.cpp +++ b/src/script/common/c_content.cpp @@ -56,6 +56,7 @@ void read_item_definition(lua_State* L, int index, es_ItemType, ITEM_NONE); getstringfield(L, index, "name", def.name); getstringfield(L, index, "description", def.description); + getstringfield(L, index, "short_description", def.short_description); getstringfield(L, index, "inventory_image", def.inventory_image); getstringfield(L, index, "inventory_overlay", def.inventory_overlay); getstringfield(L, index, "wield_image", def.wield_image); @@ -142,6 +143,8 @@ void push_item_definition_full(lua_State *L, const ItemDefinition &i) lua_setfield(L, -2, "name"); lua_pushstring(L, i.description.c_str()); lua_setfield(L, -2, "description"); + lua_pushstring(L, i.short_description.c_str()); + lua_setfield(L, -2, "short_description"); lua_pushstring(L, type.c_str()); lua_setfield(L, -2, "type"); lua_pushstring(L, i.inventory_image.c_str()); diff --git a/src/script/lua_api/l_item.cpp b/src/script/lua_api/l_item.cpp index d67cab76f..2d1124a4d 100644 --- a/src/script/lua_api/l_item.cpp +++ b/src/script/lua_api/l_item.cpp @@ -193,6 +193,16 @@ int LuaItemStack::l_get_description(lua_State *L) return 1; } +// get_short_description(self) +int LuaItemStack::l_get_short_description(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + LuaItemStack *o = checkobject(L, 1); + std::string desc = o->m_stack.getShortDescription(getGameDef(L)->idef()); + lua_pushstring(L, desc.c_str()); + return 1; +} + // clear(self) -> true int LuaItemStack::l_clear(lua_State *L) { @@ -493,6 +503,7 @@ const luaL_Reg LuaItemStack::methods[] = { luamethod(LuaItemStack, get_metadata), luamethod(LuaItemStack, set_metadata), luamethod(LuaItemStack, get_description), + luamethod(LuaItemStack, get_short_description), luamethod(LuaItemStack, clear), luamethod(LuaItemStack, replace), luamethod(LuaItemStack, to_string), diff --git a/src/script/lua_api/l_item.h b/src/script/lua_api/l_item.h index 98744c071..16878c101 100644 --- a/src/script/lua_api/l_item.h +++ b/src/script/lua_api/l_item.h @@ -72,6 +72,9 @@ private: // get_description(self) static int l_get_description(lua_State *L); + // get_short_description(self) + static int l_get_short_description(lua_State *L); + // clear(self) -> true static int l_clear(lua_State *L); From c61c175e9c648b6e40b85c12940e9b91a52757d7 Mon Sep 17 00:00:00 2001 From: HybridDog <3192173+HybridDog@users.noreply.github.com> Date: Fri, 9 Oct 2020 20:13:42 +0200 Subject: [PATCH 103/177] Add bumpmapping and parallax occlusion testing nodes to devtest (#9242) --- games/devtest/mods/testnodes/mod.conf | 1 + games/devtest/mods/testnodes/textures.lua | 49 ++++++++++++++++++ .../textures/testnodes_height_pyramid.png | Bin 0 -> 90 bytes .../testnodes_height_pyramid_normal.png | Bin 0 -> 239 bytes .../textures/testnodes_parallax_extruded.png | Bin 0 -> 591 bytes .../testnodes_parallax_extruded_normal.png | Bin 0 -> 143 bytes 6 files changed, 50 insertions(+) create mode 100644 games/devtest/mods/testnodes/textures/testnodes_height_pyramid.png create mode 100644 games/devtest/mods/testnodes/textures/testnodes_height_pyramid_normal.png create mode 100644 games/devtest/mods/testnodes/textures/testnodes_parallax_extruded.png create mode 100644 games/devtest/mods/testnodes/textures/testnodes_parallax_extruded_normal.png diff --git a/games/devtest/mods/testnodes/mod.conf b/games/devtest/mods/testnodes/mod.conf index 4824c6ed0..d894c3452 100644 --- a/games/devtest/mods/testnodes/mod.conf +++ b/games/devtest/mods/testnodes/mod.conf @@ -1,2 +1,3 @@ name = testnodes description = Contains a bunch of basic example nodes for demonstrative purposes, development and testing +depends = stairs diff --git a/games/devtest/mods/testnodes/textures.lua b/games/devtest/mods/testnodes/textures.lua index 6ffef8fe9..e0724c229 100644 --- a/games/devtest/mods/testnodes/textures.lua +++ b/games/devtest/mods/testnodes/textures.lua @@ -71,3 +71,52 @@ for a=1,#alphas do groups = { dig_immediate = 3 }, }) end + + +-- Bumpmapping and Parallax Occlusion + +-- This node has a normal map which corresponds to a pyramid with sides tilted +-- by an angle of 45°, i.e. the normal map contains four vectors which point +-- diagonally away from the surface (e.g. (0.7, 0.7, 0)), +-- and the heights in the height map linearly increase towards the centre, +-- so that the surface corresponds to a simple pyramid. +-- The node can help to determine if e.g. tangent space transformations work +-- correctly. +-- If, for example, the light comes from above, then the (tilted) pyramids +-- should look like they're lit from this light direction on all node faces. +-- The white albedo texture has small black indicators which can be used to see +-- how it is transformed ingame (and thus see if there's rotation around the +-- normal vector). +minetest.register_node("testnodes:height_pyramid", { + description = "Bumpmapping and Parallax Occlusion Tester (height pyramid)", + tiles = {"testnodes_height_pyramid.png"}, + groups = {dig_immediate = 3}, +}) + +-- The stairs nodes should help to validate if shading works correctly for +-- rotated nodes (which have rotated textures). +stairs.register_stair_and_slab("height_pyramid", "experimantal:height_pyramid", + {dig_immediate = 3}, + {"testnodes_height_pyramid.png"}, + "Bumpmapping and Parallax Occlusion Tester Stair (height pyramid)", + "Bumpmapping and Parallax Occlusion Tester Slab (height pyramid)") + +-- This node has a simple heightmap for parallax occlusion testing and flat +-- normalmap. +-- When parallax occlusion is enabled, the yellow scrawl should stick out of +-- the texture when viewed at an angle. +minetest.register_node("testnodes:parallax_extruded", { + description = "Parallax Occlusion Tester", + tiles = {"testnodes_parallax_extruded.png"}, + groups = {dig_immediate = 3}, +}) + +-- Analogously to the height pyramid stairs nodes, +-- these nodes should help to validate if parallax occlusion works correctly for +-- rotated nodes (which have rotated textures). +stairs.register_stair_and_slab("parallax_extruded", + "experimantal:parallax_extruded", + {dig_immediate = 3}, + {"testnodes_parallax_extruded.png"}, + "Parallax Occlusion Tester Stair", + "Parallax Occlusion Tester Slab") diff --git a/games/devtest/mods/testnodes/textures/testnodes_height_pyramid.png b/games/devtest/mods/testnodes/textures/testnodes_height_pyramid.png new file mode 100644 index 0000000000000000000000000000000000000000..8c787b7401e1dd936e6e89bf132b9f187cf1d1b7 GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UA6g^!WLnJOI|2h9-KBJ_8k%7S< l_h&{)D;%BznT9;_j11Q|ut~+NeZ2vs$~~oxG9vh=Ksi-Ja-z zF6Uhfc!H`Hh$XG#`4Y}!e@IZs$-&^{X6x;I|F{;~J-lZ8BChUq+zxrhT}cw zf(=X36e=`Ma6IrxXz>ro?Z~NPnl5~lZ`vBp9Wt6ci6>(Yr1}?dc^_lavu5(%utdDz m=BEv;-gb_^tyj-;{LVim+=bh?|GX^F2MnIBelF{r5}E+pj#X#? literal 0 HcmV?d00001 diff --git a/games/devtest/mods/testnodes/textures/testnodes_parallax_extruded.png b/games/devtest/mods/testnodes/textures/testnodes_parallax_extruded.png new file mode 100644 index 0000000000000000000000000000000000000000..7e1c323987597e8555e4a74bb637d4705dd2d88c GIT binary patch literal 591 zcmV-V0}3b3I7v6KL@mH@Gv0J4(+ zvY!gFpboR10JM`7w50>JnEaTizT*oMt54M&9ww4jLmKe5|6SkNDwwN2XnFF?&54M>YwwW5XngF(% z0k)bBwwn*OoB+0+0JfbNww?gCpB}cM1mNJ{;^N}t=;-R|>g((4 z?Ck9A?d|XH@AC5U^Yiod_4W4l_V@Sq`uh6&`}_X>{{R2~TWLV^0002qNkl^sfqHC|*%qp+DVE=OwVRQ){8H6qCzBsS8yv zPRFw}Lh#+euxuqHJ@M{BSj%s0U5{ImH6K%b5WcLPhH}i6bL6b*zS!G)=k53BV?k;A zhA%NScwb}y(Q7v+LYiT3v*4umb5tc)Ny6*)Do9HP*a)$tQh_ZQFmV{{z(k#HXqvCy dU*zKm`454QOBEGnk`Vv^002ovPDHLkV1i>NAjALw literal 0 HcmV?d00001 diff --git a/games/devtest/mods/testnodes/textures/testnodes_parallax_extruded_normal.png b/games/devtest/mods/testnodes/textures/testnodes_parallax_extruded_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..b134699d0c82621f7ba10fcbf177f93a74ce7456 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9YeU0-AX089Hv)< Date: Sun, 11 Oct 2020 13:36:13 +0200 Subject: [PATCH 104/177] Add missing type check to InvRef:set_lists() (#10476) --- src/script/lua_api/l_inventory.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/script/lua_api/l_inventory.cpp b/src/script/lua_api/l_inventory.cpp index e41b5cb41..434d0a76c 100644 --- a/src/script/lua_api/l_inventory.cpp +++ b/src/script/lua_api/l_inventory.cpp @@ -280,6 +280,7 @@ int InvRef::l_set_lists(lua_State *L) Server *server = getServer(L); lua_pushnil(L); + luaL_checktype(L, 2, LUA_TTABLE); while (lua_next(L, 2)) { const char *listname = lua_tostring(L, -2); read_inventory_list(L, -1, tempInv, listname, server); From d6711025461b00d8c244b28d77abd09ccd7cd4b4 Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 13 Oct 2020 00:52:53 +0100 Subject: [PATCH 105/177] Give unnamed world names incrementing numbers. Format 'world' (#10247) Code created with help from GitHub users sirrobzeroone and pauloue, thank you. --- builtin/mainmenu/dlg_create_world.lua | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/builtin/mainmenu/dlg_create_world.lua b/builtin/mainmenu/dlg_create_world.lua index b2e706b6b..7566d2409 100644 --- a/builtin/mainmenu/dlg_create_world.lua +++ b/builtin/mainmenu/dlg_create_world.lua @@ -363,10 +363,18 @@ local function create_world_buttonhandler(this, fields) local gameindex = core.get_textlist_index("games") if gameindex ~= nil then + -- For unnamed worlds use the generated name 'world', + -- where the number increments: it is set to 1 larger than the largest + -- generated name number found. if worldname == "" then - local random_number = math.random(10000, 99999) - local random_world_name = "Unnamed" .. random_number - worldname = random_world_name + local worldnum_max = 0 + for _, world in ipairs(menudata.worldlist:get_list()) do + if world.name:match("^world%d+$") then + local worldnum = tonumber(world.name:sub(6)) + worldnum_max = math.max(worldnum_max, worldnum) + end + end + worldname = "world" .. worldnum_max + 1 end core.settings:set("fixed_map_seed", fields["te_seed"]) From 11f3deb9c4512b918de8f5e778bc8b9535bd62c7 Mon Sep 17 00:00:00 2001 From: JosiahWI <41302989+JosiahWI@users.noreply.github.com> Date: Tue, 13 Oct 2020 10:36:01 -0500 Subject: [PATCH 106/177] Pass ContentFeatures as reference to read_content_features (#10464) --- src/script/common/c_content.cpp | 5 +---- src/script/common/c_content.h | 3 ++- src/script/lua_api/l_item.cpp | 3 ++- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp index 147f6e3ed..a95cf94a1 100644 --- a/src/script/common/c_content.cpp +++ b/src/script/common/c_content.cpp @@ -491,13 +491,11 @@ TileDef read_tiledef(lua_State *L, int index, u8 drawtype) } /******************************************************************************/ -ContentFeatures read_content_features(lua_State *L, int index) +void read_content_features(lua_State *L, ContentFeatures &f, int index) { if(index < 0) index = lua_gettop(L) + 1 + index; - ContentFeatures f; - /* Cache existence of some callbacks */ lua_getfield(L, index, "on_construct"); if(!lua_isnil(L, -1)) f.has_on_construct = true; @@ -800,7 +798,6 @@ ContentFeatures read_content_features(lua_State *L, int index) getstringfield(L, index, "node_dig_prediction", f.node_dig_prediction); - return f; } void push_content_features(lua_State *L, const ContentFeatures &c) diff --git a/src/script/common/c_content.h b/src/script/common/c_content.h index 8f32e58eb..29d576355 100644 --- a/src/script/common/c_content.h +++ b/src/script/common/c_content.h @@ -67,7 +67,8 @@ struct collisionMoveResult; extern struct EnumString es_TileAnimationType[]; -ContentFeatures read_content_features (lua_State *L, int index); +void read_content_features (lua_State *L, ContentFeatures &f, + int index); void push_content_features (lua_State *L, const ContentFeatures &c); diff --git a/src/script/lua_api/l_item.cpp b/src/script/lua_api/l_item.cpp index 2d1124a4d..9e0da4034 100644 --- a/src/script/lua_api/l_item.cpp +++ b/src/script/lua_api/l_item.cpp @@ -570,7 +570,8 @@ int ModApiItemMod::l_register_item_raw(lua_State *L) // Read the node definition (content features) and register it if (def.type == ITEM_NODE) { - ContentFeatures f = read_content_features(L, table); + ContentFeatures f; + read_content_features(L, f, table); // when a mod reregisters ignore, only texture changes and such should // be done if (f.name == "ignore") From 521a04222a71325ef217d1214febf5591919e169 Mon Sep 17 00:00:00 2001 From: Lars Date: Mon, 12 Oct 2020 19:47:04 -0700 Subject: [PATCH 107/177] Avoid drawing invisible blocks on the client. --- src/client/clientmap.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/client/clientmap.cpp b/src/client/clientmap.cpp index 3124313e7..d372a8e46 100644 --- a/src/client/clientmap.cpp +++ b/src/client/clientmap.cpp @@ -124,12 +124,6 @@ void ClientMap::updateDrawList() v3f camera_position = m_camera_position; v3f camera_direction = m_camera_direction; - f32 camera_fov = m_camera_fov; - - // Use a higher fov to accomodate faster camera movements. - // Blocks are cropped better when they are drawn. - // Or maybe they aren't? Well whatever. - camera_fov *= 1.2; v3s16 cam_pos_nodes = floatToInt(camera_position, BS); v3s16 p_blocks_min; @@ -190,7 +184,7 @@ void ClientMap::updateDrawList() float d = 0.0; if (!isBlockInSight(block->getPos(), camera_position, - camera_direction, camera_fov, range, &d)) + camera_direction, m_camera_fov, range, &d)) continue; From 2341a4aff1242e978d6fad3772d4d4fb015c040d Mon Sep 17 00:00:00 2001 From: Zughy <63455151+Zughy@users.noreply.github.com> Date: Tue, 13 Oct 2020 21:27:52 +0200 Subject: [PATCH 108/177] Add ObjectRef:get_children() (#10480) Co-authored-by: Zughy <4279489-marco_a@users.noreply.gitlab.com> --- doc/lua_api.txt | 2 ++ src/script/lua_api/l_object.cpp | 22 ++++++++++++++++++++++ src/script/lua_api/l_object.h | 3 +++ 3 files changed, 27 insertions(+) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index c8b294149..1631d564c 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -6206,6 +6206,8 @@ object you are working with still exists. should appear in first person. * `get_attach()`: returns parent, bone, position, rotation, forced_visible, or nil if it isn't attached. +* `get_children()`: returns a list of ObjectRefs that are attached to the + object. * `set_detach()` * `set_bone_position(bone, position, rotation)` * `bone`: string diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 57ed7e2cd..96c8c687c 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -738,6 +738,27 @@ int ObjectRef::l_get_attach(lua_State *L) return 5; } +// get_children(self) +int ObjectRef::l_get_children(lua_State *L) +{ + GET_ENV_PTR; + + ObjectRef *ref = checkobject(L, 1); + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + + const std::unordered_set child_ids = sao->getAttachmentChildIds(); + int i = 0; + lua_createtable(L, child_ids.size(), 0); + for (const int id : child_ids) { + ServerActiveObject *child = env->getActiveObject(id); + getScriptApiBase(L)->objectrefGetOrCreate(L, child); + lua_rawseti(L, -2, ++i); + } + return 1; +} + // set_detach(self) int ObjectRef::l_set_detach(lua_State *L) { @@ -2337,6 +2358,7 @@ luaL_Reg ObjectRef::methods[] = { luamethod(ObjectRef, get_bone_position), luamethod(ObjectRef, set_attach), luamethod(ObjectRef, get_attach), + luamethod(ObjectRef, get_children), luamethod(ObjectRef, set_detach), luamethod(ObjectRef, set_properties), luamethod(ObjectRef, get_properties), diff --git a/src/script/lua_api/l_object.h b/src/script/lua_api/l_object.h index ca03dfa2e..097a74cae 100644 --- a/src/script/lua_api/l_object.h +++ b/src/script/lua_api/l_object.h @@ -143,6 +143,9 @@ private: // get_attach(self) static int l_get_attach(lua_State *L); + // get_children(self) + static int l_get_children(lua_State *L); + // set_detach(self) static int l_set_detach(lua_State *L); From 05436fb551bb22b0a9c1d9f176a6891aa82d9cb2 Mon Sep 17 00:00:00 2001 From: Maksim Date: Sun, 24 May 2020 12:55:48 +0200 Subject: [PATCH 109/177] Android: get deps as a zip archive and sqlite3 from official source --- build/android/app/build.gradle | 2 +- build/android/build.gradle | 5 +- .../gradle/wrapper/gradle-wrapper.properties | 4 +- build/android/native/build.gradle | 63 +++++++++++++++---- 4 files changed, 57 insertions(+), 17 deletions(-) diff --git a/build/android/app/build.gradle b/build/android/app/build.gradle index e3619af17..8e87424b5 100644 --- a/build/android/app/build.gradle +++ b/build/android/app/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 29 buildToolsVersion '29.0.3' - ndkVersion '21.1.6352462' + ndkVersion '21.2.6472646' defaultConfig { applicationId 'net.minetest.minetest' minSdkVersion 16 diff --git a/build/android/build.gradle b/build/android/build.gradle index 8707b563c..4cde1c3d6 100644 --- a/build/android/build.gradle +++ b/build/android/build.gradle @@ -15,8 +15,8 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.6.3' - classpath 'org.ajoberstar.grgit:grgit-gradle:4.0.2' + classpath 'com.android.tools.build:gradle:4.0.0' + classpath 'de.undercouch:gradle-download-task:4.0.4' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } @@ -31,4 +31,5 @@ allprojects { task clean(type: Delete) { delete rootProject.buildDir + delete 'native/deps' } diff --git a/build/android/gradle/wrapper/gradle-wrapper.properties b/build/android/gradle/wrapper/gradle-wrapper.properties index d612cf333..59a00ebac 100644 --- a/build/android/gradle/wrapper/gradle-wrapper.properties +++ b/build/android/gradle/wrapper/gradle-wrapper.properties @@ -1,2 +1,2 @@ -#Mon Apr 06 00:06:16 CEST 2020 -distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip +#Fri Jun 05 19:18:07 CEST 2020 +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip diff --git a/build/android/native/build.gradle b/build/android/native/build.gradle index cbd50db6a..b072766b0 100644 --- a/build/android/native/build.gradle +++ b/build/android/native/build.gradle @@ -1,16 +1,16 @@ apply plugin: 'com.android.library' -import org.ajoberstar.grgit.Grgit +apply plugin: 'de.undercouch.download' android { compileSdkVersion 29 buildToolsVersion '29.0.3' - ndkVersion '21.1.6352462' + ndkVersion '21.2.6472646' defaultConfig { minSdkVersion 16 targetSdkVersion 29 externalNativeBuild { ndkBuild { - arguments '-j8', + arguments '-j' + Runtime.getRuntime().availableProcessors(), "versionMajor=${versionMajor}", "versionMinor=${versionMinor}", "versionPatch=${versionPatch}", @@ -45,15 +45,54 @@ android { } } -task cloneGitRepo() { - def destination = file('deps') - if(!destination.exists()) { - def grgit = Grgit.clone( - dir: destination, - uri: 'https://github.com/minetest/minetest_android_deps_binaries' - ) - grgit.close() +// get precompiled deps +def folder = 'minetest_android_deps_binaries' + +task downloadDeps(type: Download) { + src 'https://github.com/minetest/' + folder + '/archive/master.zip' + dest new File(buildDir, 'deps.zip') + overwrite false +} + +task getDeps(dependsOn: downloadDeps, type: Copy) { + def deps = file('deps') + def f = file("$buildDir/" + folder + "-master") + + if (!deps.exists() && !f.exists()) { + from zipTree(downloadDeps.dest) + into buildDir + } + + doLast { + if (!deps.exists()) { + file(f).renameTo(file(deps)) + } } } -preBuild.dependsOn cloneGitRepo +// get sqlite +def sqlite_ver = '3320200' +task downloadSqlite(dependsOn: getDeps, type: Download) { + src 'https://www.sqlite.org/2020/sqlite-amalgamation-' + sqlite_ver + '.zip' + dest new File(buildDir, 'sqlite.zip') + overwrite false +} + +task getSqlite(dependsOn: downloadSqlite, type: Copy) { + def sqlite = file('deps/Android/sqlite') + def f = file("$buildDir/sqlite-amalgamation-" + sqlite_ver) + + if (!sqlite.exists() && !f.exists()) { + from zipTree(downloadSqlite.dest) + into buildDir + } + + doLast { + if (!sqlite.exists()) { + file(f).renameTo(file(sqlite)) + } + } +} + +preBuild.dependsOn getDeps +preBuild.dependsOn getSqlite From e831ebd63bd8d173cc3ef10cb7d2ff2ed9f9090d Mon Sep 17 00:00:00 2001 From: Maksim Date: Sun, 24 May 2020 12:57:05 +0200 Subject: [PATCH 110/177] Android: add ci with saving artifacts --- .github/workflows/android.yml | 42 ++++++++++++++++++++++++++++++++++ build/android/app/build.gradle | 5 +++- 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/android.yml diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 000000000..0fcfe2390 --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,42 @@ +name: android + +# build on c/cpp changes or workflow changes +on: + push: + paths: + - 'lib/**.[ch]' + - 'lib/**.cpp' + - 'src/**.[ch]' + - 'src/**.cpp' + - 'build/android/**' + - '.github/workflows/android.yml' + pull_request: + paths: + - 'lib/**.[ch]' + - 'lib/**.cpp' + - 'src/**.[ch]' + - 'src/**.cpp' + - 'build/android/**' + - '.github/workflows/android.yml' + +jobs: + build: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Build with Gradle + run: cd build/android; ./gradlew assemblerelease + - name: Save armeabi artifact + uses: actions/upload-artifact@v2 + with: + name: Minetest-armeabi-v7a.apk + path: build/android/app/build/outputs/apk/release/app-armeabi-v7a-release-unsigned.apk + - name: Save arm64 artifact + uses: actions/upload-artifact@v2 + with: + name: Minetest-arm64-v8a.apk + path: build/android/app/build/outputs/apk/release/app-arm64-v8a-release-unsigned.apk diff --git a/build/android/app/build.gradle b/build/android/app/build.gradle index 8e87424b5..2c0a02b7f 100644 --- a/build/android/app/build.gradle +++ b/build/android/app/build.gradle @@ -11,8 +11,11 @@ android { versionCode project.versionCode } + // load properties Properties props = new Properties() - props.load(new FileInputStream(file('../local.properties'))) + def propfile = file('../local.properties') + if (propfile.exists()) + props.load(new FileInputStream(propfile)) if (props.getProperty('keystore') != null) { signingConfigs { From 2ca81d679f92ff1f0effccff5d3ee5672871324f Mon Sep 17 00:00:00 2001 From: Maksim Date: Mon, 7 Sep 2020 22:12:31 +0200 Subject: [PATCH 111/177] Android: update gradle, NDK and built tools version --- build/android/app/build.gradle | 6 +++--- build/android/build.gradle | 4 ++-- build/android/gradle/wrapper/gradle-wrapper.properties | 8 ++++++-- build/android/native/build.gradle | 4 ++-- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/build/android/app/build.gradle b/build/android/app/build.gradle index 2c0a02b7f..812726030 100644 --- a/build/android/app/build.gradle +++ b/build/android/app/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'com.android.application' android { compileSdkVersion 29 - buildToolsVersion '29.0.3' - ndkVersion '21.2.6472646' + buildToolsVersion '30.0.2' + ndkVersion '21.3.6528147' defaultConfig { applicationId 'net.minetest.minetest' minSdkVersion 16 @@ -110,5 +110,5 @@ android.applicationVariants.all { variant -> dependencies { implementation project(':native') - implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.appcompat:appcompat:1.2.0' } diff --git a/build/android/build.gradle b/build/android/build.gradle index 4cde1c3d6..111a506e1 100644 --- a/build/android/build.gradle +++ b/build/android/build.gradle @@ -15,8 +15,8 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:4.0.0' - classpath 'de.undercouch:gradle-download-task:4.0.4' + classpath 'com.android.tools.build:gradle:4.0.1' + classpath 'de.undercouch:gradle-download-task:4.1.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/build/android/gradle/wrapper/gradle-wrapper.properties b/build/android/gradle/wrapper/gradle-wrapper.properties index 59a00ebac..ed85703f3 100644 --- a/build/android/gradle/wrapper/gradle-wrapper.properties +++ b/build/android/gradle/wrapper/gradle-wrapper.properties @@ -1,2 +1,6 @@ -#Fri Jun 05 19:18:07 CEST 2020 -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip +#Mon Sep 07 22:11:10 CEST 2020 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-all.zip diff --git a/build/android/native/build.gradle b/build/android/native/build.gradle index b072766b0..69e1cf461 100644 --- a/build/android/native/build.gradle +++ b/build/android/native/build.gradle @@ -3,8 +3,8 @@ apply plugin: 'de.undercouch.download' android { compileSdkVersion 29 - buildToolsVersion '29.0.3' - ndkVersion '21.2.6472646' + buildToolsVersion '30.0.2' + ndkVersion '21.3.6528147' defaultConfig { minSdkVersion 16 targetSdkVersion 29 From 7499ebe46af072e911fa4902faf0a7343559d2c3 Mon Sep 17 00:00:00 2001 From: Zughy <63455151+Zughy@users.noreply.github.com> Date: Tue, 13 Oct 2020 21:28:53 +0200 Subject: [PATCH 112/177] Fix float argument check in minetest.set_timeofday() (#10483) Co-authored-by: Zughy <4279489-marco_a@users.noreply.gitlab.com> --- src/script/lua_api/l_env.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp index 8d50d664d..021ef2ea7 100644 --- a/src/script/lua_api/l_env.cpp +++ b/src/script/lua_api/l_env.cpp @@ -751,8 +751,9 @@ int ModApiEnvMod::l_set_timeofday(lua_State *L) // Do it float timeofday_f = readParam(L, 1); - sanity_check(timeofday_f >= 0.0 && timeofday_f <= 1.0); - int timeofday_mh = (int)(timeofday_f * 24000.0); + luaL_argcheck(L, timeofday_f >= 0.0f && timeofday_f <= 1.0f, 1, + "value must be between 0 and 1"); + int timeofday_mh = (int)(timeofday_f * 24000.0f); // This should be set directly in the environment but currently // such changes aren't immediately sent to the clients, so call // the server instead. From fc2e120b03e65feb9ccfb92f9d3b68fda230bc7b Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 13 Oct 2020 23:57:46 +0100 Subject: [PATCH 113/177] Document how to work with ClangFormat (#10468) To avoid the common misunderstanding where a contributor thinks they must apply the unsuitable formatting requests ClangFormat makes. --- .github/CONTRIBUTING.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index b234fb283..e57ea9f83 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -43,6 +43,14 @@ Contributions are welcome! Here's how you can help: 4. The code's interfaces are well designed, regardless of other aspects that might need more work in the future. 5. It uses protocols and formats which include the required compatibility. +### Important note about automated GitHub checks + +When you submit a pull request, GitHub automatically runs checks on the Minetest Engine combined with your changes. One of these checks is called 'cpp lint / clang format', which checks code formatting. +Because formatting for readability requires human judgement this check often fails and often makes unsuitable formatting requests which make code readability worse. + +If this check fails, look at the details to check for any clear mistakes and correct those. However you should not apply everything ClangFormat requests, ignore requests that make code readability worse and any other clearly unsuitable requests. +Discuss with a core developer if in any doubt and for how to progress. + ## Issues If you experience an issue, we would like to know the details - especially when a stable release is on the way. From 2f871e3b49d87b0ae0e7b52f7ead6d3512727f0f Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 13 Oct 2020 23:59:47 +0100 Subject: [PATCH 114/177] Devtest hand tool: Update capabilities, add creative mode capabilities (#10484) --- games/devtest/mods/basetools/init.lua | 60 ++++++++++++++++++++------- 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/games/devtest/mods/basetools/init.lua b/games/devtest/mods/basetools/init.lua index e4a36ca46..bd7480030 100644 --- a/games/devtest/mods/basetools/init.lua +++ b/games/devtest/mods/basetools/init.lua @@ -6,7 +6,7 @@ Tool types: -* Hand: basic tool/weapon (just for convenience, not optimized for testing) +* Hand: basic tool/weapon (special capabilities in creative mode) * Pickaxe: dig cracky * Axe: dig choppy * Shovel: dig crumbly @@ -24,21 +24,49 @@ Tool materials: ]] -- The hand -minetest.register_item(":", { - type = "none", - wield_image = "wieldhand.png", - wield_scale = {x=1,y=1,z=2.5}, - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level = 0, - groupcaps = { - crumbly = {times={[3]=1.50}, uses=0, maxlevel=0}, - snappy = {times={[3]=1.50}, uses=0, maxlevel=0}, - oddly_breakable_by_hand = {times={[1]=7.00,[2]=4.00,[3]=2.00}, uses=0, maxlevel=0}, - }, - damage_groups = {fleshy=1}, - } -}) +if minetest.settings:get_bool("creative_mode") then + local digtime = 42 + local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 256} + + minetest.register_item(":", { + type = "none", + wield_image = "wieldhand.png", + wield_scale = {x = 1, y = 1, z = 2.5}, + range = 10, + tool_capabilities = { + full_punch_interval = 0.5, + max_drop_level = 3, + groupcaps = { + crumbly = caps, + cracky = caps, + snappy = caps, + choppy = caps, + oddly_breakable_by_hand = caps, + -- dig_immediate group doesn't use value 1. Value 3 is instant dig + dig_immediate = + {times = {[2] = digtime, [3] = 0}, uses = 0, maxlevel = 256}, + }, + damage_groups = {fleshy = 10}, + } + }) +else + minetest.register_item(":", { + type = "none", + wield_image = "wieldhand.png", + wield_scale = {x = 1, y = 1, z = 2.5}, + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level = 0, + groupcaps = { + crumbly = {times = {[2] = 3.00, [3] = 0.70}, uses = 0, maxlevel = 1}, + snappy = {times = {[3] = 0.40}, uses = 0, maxlevel = 1}, + oddly_breakable_by_hand = + {times = {[1] = 3.50, [2] = 2.00, [3] = 0.70}, uses = 0} + }, + damage_groups = {fleshy = 1}, + } + }) +end -- Mese Pickaxe: special tool that digs "everything" instantly minetest.register_tool("basetools:pick_mese", { From f43d1cfa81aa496174af6cdfa648dab9dd17288c Mon Sep 17 00:00:00 2001 From: Lars Date: Tue, 13 Oct 2020 12:38:34 -0700 Subject: [PATCH 115/177] Rely on max_simultaneous_block_sends_per_client to limit blocks sent to the client. --- src/clientiface.cpp | 18 +----------------- src/clientiface.h | 1 - 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/src/clientiface.cpp b/src/clientiface.cpp index 28a0ee770..a01cba7e0 100644 --- a/src/clientiface.cpp +++ b/src/clientiface.cpp @@ -99,7 +99,6 @@ void RemoteClient::GetNextBlocks ( { // Increment timers m_nothing_to_send_pause_timer -= dtime; - m_nearest_unsent_reset_timer += dtime; if (m_nothing_to_send_pause_timer >= 0) return; @@ -154,14 +153,6 @@ void RemoteClient::GetNextBlocks ( /*infostream<<"m_nearest_unsent_reset_timer=" < 20.0f) { - m_nearest_unsent_reset_timer = 0.0f; - m_nearest_unsent_d = 0; - //infostream<<"Resetting m_nearest_unsent_d for " - // <getPlayerName(peer_id)< d_start + max_d_increment_at_time) - d_max = d_start + max_d_increment_at_time; - // cos(angle between velocity and camera) * |velocity| // Limit to 0.0f in case player moves backwards. f32 dot = rangelim(camera_dir.dotProduct(playerspeed), 0.0f, 300.0f); @@ -238,7 +222,7 @@ void RemoteClient::GetNextBlocks ( const v3s16 cam_pos_nodes = floatToInt(camera_pos, BS); s16 d; - for (d = d_start; d <= d_max; d++) { + for (d = d_start; d <= full_d_max; d++) { /* Get the border/face dot coordinates of a "d-radiused" box diff --git a/src/clientiface.h b/src/clientiface.h index 83fa6fe99..ca2af65fe 100644 --- a/src/clientiface.h +++ b/src/clientiface.h @@ -364,7 +364,6 @@ private: std::set m_blocks_sent; s16 m_nearest_unsent_d = 0; v3s16 m_last_center; - float m_nearest_unsent_reset_timer = 0.0f; const u16 m_max_simul_sends; const float m_min_time_from_building; From ed22260822086f84016aa8384c3174bfc6d1739d Mon Sep 17 00:00:00 2001 From: Lars Date: Mon, 12 Oct 2020 13:29:31 -0700 Subject: [PATCH 116/177] Remove all bump mapping and parallax occlusion related code. --- builtin/mainmenu/tab_settings.lua | 30 ++---- builtin/settingtypes.txt | 25 ----- .../shaders/nodes_shader/opengl_fragment.glsl | 99 ------------------- .../shaders/nodes_shader/opengl_vertex.glsl | 45 +-------- .../object_shader/opengl_fragment.glsl | 54 ---------- .../shaders/object_shader/opengl_vertex.glsl | 5 - doc/lua_api.txt | 40 +------- src/client/game.cpp | 10 +- src/client/mapblock_mesh.cpp | 41 ++------ src/client/mapblock_mesh.h | 5 +- src/client/mesh_generator_thread.cpp | 6 +- src/client/mesh_generator_thread.h | 1 - src/client/shader.cpp | 29 ------ src/client/wieldmesh.cpp | 2 +- src/defaultsettings.cpp | 6 -- src/nodedef.cpp | 9 -- src/nodedef.h | 1 - 17 files changed, 24 insertions(+), 384 deletions(-) diff --git a/builtin/mainmenu/tab_settings.lua b/builtin/mainmenu/tab_settings.lua index 510346f8d..8a7445394 100644 --- a/builtin/mainmenu/tab_settings.lua +++ b/builtin/mainmenu/tab_settings.lua @@ -187,31 +187,23 @@ local function formspec(tabview, name, tabdata) if shaders_enabled then tab_string = tab_string .. - "checkbox[8.25,0.5;cb_bumpmapping;" .. fgettext("Bump Mapping") .. ";" - .. dump(core.settings:get_bool("enable_bumpmapping")) .. "]" .. - "checkbox[8.25,1;cb_tonemapping;" .. fgettext("Tone Mapping") .. ";" + "checkbox[8.25,0.5;cb_tonemapping;" .. fgettext("Tone Mapping") .. ";" .. dump(core.settings:get_bool("tone_mapping")) .. "]" .. - "checkbox[8.25,1.5;cb_parallax;" .. fgettext("Parallax Occlusion") .. ";" - .. dump(core.settings:get_bool("enable_parallax_occlusion")) .. "]" .. - "checkbox[8.25,2;cb_waving_water;" .. fgettext("Waving Liquids") .. ";" + "checkbox[8.25,1;cb_waving_water;" .. fgettext("Waving Liquids") .. ";" .. dump(core.settings:get_bool("enable_waving_water")) .. "]" .. - "checkbox[8.25,2.5;cb_waving_leaves;" .. fgettext("Waving Leaves") .. ";" + "checkbox[8.25,1.5;cb_waving_leaves;" .. fgettext("Waving Leaves") .. ";" .. dump(core.settings:get_bool("enable_waving_leaves")) .. "]" .. - "checkbox[8.25,3;cb_waving_plants;" .. fgettext("Waving Plants") .. ";" + "checkbox[8.25,2;cb_waving_plants;" .. fgettext("Waving Plants") .. ";" .. dump(core.settings:get_bool("enable_waving_plants")) .. "]" else tab_string = tab_string .. "label[8.38,0.7;" .. core.colorize("#888888", - fgettext("Bump Mapping")) .. "]" .. - "label[8.38,1.2;" .. core.colorize("#888888", fgettext("Tone Mapping")) .. "]" .. - "label[8.38,1.7;" .. core.colorize("#888888", - fgettext("Parallax Occlusion")) .. "]" .. - "label[8.38,2.2;" .. core.colorize("#888888", + "label[8.38,1.2;" .. core.colorize("#888888", fgettext("Waving Liquids")) .. "]" .. - "label[8.38,2.7;" .. core.colorize("#888888", + "label[8.38,1.7;" .. core.colorize("#888888", fgettext("Waving Leaves")) .. "]" .. - "label[8.38,3.2;" .. core.colorize("#888888", + "label[8.38,2.2;" .. core.colorize("#888888", fgettext("Waving Plants")) .. "]" end @@ -263,18 +255,10 @@ local function handle_settings_buttons(this, fields, tabname, tabdata) end return true end - if fields["cb_bumpmapping"] then - core.settings:set("enable_bumpmapping", fields["cb_bumpmapping"]) - return true - end if fields["cb_tonemapping"] then core.settings:set("tone_mapping", fields["cb_tonemapping"]) return true end - if fields["cb_parallax"] then - core.settings:set("enable_parallax_occlusion", fields["cb_parallax"]) - return true - end if fields["cb_waving_water"] then core.settings:set("enable_waving_water", fields["cb_waving_water"]) return true diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 1c28470d5..27f375693 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -546,31 +546,6 @@ shader_path (Shader path) path # enhanced, highlights and shadows are gradually compressed. tone_mapping (Filmic tone mapping) bool false -[***Bumpmapping] - -# Enables bumpmapping for textures. Normalmaps need to be supplied by the texture pack. -# Requires shaders to be enabled. -enable_bumpmapping (Bumpmapping) bool false - -[***Parallax Occlusion] - -# Enables parallax occlusion mapping. -# Requires shaders to be enabled. -enable_parallax_occlusion (Parallax occlusion) bool false - -# 0 = parallax occlusion with slope information (faster). -# 1 = relief mapping (slower, more accurate). -parallax_occlusion_mode (Parallax occlusion mode) int 1 0 1 - -# Number of parallax occlusion iterations. -parallax_occlusion_iterations (Parallax occlusion iterations) int 4 - -# Overall scale of parallax occlusion effect. -parallax_occlusion_scale (Parallax occlusion scale) float 0.08 - -# Overall bias of parallax occlusion effect, usually scale/2. -parallax_occlusion_bias (Parallax occlusion bias) float 0.04 - [***Waving Nodes] # Set to true to enable waving liquids (like water). diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl index 437b325d3..36d47d1f5 100644 --- a/client/shaders/nodes_shader/opengl_fragment.glsl +++ b/client/shaders/nodes_shader/opengl_fragment.glsl @@ -1,6 +1,4 @@ uniform sampler2D baseTexture; -uniform sampler2D normalTexture; -uniform sampler2D textureFlags; uniform vec4 skyBgColor; uniform float fogDistance; @@ -17,17 +15,9 @@ varying vec3 vPosition; // cameraOffset + worldPosition (for large coordinates the limits of float // precision must be considered). varying vec3 worldPosition; -varying float area_enable_parallax; varying vec3 eyeVec; -varying vec3 tsEyeVec; -varying vec3 lightVec; -varying vec3 tsLightVec; -bool normalTexturePresent = false; - -const float e = 2.718281828459; -const float BS = 10.0; const float fogStart = FOG_START; const float fogShadingParameter = 1 / ( 1 - fogStart); @@ -63,87 +53,10 @@ vec4 applyToneMapping(vec4 color) } #endif -void get_texture_flags() -{ - vec4 flags = texture2D(textureFlags, vec2(0.0, 0.0)); - if (flags.r > 0.5) { - normalTexturePresent = true; - } -} - -vec4 get_normal_map(vec2 uv) -{ - vec4 bump = texture2D(normalTexture, uv).rgba; - bump.xyz = normalize(bump.xyz * 2.0 - 1.0); - return bump; -} - -float find_intersection(vec2 dp, vec2 ds) -{ - float depth = 1.0; - float best_depth = 0.0; - float size = 0.0625; - for (int i = 0; i < 15; i++) { - depth -= size; - float h = texture2D(normalTexture, dp + ds * depth).a; - if (depth <= h) { - best_depth = depth; - break; - } - } - depth = best_depth; - for (int i = 0; i < 4; i++) { - size *= 0.5; - float h = texture2D(normalTexture,dp + ds * depth).a; - if (depth <= h) { - best_depth = depth; - depth += size; - } else { - depth -= size; - } - } - return best_depth; -} - void main(void) { vec3 color; - vec4 bump; vec2 uv = gl_TexCoord[0].st; - bool use_normalmap = false; - get_texture_flags(); - -#ifdef ENABLE_PARALLAX_OCCLUSION - vec2 eyeRay = vec2 (tsEyeVec.x, -tsEyeVec.y); - const float scale = PARALLAX_OCCLUSION_SCALE / PARALLAX_OCCLUSION_ITERATIONS; - const float bias = PARALLAX_OCCLUSION_BIAS / PARALLAX_OCCLUSION_ITERATIONS; - -#if PARALLAX_OCCLUSION_MODE == 0 - // Parallax occlusion with slope information - if (normalTexturePresent && area_enable_parallax > 0.0) { - for (int i = 0; i < PARALLAX_OCCLUSION_ITERATIONS; i++) { - vec4 normal = texture2D(normalTexture, uv.xy); - float h = normal.a * scale - bias; - uv += h * normal.z * eyeRay; - } - } -#endif -#if PARALLAX_OCCLUSION_MODE == 1 - // Relief mapping - if (normalTexturePresent && area_enable_parallax > 0.0) { - vec2 ds = eyeRay * PARALLAX_OCCLUSION_SCALE; - float dist = find_intersection(uv, ds); - uv += dist * ds; - } -#endif -#endif - -#if USE_NORMALMAPS == 1 - if (normalTexturePresent) { - bump = get_normal_map(uv); - use_normalmap = true; - } -#endif vec4 base = texture2D(baseTexture, uv).rgba; @@ -155,19 +68,7 @@ void main(void) } #endif -#ifdef ENABLE_BUMPMAPPING - if (use_normalmap) { - vec3 L = normalize(lightVec); - vec3 E = normalize(eyeVec); - float specular = pow(clamp(dot(reflect(L, bump.xyz), E), 0.0, 1.0), 1.0); - float diffuse = dot(-E,bump.xyz); - color = (diffuse + 0.1 * specular) * base.rgb; - } else { - color = base.rgb; - } -#else color = base.rgb; -#endif vec4 col = vec4(color.rgb * gl_Color.rgb, 1.0); diff --git a/client/shaders/nodes_shader/opengl_vertex.glsl b/client/shaders/nodes_shader/opengl_vertex.glsl index 0d8d0a2a5..56bff09a8 100644 --- a/client/shaders/nodes_shader/opengl_vertex.glsl +++ b/client/shaders/nodes_shader/opengl_vertex.glsl @@ -18,10 +18,6 @@ varying vec3 vPosition; varying vec3 worldPosition; varying vec3 eyeVec; -varying vec3 lightVec; -varying vec3 tsEyeVec; -varying vec3 tsLightVec; -varying float area_enable_parallax; // Color of the light emitted by the light sources. const vec3 artificialLight = vec3(1.04, 1.04, 1.04); @@ -86,21 +82,9 @@ float snoise(vec3 p) void main(void) { gl_TexCoord[0] = gl_MultiTexCoord0; - //TODO: make offset depending on view angle and parallax uv displacement - //thats for textures that doesnt align vertically, like dirt with grass - //gl_TexCoord[0].y += 0.008; - //Allow parallax/relief mapping only for certain kind of nodes - //Variable is also used to control area of the effect -#if (DRAW_TYPE == NDT_NORMAL || DRAW_TYPE == NDT_LIQUID || DRAW_TYPE == NDT_FLOWINGLIQUID) - area_enable_parallax = 1.0; -#else - area_enable_parallax = 0.0; -#endif - - -float disp_x; -float disp_z; + float disp_x; + float disp_z; // OpenGL < 4.3 does not support continued preprocessor lines #if (MATERIAL_TYPE == TILE_MATERIAL_WAVING_LEAVES && ENABLE_WAVING_LEAVES) || (MATERIAL_TYPE == TILE_MATERIAL_WAVING_PLANTS && ENABLE_WAVING_PLANTS) vec4 pos2 = mWorld * gl_Vertex; @@ -148,32 +132,7 @@ float disp_z; vPosition = gl_Position.xyz; - // Don't generate heightmaps when too far from the eye - float dist = distance (vec3(0.0, 0.0, 0.0), vPosition); - if (dist > 150.0) { - area_enable_parallax = 0.0; - } - - vec3 sunPosition = vec3 (0.0, eyePosition.y * BS + 900.0, 0.0); - - vec3 normal, tangent, binormal; - normal = normalize(gl_NormalMatrix * gl_Normal); - tangent = normalize(gl_NormalMatrix * gl_MultiTexCoord1.xyz); - binormal = normalize(gl_NormalMatrix * gl_MultiTexCoord2.xyz); - - vec3 v; - - lightVec = sunPosition - worldPosition; - v.x = dot(lightVec, tangent); - v.y = dot(lightVec, binormal); - v.z = dot(lightVec, normal); - tsLightVec = normalize (v); - eyeVec = -(gl_ModelViewMatrix * gl_Vertex).xyz; - v.x = dot(eyeVec, tangent); - v.y = dot(eyeVec, binormal); - v.z = dot(eyeVec, normal); - tsEyeVec = normalize (v); // Calculate color. // Red, green and blue components are pre-multiplied with diff --git a/client/shaders/object_shader/opengl_fragment.glsl b/client/shaders/object_shader/opengl_fragment.glsl index a8a43e1e2..86d5c1c92 100644 --- a/client/shaders/object_shader/opengl_fragment.glsl +++ b/client/shaders/object_shader/opengl_fragment.glsl @@ -1,6 +1,4 @@ uniform sampler2D baseTexture; -uniform sampler2D normalTexture; -uniform sampler2D textureFlags; uniform vec4 emissiveColor; uniform vec4 skyBgColor; @@ -12,14 +10,8 @@ varying vec3 vPosition; varying vec3 worldPosition; varying vec3 eyeVec; -varying vec3 lightVec; varying float vIDiff; -bool normalTexturePresent = false; -bool texTileableHorizontal = false; -bool texTileableVertical = false; -bool texSeamless = false; - const float e = 2.718281828459; const float BS = 10.0; const float fogStart = FOG_START; @@ -57,44 +49,10 @@ vec4 applyToneMapping(vec4 color) } #endif -void get_texture_flags() -{ - vec4 flags = texture2D(textureFlags, vec2(0.0, 0.0)); - if (flags.r > 0.5) { - normalTexturePresent = true; - } - if (flags.g > 0.5) { - texTileableHorizontal = true; - } - if (flags.b > 0.5) { - texTileableVertical = true; - } - if (texTileableHorizontal && texTileableVertical) { - texSeamless = true; - } -} - -vec4 get_normal_map(vec2 uv) -{ - vec4 bump = texture2D(normalTexture, uv).rgba; - bump.xyz = normalize(bump.xyz * 2.0 - 1.0); - return bump; -} - void main(void) { vec3 color; - vec4 bump; vec2 uv = gl_TexCoord[0].st; - bool use_normalmap = false; - get_texture_flags(); - -#if USE_NORMALMAPS == 1 - if (normalTexturePresent) { - bump = get_normal_map(uv); - use_normalmap = true; - } -#endif vec4 base = texture2D(baseTexture, uv).rgba; @@ -106,19 +64,7 @@ void main(void) } #endif -#ifdef ENABLE_BUMPMAPPING - if (use_normalmap) { - vec3 L = normalize(lightVec); - vec3 E = normalize(eyeVec); - float specular = pow(clamp(dot(reflect(L, bump.xyz), E), 0.0, 1.0), 1.0); - float diffuse = dot(-E,bump.xyz); - color = (diffuse + 0.1 * specular) * base.rgb; - } else { - color = base.rgb; - } -#else color = base.rgb; -#endif vec4 col = vec4(color.rgb, base.a); diff --git a/client/shaders/object_shader/opengl_vertex.glsl b/client/shaders/object_shader/opengl_vertex.glsl index 968a07e22..f8c1cd932 100644 --- a/client/shaders/object_shader/opengl_vertex.glsl +++ b/client/shaders/object_shader/opengl_vertex.glsl @@ -9,7 +9,6 @@ varying vec3 vPosition; varying vec3 worldPosition; varying vec3 eyeVec; -varying vec3 lightVec; varying float vIDiff; const float e = 2.718281828459; @@ -33,10 +32,6 @@ void main(void) vPosition = gl_Position.xyz; vNormal = gl_Normal; worldPosition = (mWorld * gl_Vertex).xyz; - - vec3 sunPosition = vec3 (0.0, eyePosition.y * BS + 900.0, 0.0); - - lightVec = sunPosition - worldPosition; eyeVec = -(gl_ModelViewMatrix * gl_Vertex).xyz; #if (MATERIAL_TYPE == TILE_MATERIAL_PLAIN) || (MATERIAL_TYPE == TILE_MATERIAL_PLAIN_ALPHA) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 1631d564c..d3aaa309c 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -401,35 +401,6 @@ stripping out the file extension: * e.g. `foomod_foothing` -Normalmap Textures ------------------- - -If shaders and bumpmapping or parallax occlusion is enabled, Minetest tries -to load normalmaps. -Those image files have to end with `_normal.png` and start with the same name -as their corresponding texture. -For example a normalmap for `foomod_foothing.png` has to be called -`foomod_foothing_normal.png`. - -The sRGB R, G and B colour values of a normalmap pixel are each directly -mapped from `{0, ..., 255}` to `[-1, 1]` and, taken together, -define the normal vector. -The alpha channel defines the heightmap for parallax occlusion. -To be safe, the alpha values should always be bigger than zero -because the colour values, which define the normal vector, -may be undefined for image formats where colour is discarded in fully -transparent pixels. - -Bumpmapping and parallax occlusion are currently experimental features: - -* Bumpmapping in Minetest happens in an obscure way; there are no light sources - defined in the shaders except the sunlight direction. -* Parallax occlusion with relief-mapping mode does not yet work correctly - together with Minetest's Fastfaces. -* The normalmap files must end with `.png`, so other image files are not - supported. - - Texture modifiers ----------------- @@ -834,7 +805,7 @@ Example (colored grass block): -- Overlay tiles: define them in the same style -- The top and bottom tile does not have overlay overlay_tiles = {"", "", - {name = "default_grass_side.png", tileable_vertical = false}}, + {name = "default_grass_side.png"}}, -- Global color, used in inventory color = "green", -- Palette in the world @@ -1204,7 +1175,7 @@ Look for examples in `games/devtest` or `games/minetest_game`. base cube without affecting them. * The base cube texture tiles are defined as normal, the `plantlike` extension uses the defined special tile, for example: - `special_tiles = {{name = "default_papyrus.png", tileable_vertical = true}},` + `special_tiles = {{name = "default_papyrus.png"}},` `*_optional` drawtypes need less rendering time if deactivated (always client-side). @@ -7043,13 +7014,8 @@ Tile definition * `"image.png"` * `{name="image.png", animation={Tile Animation definition}}` -* `{name="image.png", backface_culling=bool, tileable_vertical=bool, - tileable_horizontal=bool, align_style="node"/"world"/"user", scale=int}` +* `{name="image.png", backface_culling=bool, align_style="node"/"world"/"user", scale=int}` * backface culling enabled by default for most nodes - * tileable flags are info for shaders, how they should treat texture - when displacement mapping is used. - Directions are from the point of view of the tile texture, - not the node it's on. * align style determines whether the texture will be rotated with the node or kept aligned with its surroundings. "user" means that client setting will be used, similar to `glasslike_framed_optional`. diff --git a/src/client/game.cpp b/src/client/game.cpp index 54e0c9f20..309a8e194 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -430,8 +430,6 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter CachedPixelShaderSetting m_camera_offset_pixel; CachedPixelShaderSetting m_camera_offset_vertex; CachedPixelShaderSetting m_base_texture; - CachedPixelShaderSetting m_normal_texture; - CachedPixelShaderSetting m_texture_flags; Client *m_client; public: @@ -464,8 +462,6 @@ public: m_camera_offset_pixel("cameraOffset"), m_camera_offset_vertex("cameraOffset"), m_base_texture("baseTexture"), - m_normal_texture("normalTexture"), - m_texture_flags("textureFlags"), m_client(client) { g_settings->registerChangedCallback("enable_fog", settingsCallback, this); @@ -553,12 +549,8 @@ public: m_camera_offset_pixel.set(camera_offset_array, services); m_camera_offset_vertex.set(camera_offset_array, services); - SamplerLayer_t base_tex = 0, - normal_tex = 1, - flags_tex = 2; + SamplerLayer_t base_tex = 0; m_base_texture.set(&base_tex, services); - m_normal_texture.set(&normal_tex, services); - m_texture_flags.set(&flags_tex, services); } }; diff --git a/src/client/mapblock_mesh.cpp b/src/client/mapblock_mesh.cpp index c7790f1e4..6a59fabe3 100644 --- a/src/client/mapblock_mesh.cpp +++ b/src/client/mapblock_mesh.cpp @@ -35,11 +35,9 @@ with this program; if not, write to the Free Software Foundation, Inc., MeshMakeData */ -MeshMakeData::MeshMakeData(Client *client, bool use_shaders, - bool use_tangent_vertices): +MeshMakeData::MeshMakeData(Client *client, bool use_shaders): m_client(client), - m_use_shaders(use_shaders), - m_use_tangent_vertices(use_tangent_vertices) + m_use_shaders(use_shaders) {} void MeshMakeData::fillBlockDataBegin(const v3s16 &blockpos) @@ -1016,7 +1014,6 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): for (auto &m : m_mesh) m = new scene::SMesh(); m_enable_shaders = data->m_use_shaders; - m_use_tangent_vertices = data->m_use_tangent_vertices; m_enable_vbo = g_settings->getBool("enable_vbo"); if (data->m_client->getMinimap()) { @@ -1170,28 +1167,12 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): scene::SMesh *mesh = (scene::SMesh *)m_mesh[layer]; - // Create meshbuffer, add to mesh - if (m_use_tangent_vertices) { - scene::SMeshBufferTangents *buf = - new scene::SMeshBufferTangents(); - buf->Material = material; - buf->Vertices.reallocate(p.vertices.size()); - buf->Indices.reallocate(p.indices.size()); - for (const video::S3DVertex &v: p.vertices) - buf->Vertices.push_back(video::S3DVertexTangents(v.Pos, v.Color, v.TCoords)); - for (u16 i: p.indices) - buf->Indices.push_back(i); - buf->recalculateBoundingBox(); - mesh->addMeshBuffer(buf); - buf->drop(); - } else { - scene::SMeshBuffer *buf = new scene::SMeshBuffer(); - buf->Material = material; - buf->append(&p.vertices[0], p.vertices.size(), - &p.indices[0], p.indices.size()); - mesh->addMeshBuffer(buf); - buf->drop(); - } + scene::SMeshBuffer *buf = new scene::SMeshBuffer(); + buf->Material = material; + buf->append(&p.vertices[0], p.vertices.size(), + &p.indices[0], p.indices.size()); + mesh->addMeshBuffer(buf); + buf->drop(); } /* @@ -1201,12 +1182,6 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset): translateMesh(m_mesh[layer], intToFloat(data->m_blockpos * MAP_BLOCKSIZE - camera_offset, BS)); - if (m_use_tangent_vertices) { - scene::IMeshManipulator* meshmanip = - RenderingEngine::get_scene_manager()->getMeshManipulator(); - meshmanip->recalculateTangents(m_mesh[layer], true, false, false); - } - if (m_mesh[layer]) { #if 0 // Usually 1-700 faces and 1-7 materials diff --git a/src/client/mapblock_mesh.h b/src/client/mapblock_mesh.h index f8aed40dc..6a9c00ed5 100644 --- a/src/client/mapblock_mesh.h +++ b/src/client/mapblock_mesh.h @@ -45,10 +45,8 @@ struct MeshMakeData Client *m_client; bool m_use_shaders; - bool m_use_tangent_vertices; - MeshMakeData(Client *client, bool use_shaders, - bool use_tangent_vertices = false); + MeshMakeData(Client *client, bool use_shaders); /* Copy block data manually (to allow optimizations by the caller) @@ -136,7 +134,6 @@ private: IShaderSource *m_shdrsrc; bool m_enable_shaders; - bool m_use_tangent_vertices; bool m_enable_vbo; // Must animate() be called before rendering? diff --git a/src/client/mesh_generator_thread.cpp b/src/client/mesh_generator_thread.cpp index 53b980eeb..c8d1cba26 100644 --- a/src/client/mesh_generator_thread.cpp +++ b/src/client/mesh_generator_thread.cpp @@ -52,9 +52,6 @@ MeshUpdateQueue::MeshUpdateQueue(Client *client): m_client(client) { m_cache_enable_shaders = g_settings->getBool("enable_shaders"); - m_cache_use_tangent_vertices = m_cache_enable_shaders && ( - g_settings->getBool("enable_bumpmapping") || - g_settings->getBool("enable_parallax_occlusion")); m_cache_smooth_lighting = g_settings->getBool("smooth_lighting"); m_meshgen_block_cache_size = g_settings->getS32("meshgen_block_cache_size"); } @@ -207,8 +204,7 @@ CachedMapBlockData* MeshUpdateQueue::getCachedBlock(const v3s16 &p) void MeshUpdateQueue::fillDataFromMapBlockCache(QueuedMeshUpdate *q) { - MeshMakeData *data = new MeshMakeData(m_client, m_cache_enable_shaders, - m_cache_use_tangent_vertices); + MeshMakeData *data = new MeshMakeData(m_client, m_cache_enable_shaders); q->data = data; data->fillBlockDataBegin(q->p); diff --git a/src/client/mesh_generator_thread.h b/src/client/mesh_generator_thread.h index 9a42852a3..f3c5e7da8 100644 --- a/src/client/mesh_generator_thread.h +++ b/src/client/mesh_generator_thread.h @@ -88,7 +88,6 @@ private: // TODO: Add callback to update these when g_settings changes bool m_cache_enable_shaders; - bool m_cache_use_tangent_vertices; bool m_cache_smooth_lighting; int m_meshgen_block_cache_size; diff --git a/src/client/shader.cpp b/src/client/shader.cpp index c5fe5dfe0..e2eeb4ab0 100644 --- a/src/client/shader.cpp +++ b/src/client/shader.cpp @@ -688,35 +688,6 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp shaders_header += itos(drawtype); shaders_header += "\n"; - if (g_settings->getBool("enable_bumpmapping")) - shaders_header += "#define ENABLE_BUMPMAPPING\n"; - - if (g_settings->getBool("enable_parallax_occlusion")){ - int mode = g_settings->getFloat("parallax_occlusion_mode"); - float scale = g_settings->getFloat("parallax_occlusion_scale"); - float bias = g_settings->getFloat("parallax_occlusion_bias"); - int iterations = g_settings->getFloat("parallax_occlusion_iterations"); - shaders_header += "#define ENABLE_PARALLAX_OCCLUSION\n"; - shaders_header += "#define PARALLAX_OCCLUSION_MODE "; - shaders_header += itos(mode); - shaders_header += "\n"; - shaders_header += "#define PARALLAX_OCCLUSION_SCALE "; - shaders_header += ftos(scale); - shaders_header += "\n"; - shaders_header += "#define PARALLAX_OCCLUSION_BIAS "; - shaders_header += ftos(bias); - shaders_header += "\n"; - shaders_header += "#define PARALLAX_OCCLUSION_ITERATIONS "; - shaders_header += itos(iterations); - shaders_header += "\n"; - } - - shaders_header += "#define USE_NORMALMAPS "; - if (g_settings->getBool("enable_bumpmapping") || g_settings->getBool("enable_parallax_occlusion")) - shaders_header += "1\n"; - else - shaders_header += "0\n"; - if (g_settings->getBool("enable_waving_water")){ shaders_header += "#define ENABLE_WAVING_WATER 1\n"; shaders_header += "#define WATER_WAVE_HEIGHT "; diff --git a/src/client/wieldmesh.cpp b/src/client/wieldmesh.cpp index 285cc38e5..ad583210a 100644 --- a/src/client/wieldmesh.cpp +++ b/src/client/wieldmesh.cpp @@ -305,7 +305,7 @@ void WieldMeshSceneNode::setExtruded(const std::string &imagename, scene::SMesh *createSpecialNodeMesh(Client *client, content_t id, std::vector *colors, const ContentFeatures &f) { - MeshMakeData mesh_make_data(client, false, false); + MeshMakeData mesh_make_data(client, false); MeshCollector collector; mesh_make_data.setSmoothLighting(false); MapblockMeshGenerator gen(&mesh_make_data, &collector); diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 8f5ed3e17..6c7d4be97 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -251,12 +251,6 @@ void set_default_settings(Settings *settings) settings->setDefault("bilinear_filter", "false"); settings->setDefault("trilinear_filter", "false"); settings->setDefault("tone_mapping", "false"); - settings->setDefault("enable_bumpmapping", "false"); - settings->setDefault("enable_parallax_occlusion", "false"); - settings->setDefault("parallax_occlusion_mode", "1"); - settings->setDefault("parallax_occlusion_iterations", "4"); - settings->setDefault("parallax_occlusion_scale", "0.08"); - settings->setDefault("parallax_occlusion_bias", "0.04"); settings->setDefault("enable_waving_water", "false"); settings->setDefault("water_wave_height", "1.0"); settings->setDefault("water_wave_length", "20.0"); diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 3a5934cf3..5c2e5cd09 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -266,9 +266,6 @@ void TextureSettings::readSettings() { connected_glass = g_settings->getBool("connected_glass"); opaque_water = g_settings->getBool("opaque_water"); - bool enable_shaders = g_settings->getBool("enable_shaders"); - bool enable_bumpmapping = g_settings->getBool("enable_bumpmapping"); - bool enable_parallax_occlusion = g_settings->getBool("enable_parallax_occlusion"); bool smooth_lighting = g_settings->getBool("smooth_lighting"); enable_mesh_cache = g_settings->getBool("enable_mesh_cache"); enable_minimap = g_settings->getBool("enable_minimap"); @@ -281,8 +278,6 @@ void TextureSettings::readSettings() if (smooth_lighting) enable_mesh_cache = false; - use_normal_texture = enable_shaders && - (enable_bumpmapping || enable_parallax_occlusion); if (leaves_style_str == "fancy") { leaves_style = LEAVES_FANCY; } else if (leaves_style_str == "simple") { @@ -635,10 +630,6 @@ static void fillTileAttribs(ITextureSource *tsrc, TileLayer *layer, if (!tile.world_aligned) layer->scale = 1; - // Normal texture and shader flags texture - if (tsettings.use_normal_texture) { - layer->normal_texture = tsrc->getNormalTexture(tiledef.name); - } layer->flags_texture = tsrc->getShaderFlagsTexture(layer->normal_texture ? true : false); // Material flags diff --git a/src/nodedef.h b/src/nodedef.h index 71c56bda9..66c21cc07 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -158,7 +158,6 @@ public: int node_texture_size; bool opaque_water; bool connected_glass; - bool use_normal_texture; bool enable_mesh_cache; bool enable_minimap; From 738f62421872c0be5fcd483ad4573e5d879e7418 Mon Sep 17 00:00:00 2001 From: Lars Date: Thu, 15 Oct 2020 00:06:37 -0700 Subject: [PATCH 117/177] Periodically release all mesh HW buffers to avoid an Irrlicht bottleneck. --- src/client/game.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/client/game.cpp b/src/client/game.cpp index 309a8e194..a7e367ae2 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -909,6 +909,7 @@ private: bool m_does_lost_focus_pause_game = false; + int m_reset_HW_buffer_counter = 0; #ifdef __ANDROID__ bool m_cache_hold_aux1; bool m_android_chat_open; @@ -3686,7 +3687,6 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos, camera->setDigging(0); // Dig animation } - void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, const CameraOrientation &cam) { @@ -3937,6 +3937,27 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime, /* End scene */ + if (++m_reset_HW_buffer_counter > 500) { + /* + Periodically remove all mesh HW buffers. + + Work around for a quirk in Irrlicht where a HW buffer is only + released after 20000 iterations (triggered from endScene()). + + Without this, all loaded but unused meshes will retain their HW + buffers for at least 5 minutes, at which point looking up the HW buffers + becomes a bottleneck and the framerate drops (as much as 30%). + + Tests showed that numbers between 50 and 1000 are good, so picked 500. + There are no other public Irrlicht APIs that allow interacting with the + HW buffers without tracking the status of every individual mesh. + + The HW buffers for _visible_ meshes will be reinitialized in the next frame. + */ + infostream << "Game::updateFrame(): Removing all HW buffers." << std::endl; + driver->removeAllHardwareBuffers(); + m_reset_HW_buffer_counter = 0; + } driver->endScene(); stats->drawtime = tt_draw.stop(true); From db9eee2d80cc2a35bd133473d131f321dc4600c3 Mon Sep 17 00:00:00 2001 From: Paramat Date: Sun, 18 Oct 2020 22:50:31 +0100 Subject: [PATCH 118/177] Contributing doc: Minor improvements and a clarification (#10520) --- .github/CONTRIBUTING.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index e57ea9f83..b01a89509 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -45,11 +45,9 @@ Contributions are welcome! Here's how you can help: ### Important note about automated GitHub checks -When you submit a pull request, GitHub automatically runs checks on the Minetest Engine combined with your changes. One of these checks is called 'cpp lint / clang format', which checks code formatting. -Because formatting for readability requires human judgement this check often fails and often makes unsuitable formatting requests which make code readability worse. +When you submit a pull request, GitHub automatically runs checks on the Minetest Engine combined with your changes. One of these checks is called 'cpp lint / clang format', which checks code formatting. Because formatting for readability requires human judgement this check often fails and often makes unsuitable formatting requests which make code readability worse. -If this check fails, look at the details to check for any clear mistakes and correct those. However you should not apply everything ClangFormat requests, ignore requests that make code readability worse and any other clearly unsuitable requests. -Discuss with a core developer if in any doubt and for how to progress. +If this check fails, look at the details to check for any clear mistakes and correct those. However, you should not apply everything ClangFormat requests. Ignore requests that make code readability worse and any other clearly unsuitable requests. Discuss in the pull request with a core developer about how to progress. ## Issues From b826e3973065a0bb81269c8decb5a33073508164 Mon Sep 17 00:00:00 2001 From: Lars Date: Sun, 18 Oct 2020 16:38:51 -0700 Subject: [PATCH 119/177] Minor clientmap improvements. - Avoid calculating isBlockInSight for blocks without meshes. - Add metric for how many blocks the client has currently loaded. - Make some variables constant. --- src/client/clientmap.cpp | 36 +++++++++++++++++++----------------- src/mapsector.h | 1 + 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/client/clientmap.cpp b/src/client/clientmap.cpp index d372a8e46..c8561def6 100644 --- a/src/client/clientmap.cpp +++ b/src/client/clientmap.cpp @@ -122,14 +122,17 @@ void ClientMap::updateDrawList() } m_drawlist.clear(); - v3f camera_position = m_camera_position; - v3f camera_direction = m_camera_direction; + const v3f camera_position = m_camera_position; + const v3f camera_direction = m_camera_direction; + const f32 camera_fov = m_camera_fov; v3s16 cam_pos_nodes = floatToInt(camera_position, BS); v3s16 p_blocks_min; v3s16 p_blocks_max; getBlocksInViewRange(cam_pos_nodes, &p_blocks_min, &p_blocks_max); + // Number of blocks currently loaded by the client + u32 blocks_loaded = 0; // Number of blocks with mesh in rendering range u32 blocks_in_range_with_mesh = 0; // Number of blocks occlusion culled @@ -154,6 +157,7 @@ void ClientMap::updateDrawList() MapSector *sector = sector_it.second; v2s16 sp = sector->getPos(); + blocks_loaded += sector->size(); if (!m_control.range_all) { if (sp.X < p_blocks_min.X || sp.X > p_blocks_max.X || sp.Y < p_blocks_min.Z || sp.Y > p_blocks_max.Z) @@ -175,8 +179,12 @@ void ClientMap::updateDrawList() if not seen on display */ - if (block->mesh) + if (block->mesh) { block->mesh->updateCameraOffset(m_camera_offset); + } else { + // Ignore if mesh doesn't exist + continue; + } float range = 100000 * BS; if (!m_control.range_all) @@ -184,14 +192,7 @@ void ClientMap::updateDrawList() float d = 0.0; if (!isBlockInSight(block->getPos(), camera_position, - camera_direction, m_camera_fov, range, &d)) - continue; - - - /* - Ignore if mesh doesn't exist - */ - if (!block->mesh) + camera_direction, camera_fov, range, &d)) continue; blocks_in_range_with_mesh++; @@ -222,6 +223,7 @@ void ClientMap::updateDrawList() g_profiler->avg("MapBlock meshes in range [#]", blocks_in_range_with_mesh); g_profiler->avg("MapBlocks occlusion culled [#]", blocks_occlusion_culled); g_profiler->avg("MapBlocks drawn [#]", m_drawlist.size()); + g_profiler->avg("MapBlocks loaded [#]", blocks_loaded); } struct MeshBufList @@ -287,13 +289,13 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass) /* Get animation parameters */ - float animation_time = m_client->getAnimationTime(); - int crack = m_client->getCrackLevel(); - u32 daynight_ratio = m_client->getEnv().getDayNightRatio(); + const float animation_time = m_client->getAnimationTime(); + const int crack = m_client->getCrackLevel(); + const u32 daynight_ratio = m_client->getEnv().getDayNightRatio(); - v3f camera_position = m_camera_position; - v3f camera_direction = m_camera_direction; - f32 camera_fov = m_camera_fov; + const v3f camera_position = m_camera_position; + const v3f camera_direction = m_camera_direction; + const f32 camera_fov = m_camera_fov; /* Get all blocks and draw all visible ones diff --git a/src/mapsector.h b/src/mapsector.h index dede364f6..ffd4cdd1d 100644 --- a/src/mapsector.h +++ b/src/mapsector.h @@ -62,6 +62,7 @@ public: bool empty() const { return m_blocks.empty(); } + int size() const { return m_blocks.size(); } protected: // The pile of MapBlocks From 660115c1abc76f3d4f6a6597ed0c4737465c6c55 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Mon, 19 Oct 2020 20:38:15 +0200 Subject: [PATCH 120/177] Decouple entity minimap markers from nametags replacing with show_on_minimap property (#10443) --- doc/lua_api.txt | 4 ++++ src/client/camera.h | 2 -- src/client/client.cpp | 2 ++ src/client/content_cao.cpp | 27 +++++++++++++++++++++++++++ src/client/content_cao.h | 4 ++++ src/client/minimap.cpp | 33 +++++++++++++++++++++++++-------- src/client/minimap.h | 11 +++++++++++ src/object_properties.cpp | 8 +++++++- src/object_properties.h | 1 + src/script/common/c_content.cpp | 3 +++ src/server/player_sao.cpp | 1 + 11 files changed, 85 insertions(+), 11 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index d3aaa309c..9a46c7b57 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -6880,6 +6880,10 @@ Player properties need to be saved manually. shaded = true, -- Setting this to 'false' disables diffuse lighting of entity + + show_on_minimap = false, + -- Defaults to true for players, false for other entities. + -- If set to true the entity will show as a marker on the minimap. } Entity definition diff --git a/src/client/camera.h b/src/client/camera.h index 3a59637bc..16a1961be 100644 --- a/src/client/camera.h +++ b/src/client/camera.h @@ -169,8 +169,6 @@ public: void removeNametag(Nametag *nametag); - const std::list &getNametags() { return m_nametags; } - void drawNametags(); inline void addArmInertia(f32 player_yaw); diff --git a/src/client/client.cpp b/src/client/client.cpp index 0bd98b256..af69d0ec9 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -326,6 +326,8 @@ Client::~Client() } delete m_minimap; + m_minimap = nullptr; + delete m_media_downloader; } diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index fae06554a..42184b08f 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -47,6 +47,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include "client/shader.h" +#include "client/minimap.h" class Settings; struct ToolCapabilities; @@ -566,6 +567,9 @@ void GenericCAO::removeFromScene(bool permanent) m_client->getCamera()->removeNametag(m_nametag); m_nametag = nullptr; } + + if (m_marker && m_client->getMinimap()) + m_client->getMinimap()->removeMarker(&m_marker); } void GenericCAO::addToScene(ITextureSource *tsrc) @@ -794,6 +798,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc) node->setParent(m_matrixnode); updateNametag(); + updateMarker(); updateNodePos(); updateAnimation(); updateBonePosition(); @@ -885,6 +890,23 @@ u16 GenericCAO::getLightPosition(v3s16 *pos) return 3; } +void GenericCAO::updateMarker() +{ + if (!m_prop.show_on_minimap) { + if (m_marker) + m_client->getMinimap()->removeMarker(&m_marker); + return; + } + + if (m_marker) + return; + + scene::ISceneNode *node = getSceneNode(); + if (!node) + return; + m_marker = m_client->getMinimap()->addMarker(node); +} + void GenericCAO::updateNametag() { if (m_is_local_player) // No nametag for local player @@ -1576,6 +1598,8 @@ void GenericCAO::processMessage(const std::string &data) u8 cmd = readU8(is); if (cmd == AO_CMD_SET_PROPERTIES) { ObjectProperties newprops; + newprops.show_on_minimap = m_is_player; // default + newprops.deSerialize(is); // Check what exactly changed @@ -1609,6 +1633,8 @@ void GenericCAO::processMessage(const std::string &data) if ((m_is_player && !m_is_local_player) && m_prop.nametag.empty()) m_prop.nametag = m_name; + if (m_is_local_player) + m_prop.show_on_minimap = false; if (expire_visuals) { expireVisuals(); @@ -1621,6 +1647,7 @@ void GenericCAO::processMessage(const std::string &data) updateTextures(m_current_texture_modifier); } updateNametag(); + updateMarker(); } } else if (cmd == AO_CMD_UPDATE_POSITION) { // Not sent by the server if this object is an attachment. diff --git a/src/client/content_cao.h b/src/client/content_cao.h index daf697767..435fc2931 100644 --- a/src/client/content_cao.h +++ b/src/client/content_cao.h @@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc., class Camera; class Client; struct Nametag; +struct MinimapMarker; /* SmoothTranslator @@ -84,6 +85,7 @@ private: scene::IBillboardSceneNode *m_spritenode = nullptr; scene::IDummyTransformationSceneNode *m_matrixnode = nullptr; Nametag *m_nametag = nullptr; + MinimapMarker *m_marker = nullptr; v3f m_position = v3f(0.0f, 10.0f * BS, 0); v3f m_velocity; v3f m_acceleration; @@ -254,6 +256,8 @@ public: void updateNametag(); + void updateMarker(); + void updateNodePos(); void step(float dtime, ClientEnvironment *env); diff --git a/src/client/minimap.cpp b/src/client/minimap.cpp index 6bae408b4..d068ad5f7 100644 --- a/src/client/minimap.cpp +++ b/src/client/minimap.cpp @@ -252,6 +252,10 @@ Minimap::~Minimap() driver->removeTexture(data->minimap_overlay_square); driver->removeTexture(data->object_marker_red); + for (MinimapMarker *m : m_markers) + delete m; + m_markers.clear(); + delete data; delete m_minimap_update_thread; } @@ -678,21 +682,34 @@ void Minimap::drawMinimap(core::rect rect) { } } +MinimapMarker* Minimap::addMarker(scene::ISceneNode *parent_node) +{ + MinimapMarker *m = new MinimapMarker(parent_node); + m_markers.push_back(m); + return m; +} + +void Minimap::removeMarker(MinimapMarker **m) +{ + m_markers.remove(*m); + delete *m; + *m = nullptr; +} + void Minimap::updateActiveMarkers() { video::IImage *minimap_mask = data->minimap_shape_round ? data->minimap_mask_round : data->minimap_mask_square; - const std::list &nametags = client->getCamera()->getNametags(); - m_active_markers.clear(); + v3f cam_offset = intToFloat(client->getCamera()->getOffset(), BS); + v3s16 pos_offset = data->pos - v3s16(data->mode.map_size / 2, + data->mode.scan_height / 2, + data->mode.map_size / 2); - for (Nametag *nametag : nametags) { - v3s16 pos = floatToInt(nametag->parent_node->getAbsolutePosition() + - intToFloat(client->getCamera()->getOffset(), BS), BS); - pos -= data->pos - v3s16(data->mode.map_size / 2, - data->mode.scan_height / 2, - data->mode.map_size / 2); + for (MinimapMarker *marker : m_markers) { + v3s16 pos = floatToInt(marker->parent_node->getAbsolutePosition() + + cam_offset, BS) - pos_offset; if (pos.X < 0 || pos.X > data->mode.map_size || pos.Y < 0 || pos.Y > data->mode.scan_height || pos.Z < 0 || pos.Z > data->mode.map_size) { diff --git a/src/client/minimap.h b/src/client/minimap.h index 11374b116..4a2c462f8 100644 --- a/src/client/minimap.h +++ b/src/client/minimap.h @@ -48,6 +48,13 @@ struct MinimapModeDef { u16 scale; }; +struct MinimapMarker { + MinimapMarker(scene::ISceneNode *parent_node): + parent_node(parent_node) + { + } + scene::ISceneNode *parent_node; +}; struct MinimapPixel { //! The topmost node that the minimap displays. MapNode n; @@ -142,6 +149,9 @@ public: scene::SMeshBuffer *getMinimapMeshBuffer(); + MinimapMarker* addMarker(scene::ISceneNode *parent_node); + void removeMarker(MinimapMarker **marker); + void updateActiveMarkers(); void drawMinimap(); void drawMinimap(core::rect rect); @@ -162,5 +172,6 @@ private: u16 m_surface_mode_scan_height; f32 m_angle; std::mutex m_mutex; + std::list m_markers; std::list m_active_markers; }; diff --git a/src/object_properties.cpp b/src/object_properties.cpp index c31c667e7..f31773060 100644 --- a/src/object_properties.cpp +++ b/src/object_properties.cpp @@ -70,6 +70,7 @@ std::string ObjectProperties::dump() os << ", use_texture_alpha=" << use_texture_alpha; os << ", damage_texture_modifier=" << damage_texture_modifier; os << ", shaded=" << shaded; + os << ", show_on_minimap=" << show_on_minimap; return os.str(); } @@ -118,6 +119,7 @@ void ObjectProperties::serialize(std::ostream &os) const writeU8(os, use_texture_alpha); os << serializeString16(damage_texture_modifier); writeU8(os, shaded); + writeU8(os, show_on_minimap); // Add stuff only at the bottom. // Never remove anything, because we don't want new versions of this @@ -174,7 +176,11 @@ void ObjectProperties::deSerialize(std::istream &is) damage_texture_modifier = deSerializeString16(is); u8 tmp = readU8(is); if (is.eof()) - throw SerializationError(""); + return; shaded = tmp; + tmp = readU8(is); + if (is.eof()) + return; + show_on_minimap = tmp; } catch (SerializationError &e) {} } diff --git a/src/object_properties.h b/src/object_properties.h index f010c1daf..adb483527 100644 --- a/src/object_properties.h +++ b/src/object_properties.h @@ -62,6 +62,7 @@ struct ObjectProperties float zoom_fov = 0.0f; bool use_texture_alpha = false; bool shaded = true; + bool show_on_minimap = false; ObjectProperties(); std::string dump(); diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp index a95cf94a1..e3cb9042e 100644 --- a/src/script/common/c_content.cpp +++ b/src/script/common/c_content.cpp @@ -331,6 +331,7 @@ void read_object_properties(lua_State *L, int index, getfloatfield(L, -1, "zoom_fov", prop->zoom_fov); getboolfield(L, -1, "use_texture_alpha", prop->use_texture_alpha); getboolfield(L, -1, "shaded", prop->shaded); + getboolfield(L, -1, "show_on_minimap", prop->show_on_minimap); getstringfield(L, -1, "damage_texture_modifier", prop->damage_texture_modifier); } @@ -419,6 +420,8 @@ void push_object_properties(lua_State *L, ObjectProperties *prop) lua_setfield(L, -2, "shaded"); lua_pushlstring(L, prop->damage_texture_modifier.c_str(), prop->damage_texture_modifier.size()); lua_setfield(L, -2, "damage_texture_modifier"); + lua_pushboolean(L, prop->show_on_minimap); + lua_setfield(L, -2, "show_on_minimap"); } /******************************************************************************/ diff --git a/src/server/player_sao.cpp b/src/server/player_sao.cpp index 344d18a20..9fb53380c 100644 --- a/src/server/player_sao.cpp +++ b/src/server/player_sao.cpp @@ -55,6 +55,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, session_t p m_prop.backface_culling = false; m_prop.makes_footstep_sound = true; m_prop.stepheight = PLAYER_DEFAULT_STEPHEIGHT * BS; + m_prop.show_on_minimap = true; m_hp = m_prop.hp_max; m_breath = m_prop.breath_max; // Disable zoom in survival mode using a value of 0 From 4f2303849e0f929524695a9e3719ec486b47ddd1 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Mon, 19 Oct 2020 20:38:33 +0200 Subject: [PATCH 121/177] Implement unloading of static_save=false objects according to existing docs (#10485) --- src/server/luaentity_sao.h | 1 + src/server/player_sao.h | 1 + src/server/serveractiveobject.h | 9 +++++++++ src/serverenvironment.cpp | 9 ++++++--- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/server/luaentity_sao.h b/src/server/luaentity_sao.h index 2520c8f5d..e060aa06d 100644 --- a/src/server/luaentity_sao.h +++ b/src/server/luaentity_sao.h @@ -42,6 +42,7 @@ public: void step(float dtime, bool send_recommended); std::string getClientInitializationData(u16 protocol_version); bool isStaticAllowed() const { return m_prop.static_save; } + bool shouldUnload() const { return true; } void getStaticData(std::string *result) const; u16 punch(v3f dir, const ToolCapabilities *toolcap = nullptr, ServerActiveObject *puncher = nullptr, diff --git a/src/server/player_sao.h b/src/server/player_sao.h index 8571bd4f9..3e178d4fc 100644 --- a/src/server/player_sao.h +++ b/src/server/player_sao.h @@ -83,6 +83,7 @@ public: void addedToEnvironment(u32 dtime_s); void removingFromEnvironment(); bool isStaticAllowed() const { return false; } + bool shouldUnload() const { return false; } std::string getClientInitializationData(u16 protocol_version); void getStaticData(std::string *result) const; void step(float dtime, bool send_recommended); diff --git a/src/server/serveractiveobject.h b/src/server/serveractiveobject.h index 927009aef..2764d159e 100644 --- a/src/server/serveractiveobject.h +++ b/src/server/serveractiveobject.h @@ -125,6 +125,7 @@ public: assert(isStaticAllowed()); *result = ""; } + /* Return false in here to never save and instead remove object on unload. getStaticData() will not be called in that case. @@ -132,6 +133,14 @@ public: virtual bool isStaticAllowed() const {return true;} + /* + Return false here to never unload the object. + isStaticAllowed && shouldUnload -> unload when out of active block range + !isStaticAllowed && shouldUnload -> unload when block is unloaded + */ + virtual bool shouldUnload() const + { return true; } + // Returns tool wear virtual u16 punch(v3f dir, const ToolCapabilities *toolcap = nullptr, diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp index 6ef56efc8..d044b003d 100644 --- a/src/serverenvironment.cpp +++ b/src/serverenvironment.cpp @@ -1972,8 +1972,8 @@ void ServerEnvironment::deactivateFarObjects(bool _force_delete) // force_delete might be overriden per object bool force_delete = _force_delete; - // Do not deactivate if static data creation not allowed - if (!force_delete && !obj->isStaticAllowed()) + // Do not deactivate if disallowed + if (!force_delete && !obj->shouldUnload()) return false; // removeRemovedObjects() is responsible for these @@ -2002,7 +2002,10 @@ void ServerEnvironment::deactivateFarObjects(bool _force_delete) } // If block is still active, don't remove - if (!force_delete && m_active_blocks.contains(blockpos_o)) + bool still_active = obj->isStaticAllowed() ? + m_active_blocks.contains(blockpos_o) : + getMap().getBlockNoCreateNoEx(blockpos_o) != nullptr; + if (!force_delete && still_active) return false; verbosestream << "ServerEnvironment::deactivateFarObjects(): " From c7aa92aaed27ad8e10af7463b154b5b580c86da5 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Tue, 20 Oct 2020 16:34:14 +0200 Subject: [PATCH 122/177] Fix show_on_minimap default value for local player fixes #10526 --- src/client/content_cao.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index 42184b08f..29a3acf25 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -354,6 +354,8 @@ void GenericCAO::initialize(const std::string &data) m_is_local_player = true; m_is_visible = false; player->setCAO(this); + + m_prop.show_on_minimap = false; } } From 4d9c9186ce61e11e13bc35ce1a319e568cf08662 Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 20 Oct 2020 22:13:27 +0100 Subject: [PATCH 123/177] Devtest: Automatically enable zoom capability (#10493) Make minor improvements to the zoom testing chat command. Delete incorrect line about creative mode from README.md. --- games/devtest/README.md | 1 - games/devtest/mods/util_commands/init.lua | 10 ++++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/games/devtest/README.md b/games/devtest/README.md index 8b71da625..77e722af7 100644 --- a/games/devtest/README.md +++ b/games/devtest/README.md @@ -23,7 +23,6 @@ Basically, just create a world and start. A few important things to note: * Use the `/infplace` command to toggle infinite node placement in-game * Use the Param2 Tool to change the param2 of nodes; it's useful to experiment with the various drawtype test nodes * Check out the game settings and server commands for additional tests and features -* Creative Mode does nothing (apart from default engine behavior) Confused by a certain node or item? Check out for inline code comments. The usages of most tools are explained in their tooltips. diff --git a/games/devtest/mods/util_commands/init.lua b/games/devtest/mods/util_commands/init.lua index f2a155fb2..ca5dca2d9 100644 --- a/games/devtest/mods/util_commands/init.lua +++ b/games/devtest/mods/util_commands/init.lua @@ -36,8 +36,12 @@ minetest.register_chatcommand("hp", { end, }) -minetest.register_chatcommand("zoom", { - params = "[]", +minetest.register_on_joinplayer(function(player) + player:set_properties({zoom_fov = 15}) +end) + +minetest.register_chatcommand("zoomfov", { + params = "[]", description = "Set or display your zoom_fov", func = function(name, param) local player = minetest.get_player_by_name(name) @@ -58,8 +62,6 @@ minetest.register_chatcommand("zoom", { end, }) - - local s_infplace = minetest.settings:get("devtest_infplace") if s_infplace == "true" then infplace = true From f53396b1523f5adb99fcc9e8fe5262a205217489 Mon Sep 17 00:00:00 2001 From: Zughy <63455151+Zughy@users.noreply.github.com> Date: Wed, 21 Oct 2020 21:42:23 +0200 Subject: [PATCH 124/177] Update jsoncpp to 1.9.4 (#10477) Co-authored-by: Zughy <4279489-marco_a@users.noreply.gitlab.com> --- lib/jsoncpp/json/UPDATING | 2 +- lib/jsoncpp/json/json-forwards.h | 366 ++-- lib/jsoncpp/json/json.h | 1622 +++++++++-------- lib/jsoncpp/jsoncpp.cpp | 2770 +++++++++++++++--------------- 4 files changed, 2475 insertions(+), 2285 deletions(-) diff --git a/lib/jsoncpp/json/UPDATING b/lib/jsoncpp/json/UPDATING index f0226e8ee..0893244cf 100644 --- a/lib/jsoncpp/json/UPDATING +++ b/lib/jsoncpp/json/UPDATING @@ -1,6 +1,6 @@ #!/bin/sh cd .. -git clone https://github.com/open-source-parsers/jsoncpp -b 1.8.3 --depth 1 +git clone https://github.com/open-source-parsers/jsoncpp -b 1.9.4 --depth 1 cd jsoncpp python amalgamate.py cp -R dist/json ../json diff --git a/lib/jsoncpp/json/json-forwards.h b/lib/jsoncpp/json/json-forwards.h index de2e4bd79..d3260c57c 100644 --- a/lib/jsoncpp/json/json-forwards.h +++ b/lib/jsoncpp/json/json-forwards.h @@ -79,6 +79,151 @@ license you like. /// to prevent private header inclusion. #define JSON_IS_AMALGAMATION +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/version.h +// ////////////////////////////////////////////////////////////////////// + +#ifndef JSON_VERSION_H_INCLUDED +#define JSON_VERSION_H_INCLUDED + +// Note: version must be updated in three places when doing a release. This +// annoying process ensures that amalgamate, CMake, and meson all report the +// correct version. +// 1. /meson.build +// 2. /include/json/version.h +// 3. /CMakeLists.txt +// IMPORTANT: also update the SOVERSION!! + +#define JSONCPP_VERSION_STRING "1.9.4" +#define JSONCPP_VERSION_MAJOR 1 +#define JSONCPP_VERSION_MINOR 9 +#define JSONCPP_VERSION_PATCH 3 +#define JSONCPP_VERSION_QUALIFIER +#define JSONCPP_VERSION_HEXA \ + ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | \ + (JSONCPP_VERSION_PATCH << 8)) + +#ifdef JSONCPP_USING_SECURE_MEMORY +#undef JSONCPP_USING_SECURE_MEMORY +#endif +#define JSONCPP_USING_SECURE_MEMORY 0 +// If non-zero, the library zeroes any memory that it has allocated before +// it frees its memory. + +#endif // JSON_VERSION_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/version.h +// ////////////////////////////////////////////////////////////////////// + + + + + + +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/allocator.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_ALLOCATOR_H_INCLUDED +#define JSON_ALLOCATOR_H_INCLUDED + +#include +#include + +#pragma pack(push, 8) + +namespace Json { +template class SecureAllocator { +public: + // Type definitions + using value_type = T; + using pointer = T*; + using const_pointer = const T*; + using reference = T&; + using const_reference = const T&; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + + /** + * Allocate memory for N items using the standard allocator. + */ + pointer allocate(size_type n) { + // allocate using "global operator new" + return static_cast(::operator new(n * sizeof(T))); + } + + /** + * Release memory which was allocated for N items at pointer P. + * + * The memory block is filled with zeroes before being released. + * The pointer argument is tagged as "volatile" to prevent the + * compiler optimizing out this critical step. + */ + void deallocate(volatile pointer p, size_type n) { + std::memset(p, 0, n * sizeof(T)); + // free using "global operator delete" + ::operator delete(p); + } + + /** + * Construct an item in-place at pointer P. + */ + template void construct(pointer p, Args&&... args) { + // construct using "placement new" and "perfect forwarding" + ::new (static_cast(p)) T(std::forward(args)...); + } + + size_type max_size() const { return size_t(-1) / sizeof(T); } + + pointer address(reference x) const { return std::addressof(x); } + + const_pointer address(const_reference x) const { return std::addressof(x); } + + /** + * Destroy an item in-place at pointer P. + */ + void destroy(pointer p) { + // destroy using "explicit destructor" + p->~T(); + } + + // Boilerplate + SecureAllocator() {} + template SecureAllocator(const SecureAllocator&) {} + template struct rebind { using other = SecureAllocator; }; +}; + +template +bool operator==(const SecureAllocator&, const SecureAllocator&) { + return true; +} + +template +bool operator!=(const SecureAllocator&, const SecureAllocator&) { + return false; +} + +} // namespace Json + +#pragma pack(pop) + +#endif // JSON_ALLOCATOR_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/allocator.h +// ////////////////////////////////////////////////////////////////////// + + + + + + // ////////////////////////////////////////////////////////////////////// // Beginning of content of file: include/json/config.h // ////////////////////////////////////////////////////////////////////// @@ -90,19 +235,14 @@ license you like. #ifndef JSON_CONFIG_H_INCLUDED #define JSON_CONFIG_H_INCLUDED -#include -#include //typedef String -#include //typedef int64_t, uint64_t - -/// If defined, indicates that json library is embedded in CppTL library. -//# define JSON_IN_CPPTL 1 - -/// If defined, indicates that json may leverage CppTL library -//# define JSON_USE_CPPTL 1 -/// If defined, indicates that cpptl vector based map should be used instead of -/// std::map -/// as Value container. -//# define JSON_USE_CPPTL_SMALLMAP 1 +#include +#include +#include +#include +#include +#include +#include +#include // If non-zero, the library uses exceptions to report bad input instead of C // assertion macros. The default is to use exceptions. @@ -110,164 +250,132 @@ license you like. #define JSON_USE_EXCEPTION 1 #endif +// Temporary, tracked for removal with issue #982. +#ifndef JSON_USE_NULLREF +#define JSON_USE_NULLREF 1 +#endif + /// If defined, indicates that the source file is amalgamated /// to prevent private header inclusion. /// Remarks: it is automatically defined in the generated amalgamated header. // #define JSON_IS_AMALGAMATION -#ifdef JSON_IN_CPPTL -#include -#ifndef JSON_USE_CPPTL -#define JSON_USE_CPPTL 1 -#endif -#endif - -#ifdef JSON_IN_CPPTL -#define JSON_API CPPTL_API -#elif defined(JSON_DLL_BUILD) +// Export macros for DLL visibility +#if defined(JSON_DLL_BUILD) #if defined(_MSC_VER) || defined(__MINGW32__) #define JSON_API __declspec(dllexport) #define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#elif defined(__GNUC__) || defined(__clang__) +#define JSON_API __attribute__((visibility("default"))) #endif // if defined(_MSC_VER) + #elif defined(JSON_DLL) #if defined(_MSC_VER) || defined(__MINGW32__) #define JSON_API __declspec(dllimport) #define JSONCPP_DISABLE_DLL_INTERFACE_WARNING #endif // if defined(_MSC_VER) -#endif // ifdef JSON_IN_CPPTL +#endif // ifdef JSON_DLL_BUILD + #if !defined(JSON_API) #define JSON_API #endif +#if defined(_MSC_VER) && _MSC_VER < 1800 +#error \ + "ERROR: Visual Studio 12 (2013) with _MSC_VER=1800 is the oldest supported compiler with sufficient C++11 capabilities" +#endif + +#if defined(_MSC_VER) && _MSC_VER < 1900 +// As recommended at +// https://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010 +extern JSON_API int msvc_pre1900_c99_snprintf(char* outBuf, size_t size, + const char* format, ...); +#define jsoncpp_snprintf msvc_pre1900_c99_snprintf +#else +#define jsoncpp_snprintf std::snprintf +#endif + // If JSON_NO_INT64 is defined, then Json only support C++ "int" type for // integer // Storages, and 64 bits integer support is disabled. // #define JSON_NO_INT64 1 -#if defined(_MSC_VER) // MSVC -# if _MSC_VER <= 1200 // MSVC 6 - // Microsoft Visual Studio 6 only support conversion from __int64 to double - // (no conversion from unsigned __int64). -# define JSON_USE_INT64_DOUBLE_CONVERSION 1 - // Disable warning 4786 for VS6 caused by STL (identifier was truncated to '255' - // characters in the debug information) - // All projects I've ever seen with VS6 were using this globally (not bothering - // with pragma push/pop). -# pragma warning(disable : 4786) -# endif // MSVC 6 - -# if _MSC_VER >= 1500 // MSVC 2008 - /// Indicates that the following function is deprecated. -# define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) -# endif - -#endif // defined(_MSC_VER) - -// In c++11 the override keyword allows you to explicitly define that a function -// is intended to override the base-class version. This makes the code more -// managable and fixes a set of common hard-to-find bugs. -#if __cplusplus >= 201103L -# define JSONCPP_OVERRIDE override -# define JSONCPP_NOEXCEPT noexcept -#elif defined(_MSC_VER) && _MSC_VER > 1600 && _MSC_VER < 1900 -# define JSONCPP_OVERRIDE override -# define JSONCPP_NOEXCEPT throw() -#elif defined(_MSC_VER) && _MSC_VER >= 1900 -# define JSONCPP_OVERRIDE override -# define JSONCPP_NOEXCEPT noexcept -#else -# define JSONCPP_OVERRIDE -# define JSONCPP_NOEXCEPT throw() -#endif - -#ifndef JSON_HAS_RVALUE_REFERENCES - -#if defined(_MSC_VER) && _MSC_VER >= 1600 // MSVC >= 2010 -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // MSVC >= 2010 +// JSONCPP_OVERRIDE is maintained for backwards compatibility of external tools. +// C++11 should be used directly in JSONCPP. +#define JSONCPP_OVERRIDE override #ifdef __clang__ -#if __has_feature(cxx_rvalue_references) -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // has_feature - -#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) -#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L) -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // GXX_EXPERIMENTAL - -#endif // __clang__ || __GNUC__ - -#endif // not defined JSON_HAS_RVALUE_REFERENCES - -#ifndef JSON_HAS_RVALUE_REFERENCES -#define JSON_HAS_RVALUE_REFERENCES 0 +#if __has_extension(attribute_deprecated_with_message) +#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) #endif - -#ifdef __clang__ -# if __has_extension(attribute_deprecated_with_message) -# define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) -# endif -#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) -# if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) -# define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) -# elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) -# define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) -# endif // GNUC version -#endif // __clang__ || __GNUC__ +#elif defined(__GNUC__) // not clang (gcc comes later since clang emulates gcc) +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) +#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) +#endif // GNUC version +#elif defined(_MSC_VER) // MSVC (after clang because clang on Windows emulates + // MSVC) +#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) +#endif // __clang__ || __GNUC__ || _MSC_VER #if !defined(JSONCPP_DEPRECATED) #define JSONCPP_DEPRECATED(message) #endif // if !defined(JSONCPP_DEPRECATED) -#if __GNUC__ >= 6 -# define JSON_USE_INT64_DOUBLE_CONVERSION 1 +#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 6)) +#define JSON_USE_INT64_DOUBLE_CONVERSION 1 #endif #if !defined(JSON_IS_AMALGAMATION) -# include "version.h" - -# if JSONCPP_USING_SECURE_MEMORY -# include "allocator.h" //typedef Allocator -# endif +#include "allocator.h" +#include "version.h" #endif // if !defined(JSON_IS_AMALGAMATION) namespace Json { -typedef int Int; -typedef unsigned int UInt; +using Int = int; +using UInt = unsigned int; #if defined(JSON_NO_INT64) -typedef int LargestInt; -typedef unsigned int LargestUInt; +using LargestInt = int; +using LargestUInt = unsigned int; #undef JSON_HAS_INT64 #else // if defined(JSON_NO_INT64) // For Microsoft Visual use specific types as long long is not supported #if defined(_MSC_VER) // Microsoft Visual Studio -typedef __int64 Int64; -typedef unsigned __int64 UInt64; +using Int64 = __int64; +using UInt64 = unsigned __int64; #else // if defined(_MSC_VER) // Other platforms, use long long -typedef int64_t Int64; -typedef uint64_t UInt64; -#endif // if defined(_MSC_VER) -typedef Int64 LargestInt; -typedef UInt64 LargestUInt; +using Int64 = int64_t; +using UInt64 = uint64_t; +#endif // if defined(_MSC_VER) +using LargestInt = Int64; +using LargestUInt = UInt64; #define JSON_HAS_INT64 #endif // if defined(JSON_NO_INT64) -#if JSONCPP_USING_SECURE_MEMORY -#define JSONCPP_STRING std::basic_string, Json::SecureAllocator > -#define JSONCPP_OSTRINGSTREAM std::basic_ostringstream, Json::SecureAllocator > -#define JSONCPP_OSTREAM std::basic_ostream> -#define JSONCPP_ISTRINGSTREAM std::basic_istringstream, Json::SecureAllocator > -#define JSONCPP_ISTREAM std::istream -#else -#define JSONCPP_STRING std::string -#define JSONCPP_OSTRINGSTREAM std::ostringstream -#define JSONCPP_OSTREAM std::ostream -#define JSONCPP_ISTRINGSTREAM std::istringstream -#define JSONCPP_ISTREAM std::istream -#endif // if JSONCPP_USING_SECURE_MEMORY -} // end namespace Json + +template +using Allocator = + typename std::conditional, + std::allocator>::type; +using String = std::basic_string, Allocator>; +using IStringStream = + std::basic_istringstream; +using OStringStream = + std::basic_ostringstream; +using IStream = std::istream; +using OStream = std::ostream; +} // namespace Json + +// Legacy names (formerly macros). +using JSONCPP_STRING = Json::String; +using JSONCPP_ISTRINGSTREAM = Json::IStringStream; +using JSONCPP_OSTRINGSTREAM = Json::OStringStream; +using JSONCPP_ISTREAM = Json::IStream; +using JSONCPP_OSTREAM = Json::OStream; #endif // JSON_CONFIG_H_INCLUDED @@ -299,17 +407,23 @@ typedef UInt64 LargestUInt; namespace Json { // writer.h +class StreamWriter; +class StreamWriterBuilder; +class Writer; class FastWriter; class StyledWriter; +class StyledStreamWriter; // reader.h class Reader; +class CharReader; +class CharReaderBuilder; -// features.h +// json_features.h class Features; // value.h -typedef unsigned int ArrayIndex; +using ArrayIndex = unsigned int; class StaticString; class Path; class PathArgument; diff --git a/lib/jsoncpp/json/json.h b/lib/jsoncpp/json/json.h index 625ba02e9..3f4813a95 100644 --- a/lib/jsoncpp/json/json.h +++ b/lib/jsoncpp/json/json.h @@ -82,17 +82,25 @@ license you like. // Beginning of content of file: include/json/version.h // ////////////////////////////////////////////////////////////////////// -// DO NOT EDIT. This file (and "version") is generated by CMake. -// Run CMake configure step to update it. #ifndef JSON_VERSION_H_INCLUDED -# define JSON_VERSION_H_INCLUDED +#define JSON_VERSION_H_INCLUDED -# define JSONCPP_VERSION_STRING "1.8.4" -# define JSONCPP_VERSION_MAJOR 1 -# define JSONCPP_VERSION_MINOR 8 -# define JSONCPP_VERSION_PATCH 4 -# define JSONCPP_VERSION_QUALIFIER -# define JSONCPP_VERSION_HEXA ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | (JSONCPP_VERSION_PATCH << 8)) +// Note: version must be updated in three places when doing a release. This +// annoying process ensures that amalgamate, CMake, and meson all report the +// correct version. +// 1. /meson.build +// 2. /include/json/version.h +// 3. /CMakeLists.txt +// IMPORTANT: also update the SOVERSION!! + +#define JSONCPP_VERSION_STRING "1.9.4" +#define JSONCPP_VERSION_MAJOR 1 +#define JSONCPP_VERSION_MINOR 9 +#define JSONCPP_VERSION_PATCH 3 +#define JSONCPP_VERSION_QUALIFIER +#define JSONCPP_VERSION_HEXA \ + ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | \ + (JSONCPP_VERSION_PATCH << 8)) #ifdef JSONCPP_USING_SECURE_MEMORY #undef JSONCPP_USING_SECURE_MEMORY @@ -112,6 +120,109 @@ license you like. +// ////////////////////////////////////////////////////////////////////// +// Beginning of content of file: include/json/allocator.h +// ////////////////////////////////////////////////////////////////////// + +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_ALLOCATOR_H_INCLUDED +#define JSON_ALLOCATOR_H_INCLUDED + +#include +#include + +#pragma pack(push, 8) + +namespace Json { +template class SecureAllocator { +public: + // Type definitions + using value_type = T; + using pointer = T*; + using const_pointer = const T*; + using reference = T&; + using const_reference = const T&; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + + /** + * Allocate memory for N items using the standard allocator. + */ + pointer allocate(size_type n) { + // allocate using "global operator new" + return static_cast(::operator new(n * sizeof(T))); + } + + /** + * Release memory which was allocated for N items at pointer P. + * + * The memory block is filled with zeroes before being released. + * The pointer argument is tagged as "volatile" to prevent the + * compiler optimizing out this critical step. + */ + void deallocate(volatile pointer p, size_type n) { + std::memset(p, 0, n * sizeof(T)); + // free using "global operator delete" + ::operator delete(p); + } + + /** + * Construct an item in-place at pointer P. + */ + template void construct(pointer p, Args&&... args) { + // construct using "placement new" and "perfect forwarding" + ::new (static_cast(p)) T(std::forward(args)...); + } + + size_type max_size() const { return size_t(-1) / sizeof(T); } + + pointer address(reference x) const { return std::addressof(x); } + + const_pointer address(const_reference x) const { return std::addressof(x); } + + /** + * Destroy an item in-place at pointer P. + */ + void destroy(pointer p) { + // destroy using "explicit destructor" + p->~T(); + } + + // Boilerplate + SecureAllocator() {} + template SecureAllocator(const SecureAllocator&) {} + template struct rebind { using other = SecureAllocator; }; +}; + +template +bool operator==(const SecureAllocator&, const SecureAllocator&) { + return true; +} + +template +bool operator!=(const SecureAllocator&, const SecureAllocator&) { + return false; +} + +} // namespace Json + +#pragma pack(pop) + +#endif // JSON_ALLOCATOR_H_INCLUDED + +// ////////////////////////////////////////////////////////////////////// +// End of content of file: include/json/allocator.h +// ////////////////////////////////////////////////////////////////////// + + + + + + // ////////////////////////////////////////////////////////////////////// // Beginning of content of file: include/json/config.h // ////////////////////////////////////////////////////////////////////// @@ -123,19 +234,14 @@ license you like. #ifndef JSON_CONFIG_H_INCLUDED #define JSON_CONFIG_H_INCLUDED -#include -#include //typedef String -#include //typedef int64_t, uint64_t - -/// If defined, indicates that json library is embedded in CppTL library. -//# define JSON_IN_CPPTL 1 - -/// If defined, indicates that json may leverage CppTL library -//# define JSON_USE_CPPTL 1 -/// If defined, indicates that cpptl vector based map should be used instead of -/// std::map -/// as Value container. -//# define JSON_USE_CPPTL_SMALLMAP 1 +#include +#include +#include +#include +#include +#include +#include +#include // If non-zero, the library uses exceptions to report bad input instead of C // assertion macros. The default is to use exceptions. @@ -143,164 +249,132 @@ license you like. #define JSON_USE_EXCEPTION 1 #endif +// Temporary, tracked for removal with issue #982. +#ifndef JSON_USE_NULLREF +#define JSON_USE_NULLREF 1 +#endif + /// If defined, indicates that the source file is amalgamated /// to prevent private header inclusion. /// Remarks: it is automatically defined in the generated amalgamated header. // #define JSON_IS_AMALGAMATION -#ifdef JSON_IN_CPPTL -#include -#ifndef JSON_USE_CPPTL -#define JSON_USE_CPPTL 1 -#endif -#endif - -#ifdef JSON_IN_CPPTL -#define JSON_API CPPTL_API -#elif defined(JSON_DLL_BUILD) +// Export macros for DLL visibility +#if defined(JSON_DLL_BUILD) #if defined(_MSC_VER) || defined(__MINGW32__) #define JSON_API __declspec(dllexport) #define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#elif defined(__GNUC__) || defined(__clang__) +#define JSON_API __attribute__((visibility("default"))) #endif // if defined(_MSC_VER) + #elif defined(JSON_DLL) #if defined(_MSC_VER) || defined(__MINGW32__) #define JSON_API __declspec(dllimport) #define JSONCPP_DISABLE_DLL_INTERFACE_WARNING #endif // if defined(_MSC_VER) -#endif // ifdef JSON_IN_CPPTL +#endif // ifdef JSON_DLL_BUILD + #if !defined(JSON_API) #define JSON_API #endif +#if defined(_MSC_VER) && _MSC_VER < 1800 +#error \ + "ERROR: Visual Studio 12 (2013) with _MSC_VER=1800 is the oldest supported compiler with sufficient C++11 capabilities" +#endif + +#if defined(_MSC_VER) && _MSC_VER < 1900 +// As recommended at +// https://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010 +extern JSON_API int msvc_pre1900_c99_snprintf(char* outBuf, size_t size, + const char* format, ...); +#define jsoncpp_snprintf msvc_pre1900_c99_snprintf +#else +#define jsoncpp_snprintf std::snprintf +#endif + // If JSON_NO_INT64 is defined, then Json only support C++ "int" type for // integer // Storages, and 64 bits integer support is disabled. // #define JSON_NO_INT64 1 -#if defined(_MSC_VER) // MSVC -# if _MSC_VER <= 1200 // MSVC 6 - // Microsoft Visual Studio 6 only support conversion from __int64 to double - // (no conversion from unsigned __int64). -# define JSON_USE_INT64_DOUBLE_CONVERSION 1 - // Disable warning 4786 for VS6 caused by STL (identifier was truncated to '255' - // characters in the debug information) - // All projects I've ever seen with VS6 were using this globally (not bothering - // with pragma push/pop). -# pragma warning(disable : 4786) -# endif // MSVC 6 - -# if _MSC_VER >= 1500 // MSVC 2008 - /// Indicates that the following function is deprecated. -# define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) -# endif - -#endif // defined(_MSC_VER) - -// In c++11 the override keyword allows you to explicitly define that a function -// is intended to override the base-class version. This makes the code more -// managable and fixes a set of common hard-to-find bugs. -#if __cplusplus >= 201103L -# define JSONCPP_OVERRIDE override -# define JSONCPP_NOEXCEPT noexcept -#elif defined(_MSC_VER) && _MSC_VER > 1600 && _MSC_VER < 1900 -# define JSONCPP_OVERRIDE override -# define JSONCPP_NOEXCEPT throw() -#elif defined(_MSC_VER) && _MSC_VER >= 1900 -# define JSONCPP_OVERRIDE override -# define JSONCPP_NOEXCEPT noexcept -#else -# define JSONCPP_OVERRIDE -# define JSONCPP_NOEXCEPT throw() -#endif - -#ifndef JSON_HAS_RVALUE_REFERENCES - -#if defined(_MSC_VER) && _MSC_VER >= 1600 // MSVC >= 2010 -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // MSVC >= 2010 +// JSONCPP_OVERRIDE is maintained for backwards compatibility of external tools. +// C++11 should be used directly in JSONCPP. +#define JSONCPP_OVERRIDE override #ifdef __clang__ -#if __has_feature(cxx_rvalue_references) -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // has_feature - -#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) -#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L) -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // GXX_EXPERIMENTAL - -#endif // __clang__ || __GNUC__ - -#endif // not defined JSON_HAS_RVALUE_REFERENCES - -#ifndef JSON_HAS_RVALUE_REFERENCES -#define JSON_HAS_RVALUE_REFERENCES 0 +#if __has_extension(attribute_deprecated_with_message) +#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) #endif - -#ifdef __clang__ -# if __has_extension(attribute_deprecated_with_message) -# define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) -# endif -#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) -# if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) -# define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) -# elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) -# define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) -# endif // GNUC version -#endif // __clang__ || __GNUC__ +#elif defined(__GNUC__) // not clang (gcc comes later since clang emulates gcc) +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) +#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) +#endif // GNUC version +#elif defined(_MSC_VER) // MSVC (after clang because clang on Windows emulates + // MSVC) +#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) +#endif // __clang__ || __GNUC__ || _MSC_VER #if !defined(JSONCPP_DEPRECATED) #define JSONCPP_DEPRECATED(message) #endif // if !defined(JSONCPP_DEPRECATED) -#if __GNUC__ >= 6 -# define JSON_USE_INT64_DOUBLE_CONVERSION 1 +#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 6)) +#define JSON_USE_INT64_DOUBLE_CONVERSION 1 #endif #if !defined(JSON_IS_AMALGAMATION) -# include "version.h" - -# if JSONCPP_USING_SECURE_MEMORY -# include "allocator.h" //typedef Allocator -# endif +#include "allocator.h" +#include "version.h" #endif // if !defined(JSON_IS_AMALGAMATION) namespace Json { -typedef int Int; -typedef unsigned int UInt; +using Int = int; +using UInt = unsigned int; #if defined(JSON_NO_INT64) -typedef int LargestInt; -typedef unsigned int LargestUInt; +using LargestInt = int; +using LargestUInt = unsigned int; #undef JSON_HAS_INT64 #else // if defined(JSON_NO_INT64) // For Microsoft Visual use specific types as long long is not supported #if defined(_MSC_VER) // Microsoft Visual Studio -typedef __int64 Int64; -typedef unsigned __int64 UInt64; +using Int64 = __int64; +using UInt64 = unsigned __int64; #else // if defined(_MSC_VER) // Other platforms, use long long -typedef int64_t Int64; -typedef uint64_t UInt64; -#endif // if defined(_MSC_VER) -typedef Int64 LargestInt; -typedef UInt64 LargestUInt; +using Int64 = int64_t; +using UInt64 = uint64_t; +#endif // if defined(_MSC_VER) +using LargestInt = Int64; +using LargestUInt = UInt64; #define JSON_HAS_INT64 #endif // if defined(JSON_NO_INT64) -#if JSONCPP_USING_SECURE_MEMORY -#define JSONCPP_STRING std::basic_string, Json::SecureAllocator > -#define JSONCPP_OSTRINGSTREAM std::basic_ostringstream, Json::SecureAllocator > -#define JSONCPP_OSTREAM std::basic_ostream> -#define JSONCPP_ISTRINGSTREAM std::basic_istringstream, Json::SecureAllocator > -#define JSONCPP_ISTREAM std::istream -#else -#define JSONCPP_STRING std::string -#define JSONCPP_OSTRINGSTREAM std::ostringstream -#define JSONCPP_OSTREAM std::ostream -#define JSONCPP_ISTRINGSTREAM std::istringstream -#define JSONCPP_ISTREAM std::istream -#endif // if JSONCPP_USING_SECURE_MEMORY -} // end namespace Json + +template +using Allocator = + typename std::conditional, + std::allocator>::type; +using String = std::basic_string, Allocator>; +using IStringStream = + std::basic_istringstream; +using OStringStream = + std::basic_ostringstream; +using IStream = std::istream; +using OStream = std::ostream; +} // namespace Json + +// Legacy names (formerly macros). +using JSONCPP_STRING = Json::String; +using JSONCPP_ISTRINGSTREAM = Json::IStringStream; +using JSONCPP_OSTRINGSTREAM = Json::OStringStream; +using JSONCPP_ISTREAM = Json::IStream; +using JSONCPP_OSTREAM = Json::OStream; #endif // JSON_CONFIG_H_INCLUDED @@ -332,17 +406,23 @@ typedef UInt64 LargestUInt; namespace Json { // writer.h +class StreamWriter; +class StreamWriterBuilder; +class Writer; class FastWriter; class StyledWriter; +class StyledStreamWriter; // reader.h class Reader; +class CharReader; +class CharReaderBuilder; -// features.h +// json_features.h class Features; // value.h -typedef unsigned int ArrayIndex; +using ArrayIndex = unsigned int; class StaticString; class Path; class PathArgument; @@ -365,7 +445,7 @@ class ValueConstIterator; // ////////////////////////////////////////////////////////////////////// -// Beginning of content of file: include/json/features.h +// Beginning of content of file: include/json/json_features.h // ////////////////////////////////////////////////////////////////////// // Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors @@ -373,8 +453,8 @@ class ValueConstIterator; // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE -#ifndef CPPTL_JSON_FEATURES_H_INCLUDED -#define CPPTL_JSON_FEATURES_H_INCLUDED +#ifndef JSON_FEATURES_H_INCLUDED +#define JSON_FEATURES_H_INCLUDED #if !defined(JSON_IS_AMALGAMATION) #include "forwards.h" @@ -411,27 +491,27 @@ public: Features(); /// \c true if comments are allowed. Default: \c true. - bool allowComments_; + bool allowComments_{true}; /// \c true if root must be either an array or an object value. Default: \c /// false. - bool strictRoot_; + bool strictRoot_{false}; /// \c true if dropped null placeholders are allowed. Default: \c false. - bool allowDroppedNullPlaceholders_; + bool allowDroppedNullPlaceholders_{false}; /// \c true if numeric object key are allowed. Default: \c false. - bool allowNumericKeys_; + bool allowNumericKeys_{false}; }; } // namespace Json #pragma pack(pop) -#endif // CPPTL_JSON_FEATURES_H_INCLUDED +#endif // JSON_FEATURES_H_INCLUDED // ////////////////////////////////////////////////////////////////////// -// End of content of file: include/json/features.h +// End of content of file: include/json/json_features.h // ////////////////////////////////////////////////////////////////////// @@ -448,37 +528,48 @@ public: // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE -#ifndef CPPTL_JSON_H_INCLUDED -#define CPPTL_JSON_H_INCLUDED +#ifndef JSON_H_INCLUDED +#define JSON_H_INCLUDED #if !defined(JSON_IS_AMALGAMATION) #include "forwards.h" #endif // if !defined(JSON_IS_AMALGAMATION) -#include -#include -#include -#ifndef JSON_USE_CPPTL_SMALLMAP -#include -#else -#include -#endif -#ifdef JSON_USE_CPPTL -#include -#endif - -//Conditional NORETURN attribute on the throw functions would: +// Conditional NORETURN attribute on the throw functions would: // a) suppress false positives from static code analysis // b) possibly improve optimization opportunities. #if !defined(JSONCPP_NORETURN) -# if defined(_MSC_VER) -# define JSONCPP_NORETURN __declspec(noreturn) -# elif defined(__GNUC__) -# define JSONCPP_NORETURN __attribute__ ((__noreturn__)) -# else -# define JSONCPP_NORETURN -# endif +#if defined(_MSC_VER) && _MSC_VER == 1800 +#define JSONCPP_NORETURN __declspec(noreturn) +#else +#define JSONCPP_NORETURN [[noreturn]] #endif +#endif + +// Support for '= delete' with template declarations was a late addition +// to the c++11 standard and is rejected by clang 3.8 and Apple clang 8.2 +// even though these declare themselves to be c++11 compilers. +#if !defined(JSONCPP_TEMPLATE_DELETE) +#if defined(__clang__) && defined(__apple_build_version__) +#if __apple_build_version__ <= 8000042 +#define JSONCPP_TEMPLATE_DELETE +#endif +#elif defined(__clang__) +#if __clang_major__ == 3 && __clang_minor__ <= 8 +#define JSONCPP_TEMPLATE_DELETE +#endif +#endif +#if !defined(JSONCPP_TEMPLATE_DELETE) +#define JSONCPP_TEMPLATE_DELETE = delete +#endif +#endif + +#include +#include +#include +#include +#include +#include // Disable warning C4251: : needs to have dll-interface to // be used by... @@ -493,17 +584,19 @@ public: */ namespace Json { +#if JSON_USE_EXCEPTION /** Base class for all exceptions we throw. * * We use nothing but these internally. Of course, STL can throw others. */ class JSON_API Exception : public std::exception { public: - Exception(JSONCPP_STRING const& msg); - ~Exception() JSONCPP_NOEXCEPT JSONCPP_OVERRIDE; - char const* what() const JSONCPP_NOEXCEPT JSONCPP_OVERRIDE; + Exception(String msg); + ~Exception() noexcept override; + char const* what() const noexcept override; + protected: - JSONCPP_STRING msg_; + String msg_; }; /** Exceptions which the user cannot easily avoid. @@ -514,7 +607,7 @@ protected: */ class JSON_API RuntimeError : public Exception { public: - RuntimeError(JSONCPP_STRING const& msg); + RuntimeError(String const& msg); }; /** Exceptions thrown by JSON_ASSERT/JSON_FAIL macros. @@ -525,13 +618,14 @@ public: */ class JSON_API LogicError : public Exception { public: - LogicError(JSONCPP_STRING const& msg); + LogicError(String const& msg); }; +#endif /// used internally -JSONCPP_NORETURN void throwRuntimeError(JSONCPP_STRING const& msg); +JSONCPP_NORETURN void throwRuntimeError(String const& msg); /// used internally -JSONCPP_NORETURN void throwLogicError(JSONCPP_STRING const& msg); +JSONCPP_NORETURN void throwLogicError(String const& msg); /** \brief Type of the value held by a Value object. */ @@ -554,10 +648,12 @@ enum CommentPlacement { numberOfCommentPlacement }; -//# ifdef JSON_USE_CPPTL -// typedef CppTL::AnyEnumerator EnumMemberNames; -// typedef CppTL::AnyEnumerator EnumValues; -//# endif +/** \brief Type of precision for formatting of real values. + */ +enum PrecisionType { + significantDigits = 0, ///< we set max number of significant digits in string + decimalPlaces ///< we set max number of digits after "." in string +}; /** \brief Lightweight wrapper to tag static string. * @@ -610,7 +706,7 @@ private: * The get() methods can be used to obtain default value in the case the * required element does not exist. * - * It is possible to iterate over the list of a #objectValue values using + * It is possible to iterate over the list of member keys of an object using * the getMemberNames() method. * * \note #Value string-length fit in size_t, but keys must be < 2^30. @@ -621,76 +717,86 @@ private: */ class JSON_API Value { friend class ValueIteratorBase; + public: - typedef std::vector Members; - typedef ValueIterator iterator; - typedef ValueConstIterator const_iterator; - typedef Json::UInt UInt; - typedef Json::Int Int; + using Members = std::vector; + using iterator = ValueIterator; + using const_iterator = ValueConstIterator; + using UInt = Json::UInt; + using Int = Json::Int; #if defined(JSON_HAS_INT64) - typedef Json::UInt64 UInt64; - typedef Json::Int64 Int64; + using UInt64 = Json::UInt64; + using Int64 = Json::Int64; #endif // defined(JSON_HAS_INT64) - typedef Json::LargestInt LargestInt; - typedef Json::LargestUInt LargestUInt; - typedef Json::ArrayIndex ArrayIndex; + using LargestInt = Json::LargestInt; + using LargestUInt = Json::LargestUInt; + using ArrayIndex = Json::ArrayIndex; // Required for boost integration, e. g. BOOST_TEST - typedef std::string value_type; + using value_type = std::string; - static const Value& null; ///< We regret this reference to a global instance; prefer the simpler Value(). - static const Value& nullRef; ///< just a kludge for binary-compatibility; same as null - static Value const& nullSingleton(); ///< Prefer this to null or nullRef. +#if JSON_USE_NULLREF + // Binary compatibility kludges, do not use. + static const Value& null; + static const Value& nullRef; +#endif + + // null and nullRef are deprecated, use this instead. + static Value const& nullSingleton(); /// Minimum signed integer value that can be stored in a Json::Value. - static const LargestInt minLargestInt; + static constexpr LargestInt minLargestInt = + LargestInt(~(LargestUInt(-1) / 2)); /// Maximum signed integer value that can be stored in a Json::Value. - static const LargestInt maxLargestInt; + static constexpr LargestInt maxLargestInt = LargestInt(LargestUInt(-1) / 2); /// Maximum unsigned integer value that can be stored in a Json::Value. - static const LargestUInt maxLargestUInt; + static constexpr LargestUInt maxLargestUInt = LargestUInt(-1); /// Minimum signed int value that can be stored in a Json::Value. - static const Int minInt; + static constexpr Int minInt = Int(~(UInt(-1) / 2)); /// Maximum signed int value that can be stored in a Json::Value. - static const Int maxInt; + static constexpr Int maxInt = Int(UInt(-1) / 2); /// Maximum unsigned int value that can be stored in a Json::Value. - static const UInt maxUInt; + static constexpr UInt maxUInt = UInt(-1); #if defined(JSON_HAS_INT64) /// Minimum signed 64 bits int value that can be stored in a Json::Value. - static const Int64 minInt64; + static constexpr Int64 minInt64 = Int64(~(UInt64(-1) / 2)); /// Maximum signed 64 bits int value that can be stored in a Json::Value. - static const Int64 maxInt64; + static constexpr Int64 maxInt64 = Int64(UInt64(-1) / 2); /// Maximum unsigned 64 bits int value that can be stored in a Json::Value. - static const UInt64 maxUInt64; + static constexpr UInt64 maxUInt64 = UInt64(-1); #endif // defined(JSON_HAS_INT64) - + /// Default precision for real value for string representation. + static constexpr UInt defaultRealPrecision = 17; + // The constant is hard-coded because some compiler have trouble + // converting Value::maxUInt64 to a double correctly (AIX/xlC). + // Assumes that UInt64 is a 64 bits integer. + static constexpr double maxUInt64AsDouble = 18446744073709551615.0; +// Workaround for bug in the NVIDIAs CUDA 9.1 nvcc compiler +// when using gcc and clang backend compilers. CZString +// cannot be defined as private. See issue #486 +#ifdef __NVCC__ +public: +#else private: +#endif #ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION class CZString { public: - enum DuplicationPolicy { - noDuplication = 0, - duplicate, - duplicateOnCopy - }; + enum DuplicationPolicy { noDuplication = 0, duplicate, duplicateOnCopy }; CZString(ArrayIndex index); CZString(char const* str, unsigned length, DuplicationPolicy allocate); CZString(CZString const& other); -#if JSON_HAS_RVALUE_REFERENCES CZString(CZString&& other); -#endif ~CZString(); CZString& operator=(const CZString& other); - -#if JSON_HAS_RVALUE_REFERENCES CZString& operator=(CZString&& other); -#endif bool operator<(CZString const& other) const; bool operator==(CZString const& other) const; ArrayIndex index() const; - //const char* c_str() const; ///< \deprecated + // const char* c_str() const; ///< \deprecated char const* data() const; unsigned length() const; bool isStaticString() const; @@ -699,11 +805,11 @@ private: void swap(CZString& other); struct StringStorage { - unsigned policy_: 2; - unsigned length_: 30; // 1GB max + unsigned policy_ : 2; + unsigned length_ : 30; // 1GB max }; - char const* cstr_; // actually, a prefixed string, unless policy is noDup + char const* cstr_; // actually, a prefixed string, unless policy is noDup union { ArrayIndex index_; StringStorage storage_; @@ -711,29 +817,26 @@ private: }; public: -#ifndef JSON_USE_CPPTL_SMALLMAP typedef std::map ObjectValues; -#else - typedef CppTL::SmallMap ObjectValues; -#endif // ifndef JSON_USE_CPPTL_SMALLMAP #endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION public: - /** \brief Create a default Value of the given type. - - This is a very useful constructor. - To create an empty array, pass arrayValue. - To create an empty object, pass objectValue. - Another Value can then be set to this one by assignment. -This is useful since clear() and resize() will not alter types. - - Examples: -\code -Json::Value null_value; // null -Json::Value arr_value(Json::arrayValue); // [] -Json::Value obj_value(Json::objectValue); // {} -\endcode - */ + /** + * \brief Create a default Value of the given type. + * + * This is a very useful constructor. + * To create an empty array, pass arrayValue. + * To create an empty object, pass objectValue. + * Another Value can then be set to this one by assignment. + * This is useful since clear() and resize() will not alter types. + * + * Examples: + * \code + * Json::Value null_value; // null + * Json::Value arr_value(Json::arrayValue); // [] + * Json::Value obj_value(Json::objectValue); // {} + * \endcode + */ Value(ValueType type = nullValue); Value(Int value); Value(UInt value); @@ -744,38 +847,35 @@ Json::Value obj_value(Json::objectValue); // {} Value(double value); Value(const char* value); ///< Copy til first 0. (NULL causes to seg-fault.) Value(const char* begin, const char* end); ///< Copy all, incl zeroes. - /** \brief Constructs a value from a static string. - + /** + * \brief Constructs a value from a static string. + * * Like other value string constructor but do not duplicate the string for - * internal storage. The given string must remain alive after the call to this - * constructor. + * internal storage. The given string must remain alive after the call to + * this constructor. + * * \note This works only for null-terminated strings. (We cannot change the - * size of this class, so we have nowhere to store the length, - * which might be computed later for various operations.) + * size of this class, so we have nowhere to store the length, which might be + * computed later for various operations.) * * Example of usage: - * \code - * static StaticString foo("some text"); - * Json::Value aValue(foo); - * \endcode + * \code + * static StaticString foo("some text"); + * Json::Value aValue(foo); + * \endcode */ Value(const StaticString& value); - Value(const JSONCPP_STRING& value); ///< Copy data() til size(). Embedded zeroes too. -#ifdef JSON_USE_CPPTL - Value(const CppTL::ConstString& value); -#endif + Value(const String& value); Value(bool value); - /// Deep copy. + Value(std::nullptr_t ptr) = delete; Value(const Value& other); -#if JSON_HAS_RVALUE_REFERENCES - /// Move constructor Value(Value&& other); -#endif ~Value(); - /// Deep copy, then swap(other). - /// \note Over-write existing comments. To preserve comments, use #swapPayload(). - Value& operator=(Value other); + /// \note Overwrite existing comments. To preserve comments, use + /// #swapPayload(). + Value& operator=(const Value& other); + Value& operator=(Value&& other); /// Swap everything. void swap(Value& other); @@ -800,17 +900,14 @@ Json::Value obj_value(Json::objectValue); // {} const char* asCString() const; ///< Embedded zeroes could cause you trouble! #if JSONCPP_USING_SECURE_MEMORY - unsigned getCStringLength() const; //Allows you to understand the length of the CString + unsigned getCStringLength() const; // Allows you to understand the length of + // the CString #endif - JSONCPP_STRING asString() const; ///< Embedded zeroes are possible. + String asString() const; ///< Embedded zeroes are possible. /** Get raw char* of string-value. * \return false if !string. (Seg-fault if str or end are NULL.) */ - bool getString( - char const** begin, char const** end) const; -#ifdef JSON_USE_CPPTL - CppTL::ConstString asConstString() const; -#endif + bool getString(char const** begin, char const** end) const; Int asInt() const; UInt asUInt() const; #if defined(JSON_HAS_INT64) @@ -836,6 +933,10 @@ Json::Value obj_value(Json::objectValue); // {} bool isArray() const; bool isObject() const; + /// The `as` and `is` member function templates and specializations. + template T as() const JSONCPP_TEMPLATE_DELETE; + template bool is() const JSONCPP_TEMPLATE_DELETE; + bool isConvertibleTo(ValueType other) const; /// Number of values in array or object @@ -853,42 +954,33 @@ Json::Value obj_value(Json::objectValue); // {} /// \post type() is unchanged void clear(); - /// Resize the array to size elements. + /// Resize the array to newSize elements. /// New elements are initialized to null. /// May only be called on nullValue or arrayValue. /// \pre type() is arrayValue or nullValue /// \post type() is arrayValue - void resize(ArrayIndex size); + void resize(ArrayIndex newSize); - /// Access an array element (zero based index ). - /// If the array contains less than index element, then null value are - /// inserted - /// in the array so that its size is index+1. + //@{ + /// Access an array element (zero based index). If the array contains less + /// than index element, then null value are inserted in the array so that + /// its size is index+1. /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) + /// this from the operator[] which takes a string.) Value& operator[](ArrayIndex index); - - /// Access an array element (zero based index ). - /// If the array contains less than index element, then null value are - /// inserted - /// in the array so that its size is index+1. - /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) Value& operator[](int index); + //@} - /// Access an array element (zero based index ) + //@{ + /// Access an array element (zero based index). /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) + /// this from the operator[] which takes a string.) const Value& operator[](ArrayIndex index) const; - - /// Access an array element (zero based index ) - /// (You may need to say 'value[0u]' to get your compiler to distinguish - /// this from the operator[] which takes a string.) const Value& operator[](int index) const; + //@} /// If the array contains at least index+1 elements, returns the element - /// value, - /// otherwise returns defaultValue. + /// value, otherwise returns defaultValue. Value get(ArrayIndex index, const Value& defaultValue) const; /// Return true if index < size(). bool isValidIndex(ArrayIndex index) const; @@ -896,61 +988,51 @@ Json::Value obj_value(Json::objectValue); // {} /// /// Equivalent to jsonvalue[jsonvalue.size()] = value; Value& append(const Value& value); - -#if JSON_HAS_RVALUE_REFERENCES Value& append(Value&& value); -#endif + + /// \brief Insert value in array at specific index + bool insert(ArrayIndex index, const Value& newValue); + bool insert(ArrayIndex index, Value&& newValue); /// Access an object value by name, create a null member if it does not exist. /// \note Because of our implementation, keys are limited to 2^30 -1 chars. - /// Exceeding that will cause an exception. + /// Exceeding that will cause an exception. Value& operator[](const char* key); /// Access an object value by name, returns null if there is no member with /// that name. const Value& operator[](const char* key) const; /// Access an object value by name, create a null member if it does not exist. /// \param key may contain embedded nulls. - Value& operator[](const JSONCPP_STRING& key); + Value& operator[](const String& key); /// Access an object value by name, returns null if there is no member with /// that name. /// \param key may contain embedded nulls. - const Value& operator[](const JSONCPP_STRING& key) const; + const Value& operator[](const String& key) const; /** \brief Access an object value by name, create a null member if it does not - exist. - - * If the object has no entry for that name, then the member name used to store - * the new entry is not duplicated. + * exist. + * + * If the object has no entry for that name, then the member name used to + * store the new entry is not duplicated. * Example of use: - * \code - * Json::Value object; - * static const StaticString code("code"); - * object[code] = 1234; - * \endcode + * \code + * Json::Value object; + * static const StaticString code("code"); + * object[code] = 1234; + * \endcode */ Value& operator[](const StaticString& key); -#ifdef JSON_USE_CPPTL - /// Access an object value by name, create a null member if it does not exist. - Value& operator[](const CppTL::ConstString& key); - /// Access an object value by name, returns null if there is no member with - /// that name. - const Value& operator[](const CppTL::ConstString& key) const; -#endif /// Return the member named key if it exist, defaultValue otherwise. /// \note deep copy Value get(const char* key, const Value& defaultValue) const; /// Return the member named key if it exist, defaultValue otherwise. /// \note deep copy /// \note key may contain embedded nulls. - Value get(const char* begin, const char* end, const Value& defaultValue) const; + Value get(const char* begin, const char* end, + const Value& defaultValue) const; /// Return the member named key if it exist, defaultValue otherwise. /// \note deep copy /// \param key may contain embedded nulls. - Value get(const JSONCPP_STRING& key, const Value& defaultValue) const; -#ifdef JSON_USE_CPPTL - /// Return the member named key if it exist, defaultValue otherwise. - /// \note deep copy - Value get(const CppTL::ConstString& key, const Value& defaultValue) const; -#endif + Value get(const String& key, const Value& defaultValue) const; /// Most general and efficient version of isMember()const, get()const, /// and operator[]const /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30 @@ -958,51 +1040,44 @@ Json::Value obj_value(Json::objectValue); // {} /// Most general and efficient version of object-mutators. /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30 /// \return non-zero, but JSON_ASSERT if this is neither object nor nullValue. - Value const* demand(char const* begin, char const* end); + Value* demand(char const* begin, char const* end); /// \brief Remove and return the named member. /// /// Do nothing if it did not exist. - /// \return the removed Value, or null. /// \pre type() is objectValue or nullValue /// \post type() is unchanged - /// \deprecated void removeMember(const char* key); /// Same as removeMember(const char*) /// \param key may contain embedded nulls. - /// \deprecated - void removeMember(const JSONCPP_STRING& key); + void removeMember(const String& key); /// Same as removeMember(const char* begin, const char* end, Value* removed), /// but 'key' is null-terminated. bool removeMember(const char* key, Value* removed); /** \brief Remove the named map member. - - Update 'removed' iff removed. - \param key may contain embedded nulls. - \return true iff removed (no exceptions) - */ - bool removeMember(JSONCPP_STRING const& key, Value* removed); - /// Same as removeMember(JSONCPP_STRING const& key, Value* removed) + * + * Update 'removed' iff removed. + * \param key may contain embedded nulls. + * \return true iff removed (no exceptions) + */ + bool removeMember(String const& key, Value* removed); + /// Same as removeMember(String const& key, Value* removed) bool removeMember(const char* begin, const char* end, Value* removed); /** \brief Remove the indexed array element. - - O(n) expensive operations. - Update 'removed' iff removed. - \return true iff removed (no exceptions) - */ - bool removeIndex(ArrayIndex i, Value* removed); + * + * O(n) expensive operations. + * Update 'removed' iff removed. + * \return true if removed (no exceptions) + */ + bool removeIndex(ArrayIndex index, Value* removed); /// Return true if the object has a member named key. /// \note 'key' must be null-terminated. bool isMember(const char* key) const; /// Return true if the object has a member named key. /// \param key may contain embedded nulls. - bool isMember(const JSONCPP_STRING& key) const; - /// Same as isMember(JSONCPP_STRING const& key)const + bool isMember(const String& key) const; + /// Same as isMember(String const& key)const bool isMember(const char* begin, const char* end) const; -#ifdef JSON_USE_CPPTL - /// Return true if the object has a member named key. - bool isMember(const CppTL::ConstString& key) const; -#endif /// \brief Return a list of the member names. /// @@ -1011,23 +1086,22 @@ Json::Value obj_value(Json::objectValue); // {} /// \post if type() was nullValue, it remains nullValue Members getMemberNames() const; - //# ifdef JSON_USE_CPPTL - // EnumMemberNames enumMemberNames() const; - // EnumValues enumValues() const; - //# endif - /// \deprecated Always pass len. - JSONCPP_DEPRECATED("Use setComment(JSONCPP_STRING const&) instead.") - void setComment(const char* comment, CommentPlacement placement); + JSONCPP_DEPRECATED("Use setComment(String const&) instead.") + void setComment(const char* comment, CommentPlacement placement) { + setComment(String(comment, strlen(comment)), placement); + } /// Comments must be //... or /* ... */ - void setComment(const char* comment, size_t len, CommentPlacement placement); + void setComment(const char* comment, size_t len, CommentPlacement placement) { + setComment(String(comment, len), placement); + } /// Comments must be //... or /* ... */ - void setComment(const JSONCPP_STRING& comment, CommentPlacement placement); + void setComment(String comment, CommentPlacement placement); bool hasComment(CommentPlacement placement) const; /// Include delimiters and embedded newlines. - JSONCPP_STRING getComment(CommentPlacement placement) const; + String getComment(CommentPlacement placement) const; - JSONCPP_STRING toStyledString() const; + String toStyledString() const; const_iterator begin() const; const_iterator end() const; @@ -1043,20 +1117,20 @@ Json::Value obj_value(Json::objectValue); // {} ptrdiff_t getOffsetLimit() const; private: + void setType(ValueType v) { + bits_.value_type_ = static_cast(v); + } + bool isAllocated() const { return bits_.allocated_; } + void setIsAllocated(bool v) { bits_.allocated_ = v; } + void initBasic(ValueType type, bool allocated = false); + void dupPayload(const Value& other); + void releasePayload(); + void dupMeta(const Value& other); Value& resolveReference(const char* key); Value& resolveReference(const char* key, const char* end); - struct CommentInfo { - CommentInfo(); - ~CommentInfo(); - - void setComment(const char* text, size_t len); - - char* comment_; - }; - // struct MemberNamesTransform //{ // typedef const char *result_type; @@ -1071,13 +1145,33 @@ private: LargestUInt uint_; double real_; bool bool_; - char* string_; // actually ptr to unsigned, followed by str, unless !allocated_ + char* string_; // if allocated_, ptr to { unsigned, char[] }. ObjectValues* map_; } value_; - ValueType type_ : 8; - unsigned int allocated_ : 1; // Notes: if declared as bool, bitfield is useless. - // If not allocated_, string_ must be null-terminated. - CommentInfo* comments_; + + struct { + // Really a ValueType, but types should agree for bitfield packing. + unsigned int value_type_ : 8; + // Unless allocated_, string_ must be null-terminated. + unsigned int allocated_ : 1; + } bits_; + + class Comments { + public: + Comments() = default; + Comments(const Comments& that); + Comments(Comments&& that); + Comments& operator=(const Comments& that); + Comments& operator=(Comments&& that); + bool has(CommentPlacement slot) const; + String get(CommentPlacement slot) const; + void set(CommentPlacement slot, String comment); + + private: + using Array = std::array; + std::unique_ptr ptr_; + }; + Comments comments_; // [start, limit) byte offsets in the source JSON text from which this Value // was extracted. @@ -1085,6 +1179,36 @@ private: ptrdiff_t limit_; }; +template <> inline bool Value::as() const { return asBool(); } +template <> inline bool Value::is() const { return isBool(); } + +template <> inline Int Value::as() const { return asInt(); } +template <> inline bool Value::is() const { return isInt(); } + +template <> inline UInt Value::as() const { return asUInt(); } +template <> inline bool Value::is() const { return isUInt(); } + +#if defined(JSON_HAS_INT64) +template <> inline Int64 Value::as() const { return asInt64(); } +template <> inline bool Value::is() const { return isInt64(); } + +template <> inline UInt64 Value::as() const { return asUInt64(); } +template <> inline bool Value::is() const { return isUInt64(); } +#endif + +template <> inline double Value::as() const { return asDouble(); } +template <> inline bool Value::is() const { return isDouble(); } + +template <> inline String Value::as() const { return asString(); } +template <> inline bool Value::is() const { return isString(); } + +/// These `as` specializations are type conversions, and do not have a +/// corresponding `is`. +template <> inline float Value::as() const { return asFloat(); } +template <> inline const char* Value::as() const { + return asCString(); +} + /** \brief Experimental and untested: represents an element of the "path" to * access a node. */ @@ -1095,17 +1219,13 @@ public: PathArgument(); PathArgument(ArrayIndex index); PathArgument(const char* key); - PathArgument(const JSONCPP_STRING& key); + PathArgument(String key); private: - enum Kind { - kindNone = 0, - kindIndex, - kindKey - }; - JSONCPP_STRING key_; - ArrayIndex index_; - Kind kind_; + enum Kind { kindNone = 0, kindIndex, kindKey }; + String key_; + ArrayIndex index_{}; + Kind kind_{kindNone}; }; /** \brief Experimental and untested: represents a "path" to access a node. @@ -1117,12 +1237,11 @@ private: * - ".name1.name2.name3" * - ".[0][1][2].name1[3]" * - ".%" => member name is provided as parameter - * - ".[%]" => index is provied as parameter + * - ".[%]" => index is provided as parameter */ class JSON_API Path { public: - Path(const JSONCPP_STRING& path, - const PathArgument& a1 = PathArgument(), + Path(const String& path, const PathArgument& a1 = PathArgument(), const PathArgument& a2 = PathArgument(), const PathArgument& a3 = PathArgument(), const PathArgument& a4 = PathArgument(), @@ -1135,15 +1254,13 @@ public: Value& make(Value& root) const; private: - typedef std::vector InArgs; - typedef std::vector Args; + using InArgs = std::vector; + using Args = std::vector; - void makePath(const JSONCPP_STRING& path, const InArgs& in); - void addPathInArg(const JSONCPP_STRING& path, - const InArgs& in, - InArgs::const_iterator& itInArg, - PathArgument::Kind kind); - void invalidPath(const JSONCPP_STRING& path, int location); + void makePath(const String& path, const InArgs& in); + void addPathInArg(const String& path, const InArgs& in, + InArgs::const_iterator& itInArg, PathArgument::Kind kind); + static void invalidPath(const String& path, int location); Args args_; }; @@ -1153,10 +1270,10 @@ private: */ class JSON_API ValueIteratorBase { public: - typedef std::bidirectional_iterator_tag iterator_category; - typedef unsigned int size_t; - typedef int difference_type; - typedef ValueIteratorBase SelfType; + using iterator_category = std::bidirectional_iterator_tag; + using size_t = unsigned int; + using difference_type = int; + using SelfType = ValueIteratorBase; bool operator==(const SelfType& other) const { return isEqual(other); } @@ -1170,17 +1287,19 @@ public: /// Value. Value key() const; - /// Return the index of the referenced Value, or -1 if it is not an arrayValue. + /// Return the index of the referenced Value, or -1 if it is not an + /// arrayValue. UInt index() const; /// Return the member name of the referenced Value, or "" if it is not an /// objectValue. /// \note Avoid `c_str()` on result, as embedded zeroes are possible. - JSONCPP_STRING name() const; + String name() const; /// Return the member name of the referenced Value. "" if it is not an /// objectValue. - /// \deprecated This cannot be used for UTF-8 strings, since there can be embedded nulls. + /// \deprecated This cannot be used for UTF-8 strings, since there can be + /// embedded nulls. JSONCPP_DEPRECATED("Use `key = name();` instead.") char const* memberName() const; /// Return the member name of the referenced Value, or NULL if it is not an @@ -1189,7 +1308,14 @@ public: char const* memberName(char const** end) const; protected: - Value& deref() const; + /*! Internal utility functions to assist with implementing + * other iterator functions. The const and non-const versions + * of the "deref" protected methods expose the protected + * current_ member variable in a way that can often be + * optimized away by the compiler. + */ + const Value& deref() const; + Value& deref(); void increment(); @@ -1204,7 +1330,7 @@ protected: private: Value::ObjectValues::iterator current_; // Indicates that iterator is for a null value. - bool isNull_; + bool isNull_{true}; public: // For some reason, BORLAND needs these at the end, rather @@ -1220,20 +1346,21 @@ class JSON_API ValueConstIterator : public ValueIteratorBase { friend class Value; public: - typedef const Value value_type; - //typedef unsigned int size_t; - //typedef int difference_type; - typedef const Value& reference; - typedef const Value* pointer; - typedef ValueConstIterator SelfType; + using value_type = const Value; + // typedef unsigned int size_t; + // typedef int difference_type; + using reference = const Value&; + using pointer = const Value*; + using SelfType = ValueConstIterator; ValueConstIterator(); ValueConstIterator(ValueIterator const& other); private: -/*! \internal Use by Value to create an iterator. - */ + /*! \internal Use by Value to create an iterator. + */ explicit ValueConstIterator(const Value::ObjectValues::iterator& current); + public: SelfType& operator=(const ValueIteratorBase& other); @@ -1270,21 +1397,22 @@ class JSON_API ValueIterator : public ValueIteratorBase { friend class Value; public: - typedef Value value_type; - typedef unsigned int size_t; - typedef int difference_type; - typedef Value& reference; - typedef Value* pointer; - typedef ValueIterator SelfType; + using value_type = Value; + using size_t = unsigned int; + using difference_type = int; + using reference = Value&; + using pointer = Value*; + using SelfType = ValueIterator; ValueIterator(); explicit ValueIterator(const ValueConstIterator& other); ValueIterator(const ValueIterator& other); private: -/*! \internal Use by Value to create an iterator. - */ + /*! \internal Use by Value to create an iterator. + */ explicit ValueIterator(const Value::ObjectValues::iterator& current); + public: SelfType& operator=(const SelfType& other); @@ -1310,27 +1438,26 @@ public: return *this; } - reference operator*() const { return deref(); } - - pointer operator->() const { return &deref(); } + /*! The return value of non-const iterators can be + * changed, so the these functions are not const + * because the returned references/pointers can be used + * to change state of the base class. + */ + reference operator*() { return deref(); } + pointer operator->() { return &deref(); } }; +inline void swap(Value& a, Value& b) { a.swap(b); } + } // namespace Json - -namespace std { -/// Specialize std::swap() for Json::Value. -template<> -inline void swap(Json::Value& a, Json::Value& b) { a.swap(b); } -} - #pragma pack(pop) #if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) #pragma warning(pop) #endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) -#endif // CPPTL_JSON_H_INCLUDED +#endif // JSON_H_INCLUDED // ////////////////////////////////////////////////////////////////////// // End of content of file: include/json/value.h @@ -1350,18 +1477,18 @@ inline void swap(Json::Value& a, Json::Value& b) { a.swap(b); } // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE -#ifndef CPPTL_JSON_READER_H_INCLUDED -#define CPPTL_JSON_READER_H_INCLUDED +#ifndef JSON_READER_H_INCLUDED +#define JSON_READER_H_INCLUDED #if !defined(JSON_IS_AMALGAMATION) -#include "features.h" +#include "json_features.h" #include "value.h" #endif // if !defined(JSON_IS_AMALGAMATION) #include #include +#include #include #include -#include // Disable warning C4251: : needs to have dll-interface to // be used by... @@ -1375,132 +1502,130 @@ inline void swap(Json::Value& a, Json::Value& b) { a.swap(b); } namespace Json { /** \brief Unserialize a JSON document into a - *Value. + * Value. * * \deprecated Use CharReader and CharReaderBuilder. */ -class JSONCPP_DEPRECATED("Use CharReader and CharReaderBuilder instead") JSON_API Reader { + +class JSONCPP_DEPRECATED( + "Use CharReader and CharReaderBuilder instead.") JSON_API Reader { public: - typedef char Char; - typedef const Char* Location; + using Char = char; + using Location = const Char*; /** \brief An error tagged with where in the JSON text it was encountered. * * The offsets give the [start, limit) range of bytes within the text. Note * that this is bytes, not codepoints. - * */ struct StructuredError { ptrdiff_t offset_start; ptrdiff_t offset_limit; - JSONCPP_STRING message; + String message; }; - /** \brief Constructs a Reader allowing all features - * for parsing. + /** \brief Constructs a Reader allowing all features for parsing. */ + JSONCPP_DEPRECATED("Use CharReader and CharReaderBuilder instead") Reader(); - /** \brief Constructs a Reader allowing the specified feature set - * for parsing. + /** \brief Constructs a Reader allowing the specified feature set for parsing. */ + JSONCPP_DEPRECATED("Use CharReader and CharReaderBuilder instead") Reader(const Features& features); /** \brief Read a Value from a JSON * document. - * \param document UTF-8 encoded string containing the document to read. - * \param root [out] Contains the root value of the document if it was - * successfully parsed. - * \param collectComments \c true to collect comment and allow writing them - * back during - * serialization, \c false to discard comments. - * This parameter is ignored if - * Features::allowComments_ - * is \c false. + * + * \param document UTF-8 encoded string containing the document + * to read. + * \param[out] root Contains the root value of the document if it + * was successfully parsed. + * \param collectComments \c true to collect comment and allow writing + * them back during serialization, \c false to + * discard comments. This parameter is ignored + * if Features::allowComments_ is \c false. * \return \c true if the document was successfully parsed, \c false if an * error occurred. */ - bool - parse(const std::string& document, Value& root, bool collectComments = true); + bool parse(const std::string& document, Value& root, + bool collectComments = true); /** \brief Read a Value from a JSON - document. - * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the - document to read. - * \param endDoc Pointer on the end of the UTF-8 encoded string of the - document to read. - * Must be >= beginDoc. - * \param root [out] Contains the root value of the document if it was - * successfully parsed. - * \param collectComments \c true to collect comment and allow writing them - back during - * serialization, \c false to discard comments. - * This parameter is ignored if - Features::allowComments_ - * is \c false. + * document. + * + * \param beginDoc Pointer on the beginning of the UTF-8 encoded + * string of the document to read. + * \param endDoc Pointer on the end of the UTF-8 encoded string + * of the document to read. Must be >= beginDoc. + * \param[out] root Contains the root value of the document if it + * was successfully parsed. + * \param collectComments \c true to collect comment and allow writing + * them back during serialization, \c false to + * discard comments. This parameter is ignored + * if Features::allowComments_ is \c false. * \return \c true if the document was successfully parsed, \c false if an - error occurred. + * error occurred. */ - bool parse(const char* beginDoc, - const char* endDoc, - Value& root, + bool parse(const char* beginDoc, const char* endDoc, Value& root, bool collectComments = true); /// \brief Parse from input stream. /// \see Json::operator>>(std::istream&, Json::Value&). - bool parse(JSONCPP_ISTREAM& is, Value& root, bool collectComments = true); + bool parse(IStream& is, Value& root, bool collectComments = true); /** \brief Returns a user friendly string that list errors in the parsed * document. - * \return Formatted error message with the list of errors with their location - * in - * the parsed document. An empty string is returned if no error - * occurred - * during parsing. + * + * \return Formatted error message with the list of errors with their + * location in the parsed document. An empty string is returned if no error + * occurred during parsing. * \deprecated Use getFormattedErrorMessages() instead (typo fix). */ JSONCPP_DEPRECATED("Use getFormattedErrorMessages() instead.") - JSONCPP_STRING getFormatedErrorMessages() const; + String getFormatedErrorMessages() const; /** \brief Returns a user friendly string that list errors in the parsed * document. - * \return Formatted error message with the list of errors with their location - * in - * the parsed document. An empty string is returned if no error - * occurred - * during parsing. + * + * \return Formatted error message with the list of errors with their + * location in the parsed document. An empty string is returned if no error + * occurred during parsing. */ - JSONCPP_STRING getFormattedErrorMessages() const; + String getFormattedErrorMessages() const; - /** \brief Returns a vector of structured erros encounted while parsing. + /** \brief Returns a vector of structured errors encountered while parsing. + * * \return A (possibly empty) vector of StructuredError objects. Currently - * only one error can be returned, but the caller should tolerate - * multiple - * errors. This can occur if the parser recovers from a non-fatal - * parse error and then encounters additional errors. + * only one error can be returned, but the caller should tolerate multiple + * errors. This can occur if the parser recovers from a non-fatal parse + * error and then encounters additional errors. */ std::vector getStructuredErrors() const; /** \brief Add a semantic error message. - * \param value JSON Value location associated with the error + * + * \param value JSON Value location associated with the error * \param message The error message. - * \return \c true if the error was successfully added, \c false if the - * Value offset exceeds the document size. + * \return \c true if the error was successfully added, \c false if the Value + * offset exceeds the document size. */ - bool pushError(const Value& value, const JSONCPP_STRING& message); + bool pushError(const Value& value, const String& message); /** \brief Add a semantic error message with extra context. - * \param value JSON Value location associated with the error + * + * \param value JSON Value location associated with the error * \param message The error message. - * \param extra Additional JSON Value location to contextualize the error + * \param extra Additional JSON Value location to contextualize the error * \return \c true if the error was successfully added, \c false if either * Value offset exceeds the document size. */ - bool pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra); + bool pushError(const Value& value, const String& message, const Value& extra); /** \brief Return whether there are any errors. - * \return \c true if there are no errors to report \c false if - * errors have occurred. + * + * \return \c true if there are no errors to report \c false if errors have + * occurred. */ bool good() const; @@ -1532,15 +1657,15 @@ private: class ErrorInfo { public: Token token_; - JSONCPP_STRING message_; + String message_; Location extra_; }; - typedef std::deque Errors; + using Errors = std::deque; bool readToken(Token& token); void skipSpaces(); - bool match(Location pattern, int patternLength); + bool match(const Char* pattern, int patternLength); bool readComment(); bool readCStyleComment(); bool readCppStyleComment(); @@ -1552,142 +1677,138 @@ private: bool decodeNumber(Token& token); bool decodeNumber(Token& token, Value& decoded); bool decodeString(Token& token); - bool decodeString(Token& token, JSONCPP_STRING& decoded); + bool decodeString(Token& token, String& decoded); bool decodeDouble(Token& token); bool decodeDouble(Token& token, Value& decoded); - bool decodeUnicodeCodePoint(Token& token, - Location& current, - Location end, + bool decodeUnicodeCodePoint(Token& token, Location& current, Location end, unsigned int& unicode); - bool decodeUnicodeEscapeSequence(Token& token, - Location& current, - Location end, - unsigned int& unicode); - bool addError(const JSONCPP_STRING& message, Token& token, Location extra = 0); + bool decodeUnicodeEscapeSequence(Token& token, Location& current, + Location end, unsigned int& unicode); + bool addError(const String& message, Token& token, Location extra = nullptr); bool recoverFromError(TokenType skipUntilToken); - bool addErrorAndRecover(const JSONCPP_STRING& message, - Token& token, + bool addErrorAndRecover(const String& message, Token& token, TokenType skipUntilToken); void skipUntilSpace(); Value& currentValue(); Char getNextChar(); - void - getLocationLineAndColumn(Location location, int& line, int& column) const; - JSONCPP_STRING getLocationLineAndColumn(Location location) const; + void getLocationLineAndColumn(Location location, int& line, + int& column) const; + String getLocationLineAndColumn(Location location) const; void addComment(Location begin, Location end, CommentPlacement placement); void skipCommentTokens(Token& token); static bool containsNewLine(Location begin, Location end); - static JSONCPP_STRING normalizeEOL(Location begin, Location end); + static String normalizeEOL(Location begin, Location end); - typedef std::stack Nodes; + using Nodes = std::stack; Nodes nodes_; Errors errors_; - JSONCPP_STRING document_; - Location begin_; - Location end_; - Location current_; - Location lastValueEnd_; - Value* lastValue_; - JSONCPP_STRING commentsBefore_; + String document_; + Location begin_{}; + Location end_{}; + Location current_{}; + Location lastValueEnd_{}; + Value* lastValue_{}; + String commentsBefore_; Features features_; - bool collectComments_; -}; // Reader + bool collectComments_{}; +}; // Reader /** Interface for reading JSON from a char array. */ class JSON_API CharReader { public: - virtual ~CharReader() {} + virtual ~CharReader() = default; /** \brief Read a Value from a JSON - document. - * The document must be a UTF-8 encoded string containing the document to read. + * document. The document must be a UTF-8 encoded string containing the + * document to read. * - * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the - document to read. - * \param endDoc Pointer on the end of the UTF-8 encoded string of the - document to read. - * Must be >= beginDoc. - * \param root [out] Contains the root value of the document if it was - * successfully parsed. - * \param errs [out] Formatted error messages (if not NULL) - * a user friendly string that lists errors in the parsed - * document. + * \param beginDoc Pointer on the beginning of the UTF-8 encoded string + * of the document to read. + * \param endDoc Pointer on the end of the UTF-8 encoded string of the + * document to read. Must be >= beginDoc. + * \param[out] root Contains the root value of the document if it was + * successfully parsed. + * \param[out] errs Formatted error messages (if not NULL) a user + * friendly string that lists errors in the parsed + * document. * \return \c true if the document was successfully parsed, \c false if an - error occurred. + * error occurred. */ - virtual bool parse( - char const* beginDoc, char const* endDoc, - Value* root, JSONCPP_STRING* errs) = 0; + virtual bool parse(char const* beginDoc, char const* endDoc, Value* root, + String* errs) = 0; class JSON_API Factory { public: - virtual ~Factory() {} + virtual ~Factory() = default; /** \brief Allocate a CharReader via operator new(). * \throw std::exception if something goes wrong (e.g. invalid settings) */ virtual CharReader* newCharReader() const = 0; - }; // Factory -}; // CharReader + }; // Factory +}; // CharReader /** \brief Build a CharReader implementation. - -Usage: -\code - using namespace Json; - CharReaderBuilder builder; - builder["collectComments"] = false; - Value value; - JSONCPP_STRING errs; - bool ok = parseFromStream(builder, std::cin, &value, &errs); -\endcode -*/ + * + * Usage: + * \code + * using namespace Json; + * CharReaderBuilder builder; + * builder["collectComments"] = false; + * Value value; + * String errs; + * bool ok = parseFromStream(builder, std::cin, &value, &errs); + * \endcode + */ class JSON_API CharReaderBuilder : public CharReader::Factory { public: // Note: We use a Json::Value so that we can add data-members to this class // without a major version bump. /** Configuration of this builder. - These are case-sensitive. - Available settings (case-sensitive): - - `"collectComments": false or true` - - true to collect comment and allow writing them - back during serialization, false to discard comments. - This parameter is ignored if allowComments is false. - - `"allowComments": false or true` - - true if comments are allowed. - - `"strictRoot": false or true` - - true if root must be either an array or an object value - - `"allowDroppedNullPlaceholders": false or true` - - true if dropped null placeholders are allowed. (See StreamWriterBuilder.) - - `"allowNumericKeys": false or true` - - true if numeric object keys are allowed. - - `"allowSingleQuotes": false or true` - - true if '' are allowed for strings (both keys and values) - - `"stackLimit": integer` - - Exceeding stackLimit (recursive depth of `readValue()`) will - cause an exception. - - This is a security issue (seg-faults caused by deeply nested JSON), - so the default is low. - - `"failIfExtra": false or true` - - If true, `parse()` returns false when extra non-whitespace trails - the JSON value in the input string. - - `"rejectDupKeys": false or true` - - If true, `parse()` returns false when a key is duplicated within an object. - - `"allowSpecialFloats": false or true` - - If true, special float values (NaNs and infinities) are allowed - and their values are lossfree restorable. - - You can examine 'settings_` yourself - to see the defaults. You can also write and read them just like any - JSON Value. - \sa setDefaults() - */ + * These are case-sensitive. + * Available settings (case-sensitive): + * - `"collectComments": false or true` + * - true to collect comment and allow writing them back during + * serialization, false to discard comments. This parameter is ignored + * if allowComments is false. + * - `"allowComments": false or true` + * - true if comments are allowed. + * - `"allowTrailingCommas": false or true` + * - true if trailing commas in objects and arrays are allowed. + * - `"strictRoot": false or true` + * - true if root must be either an array or an object value + * - `"allowDroppedNullPlaceholders": false or true` + * - true if dropped null placeholders are allowed. (See + * StreamWriterBuilder.) + * - `"allowNumericKeys": false or true` + * - true if numeric object keys are allowed. + * - `"allowSingleQuotes": false or true` + * - true if '' are allowed for strings (both keys and values) + * - `"stackLimit": integer` + * - Exceeding stackLimit (recursive depth of `readValue()`) will cause an + * exception. + * - This is a security issue (seg-faults caused by deeply nested JSON), so + * the default is low. + * - `"failIfExtra": false or true` + * - If true, `parse()` returns false when extra non-whitespace trails the + * JSON value in the input string. + * - `"rejectDupKeys": false or true` + * - If true, `parse()` returns false when a key is duplicated within an + * object. + * - `"allowSpecialFloats": false or true` + * - If true, special float values (NaNs and infinities) are allowed and + * their values are lossfree restorable. + * + * You can examine 'settings_` yourself to see the defaults. You can also + * write and read them just like any JSON Value. + * \sa setDefaults() + */ Json::Value settings_; CharReaderBuilder(); - ~CharReaderBuilder() JSONCPP_OVERRIDE; + ~CharReaderBuilder() override; - CharReader* newCharReader() const JSONCPP_OVERRIDE; + CharReader* newCharReader() const override; /** \return true if 'settings' are legal and consistent; * otherwise, indicate bad settings via 'invalid'. @@ -1696,7 +1817,7 @@ public: /** A simple way to update a specific setting. */ - Value& operator[](JSONCPP_STRING key); + Value& operator[](const String& key); /** Called by ctor, but you can use this to reset settings_. * \pre 'settings' != NULL (but Json::null is fine) @@ -1713,39 +1834,37 @@ public: }; /** Consume entire stream and use its begin/end. - * Someday we might have a real StreamReader, but for now this - * is convenient. - */ -bool JSON_API parseFromStream( - CharReader::Factory const&, - JSONCPP_ISTREAM&, - Value* root, std::string* errs); + * Someday we might have a real StreamReader, but for now this + * is convenient. + */ +bool JSON_API parseFromStream(CharReader::Factory const&, IStream&, Value* root, + String* errs); /** \brief Read from 'sin' into 'root'. - - Always keep comments from the input JSON. - - This can be used to read a file into a particular sub-object. - For example: - \code - Json::Value root; - cin >> root["dir"]["file"]; - cout << root; - \endcode - Result: - \verbatim - { - "dir": { - "file": { - // The input stream JSON would be nested here. - } - } - } - \endverbatim - \throw std::exception on parse error. - \see Json::operator<<() -*/ -JSON_API JSONCPP_ISTREAM& operator>>(JSONCPP_ISTREAM&, Value&); + * + * Always keep comments from the input JSON. + * + * This can be used to read a file into a particular sub-object. + * For example: + * \code + * Json::Value root; + * cin >> root["dir"]["file"]; + * cout << root; + * \endcode + * Result: + * \verbatim + * { + * "dir": { + * "file": { + * // The input stream JSON would be nested here. + * } + * } + * } + * \endverbatim + * \throw std::exception on parse error. + * \see Json::operator<<() + */ +JSON_API IStream& operator>>(IStream&, Value&); } // namespace Json @@ -1755,7 +1874,7 @@ JSON_API JSONCPP_ISTREAM& operator>>(JSONCPP_ISTREAM&, Value&); #pragma warning(pop) #endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) -#endif // CPPTL_JSON_READER_H_INCLUDED +#endif // JSON_READER_H_INCLUDED // ////////////////////////////////////////////////////////////////////// // End of content of file: include/json/reader.h @@ -1781,9 +1900,9 @@ JSON_API JSONCPP_ISTREAM& operator>>(JSONCPP_ISTREAM&, Value&); #if !defined(JSON_IS_AMALGAMATION) #include "value.h" #endif // if !defined(JSON_IS_AMALGAMATION) -#include -#include #include +#include +#include // Disable warning C4251: : needs to have dll-interface to // be used by... @@ -1799,31 +1918,31 @@ namespace Json { class Value; /** - -Usage: -\code - using namespace Json; - void writeToStdout(StreamWriter::Factory const& factory, Value const& value) { - std::unique_ptr const writer( - factory.newStreamWriter()); - writer->write(value, &std::cout); - std::cout << std::endl; // add lf and flush - } -\endcode -*/ + * + * Usage: + * \code + * using namespace Json; + * void writeToStdout(StreamWriter::Factory const& factory, Value const& value) + * { std::unique_ptr const writer( factory.newStreamWriter()); + * writer->write(value, &std::cout); + * std::cout << std::endl; // add lf and flush + * } + * \endcode + */ class JSON_API StreamWriter { protected: - JSONCPP_OSTREAM* sout_; // not owned; will not delete + OStream* sout_; // not owned; will not delete public: StreamWriter(); virtual ~StreamWriter(); /** Write Value into document as configured in sub-class. - Do not take ownership of sout, but maintain a reference during function. - \pre sout != NULL - \return zero on success (For now, we always return zero, so check the stream instead.) - \throw std::exception possibly, depending on configuration + * Do not take ownership of sout, but maintain a reference during function. + * \pre sout != NULL + * \return zero on success (For now, we always return zero, so check the + * stream instead.) \throw std::exception possibly, depending on + * configuration */ - virtual int write(Value const& root, JSONCPP_OSTREAM* sout) = 0; + virtual int write(Value const& root, OStream* sout) = 0; /** \brief A simple abstract factory. */ @@ -1834,64 +1953,69 @@ public: * \throw std::exception if something goes wrong (e.g. invalid settings) */ virtual StreamWriter* newStreamWriter() const = 0; - }; // Factory -}; // StreamWriter + }; // Factory +}; // StreamWriter /** \brief Write into stringstream, then return string, for convenience. * A StreamWriter will be created from the factory, used, and then deleted. */ -JSONCPP_STRING JSON_API writeString(StreamWriter::Factory const& factory, Value const& root); - +String JSON_API writeString(StreamWriter::Factory const& factory, + Value const& root); /** \brief Build a StreamWriter implementation. -Usage: -\code - using namespace Json; - Value value = ...; - StreamWriterBuilder builder; - builder["commentStyle"] = "None"; - builder["indentation"] = " "; // or whatever you like - std::unique_ptr writer( - builder.newStreamWriter()); - writer->write(value, &std::cout); - std::cout << std::endl; // add lf and flush -\endcode +* Usage: +* \code +* using namespace Json; +* Value value = ...; +* StreamWriterBuilder builder; +* builder["commentStyle"] = "None"; +* builder["indentation"] = " "; // or whatever you like +* std::unique_ptr writer( +* builder.newStreamWriter()); +* writer->write(value, &std::cout); +* std::cout << std::endl; // add lf and flush +* \endcode */ class JSON_API StreamWriterBuilder : public StreamWriter::Factory { public: // Note: We use a Json::Value so that we can add data-members to this class // without a major version bump. /** Configuration of this builder. - Available settings (case-sensitive): - - "commentStyle": "None" or "All" - - "indentation": "" - - "enableYAMLCompatibility": false or true - - slightly change the whitespace around colons - - "dropNullPlaceholders": false or true - - Drop the "null" string from the writer's output for nullValues. - Strictly speaking, this is not valid JSON. But when the output is being - fed to a browser's JavaScript, it makes for smaller output and the - browser can handle the output just fine. - - "useSpecialFloats": false or true - - If true, outputs non-finite floating point values in the following way: - NaN values as "NaN", positive infinity as "Infinity", and negative infinity - as "-Infinity". + * Available settings (case-sensitive): + * - "commentStyle": "None" or "All" + * - "indentation": "". + * - Setting this to an empty string also omits newline characters. + * - "enableYAMLCompatibility": false or true + * - slightly change the whitespace around colons + * - "dropNullPlaceholders": false or true + * - Drop the "null" string from the writer's output for nullValues. + * Strictly speaking, this is not valid JSON. But when the output is being + * fed to a browser's JavaScript, it makes for smaller output and the + * browser can handle the output just fine. + * - "useSpecialFloats": false or true + * - If true, outputs non-finite floating point values in the following way: + * NaN values as "NaN", positive infinity as "Infinity", and negative + * infinity as "-Infinity". + * - "precision": int + * - Number of precision digits for formatting of real values. + * - "precisionType": "significant"(default) or "decimal" + * - Type of precision for formatting of real values. - You can examine 'settings_` yourself - to see the defaults. You can also write and read them just like any - JSON Value. - \sa setDefaults() - */ + * You can examine 'settings_` yourself + * to see the defaults. You can also write and read them just like any + * JSON Value. + * \sa setDefaults() + */ Json::Value settings_; StreamWriterBuilder(); - ~StreamWriterBuilder() JSONCPP_OVERRIDE; + ~StreamWriterBuilder() override; /** * \throw std::exception if something goes wrong (e.g. invalid settings) */ - StreamWriter* newStreamWriter() const JSONCPP_OVERRIDE; + StreamWriter* newStreamWriter() const override; /** \return true if 'settings' are legal and consistent; * otherwise, indicate bad settings via 'invalid'. @@ -1899,7 +2023,7 @@ public: bool validate(Json::Value* invalid) const; /** A simple way to update a specific setting. */ - Value& operator[](JSONCPP_STRING key); + Value& operator[](const String& key); /** Called by ctor, but you can use this to reset settings_. * \pre 'settings' != NULL (but Json::null is fine) @@ -1916,7 +2040,7 @@ class JSONCPP_DEPRECATED("Use StreamWriter instead") JSON_API Writer { public: virtual ~Writer(); - virtual JSONCPP_STRING write(const Value& root) = 0; + virtual String write(const Value& root) = 0; }; /** \brief Outputs a Value in JSON format @@ -1924,18 +2048,19 @@ public: * * The JSON document is written in a single line. It is not intended for 'human' *consumption, - * but may be usefull to support feature such as RPC where bandwith is limited. + * but may be useful to support feature such as RPC where bandwidth is limited. * \sa Reader, Value * \deprecated Use StreamWriterBuilder. */ #if defined(_MSC_VER) #pragma warning(push) -#pragma warning(disable:4996) // Deriving from deprecated class +#pragma warning(disable : 4996) // Deriving from deprecated class #endif -class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API FastWriter : public Writer { +class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API FastWriter + : public Writer { public: FastWriter(); - ~FastWriter() JSONCPP_OVERRIDE {} + ~FastWriter() override = default; void enableYAMLCompatibility(); @@ -1949,15 +2074,15 @@ public: void omitEndingLineFeed(); public: // overridden from Writer - JSONCPP_STRING write(const Value& root) JSONCPP_OVERRIDE; + String write(const Value& root) override; private: void writeValue(const Value& value); - JSONCPP_STRING document_; - bool yamlCompatibilityEnabled_; - bool dropNullPlaceholders_; - bool omitEndingLineFeed_; + String document_; + bool yamlCompatibilityEnabled_{false}; + bool dropNullPlaceholders_{false}; + bool omitEndingLineFeed_{false}; }; #if defined(_MSC_VER) #pragma warning(pop) @@ -1989,42 +2114,43 @@ private: */ #if defined(_MSC_VER) #pragma warning(push) -#pragma warning(disable:4996) // Deriving from deprecated class +#pragma warning(disable : 4996) // Deriving from deprecated class #endif -class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API StyledWriter : public Writer { +class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API + StyledWriter : public Writer { public: StyledWriter(); - ~StyledWriter() JSONCPP_OVERRIDE {} + ~StyledWriter() override = default; public: // overridden from Writer /** \brief Serialize a Value in JSON format. * \param root Value to serialize. * \return String containing the JSON document that represents the root value. */ - JSONCPP_STRING write(const Value& root) JSONCPP_OVERRIDE; + String write(const Value& root) override; private: void writeValue(const Value& value); void writeArrayValue(const Value& value); bool isMultilineArray(const Value& value); - void pushValue(const JSONCPP_STRING& value); + void pushValue(const String& value); void writeIndent(); - void writeWithIndent(const JSONCPP_STRING& value); + void writeWithIndent(const String& value); void indent(); void unindent(); void writeCommentBeforeValue(const Value& root); void writeCommentAfterValueOnSameLine(const Value& root); - bool hasCommentForValue(const Value& value); - static JSONCPP_STRING normalizeEOL(const JSONCPP_STRING& text); + static bool hasCommentForValue(const Value& value); + static String normalizeEOL(const String& text); - typedef std::vector ChildValues; + using ChildValues = std::vector; ChildValues childValues_; - JSONCPP_STRING document_; - JSONCPP_STRING indentString_; - unsigned int rightMargin_; - unsigned int indentSize_; - bool addChildValues_; + String document_; + String indentString_; + unsigned int rightMargin_{74}; + unsigned int indentSize_{3}; + bool addChildValues_{false}; }; #if defined(_MSC_VER) #pragma warning(pop) @@ -2057,15 +2183,16 @@ private: */ #if defined(_MSC_VER) #pragma warning(push) -#pragma warning(disable:4996) // Deriving from deprecated class +#pragma warning(disable : 4996) // Deriving from deprecated class #endif -class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API StyledStreamWriter { +class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API + StyledStreamWriter { public: -/** - * \param indentation Each level will be indented by this amount extra. - */ - StyledStreamWriter(JSONCPP_STRING indentation = "\t"); - ~StyledStreamWriter() {} + /** + * \param indentation Each level will be indented by this amount extra. + */ + StyledStreamWriter(String indentation = "\t"); + ~StyledStreamWriter() = default; public: /** \brief Serialize a Value in JSON format. @@ -2074,29 +2201,29 @@ public: * \note There is no point in deriving from Writer, since write() should not * return a value. */ - void write(JSONCPP_OSTREAM& out, const Value& root); + void write(OStream& out, const Value& root); private: void writeValue(const Value& value); void writeArrayValue(const Value& value); bool isMultilineArray(const Value& value); - void pushValue(const JSONCPP_STRING& value); + void pushValue(const String& value); void writeIndent(); - void writeWithIndent(const JSONCPP_STRING& value); + void writeWithIndent(const String& value); void indent(); void unindent(); void writeCommentBeforeValue(const Value& root); void writeCommentAfterValueOnSameLine(const Value& root); - bool hasCommentForValue(const Value& value); - static JSONCPP_STRING normalizeEOL(const JSONCPP_STRING& text); + static bool hasCommentForValue(const Value& value); + static String normalizeEOL(const String& text); - typedef std::vector ChildValues; + using ChildValues = std::vector; ChildValues childValues_; - JSONCPP_OSTREAM* document_; - JSONCPP_STRING indentString_; - unsigned int rightMargin_; - JSONCPP_STRING indentation_; + OStream* document_; + String indentString_; + unsigned int rightMargin_{74}; + String indentation_; bool addChildValues_ : 1; bool indented_ : 1; }; @@ -2105,18 +2232,20 @@ private: #endif #if defined(JSON_HAS_INT64) -JSONCPP_STRING JSON_API valueToString(Int value); -JSONCPP_STRING JSON_API valueToString(UInt value); +String JSON_API valueToString(Int value); +String JSON_API valueToString(UInt value); #endif // if defined(JSON_HAS_INT64) -JSONCPP_STRING JSON_API valueToString(LargestInt value); -JSONCPP_STRING JSON_API valueToString(LargestUInt value); -JSONCPP_STRING JSON_API valueToString(double value); -JSONCPP_STRING JSON_API valueToString(bool value); -JSONCPP_STRING JSON_API valueToQuotedString(const char* value); +String JSON_API valueToString(LargestInt value); +String JSON_API valueToString(LargestUInt value); +String JSON_API valueToString( + double value, unsigned int precision = Value::defaultRealPrecision, + PrecisionType precisionType = PrecisionType::significantDigits); +String JSON_API valueToString(bool value); +String JSON_API valueToQuotedString(const char* value); /// \brief Output using the StyledStreamWriter. /// \see Json::operator>>() -JSON_API JSONCPP_OSTREAM& operator<<(JSONCPP_OSTREAM&, const Value& root); +JSON_API OStream& operator<<(OStream&, const Value& root); } // namespace Json @@ -2146,10 +2275,10 @@ JSON_API JSONCPP_OSTREAM& operator<<(JSONCPP_OSTREAM&, const Value& root); // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE -#ifndef CPPTL_JSON_ASSERTIONS_H_INCLUDED -#define CPPTL_JSON_ASSERTIONS_H_INCLUDED +#ifndef JSON_ASSERTIONS_H_INCLUDED +#define JSON_ASSERTIONS_H_INCLUDED -#include +#include #include #if !defined(JSON_IS_AMALGAMATION) @@ -2163,38 +2292,45 @@ JSON_API JSONCPP_OSTREAM& operator<<(JSONCPP_OSTREAM&, const Value& root); #if JSON_USE_EXCEPTION // @todo <= add detail about condition in exception -# define JSON_ASSERT(condition) \ - {if (!(condition)) {Json::throwLogicError( "assert json failed" );}} +#define JSON_ASSERT(condition) \ + do { \ + if (!(condition)) { \ + Json::throwLogicError("assert json failed"); \ + } \ + } while (0) -# define JSON_FAIL_MESSAGE(message) \ - { \ - JSONCPP_OSTRINGSTREAM oss; oss << message; \ +#define JSON_FAIL_MESSAGE(message) \ + do { \ + OStringStream oss; \ + oss << message; \ Json::throwLogicError(oss.str()); \ abort(); \ - } + } while (0) #else // JSON_USE_EXCEPTION -# define JSON_ASSERT(condition) assert(condition) +#define JSON_ASSERT(condition) assert(condition) // The call to assert() will show the failure message in debug builds. In // release builds we abort, for a core-dump or debugger. -# define JSON_FAIL_MESSAGE(message) \ +#define JSON_FAIL_MESSAGE(message) \ { \ - JSONCPP_OSTRINGSTREAM oss; oss << message; \ + OStringStream oss; \ + oss << message; \ assert(false && oss.str().c_str()); \ abort(); \ } - #endif #define JSON_ASSERT_MESSAGE(condition, message) \ - if (!(condition)) { \ - JSON_FAIL_MESSAGE(message); \ - } + do { \ + if (!(condition)) { \ + JSON_FAIL_MESSAGE(message); \ + } \ + } while (0) -#endif // CPPTL_JSON_ASSERTIONS_H_INCLUDED +#endif // JSON_ASSERTIONS_H_INCLUDED // ////////////////////////////////////////////////////////////////////// // End of content of file: include/json/assertions.h diff --git a/lib/jsoncpp/jsoncpp.cpp b/lib/jsoncpp/jsoncpp.cpp index 507a1c6ad..30e0a69f7 100644 --- a/lib/jsoncpp/jsoncpp.cpp +++ b/lib/jsoncpp/jsoncpp.cpp @@ -92,6 +92,9 @@ license you like. #ifndef LIB_JSONCPP_JSON_TOOL_H_INCLUDED #define LIB_JSONCPP_JSON_TOOL_H_INCLUDED +#if !defined(JSON_IS_AMALGAMATION) +#include +#endif // Also support old flag NO_LOCALE_SUPPORT #ifdef NO_LOCALE_SUPPORT @@ -109,7 +112,7 @@ license you like. */ namespace Json { -static char getDecimalPoint() { +static inline char getDecimalPoint() { #ifdef JSONCPP_NO_LOCALE_SUPPORT return '\0'; #else @@ -119,8 +122,8 @@ static char getDecimalPoint() { } /// Converts a unicode code-point to UTF-8. -static inline JSONCPP_STRING codePointToUTF8(unsigned int cp) { - JSONCPP_STRING result; +static inline String codePointToUTF8(unsigned int cp) { + String result; // based on description from http://en.wikipedia.org/wiki/UTF-8 @@ -154,7 +157,7 @@ enum { }; // Defines a char buffer for use with uintToString(). -typedef char UIntToStringBuffer[uintToStringBufferSize]; +using UIntToStringBuffer = char[uintToStringBufferSize]; /** Converts an unsigned integer to string. * @param value Unsigned integer to convert to string @@ -174,28 +177,45 @@ static inline void uintToString(LargestUInt value, char*& current) { * We had a sophisticated way, but it did not work in WinCE. * @see https://github.com/open-source-parsers/jsoncpp/pull/9 */ -static inline void fixNumericLocale(char* begin, char* end) { - while (begin < end) { +template Iter fixNumericLocale(Iter begin, Iter end) { + for (; begin != end; ++begin) { if (*begin == ',') { *begin = '.'; } - ++begin; } + return begin; } -static inline void fixNumericLocaleInput(char* begin, char* end) { +template void fixNumericLocaleInput(Iter begin, Iter end) { char decimalPoint = getDecimalPoint(); - if (decimalPoint != '\0' && decimalPoint != '.') { - while (begin < end) { - if (*begin == '.') { - *begin = decimalPoint; - } - ++begin; + if (decimalPoint == '\0' || decimalPoint == '.') { + return; + } + for (; begin != end; ++begin) { + if (*begin == '.') { + *begin = decimalPoint; } } } -} // namespace Json { +/** + * Return iterator that would be the new end of the range [begin,end), if we + * were to delete zeros in the end of string, but not the last zero before '.'. + */ +template Iter fixZerosInTheEnd(Iter begin, Iter end) { + for (; begin != end; --end) { + if (*(end - 1) != '0') { + return end; + } + // Don't delete the last zero before the decimal point. + if (begin != (end - 1) && *(end - 2) == '.') { + return end; + } + } + return end; +} + +} // namespace Json #endif // LIB_JSONCPP_JSON_TOOL_H_INCLUDED @@ -219,69 +239,65 @@ static inline void fixNumericLocaleInput(char* begin, char* end) { // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE #if !defined(JSON_IS_AMALGAMATION) +#include "json_tool.h" #include #include #include -#include "json_tool.h" #endif // if !defined(JSON_IS_AMALGAMATION) -#include -#include +#include #include #include +#include #include -#include +#include #include #include -#include +#include +#include -#if defined(_MSC_VER) -#if !defined(WINCE) && defined(__STDC_SECURE_LIB__) && _MSC_VER >= 1500 // VC++ 9.0 and above -#define snprintf sprintf_s -#elif _MSC_VER >= 1900 // VC++ 14.0 and above -#define snprintf std::snprintf -#else -#define snprintf _snprintf -#endif -#elif defined(__ANDROID__) || defined(__QNXNTO__) -#define snprintf snprintf -#elif __cplusplus >= 201103L -#if !defined(__MINGW32__) && !defined(__CYGWIN__) -#define snprintf std::snprintf -#endif -#endif +#include +#if __cplusplus >= 201103L -#if defined(__QNXNTO__) +#if !defined(sscanf) #define sscanf std::sscanf #endif -#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0 +#endif //__cplusplus + +#if defined(_MSC_VER) +#if !defined(_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES) +#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 +#endif //_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES +#endif //_MSC_VER + +#if defined(_MSC_VER) // Disable warning about strdup being deprecated. #pragma warning(disable : 4996) #endif -// Define JSONCPP_DEPRECATED_STACK_LIMIT as an appropriate integer at compile time to change the stack limit +// Define JSONCPP_DEPRECATED_STACK_LIMIT as an appropriate integer at compile +// time to change the stack limit #if !defined(JSONCPP_DEPRECATED_STACK_LIMIT) #define JSONCPP_DEPRECATED_STACK_LIMIT 1000 #endif -static size_t const stackLimit_g = JSONCPP_DEPRECATED_STACK_LIMIT; // see readValue() +static size_t const stackLimit_g = + JSONCPP_DEPRECATED_STACK_LIMIT; // see readValue() namespace Json { #if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520) -typedef std::unique_ptr CharReaderPtr; +using CharReaderPtr = std::unique_ptr; #else -typedef std::auto_ptr CharReaderPtr; +using CharReaderPtr = std::auto_ptr; #endif // Implementation of class Features // //////////////////////////////// -Features::Features() - : allowComments_(true), strictRoot_(false), - allowDroppedNullPlaceholders_(false), allowNumericKeys_(false) {} +Features::Features() = default; -Features Features::all() { return Features(); } +Features Features::all() { return {}; } Features Features::strictMode() { Features features; @@ -296,49 +312,38 @@ Features Features::strictMode() { // //////////////////////////////// bool Reader::containsNewLine(Reader::Location begin, Reader::Location end) { - for (; begin < end; ++begin) - if (*begin == '\n' || *begin == '\r') - return true; - return false; + return std::any_of(begin, end, [](char b) { return b == '\n' || b == '\r'; }); } // Class Reader // ////////////////////////////////////////////////////////////////// -Reader::Reader() - : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), - lastValue_(), commentsBefore_(), features_(Features::all()), - collectComments_() {} +Reader::Reader() : features_(Features::all()) {} -Reader::Reader(const Features& features) - : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), - lastValue_(), commentsBefore_(), features_(features), collectComments_() { -} +Reader::Reader(const Features& features) : features_(features) {} -bool -Reader::parse(const std::string& document, Value& root, bool collectComments) { +bool Reader::parse(const std::string& document, Value& root, + bool collectComments) { document_.assign(document.begin(), document.end()); const char* begin = document_.c_str(); const char* end = begin + document_.length(); return parse(begin, end, root, collectComments); } -bool Reader::parse(std::istream& sin, Value& root, bool collectComments) { - // std::istream_iterator begin(sin); +bool Reader::parse(std::istream& is, Value& root, bool collectComments) { + // std::istream_iterator begin(is); // std::istream_iterator end; // Those would allow streamed input from a file, if parse() were a // template function. - // Since JSONCPP_STRING is reference-counted, this at least does not + // Since String is reference-counted, this at least does not // create an extra copy. - JSONCPP_STRING doc; - std::getline(sin, doc, (char)EOF); + String doc; + std::getline(is, doc, static_cast EOF); return parse(doc.data(), doc.data() + doc.size(), root, collectComments); } -bool Reader::parse(const char* beginDoc, - const char* endDoc, - Value& root, +bool Reader::parse(const char* beginDoc, const char* endDoc, Value& root, bool collectComments) { if (!features_.allowComments_) { collectComments = false; @@ -348,8 +353,8 @@ bool Reader::parse(const char* beginDoc, end_ = endDoc; collectComments_ = collectComments; current_ = begin_; - lastValueEnd_ = 0; - lastValue_ = 0; + lastValueEnd_ = nullptr; + lastValue_ = nullptr; commentsBefore_.clear(); errors_.clear(); while (!nodes_.empty()) @@ -379,9 +384,11 @@ bool Reader::parse(const char* beginDoc, bool Reader::readValue() { // readValue() may call itself only if it calls readObject() or ReadArray(). - // These methods execute nodes_.push() just before and nodes_.pop)() just after calling readValue(). - // parse() executes one nodes_.push(), so > instead of >=. - if (nodes_.size() > stackLimit_g) throwRuntimeError("Exceeded stackLimit in readValue()."); + // These methods execute nodes_.push() just before and nodes_.pop)() just + // after calling readValue(). parse() executes one nodes_.push(), so > instead + // of >=. + if (nodes_.size() > stackLimit_g) + throwRuntimeError("Exceeded stackLimit in readValue()."); Token token; skipCommentTokens(token); @@ -407,30 +414,24 @@ bool Reader::readValue() { case tokenString: successful = decodeString(token); break; - case tokenTrue: - { + case tokenTrue: { Value v(true); currentValue().swapPayload(v); currentValue().setOffsetStart(token.start_ - begin_); currentValue().setOffsetLimit(token.end_ - begin_); - } - break; - case tokenFalse: - { + } break; + case tokenFalse: { Value v(false); currentValue().swapPayload(v); currentValue().setOffsetStart(token.start_ - begin_); currentValue().setOffsetLimit(token.end_ - begin_); - } - break; - case tokenNull: - { + } break; + case tokenNull: { Value v; currentValue().swapPayload(v); currentValue().setOffsetStart(token.start_ - begin_); currentValue().setOffsetLimit(token.end_ - begin_); - } - break; + } break; case tokenArraySeparator: case tokenObjectEnd: case tokenArrayEnd: @@ -536,7 +537,7 @@ bool Reader::readToken(Token& token) { if (!ok) token.type_ = tokenError; token.end_ = current_; - return true; + return ok; } void Reader::skipSpaces() { @@ -549,7 +550,7 @@ void Reader::skipSpaces() { } } -bool Reader::match(Location pattern, int patternLength) { +bool Reader::match(const Char* pattern, int patternLength) { if (end_ - current_ < patternLength) return false; int index = patternLength; @@ -583,16 +584,16 @@ bool Reader::readComment() { return true; } -JSONCPP_STRING Reader::normalizeEOL(Reader::Location begin, Reader::Location end) { - JSONCPP_STRING normalized; +String Reader::normalizeEOL(Reader::Location begin, Reader::Location end) { + String normalized; normalized.reserve(static_cast(end - begin)); Reader::Location current = begin; while (current != end) { char c = *current++; if (c == '\r') { if (current != end && *current == '\n') - // convert dos EOL - ++current; + // convert dos EOL + ++current; // convert Mac EOL normalized += '\n'; } else { @@ -602,12 +603,12 @@ JSONCPP_STRING Reader::normalizeEOL(Reader::Location begin, Reader::Location end return normalized; } -void -Reader::addComment(Location begin, Location end, CommentPlacement placement) { +void Reader::addComment(Location begin, Location end, + CommentPlacement placement) { assert(collectComments_); - const JSONCPP_STRING& normalized = normalizeEOL(begin, end); + const String& normalized = normalizeEOL(begin, end); if (placement == commentAfterOnSameLine) { - assert(lastValue_ != 0); + assert(lastValue_ != nullptr); lastValue_->setComment(normalized, placement); } else { commentsBefore_ += normalized; @@ -640,7 +641,7 @@ bool Reader::readCppStyleComment() { } void Reader::readNumber() { - const char *p = current_; + Location p = current_; char c = '0'; // stopgap for already consumed character // integral part while (c >= '0' && c <= '9') @@ -673,12 +674,12 @@ bool Reader::readString() { return c == '"'; } -bool Reader::readObject(Token& tokenStart) { +bool Reader::readObject(Token& token) { Token tokenName; - JSONCPP_STRING name; + String name; Value init(objectValue); currentValue().swapPayload(init); - currentValue().setOffsetStart(tokenStart.start_ - begin_); + currentValue().setOffsetStart(token.start_ - begin_); while (readToken(tokenName)) { bool initialTokenOk = true; while (tokenName.type_ == tokenComment && initialTokenOk) @@ -695,15 +696,15 @@ bool Reader::readObject(Token& tokenStart) { Value numberName; if (!decodeNumber(tokenName, numberName)) return recoverFromError(tokenObjectEnd); - name = JSONCPP_STRING(numberName.asCString()); + name = numberName.asString(); } else { break; } Token colon; if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { - return addErrorAndRecover( - "Missing ':' after object member name", colon, tokenObjectEnd); + return addErrorAndRecover("Missing ':' after object member name", colon, + tokenObjectEnd); } Value& value = currentValue()[name]; nodes_.push(&value); @@ -716,8 +717,8 @@ bool Reader::readObject(Token& tokenStart) { if (!readToken(comma) || (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && comma.type_ != tokenComment)) { - return addErrorAndRecover( - "Missing ',' or '}' in object declaration", comma, tokenObjectEnd); + return addErrorAndRecover("Missing ',' or '}' in object declaration", + comma, tokenObjectEnd); } bool finalizeTokenOk = true; while (comma.type_ == tokenComment && finalizeTokenOk) @@ -725,14 +726,14 @@ bool Reader::readObject(Token& tokenStart) { if (comma.type_ == tokenObjectEnd) return true; } - return addErrorAndRecover( - "Missing '}' or object member name", tokenName, tokenObjectEnd); + return addErrorAndRecover("Missing '}' or object member name", tokenName, + tokenObjectEnd); } -bool Reader::readArray(Token& tokenStart) { +bool Reader::readArray(Token& token) { Value init(arrayValue); currentValue().swapPayload(init); - currentValue().setOffsetStart(tokenStart.start_ - begin_); + currentValue().setOffsetStart(token.start_ - begin_); skipSpaces(); if (current_ != end_ && *current_ == ']') // empty array { @@ -749,19 +750,19 @@ bool Reader::readArray(Token& tokenStart) { if (!ok) // error already set return recoverFromError(tokenArrayEnd); - Token token; + Token currentToken; // Accept Comment after last item in the array. - ok = readToken(token); - while (token.type_ == tokenComment && ok) { - ok = readToken(token); + ok = readToken(currentToken); + while (currentToken.type_ == tokenComment && ok) { + ok = readToken(currentToken); } - bool badTokenType = - (token.type_ != tokenArraySeparator && token.type_ != tokenArrayEnd); + bool badTokenType = (currentToken.type_ != tokenArraySeparator && + currentToken.type_ != tokenArrayEnd); if (!ok || badTokenType) { - return addErrorAndRecover( - "Missing ',' or ']' in array declaration", token, tokenArrayEnd); + return addErrorAndRecover("Missing ',' or ']' in array declaration", + currentToken, tokenArrayEnd); } - if (token.type_ == tokenArrayEnd) + if (currentToken.type_ == tokenArrayEnd) break; } return true; @@ -785,7 +786,8 @@ bool Reader::decodeNumber(Token& token, Value& decoded) { bool isNegative = *current == '-'; if (isNegative) ++current; - // TODO: Help the compiler do the div and mod at compile time or get rid of them. + // TODO: Help the compiler do the div and mod at compile time or get rid of + // them. Value::LargestUInt maxIntegerValue = isNegative ? Value::LargestUInt(Value::maxLargestInt) + 1 : Value::maxLargestUInt; @@ -795,7 +797,7 @@ bool Reader::decodeNumber(Token& token, Value& decoded) { Char c = *current++; if (c < '0' || c > '9') return decodeDouble(token, decoded); - Value::UInt digit(static_cast(c - '0')); + auto digit(static_cast(c - '0')); if (value >= threshold) { // We've hit or exceeded the max value divided by 10 (rounded down). If // a) we've only just touched the limit, b) this is the last digit, and @@ -831,18 +833,17 @@ bool Reader::decodeDouble(Token& token) { bool Reader::decodeDouble(Token& token, Value& decoded) { double value = 0; - JSONCPP_STRING buffer(token.start_, token.end_); - JSONCPP_ISTRINGSTREAM is(buffer); + String buffer(token.start_, token.end_); + IStringStream is(buffer); if (!(is >> value)) - return addError("'" + JSONCPP_STRING(token.start_, token.end_) + - "' is not a number.", - token); + return addError( + "'" + String(token.start_, token.end_) + "' is not a number.", token); decoded = value; return true; } bool Reader::decodeString(Token& token) { - JSONCPP_STRING decoded_string; + String decoded_string; if (!decodeString(token, decoded_string)) return false; Value decoded(decoded_string); @@ -852,7 +853,7 @@ bool Reader::decodeString(Token& token) { return true; } -bool Reader::decodeString(Token& token, JSONCPP_STRING& decoded) { +bool Reader::decodeString(Token& token, String& decoded) { decoded.reserve(static_cast(token.end_ - token.start_ - 2)); Location current = token.start_ + 1; // skip '"' Location end = token.end_ - 1; // do not include '"' @@ -860,7 +861,7 @@ bool Reader::decodeString(Token& token, JSONCPP_STRING& decoded) { Char c = *current++; if (c == '"') break; - else if (c == '\\') { + if (c == '\\') { if (current == end) return addError("Empty escape sequence in string", token, current); Char escape = *current++; @@ -905,10 +906,8 @@ bool Reader::decodeString(Token& token, JSONCPP_STRING& decoded) { return true; } -bool Reader::decodeUnicodeCodePoint(Token& token, - Location& current, - Location end, - unsigned int& unicode) { +bool Reader::decodeUnicodeCodePoint(Token& token, Location& current, + Location end, unsigned int& unicode) { if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) return false; @@ -917,10 +916,9 @@ bool Reader::decodeUnicodeCodePoint(Token& token, if (end - current < 6) return addError( "additional six characters expected to parse unicode surrogate pair.", - token, - current); - unsigned int surrogatePair; + token, current); if (*(current++) == '\\' && *(current++) == 'u') { + unsigned int surrogatePair; if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); } else @@ -928,20 +926,17 @@ bool Reader::decodeUnicodeCodePoint(Token& token, } else return addError("expecting another \\u token to begin the second half of " "a unicode surrogate pair", - token, - current); + token, current); } return true; } -bool Reader::decodeUnicodeEscapeSequence(Token& token, - Location& current, +bool Reader::decodeUnicodeEscapeSequence(Token& token, Location& current, Location end, unsigned int& ret_unicode) { if (end - current < 4) return addError( - "Bad unicode escape sequence in string: four digits expected.", - token, + "Bad unicode escape sequence in string: four digits expected.", token, current); int unicode = 0; for (int index = 0; index < 4; ++index) { @@ -956,15 +951,13 @@ bool Reader::decodeUnicodeEscapeSequence(Token& token, else return addError( "Bad unicode escape sequence in string: hexadecimal digit expected.", - token, - current); + token, current); } ret_unicode = static_cast(unicode); return true; } -bool -Reader::addError(const JSONCPP_STRING& message, Token& token, Location extra) { +bool Reader::addError(const String& message, Token& token, Location extra) { ErrorInfo info; info.token_ = token; info.message_ = message; @@ -986,8 +979,7 @@ bool Reader::recoverFromError(TokenType skipUntilToken) { return false; } -bool Reader::addErrorAndRecover(const JSONCPP_STRING& message, - Token& token, +bool Reader::addErrorAndRecover(const String& message, Token& token, TokenType skipUntilToken) { addError(message, token); return recoverFromError(skipUntilToken); @@ -1001,8 +993,7 @@ Reader::Char Reader::getNextChar() { return *current_++; } -void Reader::getLocationLineAndColumn(Location location, - int& line, +void Reader::getLocationLineAndColumn(Location location, int& line, int& column) const { Location current = begin_; Location lastLineStart = current; @@ -1024,25 +1015,22 @@ void Reader::getLocationLineAndColumn(Location location, ++line; } -JSONCPP_STRING Reader::getLocationLineAndColumn(Location location) const { +String Reader::getLocationLineAndColumn(Location location) const { int line, column; getLocationLineAndColumn(location, line, column); char buffer[18 + 16 + 16 + 1]; - snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); + jsoncpp_snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); return buffer; } // Deprecated. Preserved for backward compatibility -JSONCPP_STRING Reader::getFormatedErrorMessages() const { +String Reader::getFormatedErrorMessages() const { return getFormattedErrorMessages(); } -JSONCPP_STRING Reader::getFormattedErrorMessages() const { - JSONCPP_STRING formattedMessage; - for (Errors::const_iterator itError = errors_.begin(); - itError != errors_.end(); - ++itError) { - const ErrorInfo& error = *itError; +String Reader::getFormattedErrorMessages() const { + String formattedMessage; + for (const auto& error : errors_) { formattedMessage += "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; formattedMessage += " " + error.message_ + "\n"; @@ -1055,10 +1043,7 @@ JSONCPP_STRING Reader::getFormattedErrorMessages() const { std::vector Reader::getStructuredErrors() const { std::vector allErrors; - for (Errors::const_iterator itError = errors_.begin(); - itError != errors_.end(); - ++itError) { - const ErrorInfo& error = *itError; + for (const auto& error : errors_) { Reader::StructuredError structured; structured.offset_start = error.token_.start_ - begin_; structured.offset_limit = error.token_.end_ - begin_; @@ -1068,28 +1053,27 @@ std::vector Reader::getStructuredErrors() const { return allErrors; } -bool Reader::pushError(const Value& value, const JSONCPP_STRING& message) { +bool Reader::pushError(const Value& value, const String& message) { ptrdiff_t const length = end_ - begin_; - if(value.getOffsetStart() > length - || value.getOffsetLimit() > length) + if (value.getOffsetStart() > length || value.getOffsetLimit() > length) return false; Token token; token.type_ = tokenError; token.start_ = begin_ + value.getOffsetStart(); - token.end_ = end_ + value.getOffsetLimit(); + token.end_ = begin_ + value.getOffsetLimit(); ErrorInfo info; info.token_ = token; info.message_ = message; - info.extra_ = 0; + info.extra_ = nullptr; errors_.push_back(info); return true; } -bool Reader::pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra) { +bool Reader::pushError(const Value& value, const String& message, + const Value& extra) { ptrdiff_t const length = end_ - begin_; - if(value.getOffsetStart() > length - || value.getOffsetLimit() > length - || extra.getOffsetLimit() > length) + if (value.getOffsetStart() > length || value.getOffsetLimit() > length || + extra.getOffsetLimit() > length) return false; Token token; token.type_ = tokenError; @@ -1103,15 +1087,15 @@ bool Reader::pushError(const Value& value, const JSONCPP_STRING& message, const return true; } -bool Reader::good() const { - return !errors_.size(); -} +bool Reader::good() const { return errors_.empty(); } -// exact copy of Features +// Originally copied from the Features class (now deprecated), used internally +// for features implementation. class OurFeatures { public: static OurFeatures all(); bool allowComments_; + bool allowTrailingCommas_; bool strictRoot_; bool allowDroppedNullPlaceholders_; bool allowNumericKeys_; @@ -1119,42 +1103,36 @@ public: bool failIfExtra_; bool rejectDupKeys_; bool allowSpecialFloats_; - int stackLimit_; -}; // OurFeatures + bool skipBom_; + size_t stackLimit_; +}; // OurFeatures -// exact copy of Implementation of class Features -// //////////////////////////////// - -OurFeatures OurFeatures::all() { return OurFeatures(); } +OurFeatures OurFeatures::all() { return {}; } // Implementation of class Reader // //////////////////////////////// -// exact copy of Reader, renamed to OurReader +// Originally copied from the Reader class (now deprecated), used internally +// for implementing JSON reading. class OurReader { public: - typedef char Char; - typedef const Char* Location; + using Char = char; + using Location = const Char*; struct StructuredError { ptrdiff_t offset_start; ptrdiff_t offset_limit; - JSONCPP_STRING message; + String message; }; - OurReader(OurFeatures const& features); - bool parse(const char* beginDoc, - const char* endDoc, - Value& root, + explicit OurReader(OurFeatures const& features); + bool parse(const char* beginDoc, const char* endDoc, Value& root, bool collectComments = true); - JSONCPP_STRING getFormattedErrorMessages() const; + String getFormattedErrorMessages() const; std::vector getStructuredErrors() const; - bool pushError(const Value& value, const JSONCPP_STRING& message); - bool pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra); - bool good() const; private: - OurReader(OurReader const&); // no impl - void operator=(OurReader const&); // no impl + OurReader(OurReader const&); // no impl + void operator=(OurReader const&); // no impl enum TokenType { tokenEndOfStream = 0, @@ -1186,17 +1164,18 @@ private: class ErrorInfo { public: Token token_; - JSONCPP_STRING message_; + String message_; Location extra_; }; - typedef std::deque Errors; + using Errors = std::deque; bool readToken(Token& token); void skipSpaces(); - bool match(Location pattern, int patternLength); + void skipBom(bool skipBom); + bool match(const Char* pattern, int patternLength); bool readComment(); - bool readCStyleComment(); + bool readCStyleComment(bool* containsNewLineResult); bool readCppStyleComment(); bool readString(); bool readStringSingleQuote(); @@ -1207,68 +1186,57 @@ private: bool decodeNumber(Token& token); bool decodeNumber(Token& token, Value& decoded); bool decodeString(Token& token); - bool decodeString(Token& token, JSONCPP_STRING& decoded); + bool decodeString(Token& token, String& decoded); bool decodeDouble(Token& token); bool decodeDouble(Token& token, Value& decoded); - bool decodeUnicodeCodePoint(Token& token, - Location& current, - Location end, + bool decodeUnicodeCodePoint(Token& token, Location& current, Location end, unsigned int& unicode); - bool decodeUnicodeEscapeSequence(Token& token, - Location& current, - Location end, - unsigned int& unicode); - bool addError(const JSONCPP_STRING& message, Token& token, Location extra = 0); + bool decodeUnicodeEscapeSequence(Token& token, Location& current, + Location end, unsigned int& unicode); + bool addError(const String& message, Token& token, Location extra = nullptr); bool recoverFromError(TokenType skipUntilToken); - bool addErrorAndRecover(const JSONCPP_STRING& message, - Token& token, + bool addErrorAndRecover(const String& message, Token& token, TokenType skipUntilToken); void skipUntilSpace(); Value& currentValue(); Char getNextChar(); - void - getLocationLineAndColumn(Location location, int& line, int& column) const; - JSONCPP_STRING getLocationLineAndColumn(Location location) const; + void getLocationLineAndColumn(Location location, int& line, + int& column) const; + String getLocationLineAndColumn(Location location) const; void addComment(Location begin, Location end, CommentPlacement placement); void skipCommentTokens(Token& token); - static JSONCPP_STRING normalizeEOL(Location begin, Location end); + static String normalizeEOL(Location begin, Location end); static bool containsNewLine(Location begin, Location end); - typedef std::stack Nodes; - Nodes nodes_; - Errors errors_; - JSONCPP_STRING document_; - Location begin_; - Location end_; - Location current_; - Location lastValueEnd_; - Value* lastValue_; - JSONCPP_STRING commentsBefore_; + using Nodes = std::stack; + + Nodes nodes_{}; + Errors errors_{}; + String document_{}; + Location begin_ = nullptr; + Location end_ = nullptr; + Location current_ = nullptr; + Location lastValueEnd_ = nullptr; + Value* lastValue_ = nullptr; + bool lastValueHasAComment_ = false; + String commentsBefore_{}; OurFeatures const features_; - bool collectComments_; -}; // OurReader + bool collectComments_ = false; +}; // OurReader // complete copy of Read impl, for OurReader -bool OurReader::containsNewLine(OurReader::Location begin, OurReader::Location end) { - for (; begin < end; ++begin) - if (*begin == '\n' || *begin == '\r') - return true; - return false; +bool OurReader::containsNewLine(OurReader::Location begin, + OurReader::Location end) { + return std::any_of(begin, end, [](char b) { return b == '\n' || b == '\r'; }); } -OurReader::OurReader(OurFeatures const& features) - : errors_(), document_(), begin_(), end_(), current_(), lastValueEnd_(), - lastValue_(), commentsBefore_(), - features_(features), collectComments_() { -} +OurReader::OurReader(OurFeatures const& features) : features_(features) {} -bool OurReader::parse(const char* beginDoc, - const char* endDoc, - Value& root, - bool collectComments) { +bool OurReader::parse(const char* beginDoc, const char* endDoc, Value& root, + bool collectComments) { if (!features_.allowComments_) { collectComments = false; } @@ -1277,22 +1245,23 @@ bool OurReader::parse(const char* beginDoc, end_ = endDoc; collectComments_ = collectComments; current_ = begin_; - lastValueEnd_ = 0; - lastValue_ = 0; + lastValueEnd_ = nullptr; + lastValue_ = nullptr; commentsBefore_.clear(); errors_.clear(); while (!nodes_.empty()) nodes_.pop(); nodes_.push(&root); + // skip byte order mark if it exists at the beginning of the UTF-8 text. + skipBom(features_.skipBom_); bool successful = readValue(); + nodes_.pop(); Token token; skipCommentTokens(token); - if (features_.failIfExtra_) { - if ((features_.strictRoot_ || token.type_ != tokenError) && token.type_ != tokenEndOfStream) { - addError("Extra non-whitespace after JSON value.", token); - return false; - } + if (features_.failIfExtra_ && (token.type_ != tokenEndOfStream)) { + addError("Extra non-whitespace after JSON value.", token); + return false; } if (collectComments_ && !commentsBefore_.empty()) root.setComment(commentsBefore_, commentAfter); @@ -1314,7 +1283,8 @@ bool OurReader::parse(const char* beginDoc, bool OurReader::readValue() { // To preserve the old behaviour we cast size_t to int. - if (static_cast(nodes_.size()) > features_.stackLimit_) throwRuntimeError("Exceeded stackLimit in readValue()."); + if (nodes_.size() > features_.stackLimit_) + throwRuntimeError("Exceeded stackLimit in readValue()."); Token token; skipCommentTokens(token); bool successful = true; @@ -1339,54 +1309,42 @@ bool OurReader::readValue() { case tokenString: successful = decodeString(token); break; - case tokenTrue: - { + case tokenTrue: { Value v(true); currentValue().swapPayload(v); currentValue().setOffsetStart(token.start_ - begin_); currentValue().setOffsetLimit(token.end_ - begin_); - } - break; - case tokenFalse: - { + } break; + case tokenFalse: { Value v(false); currentValue().swapPayload(v); currentValue().setOffsetStart(token.start_ - begin_); currentValue().setOffsetLimit(token.end_ - begin_); - } - break; - case tokenNull: - { + } break; + case tokenNull: { Value v; currentValue().swapPayload(v); currentValue().setOffsetStart(token.start_ - begin_); currentValue().setOffsetLimit(token.end_ - begin_); - } - break; - case tokenNaN: - { + } break; + case tokenNaN: { Value v(std::numeric_limits::quiet_NaN()); currentValue().swapPayload(v); currentValue().setOffsetStart(token.start_ - begin_); currentValue().setOffsetLimit(token.end_ - begin_); - } - break; - case tokenPosInf: - { + } break; + case tokenPosInf: { Value v(std::numeric_limits::infinity()); currentValue().swapPayload(v); currentValue().setOffsetStart(token.start_ - begin_); currentValue().setOffsetLimit(token.end_ - begin_); - } - break; - case tokenNegInf: - { + } break; + case tokenNegInf: { Value v(-std::numeric_limits::infinity()); currentValue().swapPayload(v); currentValue().setOffsetStart(token.start_ - begin_); currentValue().setOffsetLimit(token.end_ - begin_); - } - break; + } break; case tokenArraySeparator: case tokenObjectEnd: case tokenArrayEnd: @@ -1408,6 +1366,7 @@ bool OurReader::readValue() { if (collectComments_) { lastValueEnd_ = current_; + lastValueHasAComment_ = false; lastValue_ = ¤tValue(); } @@ -1448,10 +1407,13 @@ bool OurReader::readToken(Token& token) { break; case '\'': if (features_.allowSingleQuotes_) { - token.type_ = tokenString; - ok = readStringSingleQuote(); + token.type_ = tokenString; + ok = readStringSingleQuote(); + } else { + // If we don't allow single quotes, this is a failure case. + ok = false; + } break; - } // else fall through case '/': token.type_ = tokenComment; ok = readComment(); @@ -1477,6 +1439,14 @@ bool OurReader::readToken(Token& token) { ok = features_.allowSpecialFloats_ && match("nfinity", 7); } break; + case '+': + if (readNumber(true)) { + token.type_ = tokenNumber; + } else { + token.type_ = tokenPosInf; + ok = features_.allowSpecialFloats_ && match("nfinity", 7); + } + break; case 't': token.type_ = tokenTrue; ok = match("rue", 3); @@ -1521,7 +1491,7 @@ bool OurReader::readToken(Token& token) { if (!ok) token.type_ = tokenError; token.end_ = current_; - return true; + return ok; } void OurReader::skipSpaces() { @@ -1534,7 +1504,17 @@ void OurReader::skipSpaces() { } } -bool OurReader::match(Location pattern, int patternLength) { +void OurReader::skipBom(bool skipBom) { + // The default behavior is to skip BOM. + if (skipBom) { + if ((end_ - begin_) >= 3 && strncmp(begin_, "\xEF\xBB\xBF", 3) == 0) { + begin_ += 3; + current_ = begin_; + } + } +} + +bool OurReader::match(const Char* pattern, int patternLength) { if (end_ - current_ < patternLength) return false; int index = patternLength; @@ -1546,21 +1526,32 @@ bool OurReader::match(Location pattern, int patternLength) { } bool OurReader::readComment() { - Location commentBegin = current_ - 1; - Char c = getNextChar(); + const Location commentBegin = current_ - 1; + const Char c = getNextChar(); bool successful = false; - if (c == '*') - successful = readCStyleComment(); - else if (c == '/') + bool cStyleWithEmbeddedNewline = false; + + const bool isCStyleComment = (c == '*'); + const bool isCppStyleComment = (c == '/'); + if (isCStyleComment) { + successful = readCStyleComment(&cStyleWithEmbeddedNewline); + } else if (isCppStyleComment) { successful = readCppStyleComment(); + } + if (!successful) return false; if (collectComments_) { CommentPlacement placement = commentBefore; - if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { - if (c != '*' || !containsNewLine(commentBegin, current_)) - placement = commentAfterOnSameLine; + + if (!lastValueHasAComment_) { + if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { + if (isCppStyleComment || !cStyleWithEmbeddedNewline) { + placement = commentAfterOnSameLine; + lastValueHasAComment_ = true; + } + } } addComment(commentBegin, current_, placement); @@ -1568,16 +1559,17 @@ bool OurReader::readComment() { return true; } -JSONCPP_STRING OurReader::normalizeEOL(OurReader::Location begin, OurReader::Location end) { - JSONCPP_STRING normalized; +String OurReader::normalizeEOL(OurReader::Location begin, + OurReader::Location end) { + String normalized; normalized.reserve(static_cast(end - begin)); OurReader::Location current = begin; while (current != end) { char c = *current++; if (c == '\r') { if (current != end && *current == '\n') - // convert dos EOL - ++current; + // convert dos EOL + ++current; // convert Mac EOL normalized += '\n'; } else { @@ -1587,24 +1579,29 @@ JSONCPP_STRING OurReader::normalizeEOL(OurReader::Location begin, OurReader::Loc return normalized; } -void -OurReader::addComment(Location begin, Location end, CommentPlacement placement) { +void OurReader::addComment(Location begin, Location end, + CommentPlacement placement) { assert(collectComments_); - const JSONCPP_STRING& normalized = normalizeEOL(begin, end); + const String& normalized = normalizeEOL(begin, end); if (placement == commentAfterOnSameLine) { - assert(lastValue_ != 0); + assert(lastValue_ != nullptr); lastValue_->setComment(normalized, placement); } else { commentsBefore_ += normalized; } } -bool OurReader::readCStyleComment() { +bool OurReader::readCStyleComment(bool* containsNewLineResult) { + *containsNewLineResult = false; + while ((current_ + 1) < end_) { Char c = getNextChar(); if (c == '*' && *current_ == '/') break; + if (c == '\n') + *containsNewLineResult = true; } + return getNextChar() == '/'; } @@ -1625,7 +1622,7 @@ bool OurReader::readCppStyleComment() { } bool OurReader::readNumber(bool checkInf) { - const char *p = current_; + Location p = current_; if (checkInf && p != end_ && *p == 'I') { current_ = ++p; return false; @@ -1662,7 +1659,6 @@ bool OurReader::readString() { return c == '"'; } - bool OurReader::readStringSingleQuote() { Char c = 0; while (current_ != end_) { @@ -1675,19 +1671,21 @@ bool OurReader::readStringSingleQuote() { return c == '\''; } -bool OurReader::readObject(Token& tokenStart) { +bool OurReader::readObject(Token& token) { Token tokenName; - JSONCPP_STRING name; + String name; Value init(objectValue); currentValue().swapPayload(init); - currentValue().setOffsetStart(tokenStart.start_ - begin_); + currentValue().setOffsetStart(token.start_ - begin_); while (readToken(tokenName)) { bool initialTokenOk = true; while (tokenName.type_ == tokenComment && initialTokenOk) initialTokenOk = readToken(tokenName); if (!initialTokenOk) break; - if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object + if (tokenName.type_ == tokenObjectEnd && + (name.empty() || + features_.allowTrailingCommas_)) // empty object or trailing comma return true; name.clear(); if (tokenName.type_ == tokenString) { @@ -1701,17 +1699,17 @@ bool OurReader::readObject(Token& tokenStart) { } else { break; } + if (name.length() >= (1U << 30)) + throwRuntimeError("keylength >= 2^30"); + if (features_.rejectDupKeys_ && currentValue().isMember(name)) { + String msg = "Duplicate key: '" + name + "'"; + return addErrorAndRecover(msg, tokenName, tokenObjectEnd); + } Token colon; if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { - return addErrorAndRecover( - "Missing ':' after object member name", colon, tokenObjectEnd); - } - if (name.length() >= (1U<<30)) throwRuntimeError("keylength >= 2^30"); - if (features_.rejectDupKeys_ && currentValue().isMember(name)) { - JSONCPP_STRING msg = "Duplicate key: '" + name + "'"; - return addErrorAndRecover( - msg, tokenName, tokenObjectEnd); + return addErrorAndRecover("Missing ':' after object member name", colon, + tokenObjectEnd); } Value& value = currentValue()[name]; nodes_.push(&value); @@ -1724,8 +1722,8 @@ bool OurReader::readObject(Token& tokenStart) { if (!readToken(comma) || (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && comma.type_ != tokenComment)) { - return addErrorAndRecover( - "Missing ',' or '}' in object declaration", comma, tokenObjectEnd); + return addErrorAndRecover("Missing ',' or '}' in object declaration", + comma, tokenObjectEnd); } bool finalizeTokenOk = true; while (comma.type_ == tokenComment && finalizeTokenOk) @@ -1733,23 +1731,27 @@ bool OurReader::readObject(Token& tokenStart) { if (comma.type_ == tokenObjectEnd) return true; } - return addErrorAndRecover( - "Missing '}' or object member name", tokenName, tokenObjectEnd); + return addErrorAndRecover("Missing '}' or object member name", tokenName, + tokenObjectEnd); } -bool OurReader::readArray(Token& tokenStart) { +bool OurReader::readArray(Token& token) { Value init(arrayValue); currentValue().swapPayload(init); - currentValue().setOffsetStart(tokenStart.start_ - begin_); - skipSpaces(); - if (current_ != end_ && *current_ == ']') // empty array - { - Token endArray; - readToken(endArray); - return true; - } + currentValue().setOffsetStart(token.start_ - begin_); int index = 0; for (;;) { + skipSpaces(); + if (current_ != end_ && *current_ == ']' && + (index == 0 || + (features_.allowTrailingCommas_ && + !features_.allowDroppedNullPlaceholders_))) // empty array or trailing + // comma + { + Token endArray; + readToken(endArray); + return true; + } Value& value = currentValue()[index++]; nodes_.push(&value); bool ok = readValue(); @@ -1757,19 +1759,19 @@ bool OurReader::readArray(Token& tokenStart) { if (!ok) // error already set return recoverFromError(tokenArrayEnd); - Token token; + Token currentToken; // Accept Comment after last item in the array. - ok = readToken(token); - while (token.type_ == tokenComment && ok) { - ok = readToken(token); + ok = readToken(currentToken); + while (currentToken.type_ == tokenComment && ok) { + ok = readToken(currentToken); } - bool badTokenType = - (token.type_ != tokenArraySeparator && token.type_ != tokenArrayEnd); + bool badTokenType = (currentToken.type_ != tokenArraySeparator && + currentToken.type_ != tokenArrayEnd); if (!ok || badTokenType) { - return addErrorAndRecover( - "Missing ',' or ']' in array declaration", token, tokenArrayEnd); + return addErrorAndRecover("Missing ',' or ']' in array declaration", + currentToken, tokenArrayEnd); } - if (token.type_ == tokenArrayEnd) + if (currentToken.type_ == tokenArrayEnd) break; } return true; @@ -1790,38 +1792,78 @@ bool OurReader::decodeNumber(Token& token, Value& decoded) { // larger than the maximum supported value of an integer then // we decode the number as a double. Location current = token.start_; - bool isNegative = *current == '-'; - if (isNegative) + const bool isNegative = *current == '-'; + if (isNegative) { ++current; - // TODO: Help the compiler do the div and mod at compile time or get rid of them. - Value::LargestUInt maxIntegerValue = - isNegative ? Value::LargestUInt(-Value::minLargestInt) - : Value::maxLargestUInt; - Value::LargestUInt threshold = maxIntegerValue / 10; + } + + // We assume we can represent the largest and smallest integer types as + // unsigned integers with separate sign. This is only true if they can fit + // into an unsigned integer. + static_assert(Value::maxLargestInt <= Value::maxLargestUInt, + "Int must be smaller than UInt"); + + // We need to convert minLargestInt into a positive number. The easiest way + // to do this conversion is to assume our "threshold" value of minLargestInt + // divided by 10 can fit in maxLargestInt when absolute valued. This should + // be a safe assumption. + static_assert(Value::minLargestInt <= -Value::maxLargestInt, + "The absolute value of minLargestInt must be greater than or " + "equal to maxLargestInt"); + static_assert(Value::minLargestInt / 10 >= -Value::maxLargestInt, + "The absolute value of minLargestInt must be only 1 magnitude " + "larger than maxLargest Int"); + + static constexpr Value::LargestUInt positive_threshold = + Value::maxLargestUInt / 10; + static constexpr Value::UInt positive_last_digit = Value::maxLargestUInt % 10; + + // For the negative values, we have to be more careful. Since typically + // -Value::minLargestInt will cause an overflow, we first divide by 10 and + // then take the inverse. This assumes that minLargestInt is only a single + // power of 10 different in magnitude, which we check above. For the last + // digit, we take the modulus before negating for the same reason. + static constexpr auto negative_threshold = + Value::LargestUInt(-(Value::minLargestInt / 10)); + static constexpr auto negative_last_digit = + Value::UInt(-(Value::minLargestInt % 10)); + + const Value::LargestUInt threshold = + isNegative ? negative_threshold : positive_threshold; + const Value::UInt max_last_digit = + isNegative ? negative_last_digit : positive_last_digit; + Value::LargestUInt value = 0; while (current < token.end_) { Char c = *current++; if (c < '0' || c > '9') return decodeDouble(token, decoded); - Value::UInt digit(static_cast(c - '0')); + + const auto digit(static_cast(c - '0')); if (value >= threshold) { // We've hit or exceeded the max value divided by 10 (rounded down). If - // a) we've only just touched the limit, b) this is the last digit, and + // a) we've only just touched the limit, meaing value == threshold, + // b) this is the last digit, or // c) it's small enough to fit in that rounding delta, we're okay. // Otherwise treat this number as a double to avoid overflow. if (value > threshold || current != token.end_ || - digit > maxIntegerValue % 10) { + digit > max_last_digit) { return decodeDouble(token, decoded); } } value = value * 10 + digit; } - if (isNegative) - decoded = -Value::LargestInt(value); - else if (value <= Value::LargestUInt(Value::maxInt)) + + if (isNegative) { + // We use the same magnitude assumption here, just in case. + const auto last_digit = static_cast(value % 10); + decoded = -Value::LargestInt(value / 10) * 10 - last_digit; + } else if (value <= Value::LargestUInt(Value::maxLargestInt)) { decoded = Value::LargestInt(value); - else + } else { decoded = value; + } + return true; } @@ -1837,44 +1879,18 @@ bool OurReader::decodeDouble(Token& token) { bool OurReader::decodeDouble(Token& token, Value& decoded) { double value = 0; - const int bufferSize = 32; - int count; - ptrdiff_t const length = token.end_ - token.start_; - - // Sanity check to avoid buffer overflow exploits. - if (length < 0) { - return addError("Unable to parse token length", token); + const String buffer(token.start_, token.end_); + IStringStream is(buffer); + if (!(is >> value)) { + return addError( + "'" + String(token.start_, token.end_) + "' is not a number.", token); } - size_t const ulength = static_cast(length); - - // Avoid using a string constant for the format control string given to - // sscanf, as this can cause hard to debug crashes on OS X. See here for more - // info: - // - // http://developer.apple.com/library/mac/#DOCUMENTATION/DeveloperTools/gcc-4.0.1/gcc/Incompatibilities.html - char format[] = "%lf"; - - if (length <= bufferSize) { - Char buffer[bufferSize + 1]; - memcpy(buffer, token.start_, ulength); - buffer[length] = 0; - fixNumericLocaleInput(buffer, buffer + length); - count = sscanf(buffer, format, &value); - } else { - JSONCPP_STRING buffer(token.start_, token.end_); - count = sscanf(buffer.c_str(), format, &value); - } - - if (count != 1) - return addError("'" + JSONCPP_STRING(token.start_, token.end_) + - "' is not a number.", - token); decoded = value; return true; } bool OurReader::decodeString(Token& token) { - JSONCPP_STRING decoded_string; + String decoded_string; if (!decodeString(token, decoded_string)) return false; Value decoded(decoded_string); @@ -1884,7 +1900,7 @@ bool OurReader::decodeString(Token& token) { return true; } -bool OurReader::decodeString(Token& token, JSONCPP_STRING& decoded) { +bool OurReader::decodeString(Token& token, String& decoded) { decoded.reserve(static_cast(token.end_ - token.start_ - 2)); Location current = token.start_ + 1; // skip '"' Location end = token.end_ - 1; // do not include '"' @@ -1892,7 +1908,7 @@ bool OurReader::decodeString(Token& token, JSONCPP_STRING& decoded) { Char c = *current++; if (c == '"') break; - else if (c == '\\') { + if (c == '\\') { if (current == end) return addError("Empty escape sequence in string", token, current); Char escape = *current++; @@ -1937,10 +1953,8 @@ bool OurReader::decodeString(Token& token, JSONCPP_STRING& decoded) { return true; } -bool OurReader::decodeUnicodeCodePoint(Token& token, - Location& current, - Location end, - unsigned int& unicode) { +bool OurReader::decodeUnicodeCodePoint(Token& token, Location& current, + Location end, unsigned int& unicode) { if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) return false; @@ -1949,10 +1963,9 @@ bool OurReader::decodeUnicodeCodePoint(Token& token, if (end - current < 6) return addError( "additional six characters expected to parse unicode surrogate pair.", - token, - current); - unsigned int surrogatePair; + token, current); if (*(current++) == '\\' && *(current++) == 'u') { + unsigned int surrogatePair; if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); } else @@ -1960,20 +1973,17 @@ bool OurReader::decodeUnicodeCodePoint(Token& token, } else return addError("expecting another \\u token to begin the second half of " "a unicode surrogate pair", - token, - current); + token, current); } return true; } -bool OurReader::decodeUnicodeEscapeSequence(Token& token, - Location& current, - Location end, - unsigned int& ret_unicode) { +bool OurReader::decodeUnicodeEscapeSequence(Token& token, Location& current, + Location end, + unsigned int& ret_unicode) { if (end - current < 4) return addError( - "Bad unicode escape sequence in string: four digits expected.", - token, + "Bad unicode escape sequence in string: four digits expected.", token, current); int unicode = 0; for (int index = 0; index < 4; ++index) { @@ -1988,15 +1998,13 @@ bool OurReader::decodeUnicodeEscapeSequence(Token& token, else return addError( "Bad unicode escape sequence in string: hexadecimal digit expected.", - token, - current); + token, current); } ret_unicode = static_cast(unicode); return true; } -bool -OurReader::addError(const JSONCPP_STRING& message, Token& token, Location extra) { +bool OurReader::addError(const String& message, Token& token, Location extra) { ErrorInfo info; info.token_ = token; info.message_ = message; @@ -2018,9 +2026,8 @@ bool OurReader::recoverFromError(TokenType skipUntilToken) { return false; } -bool OurReader::addErrorAndRecover(const JSONCPP_STRING& message, - Token& token, - TokenType skipUntilToken) { +bool OurReader::addErrorAndRecover(const String& message, Token& token, + TokenType skipUntilToken) { addError(message, token); return recoverFromError(skipUntilToken); } @@ -2033,9 +2040,8 @@ OurReader::Char OurReader::getNextChar() { return *current_++; } -void OurReader::getLocationLineAndColumn(Location location, - int& line, - int& column) const { +void OurReader::getLocationLineAndColumn(Location location, int& line, + int& column) const { Location current = begin_; Location lastLineStart = current; line = 0; @@ -2056,20 +2062,17 @@ void OurReader::getLocationLineAndColumn(Location location, ++line; } -JSONCPP_STRING OurReader::getLocationLineAndColumn(Location location) const { +String OurReader::getLocationLineAndColumn(Location location) const { int line, column; getLocationLineAndColumn(location, line, column); char buffer[18 + 16 + 16 + 1]; - snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); + jsoncpp_snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); return buffer; } -JSONCPP_STRING OurReader::getFormattedErrorMessages() const { - JSONCPP_STRING formattedMessage; - for (Errors::const_iterator itError = errors_.begin(); - itError != errors_.end(); - ++itError) { - const ErrorInfo& error = *itError; +String OurReader::getFormattedErrorMessages() const { + String formattedMessage; + for (const auto& error : errors_) { formattedMessage += "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; formattedMessage += " " + error.message_ + "\n"; @@ -2082,10 +2085,7 @@ JSONCPP_STRING OurReader::getFormattedErrorMessages() const { std::vector OurReader::getStructuredErrors() const { std::vector allErrors; - for (Errors::const_iterator itError = errors_.begin(); - itError != errors_.end(); - ++itError) { - const ErrorInfo& error = *itError; + for (const auto& error : errors_) { OurReader::StructuredError structured; structured.offset_start = error.token_.start_ - begin_; structured.offset_limit = error.token_.end_ - begin_; @@ -2095,59 +2095,15 @@ std::vector OurReader::getStructuredErrors() const { return allErrors; } -bool OurReader::pushError(const Value& value, const JSONCPP_STRING& message) { - ptrdiff_t length = end_ - begin_; - if(value.getOffsetStart() > length - || value.getOffsetLimit() > length) - return false; - Token token; - token.type_ = tokenError; - token.start_ = begin_ + value.getOffsetStart(); - token.end_ = end_ + value.getOffsetLimit(); - ErrorInfo info; - info.token_ = token; - info.message_ = message; - info.extra_ = 0; - errors_.push_back(info); - return true; -} - -bool OurReader::pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra) { - ptrdiff_t length = end_ - begin_; - if(value.getOffsetStart() > length - || value.getOffsetLimit() > length - || extra.getOffsetLimit() > length) - return false; - Token token; - token.type_ = tokenError; - token.start_ = begin_ + value.getOffsetStart(); - token.end_ = begin_ + value.getOffsetLimit(); - ErrorInfo info; - info.token_ = token; - info.message_ = message; - info.extra_ = begin_ + extra.getOffsetStart(); - errors_.push_back(info); - return true; -} - -bool OurReader::good() const { - return !errors_.size(); -} - - class OurCharReader : public CharReader { bool const collectComments_; OurReader reader_; + public: - OurCharReader( - bool collectComments, - OurFeatures const& features) - : collectComments_(collectComments) - , reader_(features) - {} - bool parse( - char const* beginDoc, char const* endDoc, - Value* root, JSONCPP_STRING* errs) JSONCPP_OVERRIDE { + OurCharReader(bool collectComments, OurFeatures const& features) + : collectComments_(collectComments), reader_(features) {} + bool parse(char const* beginDoc, char const* endDoc, Value* root, + String* errs) override { bool ok = reader_.parse(beginDoc, endDoc, *root, collectComments_); if (errs) { *errs = reader_.getFormattedErrorMessages(); @@ -2156,67 +2112,64 @@ public: } }; -CharReaderBuilder::CharReaderBuilder() -{ - setDefaults(&settings_); -} -CharReaderBuilder::~CharReaderBuilder() -{} -CharReader* CharReaderBuilder::newCharReader() const -{ +CharReaderBuilder::CharReaderBuilder() { setDefaults(&settings_); } +CharReaderBuilder::~CharReaderBuilder() = default; +CharReader* CharReaderBuilder::newCharReader() const { bool collectComments = settings_["collectComments"].asBool(); OurFeatures features = OurFeatures::all(); features.allowComments_ = settings_["allowComments"].asBool(); + features.allowTrailingCommas_ = settings_["allowTrailingCommas"].asBool(); features.strictRoot_ = settings_["strictRoot"].asBool(); - features.allowDroppedNullPlaceholders_ = settings_["allowDroppedNullPlaceholders"].asBool(); + features.allowDroppedNullPlaceholders_ = + settings_["allowDroppedNullPlaceholders"].asBool(); features.allowNumericKeys_ = settings_["allowNumericKeys"].asBool(); features.allowSingleQuotes_ = settings_["allowSingleQuotes"].asBool(); - features.stackLimit_ = settings_["stackLimit"].asInt(); + + // Stack limit is always a size_t, so we get this as an unsigned int + // regardless of it we have 64-bit integer support enabled. + features.stackLimit_ = static_cast(settings_["stackLimit"].asUInt()); features.failIfExtra_ = settings_["failIfExtra"].asBool(); features.rejectDupKeys_ = settings_["rejectDupKeys"].asBool(); features.allowSpecialFloats_ = settings_["allowSpecialFloats"].asBool(); + features.skipBom_ = settings_["skipBom"].asBool(); return new OurCharReader(collectComments, features); } -static void getValidReaderKeys(std::set* valid_keys) -{ - valid_keys->clear(); - valid_keys->insert("collectComments"); - valid_keys->insert("allowComments"); - valid_keys->insert("strictRoot"); - valid_keys->insert("allowDroppedNullPlaceholders"); - valid_keys->insert("allowNumericKeys"); - valid_keys->insert("allowSingleQuotes"); - valid_keys->insert("stackLimit"); - valid_keys->insert("failIfExtra"); - valid_keys->insert("rejectDupKeys"); - valid_keys->insert("allowSpecialFloats"); -} -bool CharReaderBuilder::validate(Json::Value* invalid) const -{ - Json::Value my_invalid; - if (!invalid) invalid = &my_invalid; // so we do not need to test for NULL - Json::Value& inv = *invalid; - std::set valid_keys; - getValidReaderKeys(&valid_keys); - Value::Members keys = settings_.getMemberNames(); - size_t n = keys.size(); - for (size_t i = 0; i < n; ++i) { - JSONCPP_STRING const& key = keys[i]; - if (valid_keys.find(key) == valid_keys.end()) { - inv[key] = settings_[key]; - } + +bool CharReaderBuilder::validate(Json::Value* invalid) const { + static const auto& valid_keys = *new std::set{ + "collectComments", + "allowComments", + "allowTrailingCommas", + "strictRoot", + "allowDroppedNullPlaceholders", + "allowNumericKeys", + "allowSingleQuotes", + "stackLimit", + "failIfExtra", + "rejectDupKeys", + "allowSpecialFloats", + "skipBom", + }; + for (auto si = settings_.begin(); si != settings_.end(); ++si) { + auto key = si.name(); + if (valid_keys.count(key)) + continue; + if (invalid) + (*invalid)[std::move(key)] = *si; + else + return false; } - return 0u == inv.size(); + return invalid ? invalid->empty() : true; } -Value& CharReaderBuilder::operator[](JSONCPP_STRING key) -{ + +Value& CharReaderBuilder::operator[](const String& key) { return settings_[key]; } // static -void CharReaderBuilder::strictMode(Json::Value* settings) -{ -//! [CharReaderBuilderStrictMode] +void CharReaderBuilder::strictMode(Json::Value* settings) { + //! [CharReaderBuilderStrictMode] (*settings)["allowComments"] = false; + (*settings)["allowTrailingCommas"] = false; (*settings)["strictRoot"] = true; (*settings)["allowDroppedNullPlaceholders"] = false; (*settings)["allowNumericKeys"] = false; @@ -2225,14 +2178,15 @@ void CharReaderBuilder::strictMode(Json::Value* settings) (*settings)["failIfExtra"] = true; (*settings)["rejectDupKeys"] = true; (*settings)["allowSpecialFloats"] = false; -//! [CharReaderBuilderStrictMode] + (*settings)["skipBom"] = true; + //! [CharReaderBuilderStrictMode] } // static -void CharReaderBuilder::setDefaults(Json::Value* settings) -{ -//! [CharReaderBuilderDefaults] +void CharReaderBuilder::setDefaults(Json::Value* settings) { + //! [CharReaderBuilderDefaults] (*settings)["collectComments"] = true; (*settings)["allowComments"] = true; + (*settings)["allowTrailingCommas"] = true; (*settings)["strictRoot"] = false; (*settings)["allowDroppedNullPlaceholders"] = false; (*settings)["allowNumericKeys"] = false; @@ -2241,19 +2195,18 @@ void CharReaderBuilder::setDefaults(Json::Value* settings) (*settings)["failIfExtra"] = false; (*settings)["rejectDupKeys"] = false; (*settings)["allowSpecialFloats"] = false; -//! [CharReaderBuilderDefaults] + (*settings)["skipBom"] = true; + //! [CharReaderBuilderDefaults] } ////////////////////////////////// // global functions -bool parseFromStream( - CharReader::Factory const& fact, JSONCPP_ISTREAM& sin, - Value* root, JSONCPP_STRING* errs) -{ - JSONCPP_OSTRINGSTREAM ssin; +bool parseFromStream(CharReader::Factory const& fact, IStream& sin, Value* root, + String* errs) { + OStringStream ssin; ssin << sin.rdbuf(); - JSONCPP_STRING doc = ssin.str(); + String doc = ssin.str(); char const* begin = doc.data(); char const* end = begin + doc.size(); // Note that we do not actually need a null-terminator. @@ -2261,9 +2214,9 @@ bool parseFromStream( return reader->parse(begin, end, root, errs); } -JSONCPP_ISTREAM& operator>>(JSONCPP_ISTREAM& sin, Value& root) { +IStream& operator>>(IStream& sin, Value& root) { CharReaderBuilder b; - JSONCPP_STRING errs; + String errs; bool ok = parseFromStream(b, sin, &root, &errs); if (!ok) { throwRuntimeError(errs); @@ -2303,31 +2256,21 @@ namespace Json { // ////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////// -ValueIteratorBase::ValueIteratorBase() - : current_(), isNull_(true) { -} +ValueIteratorBase::ValueIteratorBase() : current_() {} ValueIteratorBase::ValueIteratorBase( const Value::ObjectValues::iterator& current) : current_(current), isNull_(false) {} -Value& ValueIteratorBase::deref() const { - return current_->second; -} +Value& ValueIteratorBase::deref() { return current_->second; } +const Value& ValueIteratorBase::deref() const { return current_->second; } -void ValueIteratorBase::increment() { - ++current_; -} +void ValueIteratorBase::increment() { ++current_; } -void ValueIteratorBase::decrement() { - --current_; -} +void ValueIteratorBase::decrement() { --current_; } ValueIteratorBase::difference_type ValueIteratorBase::computeDistance(const SelfType& other) const { -#ifdef JSON_USE_CPPTL_SMALLMAP - return other.current_ - current_; -#else // Iterator for null value are initialized using the default // constructor, which initialize current_ to the default // std::map::iterator. As begin() and end() are two instance @@ -2348,7 +2291,6 @@ ValueIteratorBase::computeDistance(const SelfType& other) const { ++myDistance; } return myDistance; -#endif } bool ValueIteratorBase::isEqual(const SelfType& other) const { @@ -2380,12 +2322,13 @@ UInt ValueIteratorBase::index() const { return Value::UInt(-1); } -JSONCPP_STRING ValueIteratorBase::name() const { +String ValueIteratorBase::name() const { char const* keey; char const* end; keey = memberName(&end); - if (!keey) return JSONCPP_STRING(); - return JSONCPP_STRING(keey, end); + if (!keey) + return String(); + return String(keey, end); } char const* ValueIteratorBase::memberName() const { @@ -2396,8 +2339,8 @@ char const* ValueIteratorBase::memberName() const { char const* ValueIteratorBase::memberName(char const** end) const { const char* cname = (*current_).first.data(); if (!cname) { - *end = NULL; - return NULL; + *end = nullptr; + return nullptr; } *end = cname + (*current_).first.length(); return cname; @@ -2411,7 +2354,7 @@ char const* ValueIteratorBase::memberName(char const** end) const { // ////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////// -ValueConstIterator::ValueConstIterator() {} +ValueConstIterator::ValueConstIterator() = default; ValueConstIterator::ValueConstIterator( const Value::ObjectValues::iterator& current) @@ -2434,7 +2377,7 @@ operator=(const ValueIteratorBase& other) { // ////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////// -ValueIterator::ValueIterator() {} +ValueIterator::ValueIterator() = default; ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current) : ValueIteratorBase(current) {} @@ -2444,8 +2387,7 @@ ValueIterator::ValueIterator(const ValueConstIterator& other) throwRuntimeError("ConstIterator to Iterator should never be allowed."); } -ValueIterator::ValueIterator(const ValueIterator& other) - : ValueIteratorBase(other) {} +ValueIterator::ValueIterator(const ValueIterator& other) = default; ValueIterator& ValueIterator::operator=(const SelfType& other) { copy(other); @@ -2477,20 +2419,54 @@ ValueIterator& ValueIterator::operator=(const SelfType& other) { #include #include #endif // if !defined(JSON_IS_AMALGAMATION) -#include +#include +#include +#include +#include +#include +#include #include #include -#include -#include -#ifdef JSON_USE_CPPTL -#include + +// Provide implementation equivalent of std::snprintf for older _MSC compilers +#if defined(_MSC_VER) && _MSC_VER < 1900 +#include +static int msvc_pre1900_c99_vsnprintf(char* outBuf, size_t size, + const char* format, va_list ap) { + int count = -1; + if (size != 0) + count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap); + if (count == -1) + count = _vscprintf(format, ap); + return count; +} + +int JSON_API msvc_pre1900_c99_snprintf(char* outBuf, size_t size, + const char* format, ...) { + va_list ap; + va_start(ap, format); + const int count = msvc_pre1900_c99_vsnprintf(outBuf, size, format, ap); + va_end(ap); + return count; +} +#endif + +// Disable warning C4702 : unreachable code +#if defined(_MSC_VER) +#pragma warning(disable : 4702) #endif -#include // size_t -#include // min() #define JSON_ASSERT_UNREACHABLE assert(false) namespace Json { +template +static std::unique_ptr cloneUnique(const std::unique_ptr& p) { + std::unique_ptr r; + if (p) { + r = std::unique_ptr(new T(*p)); + } + return r; +} // This is a walkaround to avoid the static initialization of Value::null. // kNull must be word-aligned to avoid crashing on ARM. We use an alignment of @@ -2500,50 +2476,34 @@ namespace Json { #else #define ALIGNAS(byte_alignment) #endif -//static const unsigned char ALIGNAS(8) kNull[sizeof(Value)] = { 0 }; -//const unsigned char& kNullRef = kNull[0]; -//const Value& Value::null = reinterpret_cast(kNullRef); -//const Value& Value::nullRef = null; // static -Value const& Value::nullSingleton() -{ - static Value const nullStatic; - return nullStatic; +Value const& Value::nullSingleton() { + static Value const nullStatic; + return nullStatic; } -// for backwards compatibility, we'll leave these global references around, but DO NOT -// use them in JSONCPP library code any more! +#if JSON_USE_NULLREF +// for backwards compatibility, we'll leave these global references around, but +// DO NOT use them in JSONCPP library code any more! +// static Value const& Value::null = Value::nullSingleton(); -Value const& Value::nullRef = Value::nullSingleton(); -const Int Value::minInt = Int(~(UInt(-1) / 2)); -const Int Value::maxInt = Int(UInt(-1) / 2); -const UInt Value::maxUInt = UInt(-1); -#if defined(JSON_HAS_INT64) -const Int64 Value::minInt64 = Int64(~(UInt64(-1) / 2)); -const Int64 Value::maxInt64 = Int64(UInt64(-1) / 2); -const UInt64 Value::maxUInt64 = UInt64(-1); -// The constant is hard-coded because some compiler have trouble -// converting Value::maxUInt64 to a double correctly (AIX/xlC). -// Assumes that UInt64 is a 64 bits integer. -static const double maxUInt64AsDouble = 18446744073709551615.0; -#endif // defined(JSON_HAS_INT64) -const LargestInt Value::minLargestInt = LargestInt(~(LargestUInt(-1) / 2)); -const LargestInt Value::maxLargestInt = LargestInt(LargestUInt(-1) / 2); -const LargestUInt Value::maxLargestUInt = LargestUInt(-1); +// static +Value const& Value::nullRef = Value::nullSingleton(); +#endif #if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) template static inline bool InRange(double d, T min, U max) { // The casts can lose precision, but we are looking only for // an approximate range. Might fail on edge cases though. ~cdunn - //return d >= static_cast(min) && d <= static_cast(max); - return d >= min && d <= max; + return d >= static_cast(min) && d <= static_cast(max); } #else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) static inline double integerToDouble(Json::UInt64 value) { - return static_cast(Int64(value / 2)) * 2.0 + static_cast(Int64(value & 1)); + return static_cast(Int64(value / 2)) * 2.0 + + static_cast(Int64(value & 1)); } template static inline double integerToDouble(T value) { @@ -2563,19 +2523,16 @@ static inline bool InRange(double d, T min, U max) { * computed using strlen(value). * @return Pointer on the duplicate instance of string. */ -static inline char* duplicateStringValue(const char* value, - size_t length) -{ +static inline char* duplicateStringValue(const char* value, size_t length) { // Avoid an integer overflow in the call to malloc below by limiting length // to a sane value. if (length >= static_cast(Value::maxInt)) length = Value::maxInt - 1; - char* newString = static_cast(malloc(length + 1)); - if (newString == NULL) { - throwRuntimeError( - "in Json::Value::duplicateStringValue(): " - "Failed to allocate string value buffer"); + auto newString = static_cast(malloc(length + 1)); + if (newString == nullptr) { + throwRuntimeError("in Json::Value::duplicateStringValue(): " + "Failed to allocate string value buffer"); } memcpy(newString, value, length); newString[length] = 0; @@ -2584,31 +2541,28 @@ static inline char* duplicateStringValue(const char* value, /* Record the length as a prefix. */ -static inline char* duplicateAndPrefixStringValue( - const char* value, - unsigned int length) -{ +static inline char* duplicateAndPrefixStringValue(const char* value, + unsigned int length) { // Avoid an integer overflow in the call to malloc below by limiting length // to a sane value. - JSON_ASSERT_MESSAGE(length <= static_cast(Value::maxInt) - sizeof(unsigned) - 1U, + JSON_ASSERT_MESSAGE(length <= static_cast(Value::maxInt) - + sizeof(unsigned) - 1U, "in Json::Value::duplicateAndPrefixStringValue(): " "length too big for prefixing"); - unsigned actualLength = length + static_cast(sizeof(unsigned)) + 1U; - char* newString = static_cast(malloc(actualLength)); - if (newString == 0) { - throwRuntimeError( - "in Json::Value::duplicateAndPrefixStringValue(): " - "Failed to allocate string value buffer"); + size_t actualLength = sizeof(length) + length + 1; + auto newString = static_cast(malloc(actualLength)); + if (newString == nullptr) { + throwRuntimeError("in Json::Value::duplicateAndPrefixStringValue(): " + "Failed to allocate string value buffer"); } *reinterpret_cast(newString) = length; memcpy(newString + sizeof(unsigned), value, length); - newString[actualLength - 1U] = 0; // to avoid buffer over-run accidents by users later + newString[actualLength - 1U] = + 0; // to avoid buffer over-run accidents by users later return newString; } -inline static void decodePrefixedString( - bool isPrefixed, char const* prefixed, - unsigned* length, char const** value) -{ +inline static void decodePrefixedString(bool isPrefixed, char const* prefixed, + unsigned* length, char const** value) { if (!isPrefixed) { *length = static_cast(strlen(prefixed)); *value = prefixed; @@ -2617,7 +2571,8 @@ inline static void decodePrefixedString( *value = prefixed + sizeof(unsigned); } } -/** Free the string duplicated by duplicateStringValue()/duplicateAndPrefixStringValue(). +/** Free the string duplicated by + * duplicateStringValue()/duplicateAndPrefixStringValue(). */ #if JSONCPP_USING_SECURE_MEMORY static inline void releasePrefixedStringValue(char* value) { @@ -2630,17 +2585,13 @@ static inline void releasePrefixedStringValue(char* value) { } static inline void releaseStringValue(char* value, unsigned length) { // length==0 => we allocated the strings memory - size_t size = (length==0) ? strlen(value) : length; + size_t size = (length == 0) ? strlen(value) : length; memset(value, 0, size); free(value); } -#else // !JSONCPP_USING_SECURE_MEMORY -static inline void releasePrefixedStringValue(char* value) { - free(value); -} -static inline void releaseStringValue(char* value, unsigned) { - free(value); -} +#else // !JSONCPP_USING_SECURE_MEMORY +static inline void releasePrefixedStringValue(char* value) { free(value); } +static inline void releaseStringValue(char* value, unsigned) { free(value); } #endif // JSONCPP_USING_SECURE_MEMORY } // namespace Json @@ -2659,58 +2610,28 @@ static inline void releaseStringValue(char* value, unsigned) { namespace Json { -Exception::Exception(JSONCPP_STRING const& msg) - : msg_(msg) -{} -Exception::~Exception() JSONCPP_NOEXCEPT -{} -char const* Exception::what() const JSONCPP_NOEXCEPT -{ - return msg_.c_str(); -} -RuntimeError::RuntimeError(JSONCPP_STRING const& msg) - : Exception(msg) -{} -LogicError::LogicError(JSONCPP_STRING const& msg) - : Exception(msg) -{} -JSONCPP_NORETURN void throwRuntimeError(JSONCPP_STRING const& msg) -{ +#if JSON_USE_EXCEPTION +Exception::Exception(String msg) : msg_(std::move(msg)) {} +Exception::~Exception() noexcept = default; +char const* Exception::what() const noexcept { return msg_.c_str(); } +RuntimeError::RuntimeError(String const& msg) : Exception(msg) {} +LogicError::LogicError(String const& msg) : Exception(msg) {} +JSONCPP_NORETURN void throwRuntimeError(String const& msg) { throw RuntimeError(msg); } -JSONCPP_NORETURN void throwLogicError(JSONCPP_STRING const& msg) -{ +JSONCPP_NORETURN void throwLogicError(String const& msg) { throw LogicError(msg); } - -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// class Value::CommentInfo -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// -// ////////////////////////////////////////////////////////////////// - -Value::CommentInfo::CommentInfo() : comment_(0) -{} - -Value::CommentInfo::~CommentInfo() { - if (comment_) - releaseStringValue(comment_, 0u); +#else // !JSON_USE_EXCEPTION +JSONCPP_NORETURN void throwRuntimeError(String const& msg) { + std::cerr << msg << std::endl; + abort(); } - -void Value::CommentInfo::setComment(const char* text, size_t len) { - if (comment_) { - releaseStringValue(comment_, 0u); - comment_ = 0; - } - JSON_ASSERT(text != 0); - JSON_ASSERT_MESSAGE( - text[0] == '\0' || text[0] == '/', - "in Json::Value::setComment(): Comments must start with /"); - // It seems that /**/ style comments are acceptable as well. - comment_ = duplicateStringValue(text, len); +JSONCPP_NORETURN void throwLogicError(String const& msg) { + std::cerr << msg << std::endl; + abort(); } +#endif // ////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////// @@ -2723,36 +2644,44 @@ void Value::CommentInfo::setComment(const char* text, size_t len) { // Notes: policy_ indicates if the string was allocated when // a string is stored. -Value::CZString::CZString(ArrayIndex aindex) : cstr_(0), index_(aindex) {} +Value::CZString::CZString(ArrayIndex index) : cstr_(nullptr), index_(index) {} -Value::CZString::CZString(char const* str, unsigned ulength, DuplicationPolicy allocate) +Value::CZString::CZString(char const* str, unsigned length, + DuplicationPolicy allocate) : cstr_(str) { // allocate != duplicate storage_.policy_ = allocate & 0x3; - storage_.length_ = ulength & 0x3FFFFFFF; + storage_.length_ = length & 0x3FFFFFFF; } Value::CZString::CZString(const CZString& other) { - cstr_ = (other.storage_.policy_ != noDuplication && other.cstr_ != 0 - ? duplicateStringValue(other.cstr_, other.storage_.length_) - : other.cstr_); - storage_.policy_ = static_cast(other.cstr_ - ? (static_cast(other.storage_.policy_) == noDuplication - ? noDuplication : duplicate) - : static_cast(other.storage_.policy_)) & 3U; + cstr_ = (other.storage_.policy_ != noDuplication && other.cstr_ != nullptr + ? duplicateStringValue(other.cstr_, other.storage_.length_) + : other.cstr_); + storage_.policy_ = + static_cast( + other.cstr_ + ? (static_cast(other.storage_.policy_) == + noDuplication + ? noDuplication + : duplicate) + : static_cast(other.storage_.policy_)) & + 3U; storage_.length_ = other.storage_.length_; } -#if JSON_HAS_RVALUE_REFERENCES Value::CZString::CZString(CZString&& other) - : cstr_(other.cstr_), index_(other.index_) { + : cstr_(other.cstr_), index_(other.index_) { other.cstr_ = nullptr; } -#endif Value::CZString::~CZString() { if (cstr_ && storage_.policy_ == duplicate) { - releaseStringValue(const_cast(cstr_), storage_.length_ + 1u); //+1 for null terminating character for sake of completeness but not actually necessary + releaseStringValue(const_cast(cstr_), + storage_.length_ + 1U); // +1 for null terminating + // character for sake of + // completeness but not actually + // necessary } } @@ -2767,36 +2696,39 @@ Value::CZString& Value::CZString::operator=(const CZString& other) { return *this; } -#if JSON_HAS_RVALUE_REFERENCES Value::CZString& Value::CZString::operator=(CZString&& other) { cstr_ = other.cstr_; index_ = other.index_; other.cstr_ = nullptr; return *this; } -#endif bool Value::CZString::operator<(const CZString& other) const { - if (!cstr_) return index_ < other.index_; - //return strcmp(cstr_, other.cstr_) < 0; + if (!cstr_) + return index_ < other.index_; + // return strcmp(cstr_, other.cstr_) < 0; // Assume both are strings. unsigned this_len = this->storage_.length_; unsigned other_len = other.storage_.length_; unsigned min_len = std::min(this_len, other_len); JSON_ASSERT(this->cstr_ && other.cstr_); int comp = memcmp(this->cstr_, other.cstr_, min_len); - if (comp < 0) return true; - if (comp > 0) return false; + if (comp < 0) + return true; + if (comp > 0) + return false; return (this_len < other_len); } bool Value::CZString::operator==(const CZString& other) const { - if (!cstr_) return index_ == other.index_; - //return strcmp(cstr_, other.cstr_) == 0; + if (!cstr_) + return index_ == other.index_; + // return strcmp(cstr_, other.cstr_) == 0; // Assume both are strings. unsigned this_len = this->storage_.length_; unsigned other_len = other.storage_.length_; - if (this_len != other_len) return false; + if (this_len != other_len) + return false; JSON_ASSERT(this->cstr_ && other.cstr_); int comp = memcmp(this->cstr_, other.cstr_, this_len); return comp == 0; @@ -2804,10 +2736,12 @@ bool Value::CZString::operator==(const CZString& other) const { ArrayIndex Value::CZString::index() const { return index_; } -//const char* Value::CZString::c_str() const { return cstr_; } +// const char* Value::CZString::c_str() const { return cstr_; } const char* Value::CZString::data() const { return cstr_; } unsigned Value::CZString::length() const { return storage_.length_; } -bool Value::CZString::isStaticString() const { return storage_.policy_ == noDuplication; } +bool Value::CZString::isStaticString() const { + return storage_.policy_ == noDuplication; +} // ////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////// @@ -2821,10 +2755,10 @@ bool Value::CZString::isStaticString() const { return storage_.policy_ == noDupl * memset( this, 0, sizeof(Value) ) * This optimization is used in ValueInternalMap fast allocator. */ -Value::Value(ValueType vtype) { +Value::Value(ValueType type) { static char const emptyString[] = ""; - initBasic(vtype); - switch (vtype) { + initBasic(type); + switch (type) { case nullValue: break; case intValue: @@ -2877,20 +2811,22 @@ Value::Value(double value) { Value::Value(const char* value) { initBasic(stringValue, true); - JSON_ASSERT_MESSAGE(value != NULL, "Null Value Passed to Value Constructor"); - value_.string_ = duplicateAndPrefixStringValue(value, static_cast(strlen(value))); + JSON_ASSERT_MESSAGE(value != nullptr, + "Null Value Passed to Value Constructor"); + value_.string_ = duplicateAndPrefixStringValue( + value, static_cast(strlen(value))); } -Value::Value(const char* beginValue, const char* endValue) { +Value::Value(const char* begin, const char* end) { initBasic(stringValue, true); value_.string_ = - duplicateAndPrefixStringValue(beginValue, static_cast(endValue - beginValue)); + duplicateAndPrefixStringValue(begin, static_cast(end - begin)); } -Value::Value(const JSONCPP_STRING& value) { +Value::Value(const String& value) { initBasic(stringValue, true); - value_.string_ = - duplicateAndPrefixStringValue(value.data(), static_cast(value.length())); + value_.string_ = duplicateAndPrefixStringValue( + value.data(), static_cast(value.length())); } Value::Value(const StaticString& value) { @@ -2898,114 +2834,44 @@ Value::Value(const StaticString& value) { value_.string_ = const_cast(value.c_str()); } -#ifdef JSON_USE_CPPTL -Value::Value(const CppTL::ConstString& value) { - initBasic(stringValue, true); - value_.string_ = duplicateAndPrefixStringValue(value, static_cast(value.length())); -} -#endif - Value::Value(bool value) { initBasic(booleanValue); value_.bool_ = value; } -Value::Value(Value const& other) - : type_(other.type_), allocated_(false) - , - comments_(0), start_(other.start_), limit_(other.limit_) -{ - switch (type_) { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - value_ = other.value_; - break; - case stringValue: - if (other.value_.string_ && other.allocated_) { - unsigned len; - char const* str; - decodePrefixedString(other.allocated_, other.value_.string_, - &len, &str); - value_.string_ = duplicateAndPrefixStringValue(str, len); - allocated_ = true; - } else { - value_.string_ = other.value_.string_; - allocated_ = false; - } - break; - case arrayValue: - case objectValue: - value_.map_ = new ObjectValues(*other.value_.map_); - break; - default: - JSON_ASSERT_UNREACHABLE; - } - if (other.comments_) { - comments_ = new CommentInfo[numberOfCommentPlacement]; - for (int comment = 0; comment < numberOfCommentPlacement; ++comment) { - const CommentInfo& otherComment = other.comments_[comment]; - if (otherComment.comment_) - comments_[comment].setComment( - otherComment.comment_, strlen(otherComment.comment_)); - } - } +Value::Value(const Value& other) { + dupPayload(other); + dupMeta(other); } -#if JSON_HAS_RVALUE_REFERENCES -// Move constructor Value::Value(Value&& other) { initBasic(nullValue); swap(other); } -#endif Value::~Value() { - switch (type_) { - case nullValue: - case intValue: - case uintValue: - case realValue: - case booleanValue: - break; - case stringValue: - if (allocated_) - releasePrefixedStringValue(value_.string_); - break; - case arrayValue: - case objectValue: - delete value_.map_; - break; - default: - JSON_ASSERT_UNREACHABLE; - } - - delete[] comments_; - + releasePayload(); value_.uint_ = 0; } -Value& Value::operator=(Value other) { - swap(other); +Value& Value::operator=(const Value& other) { + Value(other).swap(*this); + return *this; +} + +Value& Value::operator=(Value&& other) { + other.swap(*this); return *this; } void Value::swapPayload(Value& other) { - ValueType temp = type_; - type_ = other.type_; - other.type_ = temp; + std::swap(bits_, other.bits_); std::swap(value_, other.value_); - int temp2 = allocated_; - allocated_ = other.allocated_; - other.allocated_ = temp2 & 0x1; } void Value::copyPayload(const Value& other) { - type_ = other.type_; - value_ = other.value_; - allocated_ = other.allocated_; + releasePayload(); + dupPayload(other); } void Value::swap(Value& other) { @@ -3017,12 +2883,12 @@ void Value::swap(Value& other) { void Value::copy(const Value& other) { copyPayload(other); - comments_ = other.comments_; - start_ = other.start_; - limit_ = other.limit_; + dupMeta(other); } -ValueType Value::type() const { return type_; } +ValueType Value::type() const { + return static_cast(bits_.value_type_); +} int Value::compare(const Value& other) const { if (*this < other) @@ -3033,10 +2899,10 @@ int Value::compare(const Value& other) const { } bool Value::operator<(const Value& other) const { - int typeDelta = type_ - other.type_; + int typeDelta = type() - other.type(); if (typeDelta) - return typeDelta < 0 ? true : false; - switch (type_) { + return typeDelta < 0; + switch (type()) { case nullValue: return false; case intValue: @@ -3047,30 +2913,33 @@ bool Value::operator<(const Value& other) const { return value_.real_ < other.value_.real_; case booleanValue: return value_.bool_ < other.value_.bool_; - case stringValue: - { - if ((value_.string_ == 0) || (other.value_.string_ == 0)) { - if (other.value_.string_) return true; - else return false; + case stringValue: { + if ((value_.string_ == nullptr) || (other.value_.string_ == nullptr)) { + return other.value_.string_ != nullptr; } unsigned this_len; unsigned other_len; char const* this_str; char const* other_str; - decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); - decodePrefixedString(other.allocated_, other.value_.string_, &other_len, &other_str); + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); + decodePrefixedString(other.isAllocated(), other.value_.string_, &other_len, + &other_str); unsigned min_len = std::min(this_len, other_len); JSON_ASSERT(this_str && other_str); int comp = memcmp(this_str, other_str, min_len); - if (comp < 0) return true; - if (comp > 0) return false; + if (comp < 0) + return true; + if (comp > 0) + return false; return (this_len < other_len); } case arrayValue: case objectValue: { - int delta = int(value_.map_->size() - other.value_.map_->size()); - if (delta) - return delta < 0; + auto thisSize = value_.map_->size(); + auto otherSize = other.value_.map_->size(); + if (thisSize != otherSize) + return thisSize < otherSize; return (*value_.map_) < (*other.value_.map_); } default: @@ -3086,14 +2955,9 @@ bool Value::operator>=(const Value& other) const { return !(*this < other); } bool Value::operator>(const Value& other) const { return other < *this; } bool Value::operator==(const Value& other) const { - // if ( type_ != other.type_ ) - // GCC 2.95.3 says: - // attempt to take address of bit-field structure member `Json::Value::type_' - // Beats me, but a temp solves the problem. - int temp = other.type_; - if (type_ != temp) + if (type() != other.type()) return false; - switch (type_) { + switch (type()) { case nullValue: return true; case intValue: @@ -3104,18 +2968,20 @@ bool Value::operator==(const Value& other) const { return value_.real_ == other.value_.real_; case booleanValue: return value_.bool_ == other.value_.bool_; - case stringValue: - { - if ((value_.string_ == 0) || (other.value_.string_ == 0)) { + case stringValue: { + if ((value_.string_ == nullptr) || (other.value_.string_ == nullptr)) { return (value_.string_ == other.value_.string_); } unsigned this_len; unsigned other_len; char const* this_str; char const* other_str; - decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); - decodePrefixedString(other.allocated_, other.value_.string_, &other_len, &other_str); - if (this_len != other_len) return false; + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); + decodePrefixedString(other.isAllocated(), other.value_.string_, &other_len, + &other_str); + if (this_len != other_len) + return false; JSON_ASSERT(this_str && other_str); int comp = memcmp(this_str, other_str, this_len); return comp == 0; @@ -3133,47 +2999,55 @@ bool Value::operator==(const Value& other) const { bool Value::operator!=(const Value& other) const { return !(*this == other); } const char* Value::asCString() const { - JSON_ASSERT_MESSAGE(type_ == stringValue, + JSON_ASSERT_MESSAGE(type() == stringValue, "in Json::Value::asCString(): requires stringValue"); - if (value_.string_ == 0) return 0; + if (value_.string_ == nullptr) + return nullptr; unsigned this_len; char const* this_str; - decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); return this_str; } #if JSONCPP_USING_SECURE_MEMORY unsigned Value::getCStringLength() const { - JSON_ASSERT_MESSAGE(type_ == stringValue, - "in Json::Value::asCString(): requires stringValue"); - if (value_.string_ == 0) return 0; + JSON_ASSERT_MESSAGE(type() == stringValue, + "in Json::Value::asCString(): requires stringValue"); + if (value_.string_ == 0) + return 0; unsigned this_len; char const* this_str; - decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); return this_len; } #endif -bool Value::getString(char const** str, char const** cend) const { - if (type_ != stringValue) return false; - if (value_.string_ == 0) return false; +bool Value::getString(char const** begin, char const** end) const { + if (type() != stringValue) + return false; + if (value_.string_ == nullptr) + return false; unsigned length; - decodePrefixedString(this->allocated_, this->value_.string_, &length, str); - *cend = *str + length; + decodePrefixedString(this->isAllocated(), this->value_.string_, &length, + begin); + *end = *begin + length; return true; } -JSONCPP_STRING Value::asString() const { - switch (type_) { +String Value::asString() const { + switch (type()) { case nullValue: return ""; - case stringValue: - { - if (value_.string_ == 0) return ""; + case stringValue: { + if (value_.string_ == nullptr) + return ""; unsigned this_len; char const* this_str; - decodePrefixedString(this->allocated_, this->value_.string_, &this_len, &this_str); - return JSONCPP_STRING(this_str, this_len); + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); + return String(this_str, this_len); } case booleanValue: return value_.bool_ ? "true" : "false"; @@ -3188,18 +3062,8 @@ JSONCPP_STRING Value::asString() const { } } -#ifdef JSON_USE_CPPTL -CppTL::ConstString Value::asConstString() const { - unsigned len; - char const* str; - decodePrefixedString(allocated_, value_.string_, - &len, &str); - return CppTL::ConstString(str, len); -} -#endif - Value::Int Value::asInt() const { - switch (type_) { + switch (type()) { case intValue: JSON_ASSERT_MESSAGE(isInt(), "LargestInt out of Int range"); return Int(value_.int_); @@ -3221,7 +3085,7 @@ Value::Int Value::asInt() const { } Value::UInt Value::asUInt() const { - switch (type_) { + switch (type()) { case intValue: JSON_ASSERT_MESSAGE(isUInt(), "LargestInt out of UInt range"); return UInt(value_.int_); @@ -3245,7 +3109,7 @@ Value::UInt Value::asUInt() const { #if defined(JSON_HAS_INT64) Value::Int64 Value::asInt64() const { - switch (type_) { + switch (type()) { case intValue: return Int64(value_.int_); case uintValue: @@ -3266,7 +3130,7 @@ Value::Int64 Value::asInt64() const { } Value::UInt64 Value::asUInt64() const { - switch (type_) { + switch (type()) { case intValue: JSON_ASSERT_MESSAGE(isUInt64(), "LargestInt out of UInt64 range"); return UInt64(value_.int_); @@ -3304,7 +3168,7 @@ LargestUInt Value::asLargestUInt() const { } double Value::asDouble() const { - switch (type_) { + switch (type()) { case intValue: return static_cast(value_.int_); case uintValue: @@ -3326,7 +3190,7 @@ double Value::asDouble() const { } float Value::asFloat() const { - switch (type_) { + switch (type()) { case intValue: return static_cast(value_.int_); case uintValue: @@ -3341,7 +3205,7 @@ float Value::asFloat() const { case nullValue: return 0.0; case booleanValue: - return value_.bool_ ? 1.0f : 0.0f; + return value_.bool_ ? 1.0F : 0.0F; default: break; } @@ -3349,18 +3213,20 @@ float Value::asFloat() const { } bool Value::asBool() const { - switch (type_) { + switch (type()) { case booleanValue: return value_.bool_; case nullValue: return false; case intValue: - return value_.int_ ? true : false; + return value_.int_ != 0; case uintValue: - return value_.uint_ ? true : false; - case realValue: - // This is kind of strange. Not recommended. - return (value_.real_ != 0.0) ? true : false; + return value_.uint_ != 0; + case realValue: { + // According to JavaScript language zero or NaN is regarded as false + const auto value_classification = std::fpclassify(value_.real_); + return value_classification != FP_ZERO && value_classification != FP_NAN; + } default: break; } @@ -3371,30 +3237,30 @@ bool Value::isConvertibleTo(ValueType other) const { switch (other) { case nullValue: return (isNumeric() && asDouble() == 0.0) || - (type_ == booleanValue && value_.bool_ == false) || - (type_ == stringValue && asString().empty()) || - (type_ == arrayValue && value_.map_->size() == 0) || - (type_ == objectValue && value_.map_->size() == 0) || - type_ == nullValue; + (type() == booleanValue && !value_.bool_) || + (type() == stringValue && asString().empty()) || + (type() == arrayValue && value_.map_->empty()) || + (type() == objectValue && value_.map_->empty()) || + type() == nullValue; case intValue: return isInt() || - (type_ == realValue && InRange(value_.real_, minInt, maxInt)) || - type_ == booleanValue || type_ == nullValue; + (type() == realValue && InRange(value_.real_, minInt, maxInt)) || + type() == booleanValue || type() == nullValue; case uintValue: return isUInt() || - (type_ == realValue && InRange(value_.real_, 0, maxUInt)) || - type_ == booleanValue || type_ == nullValue; + (type() == realValue && InRange(value_.real_, 0, maxUInt)) || + type() == booleanValue || type() == nullValue; case realValue: - return isNumeric() || type_ == booleanValue || type_ == nullValue; + return isNumeric() || type() == booleanValue || type() == nullValue; case booleanValue: - return isNumeric() || type_ == booleanValue || type_ == nullValue; + return isNumeric() || type() == booleanValue || type() == nullValue; case stringValue: - return isNumeric() || type_ == booleanValue || type_ == stringValue || - type_ == nullValue; + return isNumeric() || type() == booleanValue || type() == stringValue || + type() == nullValue; case arrayValue: - return type_ == arrayValue || type_ == nullValue; + return type() == arrayValue || type() == nullValue; case objectValue: - return type_ == objectValue || type_ == nullValue; + return type() == objectValue || type() == nullValue; } JSON_ASSERT_UNREACHABLE; return false; @@ -3402,7 +3268,7 @@ bool Value::isConvertibleTo(ValueType other) const { /// Number of values in array or object ArrayIndex Value::size() const { - switch (type_) { + switch (type()) { case nullValue: case intValue: case uintValue: @@ -3426,20 +3292,19 @@ ArrayIndex Value::size() const { bool Value::empty() const { if (isNull() || isArray() || isObject()) - return size() == 0u; - else - return false; + return size() == 0U; + return false; } -Value::operator bool() const { return ! isNull(); } +Value::operator bool() const { return !isNull(); } void Value::clear() { - JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == arrayValue || - type_ == objectValue, + JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue || + type() == objectValue, "in Json::Value::clear(): requires complex value"); start_ = 0; limit_ = 0; - switch (type_) { + switch (type()) { case arrayValue: case objectValue: value_.map_->clear(); @@ -3450,15 +3315,15 @@ void Value::clear() { } void Value::resize(ArrayIndex newSize) { - JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == arrayValue, + JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue, "in Json::Value::resize(): requires arrayValue"); - if (type_ == nullValue) + if (type() == nullValue) *this = Value(arrayValue); ArrayIndex oldSize = size(); if (newSize == 0) clear(); else if (newSize > oldSize) - (*this)[newSize - 1]; + this->operator[](newSize - 1); else { for (ArrayIndex index = newSize; index < oldSize; ++index) { value_.map_->erase(index); @@ -3469,12 +3334,12 @@ void Value::resize(ArrayIndex newSize) { Value& Value::operator[](ArrayIndex index) { JSON_ASSERT_MESSAGE( - type_ == nullValue || type_ == arrayValue, + type() == nullValue || type() == arrayValue, "in Json::Value::operator[](ArrayIndex): requires arrayValue"); - if (type_ == nullValue) + if (type() == nullValue) *this = Value(arrayValue); CZString key(index); - ObjectValues::iterator it = value_.map_->lower_bound(key); + auto it = value_.map_->lower_bound(key); if (it != value_.map_->end() && (*it).first == key) return (*it).second; @@ -3492,9 +3357,9 @@ Value& Value::operator[](int index) { const Value& Value::operator[](ArrayIndex index) const { JSON_ASSERT_MESSAGE( - type_ == nullValue || type_ == arrayValue, + type() == nullValue || type() == arrayValue, "in Json::Value::operator[](ArrayIndex)const: requires arrayValue"); - if (type_ == nullValue) + if (type() == nullValue) return nullSingleton(); CZString key(index); ObjectValues::const_iterator it = value_.map_->find(key); @@ -3510,26 +3375,85 @@ const Value& Value::operator[](int index) const { return (*this)[ArrayIndex(index)]; } -void Value::initBasic(ValueType vtype, bool allocated) { - type_ = vtype; - allocated_ = allocated; - comments_ = 0; +void Value::initBasic(ValueType type, bool allocated) { + setType(type); + setIsAllocated(allocated); + comments_ = Comments{}; start_ = 0; limit_ = 0; } +void Value::dupPayload(const Value& other) { + setType(other.type()); + setIsAllocated(false); + switch (type()) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + value_ = other.value_; + break; + case stringValue: + if (other.value_.string_ && other.isAllocated()) { + unsigned len; + char const* str; + decodePrefixedString(other.isAllocated(), other.value_.string_, &len, + &str); + value_.string_ = duplicateAndPrefixStringValue(str, len); + setIsAllocated(true); + } else { + value_.string_ = other.value_.string_; + } + break; + case arrayValue: + case objectValue: + value_.map_ = new ObjectValues(*other.value_.map_); + break; + default: + JSON_ASSERT_UNREACHABLE; + } +} + +void Value::releasePayload() { + switch (type()) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + break; + case stringValue: + if (isAllocated()) + releasePrefixedStringValue(value_.string_); + break; + case arrayValue: + case objectValue: + delete value_.map_; + break; + default: + JSON_ASSERT_UNREACHABLE; + } +} + +void Value::dupMeta(const Value& other) { + comments_ = other.comments_; + start_ = other.start_; + limit_ = other.limit_; +} + // Access an object value by name, create a null member if it does not exist. // @pre Type of '*this' is object or null. // @param key is null-terminated. Value& Value::resolveReference(const char* key) { JSON_ASSERT_MESSAGE( - type_ == nullValue || type_ == objectValue, + type() == nullValue || type() == objectValue, "in Json::Value::resolveReference(): requires objectValue"); - if (type_ == nullValue) + if (type() == nullValue) *this = Value(objectValue); - CZString actualKey( - key, static_cast(strlen(key)), CZString::noDuplication); // NOTE! - ObjectValues::iterator it = value_.map_->lower_bound(actualKey); + CZString actualKey(key, static_cast(strlen(key)), + CZString::noDuplication); // NOTE! + auto it = value_.map_->lower_bound(actualKey); if (it != value_.map_->end() && (*it).first == actualKey) return (*it).second; @@ -3540,16 +3464,15 @@ Value& Value::resolveReference(const char* key) { } // @param key is not null-terminated. -Value& Value::resolveReference(char const* key, char const* cend) -{ +Value& Value::resolveReference(char const* key, char const* end) { JSON_ASSERT_MESSAGE( - type_ == nullValue || type_ == objectValue, + type() == nullValue || type() == objectValue, "in Json::Value::resolveReference(key, end): requires objectValue"); - if (type_ == nullValue) + if (type() == nullValue) *this = Value(objectValue); - CZString actualKey( - key, static_cast(cend-key), CZString::duplicateOnCopy); - ObjectValues::iterator it = value_.map_->lower_bound(actualKey); + CZString actualKey(key, static_cast(end - key), + CZString::duplicateOnCopy); + auto it = value_.map_->lower_bound(actualKey); if (it != value_.map_->end() && (*it).first == actualKey) return (*it).second; @@ -3566,27 +3489,35 @@ Value Value::get(ArrayIndex index, const Value& defaultValue) const { bool Value::isValidIndex(ArrayIndex index) const { return index < size(); } -Value const* Value::find(char const* key, char const* cend) const -{ - JSON_ASSERT_MESSAGE( - type_ == nullValue || type_ == objectValue, - "in Json::Value::find(key, end, found): requires objectValue or nullValue"); - if (type_ == nullValue) return NULL; - CZString actualKey(key, static_cast(cend-key), CZString::noDuplication); +Value const* Value::find(char const* begin, char const* end) const { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == objectValue, + "in Json::Value::find(begin, end): requires " + "objectValue or nullValue"); + if (type() == nullValue) + return nullptr; + CZString actualKey(begin, static_cast(end - begin), + CZString::noDuplication); ObjectValues::const_iterator it = value_.map_->find(actualKey); - if (it == value_.map_->end()) return NULL; + if (it == value_.map_->end()) + return nullptr; return &(*it).second; } -const Value& Value::operator[](const char* key) const -{ +Value* Value::demand(char const* begin, char const* end) { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == objectValue, + "in Json::Value::demand(begin, end): requires " + "objectValue or nullValue"); + return &resolveReference(begin, end); +} +const Value& Value::operator[](const char* key) const { Value const* found = find(key, key + strlen(key)); - if (!found) return nullSingleton(); + if (!found) + return nullSingleton(); return *found; } -Value const& Value::operator[](JSONCPP_STRING const& key) const -{ +Value const& Value::operator[](const String& key) const { Value const* found = find(key.data(), key.data() + key.length()); - if (!found) return nullSingleton(); + if (!found) + return nullSingleton(); return *found; } @@ -3594,7 +3525,7 @@ Value& Value::operator[](const char* key) { return resolveReference(key, key + strlen(key)); } -Value& Value::operator[](const JSONCPP_STRING& key) { +Value& Value::operator[](const String& key) { return resolveReference(key.data(), key.data() + key.length()); } @@ -3602,178 +3533,140 @@ Value& Value::operator[](const StaticString& key) { return resolveReference(key.c_str()); } -#ifdef JSON_USE_CPPTL -Value& Value::operator[](const CppTL::ConstString& key) { - return resolveReference(key.c_str(), key.end_c_str()); +Value& Value::append(const Value& value) { return append(Value(value)); } + +Value& Value::append(Value&& value) { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue, + "in Json::Value::append: requires arrayValue"); + if (type() == nullValue) { + *this = Value(arrayValue); + } + return this->value_.map_->emplace(size(), std::move(value)).first->second; } -Value const& Value::operator[](CppTL::ConstString const& key) const -{ - Value const* found = find(key.c_str(), key.end_c_str()); - if (!found) return nullSingleton(); - return *found; + +bool Value::insert(ArrayIndex index, const Value& newValue) { + return insert(index, Value(newValue)); } -#endif -Value& Value::append(const Value& value) { return (*this)[size()] = value; } +bool Value::insert(ArrayIndex index, Value&& newValue) { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue, + "in Json::Value::insert: requires arrayValue"); + ArrayIndex length = size(); + if (index > length) { + return false; + } + for (ArrayIndex i = length; i > index; i--) { + (*this)[i] = std::move((*this)[i - 1]); + } + (*this)[index] = std::move(newValue); + return true; +} -#if JSON_HAS_RVALUE_REFERENCES - Value& Value::append(Value&& value) { return (*this)[size()] = std::move(value); } -#endif - -Value Value::get(char const* key, char const* cend, Value const& defaultValue) const -{ - Value const* found = find(key, cend); +Value Value::get(char const* begin, char const* end, + Value const& defaultValue) const { + Value const* found = find(begin, end); return !found ? defaultValue : *found; } -Value Value::get(char const* key, Value const& defaultValue) const -{ +Value Value::get(char const* key, Value const& defaultValue) const { return get(key, key + strlen(key), defaultValue); } -Value Value::get(JSONCPP_STRING const& key, Value const& defaultValue) const -{ +Value Value::get(String const& key, Value const& defaultValue) const { return get(key.data(), key.data() + key.length(), defaultValue); } - -bool Value::removeMember(const char* key, const char* cend, Value* removed) -{ - if (type_ != objectValue) { +bool Value::removeMember(const char* begin, const char* end, Value* removed) { + if (type() != objectValue) { return false; } - CZString actualKey(key, static_cast(cend-key), CZString::noDuplication); - ObjectValues::iterator it = value_.map_->find(actualKey); + CZString actualKey(begin, static_cast(end - begin), + CZString::noDuplication); + auto it = value_.map_->find(actualKey); if (it == value_.map_->end()) return false; - *removed = it->second; + if (removed) + *removed = std::move(it->second); value_.map_->erase(it); return true; } -bool Value::removeMember(const char* key, Value* removed) -{ +bool Value::removeMember(const char* key, Value* removed) { return removeMember(key, key + strlen(key), removed); } -bool Value::removeMember(JSONCPP_STRING const& key, Value* removed) -{ +bool Value::removeMember(String const& key, Value* removed) { return removeMember(key.data(), key.data() + key.length(), removed); } -void Value::removeMember(const char* key) -{ - JSON_ASSERT_MESSAGE(type_ == nullValue || type_ == objectValue, +void Value::removeMember(const char* key) { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == objectValue, "in Json::Value::removeMember(): requires objectValue"); - if (type_ == nullValue) + if (type() == nullValue) return; CZString actualKey(key, unsigned(strlen(key)), CZString::noDuplication); value_.map_->erase(actualKey); } -void Value::removeMember(const JSONCPP_STRING& key) -{ - removeMember(key.c_str()); -} +void Value::removeMember(const String& key) { removeMember(key.c_str()); } bool Value::removeIndex(ArrayIndex index, Value* removed) { - if (type_ != arrayValue) { + if (type() != arrayValue) { return false; } CZString key(index); - ObjectValues::iterator it = value_.map_->find(key); + auto it = value_.map_->find(key); if (it == value_.map_->end()) { return false; } - *removed = it->second; + if (removed) + *removed = it->second; ArrayIndex oldSize = size(); // shift left all items left, into the place of the "removed" - for (ArrayIndex i = index; i < (oldSize - 1); ++i){ + for (ArrayIndex i = index; i < (oldSize - 1); ++i) { CZString keey(i); (*value_.map_)[keey] = (*this)[i + 1]; } // erase the last one ("leftover") CZString keyLast(oldSize - 1); - ObjectValues::iterator itLast = value_.map_->find(keyLast); + auto itLast = value_.map_->find(keyLast); value_.map_->erase(itLast); return true; } -#ifdef JSON_USE_CPPTL -Value Value::get(const CppTL::ConstString& key, - const Value& defaultValue) const { - return get(key.c_str(), key.end_c_str(), defaultValue); +bool Value::isMember(char const* begin, char const* end) const { + Value const* value = find(begin, end); + return nullptr != value; } -#endif - -bool Value::isMember(char const* key, char const* cend) const -{ - Value const* value = find(key, cend); - return NULL != value; -} -bool Value::isMember(char const* key) const -{ +bool Value::isMember(char const* key) const { return isMember(key, key + strlen(key)); } -bool Value::isMember(JSONCPP_STRING const& key) const -{ +bool Value::isMember(String const& key) const { return isMember(key.data(), key.data() + key.length()); } -#ifdef JSON_USE_CPPTL -bool Value::isMember(const CppTL::ConstString& key) const { - return isMember(key.c_str(), key.end_c_str()); -} -#endif - Value::Members Value::getMemberNames() const { JSON_ASSERT_MESSAGE( - type_ == nullValue || type_ == objectValue, + type() == nullValue || type() == objectValue, "in Json::Value::getMemberNames(), value must be objectValue"); - if (type_ == nullValue) + if (type() == nullValue) return Value::Members(); Members members; members.reserve(value_.map_->size()); ObjectValues::const_iterator it = value_.map_->begin(); ObjectValues::const_iterator itEnd = value_.map_->end(); for (; it != itEnd; ++it) { - members.push_back(JSONCPP_STRING((*it).first.data(), - (*it).first.length())); + members.push_back(String((*it).first.data(), (*it).first.length())); } return members; } -// -//# ifdef JSON_USE_CPPTL -// EnumMemberNames -// Value::enumMemberNames() const -//{ -// if ( type_ == objectValue ) -// { -// return CppTL::Enum::any( CppTL::Enum::transform( -// CppTL::Enum::keys( *(value_.map_), CppTL::Type() ), -// MemberNamesTransform() ) ); -// } -// return EnumMemberNames(); -//} -// -// -// EnumValues -// Value::enumValues() const -//{ -// if ( type_ == objectValue || type_ == arrayValue ) -// return CppTL::Enum::anyValues( *(value_.map_), -// CppTL::Type() ); -// return EnumValues(); -//} -// -//# endif static bool IsIntegral(double d) { double integral_part; return modf(d, &integral_part) == 0.0; } -bool Value::isNull() const { return type_ == nullValue; } +bool Value::isNull() const { return type() == nullValue; } -bool Value::isBool() const { return type_ == booleanValue; } +bool Value::isBool() const { return type() == booleanValue; } bool Value::isInt() const { - switch (type_) { + switch (type()) { case intValue: #if defined(JSON_HAS_INT64) return value_.int_ >= minInt && value_.int_ <= maxInt; @@ -3792,7 +3685,7 @@ bool Value::isInt() const { } bool Value::isUInt() const { - switch (type_) { + switch (type()) { case intValue: #if defined(JSON_HAS_INT64) return value_.int_ >= 0 && LargestUInt(value_.int_) <= LargestUInt(maxUInt); @@ -3816,7 +3709,7 @@ bool Value::isUInt() const { bool Value::isInt64() const { #if defined(JSON_HAS_INT64) - switch (type_) { + switch (type()) { case intValue: return true; case uintValue: @@ -3836,7 +3729,7 @@ bool Value::isInt64() const { bool Value::isUInt64() const { #if defined(JSON_HAS_INT64) - switch (type_) { + switch (type()) { case intValue: return value_.int_ >= 0; case uintValue: @@ -3855,61 +3748,92 @@ bool Value::isUInt64() const { } bool Value::isIntegral() const { - switch (type_) { - case intValue: - case uintValue: - return true; - case realValue: + switch (type()) { + case intValue: + case uintValue: + return true; + case realValue: #if defined(JSON_HAS_INT64) - // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a - // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we - // require the value to be strictly less than the limit. - return value_.real_ >= double(minInt64) && value_.real_ < maxUInt64AsDouble && IsIntegral(value_.real_); + // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a + // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we + // require the value to be strictly less than the limit. + return value_.real_ >= double(minInt64) && + value_.real_ < maxUInt64AsDouble && IsIntegral(value_.real_); #else - return value_.real_ >= minInt && value_.real_ <= maxUInt && IsIntegral(value_.real_); + return value_.real_ >= minInt && value_.real_ <= maxUInt && + IsIntegral(value_.real_); #endif // JSON_HAS_INT64 - default: - break; + default: + break; } return false; } -bool Value::isDouble() const { return type_ == intValue || type_ == uintValue || type_ == realValue; } +bool Value::isDouble() const { + return type() == intValue || type() == uintValue || type() == realValue; +} bool Value::isNumeric() const { return isDouble(); } -bool Value::isString() const { return type_ == stringValue; } +bool Value::isString() const { return type() == stringValue; } -bool Value::isArray() const { return type_ == arrayValue; } +bool Value::isArray() const { return type() == arrayValue; } -bool Value::isObject() const { return type_ == objectValue; } +bool Value::isObject() const { return type() == objectValue; } -void Value::setComment(const char* comment, size_t len, CommentPlacement placement) { - if (!comments_) - comments_ = new CommentInfo[numberOfCommentPlacement]; - if ((len > 0) && (comment[len-1] == '\n')) { - // Always discard trailing newline, to aid indentation. - len -= 1; +Value::Comments::Comments(const Comments& that) + : ptr_{cloneUnique(that.ptr_)} {} + +Value::Comments::Comments(Comments&& that) : ptr_{std::move(that.ptr_)} {} + +Value::Comments& Value::Comments::operator=(const Comments& that) { + ptr_ = cloneUnique(that.ptr_); + return *this; +} + +Value::Comments& Value::Comments::operator=(Comments&& that) { + ptr_ = std::move(that.ptr_); + return *this; +} + +bool Value::Comments::has(CommentPlacement slot) const { + return ptr_ && !(*ptr_)[slot].empty(); +} + +String Value::Comments::get(CommentPlacement slot) const { + if (!ptr_) + return {}; + return (*ptr_)[slot]; +} + +void Value::Comments::set(CommentPlacement slot, String comment) { + if (!ptr_) { + ptr_ = std::unique_ptr(new Array()); + } + // check comments array boundry. + if (slot < CommentPlacement::numberOfCommentPlacement) { + (*ptr_)[slot] = std::move(comment); } - comments_[placement].setComment(comment, len); } -void Value::setComment(const char* comment, CommentPlacement placement) { - setComment(comment, strlen(comment), placement); -} - -void Value::setComment(const JSONCPP_STRING& comment, CommentPlacement placement) { - setComment(comment.c_str(), comment.length(), placement); +void Value::setComment(String comment, CommentPlacement placement) { + if (!comment.empty() && (comment.back() == '\n')) { + // Always discard trailing newline, to aid indentation. + comment.pop_back(); + } + JSON_ASSERT(!comment.empty()); + JSON_ASSERT_MESSAGE( + comment[0] == '\0' || comment[0] == '/', + "in Json::Value::setComment(): Comments must start with /"); + comments_.set(placement, std::move(comment)); } bool Value::hasComment(CommentPlacement placement) const { - return comments_ != 0 && comments_[placement].comment_ != 0; + return comments_.has(placement); } -JSONCPP_STRING Value::getComment(CommentPlacement placement) const { - if (hasComment(placement)) - return comments_[placement].comment_; - return ""; +String Value::getComment(CommentPlacement placement) const { + return comments_.get(placement); } void Value::setOffsetStart(ptrdiff_t start) { start_ = start; } @@ -3920,18 +3844,18 @@ ptrdiff_t Value::getOffsetStart() const { return start_; } ptrdiff_t Value::getOffsetLimit() const { return limit_; } -JSONCPP_STRING Value::toStyledString() const { +String Value::toStyledString() const { StreamWriterBuilder builder; - JSONCPP_STRING out = this->hasComment(commentBefore) ? "\n" : ""; + String out = this->hasComment(commentBefore) ? "\n" : ""; out += Json::writeString(builder, *this); - out += "\n"; + out += '\n'; return out; } Value::const_iterator Value::begin() const { - switch (type_) { + switch (type()) { case arrayValue: case objectValue: if (value_.map_) @@ -3940,11 +3864,11 @@ Value::const_iterator Value::begin() const { default: break; } - return const_iterator(); + return {}; } Value::const_iterator Value::end() const { - switch (type_) { + switch (type()) { case arrayValue: case objectValue: if (value_.map_) @@ -3953,11 +3877,11 @@ Value::const_iterator Value::end() const { default: break; } - return const_iterator(); + return {}; } Value::iterator Value::begin() { - switch (type_) { + switch (type()) { case arrayValue: case objectValue: if (value_.map_) @@ -3970,7 +3894,7 @@ Value::iterator Value::begin() { } Value::iterator Value::end() { - switch (type_) { + switch (type()) { case arrayValue: case objectValue: if (value_.map_) @@ -3985,25 +3909,20 @@ Value::iterator Value::end() { // class PathArgument // ////////////////////////////////////////////////////////////////// -PathArgument::PathArgument() : key_(), index_(), kind_(kindNone) {} +PathArgument::PathArgument() = default; PathArgument::PathArgument(ArrayIndex index) - : key_(), index_(index), kind_(kindIndex) {} + : index_(index), kind_(kindIndex) {} -PathArgument::PathArgument(const char* key) - : key_(key), index_(), kind_(kindKey) {} +PathArgument::PathArgument(const char* key) : key_(key), kind_(kindKey) {} -PathArgument::PathArgument(const JSONCPP_STRING& key) - : key_(key.c_str()), index_(), kind_(kindKey) {} +PathArgument::PathArgument(String key) : key_(std::move(key)), kind_(kindKey) {} // class Path // ////////////////////////////////////////////////////////////////// -Path::Path(const JSONCPP_STRING& path, - const PathArgument& a1, - const PathArgument& a2, - const PathArgument& a3, - const PathArgument& a4, +Path::Path(const String& path, const PathArgument& a1, const PathArgument& a2, + const PathArgument& a3, const PathArgument& a4, const PathArgument& a5) { InArgs in; in.reserve(5); @@ -4015,10 +3934,10 @@ Path::Path(const JSONCPP_STRING& path, makePath(path, in); } -void Path::makePath(const JSONCPP_STRING& path, const InArgs& in) { +void Path::makePath(const String& path, const InArgs& in) { const char* current = path.c_str(); const char* end = current + path.length(); - InArgs::const_iterator itInArg = in.begin(); + auto itInArg = in.begin(); while (current != end) { if (*current == '[') { ++current; @@ -4041,13 +3960,12 @@ void Path::makePath(const JSONCPP_STRING& path, const InArgs& in) { const char* beginName = current; while (current != end && !strchr("[.", *current)) ++current; - args_.push_back(JSONCPP_STRING(beginName, current)); + args_.push_back(String(beginName, current)); } } } -void Path::addPathInArg(const JSONCPP_STRING& /*path*/, - const InArgs& in, +void Path::addPathInArg(const String& /*path*/, const InArgs& in, InArgs::const_iterator& itInArg, PathArgument::Kind kind) { if (itInArg == in.end()) { @@ -4059,30 +3977,29 @@ void Path::addPathInArg(const JSONCPP_STRING& /*path*/, } } -void Path::invalidPath(const JSONCPP_STRING& /*path*/, int /*location*/) { +void Path::invalidPath(const String& /*path*/, int /*location*/) { // Error: invalid path. } const Value& Path::resolve(const Value& root) const { const Value* node = &root; - for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) { - const PathArgument& arg = *it; + for (const auto& arg : args_) { if (arg.kind_ == PathArgument::kindIndex) { if (!node->isArray() || !node->isValidIndex(arg.index_)) { - // Error: unable to resolve path (array value expected at position... - return Value::null; + // Error: unable to resolve path (array value expected at position... ) + return Value::nullSingleton(); } node = &((*node)[arg.index_]); } else if (arg.kind_ == PathArgument::kindKey) { if (!node->isObject()) { // Error: unable to resolve path (object value expected at position...) - return Value::null; + return Value::nullSingleton(); } node = &((*node)[arg.key_]); if (node == &Value::nullSingleton()) { // Error: unable to resolve path (object has no member named '' at // position...) - return Value::null; + return Value::nullSingleton(); } } } @@ -4091,8 +4008,7 @@ const Value& Path::resolve(const Value& root) const { Value Path::resolve(const Value& root, const Value& defaultValue) const { const Value* node = &root; - for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) { - const PathArgument& arg = *it; + for (const auto& arg : args_) { if (arg.kind_ == PathArgument::kindIndex) { if (!node->isArray() || !node->isValidIndex(arg.index_)) return defaultValue; @@ -4110,8 +4026,7 @@ Value Path::resolve(const Value& root, const Value& defaultValue) const { Value& Path::make(Value& root) const { Value* node = &root; - for (Args::const_iterator it = args_.begin(); it != args_.end(); ++it) { - const PathArgument& arg = *it; + for (const auto& arg : args_) { if (arg.kind_ == PathArgument::kindIndex) { if (!node->isArray()) { // Error: node is not an array at position ... @@ -4148,71 +4063,81 @@ Value& Path::make(Value& root) const { // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE #if !defined(JSON_IS_AMALGAMATION) -#include #include "json_tool.h" +#include #endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include #include #include +#include #include #include -#include -#include -#include + +#if __cplusplus >= 201103L +#include #include -#if defined(_MSC_VER) && _MSC_VER >= 1200 && _MSC_VER < 1800 // Between VC++ 6.0 and VC++ 11.0 +#if !defined(isnan) +#define isnan std::isnan +#endif + +#if !defined(isfinite) +#define isfinite std::isfinite +#endif + +#else +#include +#include + +#if defined(_MSC_VER) +#if !defined(isnan) +#include +#define isnan _isnan +#endif + +#if !defined(isfinite) #include #define isfinite _finite -#elif defined(__sun) && defined(__SVR4) //Solaris +#endif + +#if !defined(_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES) +#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 +#endif //_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES + +#endif //_MSC_VER + +#if defined(__sun) && defined(__SVR4) // Solaris #if !defined(isfinite) #include #define isfinite finite #endif -#elif defined(_AIX) -#if !defined(isfinite) -#include -#define isfinite finite #endif -#elif defined(__hpux) + +#if defined(__hpux) #if !defined(isfinite) #if defined(__ia64) && !defined(finite) -#define isfinite(x) ((sizeof(x) == sizeof(float) ? \ - _Isfinitef(x) : _IsFinite(x))) -#else -#include +#define isfinite(x) \ + ((sizeof(x) == sizeof(float) ? _Isfinitef(x) : _IsFinite(x))) +#endif +#endif +#endif + +#if !defined(isnan) +// IEEE standard states that NaN values will not compare to themselves +#define isnan(x) (x != x) +#endif + +#if !defined(__APPLE__) +#if !defined(isfinite) #define isfinite finite #endif #endif -#else -#include -#if !(defined(__QNXNTO__)) // QNX already defines isfinite -#define isfinite std::isfinite -#endif #endif #if defined(_MSC_VER) -#if !defined(WINCE) && defined(__STDC_SECURE_LIB__) && _MSC_VER >= 1500 // VC++ 9.0 and above -#define snprintf sprintf_s -#elif _MSC_VER >= 1900 // VC++ 14.0 and above -#define snprintf std::snprintf -#else -#define snprintf _snprintf -#endif -#elif defined(__ANDROID__) || defined(__QNXNTO__) -#define snprintf snprintf -#elif __cplusplus >= 201103L -#if !defined(__MINGW32__) && !defined(__CYGWIN__) -#define snprintf std::snprintf -#endif -#endif - -#if defined(__BORLANDC__) -#include -#define isfinite _finite -#define snprintf _snprintf -#endif - -#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0 // Disable warning about strdup being deprecated. #pragma warning(disable : 4996) #endif @@ -4220,12 +4145,12 @@ Value& Path::make(Value& root) const { namespace Json { #if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520) -typedef std::unique_ptr StreamWriterPtr; +using StreamWriterPtr = std::unique_ptr; #else -typedef std::auto_ptr StreamWriterPtr; +using StreamWriterPtr = std::auto_ptr; #endif -JSONCPP_STRING valueToString(LargestInt value) { +String valueToString(LargestInt value) { UIntToStringBuffer buffer; char* current = buffer + sizeof(buffer); if (value == Value::minLargestInt) { @@ -4241,7 +4166,7 @@ JSONCPP_STRING valueToString(LargestInt value) { return current; } -JSONCPP_STRING valueToString(LargestUInt value) { +String valueToString(LargestUInt value) { UIntToStringBuffer buffer; char* current = buffer + sizeof(buffer); uintToString(value, current); @@ -4251,67 +4176,70 @@ JSONCPP_STRING valueToString(LargestUInt value) { #if defined(JSON_HAS_INT64) -JSONCPP_STRING valueToString(Int value) { - return valueToString(LargestInt(value)); -} +String valueToString(Int value) { return valueToString(LargestInt(value)); } -JSONCPP_STRING valueToString(UInt value) { - return valueToString(LargestUInt(value)); -} +String valueToString(UInt value) { return valueToString(LargestUInt(value)); } #endif // # if defined(JSON_HAS_INT64) namespace { -JSONCPP_STRING valueToString(double value, bool useSpecialFloats, unsigned int precision) { - // Allocate a buffer that is more than large enough to store the 16 digits of - // precision requested below. - char buffer[36]; - int len = -1; - - char formatString[15]; - snprintf(formatString, sizeof(formatString), "%%.%ug", precision); - +String valueToString(double value, bool useSpecialFloats, + unsigned int precision, PrecisionType precisionType) { // Print into the buffer. We need not request the alternative representation // that always has a decimal point because JSON doesn't distinguish the // concepts of reals and integers. - if (isfinite(value)) { - len = snprintf(buffer, sizeof(buffer), formatString, value); - fixNumericLocale(buffer, buffer + len); - - // try to ensure we preserve the fact that this was given to us as a double on input - if (!strchr(buffer, '.') && !strchr(buffer, 'e')) { - strcat(buffer, ".0"); - } - - } else { - // IEEE standard states that NaN values will not compare to themselves - if (value != value) { - len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "NaN" : "null"); - } else if (value < 0) { - len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "-Infinity" : "-1e+9999"); - } else { - len = snprintf(buffer, sizeof(buffer), useSpecialFloats ? "Infinity" : "1e+9999"); - } + if (!isfinite(value)) { + static const char* const reps[2][3] = {{"NaN", "-Infinity", "Infinity"}, + {"null", "-1e+9999", "1e+9999"}}; + return reps[useSpecialFloats ? 0 : 1] + [isnan(value) ? 0 : (value < 0) ? 1 : 2]; + } + + String buffer(size_t(36), '\0'); + while (true) { + int len = jsoncpp_snprintf( + &*buffer.begin(), buffer.size(), + (precisionType == PrecisionType::significantDigits) ? "%.*g" : "%.*f", + precision, value); + assert(len >= 0); + auto wouldPrint = static_cast(len); + if (wouldPrint >= buffer.size()) { + buffer.resize(wouldPrint + 1); + continue; + } + buffer.resize(wouldPrint); + break; + } + + buffer.erase(fixNumericLocale(buffer.begin(), buffer.end()), buffer.end()); + + // strip the zero padding from the right + if (precisionType == PrecisionType::decimalPlaces) { + buffer.erase(fixZerosInTheEnd(buffer.begin(), buffer.end()), buffer.end()); + } + + // try to ensure we preserve the fact that this was given to us as a double on + // input + if (buffer.find('.') == buffer.npos && buffer.find('e') == buffer.npos) { + buffer += ".0"; } - assert(len >= 0); return buffer; } +} // namespace + +String valueToString(double value, unsigned int precision, + PrecisionType precisionType) { + return valueToString(value, false, precision, precisionType); } -JSONCPP_STRING valueToString(double value) { return valueToString(value, false, 17); } +String valueToString(bool value) { return value ? "true" : "false"; } -JSONCPP_STRING valueToString(bool value) { return value ? "true" : "false"; } - -static bool isAnyCharRequiredQuoting(char const* s, size_t n) { +static bool doesAnyCharRequireEscaping(char const* s, size_t n) { assert(s || !n); - char const* const end = s + n; - for (char const* cur = s; cur < end; ++cur) { - if (*cur == '\\' || *cur == '\"' || *cur < ' ' - || static_cast(*cur) < 0x80) - return true; - } - return false; + return std::any_of(s, s + n, [](unsigned char c) { + return c == '\\' || c == '"' || c < 0x20 || c > 0x7F; + }); } static unsigned int utf8ToCodepoint(const char*& s, const char* e) { @@ -4326,8 +4254,8 @@ static unsigned int utf8ToCodepoint(const char*& s, const char* e) { if (e - s < 2) return REPLACEMENT_CHARACTER; - unsigned int calculated = ((firstByte & 0x1F) << 6) - | (static_cast(s[1]) & 0x3F); + unsigned int calculated = + ((firstByte & 0x1F) << 6) | (static_cast(s[1]) & 0x3F); s += 1; // oversized encoded characters are invalid return calculated < 0x80 ? REPLACEMENT_CHARACTER : calculated; @@ -4337,9 +4265,9 @@ static unsigned int utf8ToCodepoint(const char*& s, const char* e) { if (e - s < 3) return REPLACEMENT_CHARACTER; - unsigned int calculated = ((firstByte & 0x0F) << 12) - | ((static_cast(s[1]) & 0x3F) << 6) - | (static_cast(s[2]) & 0x3F); + unsigned int calculated = ((firstByte & 0x0F) << 12) | + ((static_cast(s[1]) & 0x3F) << 6) | + (static_cast(s[2]) & 0x3F); s += 2; // surrogates aren't valid codepoints itself // shouldn't be UTF-8 encoded @@ -4353,10 +4281,10 @@ static unsigned int utf8ToCodepoint(const char*& s, const char* e) { if (e - s < 4) return REPLACEMENT_CHARACTER; - unsigned int calculated = ((firstByte & 0x07) << 24) - | ((static_cast(s[1]) & 0x3F) << 12) - | ((static_cast(s[2]) & 0x3F) << 6) - | (static_cast(s[3]) & 0x3F); + unsigned int calculated = ((firstByte & 0x07) << 18) | + ((static_cast(s[1]) & 0x3F) << 12) | + ((static_cast(s[2]) & 0x3F) << 6) | + (static_cast(s[3]) & 0x3F); s += 3; // oversized encoded characters are invalid return calculated < 0x10000 ? REPLACEMENT_CHARACTER : calculated; @@ -4365,28 +4293,27 @@ static unsigned int utf8ToCodepoint(const char*& s, const char* e) { return REPLACEMENT_CHARACTER; } -static const char hex2[] = - "000102030405060708090a0b0c0d0e0f" - "101112131415161718191a1b1c1d1e1f" - "202122232425262728292a2b2c2d2e2f" - "303132333435363738393a3b3c3d3e3f" - "404142434445464748494a4b4c4d4e4f" - "505152535455565758595a5b5c5d5e5f" - "606162636465666768696a6b6c6d6e6f" - "707172737475767778797a7b7c7d7e7f" - "808182838485868788898a8b8c8d8e8f" - "909192939495969798999a9b9c9d9e9f" - "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" - "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" - "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" - "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" - "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" - "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"; +static const char hex2[] = "000102030405060708090a0b0c0d0e0f" + "101112131415161718191a1b1c1d1e1f" + "202122232425262728292a2b2c2d2e2f" + "303132333435363738393a3b3c3d3e3f" + "404142434445464748494a4b4c4d4e4f" + "505152535455565758595a5b5c5d5e5f" + "606162636465666768696a6b6c6d6e6f" + "707172737475767778797a7b7c7d7e7f" + "808182838485868788898a8b8c8d8e8f" + "909192939495969798999a9b9c9d9e9f" + "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" + "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" + "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" + "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" + "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" + "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"; -static JSONCPP_STRING toHex16Bit(unsigned int x) { +static String toHex16Bit(unsigned int x) { const unsigned int hi = (x >> 8) & 0xff; const unsigned int lo = x & 0xff; - JSONCPP_STRING result(4, ' '); + String result(4, ' '); result[0] = hex2[2 * hi]; result[1] = hex2[2 * hi + 1]; result[2] = hex2[2 * lo]; @@ -4394,18 +4321,26 @@ static JSONCPP_STRING toHex16Bit(unsigned int x) { return result; } -static JSONCPP_STRING valueToQuotedStringN(const char* value, unsigned length) { - if (value == NULL) +static void appendRaw(String& result, unsigned ch) { + result += static_cast(ch); +} + +static void appendHex(String& result, unsigned ch) { + result.append("\\u").append(toHex16Bit(ch)); +} + +static String valueToQuotedStringN(const char* value, unsigned length, + bool emitUTF8 = false) { + if (value == nullptr) return ""; - if (!isAnyCharRequiredQuoting(value, length)) - return JSONCPP_STRING("\"") + value + "\""; + if (!doesAnyCharRequireEscaping(value, length)) + return String("\"") + value + "\""; // We have to walk value and escape any special characters. - // Appending to JSONCPP_STRING is not efficient, but this should be rare. + // Appending to String is not efficient, but this should be rare. // (Note: forward slashes are *not* rare, but I am not escaping them.) - JSONCPP_STRING::size_type maxsize = - length * 2 + 3; // allescaped+quotes+NULL - JSONCPP_STRING result; + String::size_type maxsize = length * 2 + 3; // allescaped+quotes+NULL + String result; result.reserve(maxsize); // to avoid lots of mallocs result += "\""; char const* end = value + length; @@ -4441,45 +4376,50 @@ static JSONCPP_STRING valueToQuotedStringN(const char* value, unsigned length) { // Should add a flag to allow this compatibility mode and prevent this // sequence from occurring. default: { - unsigned int cp = utf8ToCodepoint(c, end); - // don't escape non-control characters - // (short escape sequence are applied above) - if (cp < 0x80 && cp >= 0x20) - result += static_cast(cp); - else if (cp < 0x10000) { // codepoint is in Basic Multilingual Plane - result += "\\u"; - result += toHex16Bit(cp); + if (emitUTF8) { + unsigned codepoint = static_cast(*c); + if (codepoint < 0x20) { + appendHex(result, codepoint); + } else { + appendRaw(result, codepoint); } - else { // codepoint is not in Basic Multilingual Plane - // convert to surrogate pair first - cp -= 0x10000; - result += "\\u"; - result += toHex16Bit((cp >> 10) + 0xD800); - result += "\\u"; - result += toHex16Bit((cp & 0x3FF) + 0xDC00); + } else { + unsigned codepoint = utf8ToCodepoint(c, end); // modifies `c` + if (codepoint < 0x20) { + appendHex(result, codepoint); + } else if (codepoint < 0x80) { + appendRaw(result, codepoint); + } else if (codepoint < 0x10000) { + // Basic Multilingual Plane + appendHex(result, codepoint); + } else { + // Extended Unicode. Encode 20 bits as a surrogate pair. + codepoint -= 0x10000; + appendHex(result, 0xd800 + ((codepoint >> 10) & 0x3ff)); + appendHex(result, 0xdc00 + (codepoint & 0x3ff)); } } - break; + } break; } } result += "\""; return result; } -JSONCPP_STRING valueToQuotedString(const char* value) { +String valueToQuotedString(const char* value) { return valueToQuotedStringN(value, static_cast(strlen(value))); } // Class Writer // ////////////////////////////////////////////////////////////////// -Writer::~Writer() {} +Writer::~Writer() = default; // Class FastWriter // ////////////////////////////////////////////////////////////////// FastWriter::FastWriter() - : yamlCompatibilityEnabled_(false), dropNullPlaceholders_(false), - omitEndingLineFeed_(false) {} + + = default; void FastWriter::enableYAMLCompatibility() { yamlCompatibilityEnabled_ = true; } @@ -4487,11 +4427,11 @@ void FastWriter::dropNullPlaceholders() { dropNullPlaceholders_ = true; } void FastWriter::omitEndingLineFeed() { omitEndingLineFeed_ = true; } -JSONCPP_STRING FastWriter::write(const Value& root) { +String FastWriter::write(const Value& root) { document_.clear(); writeValue(root); if (!omitEndingLineFeed_) - document_ += "\n"; + document_ += '\n'; return document_; } @@ -4510,13 +4450,13 @@ void FastWriter::writeValue(const Value& value) { case realValue: document_ += valueToString(value.asDouble()); break; - case stringValue: - { + case stringValue: { // Is NULL possible for value.string_? No. char const* str; char const* end; bool ok = value.getString(&str, &end); - if (ok) document_ += valueToQuotedStringN(str, static_cast(end-str)); + if (ok) + document_ += valueToQuotedStringN(str, static_cast(end - str)); break; } case booleanValue: @@ -4535,12 +4475,12 @@ void FastWriter::writeValue(const Value& value) { case objectValue: { Value::Members members(value.getMemberNames()); document_ += '{'; - for (Value::Members::iterator it = members.begin(); it != members.end(); - ++it) { - const JSONCPP_STRING& name = *it; + for (auto it = members.begin(); it != members.end(); ++it) { + const String& name = *it; if (it != members.begin()) document_ += ','; - document_ += valueToQuotedStringN(name.data(), static_cast(name.length())); + document_ += valueToQuotedStringN(name.data(), + static_cast(name.length())); document_ += yamlCompatibilityEnabled_ ? ": " : ":"; writeValue(value[name]); } @@ -4552,17 +4492,16 @@ void FastWriter::writeValue(const Value& value) { // Class StyledWriter // ////////////////////////////////////////////////////////////////// -StyledWriter::StyledWriter() - : rightMargin_(74), indentSize_(3), addChildValues_() {} +StyledWriter::StyledWriter() = default; -JSONCPP_STRING StyledWriter::write(const Value& root) { +String StyledWriter::write(const Value& root) { document_.clear(); addChildValues_ = false; indentString_.clear(); writeCommentBeforeValue(root); writeValue(root); writeCommentAfterValueOnSameLine(root); - document_ += "\n"; + document_ += '\n'; return document_; } @@ -4580,14 +4519,15 @@ void StyledWriter::writeValue(const Value& value) { case realValue: pushValue(valueToString(value.asDouble())); break; - case stringValue: - { + case stringValue: { // Is NULL possible for value.string_? No. char const* str; char const* end; bool ok = value.getString(&str, &end); - if (ok) pushValue(valueToQuotedStringN(str, static_cast(end-str))); - else pushValue(""); + if (ok) + pushValue(valueToQuotedStringN(str, static_cast(end - str))); + else + pushValue(""); break; } case booleanValue: @@ -4603,9 +4543,9 @@ void StyledWriter::writeValue(const Value& value) { else { writeWithIndent("{"); indent(); - Value::Members::iterator it = members.begin(); + auto it = members.begin(); for (;;) { - const JSONCPP_STRING& name = *it; + const String& name = *it; const Value& childValue = value[name]; writeCommentBeforeValue(childValue); writeWithIndent(valueToQuotedString(name.c_str())); @@ -4675,7 +4615,7 @@ bool StyledWriter::isMultilineArray(const Value& value) { for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { const Value& childValue = value[index]; isMultiLine = ((childValue.isArray() || childValue.isObject()) && - childValue.size() > 0); + !childValue.empty()); } if (!isMultiLine) // check if line length > max line length { @@ -4695,7 +4635,7 @@ bool StyledWriter::isMultilineArray(const Value& value) { return isMultiLine; } -void StyledWriter::pushValue(const JSONCPP_STRING& value) { +void StyledWriter::pushValue(const String& value) { if (addChildValues_) childValues_.push_back(value); else @@ -4713,12 +4653,12 @@ void StyledWriter::writeIndent() { document_ += indentString_; } -void StyledWriter::writeWithIndent(const JSONCPP_STRING& value) { +void StyledWriter::writeWithIndent(const String& value) { writeIndent(); document_ += value; } -void StyledWriter::indent() { indentString_ += JSONCPP_STRING(indentSize_, ' '); } +void StyledWriter::indent() { indentString_ += String(indentSize_, ' '); } void StyledWriter::unindent() { assert(indentString_.size() >= indentSize_); @@ -4729,20 +4669,19 @@ void StyledWriter::writeCommentBeforeValue(const Value& root) { if (!root.hasComment(commentBefore)) return; - document_ += "\n"; + document_ += '\n'; writeIndent(); - const JSONCPP_STRING& comment = root.getComment(commentBefore); - JSONCPP_STRING::const_iterator iter = comment.begin(); + const String& comment = root.getComment(commentBefore); + String::const_iterator iter = comment.begin(); while (iter != comment.end()) { document_ += *iter; - if (*iter == '\n' && - ((iter+1) != comment.end() && *(iter + 1) == '/')) + if (*iter == '\n' && ((iter + 1) != comment.end() && *(iter + 1) == '/')) writeIndent(); ++iter; } // Comments are stripped of trailing newlines, so add one here - document_ += "\n"; + document_ += '\n'; } void StyledWriter::writeCommentAfterValueOnSameLine(const Value& root) { @@ -4750,9 +4689,9 @@ void StyledWriter::writeCommentAfterValueOnSameLine(const Value& root) { document_ += " " + root.getComment(commentAfterOnSameLine); if (root.hasComment(commentAfter)) { - document_ += "\n"; + document_ += '\n'; document_ += root.getComment(commentAfter); - document_ += "\n"; + document_ += '\n'; } } @@ -4765,22 +4704,23 @@ bool StyledWriter::hasCommentForValue(const Value& value) { // Class StyledStreamWriter // ////////////////////////////////////////////////////////////////// -StyledStreamWriter::StyledStreamWriter(JSONCPP_STRING indentation) - : document_(NULL), rightMargin_(74), indentation_(indentation), - addChildValues_() {} +StyledStreamWriter::StyledStreamWriter(String indentation) + : document_(nullptr), indentation_(std::move(indentation)), + addChildValues_(), indented_(false) {} -void StyledStreamWriter::write(JSONCPP_OSTREAM& out, const Value& root) { +void StyledStreamWriter::write(OStream& out, const Value& root) { document_ = &out; addChildValues_ = false; indentString_.clear(); indented_ = true; writeCommentBeforeValue(root); - if (!indented_) writeIndent(); + if (!indented_) + writeIndent(); indented_ = true; writeValue(root); writeCommentAfterValueOnSameLine(root); *document_ << "\n"; - document_ = NULL; // Forget the stream, for safety. + document_ = nullptr; // Forget the stream, for safety. } void StyledStreamWriter::writeValue(const Value& value) { @@ -4797,14 +4737,15 @@ void StyledStreamWriter::writeValue(const Value& value) { case realValue: pushValue(valueToString(value.asDouble())); break; - case stringValue: - { + case stringValue: { // Is NULL possible for value.string_? No. char const* str; char const* end; bool ok = value.getString(&str, &end); - if (ok) pushValue(valueToQuotedStringN(str, static_cast(end-str))); - else pushValue(""); + if (ok) + pushValue(valueToQuotedStringN(str, static_cast(end - str))); + else + pushValue(""); break; } case booleanValue: @@ -4820,9 +4761,9 @@ void StyledStreamWriter::writeValue(const Value& value) { else { writeWithIndent("{"); indent(); - Value::Members::iterator it = members.begin(); + auto it = members.begin(); for (;;) { - const JSONCPP_STRING& name = *it; + const String& name = *it; const Value& childValue = value[name]; writeCommentBeforeValue(childValue); writeWithIndent(valueToQuotedString(name.c_str())); @@ -4859,7 +4800,8 @@ void StyledStreamWriter::writeArrayValue(const Value& value) { if (hasChildValue) writeWithIndent(childValues_[index]); else { - if (!indented_) writeIndent(); + if (!indented_) + writeIndent(); indented_ = true; writeValue(childValue); indented_ = false; @@ -4894,7 +4836,7 @@ bool StyledStreamWriter::isMultilineArray(const Value& value) { for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { const Value& childValue = value[index]; isMultiLine = ((childValue.isArray() || childValue.isObject()) && - childValue.size() > 0); + !childValue.empty()); } if (!isMultiLine) // check if line length > max line length { @@ -4914,7 +4856,7 @@ bool StyledStreamWriter::isMultilineArray(const Value& value) { return isMultiLine; } -void StyledStreamWriter::pushValue(const JSONCPP_STRING& value) { +void StyledStreamWriter::pushValue(const String& value) { if (addChildValues_) childValues_.push_back(value); else @@ -4929,8 +4871,9 @@ void StyledStreamWriter::writeIndent() { *document_ << '\n' << indentString_; } -void StyledStreamWriter::writeWithIndent(const JSONCPP_STRING& value) { - if (!indented_) writeIndent(); +void StyledStreamWriter::writeWithIndent(const String& value) { + if (!indented_) + writeIndent(); *document_ << value; indented_ = false; } @@ -4946,13 +4889,13 @@ void StyledStreamWriter::writeCommentBeforeValue(const Value& root) { if (!root.hasComment(commentBefore)) return; - if (!indented_) writeIndent(); - const JSONCPP_STRING& comment = root.getComment(commentBefore); - JSONCPP_STRING::const_iterator iter = comment.begin(); + if (!indented_) + writeIndent(); + const String& comment = root.getComment(commentBefore); + String::const_iterator iter = comment.begin(); while (iter != comment.end()) { *document_ << *iter; - if (*iter == '\n' && - ((iter+1) != comment.end() && *(iter + 1) == '/')) + if (*iter == '\n' && ((iter + 1) != comment.end() && *(iter + 1) == '/')) // writeIndent(); // would include newline *document_ << indentString_; ++iter; @@ -4984,84 +4927,73 @@ bool StyledStreamWriter::hasCommentForValue(const Value& value) { struct CommentStyle { /// Decide whether to write comments. enum Enum { - None, ///< Drop all comments. - Most, ///< Recover odd behavior of previous versions (not implemented yet). - All ///< Keep all comments. + None, ///< Drop all comments. + Most, ///< Recover odd behavior of previous versions (not implemented yet). + All ///< Keep all comments. }; }; -struct BuiltStyledStreamWriter : public StreamWriter -{ - BuiltStyledStreamWriter( - JSONCPP_STRING const& indentation, - CommentStyle::Enum cs, - JSONCPP_STRING const& colonSymbol, - JSONCPP_STRING const& nullSymbol, - JSONCPP_STRING const& endingLineFeedSymbol, - bool useSpecialFloats, - unsigned int precision); - int write(Value const& root, JSONCPP_OSTREAM* sout) JSONCPP_OVERRIDE; +struct BuiltStyledStreamWriter : public StreamWriter { + BuiltStyledStreamWriter(String indentation, CommentStyle::Enum cs, + String colonSymbol, String nullSymbol, + String endingLineFeedSymbol, bool useSpecialFloats, + bool emitUTF8, unsigned int precision, + PrecisionType precisionType); + int write(Value const& root, OStream* sout) override; + private: void writeValue(Value const& value); void writeArrayValue(Value const& value); bool isMultilineArray(Value const& value); - void pushValue(JSONCPP_STRING const& value); + void pushValue(String const& value); void writeIndent(); - void writeWithIndent(JSONCPP_STRING const& value); + void writeWithIndent(String const& value); void indent(); void unindent(); void writeCommentBeforeValue(Value const& root); void writeCommentAfterValueOnSameLine(Value const& root); static bool hasCommentForValue(const Value& value); - typedef std::vector ChildValues; + using ChildValues = std::vector; ChildValues childValues_; - JSONCPP_STRING indentString_; + String indentString_; unsigned int rightMargin_; - JSONCPP_STRING indentation_; + String indentation_; CommentStyle::Enum cs_; - JSONCPP_STRING colonSymbol_; - JSONCPP_STRING nullSymbol_; - JSONCPP_STRING endingLineFeedSymbol_; + String colonSymbol_; + String nullSymbol_; + String endingLineFeedSymbol_; bool addChildValues_ : 1; bool indented_ : 1; bool useSpecialFloats_ : 1; + bool emitUTF8_ : 1; unsigned int precision_; + PrecisionType precisionType_; }; BuiltStyledStreamWriter::BuiltStyledStreamWriter( - JSONCPP_STRING const& indentation, - CommentStyle::Enum cs, - JSONCPP_STRING const& colonSymbol, - JSONCPP_STRING const& nullSymbol, - JSONCPP_STRING const& endingLineFeedSymbol, - bool useSpecialFloats, - unsigned int precision) - : rightMargin_(74) - , indentation_(indentation) - , cs_(cs) - , colonSymbol_(colonSymbol) - , nullSymbol_(nullSymbol) - , endingLineFeedSymbol_(endingLineFeedSymbol) - , addChildValues_(false) - , indented_(false) - , useSpecialFloats_(useSpecialFloats) - , precision_(precision) -{ -} -int BuiltStyledStreamWriter::write(Value const& root, JSONCPP_OSTREAM* sout) -{ + String indentation, CommentStyle::Enum cs, String colonSymbol, + String nullSymbol, String endingLineFeedSymbol, bool useSpecialFloats, + bool emitUTF8, unsigned int precision, PrecisionType precisionType) + : rightMargin_(74), indentation_(std::move(indentation)), cs_(cs), + colonSymbol_(std::move(colonSymbol)), nullSymbol_(std::move(nullSymbol)), + endingLineFeedSymbol_(std::move(endingLineFeedSymbol)), + addChildValues_(false), indented_(false), + useSpecialFloats_(useSpecialFloats), emitUTF8_(emitUTF8), + precision_(precision), precisionType_(precisionType) {} +int BuiltStyledStreamWriter::write(Value const& root, OStream* sout) { sout_ = sout; addChildValues_ = false; indented_ = true; indentString_.clear(); writeCommentBeforeValue(root); - if (!indented_) writeIndent(); + if (!indented_) + writeIndent(); indented_ = true; writeValue(root); writeCommentAfterValueOnSameLine(root); *sout_ << endingLineFeedSymbol_; - sout_ = NULL; + sout_ = nullptr; return 0; } void BuiltStyledStreamWriter::writeValue(Value const& value) { @@ -5076,16 +5008,19 @@ void BuiltStyledStreamWriter::writeValue(Value const& value) { pushValue(valueToString(value.asLargestUInt())); break; case realValue: - pushValue(valueToString(value.asDouble(), useSpecialFloats_, precision_)); + pushValue(valueToString(value.asDouble(), useSpecialFloats_, precision_, + precisionType_)); break; - case stringValue: - { + case stringValue: { // Is NULL is possible for value.string_? No. char const* str; char const* end; bool ok = value.getString(&str, &end); - if (ok) pushValue(valueToQuotedStringN(str, static_cast(end-str))); - else pushValue(""); + if (ok) + pushValue(valueToQuotedStringN(str, static_cast(end - str), + emitUTF8_)); + else + pushValue(""); break; } case booleanValue: @@ -5101,12 +5036,13 @@ void BuiltStyledStreamWriter::writeValue(Value const& value) { else { writeWithIndent("{"); indent(); - Value::Members::iterator it = members.begin(); + auto it = members.begin(); for (;;) { - JSONCPP_STRING const& name = *it; + String const& name = *it; Value const& childValue = value[name]; writeCommentBeforeValue(childValue); - writeWithIndent(valueToQuotedStringN(name.data(), static_cast(name.length()))); + writeWithIndent(valueToQuotedStringN( + name.data(), static_cast(name.length()), emitUTF8_)); *sout_ << colonSymbol_; writeValue(childValue); if (++it == members.end()) { @@ -5140,7 +5076,8 @@ void BuiltStyledStreamWriter::writeArrayValue(Value const& value) { if (hasChildValue) writeWithIndent(childValues_[index]); else { - if (!indented_) writeIndent(); + if (!indented_) + writeIndent(); indented_ = true; writeValue(childValue); indented_ = false; @@ -5158,13 +5095,15 @@ void BuiltStyledStreamWriter::writeArrayValue(Value const& value) { { assert(childValues_.size() == size); *sout_ << "["; - if (!indentation_.empty()) *sout_ << " "; + if (!indentation_.empty()) + *sout_ << " "; for (unsigned index = 0; index < size; ++index) { if (index > 0) *sout_ << ((!indentation_.empty()) ? ", " : ","); *sout_ << childValues_[index]; } - if (!indentation_.empty()) *sout_ << " "; + if (!indentation_.empty()) + *sout_ << " "; *sout_ << "]"; } } @@ -5177,7 +5116,7 @@ bool BuiltStyledStreamWriter::isMultilineArray(Value const& value) { for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { Value const& childValue = value[index]; isMultiLine = ((childValue.isArray() || childValue.isObject()) && - childValue.size() > 0); + !childValue.empty()); } if (!isMultiLine) // check if line length > max line length { @@ -5197,7 +5136,7 @@ bool BuiltStyledStreamWriter::isMultilineArray(Value const& value) { return isMultiLine; } -void BuiltStyledStreamWriter::pushValue(JSONCPP_STRING const& value) { +void BuiltStyledStreamWriter::pushValue(String const& value) { if (addChildValues_) childValues_.push_back(value); else @@ -5216,8 +5155,9 @@ void BuiltStyledStreamWriter::writeIndent() { } } -void BuiltStyledStreamWriter::writeWithIndent(JSONCPP_STRING const& value) { - if (!indented_) writeIndent(); +void BuiltStyledStreamWriter::writeWithIndent(String const& value) { + if (!indented_) + writeIndent(); *sout_ << value; indented_ = false; } @@ -5230,17 +5170,18 @@ void BuiltStyledStreamWriter::unindent() { } void BuiltStyledStreamWriter::writeCommentBeforeValue(Value const& root) { - if (cs_ == CommentStyle::None) return; + if (cs_ == CommentStyle::None) + return; if (!root.hasComment(commentBefore)) return; - if (!indented_) writeIndent(); - const JSONCPP_STRING& comment = root.getComment(commentBefore); - JSONCPP_STRING::const_iterator iter = comment.begin(); + if (!indented_) + writeIndent(); + const String& comment = root.getComment(commentBefore); + String::const_iterator iter = comment.begin(); while (iter != comment.end()) { *sout_ << *iter; - if (*iter == '\n' && - ((iter+1) != comment.end() && *(iter + 1) == '/')) + if (*iter == '\n' && ((iter + 1) != comment.end() && *(iter + 1) == '/')) // writeIndent(); // would write extra newline *sout_ << indentString_; ++iter; @@ -5248,8 +5189,10 @@ void BuiltStyledStreamWriter::writeCommentBeforeValue(Value const& root) { indented_ = false; } -void BuiltStyledStreamWriter::writeCommentAfterValueOnSameLine(Value const& root) { - if (cs_ == CommentStyle::None) return; +void BuiltStyledStreamWriter::writeCommentAfterValueOnSameLine( + Value const& root) { + if (cs_ == CommentStyle::None) + return; if (root.hasComment(commentAfterOnSameLine)) *sout_ << " " + root.getComment(commentAfterOnSameLine); @@ -5269,28 +5212,19 @@ bool BuiltStyledStreamWriter::hasCommentForValue(const Value& value) { /////////////// // StreamWriter -StreamWriter::StreamWriter() - : sout_(NULL) -{ -} -StreamWriter::~StreamWriter() -{ -} -StreamWriter::Factory::~Factory() -{} -StreamWriterBuilder::StreamWriterBuilder() -{ - setDefaults(&settings_); -} -StreamWriterBuilder::~StreamWriterBuilder() -{} -StreamWriter* StreamWriterBuilder::newStreamWriter() const -{ - JSONCPP_STRING indentation = settings_["indentation"].asString(); - JSONCPP_STRING cs_str = settings_["commentStyle"].asString(); - bool eyc = settings_["enableYAMLCompatibility"].asBool(); - bool dnp = settings_["dropNullPlaceholders"].asBool(); - bool usf = settings_["useSpecialFloats"].asBool(); +StreamWriter::StreamWriter() : sout_(nullptr) {} +StreamWriter::~StreamWriter() = default; +StreamWriter::Factory::~Factory() = default; +StreamWriterBuilder::StreamWriterBuilder() { setDefaults(&settings_); } +StreamWriterBuilder::~StreamWriterBuilder() = default; +StreamWriter* StreamWriterBuilder::newStreamWriter() const { + const String indentation = settings_["indentation"].asString(); + const String cs_str = settings_["commentStyle"].asString(); + const String pt_str = settings_["precisionType"].asString(); + const bool eyc = settings_["enableYAMLCompatibility"].asBool(); + const bool dnp = settings_["dropNullPlaceholders"].asBool(); + const bool usf = settings_["useSpecialFloats"].asBool(); + const bool emitUTF8 = settings_["emitUTF8"].asBool(); unsigned int pre = settings_["precision"].asUInt(); CommentStyle::Enum cs = CommentStyle::All; if (cs_str == "All") { @@ -5300,74 +5234,80 @@ StreamWriter* StreamWriterBuilder::newStreamWriter() const } else { throwRuntimeError("commentStyle must be 'All' or 'None'"); } - JSONCPP_STRING colonSymbol = " : "; + PrecisionType precisionType(significantDigits); + if (pt_str == "significant") { + precisionType = PrecisionType::significantDigits; + } else if (pt_str == "decimal") { + precisionType = PrecisionType::decimalPlaces; + } else { + throwRuntimeError("precisionType must be 'significant' or 'decimal'"); + } + String colonSymbol = " : "; if (eyc) { colonSymbol = ": "; } else if (indentation.empty()) { colonSymbol = ":"; } - JSONCPP_STRING nullSymbol = "null"; + String nullSymbol = "null"; if (dnp) { nullSymbol.clear(); } - if (pre > 17) pre = 17; - JSONCPP_STRING endingLineFeedSymbol; - return new BuiltStyledStreamWriter( - indentation, cs, - colonSymbol, nullSymbol, endingLineFeedSymbol, usf, pre); + if (pre > 17) + pre = 17; + String endingLineFeedSymbol; + return new BuiltStyledStreamWriter(indentation, cs, colonSymbol, nullSymbol, + endingLineFeedSymbol, usf, emitUTF8, pre, + precisionType); } -static void getValidWriterKeys(std::set* valid_keys) -{ - valid_keys->clear(); - valid_keys->insert("indentation"); - valid_keys->insert("commentStyle"); - valid_keys->insert("enableYAMLCompatibility"); - valid_keys->insert("dropNullPlaceholders"); - valid_keys->insert("useSpecialFloats"); - valid_keys->insert("precision"); -} -bool StreamWriterBuilder::validate(Json::Value* invalid) const -{ - Json::Value my_invalid; - if (!invalid) invalid = &my_invalid; // so we do not need to test for NULL - Json::Value& inv = *invalid; - std::set valid_keys; - getValidWriterKeys(&valid_keys); - Value::Members keys = settings_.getMemberNames(); - size_t n = keys.size(); - for (size_t i = 0; i < n; ++i) { - JSONCPP_STRING const& key = keys[i]; - if (valid_keys.find(key) == valid_keys.end()) { - inv[key] = settings_[key]; - } + +bool StreamWriterBuilder::validate(Json::Value* invalid) const { + static const auto& valid_keys = *new std::set{ + "indentation", + "commentStyle", + "enableYAMLCompatibility", + "dropNullPlaceholders", + "useSpecialFloats", + "emitUTF8", + "precision", + "precisionType", + }; + for (auto si = settings_.begin(); si != settings_.end(); ++si) { + auto key = si.name(); + if (valid_keys.count(key)) + continue; + if (invalid) + (*invalid)[std::move(key)] = *si; + else + return false; } - return 0u == inv.size(); + return invalid ? invalid->empty() : true; } -Value& StreamWriterBuilder::operator[](JSONCPP_STRING key) -{ + +Value& StreamWriterBuilder::operator[](const String& key) { return settings_[key]; } // static -void StreamWriterBuilder::setDefaults(Json::Value* settings) -{ +void StreamWriterBuilder::setDefaults(Json::Value* settings) { //! [StreamWriterBuilderDefaults] (*settings)["commentStyle"] = "All"; (*settings)["indentation"] = "\t"; (*settings)["enableYAMLCompatibility"] = false; (*settings)["dropNullPlaceholders"] = false; (*settings)["useSpecialFloats"] = false; + (*settings)["emitUTF8"] = false; (*settings)["precision"] = 17; + (*settings)["precisionType"] = "significant"; //! [StreamWriterBuilderDefaults] } -JSONCPP_STRING writeString(StreamWriter::Factory const& builder, Value const& root) { - JSONCPP_OSTRINGSTREAM sout; - StreamWriterPtr const writer(builder.newStreamWriter()); +String writeString(StreamWriter::Factory const& factory, Value const& root) { + OStringStream sout; + StreamWriterPtr const writer(factory.newStreamWriter()); writer->write(root, &sout); return sout.str(); } -JSONCPP_OSTREAM& operator<<(JSONCPP_OSTREAM& sout, Value const& root) { +OStream& operator<<(OStream& sout, Value const& root) { StreamWriterBuilder builder; StreamWriterPtr const writer(builder.newStreamWriter()); writer->write(root, &sout); From 5c0a57f6068000b0414cf2a3ef76a8bf4852b379 Mon Sep 17 00:00:00 2001 From: Maksim Date: Wed, 21 Oct 2020 21:42:40 +0200 Subject: [PATCH 125/177] Fix Media... 0% on loading screen (#9478) --- src/client/game.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/client/game.cpp b/src/client/game.cpp index a7e367ae2..0380c1661 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -1641,7 +1641,10 @@ bool Game::getServerContent(bool *aborted) std::stringstream message; std::fixed(message); message.precision(0); - message << gettext("Media...") << " " << (client->mediaReceiveProgress()*100) << "%"; + float receive = client->mediaReceiveProgress() * 100; + message << gettext("Media..."); + if (receive > 0) + message << " " << receive << "%"; message.precision(2); if ((USE_CURL == 0) || From 9d370b78da61997f46f228cb3e4b54b8ee9295ff Mon Sep 17 00:00:00 2001 From: DS Date: Wed, 21 Oct 2020 22:05:32 +0200 Subject: [PATCH 126/177] Add documentation to builtin core.run_callbacks (#10494) --- builtin/client/register.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/builtin/client/register.lua b/builtin/client/register.lua index acd36ab36..27a6b02d9 100644 --- a/builtin/client/register.lua +++ b/builtin/client/register.lua @@ -4,6 +4,13 @@ core.callback_origins = {} local getinfo = debug.getinfo debug.getinfo = nil +--- Runs given callbacks. +-- +-- Note: this function is also called from C++ +-- @tparam table callbacks a table with registered callbacks, like `core.registered_on_*` +-- @tparam number mode a RunCallbacksMode, as defined in src/script/common/c_internal.h +-- @param ... arguments for the callback +-- @return depends on mode function core.run_callbacks(callbacks, mode, ...) assert(type(callbacks) == "table") local cb_len = #callbacks From 33b2c5f5b1c565171296f26395d803b08f4575e9 Mon Sep 17 00:00:00 2001 From: Zughy <63455151+Zughy@users.noreply.github.com> Date: Thu, 22 Oct 2020 17:18:01 +0200 Subject: [PATCH 127/177] Clean up l_object.cpp (#10512) Co-authored-by: Zughy <4279489-marco_a@users.noreply.gitlab.com> --- doc/lua_api.txt | 48 +- src/script/lua_api/l_object.cpp | 1169 +++++++++++++++---------------- src/script/lua_api/l_object.h | 56 +- 3 files changed, 605 insertions(+), 668 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 9a46c7b57..daf0da3d2 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -6217,18 +6217,18 @@ object you are working with still exists. * `rot` is a vector (radians). X is pitch (elevation), Y is yaw (heading) and Z is roll (bank). * `get_rotation()`: returns the rotation, a vector (radians) -* `set_yaw(radians)`: sets the yaw (heading). +* `set_yaw(yaw)`: sets the yaw in radians (heading). * `get_yaw()`: returns number in radians * `set_texture_mod(mod)` * Set a texture modifier to the base texture, for sprites and meshes. * When calling `set_texture_mod` again, the previous one is discarded. * `mod` the texture modifier. See [Texture modifiers]. * `get_texture_mod()` returns current texture modifier -* `set_sprite(p, num_frames, framelength, select_x_by_camera)` +* `set_sprite(start_frame, num_frames, framelength, select_x_by_camera)` * Specifies and starts a sprite animation * Animations iterate along the frame `y` position. - * `p`: {x=column number, y=row number}, the coordinate of the first frame - default: `{x=0, y=0}` + * `start_frame`: {x=column number, y=row number}, the coordinate of the + first frame, default: `{x=0, y=0}` * `num_frames`: Total frames in the texture, default: `1` * `framelength`: Time per animated frame in seconds, default: `0.2` * `select_x_by_camera`: Only for visual = `sprite`. Changes the frame `x` @@ -6391,8 +6391,8 @@ object you are working with still exists. nodes square) * `selected_mode` is the mode index to be selected after modes have been changed (0 is the first mode). -* `set_sky(parameters)` - * `parameters` is a table with the following optional fields: +* `set_sky(sky_parameters)` + * `sky_parameters` is a table with the following optional fields: * `base_color`: ColorSpec, changes fog in "skybox" and "plain". * `type`: Available types: * `"regular"`: Uses 0 textures, `base_color` ignored @@ -6436,8 +6436,8 @@ object you are working with still exists. * `get_sky()`: returns base_color, type, table of textures, clouds. * `get_sky_color()`: returns a table with the `sky_color` parameters as in `set_sky`. -* `set_sun(parameters)`: - * `parameters` is a table with the following optional fields: +* `set_sun(sun_parameters)`: + * `sun_parameters` is a table with the following optional fields: * `visible`: Boolean for whether the sun is visible. (default: `true`) * `texture`: A regular texture for the sun. Setting to `""` @@ -6451,8 +6451,8 @@ object you are working with still exists. * `scale`: Float controlling the overall size of the sun. (default: `1`) * `get_sun()`: returns a table with the current sun parameters as in `set_sun`. -* `set_moon(parameters)`: - * `parameters` is a table with the following optional fields: +* `set_moon(moon_parameters)`: + * `moon_parameters` is a table with the following optional fields: * `visible`: Boolean for whether the moon is visible. (default: `true`) * `texture`: A regular texture for the moon. Setting to `""` @@ -6462,8 +6462,8 @@ object you are working with still exists. * `scale`: Float controlling the overall size of the moon (default: `1`) * `get_moon()`: returns a table with the current moon parameters as in `set_moon`. -* `set_stars(parameters)`: - * `parameters` is a table with the following optional fields: +* `set_stars(star_parameters)`: + * `star_parameters` is a table with the following optional fields: * `visible`: Boolean for whether the stars are visible. (default: `true`) * `count`: Integer number to set the number of stars in @@ -6475,8 +6475,8 @@ object you are working with still exists. * `scale`: Float controlling the overall size of the stars (default: `1`) * `get_stars()`: returns a table with the current stars parameters as in `set_stars`. -* `set_clouds(parameters)`: set cloud parameters - * `parameters` is a table with the following optional fields: +* `set_clouds(cloud_parameters)`: set cloud parameters + * `cloud_parameters` is a table with the following optional fields: * `density`: from `0` (no clouds) to `1` (full clouds) (default `0.4`) * `color`: basic cloud color with alpha channel, ColorSpec (default `#fff0f0e5`). @@ -6494,21 +6494,17 @@ object you are working with still exists. amount. * `nil`: Disables override, defaulting to sunlight based on day-night cycle * `get_day_night_ratio()`: returns the ratio or nil if it isn't overridden -* `set_local_animation(stand/idle, walk, dig, walk+dig, frame_speed=frame_speed)`: - set animation for player model in third person view - - set_local_animation({x=0, y=79}, -- stand/idle animation key frames - {x=168, y=187}, -- walk animation key frames - {x=189, y=198}, -- dig animation key frames - {x=200, y=219}, -- walk+dig animation key frames - frame_speed=30) -- animation frame speed -* `get_local_animation()`: returns stand, walk, dig, dig+walk tables and +* `set_local_animation(idle, walk, dig, walk_while_dig, frame_speed)`: + set animation for player model in third person view. + * Every animation equals to a `{x=starting frame, y=ending frame}` table. + * `frame_speed` sets the animations frame speed. Default is 30. +* `get_local_animation()`: returns idle, walk, dig, walk_while_dig tables and `frame_speed`. -* `set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0})`: defines offset value for - camera per player. +* `set_eye_offset(firstperson, thirdperson)`: defines offset vectors for camera + per player. * in first person view * in third person view (max. values `{x=-10/10,y=-10,15,z=-5/5}`) -* `get_eye_offset()`: returns `offset_first` and `offset_third` +* `get_eye_offset()`: returns first and third person offsets. * `send_mapblock(blockpos)`: * Sends a server-side loaded mapblock to the player. * Returns `false` if failed. diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 96c8c687c..c3f0ec8e0 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -44,43 +44,44 @@ ObjectRef* ObjectRef::checkobject(lua_State *L, int narg) { luaL_checktype(L, narg, LUA_TUSERDATA); void *ud = luaL_checkudata(L, narg, className); - if (!ud) luaL_typerror(L, narg, className); + if (ud == nullptr) + luaL_typerror(L, narg, className); return *(ObjectRef**)ud; // unbox pointer } ServerActiveObject* ObjectRef::getobject(ObjectRef *ref) { - ServerActiveObject *co = ref->m_object; - if (co && co->isGone()) - return NULL; - return co; + ServerActiveObject *sao = ref->m_object; + if (sao && sao->isGone()) + return nullptr; + return sao; } LuaEntitySAO* ObjectRef::getluaobject(ObjectRef *ref) { - ServerActiveObject *obj = getobject(ref); - if (obj == NULL) - return NULL; - if (obj->getType() != ACTIVEOBJECT_TYPE_LUAENTITY) - return NULL; - return (LuaEntitySAO*)obj; + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return nullptr; + if (sao->getType() != ACTIVEOBJECT_TYPE_LUAENTITY) + return nullptr; + return (LuaEntitySAO*)sao; } PlayerSAO* ObjectRef::getplayersao(ObjectRef *ref) { - ServerActiveObject *obj = getobject(ref); - if (obj == NULL) - return NULL; - if (obj->getType() != ACTIVEOBJECT_TYPE_PLAYER) - return NULL; - return (PlayerSAO*)obj; + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return nullptr; + if (sao->getType() != ACTIVEOBJECT_TYPE_PLAYER) + return nullptr; + return (PlayerSAO*)sao; } RemotePlayer *ObjectRef::getplayer(ObjectRef *ref) { PlayerSAO *playersao = getplayersao(ref); - if (playersao == NULL) - return NULL; + if (playersao == nullptr) + return nullptr; return playersao->getPlayer(); } @@ -88,9 +89,8 @@ RemotePlayer *ObjectRef::getplayer(ObjectRef *ref) // garbage collector int ObjectRef::gc_object(lua_State *L) { - ObjectRef *o = *(ObjectRef **)(lua_touserdata(L, 1)); - //infostream<<"ObjectRef::gc_object: o="<getType() == ACTIVEOBJECT_TYPE_PLAYER) + if (sao->getType() == ACTIVEOBJECT_TYPE_PLAYER) return 0; - co->clearChildAttachments(); - co->clearParentAttachment(); + sao->clearChildAttachments(); + sao->clearParentAttachment(); - verbosestream << "ObjectRef::l_remove(): id=" << co->getId() << std::endl; - co->m_pending_removal = true; + verbosestream << "ObjectRef::l_remove(): id=" << sao->getId() << std::endl; + sao->m_pending_removal = true; return 0; } // get_pos(self) -// returns: {x=num, y=num, z=num} int ObjectRef::l_get_pos(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) return 0; - push_v3f(L, co->getBasePosition() / BS); + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + + push_v3f(L, sao->getBasePosition() / BS); return 1; } @@ -131,28 +132,29 @@ int ObjectRef::l_set_pos(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) return 0; - // pos + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + v3f pos = checkFloatPos(L, 2); - // Do it - co->setPos(pos); + + sao->setPos(pos); return 0; } -// move_to(self, pos, continuous=false) +// move_to(self, pos, continuous) int ObjectRef::l_move_to(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) return 0; - // pos + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + v3f pos = checkFloatPos(L, 2); - // continuous bool continuous = readParam(L, 3); - // Do it - co->moveTo(pos, continuous); + + sao->moveTo(pos, continuous); return 0; } @@ -162,32 +164,28 @@ int ObjectRef::l_punch(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); ObjectRef *puncher_ref = checkobject(L, 2); - ServerActiveObject *co = getobject(ref); + ServerActiveObject *sao = getobject(ref); ServerActiveObject *puncher = getobject(puncher_ref); - if (!co || !puncher) + if (sao == nullptr || puncher == nullptr) return 0; - v3f dir; - if (lua_type(L, 5) != LUA_TTABLE) - dir = co->getBasePosition() - puncher->getBasePosition(); - else - dir = read_v3f(L, 5); - float time_from_last_punch = 1000000; - if (lua_isnumber(L, 3)) - time_from_last_punch = lua_tonumber(L, 3); - ToolCapabilities toolcap = read_tool_capabilities(L, 4); - dir.normalize(); - u16 src_original_hp = co->getHP(); + float time_from_last_punch = lua_isnil(L, 3) ? + 1000000.0f : readParam(L,3); + ToolCapabilities toolcap = read_tool_capabilities(L, 4); + v3f dir = lua_isnil(L, 5) ? + sao->getBasePosition() - puncher->getBasePosition() : check_v3f(L, 5); + + dir.normalize(); + u16 src_original_hp = sao->getHP(); u16 dst_origin_hp = puncher->getHP(); - // Do it - u16 wear = co->punch(dir, &toolcap, puncher, time_from_last_punch); + u16 wear = sao->punch(dir, &toolcap, puncher, time_from_last_punch); lua_pushnumber(L, wear); // If the punched is a player, and its HP changed - if (src_original_hp != co->getHP() && - co->getType() == ACTIVEOBJECT_TYPE_PLAYER) { - getServer(L)->SendPlayerHPOrDie((PlayerSAO *)co, + if (src_original_hp != sao->getHP() && + sao->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + getServer(L)->SendPlayerHPOrDie((PlayerSAO *)sao, PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, puncher)); } @@ -195,45 +193,38 @@ int ObjectRef::l_punch(lua_State *L) if (dst_origin_hp != puncher->getHP() && puncher->getType() == ACTIVEOBJECT_TYPE_PLAYER) { getServer(L)->SendPlayerHPOrDie((PlayerSAO *)puncher, - PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, co)); + PlayerHPChangeReason(PlayerHPChangeReason::PLAYER_PUNCH, sao)); } return 1; } -// right_click(self, clicker); clicker = an another ObjectRef +// right_click(self, clicker) int ObjectRef::l_right_click(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); ObjectRef *ref2 = checkobject(L, 2); - ServerActiveObject *co = getobject(ref); - ServerActiveObject *co2 = getobject(ref2); - if (co == NULL) return 0; - if (co2 == NULL) return 0; - // Do it - co->rightClick(co2); + ServerActiveObject *sao = getobject(ref); + ServerActiveObject *sao2 = getobject(ref2); + if (sao == nullptr || sao2 == nullptr) + return 0; + + sao->rightClick(sao2); return 0; } -// set_hp(self, hp) -// hp = number of hitpoints (2 * number of hearts) -// returns: nil +// set_hp(self, hp, reason) int ObjectRef::l_set_hp(lua_State *L) { NO_MAP_LOCK_REQUIRED; - - // Get Object ObjectRef *ref = checkobject(L, 1); - luaL_checknumber(L, 2); - ServerActiveObject *co = getobject(ref); - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - // Get HP - int hp = lua_tonumber(L, 2); - - // Get Reason + int hp = readParam(L, 2); PlayerHPChangeReason reason(PlayerHPChangeReason::SET_HP); + reason.from_mod = true; if (lua_istable(L, 3)) { lua_pushvalue(L, 3); @@ -248,35 +239,28 @@ int ObjectRef::l_set_hp(lua_State *L) reason.lua_reference = luaL_ref(L, LUA_REGISTRYINDEX); } - // Do it - co->setHP(hp, reason); - if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER) - getServer(L)->SendPlayerHPOrDie((PlayerSAO *)co, reason); - + sao->setHP(hp, reason); + if (sao->getType() == ACTIVEOBJECT_TYPE_PLAYER) + getServer(L)->SendPlayerHPOrDie((PlayerSAO *)sao, reason); if (reason.hasLuaReference()) luaL_unref(L, LUA_REGISTRYINDEX, reason.lua_reference); - - // Return return 0; } // get_hp(self) -// returns: number of hitpoints (2 * number of hearts) -// 0 if not applicable to this type of object int ObjectRef::l_get_hp(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) { + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) { // Default hp is 1 lua_pushnumber(L, 1); return 1; } - int hp = co->getHP(); - /*infostream<<"ObjectRef::l_get_hp(): id="<getId() - <<" hp="<getHP(); + lua_pushnumber(L, hp); return 1; } @@ -286,11 +270,12 @@ int ObjectRef::l_get_inventory(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) return 0; - // Do it - InventoryLocation loc = co->getInventoryLocation(); - if (getServerInventoryMgr(L)->getInventory(loc) != NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + + InventoryLocation loc = sao->getInventoryLocation(); + if (getServerInventoryMgr(L)->getInventory(loc) != nullptr) InvRef::create(L, loc); else lua_pushnil(L); // An object may have no inventory (nil) @@ -302,11 +287,11 @@ int ObjectRef::l_get_wield_list(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (!co) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - lua_pushstring(L, co->getWieldList().c_str()); + lua_pushstring(L, sao->getWieldList().c_str()); return 1; } @@ -315,11 +300,11 @@ int ObjectRef::l_get_wield_index(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (!co) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - lua_pushinteger(L, co->getWieldIndex() + 1); + lua_pushinteger(L, sao->getWieldIndex() + 1); return 1; } @@ -328,31 +313,33 @@ int ObjectRef::l_get_wielded_item(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (!co) { + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) { // Empty ItemStack LuaItemStack::create(L, ItemStack()); return 1; } ItemStack selected_item; - co->getWieldedItem(&selected_item, nullptr); + sao->getWieldedItem(&selected_item, nullptr); LuaItemStack::create(L, selected_item); return 1; } -// set_wielded_item(self, itemstack or itemstring or table or nil) +// set_wielded_item(self, item) int ObjectRef::l_set_wielded_item(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) return 0; - // Do it + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + ItemStack item = read_item(L, 2, getServer(L)->idef()); - bool success = co->setWieldedItem(item); - if (success && co->getType() == ACTIVEOBJECT_TYPE_PLAYER) { - getServer(L)->SendInventory((PlayerSAO *)co, true); + + bool success = sao->setWieldedItem(item); + if (success && sao->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + getServer(L)->SendInventory((PlayerSAO *)sao, true); } lua_pushboolean(L, success); return 1; @@ -363,12 +350,14 @@ int ObjectRef::l_set_armor_groups(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) return 0; - // Do it + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + ItemGroupList groups; + read_groups(L, 2, groups); - co->setArmorGroups(groups); + sao->setArmorGroups(groups); return 0; } @@ -377,77 +366,11 @@ int ObjectRef::l_get_armor_groups(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - // Do it - push_groups(L, co->getArmorGroups()); - return 1; -} -// set_physics_override(self, physics_override_speed, physics_override_jump, -// physics_override_gravity, sneak, sneak_glitch, new_move) -int ObjectRef::l_set_physics_override(lua_State *L) -{ - NO_MAP_LOCK_REQUIRED; - ObjectRef *ref = checkobject(L, 1); - PlayerSAO *co = (PlayerSAO *) getobject(ref); - if (co == NULL) return 0; - // Do it - if (lua_istable(L, 2)) { - co->m_physics_override_speed = getfloatfield_default( - L, 2, "speed", co->m_physics_override_speed); - co->m_physics_override_jump = getfloatfield_default( - L, 2, "jump", co->m_physics_override_jump); - co->m_physics_override_gravity = getfloatfield_default( - L, 2, "gravity", co->m_physics_override_gravity); - co->m_physics_override_sneak = getboolfield_default( - L, 2, "sneak", co->m_physics_override_sneak); - co->m_physics_override_sneak_glitch = getboolfield_default( - L, 2, "sneak_glitch", co->m_physics_override_sneak_glitch); - co->m_physics_override_new_move = getboolfield_default( - L, 2, "new_move", co->m_physics_override_new_move); - co->m_physics_override_sent = false; - } else { - // old, non-table format - if (!lua_isnil(L, 2)) { - co->m_physics_override_speed = lua_tonumber(L, 2); - co->m_physics_override_sent = false; - } - if (!lua_isnil(L, 3)) { - co->m_physics_override_jump = lua_tonumber(L, 3); - co->m_physics_override_sent = false; - } - if (!lua_isnil(L, 4)) { - co->m_physics_override_gravity = lua_tonumber(L, 4); - co->m_physics_override_sent = false; - } - } - return 0; -} - -// get_physics_override(self) -int ObjectRef::l_get_physics_override(lua_State *L) -{ - NO_MAP_LOCK_REQUIRED; - ObjectRef *ref = checkobject(L, 1); - PlayerSAO *co = (PlayerSAO *)getobject(ref); - if (co == NULL) - return 0; - // Do it - lua_newtable(L); - lua_pushnumber(L, co->m_physics_override_speed); - lua_setfield(L, -2, "speed"); - lua_pushnumber(L, co->m_physics_override_jump); - lua_setfield(L, -2, "jump"); - lua_pushnumber(L, co->m_physics_override_gravity); - lua_setfield(L, -2, "gravity"); - lua_pushboolean(L, co->m_physics_override_sneak); - lua_setfield(L, -2, "sneak"); - lua_pushboolean(L, co->m_physics_override_sneak_glitch); - lua_setfield(L, -2, "sneak_glitch"); - lua_pushboolean(L, co->m_physics_override_new_move); - lua_setfield(L, -2, "new_move"); + push_groups(L, sao->getArmorGroups()); return 1; } @@ -456,9 +379,10 @@ int ObjectRef::l_set_animation(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) return 0; - // Do it + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + v2f frames = v2f(1, 1); if (!lua_isnil(L, 2)) frames = readParam(L, 2); @@ -471,7 +395,8 @@ int ObjectRef::l_set_animation(lua_State *L) bool frame_loop = true; if (lua_isboolean(L, 5)) frame_loop = readParam(L, 5); - co->setAnimation(frames, frame_speed, frame_blend, frame_loop); + + sao->setAnimation(frames, frame_speed, frame_blend, frame_loop); return 0; } @@ -480,16 +405,16 @@ int ObjectRef::l_get_animation(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - // Do it + v2f frames = v2f(1,1); float frame_speed = 15; float frame_blend = 0; bool frame_loop = true; - co->getAnimation(&frames, &frame_speed, &frame_blend, &frame_loop); + sao->getAnimation(&frames, &frame_speed, &frame_blend, &frame_loop); push_v2f(L, frames); lua_pushnumber(L, frame_speed); lua_pushnumber(L, frame_blend); @@ -497,23 +422,21 @@ int ObjectRef::l_get_animation(lua_State *L) return 4; } -// set_local_animation(self, {stand/idle}, {walk}, {dig}, {walk+dig}, frame_speed) +// set_local_animation(self, idle, walk, dig, walk_while_dig, frame_speed) int ObjectRef::l_set_local_animation(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; - // Do it + v2s32 frames[4]; for (int i=0;i<4;i++) { if (!lua_isnil(L, 2+1)) frames[i] = read_v2s32(L, 2+i); } - float frame_speed = 30; - if (!lua_isnil(L, 6)) - frame_speed = lua_tonumber(L, 6); + float frame_speed = lua_isnil(L, 6) ? 30 : readParam(L, 6); getServer(L)->setLocalPlayerAnimations(player, frames, frame_speed); lua_pushboolean(L, true); @@ -526,7 +449,7 @@ int ObjectRef::l_get_local_animation(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; v2s32 frames[4]; @@ -541,27 +464,22 @@ int ObjectRef::l_get_local_animation(lua_State *L) return 5; } -// set_eye_offset(self, v3f first pv, v3f third pv) +// set_eye_offset(self, firstperson, thirdperson) int ObjectRef::l_set_eye_offset(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; - // Do it - v3f offset_first = v3f(0, 0, 0); - v3f offset_third = v3f(0, 0, 0); - if (!lua_isnil(L, 2)) - offset_first = read_v3f(L, 2); - if (!lua_isnil(L, 3)) - offset_third = read_v3f(L, 3); + v3f offset_first = read_v3f(L, 2); + v3f offset_third = read_v3f(L, 3); // Prevent abuse of offset values (keep player always visible) offset_third.X = rangelim(offset_third.X,-10,10); offset_third.Z = rangelim(offset_third.Z,-5,5); - /* TODO: if possible: improve the camera colision detetion to allow Y <= -1.5) */ + /* TODO: if possible: improve the camera collision detection to allow Y <= -1.5) */ offset_third.Y = rangelim(offset_third.Y,-10,15); //1.5*BS getServer(L)->setPlayerEyeOffset(player, offset_first, offset_third); @@ -575,9 +493,9 @@ int ObjectRef::l_get_eye_offset(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; - // Do it + push_v3f(L, player->eye_offset_first); push_v3f(L, player->eye_offset_third); return 2; @@ -588,14 +506,14 @@ int ObjectRef::l_send_mapblock(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - RemotePlayer *player = getplayer(ref); - if (!player) + if (player == nullptr) return 0; - v3s16 p = read_v3s16(L, 2); + + v3s16 pos = read_v3s16(L, 2); session_t peer_id = player->getPeerId(); - bool r = getServer(L)->SendBlock(peer_id, p); + bool r = getServer(L)->SendBlock(peer_id, pos); lua_pushboolean(L, r); return 1; @@ -606,14 +524,13 @@ int ObjectRef::l_set_animation_frame_speed(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - // Do it if (!lua_isnil(L, 2)) { - float frame_speed = lua_tonumber(L, 2); - co->setAnimationSpeed(frame_speed); + float frame_speed = readParam(L, 2); + sao->setAnimationSpeed(frame_speed); lua_pushboolean(L, true); } else { lua_pushboolean(L, false); @@ -621,24 +538,20 @@ int ObjectRef::l_set_animation_frame_speed(lua_State *L) return 1; } -// set_bone_position(self, std::string bone, v3f position, v3f rotation) +// set_bone_position(self, bone, position, rotation) int ObjectRef::l_set_bone_position(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) return 0; - // Do it - std::string bone; - if (!lua_isnil(L, 2)) - bone = readParam(L, 2); - v3f position = v3f(0, 0, 0); - if (!lua_isnil(L, 3)) - position = check_v3f(L, 3); - v3f rotation = v3f(0, 0, 0); - if (!lua_isnil(L, 4)) - rotation = check_v3f(L, 4); - co->setBonePosition(bone, position, rotation); + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) + return 0; + + std::string bone = readParam(L, 2); + v3f position = check_v3f(L, 3); + v3f rotation = check_v3f(L, 4); + + sao->setBonePosition(bone, position, rotation); return 0; } @@ -647,17 +560,15 @@ int ObjectRef::l_get_bone_position(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - // Do it - std::string bone; - if (!lua_isnil(L, 2)) - bone = readParam(L, 2); + + std::string bone = readParam(L, 2); v3f position = v3f(0, 0, 0); v3f rotation = v3f(0, 0, 0); - co->getBonePosition(bone, &position, &rotation); + sao->getBonePosition(bone, &position, &rotation); push_v3f(L, position); push_v3f(L, rotation); @@ -668,44 +579,34 @@ int ObjectRef::l_get_bone_position(lua_State *L) int ObjectRef::l_set_attach(lua_State *L) { GET_ENV_PTR; - ObjectRef *ref = checkobject(L, 1); ObjectRef *parent_ref = checkobject(L, 2); - ServerActiveObject *co = getobject(ref); + ServerActiveObject *sao = getobject(ref); ServerActiveObject *parent = getobject(parent_ref); - if (co == NULL) + if (sao == nullptr || parent == nullptr) return 0; - - if (parent == NULL) - return 0; - - if (co == parent) + if (sao == parent) throw LuaError("ObjectRef::set_attach: attaching object to itself is not allowed."); - // Do it int parent_id = 0; std::string bone; v3f position = v3f(0, 0, 0); v3f rotation = v3f(0, 0, 0); bool force_visible; - co->getAttachment(&parent_id, &bone, &position, &rotation, &force_visible); + + sao->getAttachment(&parent_id, &bone, &position, &rotation, &force_visible); if (parent_id) { ServerActiveObject *old_parent = env->getActiveObject(parent_id); - old_parent->removeAttachmentChild(co->getId()); + old_parent->removeAttachmentChild(sao->getId()); } - bone = ""; - if (!lua_isnil(L, 3)) - bone = readParam(L, 3); - position = v3f(0, 0, 0); - if (!lua_isnil(L, 4)) - position = read_v3f(L, 4); - rotation = v3f(0, 0, 0); - if (!lua_isnil(L, 5)) - rotation = read_v3f(L, 5); + bone = readParam(L, 3, ""); + position = read_v3f(L, 4); + rotation = read_v3f(L, 5); force_visible = readParam(L, 6, false); - co->setAttachment(parent->getId(), bone, position, rotation, force_visible); - parent->addAttachmentChild(co->getId()); + + sao->setAttachment(parent->getId(), bone, position, rotation, force_visible); + parent->addAttachmentChild(sao->getId()); return 0; } @@ -713,23 +614,22 @@ int ObjectRef::l_set_attach(lua_State *L) int ObjectRef::l_get_attach(lua_State *L) { GET_ENV_PTR; - ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - // Do it int parent_id = 0; std::string bone; v3f position = v3f(0, 0, 0); v3f rotation = v3f(0, 0, 0); bool force_visible; - co->getAttachment(&parent_id, &bone, &position, &rotation, &force_visible); - if (!parent_id) - return 0; - ServerActiveObject *parent = env->getActiveObject(parent_id); + sao->getAttachment(&parent_id, &bone, &position, &rotation, &force_visible); + if (parent_id == 0) + return 0; + + ServerActiveObject *parent = env->getActiveObject(parent_id); getScriptApiBase(L)->objectrefGetOrCreate(L, parent); lua_pushlstring(L, bone.c_str(), bone.size()); push_v3f(L, position); @@ -742,7 +642,6 @@ int ObjectRef::l_get_attach(lua_State *L) int ObjectRef::l_get_children(lua_State *L) { GET_ENV_PTR; - ObjectRef *ref = checkobject(L, 1); ServerActiveObject *sao = getobject(ref); if (sao == nullptr) @@ -750,6 +649,7 @@ int ObjectRef::l_get_children(lua_State *L) const std::unordered_set child_ids = sao->getAttachmentChildIds(); int i = 0; + lua_createtable(L, child_ids.size(), 0); for (const int id : child_ids) { ServerActiveObject *child = env->getActiveObject(id); @@ -763,13 +663,12 @@ int ObjectRef::l_get_children(lua_State *L) int ObjectRef::l_set_detach(lua_State *L) { GET_ENV_PTR; - ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - co->clearParentAttachment(); + sao->clearParentAttachment(); return 0; } @@ -778,16 +677,16 @@ int ObjectRef::l_set_properties(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (!co) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - ObjectProperties *prop = co->accessObjectProperties(); - if (!prop) + ObjectProperties *prop = sao->accessObjectProperties(); + if (prop == nullptr) return 0; - read_object_properties(L, 2, co, prop, getServer(L)->idef()); - co->notifyObjectPropertiesModified(); + read_object_properties(L, 2, sao, prop, getServer(L)->idef()); + sao->notifyObjectPropertiesModified(); return 0; } @@ -796,12 +695,14 @@ int ObjectRef::l_get_properties(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - ObjectProperties *prop = co->accessObjectProperties(); - if (!prop) + + ObjectProperties *prop = sao->accessObjectProperties(); + if (prop == nullptr) return 0; + push_object_properties(L, prop); return 1; } @@ -812,7 +713,7 @@ int ObjectRef::l_is_player(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - lua_pushboolean(L, (player != NULL)); + lua_pushboolean(L, (player != nullptr)); return 1; } @@ -821,12 +722,12 @@ int ObjectRef::l_set_nametag_attributes(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - ObjectProperties *prop = co->accessObjectProperties(); - if (!prop) + + ObjectProperties *prop = sao->accessObjectProperties(); + if (prop == nullptr) return 0; lua_getfield(L, 2, "color"); @@ -840,7 +741,7 @@ int ObjectRef::l_set_nametag_attributes(lua_State *L) std::string nametag = getstringfield_default(L, 2, "text", ""); prop->nametag = nametag; - co->notifyObjectPropertiesModified(); + sao->notifyObjectPropertiesModified(); lua_pushboolean(L, true); return 1; } @@ -850,11 +751,11 @@ int ObjectRef::l_get_nametag_attributes(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - ServerActiveObject *co = getobject(ref); - - if (co == NULL) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - ObjectProperties *prop = co->accessObjectProperties(); + + ObjectProperties *prop = sao->accessObjectProperties(); if (!prop) return 0; @@ -870,37 +771,39 @@ int ObjectRef::l_get_nametag_attributes(lua_State *L) /* LuaEntitySAO-only */ -// set_velocity(self, {x=num, y=num, z=num}) +// set_velocity(self, velocity) int ObjectRef::l_set_velocity(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (co == NULL) return 0; - v3f pos = checkFloatPos(L, 2); - // Do it - co->setVelocity(pos); + LuaEntitySAO *sao = getluaobject(ref); + if (sao == nullptr) + return 0; + + v3f vel = checkFloatPos(L, 2); + + sao->setVelocity(vel); return 0; } -// add_velocity(self, {x=num, y=num, z=num}) +// add_velocity(self, velocity) int ObjectRef::l_add_velocity(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - v3f vel = checkFloatPos(L, 2); - - ServerActiveObject *obj = getobject(ref); - if (obj == nullptr) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - if (obj->getType() == ACTIVEOBJECT_TYPE_LUAENTITY) { - LuaEntitySAO *co = dynamic_cast(obj); - co->addVelocity(vel); - } else if (obj->getType() == ACTIVEOBJECT_TYPE_PLAYER) { - PlayerSAO *player = dynamic_cast(obj); - player->setMaxSpeedOverride(vel); - getServer(L)->SendPlayerSpeed(player->getPeerID(), vel); + v3f vel = checkFloatPos(L, 2); + + if (sao->getType() == ACTIVEOBJECT_TYPE_LUAENTITY) { + LuaEntitySAO *entitysao = dynamic_cast(sao); + entitysao->addVelocity(vel); + } else if (sao->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + PlayerSAO *playersao = dynamic_cast(sao); + playersao->setMaxSpeedOverride(vel); + getServer(L)->SendPlayerSpeed(playersao->getPeerID(), vel); } return 0; @@ -911,18 +814,17 @@ int ObjectRef::l_get_velocity(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - - ServerActiveObject *obj = getobject(ref); - if (obj == nullptr) + ServerActiveObject *sao = getobject(ref); + if (sao == nullptr) return 0; - if (obj->getType() == ACTIVEOBJECT_TYPE_LUAENTITY) { - LuaEntitySAO *co = dynamic_cast(obj); - v3f v = co->getVelocity(); - pushFloatPos(L, v); + if (sao->getType() == ACTIVEOBJECT_TYPE_LUAENTITY) { + LuaEntitySAO *entitysao = dynamic_cast(sao); + v3f vel = entitysao->getVelocity(); + pushFloatPos(L, vel); return 1; - } else if (obj->getType() == ACTIVEOBJECT_TYPE_PLAYER) { - RemotePlayer *player = dynamic_cast(obj)->getPlayer(); + } else if (sao->getType() == ACTIVEOBJECT_TYPE_PLAYER) { + RemotePlayer *player = dynamic_cast(sao)->getPlayer(); push_v3f(L, player->getSpeed() / BS); return 1; } @@ -931,17 +833,18 @@ int ObjectRef::l_get_velocity(lua_State *L) return 1; } -// set_acceleration(self, {x=num, y=num, z=num}) +// set_acceleration(self, acceleration) int ObjectRef::l_set_acceleration(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (co == NULL) return 0; - // pos - v3f pos = checkFloatPos(L, 2); - // Do it - co->setAcceleration(pos); + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) + return 0; + + v3f acceleration = checkFloatPos(L, 2); + + entitysao->setAcceleration(acceleration); return 0; } @@ -950,59 +853,61 @@ int ObjectRef::l_get_acceleration(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (co == NULL) return 0; - // Do it - v3f v = co->getAcceleration(); - pushFloatPos(L, v); + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) + return 0; + + v3f acceleration = entitysao->getAcceleration(); + pushFloatPos(L, acceleration); return 1; } -// set_rotation(self, {x=num, y=num, z=num}) -// Each 'num' is in radians +// set_rotation(self, rotation) int ObjectRef::l_set_rotation(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (!co) + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) return 0; v3f rotation = check_v3f(L, 2) * core::RADTODEG; - co->setRotation(rotation); + + entitysao->setRotation(rotation); return 0; } // get_rotation(self) -// returns: {x=num, y=num, z=num} -// Each 'num' is in radians int ObjectRef::l_get_rotation(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (!co) + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) return 0; + v3f rotation = entitysao->getRotation() * core::DEGTORAD; + lua_newtable(L); - v3f rotation = co->getRotation() * core::DEGTORAD; push_v3f(L, rotation); return 1; } -// set_yaw(self, radians) +// set_yaw(self, yaw) int ObjectRef::l_set_yaw(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) + return 0; - if (co == NULL) return 0; if (isNaN(L, 2)) throw LuaError("ObjectRef::set_yaw: NaN value is not allowed."); float yaw = readParam(L, 2) * core::RADTODEG; - co->setRotation(v3f(0, yaw, 0)); + + entitysao->setRotation(v3f(0, yaw, 0)); return 0; } @@ -1011,11 +916,12 @@ int ObjectRef::l_get_yaw(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (!co) + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) return 0; - float yaw = co->getRotation().Y * core::DEGTORAD; + float yaw = entitysao->getRotation().Y * core::DEGTORAD; + lua_pushnumber(L, yaw); return 1; } @@ -1025,11 +931,13 @@ int ObjectRef::l_set_texture_mod(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (co == NULL) return 0; - // Do it - std::string mod = luaL_checkstring(L, 2); - co->setTextureMod(mod); + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) + return 0; + + std::string mod = readParam(L, 2); + + entitysao->setTextureMod(mod); return 0; } @@ -1038,36 +946,31 @@ int ObjectRef::l_get_texture_mod(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (co == NULL) return 0; - // Do it - std::string mod = co->getTextureMod(); + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) + return 0; + + std::string mod = entitysao->getTextureMod(); + lua_pushstring(L, mod.c_str()); return 1; } -// set_sprite(self, p={x=0,y=0}, num_frames=1, framelength=0.2, -// select_horiz_by_yawpitch=false) +// set_sprite(self, start_frame, num_frames, framelength, select_x_by_camera) int ObjectRef::l_set_sprite(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (co == NULL) return 0; - // Do it - v2s16 p(0,0); - if (!lua_isnil(L, 2)) - p = readParam(L, 2); - int num_frames = 1; - if (!lua_isnil(L, 3)) - num_frames = lua_tonumber(L, 3); - float framelength = 0.2; - if (!lua_isnil(L, 4)) - framelength = lua_tonumber(L, 4); - bool select_horiz_by_yawpitch = false; - if (!lua_isnil(L, 5)) - select_horiz_by_yawpitch = readParam(L, 5); - co->setSprite(p, num_frames, framelength, select_horiz_by_yawpitch); + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) + return 0; + + v2s16 start_frame = lua_isnil(L, 2) ? v2s16(0,0) : readParam(L, 2); + int num_frames = lua_isnil(L, 3) ? 1 : luaL_checkint(L, 3); + float framelength = lua_isnil(L, 4) ? 0.2 : lua_tonumber(L, 4); + bool select_x_by_camera = readParam(L, 5, false); + + entitysao->setSprite(start_frame, num_frames, framelength, select_x_by_camera); return 0; } @@ -1077,11 +980,13 @@ int ObjectRef::l_get_entity_name(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); + LuaEntitySAO *entitysao = getluaobject(ref); log_deprecated(L,"Deprecated call to \"get_entity_name"); - if (co == NULL) return 0; - // Do it - std::string name = co->getName(); + if (entitysao == nullptr) + return 0; + + std::string name = entitysao->getName(); + lua_pushstring(L, name.c_str()); return 1; } @@ -1091,39 +996,27 @@ int ObjectRef::l_get_luaentity(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - LuaEntitySAO *co = getluaobject(ref); - if (co == NULL) return 0; - // Do it - luaentity_get(L, co->getId()); + LuaEntitySAO *entitysao = getluaobject(ref); + if (entitysao == nullptr) + return 0; + + luaentity_get(L, entitysao->getId()); return 1; } /* Player-only */ -// is_player_connected(self) -int ObjectRef::l_is_player_connected(lua_State *L) -{ - NO_MAP_LOCK_REQUIRED; - // This method was once added for a bugfix, but never documented - log_deprecated(L, "is_player_connected is undocumented and " - "will be removed in a future release"); - ObjectRef *ref = checkobject(L, 1); - RemotePlayer *player = getplayer(ref); - lua_pushboolean(L, (player != NULL && player->getPeerId() != PEER_ID_INEXISTENT)); - return 1; -} - // get_player_name(self) int ObjectRef::l_get_player_name(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) { + if (player == nullptr) { lua_pushlstring(L, "", 0); return 1; } - // Do it + lua_pushstring(L, player->getName()); return 1; } @@ -1133,13 +1026,15 @@ int ObjectRef::l_get_look_dir(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; - // Do it - float pitch = co->getRadLookPitchDep(); - float yaw = co->getRadYawDep(); + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + + float pitch = playersao->getRadLookPitchDep(); + float yaw = playersao->getRadYawDep(); v3f v(std::cos(pitch) * std::cos(yaw), std::sin(pitch), std::cos(pitch) * std::sin(yaw)); + push_v3f(L, v); return 1; } @@ -1154,10 +1049,11 @@ int ObjectRef::l_get_look_pitch(lua_State *L) "Deprecated call to get_look_pitch, use get_look_vertical instead"); ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; - // Do it - lua_pushnumber(L, co->getRadLookPitchDep()); + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + + lua_pushnumber(L, playersao->getRadLookPitchDep()); return 1; } @@ -1171,34 +1067,37 @@ int ObjectRef::l_get_look_yaw(lua_State *L) "Deprecated call to get_look_yaw, use get_look_horizontal instead"); ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; - // Do it - lua_pushnumber(L, co->getRadYawDep()); + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + + lua_pushnumber(L, playersao->getRadYawDep()); return 1; } -// get_look_pitch2(self) +// get_look_vertical(self) int ObjectRef::l_get_look_vertical(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; - // Do it - lua_pushnumber(L, co->getRadLookPitch()); + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + + lua_pushnumber(L, playersao->getRadLookPitch()); return 1; } -// get_look_yaw2(self) +// get_look_horizontal(self) int ObjectRef::l_get_look_horizontal(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; - // Do it - lua_pushnumber(L, co->getRadRotation().Y); + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + + lua_pushnumber(L, playersao->getRadRotation().Y); return 1; } @@ -1207,11 +1106,13 @@ int ObjectRef::l_set_look_vertical(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + float pitch = readParam(L, 2) * core::RADTODEG; - // Do it - co->setLookPitchAndSend(pitch); + + playersao->setLookPitchAndSend(pitch); return 1; } @@ -1220,11 +1121,13 @@ int ObjectRef::l_set_look_horizontal(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + float yaw = readParam(L, 2) * core::RADTODEG; - // Do it - co->setPlayerYawAndSend(yaw); + + playersao->setPlayerYawAndSend(yaw); return 1; } @@ -1238,11 +1141,13 @@ int ObjectRef::l_set_look_pitch(lua_State *L) "Deprecated call to set_look_pitch, use set_look_vertical instead."); ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + float pitch = readParam(L, 2) * core::RADTODEG; - // Do it - co->setLookPitchAndSend(pitch); + + playersao->setLookPitchAndSend(pitch); return 1; } @@ -1256,30 +1161,32 @@ int ObjectRef::l_set_look_yaw(lua_State *L) "Deprecated call to set_look_yaw, use set_look_horizontal instead."); ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + float yaw = readParam(L, 2) * core::RADTODEG; - // Do it - co->setPlayerYawAndSend(yaw); + + playersao->setPlayerYawAndSend(yaw); return 1; } -// set_fov(self, degrees[, is_multiplier, transition_time]) +// set_fov(self, degrees, is_multiplier, transition_time) int ObjectRef::l_set_fov(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) + if (player == nullptr) return 0; - player->setFov({ - static_cast(luaL_checknumber(L, 2)), - readParam(L, 3, false), - lua_isnumber(L, 4) ? static_cast(luaL_checknumber(L, 4)) : 0.0f - }); - getServer(L)->SendPlayerFov(player->getPeerId()); + float degrees = static_cast(luaL_checknumber(L, 2)); + bool is_multiplier = readParam(L, 3, false); + float transition_time = lua_isnumber(L, 4) ? + static_cast(luaL_checknumber(L, 4)) : 0.0f; + player->setFov({degrees, is_multiplier, transition_time}); + getServer(L)->SendPlayerFov(player->getPeerId()); return 0; } @@ -1289,14 +1196,14 @@ int ObjectRef::l_get_fov(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) + if (player == nullptr) return 0; PlayerFovSpec fov_spec = player->getFov(); + lua_pushnumber(L, fov_spec.fov); lua_pushboolean(L, fov_spec.is_multiplier); lua_pushnumber(L, fov_spec.transition_time); - return 3; } @@ -1305,11 +1212,13 @@ int ObjectRef::l_set_breath(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; - u16 breath = luaL_checknumber(L, 2); - co->setBreath(breath); + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + u16 breath = luaL_checknumber(L, 2); + + playersao->setBreath(breath); return 0; } @@ -1318,11 +1227,13 @@ int ObjectRef::l_get_breath(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) return 0; - // Do it - u16 breath = co->getBreath(); - lua_pushinteger (L, breath); + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) + return 0; + + u16 breath = playersao->getBreath(); + + lua_pushinteger(L, breath); return 1; } @@ -1333,16 +1244,16 @@ int ObjectRef::l_set_attribute(lua_State *L) "Deprecated call to set_attribute, use MetaDataRef methods instead."); ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) return 0; std::string attr = luaL_checkstring(L, 2); if (lua_isnil(L, 3)) { - co->getMeta().removeString(attr); + playersao->getMeta().removeString(attr); } else { std::string value = luaL_checkstring(L, 3); - co->getMeta().setString(attr, value); + playersao->getMeta().setString(attr, value); } return 1; } @@ -1354,14 +1265,14 @@ int ObjectRef::l_get_attribute(lua_State *L) "Deprecated call to get_attribute, use MetaDataRef methods instead."); ObjectRef *ref = checkobject(L, 1); - PlayerSAO* co = getplayersao(ref); - if (co == NULL) + PlayerSAO* playersao = getplayersao(ref); + if (playersao == nullptr) return 0; std::string attr = luaL_checkstring(L, 2); std::string value; - if (co->getMeta().getStringToRef(attr, value)) { + if (playersao->getMeta().getStringToRef(attr, value)) { lua_pushstring(L, value.c_str()); return 1; } @@ -1374,11 +1285,11 @@ int ObjectRef::l_get_attribute(lua_State *L) int ObjectRef::l_get_meta(lua_State *L) { ObjectRef *ref = checkobject(L, 1); - PlayerSAO *co = getplayersao(ref); - if (co == NULL) + PlayerSAO *playersao = getplayersao(ref); + if (playersao == nullptr) return 0; - PlayerMetaRef::create(L, &co->getMeta()); + PlayerMetaRef::create(L, &playersao->getMeta()); return 1; } @@ -1389,7 +1300,9 @@ int ObjectRef::l_set_inventory_formspec(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) return 0; + if (player == nullptr) + return 0; + std::string formspec = luaL_checkstring(L, 2); player->inventory_formspec = formspec; @@ -1404,9 +1317,11 @@ int ObjectRef::l_get_inventory_formspec(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) return 0; + if (player == nullptr) + return 0; std::string formspec = player->inventory_formspec; + lua_pushlstring(L, formspec.c_str(), formspec.size()); return 1; } @@ -1417,7 +1332,7 @@ int ObjectRef::l_set_formspec_prepend(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; std::string formspec = luaL_checkstring(L, 2); @@ -1428,16 +1343,17 @@ int ObjectRef::l_set_formspec_prepend(lua_State *L) return 1; } -// get_formspec_prepend(self) -> formspec +// get_formspec_prepend(self) int ObjectRef::l_get_formspec_prepend(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; std::string formspec = player->formspec_prepend; + lua_pushlstring(L, formspec.c_str(), formspec.size()); return 1; } @@ -1448,7 +1364,7 @@ int ObjectRef::l_get_player_control(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) { + if (player == nullptr) { lua_pushlstring(L, "", 0); return 1; } @@ -1489,22 +1405,73 @@ int ObjectRef::l_get_player_control_bits(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) { + if (player == nullptr) { lua_pushlstring(L, "", 0); return 1; } - // Do it + lua_pushnumber(L, player->keyPressed); return 1; } -// hud_add(self, form) +// set_physics_override(self, override_table) +int ObjectRef::l_set_physics_override(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + ObjectRef *ref = checkobject(L, 1); + PlayerSAO *playersao = (PlayerSAO *) getobject(ref); + if (playersao == nullptr) + return 0; + + luaL_checktype(L, 2, LUA_TTABLE); + playersao->m_physics_override_speed = getfloatfield_default( + L, 2, "speed", playersao->m_physics_override_speed); + playersao->m_physics_override_jump = getfloatfield_default( + L, 2, "jump", playersao->m_physics_override_jump); + playersao->m_physics_override_gravity = getfloatfield_default( + L, 2, "gravity", playersao->m_physics_override_gravity); + playersao->m_physics_override_sneak = getboolfield_default( + L, 2, "sneak", playersao->m_physics_override_sneak); + playersao->m_physics_override_sneak_glitch = getboolfield_default( + L, 2, "sneak_glitch", playersao->m_physics_override_sneak_glitch); + playersao->m_physics_override_new_move = getboolfield_default( + L, 2, "new_move", playersao->m_physics_override_new_move); + playersao->m_physics_override_sent = false; + return 0; +} + +// get_physics_override(self) +int ObjectRef::l_get_physics_override(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + ObjectRef *ref = checkobject(L, 1); + PlayerSAO *playersao = (PlayerSAO *)getobject(ref); + if (playersao == nullptr) + return 0; + + lua_newtable(L); + lua_pushnumber(L, playersao->m_physics_override_speed); + lua_setfield(L, -2, "speed"); + lua_pushnumber(L, playersao->m_physics_override_jump); + lua_setfield(L, -2, "jump"); + lua_pushnumber(L, playersao->m_physics_override_gravity); + lua_setfield(L, -2, "gravity"); + lua_pushboolean(L, playersao->m_physics_override_sneak); + lua_setfield(L, -2, "sneak"); + lua_pushboolean(L, playersao->m_physics_override_sneak_glitch); + lua_setfield(L, -2, "sneak_glitch"); + lua_pushboolean(L, playersao->m_physics_override_new_move); + lua_setfield(L, -2, "new_move"); + return 1; +} + +// hud_add(self, hud) int ObjectRef::l_hud_add(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; HudElement *elem = new HudElement; @@ -1526,12 +1493,10 @@ int ObjectRef::l_hud_remove(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; - u32 id = -1; - if (!lua_isnil(L, 2)) - id = lua_tonumber(L, 2); + u32 id = luaL_checkint(L, 2); if (!getServer(L)->hudRemove(player, id)) return 0; @@ -1546,17 +1511,17 @@ int ObjectRef::l_hud_change(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; - u32 id = lua_isnumber(L, 2) ? lua_tonumber(L, 2) : -1; + u32 id = luaL_checkint(L, 2); - HudElement *e = player->getHud(id); - if (!e) + HudElement *elem = player->getHud(id); + if (elem == nullptr) return 0; - void *value = NULL; - HudElementStat stat = read_hud_change(L, e, &value); + void *value = nullptr; + HudElementStat stat = read_hud_change(L, elem, &value); getServer(L)->hudChange(player, id, stat, value); @@ -1570,15 +1535,16 @@ int ObjectRef::l_hud_get(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; - u32 id = lua_tonumber(L, -1); + u32 id = luaL_checkint(L, 2); - HudElement *e = player->getHud(id); - if (!e) + HudElement *elem = player->getHud(id); + if (elem == nullptr) return 0; - push_hud_element(L, e); + + push_hud_element(L, elem); return 1; } @@ -1588,7 +1554,7 @@ int ObjectRef::l_hud_set_flags(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; u32 flags = 0; @@ -1609,12 +1575,13 @@ int ObjectRef::l_hud_set_flags(lua_State *L) return 1; } +// hud_get_flags(self) int ObjectRef::l_hud_get_flags(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; lua_newtable(L); @@ -1632,7 +1599,6 @@ int ObjectRef::l_hud_get_flags(lua_State *L) lua_setfield(L, -2, "minimap"); lua_pushboolean(L, player->hud_flags & HUD_FLAG_MINIMAP_RADAR_VISIBLE); lua_setfield(L, -2, "minimap_radar"); - return 1; } @@ -1642,10 +1608,10 @@ int ObjectRef::l_hud_set_hotbar_itemcount(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; - s32 hotbar_itemcount = lua_tonumber(L, 2); + s32 hotbar_itemcount = luaL_checkint(L, 2); if (!getServer(L)->hudSetHotbarItemcount(player, hotbar_itemcount)) return 0; @@ -1660,7 +1626,7 @@ int ObjectRef::l_hud_get_hotbar_itemcount(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; lua_pushnumber(L, player->getHotbarItemcount()); @@ -1673,7 +1639,7 @@ int ObjectRef::l_hud_set_hotbar_image(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; std::string name = readParam(L, 2); @@ -1688,10 +1654,11 @@ int ObjectRef::l_hud_get_hotbar_image(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; const std::string &name = player->getHotbarImage(); + lua_pushlstring(L, name.c_str(), name.size()); return 1; } @@ -1702,7 +1669,7 @@ int ObjectRef::l_hud_set_hotbar_selected_image(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; std::string name = readParam(L, 2); @@ -1717,44 +1684,45 @@ int ObjectRef::l_hud_get_hotbar_selected_image(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; const std::string &name = player->getHotbarSelectedImage(); + lua_pushlstring(L, name.c_str(), name.size()); return 1; } -// set_sky(self, {base_color=, type=, textures=, clouds=, sky_colors={}}) +// set_sky(self, sky_parameters) int ObjectRef::l_set_sky(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) + if (player == nullptr) return 0; + SkyboxParams sky_params = player->getSkyParams(); bool is_colorspec = is_color_table(L, 2); - SkyboxParams skybox_params = player->getSkyParams(); if (lua_istable(L, 2) && !is_colorspec) { lua_getfield(L, 2, "base_color"); if (!lua_isnil(L, -1)) - read_color(L, -1, &skybox_params.bgcolor); + read_color(L, -1, &sky_params.bgcolor); lua_pop(L, 1); lua_getfield(L, 2, "type"); if (!lua_isnil(L, -1)) - skybox_params.type = luaL_checkstring(L, -1); + sky_params.type = luaL_checkstring(L, -1); lua_pop(L, 1); lua_getfield(L, 2, "textures"); - skybox_params.textures.clear(); - if (lua_istable(L, -1) && skybox_params.type == "skybox") { + sky_params.textures.clear(); + if (lua_istable(L, -1) && sky_params.type == "skybox") { lua_pushnil(L); while (lua_next(L, -2) != 0) { // Key is at index -2 and value at index -1 - skybox_params.textures.emplace_back(readParam(L, -1)); + sky_params.textures.emplace_back(readParam(L, -1)); // Removes the value, but keeps the key for iteration lua_pop(L, 1); } @@ -1767,56 +1735,56 @@ int ObjectRef::l_set_sky(lua_State *L) using "regular" or "plain" skybox modes as textures aren't needed. */ - if (skybox_params.textures.size() != 6 && skybox_params.textures.size() > 0) + if (sky_params.textures.size() != 6 && sky_params.textures.size() > 0) throw LuaError("Skybox expects 6 textures!"); - skybox_params.clouds = getboolfield_default(L, 2, - "clouds", skybox_params.clouds); + sky_params.clouds = getboolfield_default(L, 2, + "clouds", sky_params.clouds); lua_getfield(L, 2, "sky_color"); if (lua_istable(L, -1)) { lua_getfield(L, -1, "day_sky"); - read_color(L, -1, &skybox_params.sky_color.day_sky); + read_color(L, -1, &sky_params.sky_color.day_sky); lua_pop(L, 1); lua_getfield(L, -1, "day_horizon"); - read_color(L, -1, &skybox_params.sky_color.day_horizon); + read_color(L, -1, &sky_params.sky_color.day_horizon); lua_pop(L, 1); lua_getfield(L, -1, "dawn_sky"); - read_color(L, -1, &skybox_params.sky_color.dawn_sky); + read_color(L, -1, &sky_params.sky_color.dawn_sky); lua_pop(L, 1); lua_getfield(L, -1, "dawn_horizon"); - read_color(L, -1, &skybox_params.sky_color.dawn_horizon); + read_color(L, -1, &sky_params.sky_color.dawn_horizon); lua_pop(L, 1); lua_getfield(L, -1, "night_sky"); - read_color(L, -1, &skybox_params.sky_color.night_sky); + read_color(L, -1, &sky_params.sky_color.night_sky); lua_pop(L, 1); lua_getfield(L, -1, "night_horizon"); - read_color(L, -1, &skybox_params.sky_color.night_horizon); + read_color(L, -1, &sky_params.sky_color.night_horizon); lua_pop(L, 1); lua_getfield(L, -1, "indoors"); - read_color(L, -1, &skybox_params.sky_color.indoors); + read_color(L, -1, &sky_params.sky_color.indoors); lua_pop(L, 1); // Prevent flickering clouds at dawn/dusk: - skybox_params.fog_sun_tint = video::SColor(255, 255, 255, 255); + sky_params.fog_sun_tint = video::SColor(255, 255, 255, 255); lua_getfield(L, -1, "fog_sun_tint"); - read_color(L, -1, &skybox_params.fog_sun_tint); + read_color(L, -1, &sky_params.fog_sun_tint); lua_pop(L, 1); - skybox_params.fog_moon_tint = video::SColor(255, 255, 255, 255); + sky_params.fog_moon_tint = video::SColor(255, 255, 255, 255); lua_getfield(L, -1, "fog_moon_tint"); - read_color(L, -1, &skybox_params.fog_moon_tint); + read_color(L, -1, &sky_params.fog_moon_tint); lua_pop(L, 1); lua_getfield(L, -1, "fog_tint_type"); if (!lua_isnil(L, -1)) - skybox_params.fog_tint_type = luaL_checkstring(L, -1); + sky_params.fog_tint_type = luaL_checkstring(L, -1); lua_pop(L, 1); // Because we need to leave the "sky_color" table. @@ -1832,14 +1800,14 @@ int ObjectRef::l_set_sky(lua_State *L) StarParams star_params = player->getStarParams(); // Prevent erroneous background colors - skybox_params.bgcolor = video::SColor(255, 255, 255, 255); - read_color(L, 2, &skybox_params.bgcolor); + sky_params.bgcolor = video::SColor(255, 255, 255, 255); + read_color(L, 2, &sky_params.bgcolor); - skybox_params.type = luaL_checkstring(L, 3); + sky_params.type = luaL_checkstring(L, 3); // Preserve old behaviour of the sun, moon and stars // when using the old set_sky call. - if (skybox_params.type == "regular") { + if (sky_params.type == "regular") { sun_params.visible = true; sun_params.sunrise_visible = true; moon_params.visible = true; @@ -1851,31 +1819,31 @@ int ObjectRef::l_set_sky(lua_State *L) star_params.visible = false; } - skybox_params.textures.clear(); + sky_params.textures.clear(); if (lua_istable(L, 4)) { lua_pushnil(L); while (lua_next(L, 4) != 0) { // Key at index -2, and value at index -1 if (lua_isstring(L, -1)) - skybox_params.textures.emplace_back(readParam(L, -1)); + sky_params.textures.emplace_back(readParam(L, -1)); else - skybox_params.textures.emplace_back(""); + sky_params.textures.emplace_back(""); // Remove the value, keep the key for the next iteration lua_pop(L, 1); } } - if (skybox_params.type == "skybox" && skybox_params.textures.size() != 6) + if (sky_params.type == "skybox" && sky_params.textures.size() != 6) throw LuaError("Skybox expects 6 textures."); - skybox_params.clouds = true; + sky_params.clouds = true; if (lua_isboolean(L, 5)) - skybox_params.clouds = readParam(L, 5); + sky_params.clouds = readParam(L, 5); getServer(L)->setSun(player, sun_params); getServer(L)->setMoon(player, moon_params); getServer(L)->setStars(player, star_params); } - getServer(L)->setSky(player, skybox_params); + getServer(L)->setSky(player, sky_params); lua_pushboolean(L, true); return 1; } @@ -1886,18 +1854,17 @@ int ObjectRef::l_get_sky(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - - if (!player) + if (player == nullptr) return 0; - SkyboxParams skybox_params; - skybox_params = player->getSkyParams(); + + SkyboxParams skybox_params = player->getSkyParams(); push_ARGB8(L, skybox_params.bgcolor); lua_pushlstring(L, skybox_params.type.c_str(), skybox_params.type.size()); lua_newtable(L); s16 i = 1; - for (const std::string& texture : skybox_params.textures) { + for (const std::string &texture : skybox_params.textures) { lua_pushlstring(L, texture.c_str(), texture.size()); lua_rawseti(L, -2, i++); } @@ -1911,11 +1878,10 @@ int ObjectRef::l_get_sky_color(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - - if (!player) + if (player == nullptr) return 0; - const SkyboxParams& skybox_params = player->getSkyParams(); + const SkyboxParams &skybox_params = player->getSkyParams(); lua_newtable(L); if (skybox_params.type == "regular") { @@ -1943,18 +1909,16 @@ int ObjectRef::l_get_sky_color(lua_State *L) return 1; } -// set_sun(self, {visible, texture=, tonemap=, sunrise=, rotation=, scale=}) +// set_sun(self, sun_parameters) int ObjectRef::l_set_sun(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) - return 0; - - if (!lua_istable(L, 2)) + if (player == nullptr) return 0; + luaL_checktype(L, 2, LUA_TTABLE); SunParams sun_params = player->getSunParams(); sun_params.visible = getboolfield_default(L, 2, @@ -1981,8 +1945,9 @@ int ObjectRef::l_get_sun(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) + if (player == nullptr) return 0; + const SunParams &sun_params = player->getSunParams(); lua_newtable(L); @@ -1998,21 +1963,19 @@ int ObjectRef::l_get_sun(lua_State *L) lua_setfield(L, -2, "sunrise_visible"); lua_pushnumber(L, sun_params.scale); lua_setfield(L, -2, "scale"); - return 1; } -// set_moon(self, {visible, texture=, tonemap=, sunrise=, rotation=, scale=}) +// set_moon(self, moon_parameters) int ObjectRef::l_set_moon(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) - return 0; - if (!lua_istable(L, 2)) + if (player == nullptr) return 0; + luaL_checktype(L, 2, LUA_TTABLE); MoonParams moon_params = player->getMoonParams(); moon_params.visible = getboolfield_default(L, 2, @@ -2035,8 +1998,9 @@ int ObjectRef::l_get_moon(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) + if (player == nullptr) return 0; + const MoonParams &moon_params = player->getMoonParams(); lua_newtable(L); @@ -2048,21 +2012,19 @@ int ObjectRef::l_get_moon(lua_State *L) lua_setfield(L, -2, "tonemap"); lua_pushnumber(L, moon_params.scale); lua_setfield(L, -2, "scale"); - return 1; } -// set_stars(self, {visible, count=, starcolor=, rotation=, scale=}) +// set_stars(self, star_parameters) int ObjectRef::l_set_stars(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) - return 0; - if (!lua_istable(L, 2)) + if (player == nullptr) return 0; + luaL_checktype(L, 2, LUA_TTABLE); StarParams star_params = player->getStarParams(); star_params.visible = getboolfield_default(L, 2, @@ -2089,8 +2051,9 @@ int ObjectRef::l_get_stars(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) + if (player == nullptr) return 0; + const StarParams &star_params = player->getStarParams(); lua_newtable(L); @@ -2102,21 +2065,19 @@ int ObjectRef::l_get_stars(lua_State *L) lua_setfield(L, -2, "star_color"); lua_pushnumber(L, star_params.scale); lua_setfield(L, -2, "scale"); - return 1; } -// set_clouds(self, {density=, color=, ambient=, height=, thickness=, speed=}) +// set_clouds(self, cloud_parameters) int ObjectRef::l_set_clouds(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) - return 0; - if (!lua_istable(L, 2)) + if (player == nullptr) return 0; + luaL_checktype(L, 2, LUA_TTABLE); CloudParams cloud_params = player->getCloudParams(); cloud_params.density = getfloatfield_default(L, 2, "density", cloud_params.density); @@ -2152,8 +2113,9 @@ int ObjectRef::l_get_clouds(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (!player) + if (player == nullptr) return 0; + const CloudParams &cloud_params = player->getCloudParams(); lua_newtable(L); @@ -2173,25 +2135,27 @@ int ObjectRef::l_get_clouds(lua_State *L) lua_pushnumber(L, cloud_params.speed.Y); lua_setfield(L, -2, "y"); lua_setfield(L, -2, "speed"); - return 1; } -// override_day_night_ratio(self, brightness=0...1) +// override_day_night_ratio(self, ratio) int ObjectRef::l_override_day_night_ratio(lua_State *L) { NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; bool do_override = false; float ratio = 0.0f; + if (!lua_isnil(L, 2)) { do_override = true; ratio = readParam(L, 2); + luaL_argcheck(L, ratio >= 0.0f && ratio <= 1.0f, 1, + "value must be between 0 and 1"); } getServer(L)->overrideDayNightRatio(player, do_override, ratio); @@ -2205,7 +2169,7 @@ int ObjectRef::l_get_day_night_ratio(lua_State *L) NO_MAP_LOCK_REQUIRED; ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; bool do_override; @@ -2220,26 +2184,18 @@ int ObjectRef::l_get_day_night_ratio(lua_State *L) return 1; } -// set_minimap_modes(self, modes, modeindex) +// set_minimap_modes(self, modes, selected_mode) int ObjectRef::l_set_minimap_modes(lua_State *L) { NO_MAP_LOCK_REQUIRED; - - // Arg 1 should be a player ObjectRef *ref = checkobject(L, 1); RemotePlayer *player = getplayer(ref); - if (player == NULL) + if (player == nullptr) return 0; - // Arg 2 should be a table (of tables) - if (!lua_istable(L, 2)) { - return 0; - } - - // Arg 3 should be a number - s16 wantedmode = lua_tonumber(L, 3); - + luaL_checktype(L, 2, LUA_TTABLE); std::vector modes; + s16 selected_mode = luaL_checkint(L, 3); lua_pushnil(L); while (lua_next(L, 2) != 0) { @@ -2277,31 +2233,28 @@ int ObjectRef::l_set_minimap_modes(lua_State *L) } lua_pop(L, 1); // Remove key - getServer(L)->SendMinimapModes(player->getPeerId(), modes, wantedmode); + getServer(L)->SendMinimapModes(player->getPeerId(), modes, selected_mode); return 0; } ObjectRef::ObjectRef(ServerActiveObject *object): m_object(object) -{ - //infostream<<"ObjectRef created for id="<getId()< formspec + // get_inventory_formspec(self) static int l_get_inventory_formspec(lua_State *L); // set_formspec_prepend(self, formspec) static int l_set_formspec_prepend(lua_State *L); - // get_formspec_prepend(self) -> formspec + // get_formspec_prepend(self) static int l_get_formspec_prepend(lua_State *L); // get_player_control(self) @@ -321,7 +313,7 @@ private: // hud_get_hotbar_selected_image(self) static int l_hud_get_hotbar_selected_image(lua_State *L); - // set_sky({base_color=, type=, textures=, clouds=, sky_colors={}}) + // set_sky(self, sky_parameters) static int l_set_sky(lua_State *L); // get_sky(self) @@ -330,25 +322,25 @@ private: // get_sky_color(self) static int l_get_sky_color(lua_State* L); - // set_sun(self, {visible, texture=, tonemap=, sunrise=, rotation=, scale=}) + // set_sun(self, sun_parameters) static int l_set_sun(lua_State *L); // get_sun(self) static int l_get_sun(lua_State *L); - // set_moon(self, {visible, texture=, tonemap=, rotation, scale=}) + // set_moon(self, moon_parameters) static int l_set_moon(lua_State *L); // get_moon(self) static int l_get_moon(lua_State *L); - // set_stars(self, {visible, count=, starcolor=, rotation, scale=}) + // set_stars(self, star_parameters) static int l_set_stars(lua_State *L); // get_stars(self) static int l_get_stars(lua_State *L); - // set_clouds(self, {density=, color=, ambient=, height=, thickness=, speed=}) + // set_clouds(self, cloud_parameters) static int l_set_clouds(lua_State *L); // get_clouds(self) @@ -360,13 +352,13 @@ private: // get_day_night_ratio(self) static int l_get_day_night_ratio(lua_State *L); - // set_local_animation(self, {stand/idle}, {walk}, {dig}, {walk+dig}, frame_speed) + // set_local_animation(self, idle, walk, dig, walk_while_dig, frame_speed) static int l_set_local_animation(lua_State *L); // get_local_animation(self) static int l_get_local_animation(lua_State *L); - // set_eye_offset(self, v3f first pv, v3f third pv) + // set_eye_offset(self, firstperson, thirdperson) static int l_set_eye_offset(lua_State *L); // get_eye_offset(self) From 707c8c1e95d8db2d84909e7957b4dc9138e05599 Mon Sep 17 00:00:00 2001 From: Vitaliy Date: Sun, 25 Oct 2020 20:01:03 +0300 Subject: [PATCH 128/177] Shaders for Android (GLES 2) (#10506) Shader support for OpenGL ES 2 devices (Android) Co-authored-by: sfan5 --- build/android/app/build.gradle | 5 +- builtin/mainmenu/tab_settings.lua | 11 +- builtin/settingtypes.txt | 4 +- .../3d_interlaced_merge/opengl_fragment.glsl | 4 +- .../3d_interlaced_merge/opengl_vertex.glsl | 7 +- .../default_shader/opengl_fragment.glsl | 4 +- .../shaders/default_shader/opengl_vertex.glsl | 8 +- .../minimap_shader/opengl_fragment.glsl | 7 +- .../shaders/minimap_shader/opengl_vertex.glsl | 10 +- .../shaders/nodes_shader/opengl_fragment.glsl | 13 +- .../shaders/nodes_shader/opengl_vertex.glsl | 42 ++-- .../object_shader/opengl_fragment.glsl | 11 +- .../shaders/object_shader/opengl_vertex.glsl | 25 +-- .../selection_shader/opengl_fragment.glsl | 7 +- .../selection_shader/opengl_vertex.glsl | 9 +- games/devtest/mods/basenodes/init.lua | 4 + src/client/shader.cpp | 182 +++++++++++++----- 17 files changed, 233 insertions(+), 120 deletions(-) diff --git a/build/android/app/build.gradle b/build/android/app/build.gradle index 812726030..fccb7b3b4 100644 --- a/build/android/app/build.gradle +++ b/build/android/app/build.gradle @@ -64,10 +64,9 @@ task prepareAssets() { copy { from "${projRoot}/builtin" into "${assetsFolder}/builtin" } - /*copy { - // ToDo: fix Minetest shaders that currently don't work with OpenGL ES + copy { from "${projRoot}/client/shaders" into "${assetsFolder}/client/shaders" - }*/ + } copy { from "../native/deps/Android/Irrlicht/shaders" into "${assetsFolder}/client/shaders/Irrlicht" } diff --git a/builtin/mainmenu/tab_settings.lua b/builtin/mainmenu/tab_settings.lua index 8a7445394..29744048a 100644 --- a/builtin/mainmenu/tab_settings.lua +++ b/builtin/mainmenu/tab_settings.lua @@ -154,15 +154,18 @@ local function formspec(tabview, name, tabdata) "box[8,0;3.75,4.5;#999999]" local video_driver = core.settings:get("video_driver") - local shaders_supported = video_driver == "opengl" - local shaders_enabled = false - if shaders_supported then - shaders_enabled = core.settings:get_bool("enable_shaders") + local shaders_enabled = core.settings:get_bool("enable_shaders") + if video_driver == "opengl" then tab_string = tab_string .. "checkbox[8.25,0;cb_shaders;" .. fgettext("Shaders") .. ";" .. tostring(shaders_enabled) .. "]" + elseif video_driver == "ogles2" then + tab_string = tab_string .. + "checkbox[8.25,0;cb_shaders;" .. fgettext("Shaders (experimental)") .. ";" + .. tostring(shaders_enabled) .. "]" else core.settings:set_bool("enable_shaders", false) + shaders_enabled = false tab_string = tab_string .. "label[8.38,0.2;" .. core.colorize("#888888", fgettext("Shaders (unavailable)")) .. "]" diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 27f375693..36446f808 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -658,8 +658,8 @@ texture_path (Texture path) path # The rendering back-end for Irrlicht. # A restart is required after changing this. # Note: On Android, stick with OGLES1 if unsure! App may fail to start otherwise. -# On other platforms, OpenGL is recommended, and it’s the only driver with -# shader support currently. +# On other platforms, OpenGL is recommended. +# Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental) video_driver (Video driver) enum opengl null,software,burningsvideo,direct3d8,direct3d9,opengl,ogles1,ogles2 # Radius of cloud area stated in number of 64 node cloud squares. diff --git a/client/shaders/3d_interlaced_merge/opengl_fragment.glsl b/client/shaders/3d_interlaced_merge/opengl_fragment.glsl index 25945ad7f..7cba61b39 100644 --- a/client/shaders/3d_interlaced_merge/opengl_fragment.glsl +++ b/client/shaders/3d_interlaced_merge/opengl_fragment.glsl @@ -6,9 +6,11 @@ uniform sampler2D textureFlags; #define rightImage normalTexture #define maskImage textureFlags +varying mediump vec2 varTexCoord; + void main(void) { - vec2 uv = gl_TexCoord[0].st; + vec2 uv = varTexCoord.st; vec4 left = texture2D(leftImage, uv).rgba; vec4 right = texture2D(rightImage, uv).rgba; vec4 mask = texture2D(maskImage, uv).rgba; diff --git a/client/shaders/3d_interlaced_merge/opengl_vertex.glsl b/client/shaders/3d_interlaced_merge/opengl_vertex.glsl index 4e0b2b125..860049481 100644 --- a/client/shaders/3d_interlaced_merge/opengl_vertex.glsl +++ b/client/shaders/3d_interlaced_merge/opengl_vertex.glsl @@ -1,6 +1,7 @@ +varying mediump vec2 varTexCoord; + void main(void) { - gl_TexCoord[0] = gl_MultiTexCoord0; - gl_Position = gl_Vertex; - gl_FrontColor = gl_BackColor = gl_Color; + varTexCoord = inTexCoord0; + gl_Position = inVertexPosition; } diff --git a/client/shaders/default_shader/opengl_fragment.glsl b/client/shaders/default_shader/opengl_fragment.glsl index 925ab6e1d..5018ac6ea 100644 --- a/client/shaders/default_shader/opengl_fragment.glsl +++ b/client/shaders/default_shader/opengl_fragment.glsl @@ -1,4 +1,6 @@ +varying lowp vec4 varColor; + void main(void) { - gl_FragColor = gl_Color; + gl_FragColor = varColor; } diff --git a/client/shaders/default_shader/opengl_vertex.glsl b/client/shaders/default_shader/opengl_vertex.glsl index d0b16c8b0..d95a3c2d3 100644 --- a/client/shaders/default_shader/opengl_vertex.glsl +++ b/client/shaders/default_shader/opengl_vertex.glsl @@ -1,9 +1,7 @@ -uniform mat4 mWorldViewProj; +varying lowp vec4 varColor; void main(void) { - gl_TexCoord[0] = gl_MultiTexCoord0; - gl_Position = mWorldViewProj * gl_Vertex; - - gl_FrontColor = gl_BackColor = gl_Color; + gl_Position = mWorldViewProj * inVertexPosition; + varColor = inVertexColor; } diff --git a/client/shaders/minimap_shader/opengl_fragment.glsl b/client/shaders/minimap_shader/opengl_fragment.glsl index fa4f9cb1a..cef359e8a 100644 --- a/client/shaders/minimap_shader/opengl_fragment.glsl +++ b/client/shaders/minimap_shader/opengl_fragment.glsl @@ -2,9 +2,12 @@ uniform sampler2D baseTexture; uniform sampler2D normalTexture; uniform vec3 yawVec; +varying lowp vec4 varColor; +varying mediump vec2 varTexCoord; + void main (void) { - vec2 uv = gl_TexCoord[0].st; + vec2 uv = varTexCoord.st; //texture sampling rate const float step = 1.0 / 256.0; @@ -27,6 +30,6 @@ void main (void) vec3 color = (1.1 * diffuse + 0.05 * height + 0.5 * specular) * base.rgb; vec4 col = vec4(color.rgb, base.a); - col *= gl_Color; + col *= varColor; gl_FragColor = vec4(col.rgb, base.a); } diff --git a/client/shaders/minimap_shader/opengl_vertex.glsl b/client/shaders/minimap_shader/opengl_vertex.glsl index 88f9356d5..1a9491805 100644 --- a/client/shaders/minimap_shader/opengl_vertex.glsl +++ b/client/shaders/minimap_shader/opengl_vertex.glsl @@ -1,9 +1,11 @@ -uniform mat4 mWorldViewProj; uniform mat4 mWorld; +varying lowp vec4 varColor; +varying mediump vec2 varTexCoord; + void main(void) { - gl_TexCoord[0] = gl_MultiTexCoord0; - gl_Position = mWorldViewProj * gl_Vertex; - gl_FrontColor = gl_BackColor = gl_Color; + varTexCoord = inTexCoord0.st; + gl_Position = mWorldViewProj * inVertexPosition; + varColor = inVertexColor; } diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl index 36d47d1f5..82c87073a 100644 --- a/client/shaders/nodes_shader/opengl_fragment.glsl +++ b/client/shaders/nodes_shader/opengl_fragment.glsl @@ -15,11 +15,12 @@ varying vec3 vPosition; // cameraOffset + worldPosition (for large coordinates the limits of float // precision must be considered). varying vec3 worldPosition; - +varying lowp vec4 varColor; +varying mediump vec2 varTexCoord; varying vec3 eyeVec; const float fogStart = FOG_START; -const float fogShadingParameter = 1 / ( 1 - fogStart); +const float fogShadingParameter = 1.0 / ( 1.0 - fogStart); #ifdef ENABLE_TONE_MAPPING @@ -56,13 +57,13 @@ vec4 applyToneMapping(vec4 color) void main(void) { vec3 color; - vec2 uv = gl_TexCoord[0].st; + vec2 uv = varTexCoord.st; vec4 base = texture2D(baseTexture, uv).rgba; - #ifdef USE_DISCARD // If alpha is zero, we can just discard the pixel. This fixes transparency - // on GPUs like GC7000L, where GL_ALPHA_TEST is not implemented in mesa. + // on GPUs like GC7000L, where GL_ALPHA_TEST is not implemented in mesa, + // and also on GLES 2, where GL_ALPHA_TEST is missing entirely. if (base.a == 0.0) { discard; } @@ -70,7 +71,7 @@ void main(void) color = base.rgb; - vec4 col = vec4(color.rgb * gl_Color.rgb, 1.0); + vec4 col = vec4(color.rgb * varColor.rgb, 1.0); #ifdef ENABLE_TONE_MAPPING col = applyToneMapping(col); diff --git a/client/shaders/nodes_shader/opengl_vertex.glsl b/client/shaders/nodes_shader/opengl_vertex.glsl index 56bff09a8..cb344f6e6 100644 --- a/client/shaders/nodes_shader/opengl_vertex.glsl +++ b/client/shaders/nodes_shader/opengl_vertex.glsl @@ -1,4 +1,3 @@ -uniform mat4 mWorldViewProj; uniform mat4 mWorld; // Color of the light emitted by the sun. @@ -16,7 +15,8 @@ varying vec3 vPosition; // cameraOffset + worldPosition (for large coordinates the limits of float // precision must be considered). varying vec3 worldPosition; - +varying lowp vec4 varColor; +varying mediump vec2 varTexCoord; varying vec3 eyeVec; // Color of the light emitted by the light sources. @@ -81,13 +81,13 @@ float snoise(vec3 p) void main(void) { - gl_TexCoord[0] = gl_MultiTexCoord0; + varTexCoord = inTexCoord0.st; float disp_x; float disp_z; // OpenGL < 4.3 does not support continued preprocessor lines #if (MATERIAL_TYPE == TILE_MATERIAL_WAVING_LEAVES && ENABLE_WAVING_LEAVES) || (MATERIAL_TYPE == TILE_MATERIAL_WAVING_PLANTS && ENABLE_WAVING_PLANTS) - vec4 pos2 = mWorld * gl_Vertex; + vec4 pos2 = mWorld * inVertexPosition; float tOffset = (pos2.x + pos2.y) * 0.001 + pos2.z * 0.002; disp_x = (smoothTriangleWave(animationTimer * 23.0 + tOffset) + smoothTriangleWave(animationTimer * 11.0 + tOffset)) * 0.4; @@ -96,43 +96,43 @@ void main(void) smoothTriangleWave(animationTimer * 13.0 + tOffset)) * 0.5; #endif - worldPosition = (mWorld * gl_Vertex).xyz; + worldPosition = (mWorld * inVertexPosition).xyz; // OpenGL < 4.3 does not support continued preprocessor lines #if (MATERIAL_TYPE == TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_WAVING_LIQUID_OPAQUE || MATERIAL_TYPE == TILE_MATERIAL_WAVING_LIQUID_BASIC) && ENABLE_WAVING_WATER // Generate waves with Perlin-type noise. // The constants are calibrated such that they roughly // correspond to the old sine waves. - vec4 pos = gl_Vertex; + vec4 pos = inVertexPosition; vec3 wavePos = worldPosition + cameraOffset; // The waves are slightly compressed along the z-axis to get // wave-fronts along the x-axis. - wavePos.x /= WATER_WAVE_LENGTH * 3; - wavePos.z /= WATER_WAVE_LENGTH * 2; - wavePos.z += animationTimer * WATER_WAVE_SPEED * 10; - pos.y += (snoise(wavePos) - 1) * WATER_WAVE_HEIGHT * 5; + wavePos.x /= WATER_WAVE_LENGTH * 3.0; + wavePos.z /= WATER_WAVE_LENGTH * 2.0; + wavePos.z += animationTimer * WATER_WAVE_SPEED * 10.0; + pos.y += (snoise(wavePos) - 1.0) * WATER_WAVE_HEIGHT * 5.0; gl_Position = mWorldViewProj * pos; #elif MATERIAL_TYPE == TILE_MATERIAL_WAVING_LEAVES && ENABLE_WAVING_LEAVES - vec4 pos = gl_Vertex; + vec4 pos = inVertexPosition; pos.x += disp_x; pos.y += disp_z * 0.1; pos.z += disp_z; gl_Position = mWorldViewProj * pos; #elif MATERIAL_TYPE == TILE_MATERIAL_WAVING_PLANTS && ENABLE_WAVING_PLANTS - vec4 pos = gl_Vertex; - if (gl_TexCoord[0].y < 0.05) { + vec4 pos = inVertexPosition; + if (varTexCoord.y < 0.05) { pos.x += disp_x; pos.z += disp_z; } gl_Position = mWorldViewProj * pos; #else - gl_Position = mWorldViewProj * gl_Vertex; + gl_Position = mWorldViewProj * inVertexPosition; #endif vPosition = gl_Position.xyz; - eyeVec = -(gl_ModelViewMatrix * gl_Vertex).xyz; + eyeVec = -(mWorldView * inVertexPosition).xyz; // Calculate color. // Red, green and blue components are pre-multiplied with @@ -141,16 +141,16 @@ void main(void) // The pre-baked colors are halved to prevent overflow. vec4 color; // The alpha gives the ratio of sunlight in the incoming light. - float nightRatio = 1 - gl_Color.a; - color.rgb = gl_Color.rgb * (gl_Color.a * dayLight.rgb + - nightRatio * artificialLight.rgb) * 2; - color.a = 1; + float nightRatio = 1.0 - inVertexColor.a; + color.rgb = inVertexColor.rgb * (inVertexColor.a * dayLight.rgb + + nightRatio * artificialLight.rgb) * 2.0; + color.a = 1.0; // Emphase blue a bit in darker places // See C++ implementation in mapblock_mesh.cpp final_color_blend() - float brightness = (color.r + color.g + color.b) / 3; + float brightness = (color.r + color.g + color.b) / 3.0; color.b += max(0.0, 0.021 - abs(0.2 * brightness - 0.021) + 0.07 * brightness); - gl_FrontColor = gl_BackColor = clamp(color, 0.0, 1.0); + varColor = clamp(color, 0.0, 1.0); } diff --git a/client/shaders/object_shader/opengl_fragment.glsl b/client/shaders/object_shader/opengl_fragment.glsl index 86d5c1c92..7ac182a63 100644 --- a/client/shaders/object_shader/opengl_fragment.glsl +++ b/client/shaders/object_shader/opengl_fragment.glsl @@ -8,6 +8,8 @@ uniform vec3 eyePosition; varying vec3 vNormal; varying vec3 vPosition; varying vec3 worldPosition; +varying lowp vec4 varColor; +varying mediump vec2 varTexCoord; varying vec3 eyeVec; varying float vIDiff; @@ -15,7 +17,7 @@ varying float vIDiff; const float e = 2.718281828459; const float BS = 10.0; const float fogStart = FOG_START; -const float fogShadingParameter = 1 / ( 1 - fogStart); +const float fogShadingParameter = 1.0 / (1.0 - fogStart); #ifdef ENABLE_TONE_MAPPING @@ -52,13 +54,14 @@ vec4 applyToneMapping(vec4 color) void main(void) { vec3 color; - vec2 uv = gl_TexCoord[0].st; + vec2 uv = varTexCoord.st; vec4 base = texture2D(baseTexture, uv).rgba; #ifdef USE_DISCARD // If alpha is zero, we can just discard the pixel. This fixes transparency - // on GPUs like GC7000L, where GL_ALPHA_TEST is not implemented in mesa. + // on GPUs like GC7000L, where GL_ALPHA_TEST is not implemented in mesa, + // and also on GLES 2, where GL_ALPHA_TEST is missing entirely. if (base.a == 0.0) { discard; } @@ -68,7 +71,7 @@ void main(void) vec4 col = vec4(color.rgb, base.a); - col.rgb *= gl_Color.rgb; + col.rgb *= varColor.rgb; col.rgb *= emissiveColor.rgb * vIDiff; diff --git a/client/shaders/object_shader/opengl_vertex.glsl b/client/shaders/object_shader/opengl_vertex.glsl index f8c1cd932..e44984dc8 100644 --- a/client/shaders/object_shader/opengl_vertex.glsl +++ b/client/shaders/object_shader/opengl_vertex.glsl @@ -1,4 +1,3 @@ -uniform mat4 mWorldViewProj; uniform mat4 mWorld; uniform vec3 eyePosition; @@ -7,6 +6,8 @@ uniform float animationTimer; varying vec3 vNormal; varying vec3 vPosition; varying vec3 worldPosition; +varying lowp vec4 varColor; +varying mediump vec2 varTexCoord; varying vec3 eyeVec; varying float vIDiff; @@ -18,31 +19,31 @@ float directional_ambient(vec3 normal) { vec3 v = normal * normal; - if (normal.y < 0) - return dot(v, vec3(0.670820f, 0.447213f, 0.836660f)); + if (normal.y < 0.0) + return dot(v, vec3(0.670820, 0.447213, 0.836660)); - return dot(v, vec3(0.670820f, 1.000000f, 0.836660f)); + return dot(v, vec3(0.670820, 1.000000, 0.836660)); } void main(void) { - gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; - gl_Position = mWorldViewProj * gl_Vertex; + varTexCoord = (mTexture * inTexCoord0).st; + gl_Position = mWorldViewProj * inVertexPosition; vPosition = gl_Position.xyz; - vNormal = gl_Normal; - worldPosition = (mWorld * gl_Vertex).xyz; - eyeVec = -(gl_ModelViewMatrix * gl_Vertex).xyz; + vNormal = inVertexNormal; + worldPosition = (mWorld * inVertexPosition).xyz; + eyeVec = -(mWorldView * inVertexPosition).xyz; #if (MATERIAL_TYPE == TILE_MATERIAL_PLAIN) || (MATERIAL_TYPE == TILE_MATERIAL_PLAIN_ALPHA) vIDiff = 1.0; #else // This is intentional comparison with zero without any margin. // If normal is not equal to zero exactly, then we assume it's a valid, just not normalized vector - vIDiff = length(gl_Normal) == 0.0 + vIDiff = length(inVertexNormal) == 0.0 ? 1.0 - : directional_ambient(normalize(gl_Normal)); + : directional_ambient(normalize(inVertexNormal)); #endif - gl_FrontColor = gl_BackColor = gl_Color; + varColor = inVertexColor; } diff --git a/client/shaders/selection_shader/opengl_fragment.glsl b/client/shaders/selection_shader/opengl_fragment.glsl index c679d0e12..35b1f8902 100644 --- a/client/shaders/selection_shader/opengl_fragment.glsl +++ b/client/shaders/selection_shader/opengl_fragment.glsl @@ -1,9 +1,12 @@ uniform sampler2D baseTexture; +varying lowp vec4 varColor; +varying mediump vec2 varTexCoord; + void main(void) { - vec2 uv = gl_TexCoord[0].st; + vec2 uv = varTexCoord.st; vec4 color = texture2D(baseTexture, uv); - color.rgb *= gl_Color.rgb; + color.rgb *= varColor.rgb; gl_FragColor = color; } diff --git a/client/shaders/selection_shader/opengl_vertex.glsl b/client/shaders/selection_shader/opengl_vertex.glsl index d0b16c8b0..9ca87a9cf 100644 --- a/client/shaders/selection_shader/opengl_vertex.glsl +++ b/client/shaders/selection_shader/opengl_vertex.glsl @@ -1,9 +1,10 @@ -uniform mat4 mWorldViewProj; +varying lowp vec4 varColor; +varying mediump vec2 varTexCoord; void main(void) { - gl_TexCoord[0] = gl_MultiTexCoord0; - gl_Position = mWorldViewProj * gl_Vertex; + varTexCoord = inTexCoord0.st; + gl_Position = mWorldViewProj * inVertexPosition; - gl_FrontColor = gl_BackColor = gl_Color; + varColor = inVertexColor; } diff --git a/games/devtest/mods/basenodes/init.lua b/games/devtest/mods/basenodes/init.lua index 7ffbadbea..0cb85d808 100644 --- a/games/devtest/mods/basenodes/init.lua +++ b/games/devtest/mods/basenodes/init.lua @@ -127,6 +127,7 @@ minetest.register_node("basenodes:water_source", { description = "Water Source".."\n".. "Drowning damage: 1", drawtype = "liquid", + waving = 3, tiles = {"default_water.png"}, special_tiles = { {name = "default_water.png", backface_culling = false}, @@ -152,6 +153,7 @@ minetest.register_node("basenodes:water_flowing", { description = "Flowing Water".."\n".. "Drowning damage: 1", drawtype = "flowingliquid", + waving = 3, tiles = {"default_water_flowing.png"}, special_tiles = { {name = "default_water_flowing.png", backface_culling = false}, @@ -178,6 +180,7 @@ minetest.register_node("basenodes:river_water_source", { description = "River Water Source".."\n".. "Drowning damage: 1", drawtype = "liquid", + waving = 3, tiles = { "default_river_water.png" }, special_tiles = { {name = "default_river_water.png", backface_culling = false}, @@ -205,6 +208,7 @@ minetest.register_node("basenodes:river_water_flowing", { description = "Flowing River Water".."\n".. "Drowning damage: 1", drawtype = "flowingliquid", + waving = 3, tiles = {"default_river_water_flowing.png"}, special_tiles = { {name = "default_river_water_flowing.png", backface_culling = false}, diff --git a/src/client/shader.cpp b/src/client/shader.cpp index e2eeb4ab0..f2aa00246 100644 --- a/src/client/shader.cpp +++ b/src/client/shader.cpp @@ -37,6 +37,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "log.h" #include "gamedef.h" #include "client/tile.h" +#include "config.h" #if ENABLE_GLES #ifdef _IRR_COMPILE_WITH_OGLES1_ @@ -230,11 +231,24 @@ class MainShaderConstantSetter : public IShaderConstantSetter { CachedVertexShaderSetting m_world_view_proj; CachedVertexShaderSetting m_world; +#if ENABLE_GLES + // Modelview matrix + CachedVertexShaderSetting m_world_view; + // Texture matrix + CachedVertexShaderSetting m_texture; + // Normal matrix + CachedVertexShaderSetting m_normal; +#endif public: MainShaderConstantSetter() : - m_world_view_proj("mWorldViewProj"), - m_world("mWorld") + m_world_view_proj("mWorldViewProj") + , m_world("mWorld") +#if ENABLE_GLES + , m_world_view("mWorldView") + , m_texture("mTexture") + , m_normal("mNormal") +#endif {} ~MainShaderConstantSetter() = default; @@ -244,16 +258,6 @@ public: video::IVideoDriver *driver = services->getVideoDriver(); sanity_check(driver); - // Set clip matrix - core::matrix4 worldViewProj; - worldViewProj = driver->getTransform(video::ETS_PROJECTION); - worldViewProj *= driver->getTransform(video::ETS_VIEW); - worldViewProj *= driver->getTransform(video::ETS_WORLD); - if (is_highlevel) - m_world_view_proj.set(*reinterpret_cast(worldViewProj.pointer()), services); - else - services->setVertexShaderConstant(worldViewProj.pointer(), 0, 4); - // Set world matrix core::matrix4 world = driver->getTransform(video::ETS_WORLD); if (is_highlevel) @@ -261,6 +265,35 @@ public: else services->setVertexShaderConstant(world.pointer(), 4, 4); + // Set clip matrix + core::matrix4 worldView; + worldView = driver->getTransform(video::ETS_VIEW); + worldView *= world; + core::matrix4 worldViewProj; + worldViewProj = driver->getTransform(video::ETS_PROJECTION); + worldViewProj *= worldView; + if (is_highlevel) + m_world_view_proj.set(*reinterpret_cast(worldViewProj.pointer()), services); + else + services->setVertexShaderConstant(worldViewProj.pointer(), 0, 4); + +#if ENABLE_GLES + if (is_highlevel) { + core::matrix4 texture = driver->getTransform(video::ETS_TEXTURE_0); + m_world_view.set(*reinterpret_cast(worldView.pointer()), services); + m_texture.set(*reinterpret_cast(texture.pointer()), services); + + core::matrix4 normal; + worldView.getTransposed(normal); + sanity_check(normal.makeInverse()); + float m[9] = { + normal[0], normal[1], normal[2], + normal[4], normal[5], normal[6], + normal[8], normal[9], normal[10], + }; + m_normal.set(m, services); + } +#endif } }; @@ -620,15 +653,62 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp return shaderinfo; // Create shaders header - std::string shaders_header = "#version 120\n"; + bool use_gles = false; +#if ENABLE_GLES + use_gles = driver->getDriverType() == video::EDT_OGLES2; +#endif + std::string shaders_header, vertex_header, pixel_header; // geometry shaders aren’t supported in GLES<3 + if (use_gles) { + shaders_header = + "#version 100\n" + ; + vertex_header = R"( + uniform highp mat4 mWorldView; + uniform highp mat4 mWorldViewProj; + uniform mediump mat4 mTexture; + uniform mediump mat3 mNormal; + attribute highp vec4 inVertexPosition; + attribute lowp vec4 inVertexColor; + attribute mediump vec4 inTexCoord0; + attribute mediump vec3 inVertexNormal; + attribute mediump vec4 inVertexTangent; + attribute mediump vec4 inVertexBinormal; + )"; + pixel_header = R"( + precision mediump float; + )"; + } else { + shaders_header = R"( + #version 120 + #define lowp + #define mediump + #define highp + )"; + vertex_header = R"( + #define mWorldView gl_ModelViewMatrix + #define mWorldViewProj gl_ModelViewProjectionMatrix + #define mTexture (gl_TextureMatrix[0]) + #define mNormal gl_NormalMatrix + + #define inVertexPosition gl_Vertex + #define inVertexColor gl_Color + #define inTexCoord0 gl_MultiTexCoord0 + #define inVertexNormal gl_Normal + #define inVertexTangent gl_MultiTexCoord1 + #define inVertexBinormal gl_MultiTexCoord2 + )"; + } + + bool use_discard = use_gles; #ifdef __unix__ // For renderers that should use discard instead of GL_ALPHA_TEST const char* gl_renderer = (const char*)glGetString(GL_RENDERER); - if (strstr(gl_renderer, "GC7000")) { - shaders_header += "#define USE_DISCARD\n"; - } + if (strstr(gl_renderer, "GC7000")) + use_discard = true; #endif + if (use_discard && shaderinfo.base_material != video::EMT_SOLID) + shaders_header += "#define USE_DISCARD\n"; static const char* drawTypes[] = { "NDT_NORMAL", @@ -654,7 +734,7 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp shaders_header += "#define "; shaders_header += drawTypes[i]; shaders_header += " "; - shaders_header += itos(i); + shaders_header += std::to_string(i); shaders_header += "\n"; } @@ -677,27 +757,27 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp shaders_header += "#define "; shaders_header += materialTypes[i]; shaders_header += " "; - shaders_header += itos(i); + shaders_header += std::to_string(i); shaders_header += "\n"; } shaders_header += "#define MATERIAL_TYPE "; - shaders_header += itos(material_type); + shaders_header += std::to_string(material_type); shaders_header += "\n"; shaders_header += "#define DRAW_TYPE "; - shaders_header += itos(drawtype); + shaders_header += std::to_string(drawtype); shaders_header += "\n"; if (g_settings->getBool("enable_waving_water")){ shaders_header += "#define ENABLE_WAVING_WATER 1\n"; shaders_header += "#define WATER_WAVE_HEIGHT "; - shaders_header += ftos(g_settings->getFloat("water_wave_height")); + shaders_header += std::to_string(g_settings->getFloat("water_wave_height")); shaders_header += "\n"; shaders_header += "#define WATER_WAVE_LENGTH "; - shaders_header += ftos(g_settings->getFloat("water_wave_length")); + shaders_header += std::to_string(g_settings->getFloat("water_wave_length")); shaders_header += "\n"; shaders_header += "#define WATER_WAVE_SPEED "; - shaders_header += ftos(g_settings->getFloat("water_wave_speed")); + shaders_header += std::to_string(g_settings->getFloat("water_wave_speed")); shaders_header += "\n"; } else{ shaders_header += "#define ENABLE_WAVING_WATER 0\n"; @@ -719,7 +799,7 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp shaders_header += "#define ENABLE_TONE_MAPPING\n"; shaders_header += "#define FOG_START "; - shaders_header += ftos(rangelim(g_settings->getFloat("fog_start"), 0.0f, 0.99f)); + shaders_header += std::to_string(rangelim(g_settings->getFloat("fog_start"), 0.0f, 0.99f)); shaders_header += "\n"; // Call addHighLevelShaderMaterial() or addShaderMaterial() @@ -727,11 +807,11 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp const c8* pixel_program_ptr = 0; const c8* geometry_program_ptr = 0; if (!vertex_program.empty()) { - vertex_program = shaders_header + vertex_program; + vertex_program = shaders_header + vertex_header + vertex_program; vertex_program_ptr = vertex_program.c_str(); } if (!pixel_program.empty()) { - pixel_program = shaders_header + pixel_program; + pixel_program = shaders_header + pixel_header + pixel_program; pixel_program_ptr = pixel_program.c_str(); } if (!geometry_program.empty()) { @@ -813,27 +893,37 @@ void load_shaders(const std::string &name, SourceShaderCache *sourcecache, geometry_program = ""; is_highlevel = false; - if(enable_shaders){ - // Look for high level shaders - if(drivertype == video::EDT_DIRECT3D9){ - // Direct3D 9: HLSL - // (All shaders in one file) - vertex_program = sourcecache->getOrLoad(name, "d3d9.hlsl"); - pixel_program = vertex_program; - geometry_program = vertex_program; - } - else if(drivertype == video::EDT_OPENGL){ - // OpenGL: GLSL - vertex_program = sourcecache->getOrLoad(name, "opengl_vertex.glsl"); - pixel_program = sourcecache->getOrLoad(name, "opengl_fragment.glsl"); - geometry_program = sourcecache->getOrLoad(name, "opengl_geometry.glsl"); - } - if (!vertex_program.empty() || !pixel_program.empty() || !geometry_program.empty()){ - is_highlevel = true; - return; - } - } + if (!enable_shaders) + return; + // Look for high level shaders + switch (drivertype) { + case video::EDT_DIRECT3D9: + // Direct3D 9: HLSL + // (All shaders in one file) + vertex_program = sourcecache->getOrLoad(name, "d3d9.hlsl"); + pixel_program = vertex_program; + geometry_program = vertex_program; + break; + + case video::EDT_OPENGL: +#if ENABLE_GLES + case video::EDT_OGLES2: +#endif + // OpenGL: GLSL + vertex_program = sourcecache->getOrLoad(name, "opengl_vertex.glsl"); + pixel_program = sourcecache->getOrLoad(name, "opengl_fragment.glsl"); + geometry_program = sourcecache->getOrLoad(name, "opengl_geometry.glsl"); + break; + + default: + // e.g. OpenGL ES 1 (with no shader support) + break; + } + if (!vertex_program.empty() || !pixel_program.empty() || !geometry_program.empty()){ + is_highlevel = true; + return; + } } void dumpShaderProgram(std::ostream &output_stream, From 61a196378ff91411af3245504c5861da026b3b25 Mon Sep 17 00:00:00 2001 From: luk3yx Date: Mon, 26 Oct 2020 06:01:39 +1300 Subject: [PATCH 129/177] Fix CSMs on arm64 (#10553) --- src/script/cpp_api/s_security.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/script/cpp_api/s_security.cpp b/src/script/cpp_api/s_security.cpp index 2afa3a191..01333b941 100644 --- a/src/script/cpp_api/s_security.cpp +++ b/src/script/cpp_api/s_security.cpp @@ -629,7 +629,11 @@ int ScriptApiSecurity::sl_g_loadfile(lua_State *L) { #ifndef SERVER lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_SCRIPTAPI); +#if INDIRECT_SCRIPTAPI_RIDX + ScriptApiBase *script = (ScriptApiBase *) *(void**)(lua_touserdata(L, -1)); +#else ScriptApiBase *script = (ScriptApiBase *) lua_touserdata(L, -1); +#endif lua_pop(L, 1); // Client implementation From 68cd93b8657c0c8cad0196e79fb63e3275322e38 Mon Sep 17 00:00:00 2001 From: Lars Date: Wed, 21 Oct 2020 14:46:04 -0700 Subject: [PATCH 130/177] Avoid resending near blocks unnecessarily. --- src/clientiface.cpp | 79 +++++++++++++++++++++------------------------ src/clientiface.h | 9 +++--- 2 files changed, 42 insertions(+), 46 deletions(-) diff --git a/src/clientiface.cpp b/src/clientiface.cpp index a01cba7e0..f5e32469b 100644 --- a/src/clientiface.cpp +++ b/src/clientiface.cpp @@ -138,26 +138,6 @@ void RemoteClient::GetNextBlocks ( camera_dir.rotateYZBy(sao->getLookPitch()); camera_dir.rotateXZBy(sao->getRotation().Y); - /*infostream<<"camera_dir=("<range_all ? "All" : itos(draw_control->wanted_range)) - << std::setprecision(3) - << " | RTT: " << client->getRTT() << "s"; + << std::setprecision(2) + << " | RTT: " << (client->getRTT() * 1000.0f) << "ms"; setStaticText(m_guitext, utf8_to_wide(os.str()).c_str()); m_guitext->setRelativePosition(core::rect(5, 5, screensize.X, From 2dff3dd03f7ba25f3fab7c360759ddbf93615668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= <34514239+appgurueu@users.noreply.github.com> Date: Thu, 29 Oct 2020 20:15:46 +0100 Subject: [PATCH 132/177] Player physics: Ensure larger dtime simulation steps (#10563) --- src/client/clientenvironment.cpp | 115 +++++++++++++------------------ 1 file changed, 46 insertions(+), 69 deletions(-) diff --git a/src/client/clientenvironment.cpp b/src/client/clientenvironment.cpp index f831978a8..ea7be4200 100644 --- a/src/client/clientenvironment.cpp +++ b/src/client/clientenvironment.cpp @@ -183,84 +183,61 @@ void ClientEnvironment::step(float dtime) if(dtime > 0.5) dtime = 0.5; - f32 dtime_downcount = dtime; - /* Stuff that has a maximum time increment */ - u32 loopcount = 0; - do - { - loopcount++; + u32 steps = ceil(dtime / dtime_max_increment); + f32 dtime_part = dtime / steps; + for (; steps > 0; --steps) { + /* + Local player handling + */ - f32 dtime_part; - if(dtime_downcount > dtime_max_increment) - { - dtime_part = dtime_max_increment; - dtime_downcount -= dtime_part; - } - else - { - dtime_part = dtime_downcount; - /* - Setting this to 0 (no -=dtime_part) disables an infinite loop - when dtime_part is so small that dtime_downcount -= dtime_part - does nothing - */ - dtime_downcount = 0; + // Control local player + lplayer->applyControl(dtime_part, this); + + // Apply physics + if (!free_move && !is_climbing) { + // Gravity + v3f speed = lplayer->getSpeed(); + if (!lplayer->in_liquid) + speed.Y -= lplayer->movement_gravity * + lplayer->physics_override_gravity * dtime_part * 2.0f; + + // Liquid floating / sinking + if (lplayer->in_liquid && !lplayer->swimming_vertical && + !lplayer->swimming_pitch) + speed.Y -= lplayer->movement_liquid_sink * dtime_part * 2.0f; + + // Liquid resistance + if (lplayer->in_liquid_stable || lplayer->in_liquid) { + // How much the node's viscosity blocks movement, ranges + // between 0 and 1. Should match the scale at which viscosity + // increase affects other liquid attributes. + static const f32 viscosity_factor = 0.3f; + + v3f d_wanted = -speed / lplayer->movement_liquid_fluidity; + f32 dl = d_wanted.getLength(); + if (dl > lplayer->movement_liquid_fluidity_smooth) + dl = lplayer->movement_liquid_fluidity_smooth; + + dl *= (lplayer->liquid_viscosity * viscosity_factor) + + (1 - viscosity_factor); + v3f d = d_wanted.normalize() * (dl * dtime_part * 100.0f); + speed += d; + } + + lplayer->setSpeed(speed); } /* - Handle local player + Move the lplayer. + This also does collision detection. */ - - { - // Control local player - lplayer->applyControl(dtime_part, this); - - // Apply physics - if (!free_move && !is_climbing) { - // Gravity - v3f speed = lplayer->getSpeed(); - if (!lplayer->in_liquid) - speed.Y -= lplayer->movement_gravity * - lplayer->physics_override_gravity * dtime_part * 2.0f; - - // Liquid floating / sinking - if (lplayer->in_liquid && !lplayer->swimming_vertical && - !lplayer->swimming_pitch) - speed.Y -= lplayer->movement_liquid_sink * dtime_part * 2.0f; - - // Liquid resistance - if (lplayer->in_liquid_stable || lplayer->in_liquid) { - // How much the node's viscosity blocks movement, ranges - // between 0 and 1. Should match the scale at which viscosity - // increase affects other liquid attributes. - static const f32 viscosity_factor = 0.3f; - - v3f d_wanted = -speed / lplayer->movement_liquid_fluidity; - f32 dl = d_wanted.getLength(); - if (dl > lplayer->movement_liquid_fluidity_smooth) - dl = lplayer->movement_liquid_fluidity_smooth; - - dl *= (lplayer->liquid_viscosity * viscosity_factor) + - (1 - viscosity_factor); - v3f d = d_wanted.normalize() * (dl * dtime_part * 100.0f); - speed += d; - } - - lplayer->setSpeed(speed); - } - - /* - Move the lplayer. - This also does collision detection. - */ - lplayer->move(dtime_part, this, position_max_increment, - &player_collisions); - } - } while (dtime_downcount > 0.001); + lplayer->move(dtime_part, this, position_max_increment, + &player_collisions); + } bool player_immortal = lplayer->getCAO() && lplayer->getCAO()->isImmortal(); From 89dd05fdf35ce465fcc2b3588337f79f818a78aa Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sat, 31 Oct 2020 18:19:23 +0000 Subject: [PATCH 133/177] Fix segfault in deprecation logging due to tail call, log by default (#10174) --- builtin/settingtypes.txt | 6 ++-- src/defaultsettings.cpp | 4 --- src/script/common/c_internal.cpp | 20 ++++++----- src/script/common/c_internal.h | 20 +++++++++++ src/script/lua_api/l_base.cpp | 61 ++++++-------------------------- src/script/lua_api/l_base.h | 21 +++++++---- src/script/lua_api/l_internal.h | 11 +++++- src/script/lua_api/l_noise.cpp | 2 -- src/script/lua_api/l_object.cpp | 6 ++-- 9 files changed, 71 insertions(+), 80 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 36446f808..0b650c722 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -1220,10 +1220,10 @@ movement_gravity (Gravity) float 9.81 [**Advanced] # Handling for deprecated Lua API calls: -# - legacy: (try to) mimic old behaviour (default for release). -# - log: mimic and log backtrace of deprecated call (default for debug). +# - none: Do not log deprecated calls +# - log: mimic and log backtrace of deprecated call (default). # - error: abort on usage of deprecated call (suggested for mod developers). -deprecated_lua_api_handling (Deprecated Lua API handling) enum legacy legacy,log,error +deprecated_lua_api_handling (Deprecated Lua API handling) enum log none,log,error # Number of extra blocks that can be loaded by /clearobjects at once. # This is a trade-off between sqlite transaction overhead and diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 6c7d4be97..fcdf6b536 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -358,11 +358,7 @@ void set_default_settings(Settings *settings) settings->setDefault("disallow_empty_password", "false"); settings->setDefault("disable_anticheat", "false"); settings->setDefault("enable_rollback_recording", "false"); -#ifdef NDEBUG - settings->setDefault("deprecated_lua_api_handling", "legacy"); -#else settings->setDefault("deprecated_lua_api_handling", "log"); -#endif settings->setDefault("kick_msg_shutdown", "Server shutting down."); settings->setDefault("kick_msg_crash", "This server has experienced an internal error. You will now be disconnected."); diff --git a/src/script/common/c_internal.cpp b/src/script/common/c_internal.cpp index 6df1f8b7b..ad5f836c5 100644 --- a/src/script/common/c_internal.cpp +++ b/src/script/common/c_internal.cpp @@ -155,24 +155,28 @@ static void script_log(lua_State *L, const std::string &message, infostream << script_get_backtrace(L) << std::endl; } -void log_deprecated(lua_State *L, const std::string &message, int stack_depth) +DeprecatedHandlingMode get_deprecated_handling_mode() { static thread_local bool configured = false; - static thread_local bool do_log = false; - static thread_local bool do_error = false; + static thread_local DeprecatedHandlingMode ret = DeprecatedHandlingMode::Ignore; // Only read settings on first call if (!configured) { std::string value = g_settings->get("deprecated_lua_api_handling"); if (value == "log") { - do_log = true; + ret = DeprecatedHandlingMode::Log; } else if (value == "error") { - do_log = true; - do_error = true; + ret = DeprecatedHandlingMode::Error; } configured = true; } - if (do_log) - script_log(L, message, warningstream, do_error, stack_depth); + return ret; +} + +void log_deprecated(lua_State *L, const std::string &message, int stack_depth) +{ + DeprecatedHandlingMode mode = get_deprecated_handling_mode(); + if (mode != DeprecatedHandlingMode::Ignore) + script_log(L, message, warningstream, mode == DeprecatedHandlingMode::Error, stack_depth); } diff --git a/src/script/common/c_internal.h b/src/script/common/c_internal.h index 442546332..452c2dd5e 100644 --- a/src/script/common/c_internal.h +++ b/src/script/common/c_internal.h @@ -114,5 +114,25 @@ void script_error(lua_State *L, int pcall_result, const char *mod, const char *f void script_run_callbacks_f(lua_State *L, int nargs, RunCallbacksMode mode, const char *fxn); +enum class DeprecatedHandlingMode { + Ignore, + Log, + Error +}; + +/** + * Reads `deprecated_lua_api_handling` in settings, returns cached value. + * + * @return DeprecatedHandlingMode + */ +DeprecatedHandlingMode get_deprecated_handling_mode(); + +/** + * Handles a deprecation warning based on user settings + * + * @param L Lua State + * @param message The deprecation method + * @param stack_depth How far on the stack to the first user function (ie: not builtin or core) + */ void log_deprecated(lua_State *L, const std::string &message, int stack_depth=1); diff --git a/src/script/lua_api/l_base.cpp b/src/script/lua_api/l_base.cpp index 03ef5447a..f842671b8 100644 --- a/src/script/lua_api/l_base.cpp +++ b/src/script/lua_api/l_base.cpp @@ -100,32 +100,21 @@ bool ModApiBase::registerFunction(lua_State *L, const char *name, return true; } -std::unordered_map ModApiBase::m_deprecated_wrappers; -bool ModApiBase::m_error_deprecated_calls = false; - -int ModApiBase::l_deprecated_function(lua_State *L) +int ModApiBase::l_deprecated_function(lua_State *L, const char *good, const char *bad, lua_CFunction func) { thread_local std::vector deprecated_logged; + DeprecatedHandlingMode dep_mode = get_deprecated_handling_mode(); + if (dep_mode == DeprecatedHandlingMode::Ignore) + return func(L); + u64 start_time = porting::getTimeUs(); lua_Debug ar; - // Get function name for lookup - FATAL_ERROR_IF(!lua_getstack(L, 0, &ar), "lua_getstack() failed"); - FATAL_ERROR_IF(!lua_getinfo(L, "n", &ar), "lua_getinfo() failed"); - - // Combine name with line and script backtrace + // Get caller name with line and script backtrace FATAL_ERROR_IF(!lua_getstack(L, 1, &ar), "lua_getstack() failed"); FATAL_ERROR_IF(!lua_getinfo(L, "Sl", &ar), "lua_getinfo() failed"); - // Get parent class to get the wrappers map - luaL_checktype(L, 1, LUA_TUSERDATA); - void *ud = lua_touserdata(L, 1); - ModApiBase *o = *(ModApiBase**)ud; - - // New function and new function name - auto it = o->m_deprecated_wrappers.find(ar.name); - // Get backtrace and hash it to reduce the warning flood std::string backtrace = ar.short_src; backtrace.append(":").append(std::to_string(ar.currentline)); @@ -135,46 +124,16 @@ int ModApiBase::l_deprecated_function(lua_State *L) == deprecated_logged.end()) { deprecated_logged.emplace_back(hash); - warningstream << "Call to deprecated function '" << ar.name << "', please use '" - << it->second.name << "' at " << backtrace << std::endl; + warningstream << "Call to deprecated function '" << bad << "', please use '" + << good << "' at " << backtrace << std::endl; - if (m_error_deprecated_calls) + if (dep_mode == DeprecatedHandlingMode::Error) script_error(L, LUA_ERRRUN, NULL, NULL); } u64 end_time = porting::getTimeUs(); g_profiler->avg("l_deprecated_function", end_time - start_time); - return it->second.func(L); + return func(L); } -void ModApiBase::markAliasDeprecated(luaL_Reg *reg) -{ - std::string value = g_settings->get("deprecated_lua_api_handling"); - m_error_deprecated_calls = value == "error"; - - if (!m_error_deprecated_calls && value != "log") - return; - - const char *last_name = nullptr; - lua_CFunction last_func = nullptr; - - // ! Null termination ! - while (reg->func) { - if (last_func == reg->func) { - // Duplicate found - luaL_Reg original_reg; - // Do not inline struct. Breaks MSVC or is error-prone - original_reg.name = last_name; - original_reg.func = reg->func; - m_deprecated_wrappers.emplace( - std::pair(reg->name, original_reg)); - reg->func = l_deprecated_function; - } else { - last_func = reg->func; - last_name = reg->name; - } - - ++reg; - } -} diff --git a/src/script/lua_api/l_base.h b/src/script/lua_api/l_base.h index 65fce8481..aa5905d26 100644 --- a/src/script/lua_api/l_base.h +++ b/src/script/lua_api/l_base.h @@ -41,7 +41,6 @@ class Environment; class ServerInventoryManager; class ModApiBase : protected LuaHelper { - public: static ScriptApiBase* getScriptApiBase(lua_State *L); static Server* getServer(lua_State *L); @@ -75,10 +74,18 @@ public: lua_CFunction func, int top); - static int l_deprecated_function(lua_State *L); - static void markAliasDeprecated(luaL_Reg *reg); -private: - // = { , } - static std::unordered_map m_deprecated_wrappers; - static bool m_error_deprecated_calls; + /** + * A wrapper for deprecated functions. + * + * When called, handles the deprecation according to user settings and then calls `func`. + * + * @throws Lua Error if required by the user settings. + * + * @param L Lua state + * @param good Name of good function/method + * @param bad Name of deprecated function/method + * @param func Actual implementation of function + * @return value from `func` + */ + static int l_deprecated_function(lua_State *L, const char *good, const char *bad, lua_CFunction func); }; diff --git a/src/script/lua_api/l_internal.h b/src/script/lua_api/l_internal.h index a86eeaf79..a10c259ba 100644 --- a/src/script/lua_api/l_internal.h +++ b/src/script/lua_api/l_internal.h @@ -29,7 +29,16 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "common/c_internal.h" #define luamethod(class, name) {#name, class::l_##name} -#define luamethod_aliased(class, name, alias) {#name, class::l_##name}, {#alias, class::l_##name} + +#define luamethod_dep(class, good, bad) \ + {#bad, [](lua_State *L) -> int { \ + return l_deprecated_function(L, #bad, #good, &class::l_##good); \ + }} + +#define luamethod_aliased(class, name, alias) \ + luamethod(class, name), \ + luamethod_dep(class, name, alias) + #define API_FCT(name) registerFunction(L, #name, l_##name, top) // For future use diff --git a/src/script/lua_api/l_noise.cpp b/src/script/lua_api/l_noise.cpp index 9aeb15709..e0861126a 100644 --- a/src/script/lua_api/l_noise.cpp +++ b/src/script/lua_api/l_noise.cpp @@ -122,7 +122,6 @@ void LuaPerlinNoise::Register(lua_State *L) lua_pop(L, 1); - markAliasDeprecated(methods); luaL_openlib(L, 0, methods, 0); lua_pop(L, 1); @@ -381,7 +380,6 @@ void LuaPerlinNoiseMap::Register(lua_State *L) lua_pop(L, 1); - markAliasDeprecated(methods); luaL_openlib(L, 0, methods, 0); lua_pop(L, 1); diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index c3f0ec8e0..beb8dd339 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -2278,7 +2278,6 @@ void ObjectRef::Register(lua_State *L) lua_pop(L, 1); // drop metatable - markAliasDeprecated(methods); luaL_openlib(L, 0, methods, 0); // fill methodtable lua_pop(L, 1); // drop methodtable } @@ -2316,10 +2315,9 @@ luaL_Reg ObjectRef::methods[] = { luamethod(ObjectRef, get_nametag_attributes), luamethod_aliased(ObjectRef, set_velocity, setvelocity), - luamethod(ObjectRef, add_velocity), - {"add_player_velocity", ObjectRef::l_add_velocity}, + luamethod_aliased(ObjectRef, add_velocity, add_player_velocity), luamethod_aliased(ObjectRef, get_velocity, getvelocity), - {"get_player_velocity", ObjectRef::l_get_velocity}, + luamethod_dep(ObjectRef, get_velocity, get_player_velocity), // LuaEntitySAO-only luamethod_aliased(ObjectRef, set_acceleration, setacceleration), From 9c9344ceb31892a8563994190f1ec31cb872f12c Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 1 Nov 2020 12:52:09 +0100 Subject: [PATCH 134/177] Fix incorrect deprecation hints "good" and "bad" were swapped in the process, resulting in wrong deprecation messages --- src/script/lua_api/l_internal.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/script/lua_api/l_internal.h b/src/script/lua_api/l_internal.h index a10c259ba..672e535ca 100644 --- a/src/script/lua_api/l_internal.h +++ b/src/script/lua_api/l_internal.h @@ -32,12 +32,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #define luamethod_dep(class, good, bad) \ {#bad, [](lua_State *L) -> int { \ - return l_deprecated_function(L, #bad, #good, &class::l_##good); \ + return l_deprecated_function(L, #good, #bad, &class::l_##good); \ }} -#define luamethod_aliased(class, name, alias) \ - luamethod(class, name), \ - luamethod_dep(class, name, alias) +#define luamethod_aliased(class, good, bad) \ + luamethod(class, good), \ + luamethod_dep(class, good, bad) #define API_FCT(name) registerFunction(L, #name, l_##name, top) From 0abb3e89fa6298041faa7e46d437e5a81f71cdd3 Mon Sep 17 00:00:00 2001 From: red-001 Date: Mon, 2 Nov 2020 21:21:03 +0000 Subject: [PATCH 135/177] Block attempts to connect to the client (#10589) A Minetest peer initiates a connection by sending a packet with an invalid peer_id, for whatever reason the code for doing this ran on both the client and the server meaning you could connect to a client if you knew what the address:port tuple it was listening on. --- src/network/connection.cpp | 2 +- src/network/connection.h | 5 +++++ src/network/connectionthreads.cpp | 5 ++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/network/connection.cpp b/src/network/connection.cpp index 1875d1461..0ba8c36b2 100644 --- a/src/network/connection.cpp +++ b/src/network/connection.cpp @@ -1566,7 +1566,7 @@ void Connection::sendAck(session_t peer_id, u8 channelnum, u16 seqnum) UDPPeer* Connection::createServerPeer(Address& address) { - if (getPeerNoEx(PEER_ID_SERVER) != 0) + if (ConnectedToServer()) { throw ConnectionException("Already connected to a server"); } diff --git a/src/network/connection.h b/src/network/connection.h index 2dc6d4397..24cd4fe4a 100644 --- a/src/network/connection.h +++ b/src/network/connection.h @@ -809,6 +809,11 @@ protected: void putEvent(ConnectionEvent &e); void TriggerSend(); + + bool ConnectedToServer() + { + return getPeerNoEx(PEER_ID_SERVER) != nullptr; + } private: MutexedQueue m_event_queue; diff --git a/src/network/connectionthreads.cpp b/src/network/connectionthreads.cpp index 28ed798d9..7b62bc792 100644 --- a/src/network/connectionthreads.cpp +++ b/src/network/connectionthreads.cpp @@ -956,8 +956,11 @@ void ConnectionReceiveThread::receive(SharedBuffer &packetdata, // command was sent reliably. } - /* The peer was not found in our lists. Add it. */ if (peer_id == PEER_ID_INEXISTENT) { + /* Ignore it if we are a client */ + if (m_connection->ConnectedToServer()) + return; + /* The peer was not found in our lists. Add it. */ peer_id = m_connection->createPeer(sender, MTP_MINETEST_RELIABLE_UDP, 0); } From aa4d3cb14837409b3cb5e17060776c6f5269d0be Mon Sep 17 00:00:00 2001 From: Lars Date: Tue, 3 Nov 2020 15:39:03 -0800 Subject: [PATCH 136/177] Increase defaults for viewing_range, active_object_range and related settings #10597 --- builtin/settingtypes.txt | 12 ++++++------ src/defaultsettings.cpp | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 0b650c722..8eb667bdd 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -594,7 +594,7 @@ fps_max_unfocused (FPS when unfocused or paused) int 20 1 pause_on_lost_focus (Pause on lost window focus) bool false # View distance in nodes. -viewing_range (Viewing range) int 100 20 4000 +viewing_range (Viewing range) int 190 20 4000 # Camera 'near clipping plane' distance in nodes, between 0 and 0.25 # Only works on GLES platforms. Most users will not need to change this. @@ -978,7 +978,7 @@ client_unload_unused_data_timeout (Mapblock unload timeout) int 600 # Maximum number of mapblocks for client to be kept in memory. # Set to -1 for unlimited amount. -client_mapblock_limit (Mapblock limit) int 5000 +client_mapblock_limit (Mapblock limit) int 7500 # Whether to show the client debug info (has the same effect as hitting F5). show_debug (Show debug info) bool false @@ -1137,17 +1137,17 @@ ask_reconnect_on_crash (Ask to reconnect after crash) bool false # Setting this larger than active_block_range will also cause the server # to maintain active objects up to this distance in the direction the # player is looking. (This can avoid mobs suddenly disappearing from view) -active_object_send_range_blocks (Active object send range) int 4 +active_object_send_range_blocks (Active object send range) int 8 # The radius of the volume of blocks around every player that is subject to the # active block stuff, stated in mapblocks (16 nodes). # In active blocks objects are loaded and ABMs run. # This is also the minimum range in which active objects (mobs) are maintained. # This should be configured together with active_object_send_range_blocks. -active_block_range (Active block range) int 3 +active_block_range (Active block range) int 4 # From how far blocks are sent to clients, stated in mapblocks (16 nodes). -max_block_send_distance (Max block send distance) int 10 +max_block_send_distance (Max block send distance) int 12 # Maximum number of forceloaded mapblocks. max_forceloaded_blocks (Maximum forceloaded blocks) int 16 @@ -1433,7 +1433,7 @@ mg_name (Mapgen name) enum v7 v7,valleys,carpathian,v5,flat,fractal,singlenode,v water_level (Water level) int 1 # From how far blocks are generated for clients, stated in mapblocks (16 nodes). -max_block_generate_distance (Max block generate distance) int 8 +max_block_generate_distance (Max block generate distance) int 10 # Limit of map generation, in nodes, in all 6 directions from (0, 0, 0). # Only mapchunks completely within the mapgen limit are generated. diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index fcdf6b536..dc0276733 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -52,7 +52,7 @@ void set_default_settings(Settings *settings) settings->setDefault("screenshot_format", "png"); settings->setDefault("screenshot_quality", "0"); settings->setDefault("client_unload_unused_data_timeout", "600"); - settings->setDefault("client_mapblock_limit", "5000"); + settings->setDefault("client_mapblock_limit", "7500"); settings->setDefault("enable_build_where_you_stand", "false"); settings->setDefault("curl_timeout", "5000"); settings->setDefault("curl_parallel_limit", "8"); @@ -166,7 +166,7 @@ void set_default_settings(Settings *settings) settings->setDefault("tooltip_append_itemname", "false"); settings->setDefault("fps_max", "60"); settings->setDefault("fps_max_unfocused", "20"); - settings->setDefault("viewing_range", "100"); + settings->setDefault("viewing_range", "190"); #if ENABLE_GLES settings->setDefault("near_plane", "0.1"); #endif @@ -366,11 +366,11 @@ void set_default_settings(Settings *settings) settings->setDefault("chat_message_format", "<@name> @message"); settings->setDefault("profiler_print_interval", "0"); - settings->setDefault("active_object_send_range_blocks", "4"); - settings->setDefault("active_block_range", "3"); + settings->setDefault("active_object_send_range_blocks", "8"); + settings->setDefault("active_block_range", "4"); //settings->setDefault("max_simultaneous_block_sends_per_client", "1"); // This causes frametime jitter on client side, or does it? - settings->setDefault("max_block_send_distance", "10"); + settings->setDefault("max_block_send_distance", "12"); settings->setDefault("block_send_optimize_distance", "4"); settings->setDefault("server_side_occlusion_culling", "true"); settings->setDefault("csm_restriction_flags", "62"); @@ -429,7 +429,7 @@ void set_default_settings(Settings *settings) settings->setDefault("mapgen_limit", "31000"); settings->setDefault("chunksize", "5"); settings->setDefault("fixed_map_seed", ""); - settings->setDefault("max_block_generate_distance", "8"); + settings->setDefault("max_block_generate_distance", "10"); settings->setDefault("enable_mapgen_debug_info", "false"); Mapgen::setDefaultSettings(settings); From 39213bd00a8d00861616d94a29823cb2214f742e Mon Sep 17 00:00:00 2001 From: Lars Date: Mon, 2 Nov 2020 09:27:15 -0800 Subject: [PATCH 137/177] Slight simplification and optimization of RemoteClient. --- src/clientiface.cpp | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/clientiface.cpp b/src/clientiface.cpp index f5e32469b..08d5d3be7 100644 --- a/src/clientiface.cpp +++ b/src/clientiface.cpp @@ -298,20 +298,14 @@ void RemoteClient::GetNextBlocks ( */ MapBlock *block = env->getMap().getBlockNoCreateNoEx(p); - bool surely_not_found_on_disk = false; - bool block_is_invalid = false; + bool block_not_found = false; if (block) { // Reset usage timer, this block will be of use in the future. block->resetUsageTimer(); - // Block is dummy if data doesn't exist. - // It means it has been not found from disk and not generated - if (block->isDummy()) { - surely_not_found_on_disk = true; - } - - if (!block->isGenerated()) - block_is_invalid = true; + // Check whether the block exists (with data) + if (block->isDummy() || !block->isGenerated()) + block_not_found = true; /* If block is not close, don't send it unless it is near @@ -325,7 +319,7 @@ void RemoteClient::GetNextBlocks ( continue; } - if (m_occ_cull && !block_is_invalid && + if (m_occ_cull && !block_not_found && env->getMap().isBlockOccluded(block, cam_pos_nodes)) { continue; } @@ -335,7 +329,7 @@ void RemoteClient::GetNextBlocks ( If block has been marked to not exist on disk (dummy) or is not generated and generating new ones is not wanted, skip block. */ - if (!generate && (surely_not_found_on_disk || block_is_invalid)) { + if (!generate && block_not_found) { // get next one. continue; } @@ -343,7 +337,7 @@ void RemoteClient::GetNextBlocks ( /* Add inexistent block to emerge queue. */ - if (block == NULL || surely_not_found_on_disk || block_is_invalid) { + if (block == NULL || block_not_found) { if (emerge->enqueueBlockEmerge(peer_id, p, generate)) { if (nearest_emerged_d == -1) nearest_emerged_d = d; From 72b93ec0d75e97ec343e5b936b858d686580677d Mon Sep 17 00:00:00 2001 From: Zughy <63455151+Zughy@users.noreply.github.com> Date: Wed, 4 Nov 2020 21:43:18 +0100 Subject: [PATCH 138/177] Fix ObjectRef errors due to lua_isnil() (#10564) Treat 'none' values as 'nil' --- src/script/common/helper.cpp | 46 ++++++++++++++++++--------------- src/script/common/helper.h | 5 +++- src/script/lua_api/l_object.cpp | 32 ++++++++--------------- 3 files changed, 40 insertions(+), 43 deletions(-) diff --git a/src/script/common/helper.cpp b/src/script/common/helper.cpp index f53a2b7e8..488144790 100644 --- a/src/script/common/helper.cpp +++ b/src/script/common/helper.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include +#include #include "c_types.h" #include "c_internal.h" @@ -54,19 +55,16 @@ template <> bool LuaHelper::readParam(lua_State *L, int index) return lua_toboolean(L, index) != 0; } -template <> bool LuaHelper::readParam(lua_State *L, int index, const bool &default_value) -{ - if (lua_isnil(L, index)) - return default_value; - - return lua_toboolean(L, index) != 0; -} - template <> s16 LuaHelper::readParam(lua_State *L, int index) { return lua_tonumber(L, index); } +template <> int LuaHelper::readParam(lua_State *L, int index) +{ + return luaL_checkint(L, index); +} + template <> float LuaHelper::readParam(lua_State *L, int index) { if (isNaN(L, index)) @@ -105,6 +103,25 @@ template <> v2f LuaHelper::readParam(lua_State *L, int index) return p; } +template <> v3f LuaHelper::readParam(lua_State *L, int index) +{ + v3f p; + CHECK_POS_TAB(index); + lua_getfield(L, index, "x"); + CHECK_POS_COORD("x"); + p.X = readParam(L, -1); + lua_pop(L, 1); + lua_getfield(L, index, "y"); + CHECK_POS_COORD("y"); + p.Y = readParam(L, -1); + lua_pop(L, 1); + lua_getfield(L, index, "z"); + CHECK_POS_COORD("z"); + p.Z = readParam(L, -1); + lua_pop(L, 1); + return p; +} + template <> std::string LuaHelper::readParam(lua_State *L, int index) { size_t length; @@ -113,16 +130,3 @@ template <> std::string LuaHelper::readParam(lua_State *L, int index) result.assign(str, length); return result; } - -template <> -std::string LuaHelper::readParam( - lua_State *L, int index, const std::string &default_value) -{ - std::string result; - const char *str = lua_tostring(L, index); - if (str) - result.append(str); - else - result = default_value; - return result; -} diff --git a/src/script/common/helper.h b/src/script/common/helper.h index d639d6e16..7a794dc9b 100644 --- a/src/script/common/helper.h +++ b/src/script/common/helper.h @@ -50,5 +50,8 @@ protected: * @return read value from Lua or default value if nil */ template - static T readParam(lua_State *L, int index, const T &default_value); + static inline T readParam(lua_State *L, int index, const T &default_value) + { + return lua_isnoneornil(L, index) ? default_value : readParam(L, index); + } }; diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index beb8dd339..a6a7c05f9 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -169,11 +169,9 @@ int ObjectRef::l_punch(lua_State *L) if (sao == nullptr || puncher == nullptr) return 0; - float time_from_last_punch = lua_isnil(L, 3) ? - 1000000.0f : readParam(L,3); + float time_from_last_punch = readParam(L, 3, 1000000.0f); ToolCapabilities toolcap = read_tool_capabilities(L, 4); - v3f dir = lua_isnil(L, 5) ? - sao->getBasePosition() - puncher->getBasePosition() : check_v3f(L, 5); + v3f dir = readParam(L, 5, sao->getBasePosition() - puncher->getBasePosition()); dir.normalize(); u16 src_original_hp = sao->getHP(); @@ -383,20 +381,12 @@ int ObjectRef::l_set_animation(lua_State *L) if (sao == nullptr) return 0; - v2f frames = v2f(1, 1); - if (!lua_isnil(L, 2)) - frames = readParam(L, 2); - float frame_speed = 15; - if (!lua_isnil(L, 3)) - frame_speed = lua_tonumber(L, 3); - float frame_blend = 0; - if (!lua_isnil(L, 4)) - frame_blend = lua_tonumber(L, 4); - bool frame_loop = true; - if (lua_isboolean(L, 5)) - frame_loop = readParam(L, 5); + v2f frame_range = readParam(L, 2, v2f(1, 1)); + float frame_speed = readParam(L, 3, 15.0f); + float frame_blend = readParam(L, 4, 0.0f); + bool frame_loop = readParam(L, 5, true); - sao->setAnimation(frames, frame_speed, frame_blend, frame_loop); + sao->setAnimation(frame_range, frame_speed, frame_blend, frame_loop); return 0; } @@ -436,7 +426,7 @@ int ObjectRef::l_set_local_animation(lua_State *L) if (!lua_isnil(L, 2+1)) frames[i] = read_v2s32(L, 2+i); } - float frame_speed = lua_isnil(L, 6) ? 30 : readParam(L, 6); + float frame_speed = readParam(L, 6, 30.0f); getServer(L)->setLocalPlayerAnimations(player, frames, frame_speed); lua_pushboolean(L, true); @@ -965,9 +955,9 @@ int ObjectRef::l_set_sprite(lua_State *L) if (entitysao == nullptr) return 0; - v2s16 start_frame = lua_isnil(L, 2) ? v2s16(0,0) : readParam(L, 2); - int num_frames = lua_isnil(L, 3) ? 1 : luaL_checkint(L, 3); - float framelength = lua_isnil(L, 4) ? 0.2 : lua_tonumber(L, 4); + v2s16 start_frame = readParam(L, 2, v2s16(0,0)); + int num_frames = readParam(L, 3, 1); + float framelength = readParam(L, 4, 0.2f); bool select_x_by_camera = readParam(L, 5, false); entitysao->setSprite(start_frame, num_frames, framelength, select_x_by_camera); From e3bd6704a0eb65e9490347680441c7a08df36f7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= <34514239+appgurueu@users.noreply.github.com> Date: Wed, 4 Nov 2020 21:43:32 +0100 Subject: [PATCH 139/177] Revert "Fix short 180 degree rotation when using set_bone_position (#10405)" (#10534) This reverts commit 0f98b54aa4b2361575002d92b29fe222703ba557. --- src/client/content_cao.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index 29a3acf25..e7f9db845 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -1487,17 +1487,24 @@ void GenericCAO::updateBonePosition() if (!bone) continue; + //If bone is manually positioned there is no need to perform the bug check + bool skip = false; + for (auto &it : m_bone_position) { + if (it.first == bone->getName()) { + skip = true; + break; + } + } + if (skip) + continue; + // Workaround for Irrlicht bug // We check each bone to see if it has been rotated ~180deg from its expected position due to a bug in Irricht // when using EJUOR_CONTROL joint control. If the bug is detected we update the bone to the proper position // and update the bones transformation. v3f bone_rot = bone->getRelativeTransformation().getRotationDegrees(); - float offset_X = fabsf(bone_rot.X - bone->getRotation().X); - float offset_Y = fabsf(bone_rot.Y - bone->getRotation().Y); - float offset_Z = fabsf(bone_rot.Z - bone->getRotation().Z); - if ((offset_X > 179.9f && offset_X < 180.1f) - || (offset_Y > 179.9f && offset_Y < 180.1f) - || (offset_Z > 179.9f && offset_Z < 180.1f)) { + float offset = fabsf(bone_rot.X - bone->getRotation().X); + if (offset > 179.9f && offset < 180.1f) { bone->setRotation(bone_rot); bone->updateAbsolutePosition(); } From 3356da01513860d899cde503408436f7e1918f63 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Wed, 4 Nov 2020 21:46:18 +0100 Subject: [PATCH 140/177] Add model[] formspec element (#10320) Formspec element to display models, written by @kilbith, rebased and tweaked. Co-authored-by: Jean-Patrick Guerrero Co-authored-by: sfan5 --- doc/lua_api.txt | 16 ++ games/devtest/mods/testformspec/LICENSE.txt | 14 + games/devtest/mods/testformspec/formspec.lua | 4 + .../models/testformspec_character.b3d | Bin 0 -> 73433 bytes .../models/testformspec_chest.obj | 79 ++++++ .../textures/default_chest_front.png | Bin 0 -> 423 bytes .../textures/default_chest_inside.png | Bin 0 -> 102 bytes .../textures/default_chest_side.png | Bin 0 -> 375 bytes .../textures/default_chest_top.png | Bin 0 -> 423 bytes .../textures/testformspec_character.png | Bin 0 -> 2754 bytes src/gui/CMakeLists.txt | 1 + src/gui/guiFormSpecMenu.cpp | 86 ++++++ src/gui/guiFormSpecMenu.h | 2 +- src/gui/guiScene.cpp | 257 ++++++++++++++++++ src/gui/guiScene.h | 85 ++++++ util/ci/clang-format-whitelist.txt | 2 + 16 files changed, 545 insertions(+), 1 deletion(-) create mode 100644 games/devtest/mods/testformspec/LICENSE.txt create mode 100644 games/devtest/mods/testformspec/models/testformspec_character.b3d create mode 100644 games/devtest/mods/testformspec/models/testformspec_chest.obj create mode 100644 games/devtest/mods/testformspec/textures/default_chest_front.png create mode 100644 games/devtest/mods/testformspec/textures/default_chest_inside.png create mode 100644 games/devtest/mods/testformspec/textures/default_chest_side.png create mode 100644 games/devtest/mods/testformspec/textures/default_chest_top.png create mode 100644 games/devtest/mods/testformspec/textures/testformspec_character.png create mode 100644 src/gui/guiScene.cpp create mode 100644 src/gui/guiScene.h diff --git a/doc/lua_api.txt b/doc/lua_api.txt index daf0da3d2..38fc3066a 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2272,6 +2272,18 @@ Elements * `frame duration`: Milliseconds between each frame. `0` means the frames don't advance. * `frame start` (Optional): The index of the frame to start on. Default `1`. +### `model[,;,;;;;;;]` + +* Show a mesh model. +* `name`: Element name that can be used for styling +* `mesh`: The mesh model to use. +* `textures`: The mesh textures to use according to the mesh materials. + Texture names must be separated by commas. +* `rotation {X,Y}` (Optional): Initial rotation of the camera. + The axes are euler angles in degrees. +* `continuous` (Optional): Whether the rotation is continuous. Default `false`. +* `mouse control` (Optional): Whether the model can be controlled with the mouse. Default `true`. + ### `item_image[,;,;]` * Show an inventory image of registered item/node @@ -2842,6 +2854,10 @@ Some types may inherit styles from parent types. * font_size - Sets font size. See button `font_size` property for more information. * noclip - boolean, set to true to allow the element to exceed formspec bounds. * textcolor - color. Default white. +* model + * bgcolor - color, sets background color. + * noclip - boolean, set to true to allow the element to exceed formspec bounds. + * Default to false in formspec_version version 3 or higher * image * noclip - boolean, set to true to allow the element to exceed formspec bounds. * Default to false in formspec_version version 3 or higher diff --git a/games/devtest/mods/testformspec/LICENSE.txt b/games/devtest/mods/testformspec/LICENSE.txt new file mode 100644 index 000000000..07696cc30 --- /dev/null +++ b/games/devtest/mods/testformspec/LICENSE.txt @@ -0,0 +1,14 @@ +License of media files +---------------------- +Content imported from minetest_game. + + +BlockMen (CC BY-SA 3.0) + default_chest_front.png + default_chest_lock.png + default_chest_side.png + default_chest_top.png + +stujones11 (CC BY-SA 3.0) +An0n3m0us (CC BY-SA 3.0) + testformspec_character.b3d diff --git a/games/devtest/mods/testformspec/formspec.lua b/games/devtest/mods/testformspec/formspec.lua index 87a05fc96..5495896ce 100644 --- a/games/devtest/mods/testformspec/formspec.lua +++ b/games/devtest/mods/testformspec/formspec.lua @@ -327,6 +327,10 @@ Number] animated_image[3,4.25;1,1;;testformspec_animation.png;4;0;3] animated_image[5.5,0.5;5,2;;testformspec_animation.png;4;100] animated_image[5.5,2.75;5,2;;testformspec_animation.jpg;4;100] + + style[m1;bgcolor=black] + model[0.5,6;4,4;m1;testformspec_character.b3d;testformspec_character.png] + model[5,6;4,4;m2;testformspec_chest.obj;default_chest_top.png,default_chest_top.png,default_chest_side.png,default_chest_side.png,default_chest_front.png,default_chest_inside.png;30,1;true;true] ]], -- Scroll containers diff --git a/games/devtest/mods/testformspec/models/testformspec_character.b3d b/games/devtest/mods/testformspec/models/testformspec_character.b3d new file mode 100644 index 0000000000000000000000000000000000000000..8edbaf6377891568c248cd73d2d691f97c775311 GIT binary patch literal 73433 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%0D>Q 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 ZXpY6Y*b3|77Oab}F$*L6x^P}^{{uEY)gk}@ literal 0 HcmV?d00001 diff --git a/games/devtest/mods/testformspec/models/testformspec_chest.obj b/games/devtest/mods/testformspec/models/testformspec_chest.obj new file mode 100644 index 000000000..72ba175a0 --- /dev/null +++ b/games/devtest/mods/testformspec/models/testformspec_chest.obj @@ -0,0 +1,79 @@ +# Blender v2.78 (sub 0) OBJ File: 'chest-open.blend' +# www.blender.org +o Top_Cube.002_None_Top_Cube.002_None_bottom +v -0.500000 0.408471 0.720970 +v -0.500000 1.115578 0.013863 +v -0.500000 0.894607 -0.207108 +v -0.500000 0.187501 0.499999 +v 0.500000 1.115578 0.013863 +v 0.500000 0.408471 0.720970 +v 0.500000 0.187501 0.499999 +v 0.500000 0.894607 -0.207108 +v -0.500000 0.187500 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.187500 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 0.0000 1.0000 +vt 1.0000 1.0000 +vt 1.0000 0.6875 +vt 0.0000 0.6875 +vt 1.0000 1.0000 +vt 0.0000 0.6875 +vt 1.0000 0.6875 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 0.0000 0.0000 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 1.0000 0.6875 +vt 1.0000 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.6875 +vt 0.0000 0.6875 +vt 0.0000 0.0000 +vt 1.0000 0.5000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 0.7071 0.7071 +vn -0.0000 -1.0000 -0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 -0.0000 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.0000 1.0000 +vn -0.0000 0.7071 -0.7071 +vn -0.0000 0.0000 -1.0000 +vn -0.0000 -0.7071 -0.7071 +vn -0.0000 1.0000 -0.0000 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Top +s off +f 6/1/1 5/2/1 2/3/1 1/4/1 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Bottom +f 11/5/2 10/6/2 14/7/2 13/8/2 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Right-Left +f 1/9/3 2/10/3 3/11/3 4/12/3 +f 5/13/4 6/1/4 7/14/4 8/15/4 +f 4/12/3 9/16/3 10/17/3 11/18/3 +f 12/19/4 7/14/4 13/8/4 14/20/4 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Back +f 6/21/5 1/9/5 4/12/5 7/22/5 +f 7/22/6 4/12/6 11/18/6 13/23/6 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Front +f 2/10/7 5/24/7 8/25/7 3/11/7 +f 9/16/8 12/26/8 14/27/8 10/17/8 +g Top_Cube.002_None_Top_Cube.002_None_bottom_Top_Cube.002_None_Top_Cube.002_None_bottom_Inside +f 4/28/9 3/29/9 8/30/9 7/31/9 +f 7/31/10 12/32/10 9/33/10 4/28/10 diff --git a/games/devtest/mods/testformspec/textures/default_chest_front.png b/games/devtest/mods/testformspec/textures/default_chest_front.png new file mode 100644 index 0000000000000000000000000000000000000000..85227d8fd636ace9592070a2f7e86df531dc03a8 GIT binary patch literal 423 zcmV;Y0a*TtP)i&K4LJ(h4fd|)}Lf=h&H zLXT)Oby_pmu656)Y`~XZu7*#Kb4!G4MT>1goOVBpWiV}2FKSRK-QC@|u%qC!dc~Y& zzLs61d_{+CM1p2Nz__cUqocE{p6j=Mc6N54fmoDxPm^{|mw8KwZcBJ!K5tn$lWaGU zYBh#mEPz=jWJ@J{RU=tkP^|y}0JKR&K~xyiWzI#i!!Qs<(JxtGvCM3T^TSO0-&i_h z-{GmQuJfE_l-{oE`T}5=5$C4V3&q&H0!WvEqLgLXY__8{K&+!MG8kioLN@@6 zN>kDk@*aBGOD_RVl&R|knQ6>5Cjg{HdNti|CKb)I1AvErQM3I&FVvh>0Bdbfh?>Um zAmA$iTLe&1C`R-A2rxJ}fDLU}me>LiC%WV=gmA9K@ef4uc|E)2k#quJ)ECCe4HTG& R7=Qo(002ovPDHLkV1m!~wG03N literal 0 HcmV?d00001 diff --git a/games/devtest/mods/testformspec/textures/default_chest_inside.png b/games/devtest/mods/testformspec/textures/default_chest_inside.png new file mode 100644 index 0000000000000000000000000000000000000000..5f7b6b13270890618c6a6332eee1c6c721b91f1b GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!2~3yyw0Buq;x%9978NlCvUkPo}j=vVadU` z_{Ppg7lT!aA;@D3{h6xK;WWK5B?*(dP@O1TaS?83{1OQEB B9=-qo literal 0 HcmV?d00001 diff --git a/games/devtest/mods/testformspec/textures/default_chest_side.png b/games/devtest/mods/testformspec/textures/default_chest_side.png new file mode 100644 index 0000000000000000000000000000000000000000..44a65a43d3c3f2ba44bceb519a0696e1ba441800 GIT binary patch literal 375 zcmV--0f_#IP)n`5knO{RcJoOVB!a5-&MFKSRK;In$zuXoa@aHD)h zf@VK%ST=rFCF{3-pn+J3ZcC(oM}}W4WJ@JsV)uan0065=L_t&-(`C+A5`!=dMbXH@ z-MB%3P}BSV*B6mr?&lfJ= zdsUum4#6X1C?EZJP^f8bSOa-|wF`=iC+qn|{rj V3gJ4$MZo|7002ovPDHLkV1iD9pBn%G literal 0 HcmV?d00001 diff --git a/games/devtest/mods/testformspec/textures/default_chest_top.png b/games/devtest/mods/testformspec/textures/default_chest_top.png new file mode 100644 index 0000000000000000000000000000000000000000..f4a92ee07edb9c3b6b8e33320082ca222656c252 GIT binary patch literal 423 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 parts = split(element, ';'); + + if (parts.size() < 5 || (parts.size() > 8 && + m_formspec_version <= FORMSPEC_API_VERSION)) { + errorstream << "Invalid model element (" << parts.size() << "): '" << element + << "'" << std::endl; + return; + } + + // Avoid length checks by resizing + if (parts.size() < 8) + parts.resize(8); + + std::vector v_pos = split(parts[0], ','); + std::vector v_geom = split(parts[1], ','); + std::string name = unescape_string(parts[2]); + std::string meshstr = unescape_string(parts[3]); + std::vector textures = split(parts[4], ','); + std::vector vec_rot = split(parts[5], ','); + bool inf_rotation = is_yes(parts[6]); + bool mousectrl = is_yes(parts[7]) || parts[7].empty(); // default true + + MY_CHECKPOS("model", 0); + MY_CHECKGEOM("model", 1); + + v2s32 pos; + v2s32 geom; + + if (data->real_coordinates) { + pos = getRealCoordinateBasePos(v_pos); + geom = getRealCoordinateGeometry(v_geom); + } else { + pos = getElementBasePos(&v_pos); + geom.X = stof(v_geom[0]) * (float)imgsize.X; + geom.Y = stof(v_geom[1]) * (float)imgsize.Y; + } + + if (!data->explicit_size) + warningstream << "invalid use of model without a size[] element" << std::endl; + + scene::IAnimatedMesh *mesh = m_client->getMesh(meshstr); + + if (!mesh) { + errorstream << "Invalid model element: Unable to load mesh:" + << std::endl << "\t" << meshstr << std::endl; + return; + } + + FieldSpec spec( + name, + L"", + L"", + 258 + m_fields.size() + ); + + core::rect rect(pos, pos + geom); + + GUIScene *e = new GUIScene(Environment, RenderingEngine::get_scene_manager(), + data->current_parent, rect, spec.fid); + + auto meshnode = e->setMesh(mesh); + + for (u32 i = 0; i < textures.size() && i < meshnode->getMaterialCount(); ++i) + e->setTexture(i, m_tsrc->getTexture(textures[i])); + + if (vec_rot.size() >= 2) + e->setRotation(v2f(stof(vec_rot[0]), stof(vec_rot[1]))); + + e->enableContinuousRotation(inf_rotation); + e->enableMouseControl(mousectrl); + + auto style = getStyleForElement("model", spec.fname); + e->setStyles(style); + e->drop(); + + m_fields.push_back(spec); +} + void GUIFormSpecMenu::parseElement(parserData* data, const std::string &element) { //some prechecks @@ -2891,6 +2972,11 @@ void GUIFormSpecMenu::parseElement(parserData* data, const std::string &element) return; } + if (type == "model") { + parseModel(data, description); + return; + } + // Ignore others infostream << "Unknown DrawSpec: type=" << type << ", data=\"" << description << "\"" << std::endl; diff --git a/src/gui/guiFormSpecMenu.h b/src/gui/guiFormSpecMenu.h index 613acaa04..c5d662a69 100644 --- a/src/gui/guiFormSpecMenu.h +++ b/src/gui/guiFormSpecMenu.h @@ -38,7 +38,6 @@ with this program; if not, write to the Free Software Foundation, Inc., class InventoryManager; class ISimpleTextureSource; class Client; -class TexturePool; class GUIScrollContainer; typedef enum { @@ -444,6 +443,7 @@ private: void parseAnchor(parserData *data, const std::string &element); bool parseStyle(parserData *data, const std::string &element, bool style_type); void parseSetFocus(const std::string &element); + void parseModel(parserData *data, const std::string &element); void tryClose(); diff --git a/src/gui/guiScene.cpp b/src/gui/guiScene.cpp new file mode 100644 index 000000000..08f119e07 --- /dev/null +++ b/src/gui/guiScene.cpp @@ -0,0 +1,257 @@ +/* +Minetest +Copyright (C) 2020 Jean-Patrick Guerrero + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "guiScene.h" + +#include +#include +#include +#include "porting.h" + +GUIScene::GUIScene(gui::IGUIEnvironment *env, scene::ISceneManager *smgr, + gui::IGUIElement *parent, core::recti rect, s32 id) + : IGUIElement(gui::EGUIET_ELEMENT, env, parent, id, rect) +{ + m_driver = env->getVideoDriver(); + m_smgr = smgr->createNewSceneManager(false); + + m_cam = m_smgr->addCameraSceneNode(0, v3f(0.f, 0.f, -100.f), v3f(0.f)); + m_cam->setFOV(30.f * core::DEGTORAD); + + scene::ILightSceneNode *light = m_smgr->addLightSceneNode(m_cam); + light->setRadius(1000.f); + + m_smgr->getParameters()->setAttribute(scene::ALLOW_ZWRITE_ON_TRANSPARENT, true); +} + +GUIScene::~GUIScene() +{ + setMesh(nullptr); + + m_smgr->drop(); +} + +scene::IAnimatedMeshSceneNode *GUIScene::setMesh(scene::IAnimatedMesh *mesh) +{ + if (m_mesh) { + m_mesh->remove(); + m_mesh = nullptr; + } + + if (!mesh) + return nullptr; + + m_mesh = m_smgr->addAnimatedMeshSceneNode(mesh); + m_mesh->setPosition(-m_mesh->getBoundingBox().getCenter()); + m_mesh->animateJoints(); + return m_mesh; +} + +void GUIScene::setTexture(u32 idx, video::ITexture *texture) +{ + video::SMaterial &material = m_mesh->getMaterial(idx); + material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; + material.MaterialTypeParam = 0.5f; + material.TextureLayer[0].Texture = texture; + material.setFlag(video::EMF_LIGHTING, false); + material.setFlag(video::EMF_FOG_ENABLE, true); + material.setFlag(video::EMF_BILINEAR_FILTER, false); + material.setFlag(video::EMF_BACK_FACE_CULLING, false); +} + +void GUIScene::draw() +{ + // Control rotation speed based on time + u64 new_time = porting::getTimeMs(); + u64 dtime_ms = 0; + if (m_last_time != 0) + dtime_ms = porting::getDeltaMs(m_last_time, new_time); + m_last_time = new_time; + + core::rect oldViewPort = m_driver->getViewPort(); + m_driver->setViewPort(getAbsoluteClippingRect()); + core::recti borderRect = Environment->getRootGUIElement()->getAbsoluteClippingRect(); + + if (m_bgcolor != 0) { + Environment->getSkin()->draw3DSunkenPane( + this, m_bgcolor, false, true, borderRect, 0); + } + + core::dimension2d size = getAbsoluteClippingRect().getSize(); + m_smgr->getActiveCamera()->setAspectRatio((f32)size.Width / (f32)size.Height); + + if (!m_target) { + updateCamera(m_smgr->addEmptySceneNode()); + rotateCamera(v3f(0.f)); + m_cam->bindTargetAndRotation(true); + } + + cameraLoop(); + + // Continuous rotation + if (m_inf_rot) + rotateCamera(v3f(0.f, -0.03f * (float)dtime_ms, 0.f)); + + m_smgr->drawAll(); + + if (m_initial_rotation && m_mesh) { + rotateCamera(v3f(m_custom_rot.X, m_custom_rot.Y, 0.f)); + calcOptimalDistance(); + + m_initial_rotation = false; + } + + m_driver->setViewPort(oldViewPort); +} + +bool GUIScene::OnEvent(const SEvent &event) +{ + if (m_mouse_ctrl && event.EventType == EET_MOUSE_INPUT_EVENT) { + if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) { + m_last_pos = v2f((f32)event.MouseInput.X, (f32)event.MouseInput.Y); + return true; + } else if (event.MouseInput.Event == EMIE_MOUSE_MOVED) { + if (event.MouseInput.isLeftPressed()) { + m_curr_pos = v2f((f32)event.MouseInput.X, (f32)event.MouseInput.Y); + + rotateCamera(v3f( + m_last_pos.Y - m_curr_pos.Y, + m_curr_pos.X - m_last_pos.X, 0.f)); + + m_last_pos = m_curr_pos; + return true; + } + } + } + + return gui::IGUIElement::OnEvent(event); +} + +void GUIScene::setStyles(const std::array &styles) +{ + StyleSpec::State state = StyleSpec::STATE_DEFAULT; + StyleSpec style = StyleSpec::getStyleFromStatePropagation(styles, state); + + setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); + setBackgroundColor(style.getColor(StyleSpec::BGCOLOR, m_bgcolor)); +} + +/* Camera control functions */ + +inline void GUIScene::calcOptimalDistance() +{ + core::aabbox3df box = m_mesh->getBoundingBox(); + f32 width = box.MaxEdge.X - box.MinEdge.X; + f32 height = box.MaxEdge.Y - box.MinEdge.Y; + f32 depth = box.MaxEdge.Z - box.MinEdge.Z; + f32 max_width = width > depth ? width : depth; + + const scene::SViewFrustum *f = m_cam->getViewFrustum(); + f32 cam_far = m_cam->getFarValue(); + f32 far_width = core::line3df(f->getFarLeftUp(), f->getFarRightUp()).getLength(); + f32 far_height = core::line3df(f->getFarLeftUp(), f->getFarLeftDown()).getLength(); + + core::recti rect = getAbsolutePosition(); + f32 zoomX = rect.getWidth() / max_width; + f32 zoomY = rect.getHeight() / height; + f32 dist; + + if (zoomX < zoomY) + dist = (max_width / (far_width / cam_far)) + (0.5f * max_width); + else + dist = (height / (far_height / cam_far)) + (0.5f * max_width); + + m_cam_distance = dist; + m_update_cam = true; +} + +void GUIScene::updateCamera(scene::ISceneNode *target) +{ + m_target = target; + updateTargetPos(); + + m_last_target_pos = m_target_pos; + updateCameraPos(); + + m_update_cam = true; +} + +void GUIScene::updateTargetPos() +{ + m_last_target_pos = m_target_pos; + m_target->updateAbsolutePosition(); + m_target_pos = m_target->getAbsolutePosition(); +} + +void GUIScene::setCameraRotation(v3f rot) +{ + correctBounds(rot); + + core::matrix4 mat; + mat.setRotationDegrees(rot); + + m_cam_pos = v3f(0.f, 0.f, m_cam_distance); + mat.rotateVect(m_cam_pos); + + m_cam_pos += m_target_pos; + m_cam->setPosition(m_cam_pos); + m_update_cam = false; +} + +bool GUIScene::correctBounds(v3f &rot) +{ + const float ROTATION_MAX_1 = 60.0f; + const float ROTATION_MAX_2 = 300.0f; + + // Limit and correct the rotation when needed + if (rot.X < 90.f) { + if (rot.X > ROTATION_MAX_1) { + rot.X = ROTATION_MAX_1; + return true; + } + } else if (rot.X < ROTATION_MAX_2) { + rot.X = ROTATION_MAX_2; + return true; + } + + // Not modified + return false; +} + +void GUIScene::cameraLoop() +{ + updateCameraPos(); + updateTargetPos(); + + if (m_target_pos != m_last_target_pos) + m_update_cam = true; + + if (m_update_cam) { + m_cam_pos = m_target_pos + (m_cam_pos - m_target_pos).normalize() * m_cam_distance; + + v3f rot = getCameraRotation(); + if (correctBounds(rot)) + setCameraRotation(rot); + + m_cam->setPosition(m_cam_pos); + m_cam->setTarget(m_target_pos); + + m_update_cam = false; + } +} diff --git a/src/gui/guiScene.h b/src/gui/guiScene.h new file mode 100644 index 000000000..707e6f66a --- /dev/null +++ b/src/gui/guiScene.h @@ -0,0 +1,85 @@ +/* +Minetest +Copyright (C) 2020 Jean-Patrick Guerrero + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#pragma once + +#include "irrlichttypes_extrabloated.h" +#include "ICameraSceneNode.h" +#include "StyleSpec.h" + +using namespace irr; + +class GUIScene : public gui::IGUIElement +{ +public: + GUIScene(gui::IGUIEnvironment *env, scene::ISceneManager *smgr, + gui::IGUIElement *parent, core::recti rect, s32 id = -1); + + ~GUIScene(); + + scene::IAnimatedMeshSceneNode *setMesh(scene::IAnimatedMesh *mesh = nullptr); + void setTexture(u32 idx, video::ITexture *texture); + void setBackgroundColor(const video::SColor &color) noexcept { m_bgcolor = color; }; + void enableMouseControl(bool enable) noexcept { m_mouse_ctrl = enable; }; + void setRotation(v2f rot) noexcept { m_custom_rot = rot; }; + void enableContinuousRotation(bool enable) noexcept { m_inf_rot = enable; }; + void setStyles(const std::array &styles); + + virtual void draw(); + virtual bool OnEvent(const SEvent &event); + +private: + void calcOptimalDistance(); + void updateTargetPos(); + void updateCamera(scene::ISceneNode *target); + void setCameraRotation(v3f rot); + /// @return true indicates that the rotation was corrected + bool correctBounds(v3f &rot); + void cameraLoop(); + + void updateCameraPos() { m_cam_pos = m_cam->getPosition(); }; + v3f getCameraRotation() const { return (m_cam_pos - m_target_pos).getHorizontalAngle(); }; + void rotateCamera(const v3f &delta) { setCameraRotation(getCameraRotation() + delta); }; + + scene::ISceneManager *m_smgr; + video::IVideoDriver *m_driver; + scene::ICameraSceneNode *m_cam; + scene::ISceneNode *m_target = nullptr; + scene::IAnimatedMeshSceneNode *m_mesh = nullptr; + + f32 m_cam_distance = 50.f; + + u64 m_last_time = 0; + + v3f m_cam_pos; + v3f m_target_pos; + v3f m_last_target_pos; + // Cursor positions + v2f m_curr_pos; + v2f m_last_pos; + // Initial rotation + v2f m_custom_rot; + + bool m_mouse_ctrl = true; + bool m_update_cam = false; + bool m_inf_rot = false; + bool m_initial_rotation = true; + + video::SColor m_bgcolor = 0; +}; diff --git a/util/ci/clang-format-whitelist.txt b/util/ci/clang-format-whitelist.txt index 3334257ae..75d99f4cd 100644 --- a/util/ci/clang-format-whitelist.txt +++ b/util/ci/clang-format-whitelist.txt @@ -183,6 +183,8 @@ src/gui/guiMainMenu.h src/gui/guiPasswordChange.cpp src/gui/guiPathSelectMenu.cpp src/gui/guiPathSelectMenu.h +src/gui/guiScene.cpp +src/gui/guiScene.h src/gui/guiScrollBar.cpp src/gui/guiSkin.cpp src/gui/guiSkin.h From 627c22c36e32185d48d2faf8197e22cbaa4c50b2 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Thu, 5 Nov 2020 19:34:40 +0100 Subject: [PATCH 141/177] Fix integer-string conversion for shaders closes #10605 --- src/client/shader.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/client/shader.cpp b/src/client/shader.cpp index f2aa00246..4f6430579 100644 --- a/src/client/shader.cpp +++ b/src/client/shader.cpp @@ -734,7 +734,7 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp shaders_header += "#define "; shaders_header += drawTypes[i]; shaders_header += " "; - shaders_header += std::to_string(i); + shaders_header += itos(i); shaders_header += "\n"; } @@ -757,15 +757,15 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp shaders_header += "#define "; shaders_header += materialTypes[i]; shaders_header += " "; - shaders_header += std::to_string(i); + shaders_header += itos(i); shaders_header += "\n"; } shaders_header += "#define MATERIAL_TYPE "; - shaders_header += std::to_string(material_type); + shaders_header += itos(material_type); shaders_header += "\n"; shaders_header += "#define DRAW_TYPE "; - shaders_header += std::to_string(drawtype); + shaders_header += itos(drawtype); shaders_header += "\n"; if (g_settings->getBool("enable_waving_water")){ From 8c1871fa2c066a2086988684256da97bd0f4ab6f Mon Sep 17 00:00:00 2001 From: Lars Date: Fri, 6 Nov 2020 10:54:04 -0800 Subject: [PATCH 142/177] Revert #10495 and simplify. --- src/clientiface.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/clientiface.cpp b/src/clientiface.cpp index 08d5d3be7..01852c5d1 100644 --- a/src/clientiface.cpp +++ b/src/clientiface.cpp @@ -209,6 +209,13 @@ void RemoteClient::GetNextBlocks ( s16 d_max_gen = std::min(adjustDist(m_max_gen_distance, prop_zoom_fov), wanted_range); + s16 d_max = full_d_max; + + // Don't loop very much at a time + s16 max_d_increment_at_time = 2; + if (d_max > d_start + max_d_increment_at_time) + d_max = d_start + max_d_increment_at_time; + // cos(angle between velocity and camera) * |velocity| // Limit to 0.0f in case player moves backwards. f32 dot = rangelim(camera_dir.dotProduct(playerspeed), 0.0f, 300.0f); @@ -225,7 +232,7 @@ void RemoteClient::GetNextBlocks ( const v3s16 cam_pos_nodes = floatToInt(camera_pos, BS); s16 d; - for (d = d_start; d <= full_d_max; d++) { + for (d = d_start; d <= d_max; d++) { /* Get the border/face dot coordinates of a "d-radiused" box From c940a57a384b1a75730776906451078d25c5aa52 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 8 Nov 2020 11:30:16 +0100 Subject: [PATCH 143/177] ContentCAO: Fix segfault when minimap is disabled --- src/client/content_cao.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index e7f9db845..7c349244f 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -894,6 +894,9 @@ u16 GenericCAO::getLightPosition(v3s16 *pos) void GenericCAO::updateMarker() { + if (!m_client->getMinimap()) + return; + if (!m_prop.show_on_minimap) { if (m_marker) m_client->getMinimap()->removeMarker(&m_marker); From 7589cbe086a5558eea018e1e3d25e388b26d51e8 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Mon, 9 Nov 2020 10:55:15 +0000 Subject: [PATCH 144/177] Fix object interaction distance not being checked (#10547) --- doc/lua_api.txt | 4 ++-- src/network/serverpackethandler.cpp | 13 +++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 38fc3066a..985af2f6e 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -6189,9 +6189,9 @@ object you are working with still exists. * `bone`: string * `position`: `{x=num, y=num, z=num}` (relative) * `rotation`: `{x=num, y=num, z=num}` = Rotation on each axis, in degrees - * `forced_visible`: Boolean to control whether the attached entity + * `forced_visible`: Boolean to control whether the attached entity should appear in first person. -* `get_attach()`: returns parent, bone, position, rotation, forced_visible, +* `get_attach()`: returns parent, bone, position, rotation, forced_visible, or nil if it isn't attached. * `get_children()`: returns a list of ObjectRefs that are attached to the object. diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index 0bd09e637..95e7c548e 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -1050,12 +1050,13 @@ void Server::handleCommand_Interact(NetworkPacket *pkt) } float d = playersao->getEyePosition().getDistanceFrom(target_pos); - if (!checkInteractDistance(player, d, pointed.dump()) - && pointed.type == POINTEDTHING_NODE) { - // Re-send block to revert change on client-side - RemoteClient *client = getClient(peer_id); - v3s16 blockpos = getNodeBlockPos(pointed.node_undersurface); - client->SetBlockNotSent(blockpos); + if (!checkInteractDistance(player, d, pointed.dump())) { + if (pointed.type == POINTEDTHING_NODE) { + // Re-send block to revert change on client-side + RemoteClient *client = getClient(peer_id); + v3s16 blockpos = getNodeBlockPos(pointed.node_undersurface); + client->SetBlockNotSent(blockpos); + } return; } } From e1142ee57f2d7b59a86f6d0d72ae043844bc3121 Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Sat, 7 Nov 2020 17:45:32 +0100 Subject: [PATCH 145/177] Joystick: Remap joystick-specific KeyTypes to generic ones According to the following table: * MOUSE_L -> DIG * MOUSE_R -> PLACE * SCROLL_UP -> HOTBAR_NEXT * SCROLL_DOWN -> HOTBAR_PREV This commit entirely removes the special KeyTypes used for joysticks. Support for the MOUSE KeyTypes had already been removed in the main game code without adapting the joystick code, breaking joystick input. This commit restores joystick functionality. --- src/client/game.cpp | 16 ++++++---------- src/client/joystick_controller.cpp | 22 +++++++++++----------- src/client/keys.h | 6 ------ 3 files changed, 17 insertions(+), 27 deletions(-) diff --git a/src/client/game.cpp b/src/client/game.cpp index 0380c1661..5c38e027d 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -2014,15 +2014,11 @@ void Game::processItemSelection(u16 *new_playeritem) s32 dir = wheel; - if (input->joystick.wasKeyDown(KeyType::SCROLL_DOWN) || - wasKeyDown(KeyType::HOTBAR_NEXT)) { + if (wasKeyDown(KeyType::HOTBAR_NEXT)) dir = -1; - } - if (input->joystick.wasKeyDown(KeyType::SCROLL_UP) || - wasKeyDown(KeyType::HOTBAR_PREV)) { + if (wasKeyDown(KeyType::HOTBAR_PREV)) dir = 1; - } if (dir < 0) *new_playeritem = *new_playeritem < max_item ? *new_playeritem + 1 : 0; @@ -3138,11 +3134,11 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug) input->clearWasKeyPressed(); input->clearWasKeyReleased(); - input->joystick.clearWasKeyDown(KeyType::MOUSE_L); - input->joystick.clearWasKeyDown(KeyType::MOUSE_R); + input->joystick.clearWasKeyDown(KeyType::DIG); + input->joystick.clearWasKeyDown(KeyType::PLACE); - input->joystick.clearWasKeyReleased(KeyType::MOUSE_L); - input->joystick.clearWasKeyReleased(KeyType::MOUSE_R); + input->joystick.clearWasKeyReleased(KeyType::DIG); + input->joystick.clearWasKeyReleased(KeyType::PLACE); } diff --git a/src/client/joystick_controller.cpp b/src/client/joystick_controller.cpp index c29e8b639..742115046 100644 --- a/src/client/joystick_controller.cpp +++ b/src/client/joystick_controller.cpp @@ -74,8 +74,8 @@ JoystickLayout create_default_layout() // Accessible without four modifier button pressed // regardless whether start is pressed or not - JLO_B_PB(KeyType::MOUSE_L, fb | 1 << 4, 1 << 4); - JLO_B_PB(KeyType::MOUSE_R, fb | 1 << 5, 1 << 5); + JLO_B_PB(KeyType::DIG, fb | 1 << 4, 1 << 4); + JLO_B_PB(KeyType::PLACE, fb | 1 << 5, 1 << 5); // Accessible without any modifier pressed JLO_B_PB(KeyType::JUMP, bm | 1 << 0, 1 << 0); @@ -83,9 +83,9 @@ JoystickLayout create_default_layout() // Accessible with start button not pressed, but four pressed // TODO find usage for button 0 - JLO_B_PB(KeyType::DROP, bm | 1 << 1, fb | 1 << 1); - JLO_B_PB(KeyType::SCROLL_UP, bm | 1 << 4, fb | 1 << 4); - JLO_B_PB(KeyType::SCROLL_DOWN,bm | 1 << 5, fb | 1 << 5); + JLO_B_PB(KeyType::DROP, bm | 1 << 1, fb | 1 << 1); + JLO_B_PB(KeyType::HOTBAR_PREV, bm | 1 << 4, fb | 1 << 4); + JLO_B_PB(KeyType::HOTBAR_NEXT, bm | 1 << 5, fb | 1 << 5); // Accessible with start button and four pressed // TODO find usage for buttons 0, 1 and 4, 5 @@ -99,8 +99,8 @@ JoystickLayout create_default_layout() JLO_A_PB(KeyType::RIGHT, 0, -1, 1024); // Scroll buttons - JLO_A_PB(KeyType::SCROLL_UP, 2, -1, 1024); - JLO_A_PB(KeyType::SCROLL_DOWN, 5, -1, 1024); + JLO_A_PB(KeyType::HOTBAR_PREV, 2, -1, 1024); + JLO_A_PB(KeyType::HOTBAR_NEXT, 5, -1, 1024); return jlo; } @@ -134,10 +134,10 @@ JoystickLayout create_xbox_layout() JLO_B_PB(KeyType::SNEAK, 1 << 12, 1 << 12); // right // Triggers - JLO_B_PB(KeyType::MOUSE_L, 1 << 6, 1 << 6); // lt - JLO_B_PB(KeyType::MOUSE_R, 1 << 7, 1 << 7); // rt - JLO_B_PB(KeyType::SCROLL_UP, 1 << 4, 1 << 4); // lb - JLO_B_PB(KeyType::SCROLL_DOWN, 1 << 5, 1 << 5); // rb + JLO_B_PB(KeyType::DIG, 1 << 6, 1 << 6); // lt + JLO_B_PB(KeyType::PLACE, 1 << 7, 1 << 7); // rt + JLO_B_PB(KeyType::HOTBAR_PREV, 1 << 4, 1 << 4); // lb + JLO_B_PB(KeyType::HOTBAR_NEXT, 1 << 5, 1 << 5); // rb // D-PAD JLO_B_PB(KeyType::ZOOM, 1 << 15, 1 << 15); // up diff --git a/src/client/keys.h b/src/client/keys.h index b6ce59b4a..60a7a3c45 100644 --- a/src/client/keys.h +++ b/src/client/keys.h @@ -110,12 +110,6 @@ public: SLOT_31, SLOT_32, - // joystick specific keys - MOUSE_L, - MOUSE_R, - SCROLL_UP, - SCROLL_DOWN, - // Fake keycode for array size and internal checks INTERNAL_ENUM_COUNT From b6e47a30bb05a6424fd6d5f2f0151afba4c5d825 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Mon, 9 Nov 2020 15:12:25 +0100 Subject: [PATCH 146/177] Update fallback font to newer version --- fonts/DroidSansFallbackFull-LICENSE.txt | 2 +- fonts/DroidSansFallbackFull.ttf | Bin 4529044 -> 5398328 bytes src/CMakeLists.txt | 2 -- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/fonts/DroidSansFallbackFull-LICENSE.txt b/fonts/DroidSansFallbackFull-LICENSE.txt index d3a2eaa8c..a7bf409b7 100644 --- a/fonts/DroidSansFallbackFull-LICENSE.txt +++ b/fonts/DroidSansFallbackFull-LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (C) 2008 The Android Open Source Project +Copyright (C) 2012 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/fonts/DroidSansFallbackFull.ttf b/fonts/DroidSansFallbackFull.ttf index a9df00585a4e44cf91238b7b31385e7e36e1dea7..0cacabedcaedaca8d95afe0e1d3a044ad337d012 100644 GIT binary patch delta 2380786 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¥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 z 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

MoB6*+Hpe+~S~mnLcNKYzEQYz;HC7zP#> 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 z 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


~o*Dj$>D#L69Ji0oY5Ij&b5qgNwuOc>l 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
    9dh*O+FLYA-5e+LV!SYQtq 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 Wk6ez=tmk8In2!;{G~`I%%KroBKe3en delta 1591711 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%0Djh2Jjx_5%pNUHDkxV}*|u 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�c%^0U0XvhLQ2X=17anSm^$vE55^@NH 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


    ^8NA?O@I(p8deSIq% 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

    8`iI`1sAs{m- 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%0A@kuc1rcN2CuUh@B6F+_nvz;~%0#%!k|8 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

    HdXStuHt9O=EWr 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�b~YQoE*}h(2-+6y)g6e4W$OdU;CSStv#g^8^IK_p zLj)M{InPW)wX+B1A^U(mE)Mm>S!BUst(sNv8gkWcdX+|Cu({`QLve06d$i2tt$Hrd z{HzR7hwM;O4`8W70~zuoRQ5>=-bYlG7MwSQnRqhj^O@vzlTk1azD`ZDTg6>=!1(NQh^%~TK7`(|+=jmKWaKIs7#XFf2k_Ht@BX3}CO_#$+J-rS zM4}%7QQiZ#JMg6v2tq?c6L2@T0yxeJ*l6o}_SbaBt=Ud-E3>#+Lu=dav%rC{PYokpdMMn)!M{|Xs>wnnyevGV| z#=<1=!C)YzN8te#+X9t}Qxcl_M9)^ZL9%}MoWql6GTY$YUKWsCgFuHKg*rKaG?_S} zB-jQ+g+aiQ%Af%4OKs4_Ljfj4{3GV>`7vp{drX!6*x(^+H>kk0-k3(0jWrbcL29VT z#M>aan%H?tRO)xn$!`M>*RMaRVJg zX&DoMJ*$u~G4x3|hG-I26K2?cl+jCLM1vIXPjP|mcv778ZH~-`~6JNALuS7uKhXEjlkLE`}J9CIM)5DHS7DcRI|T-7t*sVHefggV>-SEFr^Cw zre5OIn<`k`q!5lxZ4-jlok&g}wfJPCUF4EaJ!uI?-g6y@YPrK`A2#W3TO7t8aD11| z4te{!d2qcW&CHxCUF8@)Vjz$ZL&E_{AvExde7uhPeHTu69`n@2JrjHg7SyrTXz=)( z>=k>vfv$uNBeh~)hyw~xvj}eTMp!dMQ!L$ck9y^mkd->=kvQ~_wJ$lpB?^$o z5R%I8q!&muC~a(lG4{6d6a+zbMj#=Qb6cb0!EKH>)aKW6;MjTqj#ce)*{CJo z@wb?@32A0@G=HEpHimz$@-|4dS7NCcIz|FEVjy_hLe}u-=MlGkvu+|?9xGMG0~ARQ z=P*%vcR|W{Y}Qi9F-)8)a3)WX6N>D27ttr(jr4DzIkkCs{rayWl(2I4 zZ8hv0u1AAZOiwyGYjUd&kipQu6byCJ0rH*us$Z@8t%8ppNq;pKTkW;`Ffl1L-XB71 zFKAb@QoFVG)&RwI71%`vQtvOOJF$n;iH22DGIFfrCm-JtnaP)SMDg*Hwg>2#J3Iqw zX*H1D{#;QWaZ~fvunmBsE{J8>i5OOO;IEy5o>(<1dYbp!*-`<3q6oU(Aanq4TMFO~ z;d6{;fpXVoqGb0@z)9FX0T)1?#n2}Fcr|%=zwag=-5J5k(w?1Nfu_-LHB*Bq4GTj{ zmgYU!aZwNsGxhdXkshAmR1>n5cs-Ytc14q3?`M7p`8{D!_IONK5wG7B&5ZP4dMU2u zwWlJ~j#Th$B-O4k)_~Qq01|Qs%aKij+|N5sb!2r)nwn39-BBK*{3ce~yAUd0;2(9c z#_%i&qNBU{JK6dOSvUD|Hi)inIMdUp4vweqb3jUuz_eEhW~hQSDGq`oPFJmfp3G_A z=<0!vUjs0+h2o%Z6|BZo!Gy;eJJs-05qHuXCh}=tM~F7D8RzyQiB3|Q2AA&X7e>US zGHqMQ?mdyY;Vh^uI7Td*Dh|-27U9xJY;k>FXR^9Mg*-Y9AkT9s<48a6i90{o)G_rms0<{1g?uJH1sR zF7A00_>0hgq{tUVFQEL_UbygwuyNu4sDx-vHj{-kl}AkgI%vb{S}ejRSJflKK7Ng= zUb8c+|1Ashr4sU51}-=)j$t0%Rw^F08vTF3wf#FGqE5-Hc8H8g#x*aVP}kGi*gA?> zdy&+e%SYX}dSuP8zX_P#QyX@!D~VY83c^xGIiRImv4q;xmbSD4NkT zeRm-m`vuy>1QMN1et0B`xAX45Q1h&2@u1Y|v1e47W+XuzM4deEnJW-dR06II4I#>2 zl{~p7+RDVBV?+&v{dZ#c2zGa~VR!TYBYMeqK5S^a?g?zv<^wBFB!{bPqk0{b_TzS)^E@hn;ma+0OWoa&t5O({eM`07k$8np30T?CG1= zc-%~hEh_{v>+I}r19Md`As0FfPAVzQqo?#pPt}7&UTN(odHj}u-S{hUa?6(4H+EN7 z$GEv~AyDbDzAY-{eZK}LE~#nqX&rz7FY#m2ACQU~^cGsG`Lv0WOLOLQseM`MKQ|=g zPgErctGUputs^u=p~F_q!x})^+OrU5fqeY>DoTM4MT-kod5HxLH;BU$S3)F5AUjt< zLHOHP?tPCu^qd^+?^xVoGc(db_ZR-1HL<1)jb~g}3BL`s0Sk3RpzlyEm(i#~&mJ4y zt5U^uakU+jZ+2Q80^d5;B!7xMaSE1PXOTsZJH%X-_} zprdZa_;I%*7$-e^FKq~r*`03aWK1{Xfr)NXdN>!xZ#vsR!i77hGvni}EBV*T&{`#x zJ5_xmId^>&NZ8Kqz&89#$PGRIP}WPH-?}P|w;5WqpXDmX?+(aAT>M&eloWu3Fe}h=nI%xyUH`mJ!MfVdue;J9BF^ zxsNc||HV3Ljq|p+bfs!Lv6Rn-WvS?4p~KA85JxpDP{L`*-2nA!aB)E@##UW!eW{8c zZ*bnLq1A_sLo}c|%qvOZw#e`5s6w0Aph0qlBM<3k^!y42Q^gdVuj%#+oZ$tg7wM68 zE6LKExBEA|%haaP+JTp1lb-{xtV~xWj#>mfPFJjB(ndOP5I|Pdr{Jw7_9MLIoPG_m z9kNnIj#a$})xCv{BI;5yge#W80_yq=4Ti01(LpI zd5#&Bc~J+F2dF=h9JP^H0i6iyVmq+mE1HalC(BS9ixuT#Oov?<^M-}#e6sIV5xf!u ze&`qy`xSV2*t5X6Eq=QV?}tOK;A7Dm(8qshKk zM-T`|&27$OBIKG66FbtFF(oCiD970%#0IcY*yoNd!cDsc$dNsoV!hkfO3iiZ`w@XkZXb^s*p8 zTLdz&J#aF39zbNV*Exu9pxJVWg$bz0$79fe&;cD|iKr0|DPLIdiVprefZQ91cr?h0 zE^EDqGPu0Wa|+X7A=y}G3{dF;opQLM4agDGB44c~-@7+*7G;h1AesaZDJcu&p9mQv zaP;BQB!#-}BC8bv*0>BiG@0(GOQh+2FLK^Zp7xhtAFa>zAQzL(oRH&Vc%e1{h}PUf z4K0Ekj72ftrBV$fxw1M;-VQ+^2R#!PHW;O6k~`iI)fafi)+Q#ZP#YPI7<|$Vco5jO z@aad>qAigYXr$U0>7TINQ@(X-#ErQ&@s?a9BxVfN?$^LH7a_-J zW(oxsHo}mlra(4uCm8R*eK4FBr?x+>t@SS;X9U21sEr83S+z=m=z6 zdu2smpsREwr@@GBuubQEv%n*25K^-i!sDQ^ zSIj_g=NfQ9&!Z%l7LWK!Zwisnmvr#RJ>Y~JhBGiRG{=cI)+O&fax;mcQ9WKHHhjG< zJei!`$D-xC^{v^;~3ow2mBQn_{IB77c%t|#$@})-vz|J7hMe-D^WFCA9ApcA! zBj+GMZbyTg#71JMd3gO=0lN$CH67zw`-q-;X!ATx%HvAI`C}P4rA=tJeegeD{dU~gu@y&%we0THY z{d4#?Qbe``?A%($fNn8RUH02Hp!R`I*bw3~+PbAvX`op=J3G@U7Lm4rf1d7Uq#(=p z6;ev!Pp;NIbh0+r?i*4SoUn>E-W&*jArpgM(qz>kd7Q3%?SM4|4;MI=(JrmcfxBh7 zGq~_;(y9D3Iw}=hIJOQ_&RodMXVAOje}l2bBd@?So|yb6sSWEmnOiNJ!1~MT8U%Pe zt)@s054?8&)0V;y+)!8Dsre~BZ>l4*p}TTDG=|Pncj$m(DevZR2REe$KVgXF)0isx zKrI)a1hSmC-C`zH?y_SiXD?`MT$ai?v#hl3u^Ewd7_oXyIW|In*H;Vu{e@A1_aR{& z!Lc_ae(=1d*UXlqThJ^gPleDYiPYUFd9Gi6e>8gNjbjxpUs9U+KpdzSEq3c(nGUVN z0ETFAs|H(9QM2Xt(;l?RK?ws*$uZlAq#cNTOsCp_<)cT}w%CeR2M~yY&A>n5CmZ{A zRL8E`1Md|RJCtV_%Bb@Ms@=EW&aJnV{#g#EmVy~rr-<#+B27q7lug8cz|XwLv^iOozIYKBHI~(s}Z}9 zP0Uzgd@6F1PmG63vUtasvT@fC^mWE7D3@3a{OzmQJI99rp@pUIwP-f8(r0nLN7i}Z zxG=Ak>w_I_wLKqL(IV4d5o(oki|a=lp$E4opGEG!nr3IcfI2<6Hp5af(TD)5(>t2* zpUGeSA!@ZRmBys)pW!FbOA;6z+y+*L)mAQ-0W1f7)OCwiKz)9d;d^<$7KKGAb|Jix zSKvkaoHH1MGQ;@Mpmv1^rdzR;-2L$=upl;#fEgyP6nuw&-uKbIFDDNlS;{S3z8Y`{ zhiy|JD)q=pzih?+tF-WhqBTa|wu-I)I!xi8qqOq>clIC?;)1b<{7e>@0+>M}S5D6S zaTI1olMnoHR4LNw>?Gi&BG`ln$l^;oUcFG7t0eoc)$C;WQ&Ii`tct);FJwyJ7l#K2 zyIoX0U;)d`&yS2ChFHp?Fzupth&0-9vTMsYNkO7#GPFSv?F}WPo`7;#FQ@>LP$UK; z0CwL9>Loc_;ADc|+)kUMxHP@csz8JyUq>v%^qs@q6285iR+C}s^w_wU{Ou}~C-?qE z>>hlT9l;BFbn5k!L)0j0Q9h&|AYnc_&UHuae15d}-}3EtVT53trgVKiV31I|GIB(V z?bZ2vTf&bqo}~SgF4rTUjz+6LwvJm1c@WCg6R)v+mY+R-Jg0CVc*sF6XXbK&EW9Oo z>C;gO&AO{_jsK2Km{=Q4kp;i~-wScVA93}K-tn}#QNCnfW`}$Bg!j$D+rlv+(TGz; zW2n5!m{MF521Cj(3FQ#Vc%e`-$DSZvi!ug?M^y^OJPlB)2dI1pLs$Yt2OT5L2eQT& zLFobo0T~G4MG}{93A3EwrZiHDxX>(G$RzLlQxuP1zKP@<#~`*J-G~mJmCa@=_Avtg z{ibLgZKj49Rx;{+Th_w43Ci|obFS+}3k+Bi1 z+dv5~FR#CSd3onf+g|&Cw4c|(8q7#|=k|&^?vL0a{2bXlpQ22AF!_slB@T|Brr1Tb zYLe)ek?8lfb`+(Eo6JR*84^7G$UbSeAa0>=6q|5x;h^tL3qG{)`}MX2XOaAXR)@3# z6SV0(<0;qZHye3F6VPBv`@rZDb%Ct5F?i{p5v8DWd=M<;?rXH{&}u;!wo=aWs@5ojePk|CkSom zi4`w-A$j=Gs0>>#%|c>8dt`KoJj`DvkN#rRPoBuc#_Yh39SH85%{{wznf-YE{w}OL z-ALcDeVoQ%{sMh$GF5swgLI}K+Ja@nnLh&+l#tQR0`c?G_16#a62vEMei#;)OkM=& zTcZmH4_=B!y3Wm87HK3rX;yTAC!m9FiTwre|HS?>s=_mKr(_$Y(Dxh)SA<(=9j8h^3s$g2 z9Xdc=F1xQq;WOU*QJYlHf9I=zj@f!1zn&;QDFm`tmKk=nk0xtKLRGC z*tSii%_hA?)T(?gEAvoqWuT!51ptVS@*_%KVG4~*gO5HZu&e+?mI5yl9v~IoVnE5w zD?A9e*f>2IdN2srS<+o4^cIqUWw8od*tM6*Mg0Dc3(X`fQChIUrQGfdPb1sgaFpLOBa{$BI@|`JqP<;ACT7 z6cP_Y2`8vj2DWZ}YEZ3tRxk+l?wV8!p#X$~q2|lJlwnP|N(5-nqI&S}sK_XfFVx7q zd-!Wn>GV0r9)}R3n};!Q4)36iD>-0td+iHYT$Ib>ca2xR3~;n%?loQL9~5I0+BI|U zUesnx?LNQ@2(zAaCr_o(#*^tX?A4^^lYQT@3dzC?dTHa_z0KNP?a#_jTF7_^a~savc+E&EvIo?ip#q7Hj~R_m6>*@2R$7=j zih2H7%pEo@3iYf=)486#IEO(5-5}E%Q<>y0{Qp6t{sj6ZF}cvZw)o(R3PEXbPR~2200j( zQd}CEXqAcN#wVllLywJe`zErR_%!H9Z6a|%48xZCCn&=VlxV>bX(+)%;tDxj!oA=G71U62?I$pNH4 zpTyvh<{zTKjlZk51!NAmDpv2T{)?`%*)^Nlek^Y27!lI>5?`NMoP7q(>Pd?-JgxB$Q(%@Fs+4?-5xT|zww_- z<03OTM$=)L&1VM(MO6EP2LcwY(@v)t3iv5CWjjrS(IP>b z3`SKX&|polEERC09SwvtMYz<+r@vzkFlop};+hd)=#PV%i2d~ZbCHw#HIsnkqn(uV zb>Tv@iTT%lA^EfCBDNRTrRDZ((Q*u2H?Y*D40>F&&H+;sY8e+5K71JpG*-DdOUf!X ziyE{BA+#|z>y{XJ-Ux~(tDXRpEWrA0$TOgJuEHIz#nAbr~4m$e+l;_;Wb4Q0M3z9f!1&GK_NXYd9>Rlv2?m146@Bk>MJixzv zhgMJY`=_~N^uNPRkV~!o$`k1E;shtH!13gNR9s>UOK-Rq2SI$|+A zKiK_3h=Bt=Yx&MeJ1P7{4gsd0VNqYg)q;ww+o0r&G#U)nc2GYG zV1Q=YZ9Izon4XWMjTF~3+gUfqwc-qlybfQZLd;;0rD(|N~M)owi-_^0V!X+;j;OfJhHUU_u)tlL{@VO0aFFAiPB_8cLmKY8s0W+ zJZbu}56bY* zX^=k^U~*4r9E2kMGeqDQT4WXA#`h*mpImMxf1Wq}T@(lvy;2@Fag@|2ZhY0~0?-#j z)>22RR+lQ3EzRbZMq}Qhj&g+0q#)^%bEI5Jrx#<&frXVSs$RZEf&Ii)DE{x%w4{bLdH zqSRl4a*XWZS)*4DJsi>SO1uxet_w@G+#IqEb19ee>iB)8$PGSc0x_l)btFr$txTT& z+h_oCb@w7VBg})IwOkruFQ1g{4|qbc&fXSF8URoNS$hVjQW2x;sFyGcyJ0I0}Qj(d9w9<;&nbi?1$_ru>b*wTF zv25Q_Y*hb-=ktHj$3&aw*AlNp{eNsCx#xdH^+djET1x&b@Xd`IBb^bg&62D0gLr)2HE3STIK>Jjnc(VQfEI zKCG)U`1M$lr4rtv_a`6uhiDvAS_hAmkR1vLf>tqb*x7Uc7)@CzDyCOn>;Yr4$(#Q% zDu)0S`Ut?RiV8*e`z4}myOF+sDf#X{M)i(mj5T5QRWJkS`9j1yeMgyxl+lTRZ4W<3 zI0HQbZU;R1G`V@pKSj0LHE-!}-Ph>fZ8bcvVVV9gTH^LH)PYKBOY&danqyeh0puBr|{lqCf>hD4<2I3Poe!l3}tP zhL@u?gVVi*?TJhCU=#yG+%DCOmHAyC?rPE0n%Y*^)qz)=pE3WO+&;

    40G=x*fh*ss;-HdEb*2$~rO?VEI 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 Date: Mon, 9 Nov 2020 15:22:06 +0100 Subject: [PATCH 147/177] Mark additional locales as broken --- src/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4724bf431..b8ce69f1d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -677,8 +677,11 @@ endif(BUILD_SERVER) # Blacklisted locales that don't work. # see issue #4638 set(GETTEXT_BLACKLISTED_LOCALES + ar he ky + ms_Arab + th ) option(APPLY_LOCALE_BLACKLIST "Use a blacklist to avoid broken locales" TRUE) From fca4db4184ac054c53446c0960ec578ebc6b5857 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Tue, 10 Nov 2020 21:02:53 +0100 Subject: [PATCH 148/177] ObjectRef: Re-add legacy code for set_physics_override (#10585) These arguments are used at least by MTG beds and homedecor_common. A deprecation warning is shown to safely remove it in a future release. --- src/script/lua_api/l_object.cpp | 42 ++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index a6a7c05f9..bc59bd55c 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -1413,20 +1413,34 @@ int ObjectRef::l_set_physics_override(lua_State *L) if (playersao == nullptr) return 0; - luaL_checktype(L, 2, LUA_TTABLE); - playersao->m_physics_override_speed = getfloatfield_default( - L, 2, "speed", playersao->m_physics_override_speed); - playersao->m_physics_override_jump = getfloatfield_default( - L, 2, "jump", playersao->m_physics_override_jump); - playersao->m_physics_override_gravity = getfloatfield_default( - L, 2, "gravity", playersao->m_physics_override_gravity); - playersao->m_physics_override_sneak = getboolfield_default( - L, 2, "sneak", playersao->m_physics_override_sneak); - playersao->m_physics_override_sneak_glitch = getboolfield_default( - L, 2, "sneak_glitch", playersao->m_physics_override_sneak_glitch); - playersao->m_physics_override_new_move = getboolfield_default( - L, 2, "new_move", playersao->m_physics_override_new_move); - playersao->m_physics_override_sent = false; + if (lua_istable(L, 2)) { + bool modified = false; + modified |= getfloatfield(L, 2, "speed", playersao->m_physics_override_speed); + modified |= getfloatfield(L, 2, "jump", playersao->m_physics_override_jump); + modified |= getfloatfield(L, 2, "gravity", playersao->m_physics_override_gravity); + modified |= getboolfield(L, 2, "sneak", playersao->m_physics_override_sneak); + modified |= getboolfield(L, 2, "sneak_glitch", playersao->m_physics_override_sneak_glitch); + modified |= getboolfield(L, 2, "new_move", playersao->m_physics_override_new_move); + if (modified) + playersao->m_physics_override_sent = false; + } else { + // old, non-table format + // TODO: Remove this code after version 5.4.0 + log_deprecated(L, "Deprecated use of set_physics_override(num, num, num)"); + + if (!lua_isnil(L, 2)) { + playersao->m_physics_override_speed = lua_tonumber(L, 2); + playersao->m_physics_override_sent = false; + } + if (!lua_isnil(L, 3)) { + playersao->m_physics_override_jump = lua_tonumber(L, 3); + playersao->m_physics_override_sent = false; + } + if (!lua_isnil(L, 4)) { + playersao->m_physics_override_gravity = lua_tonumber(L, 4); + playersao->m_physics_override_sent = false; + } + } return 0; } From be3fe161fc831c9e6da1357dc908ed4a7681c46c Mon Sep 17 00:00:00 2001 From: DS Date: Tue, 10 Nov 2020 21:03:10 +0100 Subject: [PATCH 149/177] Do not set a default for description in itemdef table (#10559) * Do not set a default for description in itemdef table * improve documentation --- builtin/game/register.lua | 4 +--- doc/lua_api.txt | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/builtin/game/register.lua b/builtin/game/register.lua index f00b76494..1f94a9dca 100644 --- a/builtin/game/register.lua +++ b/builtin/game/register.lua @@ -118,11 +118,9 @@ function core.register_item(name, itemdef) end itemdef.name = name - -- default description to item name - itemdef.description = itemdef.description or name -- default short_description to first line of description itemdef.short_description = itemdef.short_description or - itemdef.description:gsub("\n.*","") + (itemdef.description or ""):gsub("\n.*","") -- Apply defaults and add to registered_* table if itemdef.type == "node" then diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 985af2f6e..ef283f0c1 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2023,10 +2023,10 @@ Item metadata only contains a key-value store. Some of the values in the key-value store are handled specially: -* `description`: Set the item stack's description. Defaults to - `idef.description`. -* `short_description`: Set the item stack's short description. Defaults - to `idef.short_description`. +* `description`: Set the item stack's description. + See also: `get_description` in [`ItemStack`] +* `short_description`: Set the item stack's short description. + See also: `get_short_description` in [`ItemStack`] * `color`: A `ColorString`, which sets the stack's color. * `palette_index`: If the item has a palette, this is used to get the current color from the palette. @@ -5983,8 +5983,18 @@ an itemstring, a table or `nil`. stack). * `set_metadata(metadata)`: (DEPRECATED) Returns true. * `get_description()`: returns the description shown in inventory list tooltips. + * The engine uses the same as this function for item descriptions. + * Fields for finding the description, in order: + * `description` in item metadata (See [Item Metadata].) + * `description` in item definition + * item name * `get_short_description()`: returns the short description. * Unlike the description, this does not include new lines. + * The engine uses the same as this function for short item descriptions. + * Fields for finding the short description, in order: + * `short_description` in item metadata (See [Item Metadata].) + * `short_description` in item definition + * first line of the description (See `get_description()`.) * `clear()`: removes all items from the stack, making it empty. * `replace(item)`: replace the contents of this stack. * `item` can also be an itemstring or table. @@ -7085,11 +7095,12 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and { description = "Steel Axe", -- Can contain new lines. "\n" has to be used as new line character. - -- Defaults to the item's name. + -- See also: `get_description` in [`ItemStack`] short_description = "Steel Axe", -- Must not contain new lines. -- Defaults to the first line of description. + -- See also: `get_short_description` in [`ItemStack`] groups = {}, -- key = name, value = rating; rating = 1..3. From be8d1d2d99ad835b5de7277b7b518c334113e795 Mon Sep 17 00:00:00 2001 From: Lars Date: Sun, 8 Nov 2020 12:30:38 -0800 Subject: [PATCH 150/177] Increase default emerge queue limits and limit enqueue requests for active blocks. --- builtin/settingtypes.txt | 6 +++--- src/defaultsettings.cpp | 6 +++--- src/emerge.cpp | 4 ++++ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 8eb667bdd..c4dc82dfe 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -2152,15 +2152,15 @@ chunksize (Chunk size) int 5 enable_mapgen_debug_info (Mapgen debug) bool false # Maximum number of blocks that can be queued for loading. -emergequeue_limit_total (Absolute limit of queued blocks to emerge) int 512 +emergequeue_limit_total (Absolute limit of queued blocks to emerge) int 1024 # Maximum number of blocks to be queued that are to be loaded from file. # This limit is enforced per player. -emergequeue_limit_diskonly (Per-player limit of queued blocks load from disk) int 64 +emergequeue_limit_diskonly (Per-player limit of queued blocks load from disk) int 128 # Maximum number of blocks to be queued that are to be generated. # This limit is enforced per player. -emergequeue_limit_generate (Per-player limit of queued blocks to generate) int 64 +emergequeue_limit_generate (Per-player limit of queued blocks to generate) int 128 # Number of emerge threads to use. # Value 0: diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index dc0276733..177955589 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -396,9 +396,9 @@ void set_default_settings(Settings *settings) settings->setDefault("debug_log_level", "action"); settings->setDefault("debug_log_size_max", "50"); settings->setDefault("chat_log_level", "error"); - settings->setDefault("emergequeue_limit_total", "512"); - settings->setDefault("emergequeue_limit_diskonly", "64"); - settings->setDefault("emergequeue_limit_generate", "64"); + settings->setDefault("emergequeue_limit_total", "1024"); + settings->setDefault("emergequeue_limit_diskonly", "128"); + settings->setDefault("emergequeue_limit_generate", "128"); settings->setDefault("num_emerge_threads", "1"); settings->setDefault("secure.enable_security", "true"); settings->setDefault("secure.trusted_mods", ""); diff --git a/src/emerge.cpp b/src/emerge.cpp index 0ac26a682..12e407797 100644 --- a/src/emerge.cpp +++ b/src/emerge.cpp @@ -426,6 +426,10 @@ bool EmergeManager::pushBlockEmergeData( m_qlimit_generate : m_qlimit_diskonly; if (count_peer >= qlimit_peer) return false; + } else { + // limit block enqueue requests for active blocks to 1/2 of total + if (count_peer * 2 >= m_qlimit_total) + return false; } } From adffef2b94f2d9cb3104cbc75e315cda3c0728aa Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Thu, 12 Nov 2020 19:15:41 +0100 Subject: [PATCH 151/177] PlayerSAO: Run on_player_hpchange raw change values (#10478) The callback is only run when a change in HP is to be expected. Following cases will not trigger the callback: * Dead player damaged further * Healing full-health player * Change of 0 HP --- src/server/player_sao.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/server/player_sao.cpp b/src/server/player_sao.cpp index 9fb53380c..62515d1c9 100644 --- a/src/server/player_sao.cpp +++ b/src/server/player_sao.cpp @@ -458,20 +458,25 @@ u16 PlayerSAO::punch(v3f dir, void PlayerSAO::setHP(s32 hp, const PlayerHPChangeReason &reason) { - s32 oldhp = m_hp; + if (hp == (s32)m_hp) + return; // Nothing to do - hp = rangelim(hp, 0, m_prop.hp_max); + if (m_hp <= 0 && hp < (s32)m_hp) + return; // Cannot take more damage - if (oldhp != hp) { - s32 hp_change = m_env->getScriptIface()->on_player_hpchange(this, hp - oldhp, reason); + { + s32 hp_change = m_env->getScriptIface()->on_player_hpchange(this, hp - m_hp, reason); if (hp_change == 0) return; - hp = rangelim(oldhp + hp_change, 0, m_prop.hp_max); + hp = m_hp + hp_change; } + s32 oldhp = m_hp; + hp = rangelim(hp, 0, m_prop.hp_max); + if (hp < oldhp && isImmortal()) - return; + return; // Do not allow immortal players to be damaged m_hp = hp; From 68139a28eb8b43b3685b81c77258912ffc5e0b8f Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Thu, 12 Nov 2020 19:16:02 +0100 Subject: [PATCH 152/177] Revert "Replace MyEventReceiver KeyList with std::unordered_set" (#10622) This reverts commit 787561b29afdbc78769f68c2f5c4f2cff1b32340. --- src/client/inputhandler.cpp | 48 ++++++++-------- src/client/inputhandler.h | 108 +++++++++++++++++++++++++++++------- src/client/keycode.h | 19 ------- 3 files changed, 111 insertions(+), 64 deletions(-) diff --git a/src/client/inputhandler.cpp b/src/client/inputhandler.cpp index ee3e37ae9..608a405a8 100644 --- a/src/client/inputhandler.cpp +++ b/src/client/inputhandler.cpp @@ -112,7 +112,7 @@ bool MyEventReceiver::OnEvent(const SEvent &event) // Remember whether each key is down or up if (event.EventType == irr::EET_KEY_INPUT_EVENT) { const KeyPress &keyCode = event.KeyInput; - if (keysListenedFor.count(keyCode)) { + if (keysListenedFor[keyCode]) { // If the key is being held down then the OS may // send a continuous stream of keydown events. // In this case, we don't want to let this @@ -120,15 +120,15 @@ bool MyEventReceiver::OnEvent(const SEvent &event) // certain actions to repeat constantly. if (event.KeyInput.PressedDown) { if (!IsKeyDown(keyCode)) { - keyWasDown.insert(keyCode); - keyWasPressed.insert(keyCode); + keyWasDown.set(keyCode); + keyWasPressed.set(keyCode); } - keyIsDown.insert(keyCode); + keyIsDown.set(keyCode); } else { if (IsKeyDown(keyCode)) - keyWasReleased.insert(keyCode); + keyWasReleased.set(keyCode); - keyIsDown.erase(keyCode); + keyIsDown.unset(keyCode); } return true; @@ -153,36 +153,36 @@ bool MyEventReceiver::OnEvent(const SEvent &event) switch (event.MouseInput.Event) { case EMIE_LMOUSE_PRESSED_DOWN: key = "KEY_LBUTTON"; - keyIsDown.insert(key); - keyWasDown.insert(key); - keyWasPressed.insert(key); + keyIsDown.set(key); + keyWasDown.set(key); + keyWasPressed.set(key); break; case EMIE_MMOUSE_PRESSED_DOWN: key = "KEY_MBUTTON"; - keyIsDown.insert(key); - keyWasDown.insert(key); - keyWasPressed.insert(key); + keyIsDown.set(key); + keyWasDown.set(key); + keyWasPressed.set(key); break; case EMIE_RMOUSE_PRESSED_DOWN: key = "KEY_RBUTTON"; - keyIsDown.insert(key); - keyWasDown.insert(key); - keyWasPressed.insert(key); + keyIsDown.set(key); + keyWasDown.set(key); + keyWasPressed.set(key); break; case EMIE_LMOUSE_LEFT_UP: key = "KEY_LBUTTON"; - keyIsDown.erase(key); - keyWasReleased.insert(key); + keyIsDown.unset(key); + keyWasReleased.set(key); break; case EMIE_MMOUSE_LEFT_UP: key = "KEY_MBUTTON"; - keyIsDown.erase(key); - keyWasReleased.insert(key); + keyIsDown.unset(key); + keyWasReleased.set(key); break; case EMIE_RMOUSE_LEFT_UP: key = "KEY_RBUTTON"; - keyIsDown.erase(key); - keyWasReleased.insert(key); + keyIsDown.unset(key); + keyWasReleased.set(key); break; case EMIE_MOUSE_WHEEL: mouse_wheel += event.MouseInput.Wheel; @@ -235,11 +235,7 @@ void RandomInputHandler::step(float dtime) i.counter -= dtime; if (i.counter < 0.0) { i.counter = 0.1 * Rand(1, i.time_max); - KeyPress k = getKeySetting(i.key.c_str()); - if (keydown.count(k)) - keydown.erase(k); - else - keydown.insert(k); + keydown.toggle(getKeySetting(i.key.c_str())); } } { diff --git a/src/client/inputhandler.h b/src/client/inputhandler.h index 885f34e05..def147a82 100644 --- a/src/client/inputhandler.h +++ b/src/client/inputhandler.h @@ -21,9 +21,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "irrlichttypes_extrabloated.h" #include "joystick_controller.h" +#include #include "keycode.h" #include "renderingengine.h" -#include #ifdef HAVE_TOUCHSCREENGUI #include "gui/touchscreengui.h" @@ -61,32 +61,98 @@ struct KeyCache InputHandler *handler; }; +class KeyList : private std::list +{ + typedef std::list super; + typedef super::iterator iterator; + typedef super::const_iterator const_iterator; + + virtual const_iterator find(const KeyPress &key) const + { + const_iterator f(begin()); + const_iterator e(end()); + + while (f != e) { + if (*f == key) + return f; + + ++f; + } + + return e; + } + + virtual iterator find(const KeyPress &key) + { + iterator f(begin()); + iterator e(end()); + + while (f != e) { + if (*f == key) + return f; + + ++f; + } + + return e; + } + +public: + void clear() { super::clear(); } + + void set(const KeyPress &key) + { + if (find(key) == end()) + push_back(key); + } + + void unset(const KeyPress &key) + { + iterator p(find(key)); + + if (p != end()) + erase(p); + } + + void toggle(const KeyPress &key) + { + iterator p(this->find(key)); + + if (p != end()) + erase(p); + else + push_back(key); + } + + bool operator[](const KeyPress &key) const { return find(key) != end(); } +}; + class MyEventReceiver : public IEventReceiver { public: // This is the one method that we have to implement virtual bool OnEvent(const SEvent &event); - bool IsKeyDown(const KeyPress &keyCode) const { return keyIsDown.count(keyCode); } + bool IsKeyDown(const KeyPress &keyCode) const { return keyIsDown[keyCode]; } // Checks whether a key was down and resets the state bool WasKeyDown(const KeyPress &keyCode) { - bool b = keyWasDown.count(keyCode); + bool b = keyWasDown[keyCode]; if (b) - keyWasDown.erase(keyCode); + keyWasDown.unset(keyCode); return b; } // Checks whether a key was just pressed. State will be cleared // in the subsequent iteration of Game::processPlayerInteraction - bool WasKeyPressed(const KeyPress &keycode) const { return keyWasPressed.count(keycode); } + bool WasKeyPressed(const KeyPress &keycode) const { return keyWasPressed[keycode]; } // Checks whether a key was just released. State will be cleared // in the subsequent iteration of Game::processPlayerInteraction - bool WasKeyReleased(const KeyPress &keycode) const { return keyWasReleased.count(keycode); } + bool WasKeyReleased(const KeyPress &keycode) const { return keyWasReleased[keycode]; } - void listenForKey(const KeyPress &keyCode) { keysListenedFor.insert(keyCode); } + void listenForKey(const KeyPress &keyCode) { keysListenedFor.set(keyCode); } void dontListenForKeys() { keysListenedFor.clear(); } s32 getMouseWheel() @@ -132,20 +198,24 @@ public: #endif private: - //! The current state of keys - std::unordered_set keyIsDown; + // The current state of keys + KeyList keyIsDown; - //! Whether a key was down - std::unordered_set keyWasDown; + // Whether a key was down + KeyList keyWasDown; - //! Whether a key has just been pressed - std::unordered_set keyWasPressed; + // Whether a key has just been pressed + KeyList keyWasPressed; - //! Whether a key has just been released - std::unordered_set keyWasReleased; + // Whether a key has just been released + KeyList keyWasReleased; - //! List of keys we listen for - std::unordered_set keysListenedFor; + // List of keys we listen for + // TODO perhaps the type of this is not really + // performant as KeyList is designed for few but + // often changing keys, and keysListenedFor is expected + // to change seldomly but contain lots of keys. + KeyList keysListenedFor; }; class InputHandler @@ -277,7 +347,7 @@ public: return true; } - virtual bool isKeyDown(GameKeyType k) { return keydown.count(keycache.key[k]); } + virtual bool isKeyDown(GameKeyType k) { return keydown[keycache.key[k]]; } virtual bool wasKeyDown(GameKeyType k) { return false; } virtual bool wasKeyPressed(GameKeyType k) { return false; } virtual bool wasKeyReleased(GameKeyType k) { return false; } @@ -292,7 +362,7 @@ public: s32 Rand(s32 min, s32 max); private: - std::unordered_set keydown; + KeyList keydown; v2s32 mousepos; v2s32 mousespeed; }; diff --git a/src/client/keycode.h b/src/client/keycode.h index 263b722c7..7036705d1 100644 --- a/src/client/keycode.h +++ b/src/client/keycode.h @@ -24,20 +24,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include -class KeyPress; -namespace std -{ - template <> struct hash; -} - /* A key press, consisting of either an Irrlicht keycode or an actual char */ class KeyPress { public: - friend struct std::hash; - KeyPress() = default; KeyPress(const char *name); @@ -63,17 +55,6 @@ protected: std::string m_name = ""; }; -namespace std -{ - template <> struct hash - { - size_t operator()(const KeyPress &key) const - { - return key.Key; - } - }; -} - extern const KeyPress EscapeKey; extern const KeyPress CancelKey; From 8eb2cbac613c92c1a7656ecb542e63fed9023061 Mon Sep 17 00:00:00 2001 From: red-001 Date: Thu, 12 Nov 2020 20:05:47 +0000 Subject: [PATCH 153/177] Fix warnings about an unused variables and implicit conversion (#10586) --- src/gui/guiScrollBar.cpp | 2 +- src/gui/guiScrollBar.h | 1 - src/mapgen/mg_ore.cpp | 6 +++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/gui/guiScrollBar.cpp b/src/gui/guiScrollBar.cpp index b04ccb9d5..c6a03f3e4 100644 --- a/src/gui/guiScrollBar.cpp +++ b/src/gui/guiScrollBar.cpp @@ -21,7 +21,7 @@ GUIScrollBar::GUIScrollBar(IGUIEnvironment *environment, IGUIElement *parent, s3 is_horizontal(horizontal), is_auto_scaling(auto_scale), dragged_by_slider(false), tray_clicked(false), scroll_pos(0), draw_center(0), thumb_size(0), min_pos(0), max_pos(100), small_step(10), - large_step(50), last_change(0), drag_offset(0), page_size(100), border_size(0) + large_step(50), drag_offset(0), page_size(100), border_size(0) { refreshControls(); setNotClipped(false); diff --git a/src/gui/guiScrollBar.h b/src/gui/guiScrollBar.h index 29493bb99..d18f8e875 100644 --- a/src/gui/guiScrollBar.h +++ b/src/gui/guiScrollBar.h @@ -68,7 +68,6 @@ private: s32 max_pos; s32 small_step; s32 large_step; - u32 last_change; s32 drag_offset; s32 page_size; s32 border_size; diff --git a/src/mapgen/mg_ore.cpp b/src/mapgen/mg_ore.cpp index b50ed6a32..5814f433a 100644 --- a/src/mapgen/mg_ore.cpp +++ b/src/mapgen/mg_ore.cpp @@ -498,7 +498,11 @@ void OreVein::generate(MMVManip *vm, int mapseed, u32 blockseed, } // randval ranges from -1..1 - float randval = (float)pr.next() / (pr.RANDOM_RANGE / 2) - 1.f; + /* + Note: can generate values slightly larger than 1 + but this can't be changed as mapgen must be deterministic accross versions. + */ + float randval = (float)pr.next() / float(pr.RANDOM_RANGE / 2) - 1.f; float noiseval = contour(noise->result[index]); float noiseval2 = contour(noise2->result[index]); if (noiseval * noiseval2 + randval * random_factor < nthresh) From c441baa91b71c48a369178df287eeb91e15ea7d1 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Tue, 10 Nov 2020 21:22:02 +0100 Subject: [PATCH 154/177] Fix overloaded virtual warnings with get/setAttachment() --- src/client/content_cao.cpp | 47 +++++++++++++++++++------------------- src/client/content_cao.h | 12 ++++------ 2 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index 7c349244f..c52bc62c5 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -460,18 +460,20 @@ void GenericCAO::setChildrenVisible(bool toset) GenericCAO *obj = m_env->getGenericCAO(cao_id); if (obj) { // Check if the entity is forced to appear in first person. - obj->setVisible(obj->isForcedVisible() ? true : toset); + obj->setVisible(obj->m_force_visible ? true : toset); } } } -void GenericCAO::setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation) +void GenericCAO::setAttachment(int parent_id, const std::string &bone, + v3f position, v3f rotation, bool force_visible) { int old_parent = m_attachment_parent_id; m_attachment_parent_id = parent_id; m_attachment_bone = bone; m_attachment_position = position; m_attachment_rotation = rotation; + m_force_visible = force_visible; ClientActiveObject *parent = m_env->getActiveObject(parent_id); @@ -482,15 +484,30 @@ void GenericCAO::setAttachment(int parent_id, const std::string &bone, v3f posit parent->addAttachmentChild(m_id); } updateAttachments(); + + // Forcibly show attachments if required by set_attach + if (m_force_visible) { + m_is_visible = true; + } else if (!m_is_local_player) { + // Objects attached to the local player should be hidden in first person + m_is_visible = !m_attached_to_local || + m_client->getCamera()->getCameraMode() != CAMERA_MODE_FIRST; + m_force_visible = false; + } else { + // Local players need to have this set, + // otherwise first person attachments fail. + m_is_visible = true; + } } void GenericCAO::getAttachment(int *parent_id, std::string *bone, v3f *position, - v3f *rotation) const + v3f *rotation, bool *force_visible) const { *parent_id = m_attachment_parent_id; *bone = m_attachment_bone; *position = m_attachment_position; *rotation = m_attachment_rotation; + *force_visible = m_force_visible; } void GenericCAO::clearChildAttachments() @@ -509,9 +526,9 @@ void GenericCAO::clearChildAttachments() void GenericCAO::clearParentAttachment() { if (m_attachment_parent_id) - setAttachment(0, "", m_attachment_position, m_attachment_rotation); + setAttachment(0, "", m_attachment_position, m_attachment_rotation, false); else - setAttachment(0, "", v3f(), v3f()); + setAttachment(0, "", v3f(), v3f(), false); } void GenericCAO::addAttachmentChild(int child_id) @@ -1781,25 +1798,9 @@ void GenericCAO::processMessage(const std::string &data) std::string bone = deSerializeString16(is); v3f position = readV3F32(is); v3f rotation = readV3F32(is); - m_force_visible = readU8(is); // Returns false for EOF + bool force_visible = readU8(is); // Returns false for EOF - setAttachment(parent_id, bone, position, rotation); - - // Forcibly show attachments if required by set_attach - if (m_force_visible) - m_is_visible = true; - // localplayer itself can't be attached to localplayer - else if (!m_is_local_player) { - // Objects attached to the local player should be hidden in first - // person provided the forced boolean isn't set. - m_is_visible = !m_attached_to_local || - m_client->getCamera()->getCameraMode() != CAMERA_MODE_FIRST; - m_force_visible = false; - } else { - // Local players need to have this set, - // otherwise first person attachments fail. - m_is_visible = true; - } + setAttachment(parent_id, bone, position, rotation, force_visible); } else if (cmd == AO_CMD_PUNCHED) { u16 result_hp = readU16(is); diff --git a/src/client/content_cao.h b/src/client/content_cao.h index 435fc2931..7c134fb48 100644 --- a/src/client/content_cao.h +++ b/src/client/content_cao.h @@ -111,6 +111,7 @@ private: v3f m_attachment_position; v3f m_attachment_rotation; bool m_attached_to_local = false; + bool m_force_visible = false; int m_anim_frame = 0; int m_anim_num_frames = 1; @@ -126,7 +127,6 @@ private: float m_step_distance_counter = 0.0f; u8 m_last_light = 255; bool m_is_visible = false; - bool m_force_visible = false; s8 m_glow = 0; // Material video::E_MATERIAL_TYPE m_material_type; @@ -218,15 +218,11 @@ public: m_is_visible = toset; } - inline bool isForcedVisible() const - { - return m_force_visible; - } - void setChildrenVisible(bool toset); - void setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation); + void setAttachment(int parent_id, const std::string &bone, v3f position, + v3f rotation, bool force_visible); void getAttachment(int *parent_id, std::string *bone, v3f *position, - v3f *rotation) const; + v3f *rotation, bool *force_visible) const; void clearChildAttachments(); void clearParentAttachment(); void addAttachmentChild(int child_id); From b504a1aa4bdc56676b4b1c398ebfe98d336f8f6e Mon Sep 17 00:00:00 2001 From: sfan5 Date: Tue, 10 Nov 2020 21:36:58 +0100 Subject: [PATCH 155/177] Fix player sprite visibility in first person closes #10525 --- src/client/content_cao.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index c52bc62c5..c645900aa 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -1919,13 +1919,23 @@ void GenericCAO::updateMeshCulling() if (!m_is_local_player) return; - // Grab the active player scene node so we know there's - // at least a mesh to occlude from the camera. + const bool hidden = m_client->getCamera()->getCameraMode() == CAMERA_MODE_FIRST; + + if (m_meshnode && m_prop.visual == "upright_sprite") { + u32 buffers = m_meshnode->getMesh()->getMeshBufferCount(); + for (u32 i = 0; i < buffers; i++) { + video::SMaterial &mat = m_meshnode->getMesh()->getMeshBuffer(i)->getMaterial(); + // upright sprite has no backface culling + mat.setFlag(video::EMF_FRONT_FACE_CULLING, hidden); + } + return; + } + irr::scene::ISceneNode *node = getSceneNode(); if (!node) return; - if (m_client->getCamera()->getCameraMode() == CAMERA_MODE_FIRST) { + if (hidden) { // Hide the mesh by culling both front and // back faces. Serious hackyness but it works for our // purposes. This also preserves the skeletal armature. From 61bbdd6807f4c383b7300b4fd5931f5e09dc7205 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Tue, 10 Nov 2020 21:43:06 +0100 Subject: [PATCH 156/177] Copy position for can_dig fixes #10514 --- builtin/game/item.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/builtin/game/item.lua b/builtin/game/item.lua index f680ce0d4..109712b42 100644 --- a/builtin/game/item.lua +++ b/builtin/game/item.lua @@ -551,8 +551,9 @@ function core.node_dig(pos, node, digger) local diggername = user_name(digger) local log = make_log(diggername) local def = core.registered_nodes[node.name] + -- Copy pos because the callback could modify it if def and (not def.diggable or - (def.can_dig and not def.can_dig(pos, digger))) then + (def.can_dig and not def.can_dig(vector.new(pos), digger))) then log("info", diggername .. " tried to dig " .. node.name .. " which is not diggable " .. core.pos_to_string(pos)) From ad58ece18062d4c545432b45d71ce6dbe841746b Mon Sep 17 00:00:00 2001 From: sfan5 Date: Tue, 10 Nov 2020 21:46:30 +0100 Subject: [PATCH 157/177] serverpackethandler: Minor log message fixes closes #10434 --- src/network/serverpackethandler.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp index 95e7c548e..3db4eb286 100644 --- a/src/network/serverpackethandler.cpp +++ b/src/network/serverpackethandler.cpp @@ -1657,19 +1657,18 @@ void Server::handleCommand_SrpBytesM(NetworkPacket* pkt) bool wantSudo = (cstate == CS_Active); - verbosestream << "Server: Received TOCLIENT_SRP_BYTES_M." << std::endl; + verbosestream << "Server: Received TOSERVER_SRP_BYTES_M." << std::endl; if (!((cstate == CS_HelloSent) || (cstate == CS_Active))) { - actionstream << "Server: got SRP _M packet in wrong state " - << cstate << " from " << addr_s - << ". Ignoring." << std::endl; + warningstream << "Server: got SRP_M packet in wrong state " + << cstate << " from " << addr_s << ". Ignoring." << std::endl; return; } if (client->chosen_mech != AUTH_MECHANISM_SRP && client->chosen_mech != AUTH_MECHANISM_LEGACY_PASSWORD) { - actionstream << "Server: got SRP _M packet, while auth" - << "is going on with mech " << client->chosen_mech << " from " + warningstream << "Server: got SRP_M packet, while auth " + "is going on with mech " << client->chosen_mech << " from " << addr_s << " (wantSudo=" << wantSudo << "). Denying." << std::endl; if (wantSudo) { DenySudoAccess(peer_id); @@ -1717,7 +1716,7 @@ void Server::handleCommand_SrpBytesM(NetworkPacket* pkt) std::string checkpwd; // not used, but needed for passing something if (!m_script->getAuth(playername, &checkpwd, NULL)) { - actionstream << "Server: " << playername << + errorstream << "Server: " << playername << " cannot be authenticated (auth handler does not work?)" << std::endl; DenyAccess(peer_id, SERVER_ACCESSDENIED_SERVER_FAIL); From ee1853e9bc740a521270e2e113bb4215246382c4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 15 Nov 2020 17:37:09 +0100 Subject: [PATCH 158/177] Fix falling image of torchlike if paramtype2="none" (#10612) --- builtin/game/falling.lua | 9 ++++++++- games/devtest/mods/testnodes/drawtypes.lua | 21 ++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/builtin/game/falling.lua b/builtin/game/falling.lua index 4bfcca9e7..8d044beaa 100644 --- a/builtin/game/falling.lua +++ b/builtin/game/falling.lua @@ -84,6 +84,9 @@ core.register_entity(":__builtin:falling_node", { local textures if def.tiles and def.tiles[1] then local tile = def.tiles[1] + if def.drawtype == "torchlike" and def.paramtype2 ~= "wallmounted" then + tile = def.tiles[2] or def.tiles[1] + end if type(tile) == "table" then tile = tile.name end @@ -144,7 +147,11 @@ core.register_entity(":__builtin:falling_node", { -- Rotate entity if def.drawtype == "torchlike" then - self.object:set_yaw(math.pi*0.25) + if def.paramtype2 == "wallmounted" then + self.object:set_yaw(math.pi*0.25) + else + self.object:set_yaw(-math.pi*0.25) + end elseif (node.param2 ~= 0 and (def.wield_image == "" or def.wield_image == nil)) or def.drawtype == "signlike" diff --git a/games/devtest/mods/testnodes/drawtypes.lua b/games/devtest/mods/testnodes/drawtypes.lua index 82d862819..b3ab2b322 100644 --- a/games/devtest/mods/testnodes/drawtypes.lua +++ b/games/devtest/mods/testnodes/drawtypes.lua @@ -145,6 +145,23 @@ minetest.register_node("testnodes:fencelike", { }) minetest.register_node("testnodes:torchlike", { + description = S("Torchlike Drawtype Test Node"), + drawtype = "torchlike", + paramtype = "light", + tiles = { + "testnodes_torchlike_floor.png", + "testnodes_torchlike_ceiling.png", + "testnodes_torchlike_wall.png", + }, + + + walkable = false, + sunlight_propagates = true, + groups = { dig_immediate = 3 }, + inventory_image = fallback_image("testnodes_torchlike_floor.png"), +}) + +minetest.register_node("testnodes:torchlike_wallmounted", { description = S("Wallmounted Torchlike Drawtype Test Node"), drawtype = "torchlike", paramtype = "light", @@ -162,6 +179,8 @@ minetest.register_node("testnodes:torchlike", { inventory_image = fallback_image("testnodes_torchlike_floor.png"), }) + + minetest.register_node("testnodes:signlike", { description = S("Wallmounted Signlike Drawtype Test Node"), drawtype = "signlike", @@ -526,7 +545,7 @@ scale("allfaces_optional_waving", scale("plantlike", S("Double-sized Plantlike Drawtype Test Node"), S("Half-sized Plantlike Drawtype Test Node")) -scale("torchlike", +scale("torchlike_wallmounted", S("Double-sized Wallmounted Torchlike Drawtype Test Node"), S("Half-sized Wallmounted Torchlike Drawtype Test Node")) scale("signlike", From a16e412c9de26beea427cb1f15e42db61c106b68 Mon Sep 17 00:00:00 2001 From: Lejo Date: Sun, 15 Nov 2020 17:38:04 +0100 Subject: [PATCH 159/177] Auto build client appimage (#10561) * Replace ubuntu:14.04 with ubuntu 18:04 * Auto build client appimage Co-authored-by: sfan5 --- .gitlab-ci.yml | 82 ++++++++++++++++++++++++++++----------------- AppImageBuilder.yml | 51 ++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 31 deletions(-) create mode 100644 AppImageBuilder.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d03b7b601..c3e120375 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -36,7 +36,7 @@ variables: - cp misc/debpkg-control build/deb/minetest/DEBIAN/control - cp -Rp artifact/minetest/usr build/deb/minetest/ script: - - git clone $MINETEST_GAME_REPO build/deb/minetest/usr/share/minetest/games/minetest + - git clone $MINETEST_GAME_REPO build/deb/minetest/usr/share/minetest/games/minetest_game - rm -Rf build/deb/minetest/usr/share/minetest/games/minetest/.git - sed -i 's/DATEPLACEHOLDER/'$(date +%y.%m.%d)'/g' build/deb/minetest/DEBIAN/control - sed -i 's/LEVELDB_PLACEHOLDER/'$LEVELDB_PKG'/g' build/deb/minetest/DEBIAN/control @@ -142,36 +142,6 @@ deploy:debian-10: ## Ubuntu ## -# Trusty - -build:ubuntu-14.04: - extends: .build_template - image: ubuntu:trusty - before_script: - - echo "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu trusty main" > /etc/apt/sources.list.d/uptodate-toolchain.list - - apt-key adv --keyserver keyserver.ubuntu.com --recv BA9EF27F - - apt-get update -y - - apt-get -y install build-essential gcc-6 g++-6 libirrlicht-dev cmake libbz2-dev libpng-dev libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev libogg-dev libvorbis-dev libopenal-dev libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev libjsoncpp-dev - variables: - CC: gcc-6 - CXX: g++-6 - -package:ubuntu-14.04: - extends: .debpkg_template - image: ubuntu:trusty - dependencies: - - build:ubuntu-14.04 - variables: - LEVELDB_PKG: libleveldb1 - -deploy:ubuntu-14.04: - extends: .debpkg_install - image: ubuntu:trusty - dependencies: - - package:ubuntu-14.04 - variables: - LEVELDB_PKG: libleveldb1 - # Xenial build:ubuntu-16.04: @@ -197,6 +167,31 @@ deploy:ubuntu-16.04: variables: LEVELDB_PKG: libleveldb1v5 +# Bionic + +build:ubuntu-18.04: + extends: .build_template + image: ubuntu:bionic + before_script: + - apt-get update -y + - apt-get -y install build-essential libirrlicht-dev cmake libbz2-dev libpng-dev libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev libogg-dev libvorbis-dev libopenal-dev libcurl4-gnutls-dev libfreetype6-dev zlib1g-dev libgmp-dev libjsoncpp-dev + +package:ubuntu-18.04: + extends: .debpkg_template + image: ubuntu:bionic + dependencies: + - build:ubuntu-18.04 + variables: + LEVELDB_PKG: libleveldb1v5 + +deploy:ubuntu-18.04: + extends: .debpkg_install + image: ubuntu:bionic + dependencies: + - package:ubuntu-18.04 + variables: + LEVELDB_PKG: libleveldb1v5 + ## ## Fedora ## @@ -308,3 +303,28 @@ pages: only: - master +package:appimage-client: + stage: package + image: appimagecrafters/appimage-builder + dependencies: + - build:ubuntu-18.04 + before_script: + - apt-get update -y + - apt-get install -y git wget + # Collect files + - mkdir AppDir + - cp -a artifact/minetest/usr/ AppDir/usr/ + - rm AppDir/usr/bin/minetestserver + - cp -R clientmods AppDir/usr/share/minetest + script: + - git clone $MINETEST_GAME_REPO AppDir/usr/share/minetest/games/minetest_game + - rm -Rf AppDir/usr/share/minetest/games/minetest/.git + - export VERSION=$CI_COMMIT_REF_NAME-$CI_COMMIT_SHORT_SHA + # Remove PrefersNonDefaultGPU property due to validation errors + - sed -i '/PrefersNonDefaultGPU/d' AppDir/usr/share/applications/net.minetest.minetest.desktop + - appimage-builder --skip-test + artifacts: + when: on_success + expire_in: 90 day + paths: + - ./*.AppImage diff --git a/AppImageBuilder.yml b/AppImageBuilder.yml new file mode 100644 index 000000000..9ecad5d8e --- /dev/null +++ b/AppImageBuilder.yml @@ -0,0 +1,51 @@ +version: 1 + +AppDir: + path: ./AppDir + + app_info: + id: minetest + name: Minetest + icon: minetest + version: !ENV ${VERSION} + exec: usr/bin/minetest + exec_args: $@ + runtime: + env: + APPDIR_LIBRARY_PATH: $APPDIR/usr/lib/x86_64-linux-gnu + + apt: + arch: amd64 + sources: + - sourceline: deb http://archive.ubuntu.com/ubuntu/ bionic main universe + key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3b4fe6acc0b21f32' + - sourceline: deb http://archive.ubuntu.com/ubuntu/ bionic-updates main universe + - sourceline: deb http://archive.ubuntu.com/ubuntu/ bionic-backports main universe + - sourceline: deb http://archive.ubuntu.com/ubuntu/ bionic-security main universe + + include: + - libirrlicht1.8 + - libxxf86vm1 + - libgl1-mesa-glx + - libsqlite3-0 + - libogg0 + - libvorbis0a + - libopenal1 + - libcurl3-gnutls + - libfreetype6 + - zlib1g + - libgmp10 + - libjsoncpp1 + + files: + exclude: + - usr/share/man + - usr/share/doc/*/README.* + - usr/share/doc/*/changelog.* + - usr/share/doc/*/NEWS.* + - usr/share/doc/*/TODO.* + +AppImage: + update-information: None + sign-key: None + arch: x86_64 From 2f6393f49d5ebf21abfaa7bff876b8c0cf4ca191 Mon Sep 17 00:00:00 2001 From: Lars Date: Thu, 12 Nov 2020 10:37:34 -0800 Subject: [PATCH 160/177] Increase limit for simultaneous blocks sent per client and the meshgen cache. --- builtin/settingtypes.txt | 4 ++-- src/defaultsettings.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index c4dc82dfe..dd4914201 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -747,7 +747,7 @@ mesh_generation_interval (Mapblock mesh generation delay) int 0 0 50 # Size of the MapBlock cache of the mesh generator. Increasing this will # increase the cache hit %, reducing the data being copied from the main # thread, thus reducing jitter. -meshgen_block_cache_size (Mapblock mesh generator's MapBlock cache size in MB) int 20 0 1000 +meshgen_block_cache_size (Mapblock mesh generator's MapBlock cache size in MB) int 40 0 1000 # Enables minimap. enable_minimap (Minimap) bool true @@ -1037,7 +1037,7 @@ ipv6_server (IPv6 server) bool false # Maximum number of blocks that are simultaneously sent per client. # The maximum total count is calculated dynamically: # max_total = ceil((#clients + max_users) * per_client / 4) -max_simultaneous_block_sends_per_client (Maximum simultaneous block sends per client) int 40 +max_simultaneous_block_sends_per_client (Maximum simultaneous block sends per client) int 128 # To reduce lag, block transfers are slowed down when a player is building something. # This determines how long they are slowed down after placing or removing a node. diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 177955589..42e7fc16b 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -42,7 +42,7 @@ void set_default_settings(Settings *settings) settings->setDefault("mute_sound", "false"); settings->setDefault("enable_mesh_cache", "false"); settings->setDefault("mesh_generation_interval", "0"); - settings->setDefault("meshgen_block_cache_size", "20"); + settings->setDefault("meshgen_block_cache_size", "40"); settings->setDefault("enable_vbo", "true"); settings->setDefault("free_move", "false"); settings->setDefault("pitch_move", "false"); @@ -343,7 +343,7 @@ void set_default_settings(Settings *settings) settings->setDefault("port", "30000"); settings->setDefault("strict_protocol_version_checking", "false"); settings->setDefault("player_transfer_distance", "0"); - settings->setDefault("max_simultaneous_block_sends_per_client", "40"); + settings->setDefault("max_simultaneous_block_sends_per_client", "128"); settings->setDefault("time_send_interval", "5"); settings->setDefault("default_game", "minetest"); From 872dce5020c5d05597a251c5ce63ebde256f2b64 Mon Sep 17 00:00:00 2001 From: Paramat Date: Fri, 20 Nov 2020 16:11:19 +0000 Subject: [PATCH 161/177] Move Mapgen V7 river generation into the main generation loop (#10639) All terrain generation now occurs in one loop, instead of rivers being carved afterwards in a separate loop. Fixes the removal of nodes added by mods in 'register on generated'. Avoids other problems and reduces the chance of future bugs. Mapchunk generation time is reduced. Also fixes a code mistake which resulted in river channel generation being disabled at floatland altitudes even when floatlands were disabled. --- src/mapgen/mapgen_v7.cpp | 79 ++++++++++++++++------------------------ src/mapgen/mapgen_v7.h | 2 +- 2 files changed, 32 insertions(+), 49 deletions(-) diff --git a/src/mapgen/mapgen_v7.cpp b/src/mapgen/mapgen_v7.cpp index a1fe25ab6..6b0779e9f 100644 --- a/src/mapgen/mapgen_v7.cpp +++ b/src/mapgen/mapgen_v7.cpp @@ -342,10 +342,6 @@ void MapgenV7::makeChunk(BlockMakeData *data) // Generate base and mountain terrain s16 stone_surface_max_y = generateTerrain(); - // Generate rivers - if (spflags & MGV7_RIDGES) - generateRidgeTerrain(); - // Create heightmap updateHeightmap(node_min, node_max); @@ -467,6 +463,23 @@ bool MapgenV7::getMountainTerrainFromMap(int idx_xyz, int idx_xz, s16 y) } +bool MapgenV7::getRiverChannelFromMap(int idx_xyz, int idx_xz, s16 y) +{ + // Maximum width of river channel. Creates the vertical canyon walls + float width = 0.2f; + float absuwatern = std::fabs(noise_ridge_uwater->result[idx_xz]) * 2.0f; + if (absuwatern > width) + return false; + + float altitude = y - water_level; + float height_mod = (altitude + 17.0f) / 2.5f; + float width_mod = width - absuwatern; + float nridge = noise_ridge->result[idx_xyz] * std::fmax(altitude, 0.0f) / 7.0f; + + return nridge + width_mod * height_mod >= 0.6f; +} + + bool MapgenV7::getFloatlandTerrainFromMap(int idx_xyz, float float_offset) { return noise_floatland->result[idx_xyz] + floatland_density - float_offset >= 0.0f; @@ -521,6 +534,15 @@ int MapgenV7::generateTerrain() } } + // 'Generate rivers in this mapchunk' bool for + // simplification of condition checks in y-loop. + bool gen_rivers = (spflags & MGV7_RIDGES) && node_max.Y >= water_level - 16 && + !gen_floatlands; + if (gen_rivers) { + noise_ridge->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z); + noise_ridge_uwater->perlinMap2D(node_min.X, node_min.Z); + } + //// Place nodes const v3s16 &em = vm->m_area.getExtent(); s16 stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT; @@ -544,10 +566,13 @@ int MapgenV7::generateTerrain() if (vm->m_data[vi].getContent() != CONTENT_IGNORE) continue; - if (y <= surface_y) { + bool is_river_channel = gen_rivers && + getRiverChannelFromMap(index3d, index2d, y); + if (y <= surface_y && !is_river_channel) { vm->m_data[vi] = n_stone; // Base terrain } else if ((spflags & MGV7_MOUNTAINS) && - getMountainTerrainFromMap(index3d, index2d, y)) { + getMountainTerrainFromMap(index3d, index2d, y) && + !is_river_channel) { vm->m_data[vi] = n_stone; // Mountain terrain if (y > stone_surface_max_y) stone_surface_max_y = y; @@ -569,45 +594,3 @@ int MapgenV7::generateTerrain() return stone_surface_max_y; } - - -void MapgenV7::generateRidgeTerrain() -{ - if (node_max.Y < water_level - 16 || - (node_max.Y >= floatland_ymin && node_min.Y <= floatland_ymax)) - return; - - noise_ridge->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z); - noise_ridge_uwater->perlinMap2D(node_min.X, node_min.Z); - - MapNode n_water(c_water_source); - MapNode n_air(CONTENT_AIR); - u32 index3d = 0; - float width = 0.2f; - - for (s16 z = node_min.Z; z <= node_max.Z; z++) - for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) { - u32 vi = vm->m_area.index(node_min.X, y, z); - for (s16 x = node_min.X; x <= node_max.X; x++, index3d++, vi++) { - u32 index2d = (z - node_min.Z) * csize.X + (x - node_min.X); - float uwatern = noise_ridge_uwater->result[index2d] * 2.0f; - if (std::fabs(uwatern) > width) - continue; - // Optimises, but also avoids removing nodes placed by mods in - // 'on-generated', when generating outside mapchunk. - content_t c = vm->m_data[vi].getContent(); - if (c != c_stone) - continue; - - float altitude = y - water_level; - float height_mod = (altitude + 17.0f) / 2.5f; - float width_mod = width - std::fabs(uwatern); - float nridge = noise_ridge->result[index3d] * - std::fmax(altitude, 0.0f) / 7.0f; - if (nridge + width_mod * height_mod < 0.6f) - continue; - - vm->m_data[vi] = (y > water_level) ? n_air : n_water; - } - } -} diff --git a/src/mapgen/mapgen_v7.h b/src/mapgen/mapgen_v7.h index 4020cd935..5db10a304 100644 --- a/src/mapgen/mapgen_v7.h +++ b/src/mapgen/mapgen_v7.h @@ -94,10 +94,10 @@ public: float baseTerrainLevelFromMap(int index); bool getMountainTerrainAtPoint(s16 x, s16 y, s16 z); bool getMountainTerrainFromMap(int idx_xyz, int idx_xz, s16 y); + bool getRiverChannelFromMap(int idx_xyz, int idx_xz, s16 y); bool getFloatlandTerrainFromMap(int idx_xyz, float float_offset); int generateTerrain(); - void generateRidgeTerrain(); private: s16 mount_zero_level; From 43bc3a124541d014d7a2678d72bf3b54ff2d6e97 Mon Sep 17 00:00:00 2001 From: MoNTE48 Date: Sun, 22 Nov 2020 14:21:08 +0100 Subject: [PATCH 162/177] Fix Visual Studio build in Actions --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ae359f5d8..71fdf3652 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -221,8 +221,8 @@ jobs: name: VS 2019 ${{ matrix.config.arch }}-${{ matrix.type }} runs-on: windows-2019 env: - VCPKG_VERSION: c7ab9d3110813979a873b2dbac630a9ab79850dc -# 2020.04 + VCPKG_VERSION: 0bf3923f9fab4001c00f0f429682a0853b5749e0 +# 2020.11 vcpkg_packages: irrlicht zlib curl[winssl] openal-soft libvorbis libogg sqlite3 freetype luajit strategy: fail-fast: false @@ -248,7 +248,7 @@ jobs: uses: actions/checkout@v2 - name: Restore from cache and run vcpkg - uses: lukka/run-vcpkg@v2 + uses: lukka/run-vcpkg@v5 with: vcpkgArguments: ${{env.vcpkg_packages}} vcpkgDirectory: '${{ github.workspace }}\vcpkg' From 78273027bf4bbee7488c76c6d65f85381ec7c0ba Mon Sep 17 00:00:00 2001 From: Pierre-Yves Rollo Date: Wed, 16 Sep 2020 17:10:17 +0200 Subject: [PATCH 163/177] Add sound to press event of some formspecs elements (#10402) --- doc/lua_api.txt | 5 +++++ src/client/game.cpp | 12 +++++------ src/gui/StyleSpec.h | 3 +++ src/gui/guiEngine.cpp | 1 + src/gui/guiFormSpecMenu.cpp | 40 ++++++++++++++++++++++++++++++++++--- src/gui/guiFormSpecMenu.h | 6 +++++- 6 files changed, 57 insertions(+), 10 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index ef283f0c1..27f871618 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -2843,11 +2843,14 @@ Some types may inherit styles from parent types. * noclip - boolean, set to true to allow the element to exceed formspec bounds. * padding - rect, adds space between the edges of the button and the content. This value is relative to bgimg_middle. + * sound - a sound to be played when clicked. * textcolor - color, default white. * checkbox * noclip - boolean, set to true to allow the element to exceed formspec bounds. + * sound - a sound to be played when clicked. * dropdown * noclip - boolean, set to true to allow the element to exceed formspec bounds. + * sound - a sound to be played when clicked. * field, pwdfield, textarea * border - set to false to hide the textbox background and border. Default true. * font - Sets font type. See button `font` property for more information. @@ -2874,10 +2877,12 @@ Some types may inherit styles from parent types. * fgimg_pressed - image when pressed. Defaults to fgimg when not provided. * This is deprecated, use states instead. * NOTE: The parameters of any given image_button will take precedence over fgimg/fgimg_pressed + * sound - a sound to be played when clicked. * scrollbar * noclip - boolean, set to true to allow the element to exceed formspec bounds. * tabheader * noclip - boolean, set to true to allow the element to exceed formspec bounds. + * sound - a sound to be played when clicked. * textcolor - color. Default white. * table, textlist * font - Sets font type. See button `font` property for more information. diff --git a/src/client/game.cpp b/src/client/game.cpp index 5c38e027d..b7bb0a330 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -2071,7 +2071,7 @@ void Game::openInventory() TextDest *txt_dst = new TextDestPlayerInventory(client); auto *&formspec = m_game_ui->updateFormspec(""); GUIFormSpecMenu::create(formspec, client, &input->joystick, fs_src, - txt_dst, client->getFormspecPrepend()); + txt_dst, client->getFormspecPrepend(), sound); formspec->setFormSpec(fs_src->getForm(), inventoryloc); } @@ -2603,7 +2603,7 @@ void Game::handleClientEvent_ShowFormSpec(ClientEvent *event, CameraOrientation auto *&formspec = m_game_ui->updateFormspec(*(event->show_formspec.formname)); GUIFormSpecMenu::create(formspec, client, &input->joystick, - fs_src, txt_dst, client->getFormspecPrepend()); + fs_src, txt_dst, client->getFormspecPrepend(), sound); } delete event->show_formspec.formspec; @@ -2616,7 +2616,7 @@ void Game::handleClientEvent_ShowLocalFormSpec(ClientEvent *event, CameraOrienta LocalFormspecHandler *txt_dst = new LocalFormspecHandler(*event->show_formspec.formname, client); GUIFormSpecMenu::create(m_game_ui->getFormspecGUI(), client, &input->joystick, - fs_src, txt_dst, client->getFormspecPrepend()); + fs_src, txt_dst, client->getFormspecPrepend(), sound); delete event->show_formspec.formspec; delete event->show_formspec.formname; @@ -3336,7 +3336,7 @@ bool Game::nodePlacement(const ItemDefinition &selected_def, auto *&formspec = m_game_ui->updateFormspec(""); GUIFormSpecMenu::create(formspec, client, &input->joystick, fs_src, - txt_dst, client->getFormspecPrepend()); + txt_dst, client->getFormspecPrepend(), sound); formspec->setFormSpec(meta->getString("formspec"), inventoryloc); return false; @@ -4108,7 +4108,7 @@ void Game::showDeathFormspec() auto *&formspec = m_game_ui->getFormspecGUI(); GUIFormSpecMenu::create(formspec, client, &input->joystick, - fs_src, txt_dst, client->getFormspecPrepend()); + fs_src, txt_dst, client->getFormspecPrepend(), sound); formspec->setFocus("btn_respawn"); } @@ -4242,7 +4242,7 @@ void Game::showPauseMenu() auto *&formspec = m_game_ui->getFormspecGUI(); GUIFormSpecMenu::create(formspec, client, &input->joystick, - fs_src, txt_dst, client->getFormspecPrepend()); + fs_src, txt_dst, client->getFormspecPrepend(), sound); formspec->setFocus("btn_continue"); formspec->doPause = true; } diff --git a/src/gui/StyleSpec.h b/src/gui/StyleSpec.h index 36ad51a89..f2844ce28 100644 --- a/src/gui/StyleSpec.h +++ b/src/gui/StyleSpec.h @@ -54,6 +54,7 @@ public: COLORS, BORDERCOLORS, BORDERWIDTHS, + SOUND, NUM_PROPERTIES, NONE }; @@ -116,6 +117,8 @@ public: return BORDERCOLORS; } else if (name == "borderwidths") { return BORDERWIDTHS; + } else if (name == "sound") { + return SOUND; } else { return NONE; } diff --git a/src/gui/guiEngine.cpp b/src/gui/guiEngine.cpp index 4a13f0b11..c5ad5c323 100644 --- a/src/gui/guiEngine.cpp +++ b/src/gui/guiEngine.cpp @@ -170,6 +170,7 @@ GUIEngine::GUIEngine(JoystickController *joystick, m_menumanager, NULL /* &client */, m_texture_source, + m_sound_manager, m_formspecgui, m_buttonhandler, "", diff --git a/src/gui/guiFormSpecMenu.cpp b/src/gui/guiFormSpecMenu.cpp index 039b28e79..632b15992 100644 --- a/src/gui/guiFormSpecMenu.cpp +++ b/src/gui/guiFormSpecMenu.cpp @@ -48,6 +48,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "settings.h" #include "client/client.h" #include "client/fontengine.h" +#include "client/sound.h" #include "util/hex.h" #include "util/numeric.h" #include "util/string.h" // for parseColorString() @@ -95,11 +96,13 @@ inline u32 clamp_u8(s32 value) GUIFormSpecMenu::GUIFormSpecMenu(JoystickController *joystick, gui::IGUIElement *parent, s32 id, IMenuManager *menumgr, - Client *client, ISimpleTextureSource *tsrc, IFormSource *fsrc, TextDest *tdst, + Client *client, ISimpleTextureSource *tsrc, ISoundManager *sound_manager, + IFormSource *fsrc, TextDest *tdst, const std::string &formspecPrepend, bool remap_dbl_click): GUIModalMenu(RenderingEngine::get_gui_env(), parent, id, menumgr, remap_dbl_click), m_invmgr(client), m_tsrc(tsrc), + m_sound_manager(sound_manager), m_client(client), m_formspec_prepend(formspecPrepend), m_form_src(fsrc), @@ -143,11 +146,12 @@ GUIFormSpecMenu::~GUIFormSpecMenu() void GUIFormSpecMenu::create(GUIFormSpecMenu *&cur_formspec, Client *client, JoystickController *joystick, IFormSource *fs_src, TextDest *txt_dest, - const std::string &formspecPrepend) + const std::string &formspecPrepend, ISoundManager *sound_manager) { if (cur_formspec == nullptr) { cur_formspec = new GUIFormSpecMenu(joystick, guiroot, -1, &g_menumgr, - client, client->getTextureSource(), fs_src, txt_dest, formspecPrepend); + client, client->getTextureSource(), sound_manager, fs_src, + txt_dest, formspecPrepend); cur_formspec->doPause = false; /* @@ -614,6 +618,9 @@ void GUIFormSpecMenu::parseCheckbox(parserData* data, const std::string &element data->current_parent, spec.fid, spec.flabel.c_str()); auto style = getDefaultStyleForElement("checkbox", name); + + spec.sound = style.get(StyleSpec::Property::SOUND, ""); + e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); if (spec.fname == m_focused_element) { @@ -1020,6 +1027,9 @@ void GUIFormSpecMenu::parseButton(parserData* data, const std::string &element, data->current_parent, spec.fid, spec.flabel.c_str()); auto style = getStyleForElement(type, name, (type != "button") ? "button" : ""); + + spec.sound = style[StyleSpec::STATE_DEFAULT].get(StyleSpec::Property::SOUND, ""); + e->setStyles(style); if (spec.fname == m_focused_element) { @@ -1381,6 +1391,9 @@ void GUIFormSpecMenu::parseDropDown(parserData* data, const std::string &element e->setSelected(stoi(str_initial_selection)-1); auto style = getDefaultStyleForElement("dropdown", name); + + spec.sound = style.get(StyleSpec::Property::SOUND, ""); + e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false)); m_fields.push_back(spec); @@ -1747,6 +1760,10 @@ void GUIFormSpecMenu::parseHyperText(parserData *data, const std::string &elemen ); spec.ftype = f_HyperText; + + auto style = getDefaultStyleForElement("hypertext", spec.fname); + spec.sound = style.get(StyleSpec::Property::SOUND, ""); + GUIHyperText *e = new GUIHyperText(spec.flabel.c_str(), Environment, data->current_parent, spec.fid, rect, m_client, m_tsrc); e->drop(); @@ -1999,6 +2016,8 @@ void GUIFormSpecMenu::parseImageButton(parserData* data, const std::string &elem auto style = getStyleForElement("image_button", spec.fname); + spec.sound = style[StyleSpec::STATE_DEFAULT].get(StyleSpec::Property::SOUND, ""); + // Override style properties with values specified directly in the element if (!image_name.empty()) style[StyleSpec::STATE_DEFAULT].set(StyleSpec::FGIMG, image_name); @@ -2107,6 +2126,9 @@ void GUIFormSpecMenu::parseTabHeader(parserData* data, const std::string &elemen e->setTabHeight(geom.Y); auto style = getDefaultStyleForElement("tabheader", name); + + spec.sound = style.get(StyleSpec::Property::SOUND, ""); + e->setNotClipped(style.getBool(StyleSpec::NOCLIP, true)); for (const std::string &button : buttons) { @@ -2195,6 +2217,9 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data, const std::string & item_name, m_client); auto style = getStyleForElement("item_image_button", spec_btn.fname, "image_button"); + + spec_btn.sound = style[StyleSpec::STATE_DEFAULT].get(StyleSpec::Property::SOUND, ""); + e_btn->setStyles(style); if (spec_btn.fname == m_focused_element) { @@ -4486,6 +4511,8 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) for (GUIFormSpecMenu::FieldSpec &s : m_fields) { if ((s.ftype == f_TabHeader) && (s.fid == event.GUIEvent.Caller->getID())) { + if (!s.sound.empty() && m_sound_manager) + m_sound_manager->playSound(s.sound, false, 1.0f); s.send = true; acceptInput(); s.send = false; @@ -4529,6 +4556,9 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) continue; if (s.ftype == f_Button || s.ftype == f_CheckBox) { + if (!s.sound.empty() && m_sound_manager) + m_sound_manager->playSound(s.sound, false, 1.0f); + s.send = true; if (s.is_exit) { if (m_allowclose) { @@ -4551,6 +4581,8 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) s2.send = false; } } + if (!s.sound.empty() && m_sound_manager) + m_sound_manager->playSound(s.sound, false, 1.0f); s.send = true; acceptInput(quit_mode_no); @@ -4567,6 +4599,8 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) acceptInput(quit_mode_no); s.fdefault = L""; } else if (s.ftype == f_Unknown || s.ftype == f_HyperText) { + if (!s.sound.empty() && m_sound_manager) + m_sound_manager->playSound(s.sound, false, 1.0f); s.send = true; acceptInput(); s.send = false; diff --git a/src/gui/guiFormSpecMenu.h b/src/gui/guiFormSpecMenu.h index c5d662a69..53076e3bd 100644 --- a/src/gui/guiFormSpecMenu.h +++ b/src/gui/guiFormSpecMenu.h @@ -39,6 +39,7 @@ class InventoryManager; class ISimpleTextureSource; class Client; class GUIScrollContainer; +class ISoundManager; typedef enum { f_Button, @@ -127,6 +128,7 @@ class GUIFormSpecMenu : public GUIModalMenu int priority; core::rect rect; gui::ECURSOR_ICON fcursor_icon; + std::string sound; }; struct TooltipSpec @@ -151,6 +153,7 @@ public: IMenuManager *menumgr, Client *client, ISimpleTextureSource *tsrc, + ISoundManager *sound_manager, IFormSource* fs_src, TextDest* txt_dst, const std::string &formspecPrepend, @@ -160,7 +163,7 @@ public: static void create(GUIFormSpecMenu *&cur_formspec, Client *client, JoystickController *joystick, IFormSource *fs_src, TextDest *txt_dest, - const std::string &formspecPrepend); + const std::string &formspecPrepend, ISoundManager *sound_manager); void setFormSpec(const std::string &formspec_string, const InventoryLocation ¤t_inventory_location) @@ -293,6 +296,7 @@ protected: InventoryManager *m_invmgr; ISimpleTextureSource *m_tsrc; + ISoundManager *m_sound_manager; Client *m_client; std::string m_formspec_string; From 8dc70ebb936277f740dffe9a11b5ee0fecc9de8e Mon Sep 17 00:00:00 2001 From: Lars Date: Tue, 24 Nov 2020 09:23:18 -0800 Subject: [PATCH 164/177] Fix camera panning glitches (partially revert 10489.) --- src/client/clientmap.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/client/clientmap.cpp b/src/client/clientmap.cpp index c8561def6..09072858a 100644 --- a/src/client/clientmap.cpp +++ b/src/client/clientmap.cpp @@ -124,7 +124,10 @@ void ClientMap::updateDrawList() const v3f camera_position = m_camera_position; const v3f camera_direction = m_camera_direction; - const f32 camera_fov = m_camera_fov; + + // Use a higher fov to accomodate faster camera movements. + // Blocks are cropped better when they are drawn. + const f32 camera_fov = m_camera_fov * 1.1f; v3s16 cam_pos_nodes = floatToInt(camera_position, BS); v3s16 p_blocks_min; From f1349be5422ab11b488309bee89fdcf868e860bb Mon Sep 17 00:00:00 2001 From: Lars Date: Wed, 25 Nov 2020 17:16:41 -0800 Subject: [PATCH 165/177] Avoid marking map blocks dirty upon deserialization. --- src/mapblock.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mapblock.cpp b/src/mapblock.cpp index 5fb6b221b..8bfecd755 100644 --- a/src/mapblock.cpp +++ b/src/mapblock.cpp @@ -533,7 +533,7 @@ void MapBlock::deSerialize(std::istream &is, u8 version, bool disk) // Timestamp TRACESTREAM(<<"MapBlock::deSerialize "<= 17) { - setTimestamp(readU32(is)); + setTimestampNoChangedFlag(readU32(is)); m_disk_timestamp = m_timestamp; } else { - setTimestamp(BLOCK_TIMESTAMP_UNDEFINED); + setTimestampNoChangedFlag(BLOCK_TIMESTAMP_UNDEFINED); } // Dynamically re-set ids based on node names From 095f82692d3d1b8b190178d640f0a166d1851f60 Mon Sep 17 00:00:00 2001 From: numzero Date: Sun, 22 Nov 2020 09:13:16 +0300 Subject: [PATCH 166/177] Batch cloud drawing --- src/client/clouds.cpp | 47 +++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/src/client/clouds.cpp b/src/client/clouds.cpp index 887a62f25..ccc94cc88 100644 --- a/src/client/clouds.cpp +++ b/src/client/clouds.cpp @@ -170,8 +170,9 @@ void Clouds::render() // Read noise - bool *grid = new bool[m_cloud_radius_i * 2 * m_cloud_radius_i * 2]; - + std::vector grid(m_cloud_radius_i * 2 * m_cloud_radius_i * 2); // vector is broken + std::vector vertices; + vertices.reserve(16 * m_cloud_radius_i * m_cloud_radius_i); for(s16 zi = -m_cloud_radius_i; zi < m_cloud_radius_i; zi++) { u32 si = (zi + m_cloud_radius_i) * m_cloud_radius_i * 2 + m_cloud_radius_i; @@ -195,12 +196,7 @@ void Clouds::render() { s16 zi = zi0; s16 xi = xi0; - // Draw from front to back (needed for transparency) - /*if(zi <= 0) - zi = -m_cloud_radius_i - zi; - if(xi <= 0) - xi = -m_cloud_radius_i - xi;*/ - // Draw from back to front + // Draw from back to front for proper transparency if(zi >= 0) zi = m_cloud_radius_i - zi - 1; if(xi >= 0) @@ -220,17 +216,10 @@ void Clouds::render() video::S3DVertex(0,0,0, 0,0,0, c_top, 0, 0) }; - /*if(zi <= 0 && xi <= 0){ - v[0].Color.setBlue(255); - v[1].Color.setBlue(255); - v[2].Color.setBlue(255); - v[3].Color.setBlue(255); - }*/ - - f32 rx = cloud_size / 2.0f; + const f32 rx = cloud_size / 2.0f; // if clouds are flat, the top layer should be at the given height - f32 ry = m_enable_3d ? m_params.thickness * BS : 0.0f; - f32 rz = cloud_size / 2; + const f32 ry = m_enable_3d ? m_params.thickness * BS : 0.0f; + const f32 rz = cloud_size / 2; for(int i=0; idrawVertexPrimitiveList(v, 4, indices, 2, - video::EVT_STANDARD, scene::EPT_TRIANGLES, video::EIT_16BIT); + vertices.push_back(vertex); + } } } - - delete[] grid; + int quad_count = vertices.size() / 4; + std::vector indices; + indices.reserve(quad_count * 6); + for (int k = 0; k < quad_count; k++) { + indices.push_back(4 * k + 0); + indices.push_back(4 * k + 1); + indices.push_back(4 * k + 2); + indices.push_back(4 * k + 2); + indices.push_back(4 * k + 3); + indices.push_back(4 * k + 0); + } + driver->drawVertexPrimitiveList(vertices.data(), vertices.size(), indices.data(), 2 * quad_count, + video::EVT_STANDARD, scene::EPT_TRIANGLES, video::EIT_16BIT); // Restore fog settings driver->setFog(fog_color, fog_type, fog_start, fog_end, fog_density, From 89cc5bf53730d72744d45f92fc11dc9ab6c232c9 Mon Sep 17 00:00:00 2001 From: numzero Date: Sun, 22 Nov 2020 16:43:38 +0300 Subject: [PATCH 167/177] Don't evaluate things many times --- src/client/clouds.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/client/clouds.cpp b/src/client/clouds.cpp index ccc94cc88..253dee8b9 100644 --- a/src/client/clouds.cpp +++ b/src/client/clouds.cpp @@ -341,14 +341,13 @@ void Clouds::step(float dtime) void Clouds::update(const v3f &camera_p, const video::SColorf &color_diffuse) { + video::SColorf ambient(m_params.color_ambient); + video::SColorf bright(m_params.color_bright); m_camera_pos = camera_p; - m_color.r = MYMIN(MYMAX(color_diffuse.r * m_params.color_bright.getRed(), - m_params.color_ambient.getRed()), 255) / 255.0f; - m_color.g = MYMIN(MYMAX(color_diffuse.g * m_params.color_bright.getGreen(), - m_params.color_ambient.getGreen()), 255) / 255.0f; - m_color.b = MYMIN(MYMAX(color_diffuse.b * m_params.color_bright.getBlue(), - m_params.color_ambient.getBlue()), 255) / 255.0f; - m_color.a = m_params.color_bright.getAlpha() / 255.0f; + m_color.r = core::clamp(color_diffuse.r * bright.r, ambient.r, 1.0f); + m_color.g = core::clamp(color_diffuse.g * bright.g, ambient.g, 1.0f); + m_color.b = core::clamp(color_diffuse.b * bright.b, ambient.b, 1.0f); + m_color.a = bright.a; // is the camera inside the cloud mesh? m_camera_inside_cloud = false; // default From 3077afc0a2039cd4c8d64d9df62ed9b2ba6463dc Mon Sep 17 00:00:00 2001 From: numzero Date: Sun, 22 Nov 2020 16:29:31 +0300 Subject: [PATCH 168/177] Store stars in a single static mesh buffer --- src/client/sky.cpp | 199 ++++++++++++++++++++------------------------- src/client/sky.h | 8 +- 2 files changed, 92 insertions(+), 115 deletions(-) diff --git a/src/client/sky.cpp b/src/client/sky.cpp index 2e0cbca86..29a0545ab 100644 --- a/src/client/sky.cpp +++ b/src/client/sky.cpp @@ -1,6 +1,7 @@ /* Minetest Copyright (C) 2010-2013 celeron55, Perttu Ahola +Copyright (C) 2020 numzero, Lobachevskiy Vitaliy This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -34,16 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "config.h" using namespace irr::core; -Sky::Sky(s32 id, ITextureSource *tsrc) : - scene::ISceneNode(RenderingEngine::get_scene_manager()->getRootSceneNode(), - RenderingEngine::get_scene_manager(), id) -{ - setAutomaticCulling(scene::EAC_OFF); - m_box.MaxEdge.set(0, 0, 0); - m_box.MinEdge.set(0, 0, 0); - - // Create material - +static video::SMaterial baseMaterial() { video::SMaterial mat; mat.Lighting = false; #if ENABLE_GLES @@ -56,14 +48,29 @@ Sky::Sky(s32 id, ITextureSource *tsrc) : mat.TextureLayer[0].TextureWrapU = video::ETC_CLAMP_TO_EDGE; mat.TextureLayer[0].TextureWrapV = video::ETC_CLAMP_TO_EDGE; mat.BackfaceCulling = false; + return mat; +}; - m_materials[0] = mat; +Sky::Sky(s32 id, ITextureSource *tsrc) : + scene::ISceneNode(RenderingEngine::get_scene_manager()->getRootSceneNode(), + RenderingEngine::get_scene_manager(), id) +{ + setAutomaticCulling(scene::EAC_OFF); + m_box.MaxEdge.set(0, 0, 0); + m_box.MinEdge.set(0, 0, 0); - m_materials[1] = mat; + // Create materials + + m_materials[0] = baseMaterial(); + m_materials[0].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; + m_materials[0].Lighting = true; + m_materials[0].ColorMaterial = video::ECM_NONE; + + m_materials[1] = baseMaterial(); //m_materials[1].MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA; m_materials[1].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; - m_materials[2] = mat; + m_materials[2] = baseMaterial(); m_materials[2].setTexture(0, tsrc->getTextureForMesh("sunrisebg.png")); m_materials[2].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; //m_materials[2].MaterialType = video::EMT_TRANSPARENT_ADD_COLOR; @@ -80,7 +87,7 @@ Sky::Sky(s32 id, ITextureSource *tsrc) : tsrc->getTexture(m_moon_params.tonemap) : NULL; if (m_sun_texture) { - m_materials[3] = mat; + m_materials[3] = baseMaterial(); m_materials[3].setTexture(0, m_sun_texture); m_materials[3].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; // Disables texture filtering @@ -92,7 +99,7 @@ Sky::Sky(s32 id, ITextureSource *tsrc) : m_materials[3].Lighting = true; } if (m_moon_texture) { - m_materials[4] = mat; + m_materials[4] = baseMaterial(); m_materials[4].setTexture(0, m_moon_texture); m_materials[4].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; // Disables texture filtering @@ -105,7 +112,7 @@ Sky::Sky(s32 id, ITextureSource *tsrc) : } for (int i = 5; i < 11; i++) { - m_materials[i] = mat; + m_materials[i] = baseMaterial(); m_materials[i].Lighting = true; m_materials[i].MaterialType = video::EMT_SOLID; } @@ -673,13 +680,12 @@ void Sky::draw_moon(video::IVideoDriver *driver, float moonsize, const video::SC c = video::SColor(255, 255, 255, 255); draw_sky_body(vertices, -d, d, c); place_sky_body(vertices, -90, wicked_time_of_day * 360 - 90); - driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); + driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2); } } void Sky::draw_stars(video::IVideoDriver * driver, float wicked_time_of_day) { - driver->setMaterial(m_materials[1]); // Tune values so that stars first appear just after the sun // disappears over the horizon, and disappear just before the sun // appears over the horizon. @@ -687,87 +693,19 @@ void Sky::draw_stars(video::IVideoDriver * driver, float wicked_time_of_day) // to time 4000. float tod = wicked_time_of_day < 0.5f ? wicked_time_of_day : (1.0f - wicked_time_of_day); - float starbrightness = clamp((0.25f - fabsf(tod)) * 20.0f, 0.0f, 1.0f); - - float f = starbrightness; - float d = (0.006 / 2) * m_star_params.scale; - - video::SColor starcolor = m_star_params.starcolor; - starcolor.setAlpha(f * m_star_params.starcolor.getAlpha()); - - // Stars are only drawn when not fully transparent - if (m_star_params.starcolor.getAlpha() < 1) + float starbrightness = (0.25f - fabsf(tod)) * 20.0f; + int alpha = clamp(starbrightness * m_star_params.starcolor.getAlpha(), 0, 255); + if (!alpha) // Stars are only drawn when not fully transparent return; -#if ENABLE_GLES - u16 *indices = new u16[m_star_params.count * 3]; - video::S3DVertex *vertices = - new video::S3DVertex[m_star_params.count * 3]; - for (u32 i = 0; i < m_star_params.count; i++) { - indices[i * 3 + 0] = i * 3 + 0; - indices[i * 3 + 1] = i * 3 + 1; - indices[i * 3 + 2] = i * 3 + 2; - v3f r = m_stars[i]; - core::CMatrix4 a; - a.buildRotateFromTo(v3f(0, 1, 0), r); - v3f p = v3f(-d, 1, -d); - v3f p1 = v3f(d, 1, 0); - v3f p2 = v3f(-d, 1, d); - a.rotateVect(p); - a.rotateVect(p1); - a.rotateVect(p2); - p.rotateXYBy(wicked_time_of_day * 360 - 90); - p1.rotateXYBy(wicked_time_of_day * 360 - 90); - p2.rotateXYBy(wicked_time_of_day * 360 - 90); - vertices[i * 3 + 0].Pos = p; - vertices[i * 3 + 0].Color = starcolor; - vertices[i * 3 + 1].Pos = p1; - vertices[i * 3 + 1].Color = starcolor; - vertices[i * 3 + 2].Pos = p2; - vertices[i * 3 + 2].Color = starcolor; - } - driver->drawIndexedTriangleList(vertices, m_star_params.count * 3, - indices, m_star_params.count); - delete[] indices; - delete[] vertices; -#else - u16 *indices = new u16[m_star_params.count * 4]; - video::S3DVertex *vertices = - new video::S3DVertex[m_star_params.count * 4]; - for (u32 i = 0; i < m_star_params.count; i++) { - indices[i * 4 + 0] = i * 4 + 0; - indices[i * 4 + 1] = i * 4 + 1; - indices[i * 4 + 2] = i * 4 + 2; - indices[i * 4 + 3] = i * 4 + 3; - v3f r = m_stars[i]; - core::CMatrix4 a; - a.buildRotateFromTo(v3f(0, 1, 0), r); - v3f p = v3f(-d, 1, -d); - v3f p1 = v3f(d, 1, -d); - v3f p2 = v3f(d, 1, d); - v3f p3 = v3f(-d, 1, d); - a.rotateVect(p); - a.rotateVect(p1); - a.rotateVect(p2); - a.rotateVect(p3); - p.rotateXYBy(wicked_time_of_day * 360 - 90); - p1.rotateXYBy(wicked_time_of_day * 360 - 90); - p2.rotateXYBy(wicked_time_of_day * 360 - 90); - p3.rotateXYBy(wicked_time_of_day * 360 - 90); - vertices[i * 4 + 0].Pos = p; - vertices[i * 4 + 0].Color = starcolor; - vertices[i * 4 + 1].Pos = p1; - vertices[i * 4 + 1].Color = starcolor; - vertices[i * 4 + 2].Pos = p2; - vertices[i * 4 + 2].Color = starcolor; - vertices[i * 4 + 3].Pos = p3; - vertices[i * 4 + 3].Color = starcolor; - } - driver->drawVertexPrimitiveList(vertices, m_star_params.count * 4, - indices, m_star_params.count, video::EVT_STANDARD, - scene::EPT_QUADS, video::EIT_16BIT); - delete[] indices; - delete[] vertices; -#endif + + m_materials[0].DiffuseColor = video::SColor(alpha, 0, 0, 0); + m_materials[0].EmissiveColor = m_star_params.starcolor; + auto sky_rotation = core::matrix4().setRotationAxisRadians(2.0f * M_PI * (wicked_time_of_day - 0.25f), v3f(0.0f, 0.0f, 1.0f)); + auto world_matrix = driver->getTransform(video::ETS_WORLD); + driver->setTransform(video::ETS_WORLD, world_matrix * sky_rotation); + driver->setMaterial(m_materials[0]); + driver->drawMeshBuffer(m_stars.get()); + driver->setTransform(video::ETS_WORLD, world_matrix); } void Sky::draw_sky_body(std::array &vertices, float pos_1, float pos_2, const video::SColor &c) @@ -822,7 +760,7 @@ void Sky::setSunTexture(std::string sun_texture, m_sun_texture = tsrc->getTextureForMesh(m_sun_params.texture); if (m_sun_texture) { - m_materials[3] = m_materials[0]; + m_materials[3] = baseMaterial(); m_materials[3].setTexture(0, m_sun_texture); m_materials[3].MaterialType = video:: EMT_TRANSPARENT_ALPHA_CHANNEL; @@ -870,7 +808,7 @@ void Sky::setMoonTexture(std::string moon_texture, m_moon_texture = tsrc->getTextureForMesh(m_moon_params.texture); if (m_moon_texture) { - m_materials[4] = m_materials[0]; + m_materials[4] = baseMaterial(); m_materials[4].setTexture(0, m_moon_texture); m_materials[4].MaterialType = video:: EMT_TRANSPARENT_ALPHA_CHANNEL; @@ -892,21 +830,56 @@ void Sky::setStarCount(u16 star_count, bool force_update) // Allow force updating star count at game init. if (m_star_params.count != star_count || force_update) { m_star_params.count = star_count; - m_stars.clear(); - // Rebuild the stars surrounding the camera - for (u16 i = 0; i < star_count; i++) { - v3f star = v3f( - myrand_range(-10000, 10000), - myrand_range(-10000, 10000), - myrand_range(-10000, 10000) - ); - - star.normalize(); - m_stars.emplace_back(star); - } + updateStars(); } } +void Sky::updateStars() { + m_stars.reset(new scene::SMeshBuffer()); + // Stupid IrrLicht doesn’t allow non-indexed rendering, and indexed quad + // rendering is slow due to lack of hardware support. So as indices are + // 16-bit and there are 4 vertices per star... the limit is 2^16/4 = 0x4000. + // That should be well enough actually. + if (m_star_params.count > 0x4000) { + warningstream << "Requested " << m_star_params.count << " stars but " << 0x4000 << " is the max\n"; + m_star_params.count = 0x4000; + } + m_stars->Vertices.reallocate(4 * m_star_params.count); + m_stars->Indices.reallocate(6 * m_star_params.count); + + float d = (0.006 / 2) * m_star_params.scale; + for (u16 i = 0; i < m_star_params.count; i++) { + v3f r = v3f( + myrand_range(-10000, 10000), + myrand_range(-10000, 10000), + myrand_range(-10000, 10000) + ); + core::CMatrix4 a; + a.buildRotateFromTo(v3f(0, 1, 0), r); + v3f p = v3f(-d, 1, -d); + v3f p1 = v3f(d, 1, -d); + v3f p2 = v3f(d, 1, d); + v3f p3 = v3f(-d, 1, d); + a.rotateVect(p); + a.rotateVect(p1); + a.rotateVect(p2); + a.rotateVect(p3); + m_stars->Vertices.push_back(video::S3DVertex(p, {}, {}, {})); + m_stars->Vertices.push_back(video::S3DVertex(p1, {}, {}, {})); + m_stars->Vertices.push_back(video::S3DVertex(p2, {}, {}, {})); + m_stars->Vertices.push_back(video::S3DVertex(p3, {}, {}, {})); + } + for (u16 i = 0; i < m_star_params.count; i++) { + m_stars->Indices.push_back(i * 4 + 0); + m_stars->Indices.push_back(i * 4 + 1); + m_stars->Indices.push_back(i * 4 + 2); + m_stars->Indices.push_back(i * 4 + 2); + m_stars->Indices.push_back(i * 4 + 3); + m_stars->Indices.push_back(i * 4 + 0); + } + m_stars->setHardwareMappingHint(scene::EHM_STATIC); +} + void Sky::setSkyColors(const SkyColor &sky_color) { m_sky_params.sky_color = sky_color; @@ -936,7 +909,7 @@ void Sky::addTextureToSkybox(std::string texture, int material_id, // Keep a list of texture names handy. m_sky_params.textures.emplace_back(texture); video::ITexture *result = tsrc->getTextureForMesh(texture); - m_materials[material_id+5] = m_materials[0]; + m_materials[material_id+5] = baseMaterial(); m_materials[material_id+5].setTexture(0, result); m_materials[material_id+5].MaterialType = video::EMT_SOLID; } diff --git a/src/client/sky.h b/src/client/sky.h index 3227e8f59..176545015 100644 --- a/src/client/sky.h +++ b/src/client/sky.h @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "camera.h" #include "irrlichttypes_extrabloated.h" +#include "irr_ptr.h" #include "skyparams.h" #pragma once @@ -77,7 +78,7 @@ public: void setStarsVisible(bool stars_visible) { m_star_params.visible = stars_visible; } void setStarCount(u16 star_count, bool force_update); void setStarColor(video::SColor star_color) { m_star_params.starcolor = star_color; } - void setStarScale(f32 star_scale) { m_star_params.scale = star_scale; } + void setStarScale(f32 star_scale) { m_star_params.scale = star_scale; updateStars(); } bool getCloudsVisible() const { return m_clouds_visible && m_clouds_enabled; } const video::SColorf &getCloudColor() const { return m_cloudcolor_f; } @@ -178,13 +179,16 @@ private: bool m_default_tint = true; - std::vector m_stars; + irr_ptr m_stars; video::ITexture *m_sun_texture; video::ITexture *m_moon_texture; video::ITexture *m_sun_tonemap; video::ITexture *m_moon_tonemap; + void updateStars(); + void updateStarsColor(video::SColor color); + void draw_sun(video::IVideoDriver *driver, float sunsize, const video::SColor &suncolor, const video::SColor &suncolor2, float wicked_time_of_day); void draw_moon(video::IVideoDriver *driver, float moonsize, const video::SColor &mooncolor, From 560627eef8c02f8201e639c75fcd5301d3a33077 Mon Sep 17 00:00:00 2001 From: numzero Date: Sun, 22 Nov 2020 16:41:36 +0300 Subject: [PATCH 169/177] Reuse seed when updating stars The only currently relevant parameter is scale which can now be changed without resetting stars position --- src/client/sky.cpp | 8 +++++--- src/client/sky.h | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/client/sky.cpp b/src/client/sky.cpp index 29a0545ab..cc9fb7d36 100644 --- a/src/client/sky.cpp +++ b/src/client/sky.cpp @@ -830,6 +830,7 @@ void Sky::setStarCount(u16 star_count, bool force_update) // Allow force updating star count at game init. if (m_star_params.count != star_count || force_update) { m_star_params.count = star_count; + m_seed = (u64)myrand() << 32 | myrand(); updateStars(); } } @@ -847,12 +848,13 @@ void Sky::updateStars() { m_stars->Vertices.reallocate(4 * m_star_params.count); m_stars->Indices.reallocate(6 * m_star_params.count); + PcgRandom rgen(m_seed); float d = (0.006 / 2) * m_star_params.scale; for (u16 i = 0; i < m_star_params.count; i++) { v3f r = v3f( - myrand_range(-10000, 10000), - myrand_range(-10000, 10000), - myrand_range(-10000, 10000) + rgen.range(-10000, 10000), + rgen.range(-10000, 10000), + rgen.range(-10000, 10000) ); core::CMatrix4 a; a.buildRotateFromTo(v3f(0, 1, 0), r); diff --git a/src/client/sky.h b/src/client/sky.h index 176545015..9f859f961 100644 --- a/src/client/sky.h +++ b/src/client/sky.h @@ -179,6 +179,7 @@ private: bool m_default_tint = true; + u64 m_seed = 0; irr_ptr m_stars; video::ITexture *m_sun_texture; From d7cf40a0ce996985cff20a156c56437f8b64c772 Mon Sep 17 00:00:00 2001 From: numzero Date: Sun, 22 Nov 2020 16:44:00 +0300 Subject: [PATCH 170/177] Replace TriangleFan as poorly supported --- src/client/sky.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/client/sky.cpp b/src/client/sky.cpp index cc9fb7d36..dda59dd11 100644 --- a/src/client/sky.cpp +++ b/src/client/sky.cpp @@ -209,7 +209,7 @@ void Sky::render() const f32 t = 1.0f; const f32 o = 0.0f; - static const u16 indices[4] = {0, 1, 2, 3}; + static const u16 indices[6] = {0, 1, 2, 0, 2, 3}; video::S3DVertex vertices[4]; driver->setMaterial(m_materials[1]); @@ -251,7 +251,7 @@ void Sky::render() vertex.Pos.rotateXZBy(180); } } - driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); + driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2); } } @@ -277,7 +277,7 @@ void Sky::render() // Switch from -Z (south) to +Z (north) vertex.Pos.rotateXZBy(-180); } - driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); + driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2); } } @@ -308,7 +308,7 @@ void Sky::render() // Switch from -Z (south) to -X (west) vertex.Pos.rotateXZBy(-90); } - driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); + driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2); } // Draw sun @@ -344,7 +344,7 @@ void Sky::render() // Switch from -Z (south) to +Z (north) vertex.Pos.rotateXZBy(-180); } - driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); + driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2); } // Draw bottom far cloudy fog thing in front of sun, moon and stars @@ -353,7 +353,7 @@ void Sky::render() vertices[1] = video::S3DVertex( 1, -1.0, -1, 0, 1, 0, c, o, t); vertices[2] = video::S3DVertex( 1, -1.0, 1, 0, 1, 0, c, o, o); vertices[3] = video::S3DVertex(-1, -1.0, 1, 0, 1, 0, c, t, o); - driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); + driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2); } } } @@ -597,7 +597,7 @@ void Sky::draw_sun(video::IVideoDriver *driver, float sunsize, const video::SCol * wicked_time_of_day: current time of day, to know where should be the sun in the sky */ { - static const u16 indices[4] = {0, 1, 2, 3}; + static const u16 indices[] = {0, 1, 2, 0, 2, 3}; std::array vertices; if (!m_sun_texture) { driver->setMaterial(m_materials[1]); @@ -615,7 +615,7 @@ void Sky::draw_sun(video::IVideoDriver *driver, float sunsize, const video::SCol for (int i = 0; i < 4; i++) { draw_sky_body(vertices, -sunsizes[i], sunsizes[i], colors[i]); place_sky_body(vertices, 90, wicked_time_of_day * 360 - 90); - driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); + driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2); } } else { driver->setMaterial(m_materials[3]); @@ -627,7 +627,7 @@ void Sky::draw_sun(video::IVideoDriver *driver, float sunsize, const video::SCol c = video::SColor(255, 255, 255, 255); draw_sky_body(vertices, -d, d, c); place_sky_body(vertices, 90, wicked_time_of_day * 360 - 90); - driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); + driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2); } } @@ -644,7 +644,7 @@ void Sky::draw_moon(video::IVideoDriver *driver, float moonsize, const video::SC * the sky */ { - static const u16 indices[4] = {0, 1, 2, 3}; + static const u16 indices[] = {0, 1, 2, 0, 2, 3}; std::array vertices; if (!m_moon_texture) { driver->setMaterial(m_materials[1]); @@ -668,7 +668,7 @@ void Sky::draw_moon(video::IVideoDriver *driver, float moonsize, const video::SC for (int i = 0; i < 4; i++) { draw_sky_body(vertices, moonsizes_1[i], moonsizes_2[i], colors[i]); place_sky_body(vertices, -90, wicked_time_of_day * 360 - 90); - driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2); + driver->drawIndexedTriangleList(&vertices[0], 4, indices, 2); } } else { driver->setMaterial(m_materials[4]); From be59668f4743bb3bf85b37a188ffc1759601c152 Mon Sep 17 00:00:00 2001 From: numzero Date: Sun, 22 Nov 2020 17:36:59 +0300 Subject: [PATCH 171/177] Allow missing shaders --- src/client/shader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/shader.cpp b/src/client/shader.cpp index 4f6430579..1cec20d2c 100644 --- a/src/client/shader.cpp +++ b/src/client/shader.cpp @@ -577,7 +577,6 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp shaderinfo.name = name; shaderinfo.material_type = material_type; shaderinfo.drawtype = drawtype; - shaderinfo.material = video::EMT_SOLID; switch (material_type) { case TILE_MATERIAL_OPAQUE: case TILE_MATERIAL_LIQUID_OPAQUE: @@ -598,6 +597,7 @@ ShaderInfo generate_shader(const std::string &name, u8 material_type, u8 drawtyp shaderinfo.base_material = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF; break; } + shaderinfo.material = shaderinfo.base_material; bool enable_shaders = g_settings->getBool("enable_shaders"); if (!enable_shaders) From cdcf7dca7c9afb329d49f2016964f77ac379ed67 Mon Sep 17 00:00:00 2001 From: numzero Date: Sun, 22 Nov 2020 18:25:41 +0300 Subject: [PATCH 172/177] Sky: support GLES2 IrrLicht built-in shader is broken, have to write my own --- client/shaders/stars_shader/opengl_fragment.glsl | 6 ++++++ client/shaders/stars_shader/opengl_vertex.glsl | 4 ++++ src/client/game.cpp | 8 +++++++- src/client/sky.cpp | 15 ++++++++------- src/client/sky.h | 8 ++++++-- 5 files changed, 31 insertions(+), 10 deletions(-) create mode 100644 client/shaders/stars_shader/opengl_fragment.glsl create mode 100644 client/shaders/stars_shader/opengl_vertex.glsl diff --git a/client/shaders/stars_shader/opengl_fragment.glsl b/client/shaders/stars_shader/opengl_fragment.glsl new file mode 100644 index 000000000..a9ed741bf --- /dev/null +++ b/client/shaders/stars_shader/opengl_fragment.glsl @@ -0,0 +1,6 @@ +uniform vec4 starColor; + +void main(void) +{ + gl_FragColor = starColor; +} diff --git a/client/shaders/stars_shader/opengl_vertex.glsl b/client/shaders/stars_shader/opengl_vertex.glsl new file mode 100644 index 000000000..77c401f34 --- /dev/null +++ b/client/shaders/stars_shader/opengl_vertex.glsl @@ -0,0 +1,4 @@ +void main(void) +{ + gl_Position = mWorldViewProj * inVertexPosition; +} diff --git a/src/client/game.cpp b/src/client/game.cpp index b7bb0a330..2001f0487 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -424,6 +424,7 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter CachedVertexShaderSetting m_animation_timer_vertex; CachedPixelShaderSetting m_animation_timer_pixel; CachedPixelShaderSetting m_day_light; + CachedPixelShaderSetting m_star_color; CachedPixelShaderSetting m_eye_position_pixel; CachedVertexShaderSetting m_eye_position_vertex; CachedPixelShaderSetting m_minimap_yaw; @@ -456,6 +457,7 @@ public: m_animation_timer_vertex("animationTimer"), m_animation_timer_pixel("animationTimer"), m_day_light("dayLight"), + m_star_color("starColor"), m_eye_position_pixel("eyePosition"), m_eye_position_vertex("eyePosition"), m_minimap_yaw("yawVec"), @@ -507,6 +509,10 @@ public: sunlight.b }; m_day_light.set(dnc, services); + video::SColorf star_color = m_sky->getCurrentStarColor(); + float clr[4] = {star_color.r, star_color.g, star_color.b, star_color.a}; + m_star_color.set(clr, services); + u32 animation_timer = porting::getTimeMs() % 1000000; float animation_timer_f = (float)animation_timer / 100000.f; m_animation_timer_vertex.set(&animation_timer_f, services); @@ -1363,7 +1369,7 @@ bool Game::createClient(const GameStartData &start_data) /* Skybox */ - sky = new Sky(-1, texture_src); + sky = new Sky(-1, texture_src, shader_src); scsf->setSky(sky); skybox = NULL; // This is used/set later on in the main run loop diff --git a/src/client/sky.cpp b/src/client/sky.cpp index dda59dd11..3fc5a95b4 100644 --- a/src/client/sky.cpp +++ b/src/client/sky.cpp @@ -51,7 +51,7 @@ static video::SMaterial baseMaterial() { return mat; }; -Sky::Sky(s32 id, ITextureSource *tsrc) : +Sky::Sky(s32 id, ITextureSource *tsrc, IShaderSource *ssrc) : scene::ISceneNode(RenderingEngine::get_scene_manager()->getRootSceneNode(), RenderingEngine::get_scene_manager(), id) { @@ -59,10 +59,12 @@ Sky::Sky(s32 id, ITextureSource *tsrc) : m_box.MaxEdge.set(0, 0, 0); m_box.MinEdge.set(0, 0, 0); + m_enable_shaders = g_settings->getBool("enable_shaders"); + // Create materials m_materials[0] = baseMaterial(); - m_materials[0].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; + m_materials[0].MaterialType = ssrc->getShaderInfo(ssrc->getShader("stars_shader", TILE_MATERIAL_ALPHA, 0)).material; m_materials[0].Lighting = true; m_materials[0].ColorMaterial = video::ECM_NONE; @@ -694,12 +696,11 @@ void Sky::draw_stars(video::IVideoDriver * driver, float wicked_time_of_day) float tod = wicked_time_of_day < 0.5f ? wicked_time_of_day : (1.0f - wicked_time_of_day); float starbrightness = (0.25f - fabsf(tod)) * 20.0f; - int alpha = clamp(starbrightness * m_star_params.starcolor.getAlpha(), 0, 255); - if (!alpha) // Stars are only drawn when not fully transparent + m_star_color = m_star_params.starcolor; + m_star_color.a = clamp(starbrightness * m_star_color.a, 0.0f, 1.0f); + if (m_star_color.a <= 0.0f) // Stars are only drawn when not fully transparent return; - - m_materials[0].DiffuseColor = video::SColor(alpha, 0, 0, 0); - m_materials[0].EmissiveColor = m_star_params.starcolor; + m_materials[0].DiffuseColor = m_materials[0].EmissiveColor = m_star_color.toSColor(); auto sky_rotation = core::matrix4().setRotationAxisRadians(2.0f * M_PI * (wicked_time_of_day - 0.25f), v3f(0.0f, 0.0f, 1.0f)); auto world_matrix = driver->getTransform(video::ETS_WORLD); driver->setTransform(video::ETS_WORLD, world_matrix * sky_rotation); diff --git a/src/client/sky.h b/src/client/sky.h index 9f859f961..10e1cd976 100644 --- a/src/client/sky.h +++ b/src/client/sky.h @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "camera.h" #include "irrlichttypes_extrabloated.h" #include "irr_ptr.h" +#include "shader.h" #include "skyparams.h" #pragma once @@ -35,7 +36,7 @@ class Sky : public scene::ISceneNode { public: //! constructor - Sky(s32 id, ITextureSource *tsrc); + Sky(s32 id, ITextureSource *tsrc, IShaderSource *ssrc); virtual void OnRegisterSceneNode(); @@ -102,6 +103,8 @@ public: void clearSkyboxTextures() { m_sky_params.textures.clear(); } void addTextureToSkybox(std::string texture, int material_id, ITextureSource *tsrc); + const video::SColorf &getCurrentStarColor() const { return m_star_color; } + private: aabb3f m_box; video::SMaterial m_materials[SKY_MATERIAL_COUNT]; @@ -155,6 +158,7 @@ private: bool m_clouds_enabled = true; // Initialised to true, reset only by set_sky API bool m_directional_colored_fog; bool m_in_clouds = true; // Prevent duplicating bools to remember old values + bool m_enable_shaders = false; video::SColorf m_bgcolor_bright_f = video::SColorf(1.0f, 1.0f, 1.0f, 1.0f); video::SColorf m_skycolor_bright_f = video::SColorf(1.0f, 1.0f, 1.0f, 1.0f); @@ -181,6 +185,7 @@ private: u64 m_seed = 0; irr_ptr m_stars; + video::SColorf m_star_color; video::ITexture *m_sun_texture; video::ITexture *m_moon_texture; @@ -188,7 +193,6 @@ private: video::ITexture *m_moon_tonemap; void updateStars(); - void updateStarsColor(video::SColor color); void draw_sun(video::IVideoDriver *driver, float sunsize, const video::SColor &suncolor, const video::SColor &suncolor2, float wicked_time_of_day); From c158e20e5beab1037c905fe96b2a56baccddaec7 Mon Sep 17 00:00:00 2001 From: numzero Date: Sun, 22 Nov 2020 19:49:38 +0300 Subject: [PATCH 173/177] Provide fallback star color for GLES 2 with MT shaders disabled --- src/client/sky.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/client/sky.cpp b/src/client/sky.cpp index 3fc5a95b4..0fccf067c 100644 --- a/src/client/sky.cpp +++ b/src/client/sky.cpp @@ -849,6 +849,7 @@ void Sky::updateStars() { m_stars->Vertices.reallocate(4 * m_star_params.count); m_stars->Indices.reallocate(6 * m_star_params.count); + video::SColor fallback_color = m_star_params.starcolor; // used on GLES 2 “without shaders” PcgRandom rgen(m_seed); float d = (0.006 / 2) * m_star_params.scale; for (u16 i = 0; i < m_star_params.count; i++) { @@ -867,10 +868,10 @@ void Sky::updateStars() { a.rotateVect(p1); a.rotateVect(p2); a.rotateVect(p3); - m_stars->Vertices.push_back(video::S3DVertex(p, {}, {}, {})); - m_stars->Vertices.push_back(video::S3DVertex(p1, {}, {}, {})); - m_stars->Vertices.push_back(video::S3DVertex(p2, {}, {}, {})); - m_stars->Vertices.push_back(video::S3DVertex(p3, {}, {}, {})); + m_stars->Vertices.push_back(video::S3DVertex(p, {}, fallback_color, {})); + m_stars->Vertices.push_back(video::S3DVertex(p1, {}, fallback_color, {})); + m_stars->Vertices.push_back(video::S3DVertex(p2, {}, fallback_color, {})); + m_stars->Vertices.push_back(video::S3DVertex(p3, {}, fallback_color, {})); } for (u16 i = 0; i < m_star_params.count; i++) { m_stars->Indices.push_back(i * 4 + 0); From 8689e00fca2cf55594d53f4e112f0d7b6676c8b0 Mon Sep 17 00:00:00 2001 From: numzero Date: Mon, 23 Nov 2020 01:04:31 +0300 Subject: [PATCH 174/177] Fix style --- src/client/sky.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/client/sky.cpp b/src/client/sky.cpp index 0fccf067c..180d43066 100644 --- a/src/client/sky.cpp +++ b/src/client/sky.cpp @@ -35,7 +35,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "config.h" using namespace irr::core; -static video::SMaterial baseMaterial() { +static video::SMaterial baseMaterial() +{ video::SMaterial mat; mat.Lighting = false; #if ENABLE_GLES @@ -836,7 +837,8 @@ void Sky::setStarCount(u16 star_count, bool force_update) } } -void Sky::updateStars() { +void Sky::updateStars() +{ m_stars.reset(new scene::SMeshBuffer()); // Stupid IrrLicht doesn’t allow non-indexed rendering, and indexed quad // rendering is slow due to lack of hardware support. So as indices are From 868749b4f8e898be0c01f892ea78d859d054c17e Mon Sep 17 00:00:00 2001 From: sfan5 Date: Thu, 26 Nov 2020 22:17:11 +0100 Subject: [PATCH 175/177] Return star color calculation to what it previously was --- src/client/sky.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/sky.cpp b/src/client/sky.cpp index 180d43066..9a2614eda 100644 --- a/src/client/sky.cpp +++ b/src/client/sky.cpp @@ -698,7 +698,7 @@ void Sky::draw_stars(video::IVideoDriver * driver, float wicked_time_of_day) float tod = wicked_time_of_day < 0.5f ? wicked_time_of_day : (1.0f - wicked_time_of_day); float starbrightness = (0.25f - fabsf(tod)) * 20.0f; m_star_color = m_star_params.starcolor; - m_star_color.a = clamp(starbrightness * m_star_color.a, 0.0f, 1.0f); + m_star_color.a *= clamp(starbrightness, 0.0f, 1.0f); if (m_star_color.a <= 0.0f) // Stars are only drawn when not fully transparent return; m_materials[0].DiffuseColor = m_materials[0].EmissiveColor = m_star_color.toSColor(); From 9bb381ebd387cd783da8d582949bf284a29d9b3a Mon Sep 17 00:00:00 2001 From: sfan5 Date: Thu, 26 Nov 2020 22:19:46 +0100 Subject: [PATCH 176/177] Change typedef to normal definitions in GUI code --- src/gui/guiEngine.h | 10 +++++----- src/gui/guiFormSpecMenu.h | 18 +++++++++--------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/gui/guiEngine.h b/src/gui/guiEngine.h index e5b3edce7..eef1ad8aa 100644 --- a/src/gui/guiEngine.h +++ b/src/gui/guiEngine.h @@ -29,22 +29,22 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/enriched_string.h" /******************************************************************************/ -/* Typedefs and macros */ +/* Structs and macros */ /******************************************************************************/ /** texture layer ids */ -typedef enum { +enum texture_layer { TEX_LAYER_BACKGROUND = 0, TEX_LAYER_OVERLAY, TEX_LAYER_HEADER, TEX_LAYER_FOOTER, TEX_LAYER_MAX -} texture_layer; +}; -typedef struct { +struct image_definition { video::ITexture *texture = nullptr; bool tile; unsigned int minsize; -} image_definition; +}; /******************************************************************************/ /* forward declarations */ diff --git a/src/gui/guiFormSpecMenu.h b/src/gui/guiFormSpecMenu.h index 53076e3bd..37106cb65 100644 --- a/src/gui/guiFormSpecMenu.h +++ b/src/gui/guiFormSpecMenu.h @@ -41,7 +41,7 @@ class Client; class GUIScrollContainer; class ISoundManager; -typedef enum { +enum FormspecFieldType { f_Button, f_Table, f_TabHeader, @@ -53,13 +53,13 @@ typedef enum { f_HyperText, f_AnimatedImage, f_Unknown -} FormspecFieldType; +}; -typedef enum { +enum FormspecQuitMode { quit_mode_no, quit_mode_accept, quit_mode_cancel -} FormspecQuitMode; +}; struct TextDest { @@ -356,7 +356,7 @@ private: JoystickController *m_joystick; bool m_show_debug = false; - typedef struct { + struct parserData { bool explicit_size; bool real_coordinates; u8 simple_field_count; @@ -384,16 +384,16 @@ private: // used to restore table selection/scroll/treeview state std::unordered_map table_dyndata; - } parserData; + }; - typedef struct { + struct fs_key_pending { bool key_up; bool key_down; bool key_enter; bool key_escape; - } fs_key_pendig; + }; - fs_key_pendig current_keys_pending; + fs_key_pending current_keys_pending; std::string current_field_enter_pending = ""; std::vector m_hovered_item_tooltips; From f1d72d212a0661588be27003069abf4bd8092e55 Mon Sep 17 00:00:00 2001 From: Lars Date: Sun, 15 Nov 2020 22:58:57 -0800 Subject: [PATCH 177/177] Avoid generating the same chunk more than once with multiple emerge threads. --- src/emerge.h | 1 - src/map.cpp | 5 ++++- src/map.h | 1 + src/mapgen/mapgen_carpathian.cpp | 6 ------ src/mapgen/mapgen_flat.cpp | 6 ------ src/mapgen/mapgen_fractal.cpp | 6 ------ src/mapgen/mapgen_singlenode.cpp | 6 ------ src/mapgen/mapgen_v5.cpp | 6 ------ src/mapgen/mapgen_v6.cpp | 6 ------ src/mapgen/mapgen_v7.cpp | 6 ------ src/mapgen/mapgen_valleys.cpp | 6 ------ 11 files changed, 5 insertions(+), 50 deletions(-) diff --git a/src/emerge.h b/src/emerge.h index 6f204666d..da845e243 100644 --- a/src/emerge.h +++ b/src/emerge.h @@ -52,7 +52,6 @@ struct BlockMakeData { u64 seed = 0; v3s16 blockpos_min; v3s16 blockpos_max; - v3s16 blockpos_requested; UniqueQueue transforming_liquid; const NodeDefManager *nodedef = nullptr; diff --git a/src/map.cpp b/src/map.cpp index ef7eddb39..37b6e9b6b 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -1345,6 +1345,9 @@ bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data) v3s16 bpmin = EmergeManager::getContainingChunk(blockpos, csize); v3s16 bpmax = bpmin + v3s16(1, 1, 1) * (csize - 1); + if (!m_chunks_in_progress.insert(bpmin).second) + return false; + bool enable_mapgen_debug_info = m_emerge->enable_mapgen_debug_info; EMERGE_DBG_OUT("initBlockMake(): " PP(bpmin) " - " PP(bpmax)); @@ -1360,7 +1363,6 @@ bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data) data->seed = getSeed(); data->blockpos_min = bpmin; data->blockpos_max = bpmax; - data->blockpos_requested = blockpos; data->nodedef = m_nodedef; /* @@ -1482,6 +1484,7 @@ void ServerMap::finishBlockMake(BlockMakeData *data, NOTE: Will be saved later. */ //save(MOD_STATE_WRITE_AT_UNLOAD); + m_chunks_in_progress.erase(bpmin); } MapSector *ServerMap::createSector(v2s16 p2d) diff --git a/src/map.h b/src/map.h index b28f34db3..3bc30c482 100644 --- a/src/map.h +++ b/src/map.h @@ -423,6 +423,7 @@ private: // Chunks core::map m_chunks; #endif + std::set m_chunks_in_progress; /* Metadata is re-written on disk only if this is true. diff --git a/src/mapgen/mapgen_carpathian.cpp b/src/mapgen/mapgen_carpathian.cpp index 74ed263ba..b3a0bd270 100644 --- a/src/mapgen/mapgen_carpathian.cpp +++ b/src/mapgen/mapgen_carpathian.cpp @@ -260,12 +260,6 @@ void MapgenCarpathian::makeChunk(BlockMakeData *data) // Pre-conditions assert(data->vmanip); assert(data->nodedef); - assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); - assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); this->generating = true; this->vm = data->vmanip; diff --git a/src/mapgen/mapgen_flat.cpp b/src/mapgen/mapgen_flat.cpp index d62548014..342455029 100644 --- a/src/mapgen/mapgen_flat.cpp +++ b/src/mapgen/mapgen_flat.cpp @@ -209,12 +209,6 @@ void MapgenFlat::makeChunk(BlockMakeData *data) // Pre-conditions assert(data->vmanip); assert(data->nodedef); - assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); - assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); this->generating = true; this->vm = data->vmanip; diff --git a/src/mapgen/mapgen_fractal.cpp b/src/mapgen/mapgen_fractal.cpp index 3b6bbd6c1..fabb1b2b1 100644 --- a/src/mapgen/mapgen_fractal.cpp +++ b/src/mapgen/mapgen_fractal.cpp @@ -209,12 +209,6 @@ void MapgenFractal::makeChunk(BlockMakeData *data) // Pre-conditions assert(data->vmanip); assert(data->nodedef); - assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); - assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); //TimeTaker t("makeChunk"); diff --git a/src/mapgen/mapgen_singlenode.cpp b/src/mapgen/mapgen_singlenode.cpp index cade9e7a8..5382423fa 100644 --- a/src/mapgen/mapgen_singlenode.cpp +++ b/src/mapgen/mapgen_singlenode.cpp @@ -50,12 +50,6 @@ void MapgenSinglenode::makeChunk(BlockMakeData *data) // Pre-conditions assert(data->vmanip); assert(data->nodedef); - assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); - assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); this->generating = true; this->vm = data->vmanip; diff --git a/src/mapgen/mapgen_v5.cpp b/src/mapgen/mapgen_v5.cpp index 0f6a19fa1..87e54755f 100644 --- a/src/mapgen/mapgen_v5.cpp +++ b/src/mapgen/mapgen_v5.cpp @@ -201,12 +201,6 @@ void MapgenV5::makeChunk(BlockMakeData *data) // Pre-conditions assert(data->vmanip); assert(data->nodedef); - assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); - assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); this->generating = true; this->vm = data->vmanip; diff --git a/src/mapgen/mapgen_v6.cpp b/src/mapgen/mapgen_v6.cpp index 90a52e031..e04180f96 100644 --- a/src/mapgen/mapgen_v6.cpp +++ b/src/mapgen/mapgen_v6.cpp @@ -512,12 +512,6 @@ void MapgenV6::makeChunk(BlockMakeData *data) // Pre-conditions assert(data->vmanip); assert(data->nodedef); - assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); - assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); this->generating = true; this->vm = data->vmanip; diff --git a/src/mapgen/mapgen_v7.cpp b/src/mapgen/mapgen_v7.cpp index 6b0779e9f..cc5f5726d 100644 --- a/src/mapgen/mapgen_v7.cpp +++ b/src/mapgen/mapgen_v7.cpp @@ -317,12 +317,6 @@ void MapgenV7::makeChunk(BlockMakeData *data) // Pre-conditions assert(data->vmanip); assert(data->nodedef); - assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); - assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); //TimeTaker t("makeChunk"); diff --git a/src/mapgen/mapgen_valleys.cpp b/src/mapgen/mapgen_valleys.cpp index d7b6f738f..c4234857e 100644 --- a/src/mapgen/mapgen_valleys.cpp +++ b/src/mapgen/mapgen_valleys.cpp @@ -210,12 +210,6 @@ void MapgenValleys::makeChunk(BlockMakeData *data) // Pre-conditions assert(data->vmanip); assert(data->nodedef); - assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); - assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); //TimeTaker t("makeChunk");

    L$DSL_8dtlk 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

Cen21N+!g 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 bKSI6q=s_NX;(>*;oYl1XM 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≧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%0Agya_5Lyzc9$BBbP8=EJd(6CC6*s@*C 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