Skip to content

Commit

Permalink
fix: float precision in config retrieval (opentibiabr#2889)
Browse files Browse the repository at this point in the history
Description:
This addresses the issue where floating point values
retrieved from the configuration were not being rounded properly,
leading to slight inaccuracies. This fix ensures that all float values
are correctly rounded to two decimal places before being passed to Lua,
thereby ensuring consistent behavior and data accuracy.

Expected behavior:
With the implemented changes, when floating point values are retrieved,
they will now be rounded to two decimal places. For example, a
configured value of `1.15` will correctly be returned as `1.15` in Lua
scripts.
  • Loading branch information
dudantas authored Sep 13, 2024
1 parent 5bcbc39 commit 687aba5
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 2 deletions.
13 changes: 11 additions & 2 deletions src/lua/functions/core/game/config_functions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,12 +70,21 @@ int ConfigFunctions::luaConfigManagerGetBoolean(lua_State* L) {
}

int ConfigFunctions::luaConfigManagerGetFloat(lua_State* L) {
auto key = getNumber<ConfigKey_t>(L, -1);
// configManager.getFloat(key, shouldRound = true)

// Ensure the first argument (key) is provided and is a valid enum
auto key = getNumber<ConfigKey_t>(L, 1);
if (!key) {
reportErrorFunc("Wrong enum");
return 1;
}

lua_pushnumber(L, g_configManager().getFloat(key, __FUNCTION__));
// Check if the second argument (shouldRound) is provided and is a boolean; default to true if not provided
bool shouldRound = getBoolean(L, 2, true);
float value = g_configManager().getFloat(key, __FUNCTION__);
double finalValue = shouldRound ? static_cast<double>(std::round(value * 100.0) / 100.0) : value;

g_logger().debug("[{}] key: {}, finalValue: {}, shouldRound: {}", __METHOD_NAME__, magic_enum::enum_name(key), finalValue, shouldRound);
lua_pushnumber(L, finalValue);
return 1;
}
27 changes: 27 additions & 0 deletions src/lua/functions/core/game/config_functions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,33 @@ class ConfigFunctions final : LuaScriptInterface {
static void init(lua_State* L);

private:
/**
* @brief Retrieves a float configuration value from the configuration manager, with an optional rounding.
*
* This function is a Lua binding used to get a float value from the configuration manager. It requires
* a key as the first argument, which should be a valid enumeration. An optional second boolean argument
* specifies whether the retrieved float should be rounded to two decimal places.
*
* @param L Pointer to the Lua state. The first argument must be a valid enum key, and the second argument (optional)
* can be a boolean indicating whether to round the result.
*
* @return Returns 1 after pushing the result onto the Lua stack, indicating the number of return values.
*
* @exception reportErrorFunc Throws an error if the first argument is not a valid enum.
*
* Usage:
* local result = ConfigManager.getFloat(ConfigKey.SomeKey)
* local result_rounded = ConfigManager.getFloat(ConfigKey.SomeKey, false)
*
* Detailed behavior:
* 1. Extracts the key from the first Lua stack argument as an enumeration of type `ConfigKey_t`.
* 2. Checks if the second argument is provided; if not, defaults to true for rounding.
* 3. Retrieves the float value associated with the key from the configuration manager.
* 4. If rounding is requested, rounds the value to two decimal places.
* 5. Logs the method call and the obtained value using the debug logger.
* 6. Pushes the final value (rounded or original) back onto the Lua stack.
* 7. Returns 1 to indicate a single return value.
*/
static int luaConfigManagerGetFloat(lua_State* L);
static int luaConfigManagerGetBoolean(lua_State* L);
static int luaConfigManagerGetNumber(lua_State* L);
Expand Down

0 comments on commit 687aba5

Please sign in to comment.