Add ts_doors

master
daret 2020-11-03 16:59:10 +01:00
parent a64b9640b8
commit 4ae2b95073
28 changed files with 1304 additions and 1 deletions

View File

@ -52,6 +52,10 @@ origin https://github.com/Sokomine/mg_villages (fetch)
* master 69ac3f2 [origin/master] pass pr on to grow_trees for mg mapgen
Mod: buildings/mg_villages
origin git@github.com:minetest-mods/ts_doors.git (fetch)
* master 2e8dd2d [origin/master] Add basic_materials to optional dependencies.
Mod: buildings/ts_doors
origin https://github.com/minetest-mods/dynamic_liquid (fetch)
* master 84a0e13 [origin/master] update translation template
Mod: environment/dynamic_liquid
@ -92,6 +96,10 @@ origin https://github.com/appgurueu/modlib (fetch)
* master 77977a5 [origin/master] Use ... instead of arg
Mod: lib_api/modlib
origin git@github.com:minetest-mods/ts_workshop.git (fetch)
* master fa836aa [origin/master] Switch from minetest.after to node timers
Mod: lib_api/ts_workshop
origin https://github.com/hkzorman/advanced_npc (fetch)
* master a43233f [origin/master] Merge pull request #53 from hkzorman/clean_api
Mod: mobs/advanced_npc

36
mods/buildings/ts_doors/LICENSE Executable file
View File

