generated from your-land/yl_template
Bigscreen
This commit is contained in:
parent
089e80865a
commit
38c80c4a5b
@ -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"
|
||||
|
@ -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")
|
16
feature_bigscreen_crafting.lua
Normal file
16
feature_bigscreen_crafting.lua
Normal 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
|
204
feature_bigscreen_entity.lua
Normal file
204
feature_bigscreen_entity.lua
Normal 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)
|
@ -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
|
||||
|
52
internal.lua
52
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
|
||||
|
BIN
textures/yl_cinema_block_bigscreen.png
Normal file
BIN
textures/yl_cinema_block_bigscreen.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.6 KiB |
Loading…
Reference in New Issue
Block a user