Bigscreen

This commit is contained in:
AliasAlreadyTaken 2023-06-02 14:12:46 +02:00
parent 089e80865a
commit 38c80c4a5b
7 changed files with 264 additions and 32 deletions

View File

@ -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"

View File

@ -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")
dofile(yl_cinema.modpath .. "feature_bigscreen_entity.lua")
dofile(yl_cinema.modpath .. "feature_bigscreen_crafting.lua")

View File

@ -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

View File

@ -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)

View File

@ -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
end

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB