local glass_itemstring = "default:glass" local center_itemstring = "default:diamond" if why.mcl then glass_itemstring = "mcl_core:glass" center_itemstring = "mcl_mobitems:ghast_tear" end why.ghost_blocks = {} why.ghost_blocks.block_list = { mcl_core = { --If this mod is defined, all blocks in the list will have ghost versions registered. --"mcl_core:slimeblock", }, --default = {} } why.ghost_blocks.group_list = { "solid", "wood", "tree", "slab_wood", "raw_meat_block", "cooked_meat_block", "burnt_meat_block", "sand", "soil", "cobble", "stone", "wool", "leaves", "glass", "shulker_box", "baked_clay", "pane", "fence", "tnt", "anvil", "solid", "slab", "stair", "pickaxey", "axey", "shovely", "handy", "hoey", "swordy", "solid_liquid", "cracky", "oddly_breakable_by_hand", "snappy", "crumbly", "choppy", } why.ghost_blocks.block_map = {} function why.ghost_blocks.register_ghost_block(block) if not block then return end local block_data = nil pcall(function() block_data = table.copy(minetest.registered_nodes[block]) end) if not block_data then minetest.log("error", "Could not create ghost block from "..block) return end local _, _, new_name = string.find(block, ".+:(.+)") if not new_name then minetest.log("error", "Could not create ghost block from "..block) return end new_name = "ghost_blocks:"..new_name if block == "mcl_enchanting:table" then new_name = "ghost_blocks:enchanting_table" elseif block == "mcl_smithing_table:table" then new_name = "ghost_blocks:smithing_table" end if block == "ghost_blocks:ghostifier" then return end block_data.walkable = false block_data.post_effect_color = "#00000000" if not block_data.description then block_data.description = "Ghost "..block else block_data.description = "Ghost "..block_data.description end block_data.groups.ghost_block = 1 block_data.groups.not_in_creative_inventory = 1 block_data.groups.not_in_craft_guide = 1 block_data.drop = new_name block_data._mcl_silk_touch_drop = {new_name} --override functions --block_data.on_place = nil --block_data.on_use = nil --block_data.on_secondary_use = nil --block_data.after_place_node = nil block_data.on_construct = nil --block_data.on_rightclick = nil --block_data.on_click = nil --is this a thing? Or just on_punch? --block_data.on_walk_over = nil --block_data.on_punch = nil --block_data.on_timer = nil --block_data.groups.eatable = nil --block_data._mcl_saturation = nil block_data.after_dig_node = nil --fixes enchanting table duplication if why.mcl then if new_name == "ghost_blocks:ender_chest" then block_data.groups.pickaxey = 1 end if new_name == "ghost_blocks:chest" then block_data.groups.axey = 1 end if block_data.groups.shulker_box then block_data.groups.pickaxey = 1 end end --minetest.log(tostring(new_name)) minetest.register_node(new_name, block_data) why.ghost_blocks.block_map[block] = new_name why.ghost_blocks.block_map[new_name] = block end local width = 8 if why.mcl then width = 9 end local ghostifier_formspec = "size["..tostring(width)..",7]".. "label[0.3,0.3;"..minetest.formspec_escape(minetest.colorize("#55555", "Ghostifier")).."]".. "list[context;src;1.5,1;1,1]".. "list[context;dst;5,1;1,1]".. why.inventory_formspec(0,2.5).. "listring[context;dst]".. "listring[current_player;main]".. "listring[context;src]".. "listring[current_player;main]" if why.mcl then ghostifier_formspec = ghostifier_formspec.. mcl_formspec.get_itemslot_bg(1.5,1,1,1).. mcl_formspec.get_itemslot_bg(5,1,1,1) end local function ghostifier_action(pos, player) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() if not inv:is_empty("src") then local src_stack = inv:get_stack("src", 1) local dst_stack = inv:get_stack("dst", 1) local original_itemstring = src_stack:get_name() local new_itemstring if original_itemstring == "ghost_blocks:ghostifier" then new_itemstring = "" else new_itemstring = why.ghost_blocks.block_map[original_itemstring] minetest.log(dump(new_itemstring)) if (not new_itemstring) or new_itemstring == "" then return end end if not inv:is_empty("dst") then if new_itemstring ~= dst_stack:get_name() then return --if dst is full of different block end end local added_amount if original_itemstring == "ghost_blocks:ghostifier" then added_amount = src_stack:get_count() if awards and player then awards.unlock(player:get_player_name(), "why:nope") end else added_amount = src_stack:get_count() - inv:add_item("dst", ItemStack(new_itemstring.." "..tostring(src_stack:get_count()))):get_count() end src_stack:set_count(src_stack:get_count() - added_amount) if src_stack:get_count() == 0 then src_stack = ItemStack("") end inv:set_stack("src", 1, src_stack) end end local level if not why.mcl then level = 4 end minetest.register_node("ghost_blocks:ghostifier", { description = "Ghostifier", inventory_image = "[inventorycube{ghost_blocks_ghostifier.png{ghost_blocks_ghostifier.png{ghost_blocks_ghostifier.png", wield_image = "[inventorycube{ghost_blocks_ghostifier.png{ghost_blocks_ghostifier.png{ghost_blocks_ghostifier.png", _mcl_hardness = 1.5, _mcl_blast_resistance = 6, walkable = false, use_texture_alpha = "blend", sunlight_propagates = true, paramtype = "light", drawtype = "allfaces", tiles = {"ghost_blocks_ghostifier.png"}, groups = {ghost_block = 1, pickaxey = 1, cracky = 1, container = 4, level = level}, allow_metadata_inventory_put = function(pos, listname, index, stack, player) if minetest.is_protected(pos, player:get_player_name()) then return 0 end if listname == "src" then return stack:get_count() else return 0 end end, after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) local meta2 = meta:to_table() meta:from_table(oldmetadata) local inv = meta:get_inventory() for _, listname in ipairs({"src", "dst"}) do local stack = inv:get_stack(listname, 1) if not stack:is_empty() then local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} minetest.add_item(p, stack) end end meta:from_table(meta2) end, allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local stack = inv:get_stack(from_list, from_index) if minetest.is_protected(pos, player:get_player_name()) then return 0 end if to_list == "src" then return stack:get_count() else return 0 end end, allow_metadata_inventory_take = function(pos, listname, index, stack, player) if minetest.is_protected(pos, player:get_player_name()) then return 0 end return stack:get_count() end, on_timer = ghostifier_action, on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) ghostifier_action(pos, player) end, on_metadata_inventory_put = function(pos, listname, index, stack, player) ghostifier_action(pos, player) end, on_metadata_inventory_take = function(pos, listname, index, stack, player) ghostifier_action(pos, player) end, on_construct = function(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() inv:set_size("src", 1) inv:set_size("dst", 1) meta:set_string("formspec", ghostifier_formspec) --on_timer(pos, 0) end }) minetest.register_craft({ output = "ghost_blocks:ghostifier", recipe = { {glass_itemstring, glass_itemstring, glass_itemstring}, {glass_itemstring, center_itemstring, glass_itemstring}, {glass_itemstring, glass_itemstring, glass_itemstring} } }) for dependency, block_list in pairs(why.ghost_blocks.block_list) do --Register indivdual blocks in block_list if minetest.get_modpath(dependency) then for _, block in ipairs(block_list) do --minetest.log(block) why.ghost_blocks.register_ghost_block(block) end end end local grouped_items = why.get_group_items(why.ghost_blocks.group_list) for _, group in ipairs(why.ghost_blocks.group_list) do --Register all blocks in groups in group_list for _, block in pairs(grouped_items[group]) do why.ghost_blocks.register_ghost_block(block) end end if awards then awards.register_achievement("why:nope", { title = "Nope. It's gone now.", description = "Attempt to ghostify a ghostifier.", icon = "[inventorycube{ghost_blocks_ghostifier.png{ghost_blocks_ghostifier.png{ghost_blocks_ghostifier.png", type = "Advancement", group = "Why", secret = true }) end