forked from Mirrorlandia_minetest/minetest
Fix waypoint precision wraparound, add bounds check
This commit is contained in:
parent
404a063fdf
commit
fb461d21a5
@ -416,7 +416,9 @@ void Hud::drawLuaElements(const v3s16 &camera_offset)
|
|||||||
(e->number >> 0) & 0xFF);
|
(e->number >> 0) & 0xFF);
|
||||||
std::wstring text = unescape_translate(utf8_to_wide(e->name));
|
std::wstring text = unescape_translate(utf8_to_wide(e->name));
|
||||||
const std::string &unit = e->text;
|
const std::string &unit = e->text;
|
||||||
// waypoints reuse the item field to store precision, item = precision + 1
|
// Waypoints reuse the item field to store precision,
|
||||||
|
// item = precision + 1 and item = 0 <=> precision = 10 for backwards compatibility.
|
||||||
|
// Also see `push_hud_element`.
|
||||||
u32 item = e->item;
|
u32 item = e->item;
|
||||||
float precision = (item == 0) ? 10.0f : (item - 1.f);
|
float precision = (item == 0) ? 10.0f : (item - 1.f);
|
||||||
bool draw_precision = precision > 0;
|
bool draw_precision = precision > 0;
|
||||||
|
@ -2025,11 +2025,16 @@ void read_hud_element(lua_State *L, HudElement *elem)
|
|||||||
elem->name = getstringfield_default(L, 2, "name", "");
|
elem->name = getstringfield_default(L, 2, "name", "");
|
||||||
elem->text = getstringfield_default(L, 2, "text", "");
|
elem->text = getstringfield_default(L, 2, "text", "");
|
||||||
elem->number = getintfield_default(L, 2, "number", 0);
|
elem->number = getintfield_default(L, 2, "number", 0);
|
||||||
if (elem->type == HUD_ELEM_WAYPOINT)
|
if (elem->type == HUD_ELEM_WAYPOINT) {
|
||||||
// waypoints reuse the item field to store precision, item = precision + 1
|
// Waypoints reuse the item field to store precision,
|
||||||
elem->item = getintfield_default(L, 2, "precision", -1) + 1;
|
// item = precision + 1 and item = 0 <=> precision = 10 for backwards compatibility.
|
||||||
else
|
int precision = getintfield_default(L, 2, "precision", 10);
|
||||||
|
if (precision < 0)
|
||||||
|
throw LuaError("Waypoint precision must be non-negative");
|
||||||
|
elem->item = precision + 1;
|
||||||
|
} else {
|
||||||
elem->item = getintfield_default(L, 2, "item", 0);
|
elem->item = getintfield_default(L, 2, "item", 0);
|
||||||
|
}
|
||||||
elem->dir = getintfield_default(L, 2, "direction", 0);
|
elem->dir = getintfield_default(L, 2, "direction", 0);
|
||||||
elem->z_index = MYMAX(S16_MIN, MYMIN(S16_MAX,
|
elem->z_index = MYMAX(S16_MIN, MYMIN(S16_MAX,
|
||||||
getintfield_default(L, 2, "z_index", 0)));
|
getintfield_default(L, 2, "z_index", 0)));
|
||||||
@ -2081,8 +2086,10 @@ void push_hud_element(lua_State *L, HudElement *elem)
|
|||||||
lua_setfield(L, -2, "number");
|
lua_setfield(L, -2, "number");
|
||||||
|
|
||||||
if (elem->type == HUD_ELEM_WAYPOINT) {
|
if (elem->type == HUD_ELEM_WAYPOINT) {
|
||||||
// waypoints reuse the item field to store precision, precision = item - 1
|
// Waypoints reuse the item field to store precision,
|
||||||
lua_pushnumber(L, elem->item - 1);
|
// item = precision + 1 and item = 0 <=> precision = 10 for backwards compatibility.
|
||||||
|
// See `Hud::drawLuaElements`, case `HUD_ELEM_WAYPOINT`.
|
||||||
|
lua_pushnumber(L, (elem->item == 0) ? 10 : (elem->item - 1));
|
||||||
lua_setfield(L, -2, "precision");
|
lua_setfield(L, -2, "precision");
|
||||||
}
|
}
|
||||||
// push the item field for waypoints as well for backwards compatibility
|
// push the item field for waypoints as well for backwards compatibility
|
||||||
|
Loading…
Reference in New Issue
Block a user