diff --git a/patches/subgame-basis/mods/homedecor_modpack-0.4.15 or lower/LICENSE b/patches/deprecated-subgame-basis/mods/homedecor_modpack-0.4.15 or lower/LICENSE similarity index 100% rename from patches/subgame-basis/mods/homedecor_modpack-0.4.15 or lower/LICENSE rename to patches/deprecated-subgame-basis/mods/homedecor_modpack-0.4.15 or lower/LICENSE diff --git a/patches/subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/crafts.lua b/patches/deprecated-subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/crafts.lua similarity index 100% rename from patches/subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/crafts.lua rename to patches/deprecated-subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/crafts.lua diff --git a/patches/subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/gastronomy.lua b/patches/deprecated-subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/gastronomy.lua similarity index 100% rename from patches/subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/gastronomy.lua rename to patches/deprecated-subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/gastronomy.lua diff --git a/patches/subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/models/homedecor_beer_mug.obj b/patches/deprecated-subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/models/homedecor_beer_mug.obj similarity index 100% rename from patches/subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/models/homedecor_beer_mug.obj rename to patches/deprecated-subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/models/homedecor_beer_mug.obj diff --git a/patches/subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/textures/homedecor_beer_mug.png b/patches/deprecated-subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/textures/homedecor_beer_mug.png similarity index 100% rename from patches/subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/textures/homedecor_beer_mug.png rename to patches/deprecated-subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/textures/homedecor_beer_mug.png diff --git a/patches/subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/textures/homedecor_beer_mug_inv.png b/patches/deprecated-subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/textures/homedecor_beer_mug_inv.png similarity index 100% rename from patches/subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/textures/homedecor_beer_mug_inv.png rename to patches/deprecated-subgame-basis/mods/homedecor_modpack-0.4.15 or lower/homedecor/textures/homedecor_beer_mug_inv.png diff --git a/patches/deprecated-subgame-basis/mods/spawners-0.4.15 or lower/README.md b/patches/deprecated-subgame-basis/mods/spawners-0.4.15 or lower/README.md new file mode 100644 index 0000000..a8c174a --- /dev/null +++ b/patches/deprecated-subgame-basis/mods/spawners-0.4.15 or lower/README.md @@ -0,0 +1,108 @@ +# Spawners # +This MOD for Minetest let the player craft mob and ore Spawner blocks. Mobs/Ores are spawning randomly in a short intervals. + +From version 0.6 Pyramids can be spawned in desert and environmental spwaners are added. Environmental spawners are used for spawning inside of temples and dungeons (mapgen v6 default minetest game). - Thanks to BlockMen. These kind of spawners are very rarely dropping real mob spawners, in any other case they don't drop anything. + +Easy to implement new mob mods just look in to config.lua. +New features can be enabled/disabled in settings.txt file. + +Currently it works with [Pyramids Mummy](https://forum.minetest.net/viewtopic.php?id=7063), [Mobs Redo](https://forum.minetest.net/viewtopic.php?f=11&t=9917) and [Creatures](https://forum.minetest.net/viewtopic.php?f=11&t=8638). + +![spawners_promo.jpg](https://bitbucket.org/repo/y69Me7/images/3793257566-spawners_promo.jpg) +![spawner_waiting_medium.gif](https://bitbucket.org/repo/y69Me7/images/246761582-spawner_waiting_medium.gif) ![spawner_animated_medium.gif](https://bitbucket.org/repo/y69Me7/images/1359872529-spawner_animated_medium.gif) + +## YouTube video ## +[Minetest - spawners MOD v0.1](https://youtu.be/TlaMVl0ZDtw) + +## Mod dependencies ## +* default +* fake_fire? +* xpanes? +* mobs? +* creatures? +* pyramids? + +mobs redo, creatures are supported mods + +fake_fire, xpanes for recipes + +## Links ## +[[Mod]Minetest Forum Page](https://forum.minetest.net/viewtopic.php?f=11&t=13857) + +[[Server]Minetest Forum Page](https://forum.minetest.net/viewtopic.php?f=10&t=13727) - try this MOD on this server + +[G+ Collection](https://plus.google.com/collection/06fEx) + +[G+ Community](https://plus.google.com/communities/105201070842404099845) + +## License ## +WTFPL + +## Changelog ## +### 0.6 ### +* inherited BlockMen Pyramid mod, so now Spawners can spawn Pyramids in desert (mapgen v6) +* spawning Pyramids work independently from BlockMen Pyramids mod (can be removed) but works also besides BlockMen Pyramid mod +* added more various loot (default) in pyramids chests and higher up the chance of spawning more loot +* added new environmental spawners +* added generation of environmental spawners for default mapgen v6 temples and dungeons +* addend new config parameter 'disable' for night_only attribute in config file +* added new attribute 'env' in config file for defining environmental spawners +* added settings.txt file for enable/disable new features (pyramids, mapgen spawners..) +* fixed abm catch_up (disabled), now it works + +### 0.5.1 ### +* added mobs redo stone monster spawner (re-done from BlockMen Pyramids) + +### 0.5 ### +* new mobs redo sheep textures +* added mobs redo spider spawner +* added oerrki spawner for creatures mod +* added screenshot and description for MODs in-game tab +* added pyramids mod to optional dependencies + +### 0.4 ### +* NEW added ore spawners - iron, gold and copper +* ore spawners have chance to spawn 2 ores from 1 ingot +* ore spawners have formspec +* new sounds for ore spawners +* added particle effect for ore spawners +* re-done all textures from scratch (mob and ore spawners) +* adjusted mob spawners ABM +* added maximum stacked items for spawners to max 1 +* mob spawners fixed name conflicts in config file warthog vs. pumba + +### 0.3 ### +* new folder and file structure +* more convenient disable/enable, add/remove new MODs in config.lua file - added property for custom sounds +* added sound for bunny +* fixed sound for pyramids:mummy +* added footsteps and dug sounds for the spawners +* shorter and more effective code, easier to read, fixed variable namings +* ABM tweak - longer delay to trigger but bigger chance for spawn entity +* disabled ABM catch_up +* added normal map texture for default spawner + +### 0.2 ### +* support pyramids mod - mummy +* support creatures mod +* shorten the code - more effecient + +### 0.1 ### +* Initial Release +* detects only 6 nodes for 'air' around the spawner [top, bottom, left, right, front, back] afterwards it will check the node above and below the found 'air' node - so there is enough space to spawn someone +* always picks random side from where the mob will spawn +* detects for light and time of day - spawn mobs only at night if 'only_night' set to true +* status 'waiting' - blue sparkles, for not enough light (day spawners) or too much light for night spawners +* status 'default/inactive' i.e. if the spawner is closed from each side or there is no space to spawn mob +* status 'active' when spawner is active and is spawning mobs +* status 'overheat' when there is too much 'max_objects_per_block' (prevents from server errors), max value is taken from minetest.conf +* easy to configure, add and remove MODs for mobs +* only [Mobs Redo](https://github.com/tenplus1/mobs) from tenplus1 is added for now +* added recipes for all spawners, it's expensive so it will not get overcrowded on the server only with spawners +* almost everything is done dynamically +* spawners emit small amount of light +* active and overheated spawner can cause fire to flammable nodes around it +* spawners are active only if player is in radius (21) +* spawners are diggable only with steel pickaxe and above, so no noob griefers can raid your base too easy +* mobs play sound when spawned +* animated textures \ No newline at end of file diff --git a/patches/deprecated-subgame-basis/mods/spawners-0.4.15 or lower/spawners_mobs.lua b/patches/deprecated-subgame-basis/mods/spawners-0.4.15 or lower/spawners_mobs.lua new file mode 100644 index 0000000..aa53cfa --- /dev/null +++ b/patches/deprecated-subgame-basis/mods/spawners-0.4.15 or lower/spawners_mobs.lua @@ -0,0 +1,403 @@ +local max_obj_per_mapblock = tonumber(minetest.setting_get("max_objects_per_block")) + +-- +-- * CREATE ALL SPAWNERS NODES * +-- + +function spawners.create(mob_name, mod_prefix, size, offset, mesh, texture, night_only, sound_custom, env) + + -- + -- DUMMY INSIDE THE SPAWNER + -- + + local dummy_definition = { + hp_max = 1, + physical = true, + collisionbox = {0,0,0,0,0,0}, + visual = "mesh", + visual_size = size, + mesh = mesh, + textures = texture, + makes_footstep_sound = false, + timer = 0, + automatic_rotate = math.pi * -3, + m_name = "dummy" + } + + dummy_definition.on_activate = function(self) + self.object:setvelocity({x=0, y=0, z=0}) + self.object:setacceleration({x=0, y=0, z=0}) + self.object:set_armor_groups({immortal=1}) + end + + -- remove dummy after dug up the spawner + dummy_definition.on_step = function(self, dtime) + self.timer = self.timer + dtime + local n = minetest.get_node_or_nil(self.object:getpos()) + if self.timer > 2 then + if n and n.name and n.name ~= "spawners:"..mod_prefix.."_"..mob_name.."_spawner_active" and n.name ~= "spawners:"..mod_prefix.."_"..mob_name.."_spawner_active_env" then + self.object:remove() + end + end + end + + minetest.register_entity("spawners:dummy_"..mod_prefix.."_"..mob_name, dummy_definition) + + -- + -- * CRAFTING SPAWNERS * + -- + + if not env then + + -- print("[Mod][Spawners] Registering Crafting Spawner.") + + -- + -- ACTIVE SPAWNER + -- + + minetest.register_node("spawners:"..mod_prefix.."_"..mob_name.."_spawner_active", { + description = mod_prefix.."_"..mob_name.." spawner active", + paramtype = "light", + light_source = 4, + drawtype = "allfaces", + walkable = true, + sounds = default.node_sound_stone_defaults(), + damage_per_second = 4, + sunlight_propagates = true, + tiles = { + { + name = "spawners_spawner_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0 + }, + } + }, + is_ground_content = true, + groups = {cracky=1,level=2,igniter=1,not_in_creative_inventory=1}, + drop = "spawners:"..mod_prefix.."_"..mob_name.."_spawner", + on_construct = function(pos) + pos.y = pos.y + offset + minetest.add_entity(pos,"spawners:dummy_"..mod_prefix.."_"..mob_name) + end, + }) + + -- + -- WAITING SPAWNER + -- + + -- waiting for light - everything is ok but too much light or not enough light + minetest.register_node("spawners:"..mod_prefix.."_"..mob_name.."_spawner_waiting", { + description = mod_prefix.."_"..mob_name.." spawner waiting", + paramtype = "light", + light_source = 2, + drawtype = "allfaces", + walkable = true, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + tiles = { + { + name = "spawners_spawner_waiting_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0 + }, + } + }, + is_ground_content = true, + groups = {cracky=1,level=2,not_in_creative_inventory=1}, + drop = "spawners:"..mod_prefix.."_"..mob_name.."_spawner", + }) + + -- + -- INACTIVE SPAWNER (DEFAULT) + -- + + minetest.register_node("spawners:"..mod_prefix.."_"..mob_name.."_spawner", { + description = mod_prefix.."_"..mob_name.." spawner", + paramtype = "light", + drawtype = "allfaces", + walkable = true, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + tiles = {"spawners_spawner.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + stack_max = 1, + on_construct = function(pos) + local random_pos, waiting = spawners.check_node_status(pos, mob_name, night_only) + + if random_pos then + minetest.set_node(pos, {name="spawners:"..mod_prefix.."_"..mob_name.."_spawner_active"}) + elseif waiting then + minetest.set_node(pos, {name="spawners:"..mod_prefix.."_"..mob_name.."_spawner_waiting"}) + else + end + end, + }) + + -- + -- OVERHEATED SPAWNER + -- + + minetest.register_node("spawners:"..mod_prefix.."_"..mob_name.."_spawner_overheat", { + description = mod_prefix.."_"..mob_name.." spawner overheated", + paramtype = "light", + light_source = 2, + drawtype = "allfaces", + walkable = true, + sounds = default.node_sound_stone_defaults(), + damage_per_second = 4, + sunlight_propagates = true, + tiles = {"spawners_spawner.png^[colorize:#FF000030"}, + is_ground_content = true, + groups = {cracky=1,level=2,igniter=1,not_in_creative_inventory=1}, + drop = "spawners:"..mod_prefix.."_"..mob_name.."_spawner", + on_construct = function(pos) + minetest.get_node_timer(pos):start(60) + end, + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name="spawners:"..mod_prefix.."_"..mob_name.."_spawner"}) + end, + }) + + else + + -- + -- * ENVIRONMENTAL SPAWNERS * + -- + + -- minetest.log("action", "[Mod][Spawners] Registering Environmental Spawner.") + + -- + -- ACTIVE SPAWNER ENV + -- + + minetest.register_node("spawners:"..mod_prefix.."_"..mob_name.."_spawner_active_env", { + description = mod_prefix.."_"..mob_name.." spawner active env", + paramtype = "light", + light_source = 4, + drawtype = "allfaces", + walkable = true, + sounds = default.node_sound_stone_defaults(), + damage_per_second = 4, + sunlight_propagates = true, + tiles = { + { + name = "spawners_spawner_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0 + }, + } + }, + is_ground_content = true, + groups = {cracky=1,level=2,igniter=1,not_in_creative_inventory=1}, + drop = { + max_items = 1, + items = { + {items = {"spawners:"..mod_prefix.."_"..mob_name.."_spawner"}, rarity = 20} + } + }, + on_construct = function(pos) + pos.y = pos.y + offset + minetest.add_entity(pos,"spawners:dummy_"..mod_prefix.."_"..mob_name) + end, + }) + + -- + -- WAITING SPAWNER ENV + -- + + -- waiting for light - everything is ok but too much light or not enough light + minetest.register_node("spawners:"..mod_prefix.."_"..mob_name.."_spawner_waiting_env", { + description = mod_prefix.."_"..mob_name.." spawner waiting env", + paramtype = "light", + light_source = 2, + drawtype = "allfaces", + walkable = true, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + tiles = { + { + name = "spawners_spawner_waiting_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0 + }, + } + }, + is_ground_content = true, + groups = {cracky=1,level=2,not_in_creative_inventory=1}, + drop = { + max_items = 1, + items = { + {items = {"spawners:"..mod_prefix.."_"..mob_name.."_spawner"}, rarity = 20} + } + }, + }) + + -- + -- INACTIVE SPAWNER (DEFAULT) ENV + -- + + minetest.register_node("spawners:"..mod_prefix.."_"..mob_name.."_spawner_env", { + description = mod_prefix.."_"..mob_name.." spawner env", + paramtype = "light", + drawtype = "allfaces", + walkable = true, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + tiles = {"spawners_spawner.png"}, + is_ground_content = true, + groups = {cracky=1,level=2,not_in_creative_inventory=1}, + stack_max = 1, + drop = { + max_items = 1, + items = { + {items = {"spawners:"..mod_prefix.."_"..mob_name.."_spawner"}, rarity = 20} + } + }, + on_construct = function(pos) + local random_pos, waiting = spawners.check_node_status(pos, mob_name, night_only) + + if random_pos then + minetest.set_node(pos, {name="spawners:"..mod_prefix.."_"..mob_name.."_spawner_active_env"}) + elseif waiting then + minetest.set_node(pos, {name="spawners:"..mod_prefix.."_"..mob_name.."_spawner_waiting_env"}) + else + end + end, + }) + + -- + -- OVERHEATED SPAWNER ENV + -- + + minetest.register_node("spawners:"..mod_prefix.."_"..mob_name.."_spawner_overheat_env", { + description = mod_prefix.."_"..mob_name.." spawner overheated env", + paramtype = "light", + light_source = 2, + drawtype = "allfaces", + walkable = true, + sounds = default.node_sound_stone_defaults(), + damage_per_second = 4, + sunlight_propagates = true, + tiles = {"spawners_spawner.png^[colorize:#FF000030"}, + is_ground_content = true, + groups = {cracky=1,level=2,igniter=1,not_in_creative_inventory=1}, + drop = { + max_items = 1, + items = { + {items = {"spawners:"..mod_prefix.."_"..mob_name.."_spawner"}, rarity = 20} + } + }, + on_construct = function(pos) + minetest.get_node_timer(pos):start(60) + end, + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name="spawners:"..mod_prefix.."_"..mob_name.."_spawner_env"}) + end, + }) + end + + -- + -- * ABM * + -- + + minetest.register_abm({ + nodenames = { + "spawners:"..mod_prefix.."_"..mob_name.."_spawner", + "spawners:"..mod_prefix.."_"..mob_name.."_spawner_active", + "spawners:"..mod_prefix.."_"..mob_name.."_spawner_overheat", + "spawners:"..mod_prefix.."_"..mob_name.."_spawner_waiting", + "spawners:"..mod_prefix.."_"..mob_name.."_spawner_env", + "spawners:"..mod_prefix.."_"..mob_name.."_spawner_active_env", + "spawners:"..mod_prefix.."_"..mob_name.."_spawner_overheat_env", + "spawners:"..mod_prefix.."_"..mob_name.."_spawner_waiting_env" + }, + neighbors = {"air"}, + interval = 10.0, + chance = 6, + catch_up = false, + action = function(pos, node, active_object_count, active_object_count_wider) + + local random_pos, waiting = spawners.check_node_status(pos, mob_name, night_only) + + -- additional name extention for environmental spawners + local ext + local env_ext = string.sub(node.name, string.len(node.name) - 3) + + if env_ext and env_ext == "_env" then + ext = "_env" + else + ext = "" + end + + -- minetest.log("action", "[Mod][Spawners] checking for: "..mob_name.." at "..minetest.pos_to_string(pos)) + + if random_pos then + + -- do not spawn if too many active entities in map block and call cooldown + if active_object_count_wider > max_obj_per_mapblock then + + -- make sure the right node status is shown + if node.name ~= "spawners:"..mob_name.."_spawner_overheat"..ext then + minetest.set_node(pos, {name="spawners:"..mod_prefix.."_"..mob_name.."_spawner_overheat"..ext}) + end + + -- extend the timeout if still too many entities in map block + if node.name == "spawners:"..mod_prefix.."_"..mob_name.."_spawner_overheat"..ext then + minetest.get_node_timer(pos):stop() + minetest.get_node_timer(pos):start(60) + end + + return + end + -- make sure the right node status is shown + if node.name ~= "spawners:"..mod_prefix.."_"..mob_name.."_spawner_active"..ext then + minetest.set_node(pos, {name="spawners:"..mod_prefix.."_"..mob_name.."_spawner_active"..ext}) + end + + -- enough place to spawn more mobs + spawners.start_spawning(random_pos, 1, "spawners:"..mob_name, mod_prefix, sound_custom) + + elseif waiting then + -- waiting status + if node.name ~= "spawners:"..mod_prefix.."_"..mob_name.."_spawner_waiting"..ext then + minetest.set_node(pos, {name="spawners:"..mod_prefix.."_"..mob_name.."_spawner_waiting"..ext}) + end + else + -- no random_pos found + if minetest.get_node_timer(pos):is_started() then + minetest.get_node_timer(pos):stop() + end + + if node.name ~= "spawners:"..mod_prefix.."_"..mob_name.."_spawner"..ext then + minetest.set_node(pos, {name="spawners:"..mod_prefix.."_"..mob_name.."_spawner"..ext}) + end + end + + end + }) + +end + +-- +-- CALL 'CREATE' FOR ALL SPAWNERS +-- + +for i, mob_table in ipairs(spawners.mob_tables) do + if mob_table then + + spawners.create(mob_table.name, mob_table.mod_prefix, mob_table.dummy_size, mob_table.dummy_offset, mob_table.dummy_mesh, mob_table.dummy_texture, mob_table.night_only, mob_table.sound_custom, mob_table.env) + end +end \ No newline at end of file diff --git a/patches/deprecated-subgame-basis/mods/spawners-0.4.15 or lower/spawners_ores.lua b/patches/deprecated-subgame-basis/mods/spawners-0.4.15 or lower/spawners_ores.lua new file mode 100644 index 0000000..8ecfede --- /dev/null +++ b/patches/deprecated-subgame-basis/mods/spawners-0.4.15 or lower/spawners_ores.lua @@ -0,0 +1,335 @@ +-- Formspecs +local ore_formspec = + "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "label[2,1.7;Input Ingot]".. + "list[current_name;fuel;3.5,1.5;1,1;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "button_exit[5,1.5;2,1;exit;Save]".. + "listring[current_name;fuel]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) + +function spawners.get_formspec(pos) + + -- Inizialize metadata + local meta = minetest.get_meta(pos) + + -- Inizialize inventory + local inv = meta:get_inventory() + for listname, size in pairs({ + fuel = 1, + }) do + if inv:get_size(listname) ~= size then + inv:set_size(listname, size) + end + end + + -- Update formspec, infotext and node + meta:set_string("formspec", ore_formspec) +end + +local function can_dig(pos, player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("fuel") +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + minetest.record_protection_violation(pos, player:get_player_name()) + return + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local ingot = minetest.get_node_or_nil(pos).name + + ingot = string.split(ingot, ":") + ingot = string.split(ingot[2], "_") + + if ingot[3] == "iron" then + ingot[3] = "steel" + end + + if stack:get_name() == "default:"..ingot[3].."_ingot" then + return stack:get_count() + else + return 0 + end +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + minetest.record_protection_violation(pos, player:get_player_name()) + return 0 + end + return stack:get_count() +end + +local function on_receive_fields(pos, formname, fields, sender) + local ore_node = minetest.get_node_or_nil(pos) + + if minetest.is_protected(pos, sender:get_player_name()) then + minetest.record_protection_violation(pos, sender:get_player_name()) + return + end + + -- get the ore name + local ingot = ore_node.name + ingot = string.split(ingot, ":") + ingot = string.split(ingot[2], "_") + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local fuellist = inv:get_list("fuel") + + if inv:is_empty("fuel") then + if ore_node.name ~= "spawners:stone_with_"..ingot[3].."_spawner" then + minetest.swap_node(pos, {name="spawners:stone_with_"..ingot[3].."_spawner"}) + end + meta:set_string("infotext", ingot[3].." ore spawner is empty") + else + meta:set_string("infotext", ingot[3].." ore spawner fuel: "..inv:get_stack("fuel", 1):get_count()) + end + + -- fix iron vs. steel issue + if ingot[3] == "iron" then + ingot[3] = "steel" + end + + if not fuellist[1]:is_empty() and inv:get_stack("fuel", 1):get_name() == "default:"..ingot[3].."_ingot" then + + -- fix iron vs. steel issue + if ingot[3] == "steel" then + ingot[3] = "iron" + end + + local waiting, found_node = spawners.check_node_status_ores(pos, "stone_with_"..ingot[3], "default:stone") + + if found_node then + minetest.swap_node(pos, {name="spawners:stone_with_"..ingot[3].."_spawner_active"}) + elseif waiting then + minetest.swap_node(pos, {name="spawners:stone_with_"..ingot[3].."_spawner_waiting"}) + + meta:set_string("infotext", "Waiting status - player was away or no stone around, "..ingot[3].." ore spawner fuel: "..inv:get_stack("fuel", 1):get_count()) + else + return + end + end +end + +-- Ores creation +function spawners.create_ore(ore_name, mod_prefix, size, offset, texture, sound_custom) + -- dummy inside the spawner + local dummy_ore_definition = { + hp_max = 1, + physical = false, + collisionbox = {0,0,0,0,0,0}, + visual = "wielditem", + visual_size = size, + timer = 0, + textures={"default:"..ore_name}, + makes_footstep_sound = false, + automatic_rotate = math.pi * -3, + m_name = "dummy_ore" + } + + local ore = string.split(ore_name, "_") + + dummy_ore_definition.on_activate = function(self) + self.object:setvelocity({x=0, y=0, z=0}) + self.object:setacceleration({x=0, y=0, z=0}) + self.object:set_armor_groups({immortal=1}) + end + + -- remove dummy after dug up the spawner + dummy_ore_definition.on_step = function(self, dtime) + self.timer = self.timer + dtime + local n = minetest.get_node_or_nil(self.object:getpos()) + if self.timer > 2 then + if n and n.name and n.name ~= "spawners:"..ore_name.."_spawner_active" and n.name ~= "spawners:"..ore_name.."_spawner_waiting" and n.name ~= "spawners:"..ore_name.."_spawner" then + self.object:remove() + end + end + end + + minetest.register_entity("spawners:dummy_ore_"..ore_name, dummy_ore_definition) + + -- node spawner active + minetest.register_node("spawners:"..ore_name.."_spawner_active", { + description = ore_name.." spawner active", + paramtype = "light", + light_source = 4, + drawtype = "allfaces", + walkable = true, + sounds = default.node_sound_stone_defaults(), + damage_per_second = 4, + sunlight_propagates = true, + tiles = { + { + name = "spawners_spawner_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0 + }, + } + }, + is_ground_content = true, + groups = {cracky=1,level=2,igniter=1,not_in_creative_inventory=1}, + drop = "spawners:"..ore_name.."_spawner", + can_dig = can_dig, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + on_receive_fields = on_receive_fields, + }) + + -- node spawner waiting - no stone around or no fuel + minetest.register_node("spawners:"..ore_name.."_spawner_waiting", { + description = ore_name.." spawner waiting", + paramtype = "light", + light_source = 2, + drawtype = "allfaces", + walkable = true, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + tiles = { + { + name = "spawners_spawner_waiting_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0 + }, + } + }, + is_ground_content = true, + groups = {cracky=1,level=2,not_in_creative_inventory=1}, + drop = "spawners:"..ore_name.."_spawner", + can_dig = can_dig, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + on_receive_fields = on_receive_fields, + }) + + -- node spawner inactive (default) + minetest.register_node("spawners:"..ore_name.."_spawner", { + description = ore_name.." spawner", + paramtype = "light", + drawtype = "allfaces", + walkable = true, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + tiles = {"spawners_spawner.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + stack_max = 1, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + spawners.get_formspec(pos) + pos.y = pos.y + offset + minetest.add_entity(pos,"spawners:dummy_ore_"..ore_name) + meta:set_string("infotext", ore[3].." ore spawner is empty") + end, + + can_dig = can_dig, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + on_receive_fields = on_receive_fields, + }) + + -- ABM + minetest.register_abm({ + nodenames = {"spawners:"..ore_name.."_spawner_active", "spawners:"..ore_name.."_spawner_waiting"}, + interval = 5.0, + chance = 5, + action = function(pos, node, active_object_count, active_object_count_wider) + + local waiting, found_node = spawners.check_node_status_ores(pos, ore_name, "default:stone") + + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + if found_node then + -- make sure the right node status is shown + if node.name ~= "spawners:"..ore_name.."_spawner_active" then + minetest.swap_node(pos, {name="spawners:"..ore_name.."_spawner_active"}) + end + + + -- take fuel + local stack = inv:get_stack("fuel", 1) + stack:take_item() + + + inv:set_stack("fuel", 1, stack) + + meta:set_string("infotext", ore[3].." ore spawner fuel: "..inv:get_stack("fuel", 1):get_count()) + + -- enough place to spawn more ores + spawners.start_spawning_ores(found_node, "default:"..ore_name, sound_custom) + + -- empty / no fuel + if inv:is_empty("fuel") then + minetest.swap_node(pos, {name="spawners:"..ore_name.."_spawner"}) + meta:set_string("infotext", ore[3].." ore spawner is empty.") + + end + else + -- waiting status + if node.name ~= "spawners:"..ore_name.."_spawner_waiting" then + minetest.swap_node(pos, {name="spawners:"..ore_name.."_spawner_waiting"}) + + meta:set_string("infotext", "Waiting status - player was away or no stone around, "..ore[3].." ore spawner fuel: "..inv:get_stack("fuel", 1):get_count()) + end + end + + end + }) + +end + +-- default:stone_with_gold +spawners.create_ore("stone_with_gold", "", {x=.33,y=.33}, 0, {"default_stone.png^default_mineral_gold.png"}, "strike") + +-- default:stone_with_iron +spawners.create_ore("stone_with_iron", "", {x=.33,y=.33}, 0, {"default_stone.png^default_mineral_gold.png"}, "strike") + +-- default:stone_with_copper +spawners.create_ore("stone_with_copper", "", {x=.33,y=.33}, 0, {"default_stone.png^default_mineral_gold.png"}, "strike") + + +-- recipes +minetest.register_craft({ + output = "spawners:stone_with_gold_spawner", + recipe = { + {"default:diamondblock", "fire:flint_and_steel", "default:diamondblock"}, + {"xpanes:bar_flat", "default:goldblock", "xpanes:bar_flat"}, + {"default:diamondblock", "xpanes:bar_flat", "default:diamondblock"}, + } +}) + +minetest.register_craft({ + output = "spawners:stone_with_iron_spawner", + recipe = { + {"default:diamondblock", "fire:flint_and_steel", "default:diamondblock"}, + {"xpanes:bar_flat", "default:steelblock", "xpanes:bar_flat"}, + {"default:diamondblock", "xpanes:bar_flat", "default:diamondblock"}, + } +}) + +minetest.register_craft({ + output = "spawners:stone_with_copper_spawner", + recipe = { + {"default:diamondblock", "fire:flint_and_steel", "default:diamondblock"}, + {"xpanes:bar_flat", "default:copperblock", "xpanes:bar_flat"}, + {"default:diamondblock", "xpanes:bar_flat", "default:diamondblock"}, + } +}) diff --git a/patches/subgame/mods/homedecor_modpack-0.4.15 or lower/homedecor/crafts.lua b/patches/deprecated-subgame/mods/homedecor_modpack-0.4.15 or lower/homedecor/crafts.lua similarity index 100% rename from patches/subgame/mods/homedecor_modpack-0.4.15 or lower/homedecor/crafts.lua rename to patches/deprecated-subgame/mods/homedecor_modpack-0.4.15 or lower/homedecor/crafts.lua diff --git a/patches/subgame/mods/homedecor_modpack-0.4.15 or lower/homedecor/gastronomy.lua b/patches/deprecated-subgame/mods/homedecor_modpack-0.4.15 or lower/homedecor/gastronomy.lua similarity index 100% rename from patches/subgame/mods/homedecor_modpack-0.4.15 or lower/homedecor/gastronomy.lua rename to patches/deprecated-subgame/mods/homedecor_modpack-0.4.15 or lower/homedecor/gastronomy.lua diff --git a/patches/subgame/mods/homedecor_modpack-0.4.15 or lower/homedecor/textures/homedecor_beer_mug.png b/patches/deprecated-subgame/mods/homedecor_modpack-0.4.15 or lower/homedecor/textures/homedecor_beer_mug.png similarity index 100% rename from patches/subgame/mods/homedecor_modpack-0.4.15 or lower/homedecor/textures/homedecor_beer_mug.png rename to patches/deprecated-subgame/mods/homedecor_modpack-0.4.15 or lower/homedecor/textures/homedecor_beer_mug.png diff --git a/patches/subgame/mods/homedecor_modpack-0.4.15 or lower/homedecor/textures/homedecor_beer_mug_inv.png b/patches/deprecated-subgame/mods/homedecor_modpack-0.4.15 or lower/homedecor/textures/homedecor_beer_mug_inv.png similarity index 100% rename from patches/subgame/mods/homedecor_modpack-0.4.15 or lower/homedecor/textures/homedecor_beer_mug_inv.png rename to patches/deprecated-subgame/mods/homedecor_modpack-0.4.15 or lower/homedecor/textures/homedecor_beer_mug_inv.png diff --git a/patches/subgame/mods/spawners/spawners_mobs.lua b/patches/deprecated-subgame/mods/spawners-0.4.15 or lower/spawners_mobs.lua similarity index 93% rename from patches/subgame/mods/spawners/spawners_mobs.lua rename to patches/deprecated-subgame/mods/spawners-0.4.15 or lower/spawners_mobs.lua index 66e613b..3192df6 100644 --- a/patches/subgame/mods/spawners/spawners_mobs.lua +++ b/patches/deprecated-subgame/mods/spawners-0.4.15 or lower/spawners_mobs.lua @@ -203,8 +203,9 @@ function spawners.create(mob_name, mod_prefix, size, offset, mesh, texture, nigh max_items = 1, items = { --{items = {"spawners:"..mod_prefix.."_"..mob_name.."_spawner"}, rarity = 20} - {items = {"default:diamond", "default:iron"}, rarity = 20} - {items = {"default:diamond"}, rarity = 1} + {items = {"default:iron_lump", "default:diamond", "default:diamond"}, rarity = 7}, + {items = {"default:iron_lump", "default:diamond"}, rarity = 2}, + {items = { "default:diamond"}, rarity = 1} } }, on_construct = function(pos) @@ -243,8 +244,9 @@ function spawners.create(mob_name, mod_prefix, size, offset, mesh, texture, nigh max_items = 1, items = { --{items = {"spawners:"..mod_prefix.."_"..mob_name.."_spawner"}, rarity = 20} - {items = {"default:diamond", "default:iron"}, rarity = 20} - {items = {"default:diamond"}, rarity = 1} + {items = {"default:iron_lump", "default:diamond", "default:diamond"}, rarity = 7}, + {items = {"default:iron_lump", "default:diamond"}, rarity = 2}, + {items = { "default:diamond"}, rarity = 1} } }, }) @@ -268,8 +270,9 @@ function spawners.create(mob_name, mod_prefix, size, offset, mesh, texture, nigh max_items = 1, items = { -- {items = {"spawners:"..mod_prefix.."_"..mob_name.."_spawner"}, rarity = 20} - {items = {"default:diamond", "default:iron"}, rarity = 20} - {items = {"default:diamond"}, rarity = 1} + {items = {"default:iron_lump", "default:diamond", "default:diamond"}, rarity = 7}, + {items = {"default:iron_lump", "default:diamond"}, rarity = 2}, + {items = { "default:diamond"}, rarity = 1} } }, on_construct = function(pos) @@ -304,8 +307,9 @@ function spawners.create(mob_name, mod_prefix, size, offset, mesh, texture, nigh max_items = 1, items = { -- {items = {"spawners:"..mod_prefix.."_"..mob_name.."_spawner"}, rarity = 20} - {items = {"default:diamond", "default:iron"}, rarity = 20} - {items = {"default:diamond"}, rarity = 1} + {items = {"default:iron_lump", "default:diamond", "default:diamond"}, rarity = 7}, + {items = {"default:iron_lump", "default:diamond"}, rarity = 2}, + {items = { "default:diamond"}, rarity = 1} } }, on_construct = function(pos) diff --git a/patches/deprecated-subgame/mods/spawners-0.4.15 or lower/spawners_ores.lua b/patches/deprecated-subgame/mods/spawners-0.4.15 or lower/spawners_ores.lua new file mode 100644 index 0000000..399dd46 --- /dev/null +++ b/patches/deprecated-subgame/mods/spawners-0.4.15 or lower/spawners_ores.lua @@ -0,0 +1,335 @@ +-- Formspecs +local ore_formspec = + "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "label[2,1.7;Input Ingot]".. + "list[current_name;fuel;3.5,1.5;1,1;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "button_exit[5,1.5;2,1;exit;Save]".. + "listring[current_name;fuel]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) + +function spawners.get_formspec(pos) + + -- Inizialize metadata + local meta = minetest.get_meta(pos) + + -- Inizialize inventory + local inv = meta:get_inventory() + for listname, size in pairs({ + fuel = 1, + }) do + if inv:get_size(listname) ~= size then + inv:set_size(listname, size) + end + end + + -- Update formspec, infotext and node + meta:set_string("formspec", ore_formspec) +end + +local function can_dig(pos, player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("fuel") +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + minetest.record_protection_violation(pos, player:get_player_name()) + return + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local ingot = minetest.get_node_or_nil(pos).name + + ingot = string.split(ingot, ":") + ingot = string.split(ingot[2], "_") + + if ingot[3] == "iron" then + ingot[3] = "steel" + end + + if stack:get_name() == "default:"..ingot[3].."_ingot" then + return stack:get_count() + else + return 0 + end +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + minetest.record_protection_violation(pos, player:get_player_name()) + return 0 + end + return stack:get_count() +end + +local function on_receive_fields(pos, formname, fields, sender) + local ore_node = minetest.get_node_or_nil(pos) + + if minetest.is_protected(pos, sender:get_player_name()) then + minetest.record_protection_violation(pos, sender:get_player_name()) + return + end + + -- get the ore name + local ingot = ore_node.name + ingot = string.split(ingot, ":") + ingot = string.split(ingot[2], "_") + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local fuellist = inv:get_list("fuel") + + if inv:is_empty("fuel") then + if ore_node.name ~= "spawners:stone_with_"..ingot[3].."_spawner" then + minetest.swap_node(pos, {name="spawners:stone_with_"..ingot[3].."_spawner"}) + end + meta:set_string("infotext", ingot[3].." ore spawner is empty") + else + meta:set_string("infotext", ingot[3].." ore spawner fuel: "..inv:get_stack("fuel", 1):get_count()) + end + + -- fix iron vs. steel issue + if ingot[3] == "iron" then + ingot[3] = "steel" + end + + if not fuellist[1]:is_empty() and inv:get_stack("fuel", 1):get_name() == "default:"..ingot[3].."_ingot" then + + -- fix iron vs. steel issue + if ingot[3] == "steel" then + ingot[3] = "iron" + end + + local waiting, found_node = spawners.check_node_status_ores(pos, "stone_with_"..ingot[3], "default:stone") + + if found_node then + minetest.swap_node(pos, {name="spawners:stone_with_"..ingot[3].."_spawner_active"}) + elseif waiting then + minetest.swap_node(pos, {name="spawners:stone_with_"..ingot[3].."_spawner_waiting"}) + + meta:set_string("infotext", "Waiting status - player was away or no stone around, "..ingot[3].." ore spawner fuel: "..inv:get_stack("fuel", 1):get_count()) + else + return + end + end +end + +-- Ores creation +function spawners.create_ore(ore_name, mod_prefix, size, offset, texture, sound_custom) + -- dummy inside the spawner + local dummy_ore_definition = { + hp_max = 1, + physical = false, + collisionbox = {0,0,0,0,0,0}, + visual = "wielditem", + visual_size = size, + timer = 0, + textures={"default:"..ore_name}, + makes_footstep_sound = false, + automatic_rotate = math.pi * -3, + m_name = "dummy_ore" + } + + local ore = string.split(ore_name, "_") + + dummy_ore_definition.on_activate = function(self) + self.object:setvelocity({x=0, y=0, z=0}) + self.object:setacceleration({x=0, y=0, z=0}) + self.object:set_armor_groups({immortal=1}) + end + + -- remove dummy after dug up the spawner + dummy_ore_definition.on_step = function(self, dtime) + self.timer = self.timer + dtime + local n = minetest.get_node_or_nil(self.object:getpos()) + if self.timer > 2 then + if n and n.name and n.name ~= "spawners:"..ore_name.."_spawner_active" and n.name ~= "spawners:"..ore_name.."_spawner_waiting" and n.name ~= "spawners:"..ore_name.."_spawner" then + self.object:remove() + end + end + end + + minetest.register_entity("spawners:dummy_ore_"..ore_name, dummy_ore_definition) + + -- node spawner active + minetest.register_node("spawners:"..ore_name.."_spawner_active", { + description = ore_name.." spawner active", + paramtype = "light", + light_source = 4, + drawtype = "allfaces", + walkable = true, + sounds = default.node_sound_stone_defaults(), + damage_per_second = 4, + sunlight_propagates = true, + tiles = { + { + name = "spawners_spawner_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0 + }, + } + }, + is_ground_content = true, + groups = {cracky=1,level=2,igniter=1,not_in_creative_inventory=1}, + drop = "spawners:"..ore_name.."_spawner", + can_dig = can_dig, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + on_receive_fields = on_receive_fields, + }) + + -- node spawner waiting - no stone around or no fuel + minetest.register_node("spawners:"..ore_name.."_spawner_waiting", { + description = ore_name.." spawner waiting", + paramtype = "light", + light_source = 2, + drawtype = "allfaces", + walkable = true, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + tiles = { + { + name = "spawners_spawner_waiting_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0 + }, + } + }, + is_ground_content = true, + groups = {cracky=1,level=2,not_in_creative_inventory=1}, + drop = "spawners:"..ore_name.."_spawner", + can_dig = can_dig, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + on_receive_fields = on_receive_fields, + }) + + -- node spawner inactive (default) + minetest.register_node("spawners:"..ore_name.."_spawner", { + description = ore_name.." spawner", + paramtype = "light", + drawtype = "allfaces", + walkable = true, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + tiles = {"spawners_spawner.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + stack_max = 1, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + spawners.get_formspec(pos) + pos.y = pos.y + offset + minetest.add_entity(pos,"spawners:dummy_ore_"..ore_name) + meta:set_string("infotext", ore[3].." ore spawner is empty") + end, + + can_dig = can_dig, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + on_receive_fields = on_receive_fields, + }) + + -- ABM + minetest.register_abm({ + nodenames = {"spawners:"..ore_name.."_spawner_active", "spawners:"..ore_name.."_spawner_waiting"}, + interval = 5.0, + chance = 5, + action = function(pos, node, active_object_count, active_object_count_wider) + + local waiting, found_node = spawners.check_node_status_ores(pos, ore_name, "default:stone") + + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + if found_node then + -- make sure the right node status is shown + if node.name ~= "spawners:"..ore_name.."_spawner_active" then + minetest.swap_node(pos, {name="spawners:"..ore_name.."_spawner_active"}) + end + + + -- take fuel + local stack = inv:get_stack("fuel", 1) + stack:take_item() + + + inv:set_stack("fuel", 1, stack) + + meta:set_string("infotext", ore[3].." ore spawner fuel: "..inv:get_stack("fuel", 1):get_count()) + + -- enough place to spawn more ores + spawners.start_spawning_ores(found_node, "default:"..ore_name, sound_custom) + + -- empty / no fuel + if inv:is_empty("fuel") then + minetest.swap_node(pos, {name="spawners:"..ore_name.."_spawner"}) + meta:set_string("infotext", ore[3].." ore spawner is empty.") + + end + else + -- waiting status + if node.name ~= "spawners:"..ore_name.."_spawner_waiting" then + minetest.swap_node(pos, {name="spawners:"..ore_name.."_spawner_waiting"}) + + meta:set_string("infotext", "Waiting status - player was away or no stone around, "..ore[3].." ore spawner fuel: "..inv:get_stack("fuel", 1):get_count()) + end + end + + end + }) + +end + +-- default:stone_with_gold +-- spawners.create_ore("stone_with_gold", "", {x=.33,y=.33}, 0, {"default_stone.png^default_mineral_gold.png"}, "strike") + +-- default:stone_with_iron +-- spawners.create_ore("stone_with_iron", "", {x=.33,y=.33}, 0, {"default_stone.png^default_mineral_gold.png"}, "strike") + +-- default:stone_with_copper +-- spawners.create_ore("stone_with_copper", "", {x=.33,y=.33}, 0, {"default_stone.png^default_mineral_gold.png"}, "strike") + + +-- recipes +-- minetest.register_craft({ +-- output = "spawners:stone_with_gold_spawner", +-- recipe = { +-- {"default:diamondblock", "fire:flint_and_steel", "default:diamondblock"}, +-- {"xpanes:bar_flat", "default:goldblock", "xpanes:bar_flat"}, +-- {"default:diamondblock", "xpanes:bar_flat", "default:diamondblock"}, +-- } +-- }) + +-- minetest.register_craft({ +-- output = "spawners:stone_with_iron_spawner", +-- recipe = { +-- {"default:diamondblock", "fire:flint_and_steel", "default:diamondblock"}, +-- {"xpanes:bar_flat", "default:steelblock", "xpanes:bar_flat"}, +-- {"default:diamondblock", "xpanes:bar_flat", "default:diamondblock"}, +-- } +-- }) + +-- minetest.register_craft({ +-- output = "spawners:stone_with_copper_spawner", +-- recipe = { +-- {"default:diamondblock", "fire:flint_and_steel", "default:diamondblock"}, +-- {"xpanes:bar_flat", "default:copperblock", "xpanes:bar_flat"}, +-- {"default:diamondblock", "xpanes:bar_flat", "default:diamondblock"}, +-- } +-- })