@ -0,0 +1,36 @@
License for Textures
--------------------
CC0 Public Domain
See https://creativecommons.org/publicdomain/zero/1.0/ for details.
License for Code
----------------
MIT License
Copyright (c) 2016 Thomas S.
Copyright (C) 2016 webdesigner97 (for workshop code)
Copyright (C) 2016 cheapie (for workshop code)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,11 @@
ts_doors
========
This mod adds more doors.
It was made by Thomas-S.
For license see LICENSE file.
Special thanks to Wuzzy2, who helped to improve this mod by suggesting many good ideas.
Special thanks to webdesigner97 and cheapie, who contributed some code for the door workshop.
**NOTE:** This mod depends on the [ts_workshop](https://github.com/minetest-mods/ts_workshop) mod.

View File

@ -0,0 +1,8 @@
default
ts_workshop
doors
moretrees?
moreores?
technic?
ethereal?
basic_materials?

View File

@ -0,0 +1 @@
Adds doors for all kinds of wood.

641
mods/buildings/ts_doors/init.lua Executable file
View File

@ -0,0 +1,641 @@
ts_doors = {}
ts_doors.registered_doors = {}
ts_doors.sounds = {}
-- Used for localization
local S = minetest.get_translator("ts_doors")
-- Use this to generate the translation template file.
--[[
local oldS = S
local function S(x)
print(x .. "=")
return oldS(x)
end
]]
if default.node_sound_metal_defaults then
ts_doors.sounds.metal = {
sounds = default.node_sound_metal_defaults(),
sound_open = "doors_steel_door_open",
sound_close = "doors_steel_door_close",
}
else
ts_doors.sounds.metal = {
sounds = default.node_sound_stone_defaults(),
sound_open = "doors_steel_door_open",
sound_close = "doors_steel_door_close",
}
end
ts_doors.sounds.wood = {
sounds = default.node_sound_wood_defaults(),
sound_open = "doors_door_open",
sound_close = "doors_door_close"
}
ts_doors.sounds.glass = {
sounds = default.node_sound_glass_defaults(),
sound_open = "doors_glass_door_open",
sound_close = "doors_glass_door_close",
}
local function get_door_name(meta, item)
local door_type_string = meta:get_int("trapdoor") == 1 and "trapdoor_" or "door_"
local locked_string = meta:get_int("locked") == 1 and "locked_" or ""
local solid_string = meta:get_int("solid") == 1 and "full_" or ""
return "ts_doors:" .. door_type_string .. solid_string .. locked_string .. item:gsub(":", "_")
end
local function register_door_alias(name, convert_to)
minetest.register_alias(name, convert_to)
minetest.register_alias(name .. "_a", convert_to .. "_a")
minetest.register_alias(name .. "_b", convert_to .. "_b")
minetest.register_alias(name .. "_c", convert_to .. "_c")
minetest.register_alias(name .. "_d", convert_to .. "_d")
end
local function register_trapdoor_alias(name, convert_to)
minetest.register_alias(name, convert_to)
minetest.register_alias(name .. "_open", convert_to .. "_open")
end
function ts_doors.register_alias(name, convert_to)
name = name:gsub(":", "_")
convert_to = convert_to:gsub(":", "_")
for _,style in pairs({"", "full_", "locked_", "full_locked_"}) do
register_door_alias("ts_doors:door_" .. style .. name, "ts_doors:door_" .. style .. convert_to)
register_trapdoor_alias("ts_doors:trapdoor_" .. style .. name, "ts_doors:trapdoor_" .. style .. convert_to)
end
end
function ts_doors.register_door(item, description, texture, sounds, recipe)
if not minetest.registered_nodes[item] then
minetest.log("[ts_doors] bug found: "..item.." is not a registered node. Cannot create doors")
return
end
if not sounds then
sounds = {}
end
recipe = recipe or item
ts_doors.registered_doors[item:gsub(":", "_")] = recipe
register_door_alias("doors:ts_door_" .. item:gsub(":", "_"), "ts_doors:door_" .. item:gsub(":", "_"))
register_door_alias("doors:ts_door_full_" .. item:gsub(":", "_"), "ts_doors:door_full_" .. item:gsub(":", "_"))
register_door_alias("doors:ts_door_locked_" .. item:gsub(":", "_"), "ts_doors:door_locked_" .. item:gsub(":", "_"))
register_door_alias("doors:ts_door_full_locked_" .. item:gsub(":", "_"), "ts_doors:door_full_locked_" .. item:gsub(":", "_"))
local groups = minetest.registered_nodes[item].groups
local door_groups = {door=1}
for k, v in pairs(groups) do
if k ~= "wood" then
door_groups[k] = v
end
end
doors.register("ts_doors:door_" .. item:gsub(":", "_"), {
tiles = { { name = "[combine:32x38:0,0=" .. texture .. ":0,16=" .. texture .. ":0,32=" .. texture .. ":16,0=" .. texture .. ":16,16=" .. texture .. ":16,32=" .. texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base.png^[noalpha^[makealpha:0,255,0", backface_culling = true } },
description = S(description .. " Windowed Door"),
inventory_image = "[combine:32x32:0,8=" .. texture .. ":16,8=" .. texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_inv.png^[noalpha^[makealpha:0,255,0",
groups = table.copy(door_groups),
sounds = sounds.sounds or nil,
sound_open = sounds.sound_open or nil,
sound_close = sounds.sound_close or nil,
})
doors.register("ts_doors:door_full_" .. item:gsub(":", "_"), {
tiles = { { name = "[combine:32x38:0,0=" .. texture .. ":0,16=" .. texture .. ":0,32=" .. texture .. ":16,0=" .. texture .. ":16,16=" .. texture .. ":16,32=" .. texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_full.png^[noalpha", backface_culling = true } },
description = S("Solid " .. description .. " Door"),
inventory_image = "[combine:32x32:0,8=" .. texture .. ":16,8=" .. texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_full_inv.png^[noalpha^[makealpha:0,255,0",
groups = table.copy(door_groups),
sounds = sounds.sounds or nil,
sound_open = sounds.sound_open or nil,
sound_close = sounds.sound_close or nil,
})
doors.register_trapdoor("ts_doors:trapdoor_" .. item:gsub(":", "_"), {
description = S("Windowed " .. description .. " Trapdoor"),
inventory_image = texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_trapdoor.png^[noalpha^[makealpha:0,255,0",
wield_image = texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_trapdoor.png^[noalpha^[makealpha:0,255,0",
tile_front = texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_trapdoor.png^[noalpha^[makealpha:0,255,0",
tile_side = texture .. "^[colorize:#fff:30",
groups = table.copy(door_groups),
sounds = sounds.sounds or nil,
sound_open = sounds.sound_open or nil,
sound_close = sounds.sound_close or nil,
})
doors.register_trapdoor("ts_doors:trapdoor_full_" .. item:gsub(":", "_"), {
description = S("Solid " .. description .. " Trapdoor"),
inventory_image = texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_trapdoor_full.png^[noalpha",
wield_image = texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_trapdoor_full.png^[noalpha",
tile_front = texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_trapdoor_full.png^[noalpha",
tile_side = texture .. "^[colorize:#fff:30",
groups = table.copy(door_groups),
sounds = sounds.sounds or nil,
sound_open = sounds.sound_open or nil,
sound_close = sounds.sound_close or nil,
})
door_groups.level = 2
doors.register("ts_doors:door_locked_" .. item:gsub(":", "_"), {
tiles = { { name = "[combine:32x38:0,0=" .. texture .. ":0,16=" .. texture .. ":0,32=" .. texture .. ":16,0=" .. texture .. ":16,16=" .. texture .. ":16,32=" .. texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_locked.png^[noalpha^[makealpha:0,255,0", backface_culling = true } },
description = S("Windowed Locked " .. description .. " Door"),
inventory_image = "[combine:32x32:0,8=" .. texture .. ":16,8=" .. texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_locked_inv.png^[noalpha^[makealpha:0,255,0",
protected = true,
groups = table.copy(door_groups),
sound_open = "doors_steel_door_open",
sound_close = "doors_steel_door_close",
sounds = sounds.sounds or nil,
sound_open = sounds.sound_open or nil,
sound_close = sounds.sound_close or nil,
})
doors.register("ts_doors:door_full_locked_" .. item:gsub(":", "_"), {
tiles = { { name = "[combine:32x38:0,0=" .. texture .. ":0,16=" .. texture .. ":0,32=" .. texture .. ":16,0=" .. texture .. ":16,16=" .. texture .. ":16,32=" .. texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_full_locked.png^[noalpha", backface_culling = true } },
description = S("Solid Locked " .. description .. " Door"),
inventory_image = "[combine:32x32:0,8=" .. texture .. ":16,8=" .. texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_full_locked_inv.png^[noalpha^[makealpha:0,255,0",
protected = true,
groups = table.copy(door_groups),
sound_open = "doors_steel_door_open",
sound_close = "doors_steel_door_close",
sounds = sounds.sounds or nil,
sound_open = sounds.sound_open or nil,
sound_close = sounds.sound_close or nil,
})
doors.register_trapdoor("ts_doors:trapdoor_locked_" .. item:gsub(":", "_"), {
description = S("Windowed Locked " .. description .. " Trapdoor"),
inventory_image = texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_trapdoor_locked.png^[noalpha^[makealpha:0,255,0",
wield_image = texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_trapdoor_locked.png^[noalpha^[makealpha:0,255,0",
tile_front = texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_trapdoor_locked.png^[noalpha^[makealpha:0,255,0",
tile_side = texture .. "^[colorize:#fff:30",
protected = true,
groups = table.copy(door_groups),
sounds = sounds.sounds or nil,
sound_open = sounds.sound_open or nil,
sound_close = sounds.sound_close or nil,
})
doors.register_trapdoor("ts_doors:trapdoor_full_locked_" .. item:gsub(":", "_"), {
description = S("Solid Locked " .. description .. " Trapdoor"),
inventory_image = texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_trapdoor_full_locked.png^[noalpha",
wield_image = texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_trapdoor_full_locked.png^[noalpha",
tile_front = texture .. "^[transformR90^[colorize:#fff:30^ts_doors_base_trapdoor_full_locked.png^[noalpha",
tile_side = texture .. "^[colorize:#fff:30",
protected = true,
groups = table.copy(door_groups),
sounds = sounds.sounds or nil,
sound_open = sounds.sound_open or nil,
sound_close = sounds.sound_close or nil,
})
end
ts_doors.register_door("default:aspen_wood", "Aspen", "default_aspen_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("default:pine_wood", "Pine", "default_pine_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("default:acacia_wood", "Acacia", "default_acacia_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("default:wood", "Wooden", "default_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("default:junglewood", "Jungle Wood", "default_junglewood.png", ts_doors.sounds.wood)
if minetest.get_modpath("moretrees") then
ts_doors.register_door("moretrees:apple_tree_planks", "Apple Tree", "moretrees_apple_tree_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("moretrees:beech_planks", "Beech", "moretrees_beech_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("moretrees:birch_planks", "Birch", "moretrees_birch_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("moretrees:fir_planks", "Fir", "moretrees_fir_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("moretrees:oak_planks", "Oak", "moretrees_oak_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("moretrees:palm_planks", "Palm", "moretrees_palm_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("moretrees:rubber_tree_planks", "Rubber Tree", "moretrees_rubber_tree_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("moretrees:sequoia_planks", "Sequoia", "moretrees_sequoia_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("moretrees:spruce_planks", "Spruce", "moretrees_spruce_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("moretrees:willow_planks", "Willow", "moretrees_willow_wood.png", ts_doors.sounds.wood)
end
if minetest.get_modpath("ethereal") then
ts_doors.register_door("ethereal:banana_wood", "Banana", "banana_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("ethereal:birch_wood", "Birch", "moretrees_birch_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("ethereal:frost_wood", "Frost", "frost_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("ethereal:mushroom_trunk", "Mushroom", "mushroom_trunk.png", ts_doors.sounds.wood)
ts_doors.register_door("ethereal:palm_wood", "Palm", "moretrees_palm_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("ethereal:redwood_wood", "Redwood", "redwood_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("ethereal:sakura_wood", "Sakura", "ethereal_sakura_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("ethereal:scorched_tree", "Scorched", "scorched_tree.png", ts_doors.sounds.wood)
ts_doors.register_door("ethereal:willow_wood", "Willow", "willow_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("ethereal:yellow_wood", "Healing Tree", "yellow_wood.png", ts_doors.sounds.wood)
ts_doors.register_door("ethereal:crystal_block", "Crystal", "crystal_block.png", ts_doors.sounds.metal, "ethereal:crystal_ingot")
end
ts_doors.register_door("default:bronzeblock", "Bronze", "default_bronze_block.png", ts_doors.sounds.metal, "default:bronze_ingot")
ts_doors.register_door("default:copperblock", "Copper", "default_copper_block.png", ts_doors.sounds.metal, "default:copper_ingot")
ts_doors.register_door("default:diamondblock", "Diamond", "default_diamond_block.png", ts_doors.sounds.metal, "default:diamond")
ts_doors.register_door("default:goldblock", "Gold", "default_gold_block.png", ts_doors.sounds.metal, "default:gold_ingot")
ts_doors.register_door("default:steelblock", "Steel", minetest.registered_nodes["default:steelblock"].tiles[1], ts_doors.sounds.metal, "default:steel_ingot")
if minetest.get_modpath("moreores") then
ts_doors.register_door("moreores:mithril_block", "Mithril", "moreores_mithril_block.png", ts_doors.sounds.metal, "moreores:mithril_ingot")
ts_doors.register_door("moreores:silver_block", "Silver", "moreores_silver_block.png", ts_doors.sounds.metal, "moreores:silver_ingot")
ts_doors.register_door("moreores:tin_block", "Tin", "moreores_tin_block.png", ts_doors.sounds.metal, "moreores:tin_ingot")
end
if minetest.get_modpath("technic") then
ts_doors.register_door("technic:carbon_steel_block", "Carbon Steel", "technic_carbon_steel_block.png", ts_doors.sounds.metal, "technic:carbon_steel_ingot")
ts_doors.register_door("technic:cast_iron_block", "Cast Iron", "technic_cast_iron_block.png", ts_doors.sounds.metal, "technic:cast_iron_ingot")
ts_doors.register_door("technic:chromium_block", "Chromium", "technic_chromium_block.png", ts_doors.sounds.metal, "technic:chromium_ingot")
ts_doors.register_door("technic:lead_block", "Lead", "technic_lead_block.png", ts_doors.sounds.metal, "technic:lead_ingot")
ts_doors.register_door("technic:stainless_steel_block", "Stainless Steel", "technic_stainless_steel_block.png", ts_doors.sounds.metal, "technic:stainless_steel_ingot")
ts_doors.register_door("technic:zinc_block", "Zinc", "technic_zinc_block.png", ts_doors.sounds.metal, "technic:zinc_ingot")
ts_doors.register_door("technic:blast_resistant_concrete", "Blast Resistant Concrete", "technic_blast_resistant_concrete_block.png", ts_doors.sounds.metal)
end
if minetest.get_modpath("basic_materials") then
ts_doors.register_door("basic_materials:brass_block", "Brass", "basic_materials_brass_block.png", ts_doors.sounds.metal, "basic_materials:brass_ingot")
ts_doors.register_door("basic_materials:concrete_block", "Concrete", "basic_materials_concrete_block.png", ts_doors.sounds.metal)
ts_doors.register_alias("technic:brass_block", "basic_materials:brass_block")
ts_doors.register_alias("technic:concrete", "basic_materials:concrete_block")
end
minetest.override_item("doors:door_steel", {
description = S("Windowed Locked Plain Steel Door"),
})
minetest.override_item("doors:door_wood", {
description = S("Windowed Mixed Wood Door"),
})
minetest.override_item("doors:trapdoor", {
description = S("Windowed Mixed Wood Trapdoor"),
})
minetest.override_item("doors:trapdoor_steel", {
description = S("Windowed Locked Plain Steel Trapdoor"),
})
ts_doors.workshop = {}
function ts_doors.workshop.update_formspec(pos)
local meta = minetest.get_meta(pos)
local page = meta:get_int("page")
local maxpage = meta:get_int("maxpage")
local selection = meta:get_string("selection")
local trapdoor = meta:get_int("trapdoor") == 1
local locked = meta:get_int("locked") == 1
local solid = meta:get_int("solid") == 1
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 .. default.gui_bg .. default.gui_bg_img .. default.gui_slots
if minetest.colorize then
if not locked then
fs = fs .. "button[0,0;2,1;unlocked;" .. minetest.colorize("#ffff00", "Unlocked") .. "]"
fs = fs .. "button[0,0.75;2,1;locked;Locked]"
else
fs = fs .. "button[0,0;2,1;unlocked;Unlocked]"
fs = fs .. "button[0,0.75;2,1;locked;" .. minetest.colorize("#ffff00", "Locked") .. "]"
end
if not solid then
fs = fs .. "button[2,0;2,1;windowed;" .. minetest.colorize("#ffff00", "Windowed") .. "]"
fs = fs .. "button[2,0.75;2,1;solid;Solid]"
else
fs = fs .. "button[2,0;2,1;windowed;Windowed]"
fs = fs .. "button[2,0.75;2,1;solid;" .. minetest.colorize("#ffff00", "Solid") .. "]"
end
if not trapdoor then
fs = fs .. "button[4,0;2,1;doors;" .. minetest.colorize("#ffff00", "Doors") .. "]"
fs = fs .. "button[4,0.75;2,1;trapdoors;Trapdoors]"
else
fs = fs .. "button[4,0;2,1;doors;Doors]"
fs = fs .. "button[4,0.75;2,1;trapdoors;" .. minetest.colorize("#ffff00", "Trapdoors") .. "]"
end
else
fs = fs .. "button[0,0;2,1;unlocked;Unlocked]"
fs = fs .. "button[0,0.75;2,1;locked;Locked]"
fs = fs .. "button[2,0;2,1;windowed;Windowed]"
fs = fs .. "button[2,0.75;2,1;solid;Solid]"
fs = fs .. "button[4,0;2,1;doors;Doors]"
fs = fs .. "button[4,0.75;2,1;trapdoors;Trapdoors]"
end
fs = fs .. "label[0,1.6;Material]"
fs = fs .. "label[0,1.9;needed]"
fs = fs .. "list[context;material_needed;0,2.3;1,1]"
fs = fs .. "label[0,3.25;Input]"
fs = fs .. "list[context;material;0,3.75;1,1]"
fs = fs .. "label[1,1.6;Steel]"
fs = fs .. "label[1,1.9;needed]"
fs = fs .. "list[context;steel_needed;1,2.3;1,1]"
fs = fs .. "label[1,3.25;Input]"
fs = fs .. "list[context;steel;1,3.75;1,1]"
local x = 2
local y = 1.75
local count = 0
for item, recipe in pairs(ts_doors.registered_doors) do
count = count + 1
if (count >= (page - 1) * 12 + 1 and count <= page * 12) then
local door = get_door_name(meta, item)
fs = fs .. "item_image_button[" .. x .. "," .. y .. ";1,1;" .. door .. ";" .. door .. ";]"
x = x + 1
if x > 5 then
x = 2
y = y + 1
end
end
end
fs = fs .. "button[6, 1;1,1;noselection;X]"
fs = fs .. "tooltip[noselection;Remove Current Selection]"
if maxpage > 1 then
fs = fs .. "button[6,2.25;1,1;prevpage;<-]"
fs = fs .. "button[6,3.25;1,1;nextpage;->]"
fs = fs .. "label[6,4;" .. string.format("Page %s of %s", page, maxpage) .. "]"
end
fs = fs .. "label[7.5,0.2;Current]"
fs = fs .. "label[7.5,0.5;Door]"
fs = fs .. "item_image[7.5,1;1,1;" .. selection .. "]"
fs = fs .. "image[7.5,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.5,3;1,1]"
fs = fs .. "list[current_player;main;0.5,5;8,4]"
fs = fs .. "listring[current_player;main]"
fs = fs .. "listring[context;material]"
fs = fs .. "listring[current_player;main]"
fs = fs .. "listring[context;steel]"
fs = fs .. "listring[current_player;main]"
fs = fs .. "listring[context;output]"
meta:set_string("formspec", fs)
end
local function update_inventory(pos)
local meta = minetest.get_meta(pos)
local itemcount = 0
for k, v in pairs(ts_doors.registered_doors) do
itemcount = itemcount + 1
end
meta:set_int("maxpage", math.ceil(itemcount / 16))
local inv = meta:get_inventory()
inv:set_size("material_needed", 0)
inv:set_size("material_needed", 1)
inv:set_size("steel_needed", 0)
inv:set_size("steel_needed", 1)
inv:set_size("material", 1)
inv:set_size("steel", 1)
inv:set_size("output", 1)
local trapdoor = meta:get_int("trapdoor") == 1
local locked = meta:get_int("locked") == 1
local solid = meta:get_int("solid") == 1
local selection = meta:get_string("selection")
if selection and selection ~= "" then
local door = selection:sub(10)
if door:sub(0, 4) == "trap" then
trapdoor = true
door = door:sub(10)
else
trapdoor = false
door = door:sub(6)
end
if door:sub(0, 4) == "full" then
solid = true
door = door:sub(6)
else
solid = false
end
if door:sub(0, 7) == "locked_" then
locked = true
door = door:sub(8)
else
locked = false
end
local material_needed = 1
if trapdoor then
material_needed = 4
else
material_needed = 6
end
if solid then
material_needed = material_needed + 1
end
local steel_needed = 0
if locked then
steel_needed = 1
end
inv:add_item("material_needed", { name = ts_doors.registered_doors[door], count = material_needed })
inv:add_item("steel_needed", { name = "default:steel_ingot", count = steel_needed })
end
end
local function on_receive_fields(pos, formname, fields, sender)
local meta = minetest.get_meta(pos)
if fields.unlocked then
meta:set_int("locked", 0)
elseif fields.locked then
meta:set_int("locked", 1)
elseif fields.windowed then
meta:set_int("solid", 0)
elseif fields.solid then
meta:set_int("solid", 1)
elseif fields.doors then
meta:set_int("trapdoor", 0)
elseif fields.trapdoors then
meta:set_int("trapdoor", 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)
elseif fields.noselection then
meta:set_string("selection", "")
else
for item, recipe in pairs(ts_doors.registered_doors) do
if fields[get_door_name(meta, item)] then
meta:set_string("selection", get_door_name(meta, item))
end
end
end
end
local function on_construct(pos)
local meta = minetest.get_meta(pos)
meta:set_int("trapdoor", 0)
meta:set_int("locked", 0)
meta:set_int("solid", 0)
meta:set_int("progress", 0)
meta:set_string("working_on", "")
meta:set_int("page", 1)
meta:set_int("maxpage", 1)
meta:set_string("selection", "")
end
local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player)
return 0
end
local function allow_metadata_inventory_put(pos, listname, index, stack, player)
if listname == "material" then
local meta = minetest.get_meta(pos)
local selection = meta:get_string("selection")
if selection and selection ~= "" then
local door = selection:sub(10)
if door:sub(0, 4) == "trap" then
door = door:sub(10)
else
door = door:sub(6)
end
if door:sub(0, 4) == "full" then
door = door:sub(6)
end
if door:sub(0, 7) == "locked_" then
door = door:sub(8)
end
if stack:get_name() == ts_doors.registered_doors[door] then
return stack:get_count()
else
return 0
end
else
return 0
end
elseif listname == "steel" and (stack:get_name() == "default:steel_ingot") then
return stack:get_count()
else
return 0
end
end
local function allow_metadata_inventory_take(pos, listname, index, stack, player)
if listname == "material" or listname == "steel" or listname == "output" then
return stack:get_count()
else
return 0
end
end
local function on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player)
end
local function on_metadata_inventory_put(pos, listname, index, stack, player)
end
local function on_metadata_inventory_take(pos, listname, index, stack, player)
end
local function can_dig(pos, player)
local inv = minetest.get_meta(pos):get_inventory()
if inv:is_empty("material") and inv:is_empty("steel") and inv:is_empty("output") then
return true
else
return false
end
end
ts_workshop.register_workshop("ts_doors", "workshop", {
description = S("Door Workshop"),
tiles = {
"default_wood.png",
"default_wood.png",
"default_wood.png^doors_item_wood.png",
"default_wood.png^doors_item_wood.png",
"default_wood.png",
"default_wood.png"
},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
groups = { choppy = 2, oddly_breakable_by_hand = 2 },
node_box = {
type = "fixed",
fixed = {
{ -0.5, -0.5, -0.5, 0.5, -0.3125, 0.5 }, -- NodeBox1
{ -0.5, -0.5, -0.5, -0.375, 0.5, 0.5 }, -- NodeBox2
{ 0.375, -0.5, -0.5, 0.5, 0.5, 0.5 }, -- NodeBox3
{ -0.5, -0.5, 0.375, 0.5, 0.5, 0.5 }, -- NodeBox4
{ -0.5, 0.3125, -0.4375, 0.5, 0.4375, -0.3125 }, -- NodeBox5
}
},
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,
sounds = default.node_sound_wood_defaults(),
enough_supply = function(pos, selection)
local meta = minetest.get_meta(pos)
if meta:get_string("working_on") ~= "" then
return
end
local inv = meta:get_inventory()
local selection = meta:get_string("selection")
local material = inv:get_stack("material", 1):get_name()
local material_needed_name = inv:get_stack("material_needed", 1):get_name()
local material_needed = inv:get_stack("material_needed", 1):get_count()
local material_ok = inv:get_stack("material", 1):get_count() >= material_needed
local steel = inv:get_stack("steel", 1):get_name()
local steel_needed = inv:get_stack("steel_needed", 1):get_count()
local steel_ok = inv:get_stack("steel", 1):get_count() >= steel_needed
if not (material_ok and steel_ok
and (steel and steel == "default:steel_ingot" or steel_needed == 0)
and selection and selection ~= ""
and material == material_needed_name)
then
return false
else
return true
end
end,
remove_supply = function(pos, selection)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local material = inv:get_stack("material", 1):get_name()
local material_needed = inv:get_stack("material_needed", 1):get_count()
local steel_needed = inv:get_stack("steel_needed", 1):get_count()
inv:remove_item("material", { name = material, count = material_needed })
inv:remove_item("steel", { name = "default:steel_ingot", count = steel_needed })
end,
update_inventory = update_inventory,
update_formspec = ts_doors.workshop.update_formspec,
})
minetest.register_lbm({
name = "ts_doors:update_door_workshop",
nodenames = { "ts_doors:door_workshop" },
action = function(pos, node)
update_inventory(pos)
end,
})
minetest.register_craft({
output = "ts_doors:workshop",
recipe = {
{ "default:wood", "default:wood", "default:wood" },
{ "default:wood", "doors:door_wood", "default:wood" },
{ "default:wood", "default:wood", "default:wood" },
}
})
minetest.register_craft({
type = "fuel",
recipe = "ts_doors:workshop",
burntime = 30,
})

View File

@ -0,0 +1,349 @@
Aspen Windowed Door=
Solid Aspen Door=
Windowed Aspen Trapdoor=
Solid Aspen Trapdoor=
Windowed Locked Aspen Door=
Solid Locked Aspen Door=
Windowed Locked Aspen Trapdoor=
Solid Locked Aspen Trapdoor=
Pine Windowed Door=
Solid Pine Door=
Windowed Pine Trapdoor=
Solid Pine Trapdoor=
Windowed Locked Pine Door=
Solid Locked Pine Door=
Windowed Locked Pine Trapdoor=
Solid Locked Pine Trapdoor=
Acacia Windowed Door=
Solid Acacia Door=
Windowed Acacia Trapdoor=
Solid Acacia Trapdoor=
Windowed Locked Acacia Door=
Solid Locked Acacia Door=
Windowed Locked Acacia Trapdoor=
Solid Locked Acacia Trapdoor=
Wooden Windowed Door=
Solid Wooden Door=
Windowed Wooden Trapdoor=
Solid Wooden Trapdoor=
Windowed Locked Wooden Door=
Solid Locked Wooden Door=
Windowed Locked Wooden Trapdoor=
Solid Locked Wooden Trapdoor=
Jungle Wood Windowed Door=
Solid Jungle Wood Door=
Windowed Jungle Wood Trapdoor=
Solid Jungle Wood Trapdoor=
Windowed Locked Jungle Wood Door=
Solid Locked Jungle Wood Door=
Windowed Locked Jungle Wood Trapdoor=
Solid Locked Jungle Wood Trapdoor=
Apple Tree Windowed Door=
Solid Apple Tree Door=
Windowed Apple Tree Trapdoor=
Solid Apple Tree Trapdoor=
Windowed Locked Apple Tree Door=
Solid Locked Apple Tree Door=
Windowed Locked Apple Tree Trapdoor=
Solid Locked Apple Tree Trapdoor=
Beech Windowed Door=
Solid Beech Door=
Windowed Beech Trapdoor=
Solid Beech Trapdoor=
Windowed Locked Beech Door=
Solid Locked Beech Door=
Windowed Locked Beech Trapdoor=
Solid Locked Beech Trapdoor=
Birch Windowed Door=
Solid Birch Door=
Windowed Birch Trapdoor=
Solid Birch Trapdoor=
Windowed Locked Birch Door=
Solid Locked Birch Door=
Windowed Locked Birch Trapdoor=
Solid Locked Birch Trapdoor=
Fir Windowed Door=
Solid Fir Door=
Windowed Fir Trapdoor=
Solid Fir Trapdoor=
Windowed Locked Fir Door=
Solid Locked Fir Door=
Windowed Locked Fir Trapdoor=
Solid Locked Fir Trapdoor=
Oak Windowed Door=
Solid Oak Door=
Windowed Oak Trapdoor=
Solid Oak Trapdoor=
Windowed Locked Oak Door=
Solid Locked Oak Door=
Windowed Locked Oak Trapdoor=
Solid Locked Oak Trapdoor=
Palm Windowed Door=
Solid Palm Door=
Windowed Palm Trapdoor=
Solid Palm Trapdoor=
Windowed Locked Palm Door=
Solid Locked Palm Door=
Windowed Locked Palm Trapdoor=
Solid Locked Palm Trapdoor=
Rubber Tree Windowed Door=
Solid Rubber Tree Door=
Windowed Rubber Tree Trapdoor=
Solid Rubber Tree Trapdoor=
Windowed Locked Rubber Tree Door=
Solid Locked Rubber Tree Door=
Windowed Locked Rubber Tree Trapdoor=
Solid Locked Rubber Tree Trapdoor=
Sequoia Windowed Door=
Solid Sequoia Door=
Windowed Sequoia Trapdoor=
Solid Sequoia Trapdoor=
Windowed Locked Sequoia Door=
Solid Locked Sequoia Door=
Windowed Locked Sequoia Trapdoor=
Solid Locked Sequoia Trapdoor=
Spruce Windowed Door=
Solid Spruce Door=
Windowed Spruce Trapdoor=
Solid Spruce Trapdoor=
Windowed Locked Spruce Door=
Solid Locked Spruce Door=
Windowed Locked Spruce Trapdoor=
Solid Locked Spruce Trapdoor=
Willow Windowed Door=
Solid Willow Door=
Windowed Willow Trapdoor=
Solid Willow Trapdoor=
Windowed Locked Willow Door=
Solid Locked Willow Door=
Windowed Locked Willow Trapdoor=
Solid Locked Willow Trapdoor=
Banana Windowed Door=
Solid Banana Door=
Windowed Banana Trapdoor=
Solid Banana Trapdoor=
Windowed Locked Banana Door=
Solid Locked Banana Door=
Windowed Locked Banana Trapdoor=
Solid Locked Banana Trapdoor=
Birch Windowed Door=
Solid Birch Door=
Windowed Birch Trapdoor=
Solid Birch Trapdoor=
Windowed Locked Birch Door=
Solid Locked Birch Door=
Windowed Locked Birch Trapdoor=
Solid Locked Birch Trapdoor=
Frost Windowed Door=
Solid Frost Door=
Windowed Frost Trapdoor=
Solid Frost Trapdoor=
Windowed Locked Frost Door=
Solid Locked Frost Door=
Windowed Locked Frost Trapdoor=
Solid Locked Frost Trapdoor=
Mushroom Windowed Door=
Solid Mushroom Door=
Windowed Mushroom Trapdoor=
Solid Mushroom Trapdoor=
Windowed Locked Mushroom Door=
Solid Locked Mushroom Door=
Windowed Locked Mushroom Trapdoor=
Solid Locked Mushroom Trapdoor=
Palm Windowed Door=
Solid Palm Door=
Windowed Palm Trapdoor=
Solid Palm Trapdoor=
Windowed Locked Palm Door=
Solid Locked Palm Door=
Windowed Locked Palm Trapdoor=
Solid Locked Palm Trapdoor=
Redwood Windowed Door=
Solid Redwood Door=
Windowed Redwood Trapdoor=
Solid Redwood Trapdoor=
Windowed Locked Redwood Door=
Solid Locked Redwood Door=
Windowed Locked Redwood Trapdoor=
Solid Locked Redwood Trapdoor=
Sakura Windowed Door=
Solid Sakura Door=
Windowed Sakura Trapdoor=
Solid Sakura Trapdoor=
Windowed Locked Sakura Door=
Solid Locked Sakura Door=
Windowed Locked Sakura Trapdoor=
Solid Locked Sakura Trapdoor=
Scorched Windowed Door=
Solid Scorched Door=
Windowed Scorched Trapdoor=
Solid Scorched Trapdoor=
Windowed Locked Scorched Door=
Solid Locked Scorched Door=
Windowed Locked Scorched Trapdoor=
Solid Locked Scorched Trapdoor=
Willow Windowed Door=
Solid Willow Door=
Windowed Willow Trapdoor=
Solid Willow Trapdoor=
Windowed Locked Willow Door=
Solid Locked Willow Door=
Windowed Locked Willow Trapdoor=
Solid Locked Willow Trapdoor=
Healing Tree Windowed Door=
Solid Healing Tree Door=
Windowed Healing Tree Trapdoor=
Solid Healing Tree Trapdoor=
Windowed Locked Healing Tree Door=
Solid Locked Healing Tree Door=
Windowed Locked Healing Tree Trapdoor=
Solid Locked Healing Tree Trapdoor=
Crystal Windowed Door=
Solid Crystal Door=
Windowed Crystal Trapdoor=
Solid Crystal Trapdoor=
Windowed Locked Crystal Door=
Solid Locked Crystal Door=
Windowed Locked Crystal Trapdoor=
Solid Locked Crystal Trapdoor=
Bronze Windowed Door=
Solid Bronze Door=
Windowed Bronze Trapdoor=
Solid Bronze Trapdoor=
Windowed Locked Bronze Door=
Solid Locked Bronze Door=
Windowed Locked Bronze Trapdoor=
Solid Locked Bronze Trapdoor=
Copper Windowed Door=
Solid Copper Door=
Windowed Copper Trapdoor=
Solid Copper Trapdoor=
Windowed Locked Copper Door=
Solid Locked Copper Door=
Windowed Locked Copper Trapdoor=
Solid Locked Copper Trapdoor=
Diamond Windowed Door=
Solid Diamond Door=
Windowed Diamond Trapdoor=
Solid Diamond Trapdoor=
Windowed Locked Diamond Door=
Solid Locked Diamond Door=
Windowed Locked Diamond Trapdoor=
Solid Locked Diamond Trapdoor=
Gold Windowed Door=
Solid Gold Door=
Windowed Gold Trapdoor=
Solid Gold Trapdoor=
Windowed Locked Gold Door=
Solid Locked Gold Door=
Windowed Locked Gold Trapdoor=
Solid Locked Gold Trapdoor=
Steel Windowed Door=
Solid Steel Door=
Windowed Steel Trapdoor=
Solid Steel Trapdoor=
Windowed Locked Steel Door=
Solid Locked Steel Door=
Windowed Locked Steel Trapdoor=
Solid Locked Steel Trapdoor=
Mithril Windowed Door=
Solid Mithril Door=
Windowed Mithril Trapdoor=
Solid Mithril Trapdoor=
Windowed Locked Mithril Door=
Solid Locked Mithril Door=
Windowed Locked Mithril Trapdoor=
Solid Locked Mithril Trapdoor=
Silver Windowed Door=
Solid Silver Door=
Windowed Silver Trapdoor=
Solid Silver Trapdoor=
Windowed Locked Silver Door=
Solid Locked Silver Door=
Windowed Locked Silver Trapdoor=
Solid Locked Silver Trapdoor=
Tin Windowed Door=
Solid Tin Door=
Windowed Tin Trapdoor=
Solid Tin Trapdoor=
Windowed Locked Tin Door=
Solid Locked Tin Door=
Windowed Locked Tin Trapdoor=
Solid Locked Tin Trapdoor=
Carbon Steel Windowed Door=
Solid Carbon Steel Door=
Windowed Carbon Steel Trapdoor=
Solid Carbon Steel Trapdoor=
Windowed Locked Carbon Steel Door=
Solid Locked Carbon Steel Door=
Windowed Locked Carbon Steel Trapdoor=
Solid Locked Carbon Steel Trapdoor=
Cast Iron Windowed Door=
Solid Cast Iron Door=
Windowed Cast Iron Trapdoor=
Solid Cast Iron Trapdoor=
Windowed Locked Cast Iron Door=
Solid Locked Cast Iron Door=
Windowed Locked Cast Iron Trapdoor=
Solid Locked Cast Iron Trapdoor=
Chromium Windowed Door=
Solid Chromium Door=
Windowed Chromium Trapdoor=
Solid Chromium Trapdoor=
Windowed Locked Chromium Door=
Solid Locked Chromium Door=
Windowed Locked Chromium Trapdoor=
Solid Locked Chromium Trapdoor=
Lead Windowed Door=
Solid Lead Door=
Windowed Lead Trapdoor=
Solid Lead Trapdoor=
Windowed Locked Lead Door=
Solid Locked Lead Door=
Windowed Locked Lead Trapdoor=
Solid Locked Lead Trapdoor=
Stainless Steel Windowed Door=
Solid Stainless Steel Door=
Windowed Stainless Steel Trapdoor=
Solid Stainless Steel Trapdoor=
Windowed Locked Stainless Steel Door=
Solid Locked Stainless Steel Door=
Windowed Locked Stainless Steel Trapdoor=
Solid Locked Stainless Steel Trapdoor=
Zinc Windowed Door=
Solid Zinc Door=
Windowed Zinc Trapdoor=
Solid Zinc Trapdoor=
Windowed Locked Zinc Door=
Solid Locked Zinc Door=
Windowed Locked Zinc Trapdoor=
Solid Locked Zinc Trapdoor=
Blast Resistant Concrete Windowed Door=
Solid Blast Resistant Concrete Door=
Windowed Blast Resistant Concrete Trapdoor=
Solid Blast Resistant Concrete Trapdoor=
Windowed Locked Blast Resistant Concrete Door=
Solid Locked Blast Resistant Concrete Door=
Windowed Locked Blast Resistant Concrete Trapdoor=
Solid Locked Blast Resistant Concrete Trapdoor=
Brass Windowed Door=
Solid Brass Door=
Windowed Brass Trapdoor=
Solid Brass Trapdoor=
Windowed Locked Brass Door=
Solid Locked Brass Door=
Windowed Locked Brass Trapdoor=
Solid Locked Brass Trapdoor=
Concrete Windowed Door=
Solid Concrete Door=
Windowed Concrete Trapdoor=
Solid Concrete Trapdoor=
Windowed Locked Concrete Door=
Solid Locked Concrete Door=
Windowed Locked Concrete Trapdoor=
Solid Locked Concrete Trapdoor=
Windowed Locked Plain Steel Door=
Windowed Mixed Wood Door=
Windowed Mixed Wood Trapdoor=
Windowed Locked Plain Steel Trapdoor=
Door Workshop=

View File

@ -0,0 +1,4 @@
name = ts_doors
depends = default, ts_workshop, doors
optional_depends = moretrees, moreores, technic, ethereal, basic_materials
description = Adds doors for all kinds of wood.

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 771 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 654 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 493 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 687 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 566 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 793 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 B

View File

@ -6,5 +6,5 @@ display_modpack - for signs
mobkit - for petz and other mod mods
mobs_redo - for some mob mods
modlib - for character_anim
ts_workshop - workshop api for ts doors

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 Thomas S.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,32 @@
# ts_workshop
This mod made by Thomas-S adds an API for workshops.
For license information see the file `LICENSE`.
```lua
workshop.register_workshop("example", "workshop", {
enough_supply = function(pos, selection)
end,
remove_supply = function(pos, selection)
end,
update_formspec = function(pos)
end,
update_inventory = function(pos)
end,
on_receive_fields = function(pos)
end,
on_construct = function(pos)
end,
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
end,
can_dig = function(pos, player)
end,
-- everything else is simply passed to minetest.register_node()
})
```

View File

View File

@ -0,0 +1 @@
API for workshops

190
mods/lib_api/ts_workshop/init.lua Executable file
View File

@ -0,0 +1,190 @@
ts_workshop = {}
function ts_workshop.register_workshop(mod, name, def)
if not ts_workshop[mod] then
ts_workshop[mod] = {}
end
if not ts_workshop[mod][name] then
ts_workshop[mod][name] = {}
end
ts_workshop[mod][name].enough_supply = def.enough_supply
ts_workshop[mod][name].remove_supply_raw = def.remove_supply
ts_workshop[mod][name].update_formspec_raw = def.update_formspec
ts_workshop[mod][name].update_inventory_raw = def.update_inventory
ts_workshop[mod][name].remove_supply = function(pos, selection)
ts_workshop[mod][name].remove_supply_raw(pos, selection)
ts_workshop[mod][name].update_inventory(pos)
end
ts_workshop[mod][name].start = function(pos)
local node = minetest.get_node(pos)
if not (mod and name) then
mod, name = minetest.get_node(pos).name:match("([^:]+):([^:]+)")
end
if node.name ~= mod .. ":" .. name or not ts_workshop[mod][name] then
return
end
local meta = minetest.get_meta(pos)
if meta:get_string("working_on") ~= "" then
return
end
local selection = meta:get_string("selection")
if selection and selection ~= "" then
if not ts_workshop[mod][name].enough_supply(pos, selection) then
return
end
else
return
end
local inv = meta:get_inventory()
if not inv:room_for_item("output", { name = selection, count = 1 }) then
return
end
meta:set_string("working_on", selection)
meta:set_int("progress", 0)
ts_workshop[mod][name].remove_supply(pos, selection)
ts_workshop[mod][name].step(pos)
end
ts_workshop[mod][name].step = function(pos)
local node = minetest.get_node(pos)
if not (mod and name) then
mod, name = minetest.get_node(pos).name:match("([^:]+):([^:]+)")
end
if node.name ~= mod .. ":" .. name or not ts_workshop[mod][name] then
return
end
local meta = minetest.get_meta(pos)
local working_on = meta:get_string("working_on")
if working_on == "" then
return
end
local progress = meta:get_int("progress")
progress = progress + 1
local duration = 10
if minetest.registered_items[working_on] and
minetest.registered_items[working_on].workshop_duration then
duration = minetest.registered_items[working_on].workshop_duration
end
if progress < duration then
meta:set_int("progress", progress)
local timer = minetest.get_node_timer(pos)
timer:start(0.2)
else
meta:set_int("progress", 0)
progress = 0
local inv = meta:get_inventory()
inv:add_item("output", working_on)
meta:set_string("working_on", "")
ts_workshop[mod][name].start(pos)
end
ts_workshop[mod][name].update_formspec(pos)
end
ts_workshop[mod][name].update_formspec = function(pos)
if not (mod and name) then
mod, name = minetest.get_node(pos).name:match("([^:]+):([^:]+)")
end
local node = minetest.get_node(pos)
if node.name ~= mod .. ":" .. name or not ts_workshop[mod][name] then
return
end
ts_workshop[mod][name].update_formspec_raw(pos)
end
ts_workshop[mod][name].update_inventory = function(pos)
if not (mod and name) then
mod, name = minetest.get_node(pos).name:match("([^:]+):([^:]+)")
end
local node = minetest.get_node(pos)
if node.name ~= mod .. ":" .. name or not ts_workshop[mod][name] then
return
end
ts_workshop[mod][name].update_inventory_raw(pos)
ts_workshop[mod][name].update_formspec(pos)
ts_workshop[mod][name].start(pos)
end
ts_workshop[mod][name].on_receive_fields = function(pos, formname, fields, sender)
def.on_receive_fields(pos, formname, fields, sender)
ts_workshop[mod][name].update_inventory(pos)
end
ts_workshop[mod][name].on_construct = function(pos)
def.on_construct(pos)
if not (mod and name) then
mod, name = minetest.get_node(pos).name:match("([^:]+):([^:]+)")
end
ts_workshop[mod][name].update_inventory(pos)
end
ts_workshop[mod][name].allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
return def.allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player)
end
ts_workshop[mod][name].allow_metadata_inventory_put = function(pos, listname, index, stack, player)
return def.allow_metadata_inventory_put(pos, listname, index, stack, player)
end
ts_workshop[mod][name].allow_metadata_inventory_take = function(pos, listname, index, stack, player)
return def.allow_metadata_inventory_take(pos, listname, index, stack, player)
end
ts_workshop[mod][name].on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
if not (mod and name) then
mod, name = minetest.get_node(pos).name:match("([^:]+):([^:]+)")
end
ts_workshop[mod][name].update_inventory(pos)
end
ts_workshop[mod][name].on_metadata_inventory_put = function(pos, listname, index, stack, player)
if not (mod and name) then
mod, name = minetest.get_node(pos).name:match("([^:]+):([^:]+)")
end
ts_workshop[mod][name].update_inventory(pos)
end
ts_workshop[mod][name].on_metadata_inventory_take = function(pos, listname, index, stack, player)
if not (mod and name) then
mod, name = minetest.get_node(pos).name:match("([^:]+):([^:]+)")
end
ts_workshop[mod][name].update_inventory(pos)
end
ts_workshop[mod][name].can_dig = function(pos, player)
return def.can_dig(pos, player)
end
local ndef = table.copy(def)
ndef.on_receive_fields = ts_workshop[mod][name].on_receive_fields
ndef.on_construct = ts_workshop[mod][name].on_construct
ndef.allow_metadata_inventory_move = ts_workshop[mod][name].allow_metadata_inventory_move
ndef.allow_metadata_inventory_put = ts_workshop[mod][name].allow_metadata_inventory_put
ndef.allow_metadata_inventory_take = ts_workshop[mod][name].allow_metadata_inventory_take
ndef.on_metadata_inventory_move = ts_workshop[mod][name].on_metadata_inventory_move
ndef.on_metadata_inventory_put = ts_workshop[mod][name].on_metadata_inventory_put
ndef.on_metadata_inventory_take = ts_workshop[mod][name].on_metadata_inventory_take
ndef.can_dig = ts_workshop[mod][name].can_dig
ndef.on_timer = function(pos, elapsed)
if not (mod and name) then
mod, name = minetest.get_node(pos).name:match("([^:]+):([^:]+)")
end
ts_workshop[mod][name].step(pos)
end
minetest.register_node(mod .. ":" .. name, ndef)
end

View File

@ -0,0 +1 @@
name = ts_workshop