aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/client.cpp22
-rw-r--r--src/client/client.h8
-rw-r--r--src/client/clientlauncher.cpp1
-rw-r--r--src/client/clientmap.cpp24
-rw-r--r--src/client/clientmap.h6
-rw-r--r--src/client/game.cpp44
-rw-r--r--src/client/localplayer.cpp23
-rw-r--r--src/client/localplayer.h1
-rw-r--r--src/defaultsettings.cpp3
-rw-r--r--src/gameparams.h11
-rw-r--r--src/gui/CMakeLists.txt1
-rw-r--r--src/gui/guiConfirmRegistration.cpp266
-rw-r--r--src/gui/guiConfirmRegistration.h65
-rw-r--r--src/gui/guiMainMenu.h3
-rw-r--r--src/mapgen/mapgen.cpp3
-rw-r--r--src/network/clientpackethandler.cpp19
-rw-r--r--src/noise.cpp3
-rw-r--r--src/porting_android.cpp12
-rw-r--r--src/porting_android.h7
-rw-r--r--src/script/lua_api/l_item.cpp22
-rw-r--r--src/script/lua_api/l_item.h11
-rw-r--r--src/script/lua_api/l_mainmenu.cpp22
-rw-r--r--src/script/lua_api/l_mainmenu.h2
-rw-r--r--src/script/lua_api/l_util.cpp12
-rw-r--r--src/script/lua_api/l_util.h3
-rw-r--r--src/serverenvironment.cpp12
-rw-r--r--src/tool.cpp2
-rw-r--r--src/tool.h1
-rw-r--r--src/unittest/test_noise.cpp54
-rw-r--r--src/util/string.cpp14
30 files changed, 226 insertions, 451 deletions
diff --git a/src/client/client.cpp b/src/client/client.cpp
index 5e31387ab..7337229fb 100644
--- a/src/client/client.cpp
+++ b/src/client/client.cpp
@@ -101,7 +101,8 @@ Client::Client(
MtEventManager *event,
RenderingEngine *rendering_engine,
bool ipv6,
- GameUI *game_ui
+ GameUI *game_ui,
+ ELoginRegister allow_login_or_register
):
m_mesh_update_thread(this),
m_tsrc(tsrc),
@@ -125,7 +126,8 @@ Client::Client(
m_media_downloader(new ClientMediaDownloader()),
m_state(LC_Created),
m_game_ui(game_ui),
- m_modchannel_mgr(new ModChannelMgr())
+ m_modchannel_mgr(new ModChannelMgr()),
+ m_allow_login_or_register(allow_login_or_register)
{
// Add local player
m_env.setLocalPlayer(new LocalPlayer(this, playername));
@@ -399,10 +401,6 @@ void Client::step(float dtime)
initial_step = false;
}
else if(m_state == LC_Created) {
- if (m_is_registration_confirmation_state) {
- // Waiting confirmation
- return;
- }
float &counter = m_connection_reinit_timer;
counter -= dtime;
if(counter <= 0.0) {
@@ -1081,18 +1079,6 @@ void Client::sendInit(const std::string &playerName)
Send(&pkt);
}
-void Client::promptConfirmRegistration(AuthMechanism chosen_auth_mechanism)
-{
- m_chosen_auth_mech = chosen_auth_mechanism;
- m_is_registration_confirmation_state = true;
-}
-
-void Client::confirmRegistration()
-{
- m_is_registration_confirmation_state = false;
- startAuth(m_chosen_auth_mech);
-}
-
void Client::startAuth(AuthMechanism chosen_auth_mechanism)
{
m_chosen_auth_mech = chosen_auth_mechanism;
diff --git a/src/client/client.h b/src/client/client.h
index d49f2f9ad..c1b8cfbaa 100644
--- a/src/client/client.h
+++ b/src/client/client.h
@@ -37,6 +37,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "mesh_generator_thread.h"
#include "network/address.h"
#include "network/peerhandler.h"
+#include "gameparams.h"
#include <fstream>
#define CLIENT_CHAT_MESSAGE_LIMIT_PER_10S 10.0f
@@ -126,7 +127,8 @@ public:
MtEventManager *event,
RenderingEngine *rendering_engine,
bool ipv6,
- GameUI *game_ui
+ GameUI *game_ui,
+ ELoginRegister allow_login_or_register
);
~Client();
@@ -348,8 +350,7 @@ public:
u16 getProtoVersion()
{ return m_proto_ver; }
- void confirmRegistration();
- bool m_is_registration_confirmation_state = false;
+ ELoginRegister m_allow_login_or_register = ELoginRegister::Any;
bool m_simple_singleplayer_mode;
float mediaReceiveProgress();
@@ -467,7 +468,6 @@ private:
static AuthMechanism choseAuthMech(const u32 mechs);
void sendInit(const std::string &playerName);
- void promptConfirmRegistration(AuthMechanism chosen_auth_mechanism);
void startAuth(AuthMechanism chosen_auth_mechanism);
void sendDeletedBlocks(std::vector<v3s16> &blocks);
void sendGotBlocks(const std::vector<v3s16> &blocks);
diff --git a/src/client/clientlauncher.cpp b/src/client/clientlauncher.cpp
index 54c561d11..60c9525f3 100644
--- a/src/client/clientlauncher.cpp
+++ b/src/client/clientlauncher.cpp
@@ -451,6 +451,7 @@ bool ClientLauncher::launch_game(std::string &error_message,
start_data.name = menudata.name;
start_data.password = menudata.password;
start_data.address = std::move(menudata.address);
+ start_data.allow_login_or_register = menudata.allow_login_or_register;
server_name = menudata.servername;
server_description = menudata.serverdescription;
diff --git a/src/client/clientmap.cpp b/src/client/clientmap.cpp
index 85b765709..3a89b8803 100644
--- a/src/client/clientmap.cpp
+++ b/src/client/clientmap.cpp
@@ -219,13 +219,11 @@ void ClientMap::updateDrawList()
// Number of blocks occlusion culled
u32 blocks_occlusion_culled = 0;
- // No occlusion culling when free_move is on and camera is
- // inside ground
+ // No occlusion culling when free_move is on and camera is inside ground
bool occlusion_culling_enabled = true;
- if ((g_settings->getBool("free_move") && g_settings->getBool("noclip")) || g_settings->getBool("freecam")) {
+ if (m_control.allow_noclip || g_settings->getBool("freecam")) {
MapNode n = getNode(cam_pos_nodes);
- if (n.getContent() == CONTENT_IGNORE ||
- m_nodedef->get(n).solidness == 2)
+ if (n.getContent() == CONTENT_IGNORE || m_nodedef->get(n).solidness == 2)
occlusion_culling_enabled = false;
}
@@ -678,19 +676,17 @@ void ClientMap::renderPostFx(CameraMode cam_mode)
MapNode n = getNode(floatToInt(m_camera_position, BS));
- // - If the player is in a solid node, make everything black.
- // - If the player is in liquid, draw a semi-transparent overlay.
- // - Do not if player is in third person mode
const ContentFeatures& features = m_nodedef->get(n);
video::SColor post_effect_color = features.post_effect_color;
- if(features.solidness == 2 && !((g_settings->getBool("noclip") || g_settings->getBool("freecam")) &&
- (m_client->checkLocalPrivilege("noclip") || g_settings->getBool("freecam"))) &&
- cam_mode == CAMERA_MODE_FIRST)
- {
+
+ // If the camera is in a solid node, make everything black.
+ // (first person mode only)
+ if (features.solidness == 2 && cam_mode == CAMERA_MODE_FIRST &&
+ !(m_control.allow_noclip || g_settings->getBool("freecam"))) {
post_effect_color = video::SColor(255, 0, 0, 0);
}
- if (post_effect_color.getAlpha() != 0)
- {
+
+ if (post_effect_color.getAlpha() != 0) {
// Draw a full-screen rectangle
video::IVideoDriver* driver = SceneManager->getVideoDriver();
v2u32 ss = driver->getScreenSize();
diff --git a/src/client/clientmap.h b/src/client/clientmap.h
index 823870c68..8c45b5382 100644
--- a/src/client/clientmap.h
+++ b/src/client/clientmap.h
@@ -27,10 +27,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
struct MapDrawControl
{
- // Overrides limits by drawing everything
- bool range_all = false;
// Wanted drawing range
float wanted_range = 0.0f;
+ // Overrides limits by drawing everything
+ bool range_all = false;
+ // Allow rendering out of bounds
+ bool allow_noclip = false;
// show a wire frame for debugging
bool show_wireframe = false;
};
diff --git a/src/client/game.cpp b/src/client/game.cpp
index e439d0e32..888191f4a 100644
--- a/src/client/game.cpp
+++ b/src/client/game.cpp
@@ -43,7 +43,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "gameparams.h"
#include "gettext.h"
#include "gui/guiChatConsole.h"
-#include "gui/guiConfirmRegistration.h"
#include "gui/guiFormSpecMenu.h"
#include "gui/guiKeyChangeMenu.h"
#include "gui/guiPasswordChange.h"
@@ -675,7 +674,8 @@ bool Game::connectToServer(const GameStartData &start_data,
start_data.password, start_data.address,
*draw_control, texture_src, shader_src,
itemdef_manager, nodedef_manager, sound, eventmgr,
- m_rendering_engine, connect_address.isIPv6(), m_game_ui.get());
+ m_rendering_engine, connect_address.isIPv6(), m_game_ui.get(),
+ start_data.allow_login_or_register);
client->migrateModStorage();
} catch (const BaseException &e) {
*error_message = fmtgettext("Error creating client: %s", e.what());
@@ -738,28 +738,16 @@ bool Game::connectToServer(const GameStartData &start_data,
break;
}
- if (client->m_is_registration_confirmation_state) {
- if (registration_confirmation_shown) {
- // Keep drawing the GUI
- m_rendering_engine->draw_menu_scene(guienv, dtime, true);
- } else {
- registration_confirmation_shown = true;
- (new GUIConfirmRegistration(guienv, guienv->getRootGUIElement(), -1,
- &g_menumgr, client, start_data.name, start_data.password,
- connection_aborted, texture_src))->drop();
- }
- } else {
- wait_time += dtime;
- // Only time out if we aren't waiting for the server we started
- if (!start_data.address.empty() && wait_time > 10) {
- *error_message = gettext("Connection timed out.");
- errorstream << *error_message << std::endl;
- break;
- }
-
- // Update status
- showOverlayMessage(N_("Connecting to server..."), dtime, 20);
+ wait_time += dtime;
+ // Only time out if we aren't waiting for the server we started
+ if (!start_data.address.empty() && wait_time > 10) {
+ *error_message = gettext("Connection timed out.");
+ errorstream << *error_message << std::endl;
+ break;
}
+
+ // Update status
+ showOverlayMessage(N_("Connecting to server..."), dtime, 20);
}
} catch (con::PeerNotFoundException &e) {
// TODO: Should something be done here? At least an info/error
@@ -938,6 +926,8 @@ void Game::processQueues()
void Game::updateDebugState()
{
LocalPlayer *player = client->getEnv().getLocalPlayer();
+
+ // debug UI and wireframe
bool has_debug = client->checkPrivilege("debug");
bool has_basic_debug = has_debug || (player->hud_flags & HUD_FLAG_BASIC_DEBUG);
@@ -952,6 +942,9 @@ void Game::updateDebugState()
hud->disableBlockBounds();
if (!has_debug)
draw_control->show_wireframe = false;
+
+ // noclip
+ draw_control->allow_noclip = m_cache_enable_noclip && client->checkPrivilege("noclip");
}
void Game::updateProfilers(const RunStats &stats, const FpsControl &draw_times,
@@ -3047,7 +3040,10 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
float direct_brightness;
bool sunlight_seen;
- if ((m_cache_enable_noclip && m_cache_enable_free_move) || g_settings->getBool("freecam")) {
+ // When in noclip mode force same sky brightness as above ground so you
+ // can see properly
+ if ((draw_control->allow_noclip && m_cache_enable_free_move &&
+ client->checkPrivilege("fly")) || g_settings->getBool("freecam")) {
direct_brightness = time_brightness;
sunlight_seen = true;
} else {
diff --git a/src/client/localplayer.cpp b/src/client/localplayer.cpp
index c4d9b9845..aeccc5c7d 100644
--- a/src/client/localplayer.cpp
+++ b/src/client/localplayer.cpp
@@ -450,16 +450,6 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d,
camera_impact = getSpeed().Y * -1;
}
- {
- camera_barely_in_ceiling = false;
- v3s16 camera_np = floatToInt(getEyePosition(), BS);
- MapNode n = map->getNode(camera_np);
- if (n.getContent() != CONTENT_IGNORE) {
- if (nodemgr->get(n).walkable && nodemgr->get(n).solidness == 2)
- camera_barely_in_ceiling = true;
- }
- }
-
/*
Check properties of the node on which the player is standing
*/
@@ -730,8 +720,7 @@ v3f LocalPlayer::getSendSpeed()
v3f LocalPlayer::getEyeOffset() const
{
- float eye_height = camera_barely_in_ceiling ? m_eye_height - 0.125f : m_eye_height;
- return v3f(0.0f, BS * eye_height, 0.0f);
+ return v3f(0.0f, BS * m_eye_height, 0.0f);
}
ClientActiveObject *LocalPlayer::getParent() const
@@ -1071,16 +1060,6 @@ void LocalPlayer::old_move(f32 dtime, Environment *env, f32 pos_max_d,
camera_impact = getSpeed().Y * -1.0f;
}
- {
- camera_barely_in_ceiling = false;
- v3s16 camera_np = floatToInt(getEyePosition(), BS);
- MapNode n = map->getNode(camera_np);
- if (n.getContent() != CONTENT_IGNORE) {
- if (nodemgr->get(n).walkable && nodemgr->get(n).solidness == 2)
- camera_barely_in_ceiling = true;
- }
- }
-
/*
Update the node last under the player
*/
diff --git a/src/client/localplayer.h b/src/client/localplayer.h
index ebc67c4f8..271589c59 100644
--- a/src/client/localplayer.h
+++ b/src/client/localplayer.h
@@ -237,7 +237,6 @@ private:
u16 m_breath = PLAYER_MAX_BREATH_DEFAULT;
f32 m_yaw = 0.0f;
f32 m_pitch = 0.0f;
- bool camera_barely_in_ceiling = false;
aabb3f m_collisionbox = aabb3f(-BS * 0.30f, 0.0f, -BS * 0.30f, BS * 0.30f,
BS * 1.75f, BS * 0.30f);
float m_eye_height = 1.625f;
diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp
index 9224d99ed..c3fe02038 100644
--- a/src/defaultsettings.cpp
+++ b/src/defaultsettings.cpp
@@ -64,7 +64,7 @@ void set_default_settings()
settings->setDefault("enable_client_modding", "true");
settings->setDefault("max_out_chat_queue_size", "20");
settings->setDefault("pause_on_lost_focus", "false");
- settings->setDefault("enable_register_confirmation", "true");
+ settings->setDefault("enable_split_login_register", "true");
settings->setDefault("chat_weblink_color", "#8888FF");
// Cheat Menu
@@ -526,7 +526,6 @@ void set_default_settings()
// Altered settings for macOS
#if defined(__MACH__) && defined(__APPLE__)
settings->setDefault("keymap_sneak", "KEY_SHIFT");
- settings->setDefault("fps_max", "0");
#endif
#ifdef HAVE_TOUCHSCREENGUI
diff --git a/src/gameparams.h b/src/gameparams.h
index 70b0ffcde..b138f8771 100644
--- a/src/gameparams.h
+++ b/src/gameparams.h
@@ -20,8 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#pragma once
#include "irrlichttypes.h"
-
-struct SubgameSpec;
+#include "content/subgames.h"
// Information provided from "main"
struct GameParams
@@ -34,6 +33,12 @@ struct GameParams
bool is_dedicated_server;
};
+enum class ELoginRegister {
+ Any = 0,
+ Login,
+ Register
+};
+
// Information processed by main menu
struct GameStartData : GameParams
{
@@ -46,6 +51,8 @@ struct GameStartData : GameParams
std::string address;
bool local_server;
+ ELoginRegister allow_login_or_register = ELoginRegister::Any;
+
// "world_path" must be kept in sync!
WorldSpec world_spec;
};
diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt
index a5f25c0f3..87110d2cd 100644
--- a/src/gui/CMakeLists.txt
+++ b/src/gui/CMakeLists.txt
@@ -12,7 +12,6 @@ set(gui_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/guiButtonImage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiButtonItemImage.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiChatConsole.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/guiConfirmRegistration.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiEditBox.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiEditBoxWithScrollbar.cpp
${CMAKE_CURRENT_SOURCE_DIR}/guiEngine.cpp
diff --git a/src/gui/guiConfirmRegistration.cpp b/src/gui/guiConfirmRegistration.cpp
deleted file mode 100644
index c5aa9c85e..000000000
--- a/src/gui/guiConfirmRegistration.cpp
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
-Minetest
-Copyright (C) 2018 srifqi, Muhammad Rifqi Priyo Susanto
- <muhammadrifqipriyosusanto@gmail.com>
-
-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 "guiConfirmRegistration.h"
-#include "client/client.h"
-#include "guiButton.h"
-#include <IGUICheckBox.h>
-#include <IGUIButton.h>
-#include <IGUIStaticText.h>
-#include <IGUIFont.h>
-#include "guiEditBoxWithScrollbar.h"
-#include "porting.h"
-
-#ifdef HAVE_TOUCHSCREENGUI
- #include "client/renderingengine.h"
-#endif
-
-#include "gettext.h"
-
-// Continuing from guiPasswordChange.cpp
-const int ID_confirmPassword = 262;
-const int ID_confirm = 263;
-const int ID_intotext = 264;
-const int ID_cancel = 265;
-const int ID_message = 266;
-
-GUIConfirmRegistration::GUIConfirmRegistration(gui::IGUIEnvironment *env,
- gui::IGUIElement *parent, s32 id, IMenuManager *menumgr, Client *client,
- const std::string &playername, const std::string &password,
- bool *aborted, ISimpleTextureSource *tsrc) :
- GUIModalMenu(env, parent, id, menumgr),
- m_client(client), m_playername(playername), m_password(password),
- m_aborted(aborted), m_tsrc(tsrc)
-{
-#ifdef HAVE_TOUCHSCREENGUI
- m_touchscreen_visible = false;
-#endif
-}
-
-void GUIConfirmRegistration::regenerateGui(v2u32 screensize)
-{
- acceptInput();
- removeAllChildren();
-
- /*
- Calculate new sizes and positions
- */
-#ifdef HAVE_TOUCHSCREENGUI
- const float s = m_gui_scale * RenderingEngine::getDisplayDensity() / 2;
-#else
- const float s = m_gui_scale;
-#endif
- DesiredRect = core::rect<s32>(
- screensize.X / 2 - 600 * s / 2,
- screensize.Y / 2 - 360 * s / 2,
- screensize.X / 2 + 600 * s / 2,
- screensize.Y / 2 + 360 * s / 2
- );
- recalculateAbsolutePosition(false);
-
- v2s32 size = DesiredRect.getSize();
- v2s32 topleft_client(0, 0);
-
- const wchar_t *text;
-
- /*
- Add stuff
- */
- s32 ypos = 30 * s;
- {
- core::rect<s32> rect2(0, 0, 540 * s, 180 * s);
- rect2 += topleft_client + v2s32(30 * s, ypos);
- static const std::string info_text_template = strgettext(
- "You are about to join this server with the name \"%s\" for the "
- "first time.\n"
- "If you proceed, a new account using your credentials will be "
- "created on this server.\n"
- "Please retype your password and click 'Register and Join' to "
- "confirm account creation, or click 'Cancel' to abort.");
- char info_text_buf[1024];
- porting::mt_snprintf(info_text_buf, sizeof(info_text_buf),
- info_text_template.c_str(), m_playername.c_str());
-
- std::wstring info_text_w = utf8_to_wide(info_text_buf);
- gui::IGUIEditBox *e = new GUIEditBoxWithScrollBar(info_text_w.c_str(),
- true, Environment, this, ID_intotext, rect2, false, true);
- e->drop();
- e->setMultiLine(true);
- e->setWordWrap(true);
- e->setTextAlignment(gui::EGUIA_UPPERLEFT, gui::EGUIA_CENTER);
- }
-
- ypos += 200 * s;
- {
- core::rect<s32> rect2(0, 0, 540 * s, 30 * s);
- rect2 += topleft_client + v2s32(30 * s, ypos);
- gui::IGUIEditBox *e = Environment->addEditBox(m_pass_confirm.c_str(),
- rect2, true, this, ID_confirmPassword);
- e->setPasswordBox(true);
- Environment->setFocus(e);
- }
-
- ypos += 50 * s;
- {
- core::rect<s32> rect2(0, 0, 230 * s, 35 * s);
- rect2 = rect2 + v2s32(size.X / 2 - 220 * s, ypos);
- text = wgettext("Register and Join");
- GUIButton::addButton(Environment, rect2, m_tsrc, this, ID_confirm, text);
- delete[] text;
- }
- {
- core::rect<s32> rect2(0, 0, 120 * s, 35 * s);
- rect2 = rect2 + v2s32(size.X / 2 + 70 * s, ypos);
- text = wgettext("Cancel");
- GUIButton::addButton(Environment, rect2, m_tsrc, this, ID_cancel, text);
- delete[] text;
- }
- {
- core::rect<s32> rect2(0, 0, 500 * s, 40 * s);
- rect2 += topleft_client + v2s32(30 * s, ypos + 40 * s);
- text = wgettext("Passwords do not match!");
- IGUIElement *e = Environment->addStaticText(
- text, rect2, false, true, this, ID_message);
- e->setVisible(false);
- delete[] text;
- }
-}
-
-void GUIConfirmRegistration::drawMenu()
-{
- gui::IGUISkin *skin = Environment->getSkin();
- if (!skin)
- return;
- video::IVideoDriver *driver = Environment->getVideoDriver();
-
- video::SColor bgcolor(140, 0, 0, 0);
- driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);
-
- gui::IGUIElement::draw();
-#ifdef __ANDROID__
- getAndroidUIInput();
-#endif
-}
-
-void GUIConfirmRegistration::closeMenu(bool goNext)
-{
- if (goNext) {
- m_client->confirmRegistration();
- } else {
- *m_aborted = true;
- infostream << "Connect aborted [Escape]" << std::endl;
- }
- quitMenu();
-}
-
-void GUIConfirmRegistration::acceptInput()
-{
- gui::IGUIElement *e;
- e = getElementFromId(ID_confirmPassword);
- if (e)
- m_pass_confirm = e->getText();
-}
-
-bool GUIConfirmRegistration::processInput()
-{
- if (utf8_to_wide(m_password) != m_pass_confirm) {
- gui::IGUIElement *e = getElementFromId(ID_message);
- if (e)
- e->setVisible(true);
- return false;
- }
- return true;
-}
-
-bool GUIConfirmRegistration::OnEvent(const SEvent &event)
-{
- if (event.EventType == EET_KEY_INPUT_EVENT) {
- // clang-format off
- if ((event.KeyInput.Key == KEY_ESCAPE ||
- event.KeyInput.Key == KEY_CANCEL) &&
- event.KeyInput.PressedDown) {
- closeMenu(false);
- return true;
- }
- // clang-format on
- if (event.KeyInput.Key == KEY_RETURN && event.KeyInput.PressedDown) {
- acceptInput();
- if (processInput())
- closeMenu(true);
- return true;
- }
- }
-
- if (event.EventType != EET_GUI_EVENT)
- return Parent ? Parent->OnEvent(event) : false;
-
- if (event.GUIEvent.EventType == gui::EGET_ELEMENT_FOCUS_LOST && isVisible()) {
- if (!canTakeFocus(event.GUIEvent.Element)) {
- infostream << "GUIConfirmRegistration: Not allowing focus change."
- << std::endl;
- // Returning true disables focus change
- return true;
- }
- } else if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED) {
- switch (event.GUIEvent.Caller->getID()) {
- case ID_confirm:
- acceptInput();
- if (processInput())
- closeMenu(true);
- return true;
- case ID_cancel:
- closeMenu(false);
- return true;
- }
- } else if (event.GUIEvent.EventType == gui::EGET_EDITBOX_ENTER) {
- switch (event.GUIEvent.Caller->getID()) {
- case ID_confirmPassword:
- acceptInput();
- if (processInput())
- closeMenu(true);
- return true;
- }
- }
-
- return false;
-}
-
-#ifdef __ANDROID__
-bool GUIConfirmRegistration::getAndroidUIInput()
-{
- if (!hasAndroidUIInput() || m_jni_field_name != "password")
- return false;
-
- // 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/guiConfirmRegistration.h b/src/gui/guiConfirmRegistration.h
deleted file mode 100644
index fb2157756..000000000
--- a/src/gui/guiConfirmRegistration.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
-Minetest
-Copyright (C) 2018 srifqi, Muhammad Rifqi Priyo Susanto
- <muhammadrifqipriyosusanto@gmail.com>
-
-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 "modalMenu.h"
-#include <string>
-
-class Client;
-class ISimpleTextureSource;
-
-class GUIConfirmRegistration : public GUIModalMenu
-{
-public:
- GUIConfirmRegistration(gui::IGUIEnvironment *env, gui::IGUIElement *parent,
- s32 id, IMenuManager *menumgr, Client *client,
- const std::string &playername, const std::string &password,
- bool *aborted, ISimpleTextureSource *tsrc);
- /*
- Remove and re-add (or reposition) stuff
- */
- void regenerateGui(v2u32 screensize);
-
- void drawMenu();
-
- void closeMenu(bool goNext);
-
- void acceptInput();
-
- bool processInput();
-
- bool OnEvent(const SEvent &event);
-#ifdef __ANDROID__
- bool getAndroidUIInput();
-#endif
-
-private:
- std::wstring getLabelByID(s32 id) { return L""; }
- std::string getNameByID(s32 id) { return "password"; }
-
- Client *m_client = nullptr;
- const std::string &m_playername;
- const std::string &m_password;
- bool *m_aborted = nullptr;
- std::wstring m_pass_confirm = L"";
- ISimpleTextureSource *m_tsrc;
-};
diff --git a/src/gui/guiMainMenu.h b/src/gui/guiMainMenu.h
index 1dca8bf2d..9b8ff383c 100644
--- a/src/gui/guiMainMenu.h
+++ b/src/gui/guiMainMenu.h
@@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#pragma once
#include "irrlichttypes_extrabloated.h"
+#include "gameparams.h"
#include <string>
#include <list>
@@ -50,5 +51,7 @@ struct MainMenuData {
// Data to be passed to the script
MainMenuDataForScript script_data;
+ ELoginRegister allow_login_or_register = ELoginRegister::Any;
+
MainMenuData() = default;
};
diff --git a/src/mapgen/mapgen.cpp b/src/mapgen/mapgen.cpp
index d767bd264..1f2ac491e 100644
--- a/src/mapgen/mapgen.cpp
+++ b/src/mapgen/mapgen.cpp
@@ -238,7 +238,8 @@ u32 Mapgen::getBlockSeed(v3s16 p, s32 seed)
u32 Mapgen::getBlockSeed2(v3s16 p, s32 seed)
{
- u32 n = 1619 * p.X + 31337 * p.Y + 52591 * p.Z + 1013 * seed;
+ // Multiply by unsigned number to avoid signed overflow (UB)
+ u32 n = 1619U * p.X + 31337U * p.Y + 52591U * p.Z + 1013U * seed;
n = (n >> 13) ^ n;
return (n * (n * n * 60493 + 19990303) + 1376312589);
}
diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp
index 29e3364db..1f17470af 100644
--- a/src/network/clientpackethandler.cpp
+++ b/src/network/clientpackethandler.cpp
@@ -103,11 +103,20 @@ void Client::handleCommand_Hello(NetworkPacket* pkt)
// Authenticate using that method, or abort if there wasn't any method found
if (chosen_auth_mechanism != AUTH_MECHANISM_NONE) {
- if (chosen_auth_mechanism == AUTH_MECHANISM_FIRST_SRP &&
- !m_simple_singleplayer_mode &&
- !getServerAddress().isLocalhost() &&
- g_settings->getBool("enable_register_confirmation")) {
- promptConfirmRegistration(chosen_auth_mechanism);
+ bool is_register = chosen_auth_mechanism == AUTH_MECHANISM_FIRST_SRP;
+ ELoginRegister mode = is_register ? ELoginRegister::Register : ELoginRegister::Login;
+ if (m_allow_login_or_register != ELoginRegister::Any &&
+ m_allow_login_or_register != mode) {
+ m_chosen_auth_mech = AUTH_MECHANISM_NONE;
+ m_access_denied = true;
+ if (m_allow_login_or_register == ELoginRegister::Login) {
+ m_access_denied_reason =
+ gettext("Name is not registered. To create an account on this server, click 'Register'");
+ } else {
+ m_access_denied_reason =
+ gettext("Name is taken. Please choose another name");
+ }
+ m_con->Disconnect();
} else {
startAuth(chosen_auth_mechanism);
}
diff --git a/src/noise.cpp b/src/noise.cpp
index 2f4de6855..d98d4dafb 100644
--- a/src/noise.cpp
+++ b/src/noise.cpp
@@ -35,7 +35,8 @@
#define NOISE_MAGIC_X 1619
#define NOISE_MAGIC_Y 31337
#define NOISE_MAGIC_Z 52591
-#define NOISE_MAGIC_SEED 1013
+// Unsigned magic seed prevents undefined behavior.
+#define NOISE_MAGIC_SEED 1013U
typedef float (*Interp2dFxn)(
float v00, float v10, float v01, float v11,
diff --git a/src/porting_android.cpp b/src/porting_android.cpp
index c71fe5ad8..83b590b99 100644
--- a/src/porting_android.cpp
+++ b/src/porting_android.cpp
@@ -213,6 +213,18 @@ void openURIAndroid(const std::string &url)
jnienv->CallVoidMethod(app_global->activity->clazz, url_open, jurl);
}
+void shareFileAndroid(const std::string &path)
+{
+ jmethodID url_open = jnienv->GetMethodID(nativeActivity, "shareFile",
+ "(Ljava/lang/String;)V");
+
+ FATAL_ERROR_IF(url_open == nullptr,
+ "porting::shareFileAndroid unable to find java openURI method");
+
+ jstring jurl = jnienv->NewStringUTF(path.c_str());
+ jnienv->CallVoidMethod(app_global->activity->clazz, url_open, jurl);
+}
+
int getInputDialogState()
{
jmethodID dialogstate = jnienv->GetMethodID(nativeActivity,
diff --git a/src/porting_android.h b/src/porting_android.h
index 239815922..265825fbd 100644
--- a/src/porting_android.h
+++ b/src/porting_android.h
@@ -61,6 +61,13 @@ void showInputDialog(const std::string &acceptButton,
void openURIAndroid(const std::string &url);
/**
+ * Opens a share intent to the file at path
+ *
+ * @param path
+ */
+void shareFileAndroid(const std::string &path);
+
+/**
* WORKAROUND for not working callbacks from java -> c++
* get current state of input dialog
*/
diff --git a/src/script/lua_api/l_item.cpp b/src/script/lua_api/l_item.cpp
index bae6701a0..160bb4e83 100644
--- a/src/script/lua_api/l_item.cpp
+++ b/src/script/lua_api/l_item.cpp
@@ -348,7 +348,7 @@ int LuaItemStack::l_get_tool_capabilities(lua_State *L)
}
// add_wear(self, amount) -> true/false
-// The range for "amount" is [0,65535]. Wear is only added if the item
+// The range for "amount" is [0,65536]. Wear is only added if the item
// is a tool. Adding wear might destroy the item.
// Returns true if the item is (or was) a tool.
int LuaItemStack::l_add_wear(lua_State *L)
@@ -362,6 +362,25 @@ int LuaItemStack::l_add_wear(lua_State *L)
return 1;
}
+// add_wear_by_uses(self, max_uses) -> true/false
+// The range for "max_uses" is [0,65536].
+// Adds wear to the item in such a way that, if
+// only this function is called to add wear, the item
+// will be destroyed exactly after `max_uses` times of calling it.
+// No-op if `max_uses` is 0 or item is not a tool.
+// Returns true if the item is (or was) a tool.
+int LuaItemStack::l_add_wear_by_uses(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+ LuaItemStack *o = checkobject(L, 1);
+ ItemStack &item = o->m_stack;
+ u32 max_uses = readParam<int>(L, 2);
+ u32 add_wear = calculateResultWear(max_uses, item.wear);
+ bool result = item.addWear(add_wear, getGameDef(L)->idef());
+ lua_pushboolean(L, result);
+ return 1;
+}
+
// add_item(self, itemstack or itemstring or table or nil) -> itemstack
// Returns leftover item stack
int LuaItemStack::l_add_item(lua_State *L)
@@ -537,6 +556,7 @@ const luaL_Reg LuaItemStack::methods[] = {
luamethod(LuaItemStack, get_definition),
luamethod(LuaItemStack, get_tool_capabilities),
luamethod(LuaItemStack, add_wear),
+ luamethod(LuaItemStack, add_wear_by_uses),
luamethod(LuaItemStack, add_item),
luamethod(LuaItemStack, item_fits),
luamethod(LuaItemStack, take_item),
diff --git a/src/script/lua_api/l_item.h b/src/script/lua_api/l_item.h
index 180975061..a392555d2 100644
--- a/src/script/lua_api/l_item.h
+++ b/src/script/lua_api/l_item.h
@@ -108,11 +108,20 @@ private:
static int l_get_tool_capabilities(lua_State *L);
// add_wear(self, amount) -> true/false
- // The range for "amount" is [0,65535]. Wear is only added if the item
+ // The range for "amount" is [0,65536]. Wear is only added if the item
// is a tool. Adding wear might destroy the item.
// Returns true if the item is (or was) a tool.
static int l_add_wear(lua_State *L);
+ // add_wear_by_uses(self, max_uses) -> true/false
+ // The range for "max_uses" is [0,65536].
+ // Adds wear to the item in such a way that, if
+ // only this function is called to add wear, the item
+ // will be destroyed exactly after `max_uses` times of calling it.
+ // No-op if `max_uses` is 0 or item is not a tool.
+ // Returns true if the item is (or was) a tool.
+ static int l_add_wear_by_uses(lua_State *L);
+
// add_item(self, itemstack or itemstring or table or nil) -> itemstack
// Returns leftover item stack
static int l_add_item(lua_State *L);
diff --git a/src/script/lua_api/l_mainmenu.cpp b/src/script/lua_api/l_mainmenu.cpp
index 411250a0b..c1530f0d3 100644
--- a/src/script/lua_api/l_mainmenu.cpp
+++ b/src/script/lua_api/l_mainmenu.cpp
@@ -139,6 +139,14 @@ int ModApiMainMenu::l_start(lua_State *L)
data->password = getTextData(L,"password");
data->address = getTextData(L,"address");
data->port = getTextData(L,"port");
+
+ const auto val = getTextData(L, "allow_login_or_register");
+ if (val == "login")
+ data->allow_login_or_register = ELoginRegister::Login;
+ else if (val == "register")
+ data->allow_login_or_register = ELoginRegister::Register;
+ else
+ data->allow_login_or_register = ELoginRegister::Any;
}
data->serverdescription = getTextData(L,"serverdescription");
data->servername = getTextData(L,"servername");
@@ -873,6 +881,19 @@ int ModApiMainMenu::l_open_dir(lua_State *L)
}
/******************************************************************************/
+int ModApiMainMenu::l_share_file(lua_State *L)
+{
+#ifdef __ANDROID__
+ std::string path = luaL_checkstring(L, 1);
+ porting::shareFileAndroid(path);
+ lua_pushboolean(L, true);
+#else
+ lua_pushboolean(L, false);
+#endif
+ return 1;
+}
+
+/******************************************************************************/
int ModApiMainMenu::l_do_async_callback(lua_State *L)
{
MainMenuScripting *script = getScriptApi<MainMenuScripting>(L);
@@ -937,6 +958,7 @@ void ModApiMainMenu::Initialize(lua_State *L, int top)
API_FCT(get_max_supp_proto);
API_FCT(open_url);
API_FCT(open_dir);
+ API_FCT(share_file);
API_FCT(do_async_callback);
}
diff --git a/src/script/lua_api/l_mainmenu.h b/src/script/lua_api/l_mainmenu.h
index 781185425..6ceff6dd7 100644
--- a/src/script/lua_api/l_mainmenu.h
+++ b/src/script/lua_api/l_mainmenu.h
@@ -152,6 +152,8 @@ private:
static int l_open_dir(lua_State *L);
+ static int l_share_file(lua_State *L);
+
// async
static int l_do_async_callback(lua_State *L);
diff --git a/src/script/lua_api/l_util.cpp b/src/script/lua_api/l_util.cpp
index fa749c2e5..44973f968 100644
--- a/src/script/lua_api/l_util.cpp
+++ b/src/script/lua_api/l_util.cpp
@@ -159,6 +159,17 @@ int ModApiUtil::l_write_json(lua_State *L)
return 1;
}
+// get_tool_wear_after_use(uses[, initial_wear])
+int ModApiUtil::l_get_tool_wear_after_use(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+ u32 uses = readParam<int>(L, 1);
+ u16 initial_wear = readParam<int>(L, 2, 0);
+ u16 wear = calculateResultWear(uses, initial_wear);
+ lua_pushnumber(L, wear);
+ return 1;
+}
+
// get_dig_params(groups, tool_capabilities[, wear])
int ModApiUtil::l_get_dig_params(lua_State *L)
{
@@ -586,6 +597,7 @@ void ModApiUtil::Initialize(lua_State *L, int top)
API_FCT(parse_json);
API_FCT(write_json);
+ API_FCT(get_tool_wear_after_use);
API_FCT(get_dig_params);
API_FCT(get_hit_params);
diff --git a/src/script/lua_api/l_util.h b/src/script/lua_api/l_util.h
index cc5563577..ec86c6632 100644
--- a/src/script/lua_api/l_util.h
+++ b/src/script/lua_api/l_util.h
@@ -50,6 +50,9 @@ private:
// write_json(data[, styled])
static int l_write_json(lua_State *L);
+ // get_tool_wear_after_use(uses[, initial_wear])
+ static int l_get_tool_wear_after_use(lua_State *L);
+
// get_dig_params(groups, tool_capabilities[, wear])
static int l_get_dig_params(lua_State *L);
diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp
index 2855f04b8..9da5f98bd 100644
--- a/src/serverenvironment.cpp
+++ b/src/serverenvironment.cpp
@@ -258,23 +258,23 @@ void LBMManager::applyLBMs(ServerEnvironment *env, MapBlock *block, u32 stamp)
v3s16 pos;
MapNode n;
content_t c;
- lbm_lookup_map::const_iterator it = getLBMsIntroducedAfter(stamp);
+ bool pos_valid; // dummy, we know it's valid
+ auto it = getLBMsIntroducedAfter(stamp);
for (; it != m_lbm_lookup.end(); ++it) {
// Cache previous version to speedup lookup which has a very high performance
// penalty on each call
- content_t previous_c{};
- std::vector<LoadingBlockModifierDef *> *lbm_list = nullptr;
+ content_t previous_c = CONTENT_IGNORE;
+ const std::vector<LoadingBlockModifierDef *> *lbm_list = nullptr;
for (pos.X = 0; pos.X < MAP_BLOCKSIZE; pos.X++)
for (pos.Y = 0; pos.Y < MAP_BLOCKSIZE; pos.Y++)
for (pos.Z = 0; pos.Z < MAP_BLOCKSIZE; pos.Z++) {
- n = block->getNodeNoEx(pos);
+ n = block->getNodeNoCheck(pos, &pos_valid);
c = n.getContent();
// If content_t are not matching perform an LBM lookup
if (previous_c != c) {
- lbm_list = (std::vector<LoadingBlockModifierDef *> *)
- it->second.lookup(c);
+ lbm_list = it->second.lookup(c);
previous_c = c;
}
diff --git a/src/tool.cpp b/src/tool.cpp
index 075c6b3c5..821ddf07d 100644
--- a/src/tool.cpp
+++ b/src/tool.cpp
@@ -183,7 +183,7 @@ void ToolCapabilities::deserializeJson(std::istream &is)
}
}
-static u32 calculateResultWear(const u32 uses, const u16 initial_wear)
+u32 calculateResultWear(const u32 uses, const u16 initial_wear)
{
if (uses == 0) {
// Trivial case: Infinite uses
diff --git a/src/tool.h b/src/tool.h
index 8409f59af..c2444a834 100644
--- a/src/tool.h
+++ b/src/tool.h
@@ -142,4 +142,5 @@ PunchDamageResult getPunchDamage(
u16 initial_wear = 0
);
+u32 calculateResultWear(const u32 uses, const u16 initial_wear);
f32 getToolRange(const ItemDefinition &def_selected, const ItemDefinition &def_hand);
diff --git a/src/unittest/test_noise.cpp b/src/unittest/test_noise.cpp
index 421f3b66e..12b155f46 100644
--- a/src/unittest/test_noise.cpp
+++ b/src/unittest/test_noise.cpp
@@ -30,8 +30,14 @@ public:
void runTests(IGameDef *gamedef);
+ void testNoise2dAtOriginWithZeroSeed();
+ void testNoise2dWithMaxSeed();
+ void testNoise2dWithFunPrimes();
void testNoise2dPoint();
void testNoise2dBulk();
+ void testNoise3dAtOriginWithZeroSeed();
+ void testNoise3dWithMaxSeed();
+ void testNoise3dWithFunPrimes();
void testNoise3dPoint();
void testNoise3dBulk();
void testNoiseInvalidParams();
@@ -44,8 +50,14 @@ static TestNoise g_test_instance;
void TestNoise::runTests(IGameDef *gamedef)
{
+ TEST(testNoise2dAtOriginWithZeroSeed);
+ TEST(testNoise2dWithMaxSeed);
+ TEST(testNoise2dWithFunPrimes);
TEST(testNoise2dPoint);
TEST(testNoise2dBulk);
+ TEST(testNoise3dAtOriginWithZeroSeed);
+ TEST(testNoise3dWithMaxSeed);
+ TEST(testNoise3dWithFunPrimes);
TEST(testNoise3dPoint);
TEST(testNoise3dBulk);
TEST(testNoiseInvalidParams);
@@ -53,6 +65,27 @@ void TestNoise::runTests(IGameDef *gamedef)
////////////////////////////////////////////////////////////////////////////////
+void TestNoise::testNoise2dAtOriginWithZeroSeed()
+{
+ float actual{ noise2d(0, 0, 0) };
+ constexpr float expected{ -0.281791f };
+ UASSERT(std::fabs(actual - expected) <= 0.00001);
+}
+
+void TestNoise::testNoise2dWithMaxSeed()
+{
+ float actual{ noise2d(4096, 4096, 2147483647) };
+ constexpr float expected{ 0.950606f };
+ UASSERT(std::fabs(actual - expected) <= 0.00001);
+}
+
+void TestNoise::testNoise2dWithFunPrimes()
+{
+ float actual{ noise2d(-3947, -2333, 7027) };
+ constexpr float expected{ -0.294907f };
+ UASSERT(std::fabs(actual - expected) <= 0.00001);
+}
+
void TestNoise::testNoise2dPoint()
{
NoiseParams np_normal(20, 40, v3f(50, 50, 50), 9, 5, 0.6, 2.0);
@@ -79,6 +112,27 @@ void TestNoise::testNoise2dBulk()
}
}
+void TestNoise::testNoise3dAtOriginWithZeroSeed()
+{
+ float actual{ noise2d(0, 0, 0) };
+ constexpr float expected{ -0.281791f };
+ UASSERT(std::fabs(actual - expected) <= 0.00001);
+}
+
+void TestNoise::testNoise3dWithMaxSeed()
+{
+ float actual{ noise3d(4096, 4096, 4096, 2147483647) };
+ constexpr float expected{ -0.775243f };
+ UASSERT(std::fabs(actual - expected) <= 0.00001);
+}
+
+void TestNoise::testNoise3dWithFunPrimes()
+{
+ float actual{ noise2d(3903, -1723, 7411) };
+ constexpr float expected{ 0.989124f };
+ UASSERT(std::fabs(actual - expected) <= 0.00001);
+}
+
void TestNoise::testNoise3dPoint()
{
NoiseParams np_normal(20, 40, v3f(50, 50, 50), 9, 5, 0.6, 2.0);
diff --git a/src/util/string.cpp b/src/util/string.cpp
index b805b2f78..d70c26015 100644
--- a/src/util/string.cpp
+++ b/src/util/string.cpp
@@ -39,16 +39,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <windows.h>
#endif
-#ifdef __NetBSD__
- #include <sys/param.h>
- #if __NetBSD_Version__ <= 999001500
- #define BSD_ICONV_USED
- #endif
-#elif defined(_ICONV_H_) && (defined(__FreeBSD__) || defined(__OpenBSD__) || \
- defined(__DragonFly__))
- #define BSD_ICONV_USED
-#endif
-
#ifndef _WIN32
static bool convert(const char *to, const char *from, char *outbuf,
@@ -56,11 +46,7 @@ static bool convert(const char *to, const char *from, char *outbuf,
{
iconv_t cd = iconv_open(to, from);
-#ifdef BSD_ICONV_USED
- const char *inbuf_ptr = inbuf;
-#else
char *inbuf_ptr = inbuf;
-#endif
char *outbuf_ptr = outbuf;
size_t *inbuf_left_ptr = &inbuf_size;