diff --git a/freeze.lua b/freeze.lua new file mode 100644 index 0000000..0613d16 --- /dev/null +++ b/freeze.lua @@ -0,0 +1,61 @@ +function classroom.is_frozen(player) + return minetest.is_yes(player:get_meta():get_string("classroom:frozen")) +end + +minetest.register_entity("classroom:freeze", { + initial_properties = { + physical = true, + collisionbox = { -0.01, -0.01, -0.01, 0.01, 0.01, 0.01 }, + visual = "sprite", + visual_size = { x = 0, y = 0 }, + textures = { "blank.png" }, + is_visible = true, + makes_footstep_sound = false, + }, + + on_step = function(self, dtime) + local player = self.pname and minetest.get_player_by_name(self.pname) + if not player or not classroom.is_frozen(player) then + self.object:remove() + return + end + end, + + set_frozen_player = function(self, player) + self.pname = player:get_player_name() + player:set_attach(self.object, "", {x = 0, y = 0, z = 0 }, { x = 0, y = 0, z = 0 }) + end, +}) + +function classroom.freeze(player) + player:get_meta():set_string("classroom:frozen", "true") + + local parent = player:get_attach() + if parent and parent:get_luaentity() and + parent:get_luaentity().set_frozen_player then + -- Already attached + return + end + + local obj = minetest.add_entity(player:get_pos(), "classroom:freeze") + obj:get_luaentity():set_frozen_player(player) +end + +function classroom.unfreeze(player) + player:get_meta():set_string("classroom:frozen", "") + + local pname = player:get_player_name() + local objects = minetest.get_objects_inside_radius(player:get_pos(), 2) + for i=1, #objects do + local entity = objects[i]:get_luaentity() + if entity and entity.set_frozen_player and entity.pname == pname then + objects[i]:remove() + end + end +end + +minetest.register_on_joinplayer(function(player) + if classroom.is_frozen(player) then + classroom.freeze(player) + end +end) diff --git a/gui_dash.lua b/gui_dash.lua index 8441522..d11bd6a 100644 --- a/gui_dash.lua +++ b/gui_dash.lua @@ -258,8 +258,8 @@ local function get_formspec(player, context) for _, action in pairs(classroom.get_actions()) do btn.state = "active" - btn.name = action.name - btn.text = minetest.formspec_escape(action.title) + btn.name = "action_" .. action.name + btn.text = minetest.formspec_escape(action.title) btn.tooltip = minetest.formspec_escape(action.description) fs[#fs + 1] = button(btn) diff --git a/init.lua b/init.lua index 0d7b651..0515f96 100644 --- a/init.lua +++ b/init.lua @@ -13,6 +13,7 @@ end dofile(minetest.get_modpath("classroom") .. "/api.lua") dofile(minetest.get_modpath("classroom") .. "/gui_dash.lua") dofile(minetest.get_modpath("classroom") .. "/gui_group.lua") +dofile(minetest.get_modpath("classroom") .. "/freeze.lua") dofile(minetest.get_modpath("classroom") .. "/actions.lua") -- Privileges