2023-12-27 14:21:25 -08:00

302 lines
9.5 KiB
Lua

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