if not (yl_cinema.settings.enable_bigscreen and (yl_cinema.settings.enable_bigscreen == true)) then return end local bigscreen_entity_name = "yl_cinema:movie_bigscreen" local screen_width = 12 local screen_height = 6.75 local bigscreen_entity_initial_properties = {} local bigscreen_entity_definition = { initial_properties = bigscreen_entity_initial_properties, visual = "sprite", visual_size = { x = screen_width, y = screen_height }, glow = 15, nametag = "", nametag_color = "#ffcc00", nametag_bgcolor = "#000000", collisionbox = {0}, physical = false, textures = {"yl_cinema_block_bigscreen.png^yl_cinema_icon_movie_inv.png"}, _yl_cinema_stored_movie = "", on_blast = function() return false, false, {} end } minetest.register_entity(bigscreen_entity_name, bigscreen_entity_definition) -- Helper local function find_entity(pos) local v = vector.new(0, 3.5, 0) local center_pos = vector.add(pos, v) for _, obj in pairs(minetest.get_objects_inside_radius(center_pos, 0.5)) do if obj and obj:get_luaentity() and (obj:get_luaentity().name == bigscreen_entity_name) then return obj end end end -- Changepage local function showpage(ent_obj, movie_id, pagenum) local movie = yl_cinema.get_movie(movie_id) local pages = movie.pages if pagenum <= #pages then table.sort(pages, yl_cinema.orderpages) local page = pages[pagenum] or {} local delay = page.duration or 3 local nextpage = pagenum + 1 minetest.after(delay, showpage, ent_obj, movie_id, nextpage) -- Payload if pagenum == 0 then local properties = { textures = {movie.title_texture}, infotext = movie.name, nametag = movie.decription } ent_obj:set_properties(properties) else if not page then warn("Page empty = " .. dump(page)) return "" end local properties = { textures = {page.texture}, infotext = movie.name, nametag = page.caption } ent_obj:set_properties(properties) end end end local function start_movie(ent_obj, movie_id) if ent_obj and movie_id then showpage(ent_obj, movie_id, 0) else return false, "Object " .. dump(ent_obj) .. " not found." end end -- Item local function get_formspec(pos) local formspec = {} table.insert(formspec, "formspec_version[4]size[10.75,7]") table.insert(formspec, "list[context;movie;0.5,0.5;1,1;]") table.insert(formspec, "list[current_player;main;0.5,2;8,4;]") table.insert(formspec, "listring[]") table.insert(formspec, "button_exit[9.7,0.3;0.75,0.75;quit;X]") table.insert(formspec, "button[1.6,0.5;1.8,1;start0;Start]") table.insert(formspec, "button[3.6,0.5;1.8,1;start3;3 Seconds]") table.insert(formspec, "button[5.6,0.5;1.8,1;start5;5 Seconds]") table.insert(formspec, "button[7.6,0.5;1.8,1;start10;10 Seconds]") return table.concat(formspec, "") end local function on_construct_node(pos) local v = vector.new(0, 3.5, 0) local center_pos = vector.add(pos, v) local meta = minetest.get_meta(pos) local formspec = get_formspec(pos) meta:set_string("formspec", formspec) local inv = meta:get_inventory() inv:set_size("movie", 1) minetest.add_entity(center_pos, bigscreen_entity_name) end local function on_destruct_node(pos) local ent_obj = find_entity(pos) if ent_obj then ent_obj:remove() else yl_cinema.warn("Bigscreen entity not found at " .. minetest.pos_to_string(pos, 0)) end end local function on_blast_node(pos, intensity) local ent_obj = find_entity(pos) if ent_obj then ent_obj:remove() else yl_cinema.warn("Bigscreen entity not found at " .. minetest.pos_to_string(pos, 0)) end end local function allow_metadata_inventory_put_node(pos, listname, index, stack, player) local groupname = "movie" local itemname = stack:get_name() local playername = player:get_player_name() if (not minetest.is_protected(pos, playername)) and (minetest.get_item_group(itemname, groupname) >= 1) then return 1 else return 0 end end local function allow_metadata_inventory_take_node(pos, listname, index, stack, player) local playername = player:get_player_name() if not minetest.is_protected(pos, playername) then return 1 else return 0 end end local function can_dig_node(pos, player) local playername = player:get_player_name() local inv = minetest.get_meta(pos):get_inventory() return inv:is_empty("movie") and not minetest.is_protected(pos, playername) end local function on_receive_fields_node(pos, formname, fields, sender) if (not next(fields)) or fields.quit then return end local inv = minetest.get_meta(pos):get_inventory() local itemstack = inv:get_stack("movie", 1) local itemdef = itemstack:get_definition() local movie_id = itemdef._yl_cinema_movie_id local delay = 0 if fields.start0 then delay = 0 elseif fields.start3 then delay = 3 elseif fields.start5 then delay = 5 elseif fields.start10 then delay = 10 end -- Grab entity local ent_obj = find_entity(pos) core.after(delay, start_movie, ent_obj, movie_id) end yl_cinema.bigscreen_block_name = "yl_cinema:bigscreen_base" local bigscreen_block_definition = { description = "Cinema Base", drawtype = "nodebox", node_box = { type = "fixed", fixed = {{-0.5, -0.5, -0.5, 0.5, -0.4, 0.5}} }, groups = { cracky = 3 }, tiles = {"yl_cinema_block_bigscreen.png^yl_cinema_icon_movie_inv.png", "yl_cinema_block_bigscreen.png", "yl_cinema_block_bigscreen.png", "yl_cinema_block_bigscreen.png", "yl_cinema_block_bigscreen.png", "yl_cinema_block_bigscreen.png"}, can_dig = can_dig_node, on_construct = on_construct_node, on_destruct = on_destruct_node, on_blast = on_blast_node, on_receive_fields = on_receive_fields_node, allow_metadata_inventory_put = allow_metadata_inventory_put_node, allow_metadata_inventory_take = allow_metadata_inventory_take_node, allow_metadata_inventory_move = function() return end } minetest.register_node(yl_cinema.bigscreen_block_name, bigscreen_block_definition)