Carter Kolwey c58bdc81ef Allow taking templates from the workshops in creative mode
There's no point in making the user put supplies in the machine if they can just grab them from the creative inventory.
Behavior in survival mode is unchanged.
2016-06-02 00:54:22 -05:00

275 lines
8.6 KiB
Lua

--[[
## StreetsMod 2.0 ##
Submod: signworkshop
Optional: true
]]
streets.signworkshop = {}
function streets.signworkshop.start(pos)
local node = minetest.get_node(pos)
if node.name ~= "streets:sign_workshop" then
return
end
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local template = inv:get_stack("template",1):get_name()
if not (template and template ~= "") then
return
end
local surface = inv:get_stack("surface",1):get_name()
if not (surface and surface ~= "") then
return
end
local dyes_needed = streets.signs.signtypes[template].dye_needed
if not (dyes_needed) then
return
end
local dye_level_ok = true
for k,v in pairs(dyes_needed) do
dye_level_ok = dye_level_ok and inv:contains_item("dye",{name = "dye:"..k,count = v})
end
if not dye_level_ok then
return
end
if not inv:room_for_item("output",{name = template,count = 1}) then
return
end
meta:set_string("working_on",template)
meta:set_int("progress",0)
inv:remove_item("surface",{name = inv:get_stack("surface",1):get_name(),count = 1})
for k,v in pairs(dyes_needed) do
inv:remove_item("dye",{name = "dye:"..k,count = v})
end
streets.signworkshop.step(pos)
end
function streets.signworkshop.step(pos)
local node = minetest.get_node(pos)
if node.name ~= "streets:sign_workshop" then
return
end
local meta = minetest.get_meta(pos)
if meta:get_string("working_on") == "" then
return
end
local inv = meta:get_inventory()
local progress = meta:get_int("progress")
progress = progress + 1
if progress < 10 then
minetest.after(0.2,streets.signworkshop.step,pos)
else
meta:set_int("progress",0)
progress = 0
inv:add_item("output",meta:get_string("working_on"))
meta:set_string("working_on","")
streets.signworkshop.start(pos)
end
meta:set_int("progress",progress)
streets.signworkshop.update_formspec(pos)
end
function streets.signworkshop.update_formspec(pos)
local node = minetest.get_node(pos)
if node.name ~= "streets:sign_workshop" then
return
end
local meta = minetest.get_meta(pos)
local page = meta:get_int("page")
local maxpage = meta:get_int("maxpage")
if page < 1 then
page = maxpage
elseif page > maxpage then
page = 1
end
meta:set_int("page",page)
local fs = "size[9,9;]"
fs = fs.."tabheader[0,0;tabs;"
for k,v in pairs(streets.signs.sections) do
fs = fs..minetest.formspec_escape(v.friendlyname)..","
end
fs = fs:sub(1,-2) --Strip trailing comma
fs = fs .. ";" .. meta:get_int("section") .. ";false;true]"
if meta:get_int("section") == 1 then
fs = fs .. "list[context;dye;0,0;8,6]"
else
fs = fs .. "label[0,0;Dyes Needed]"
fs = fs .. "list[context;dye_needed;0,0.5;2,3]"
fs = fs .. "list[context;list;2.25,0;4,4;"..tostring((page-1)*16).."]" --Each page is a 4x4 grid (16 items)
fs = fs .. "label[6.5,0.5;Blank Sign]"
fs = fs .. "label[7.5,0.5;Template]"
fs = fs .. "list[context;surface;6.5,1;1,1]"
fs = fs .. "list[context;template;7.5,1;1,1]"
fs = fs .. "image[7,2;1,1;gui_furnace_arrow_bg.png^[lowpart:" .. meta:get_int("progress")*10 .. ":gui_furnace_arrow_fg.png^[transformR180]"
fs = fs .. "list[context;output;7,3;1,1]"
fs = fs .. "button[2.25,4;1,1;prevpage;<-]"
fs = fs .. "button[5.25,4;1,1;nextpage;->]"
fs = fs .. "label[3.75,4;"..string.format("Page %s of %s",page,maxpage).."]"
if minetest.setting_getbool("creative_mode") then
fs = fs .."label[0,3.5;CREATIVE MODE\nTaking templates\nis enabled]"
end
end
fs = fs .. "list[current_player;main;0.5,5;8,4]"
meta:set_string("formspec",fs)
end
local function update_inventory(pos)
local node = minetest.get_node(pos)
if node.name ~= "streets:sign_workshop" then
return
end
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local section = meta:get_int("section")
local sectionname = streets.signs.sections[section].name
local itemcount = 0
for k,v in pairs(streets.signs.signtypes) do
if v.section == sectionname then
itemcount = itemcount + 1
end
end
inv:set_size("dye_needed",0)
inv:set_size("list",0)
inv:set_size("dye_needed",6)
inv:set_size("list",math.ceil(itemcount/16)*16)
inv:set_size("dye",32) -- 8x4
inv:set_size("surface",1)
inv:set_size("template",1)
inv:set_size("output",1)
for k,v in pairs(streets.signs.signtypes) do
if v.section == sectionname then
inv:add_item("list","streets:"..v.name)
end
end
meta:set_int("maxpage",math.ceil(itemcount/16))
local templatestack = inv:get_stack("template",1)
if templatestack and templatestack:to_string() ~= "" then
local selectedmarking = templatestack:to_table().name
local dyesneeded = streets.signs.signtypes[selectedmarking].dye_needed
for k,v in pairs(dyesneeded) do
inv:add_item("dye_needed",{name = "dye:"..k,count = v})
end
end
streets.signworkshop.update_formspec(pos)
if meta:get_string("working_on") == "" then
streets.signworkshop.start(pos)
end
end
local function on_receive_fields(pos,formname,fields,sender)
local meta = minetest.get_meta(pos)
if fields.tabs then
meta:set_int("section",fields.tabs)
meta:set_int("page",1)
elseif fields.prevpage then
meta:set_int("page",meta:get_int("page")-1)
elseif fields.nextpage then
meta:set_int("page",meta:get_int("page")+1)
end
update_inventory(pos)
end
local function on_construct(pos)
local meta = minetest.get_meta(pos)
meta:set_int("section",1)
meta:set_int("progress",0)
meta:set_int("page",1)
meta:set_int("maxpage",1)
meta:set_string("working_on","")
update_inventory(pos)
end
local function allow_metadata_inventory_take(pos, listname, index, stack, player)
if listname == "output" or listname == "surface" or listname == "dye" or (listname == "list" and minetest.setting_getbool("creative_mode")) then
return stack:get_count()
else
return 0
end
end
local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player)
if from_list == "list" and to_list == "template" then
return 1
elseif from_list == "template" and to_list == "list" then
local inv = minetest.get_meta(pos):get_inventory()
return 1
elseif from_list == "dye" and to_list == "dye" then
return count
else
return 0
end
end
local function on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player)
update_inventory(pos)
end
local function on_metadata_inventory_put(pos, listname, index, stack, player)
update_inventory(pos)
end
local function on_metadata_inventory_take(pos, listname, index, stack, player)
update_inventory(pos)
end
local function allow_metadata_inventory_put(pos, listname, index, stack, player)
if listname == "dye" and stack:get_name():sub(1,4) == "dye:" then
return stack:get_count()
elseif (listname == "surface" and stack:get_name() == "streets:sign_blank") or (listname == "list" and minetest.setting_getbool("creative_mode")) then
return stack:get_count()
else
return 0
end
end
local function can_dig(pos,player)
local inv = minetest.get_meta(pos):get_inventory()
if inv:is_empty("dye") and inv:is_empty("surface") and inv:is_empty("output") then
return true
else
return false
end
end
minetest.register_node(":streets:sign_workshop", {
description = "Sign Workshop",
tiles = {"default_wood.png",},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
groups = {cracky = 1},
node_box = {
type = "fixed",
fixed = {
{-0.4375, 0.375, -0.1875, 0.4375, 0.4375, -0.125}, -- rail
{-0.125, 0.3125, -0.25, -0.0625, 0.375, -0.0625}, -- sprayer
{-0.5, -0.5, -0.5, -0.4375, 0.5, 0.5}, -- sideL
{0.4375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- sideR
{-0.4375, 0.3125, -0.5, -0.375, 0.375, 0.5}, -- railLB
{-0.4375, 0.4375, -0.5, -0.375, 0.5, 0.5}, -- railLT
{-0.4375, 0.375, -0.5, -0.375, 0.4375, -0.4375}, -- railLF
{-0.4375, -0.5, 0.4375, 0.4375, 0.5, 0.5}, -- sideR
{0.375, 0.3125, -0.5, 0.4375, 0.375, 0.5}, -- railRB
{0.375, 0.4375, -0.5, 0.4375, 0.5, 0.5}, -- railRT
{0.375, 0.375, -0.5, 0.4375, 0.4375, -0.4375}, -- railRF
{-0.4375, 0.375, 0.375, -0.375, 0.4375, 0.4375}, -- railLB
{0.375, 0.3125, 0.375, 0.4375, 0.375, 0.4375}, -- railRB
{-0.5, -0.5, -0.5, -0.375, 0.3125, 0.4375}, -- sideL2
{0.375, -0.5, -0.5, 0.4375, 0.3125, 0.4375}, -- sideR2
{-0.4375, -0.5, -0.4375, 0.4375, -0.1875, 0.4375}, -- body
}
},
selection_box = {
type = "regular"
},
on_receive_fields = on_receive_fields,
on_construct = on_construct,
allow_metadata_inventory_take = allow_metadata_inventory_take,
allow_metadata_inventory_move = allow_metadata_inventory_move,
allow_metadata_inventory_put = allow_metadata_inventory_put,
on_metadata_inventory_move = on_metadata_inventory_move,
on_metadata_inventory_put = on_metadata_inventory_put,
on_metadata_inventory_take = on_metadata_inventory_take,
can_dig = can_dig,
})