diff --git a/config.lua b/config.lua index ce55830..6a77732 100644 --- a/config.lua +++ b/config.lua @@ -14,4 +14,4 @@ yl_cinema.settings.enable_bigscreen = minetest.settings:get("yl_cinema.enable_bi yl_cinema.settings.enable_craft_bigscreen = minetest.settings:get("yl_cinema.enable_craft_bigscreen") or true yl_cinema.settings.enable_craft_bigscreen_recipe = minetest.settings:get("yl_cinema.enable_craft_bigscreen_recipe") or -"wool:grey,wool:grey,wool:grey,wool:grey,wool:grey,wool:grey,wool:black,,wool:black" +"wool:grey,wool:grey,wool:grey,wool:grey,wool:grey,wool:grey,wool:black, ,wool:black" diff --git a/feature_bigscreen.lua b/feature_bigscreen.lua index ba4e042..39c0004 100644 --- a/feature_bigscreen.lua +++ b/feature_bigscreen.lua @@ -1,3 +1,3 @@ dofile(yl_cinema.modpath .. "feature_bigscreen_items.lua") ---dofile(yl_cinema.modpath .. "feature_bigscreen_entity.lua") ---dofile(yl_cinema.modpath .. "feature_bigscreen_crafting.lua") \ No newline at end of file +dofile(yl_cinema.modpath .. "feature_bigscreen_entity.lua") +dofile(yl_cinema.modpath .. "feature_bigscreen_crafting.lua") \ No newline at end of file diff --git a/feature_bigscreen_crafting.lua b/feature_bigscreen_crafting.lua new file mode 100644 index 0000000..229c8b1 --- /dev/null +++ b/feature_bigscreen_crafting.lua @@ -0,0 +1,16 @@ +if (yl_cinema.settings.enable_bigscreen and yl_cinema.settings.enable_bigscreen == true and + yl_cinema.settings.enable_craft_bigscreen and yl_cinema.settings.enable_craft_bigscreen == true) then + + local recipe = yl_cinema.string_to_recipe(yl_cinema.settings.enable_craft_bigscreen_recipe) + + if type(recipe) == "table" then + minetest.register_craft({ + type = "shaped", + output = "yl_cinema:bigscreen_base", + recipe = recipe + }) + else + yl_cinema.warn("Cannot register crafting recipe for bigscreen: " .. + dump(yl_cinema.settings.enable_craft_bigscreen_recipe)) + end +end diff --git a/feature_bigscreen_entity.lua b/feature_bigscreen_entity.lua new file mode 100644 index 0000000..255d68a --- /dev/null +++ b/feature_bigscreen_entity.lua @@ -0,0 +1,204 @@ +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, + physical = false, + textures = {"yl_cinema_block_bigscreen.png^yl_cinema_icon_movie_inv.png"}, + _yl_cinema_stored_movie = "" +} + +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) + ent_obj:remove() +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 on_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 + +local 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_receive_fields = on_receive_fields_node, + on_metadata_inventory_take = on_metadata_inventory_take_node, + allow_metadata_inventory_put = allow_metadata_inventory_put_node, + allow_metadata_inventory_move = function() + return + end +} + +minetest.register_node(bigscreen_block_name, bigscreen_block_definition) diff --git a/feature_bigscreen_items.lua b/feature_bigscreen_items.lua index 6cee81b..2d1b48e 100644 --- a/feature_bigscreen_items.lua +++ b/feature_bigscreen_items.lua @@ -1,15 +1,14 @@ - -if not (yl_cinema.settings.enable_movieitems == true) then return end +if yl_cinema.settings.enable_movieitems ~= true then + return +end local function remove_forbidden_characters(str) local pattern = "[^%w_]" return string.gsub(str, pattern, "_") end -local name = "yl_cinema:movie" - -local movie_item_definition = -{ +local movie_item_name = "yl_cinema:movie" +local movie_item_definition = { groups = { movie = 1, not_in_creative_inventory = 1, @@ -19,15 +18,16 @@ local movie_item_definition = wield_image = "yl_cinema_icon_movie_inv.png", stack_max = 1, range = 4, - liquids_pointable = false, + liquids_pointable = false } for movie_id, movie in pairs(yl_cinema.movies) do if movie.item and (movie.item == true) then local item_definition = movie_item_definition item_definition._yl_cinema_movie_id = movie_id + core.log("action", "item_definition._yl_cinema_movie_id=" .. item_definition._yl_cinema_movie_id) item_definition.short_description = minetest.formspec_escape(movie.name) item_definition.description = minetest.formspec_escape(movie.description) - minetest.register_craftitem(name .. "_" .. remove_forbidden_characters(movie.name), item_definition) + minetest.register_craftitem(movie_item_name .. "_" .. remove_forbidden_characters(movie.name), item_definition) end -end \ No newline at end of file +end diff --git a/internal.lua b/internal.lua index ce904f4..b101215 100644 --- a/internal.lua +++ b/internal.lua @@ -120,7 +120,6 @@ end local function load_movies(movies_directory) local movies = {} local loaded_count = 0 - local total_count = 0 local movie_files = get_files_in_directory(movies_directory) for _, movie_id in ipairs(movie_files) do @@ -157,7 +156,7 @@ local function get_movieformspec(movie_id, pagenum) local screensize = screen_width .. "," .. 6.75 local formspec = {} - table.insert(formspec, "formspec_version[4]size[".. screensize.."]bgcolor[#000000]") + table.insert(formspec, "formspec_version[4]size[" .. screensize .. "]bgcolor[#000000]") if not movie or not pagenum then warn("Some error happened. movie=" .. dump(movie) .. ", page=" .. dump(pagenum)) @@ -166,20 +165,24 @@ local function get_movieformspec(movie_id, pagenum) end if pagenum == 0 then - table.insert(formspec, "background[0,0;".. screensize..";" .. (F(movie.title_texture) or "") .. ";true]") + table.insert(formspec, "background[0,0;" .. screensize .. ";" .. (F(movie.title_texture) or "") .. ";true]") table.insert(formspec, "label[0.5,0.5;" .. (F(movie.name) or "") .. "]") - table.insert(formspec, "textarea[0.5,1.5;".. screensize ..";;" .. (F(movie.description) or "") .. ";]") + table.insert(formspec, "textarea[0.5,1.5;" .. screensize .. ";;" .. (F(movie.description) or "") .. ";]") else local page = movie.pages[pagenum] - if not page then warn("Page empty = "..dump(page)) return "" end + if not page then + warn("Page empty = " .. dump(page)) + return "" + end - table.insert(formspec, "background[0,0;".. screensize..";" .. (F(page.texture) or "") .. ";true]") - table.insert(formspec, "label[" .. (F(page.captionposx) or 0) .. "," .. (F(page.captionposy) or 0) .. ";" .. (F(page.caption) or "") .. "]") + table.insert(formspec, "background[0,0;" .. screensize .. ";" .. (F(page.texture) or "") .. ";true]") + table.insert(formspec, "label[" .. (F(page.captionposx) or 0) .. "," .. (F(page.captionposy) or 0) .. ";" .. + (F(page.caption) or "") .. "]") if pagenum == #movie.pages then - table.insert(formspec, "button[3,".. (F(screen_height) -1 ) ..";2,1;replay;Replay]") - table.insert(formspec, "button_exit[6,".. (F(screen_height) -1) .. ";2,1;exit;Exit]") + table.insert(formspec, "button[3," .. (F(screen_height) - 1) .. ";2,1;replay;Replay]") + table.insert(formspec, "button_exit[6," .. (F(screen_height) - 1) .. ";2,1;exit;Exit]") end end @@ -189,8 +192,12 @@ end local function showpage(target_player_name, movie_id, pagenum) - if not minetest.get_player_by_name(target_player_name) then return end - if watched_by(target_player_name) == "" then return end + if not minetest.get_player_by_name(target_player_name) then + return + end + if watched_by(target_player_name) == "" then + return + end local formspec = get_movieformspec(movie_id, pagenum) @@ -199,23 +206,25 @@ local function showpage(target_player_name, movie_id, pagenum) if pagenum <= #pages then - table.sort(pages,orderpages) + table.sort(pages, orderpages) local page = pages[pagenum] or {} local delay = page.duration or 3 local nextpage = pagenum + 1 - minetest.after(delay,showpage,target_player_name, movie_id, nextpage) - watches(target_player_name,movie_id) + minetest.after(delay, showpage, target_player_name, movie_id, nextpage) + watches(target_player_name, movie_id) minetest.show_formspec(target_player_name, "yl_cinema:movie", formspec) end - + end -- minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "yl_cinema:movie" then return end + if formname ~= "yl_cinema:movie" then + return + end local playername = player:get_player_name() @@ -288,7 +297,9 @@ end function yl_cinema.startmovie(movie_id, target_player_name) local pagenum = 0 - if not next(get_movie(movie_id)) then return false, "Movie " .. movie_id .. " not found." end + if not next(get_movie(movie_id)) then + return false, "Movie " .. movie_id .. " not found." + end watches(target_player_name, movie_id) -- Start to show a movie if minetest.get_player_by_name(target_player_name) then @@ -303,13 +314,10 @@ function yl_cinema.load(filename, ...) return read_json_file(filename, ...) end - - function yl_cinema.load_movies(movies_directory, ...) return load_movies(movies_directory, ...) end - function yl_cinema.search_movies(movies, search_term, ...) return search_movies(movies, search_term, ...) end @@ -330,5 +338,9 @@ function yl_cinema.string_to_recipe(recipestring, ...) return string_to_recipe(recipestring, ...) end +function yl_cinema.orderpages(a, b, ...) + return orderpages(a, b, ...) +end + yl_cinema.action = action yl_cinema.warn = warn diff --git a/textures/yl_cinema_block_bigscreen.png b/textures/yl_cinema_block_bigscreen.png new file mode 100644 index 0000000..ea5a018 Binary files /dev/null and b/textures/yl_cinema_block_bigscreen.png differ