This commit is contained in:
Lars Müller 2024-05-15 07:04:46 +03:00 committed by GitHub
commit 344e15e723
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 72 additions and 11 deletions

View File

@ -2742,6 +2742,12 @@ Elements
(if present).
* Disables player:set_formspec_prepend() from applying to this formspec.
### `allow_quit[<bool>]`
* Controls whether players can quit the formspec (e.g. by pressing ESC).
* Players can still quit the formspec using exit buttons.
* `minetest.close_formspec` will still work.
### `real_coordinates[<bool>]`
* INFORMATION: Enable it automatically using `formspec_version` version 2 or newer.

View File

@ -0,0 +1,34 @@
local lastdir = {}
minetest.register_globalstep(function(dtime)
for _, player in pairs(minetest.get_connected_players()) do
local pname = player:get_player_name()
local ldeg = -math.deg(player:get_look_vertical())
if lastdir[pname] == nil then
lastdir[pname] = 0
end
if lastdir[pname] then
if math.abs(lastdir[pname] - ldeg) > 4 then
lastdir[pname] = ldeg
player:set_bone_override("Head", {rotation = {vector = {x = ldeg, y = 0, z = 0}, absolute = true },
scale = {vector = { x = 1.5, y = 1.5, z = 1.5 }}})
end
end
end
end)
minetest.register_on_leaveplayer(function(player)
lastdir[player:get_player_name()] = nil
end)
minetest.register_chatcommand("headanim", {
func = function(name)
local player = assert(minetest.get_player_by_name(name))
if lastdir[name] then
lastdir[name] = false -- don't update Head in globalstep
player:set_bone_override"Head" -- clear override
else
lastdir[name] = 0
end
end
})

View File

@ -468,6 +468,17 @@ mouse control = true]
background9[0,0;0,0;testformspec_bg_9slice.png;true;4,6]
background[1,1;0,0;testformspec_bg.png;true]
]],
-- Allow Close
[[
formspec_version[3]
size[12,4]
allow_quit[false]
button_exit[0.5,0.5;3,1;exitbtn;Exit (Button)]
button[0.5,2;3,1;exitapi;Exit (close_formspec)]
label[4,1;You should only be able to quit this formspec
by clicking one of these buttons (or switching to another tab).]
]]
}
local page_id = 2
@ -477,7 +488,7 @@ local function show_test_formspec(pname)
page = page()
end
local fs = page .. "tabheader[0,0;11,0.65;maintabs;Real Coord,Styles,Noclip,Hypertext,Tabs,Invs,Window,Anim,Model,ScrollC,Sound,Background,Unsized;" .. page_id .. ";false;false]"
local fs = page .. "tabheader[0,0;11,0.65;maintabs;Real Coord,Styles,Noclip,Hypertext,Tabs,Invs,Window,Anim,Model,ScrollC,Sound,Background,Unsized,Allow Close;" .. page_id .. ";false;false]"
minetest.show_formspec(pname, "testformspec:formspec", fs)
end
@ -525,6 +536,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.submit_window then
show_test_formspec(player:get_player_name())
end
if fields.exitapi then
minetest.close_formspec(player:get_player_name(), "testformspec:formspec")
return true
end
end)
minetest.register_chatcommand("test_formspec", {

View File

@ -184,7 +184,7 @@ GUIEngine::GUIEngine(JoystickController *joystick,
"",
false);
m_menu->allowClose(false);
m_menu->setAllowCloseDefault(false);
m_menu->lockSize(true,v2u32(800,600));
// Initialize scripting

View File

@ -3048,6 +3048,10 @@ void GUIFormSpecMenu::parseElement(parserData* data, const std::string &element)
return;
}
if (type == "allow_quit") {
data->allowclose = is_yes(description);
}
// Ignore others
infostream << "Unknown DrawSpec: type=" << type << ", data=\"" << description << "\""
<< std::endl;
@ -3097,6 +3101,7 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
mydata.anchor = v2f32(0.5f, 0.5f);
mydata.padding = v2f32(0.05f, 0.05f);
mydata.simple_field_count = 0;
mydata.allowclose = m_allowclose_default;
// Base position of contents of form
mydata.basepos = getBasePos();
@ -3457,6 +3462,8 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
m_last_formname = m_text_dst->m_formname;
m_is_form_regenerated = true;
}
m_allowclose = mydata.allowclose;
}
void GUIFormSpecMenu::legacySortElements(std::list<IGUIElement *>::iterator from)
@ -4990,12 +4997,8 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
}
if (s.is_exit) {
if (m_allowclose) {
acceptInput(quit_mode_accept);
quitMenu();
} else {
m_text_dst->gotText(L"ExitButton");
}
acceptInput(quit_mode_accept);
quitMenu();
return true;
}

View File

@ -218,9 +218,9 @@ public:
m_text_dst = text_dst;
}
void allowClose(bool value)
void setAllowCloseDefault(bool value)
{
m_allowclose = value;
m_allowclose_default = value;
}
void lockSize(bool lock,v2u32 basescreensize=v2u32(0,0))
@ -368,7 +368,8 @@ protected:
u64 m_hovered_time = 0;
s32 m_old_tooltip_id = -1;
bool m_allowclose = true;
bool m_allowclose_default = true;
bool m_allowclose;
bool m_lock = false;
v2u32 m_lockscreensize;
@ -391,6 +392,7 @@ private:
struct parserData {
bool explicit_size;
bool real_coordinates;
bool allowclose;
u8 simple_field_count;
v2f invsize;
v2s32 size;