ThePython 5730b8d784 v1
2023-07-23 17:04:44 -07:00

254 lines
10 KiB
Lua

local storage = minetest.get_mod_storage()
local mineclone = minetest.get_modpath("mcl_core")
local randomize_node_drops = false
local randomize_entity_drops = false
local randomize_crafts = false
--[[local entity_blacklist = {
"mobs_mc:slime_big",
"mobs_mc:slime_small",
"mobs_mc:slime_tiny",
"mobs_mc:magma_cube_big",
"mobs_mc:magma_cube_small",
"mobs_mc:magma_cube_tiny",
} --]]
if (storage:get_int("randomize_node_drops") == 1) or
(minetest.settings:get_bool("better_randomizer_randomize_node_drops", true) and not (storage:get_int("not_first_load") == 1)) then
randomize_node_drops = true
end
if (storage:get_int("randomize_entity_drops") == 1) or
(minetest.settings:get_bool("better_randomizer_randomize_entity_drops", true) and not (storage:get_int("not_first_load") == 1)) then
randomize_entity_drops = true
end
if minetest.settings:get_bool("better_randomizer_randomize_crafts", true) and not (storage:get_int("not_first_load") == 1) then
randomize_crafts = true
end
storage:set_int("not_first_load", 1)
better_randomizer = {}
function better_randomizer.load_node_drops()
if not better_randomizer.random_node_drops then return end
for i, info in ipairs(better_randomizer.random_node_drops) do
if info.name and info.overrides then
minetest.override_item(info.name, info.overrides)
end
end
end
function better_randomizer.load_entity_drops()
if not better_randomizer.random_entity_drops then return end
for i, info in ipairs(better_randomizer.random_entity_drops) do
if info.name and info.drops and minetest.registered_entities[info.name] then
minetest.registered_entities[info.name].drops = info.drops
end
end
end
function better_randomizer.randomize_node_drops()
storage:set_int("randomize_node_drops", 0)
storage:set_int("node_drops_randomized", 1)
local items = {}
better_randomizer.random_node_drops = {}
for name, def in pairs(minetest.registered_nodes) do
if (not def.groups.not_in_creative_inventory) and --if available in creative inventory
((def.drop ~= "" and def.drop ~= {}) or (mineclone and def._mcl_silk_touch_drop or def._mcl_shears_drop)) --and has a drop
and not (mineclone and (minetest.get_item_group(name, "coral") == 1)) --and isn't live coral
and minetest.get_item_group(name, "ghost_block") ~= 1 then -- and isn't a ghost block
table.insert(items, name)
local drop = def.drop or name
if not mineclone then
table.insert(better_randomizer.random_node_drops, {name=name, overrides = {drop = drop}})
else
local silk_touch = def._mcl_silk_touch_drop
if silk_touch == true then silk_touch = name end
local shears = def._mcl_shears_drop
if shears == true then shears = name end
table.insert(better_randomizer.random_node_drops, {name=name, overrides = {
drop = drop,
_mcl_silk_touch_drop = silk_touch,
_mcl_shears_drop = shears,
_mcl_fortune_drop = def._mcl_fortune_drop
}})
end
end
end
table.shuffle(items)
for i, name in ipairs(items) do
better_randomizer.random_node_drops[i].name = name
end
storage:set_string("node_drops", minetest.serialize(better_randomizer.random_node_drops))
better_randomizer.load_node_drops()
end
function better_randomizer.randomize_entity_drops()
storage:set_int("randomize_entity_drops", 0)
storage:set_int("entity_drops_randomized", 1)
better_randomizer.random_entity_drops = {}
local entities = {}
for name, def in pairs(minetest.registered_entities) do
if def.drops and (#def.drops > 0) then
table.insert(entities, name)
table.insert(better_randomizer.random_entity_drops, {name=name, drops=def.drops})
end
end
table.shuffle(better_randomizer.random_entity_drops)
for i, name in ipairs(entities) do
better_randomizer.random_entity_drops[i].name = name
end
storage:set_string("entity_drops", minetest.serialize(better_randomizer.random_entity_drops))
better_randomizer.load_entity_drops()
end
local original_entity_drops = {}
for name, def in pairs(minetest.registered_entities) do
if def.drops then
original_entity_drops[name] = def.drops
end
end
function better_randomizer.unrandomize_entity_drops()
storage:set_int("entity_drops_randomized", 0)
storage:set_int("randomize_entity_drops", 0)
for name, drops in pairs(original_entity_drops) do
minetest.registered_entities[name].drops = drops
end
end
function better_randomizer.randomize_crafts()
storage:set_int("randomize_crafts", 0)
storage:set_int("crafts_randomized", 1)
for _, type in ipairs({"normal", "cooking"}) do
table.shuffle(better_randomizer.all_crafts[type])
local i = 1
for key, value in pairs(better_randomizer.random_crafts[type]) do
better_randomizer.random_crafts[type][key] = better_randomizer.all_crafts[type][i]
i = i + 1
end
end
storage:set_string("crafts", minetest.serialize(better_randomizer.random_crafts))
end
minetest.register_chatcommand("randomize_node_drops", {
privs = {server = true},
description = "Randomizes node drops after the next restart. Requires server privilege.",
func = function()
storage:set_int("randomize_node_drops", 1)
storage:set_int("node_drops_randomized", 1)
end
})
minetest.register_chatcommand("toggle_node_drop_randomization", {
privs = {server = true},
description = "Toggles node drop randomization after the next restart. Drops are *not re-randomized* when toggling randomness. Requires server privilege.",
func = function()
storage:set_int("randomize_node_drops", 0)
if storage:get_int("node_drops_randomized") == 0 then
storage:set_int("node_drops_randomized", 1)
else
storage:set_int("node_drops_randomized", 0)
end
end
})
minetest.register_chatcommand("randomize_entity_drops", {
privs = {server = true},
description = "Randomizes entity drops without requiring a restart. Requires server privilege.",
func = better_randomizer.randomize_entity_drops
})
minetest.register_chatcommand("toggle_entity_drop_randomization", {
privs = {server = true},
description = "Toggles entity drop randomization without requiring a restart. Drops are *not re-randomized* when toggling randomness. Requires server privilege.",
func = function()
storage:set_int("randomize_entity_drops", 0)
if storage:get_int("entity_drops_randomized") == 0 then
better_randomizer.load_entity_drops()
storage:set_int("entity_drops_randomized", 1)
else
storage:set_int("entity_drops_randomized", 0)
better_randomizer.unrandomize_entity_drops()
end
end
})
minetest.register_chatcommand("randomize_crafts", {
privs = {server = true},
description = "Randomizes crafting recipes, without requiring a restart. Requires server privilege.",
func = better_randomizer.randomize_crafts
})
minetest.register_chatcommand("toggle_craft_randomization", {
privs = {server = true},
description = "Toggles crafting randomization without requiring a restart. Recipes are *not re-randomized* when toggling randomness. Requires server privilege.",
func = function()
if storage:get_int("crafts_randomized") == 0 then
storage:set_int("crafts_randomized", 1)
else
storage:set_int("crafts_randomized", 0)
end
end
})
minetest.register_on_mods_loaded(function()
better_randomizer.all_crafts = {normal = {}, cooking = {}}
better_randomizer.random_crafts = {normal = {}, cooking = {}}
for name, def in pairs(minetest.registered_items) do
local item_crafts = minetest.get_all_craft_recipes(name) or {}
for _, craft in ipairs(item_crafts) do
if craft.output ~= "" and (craft.method == "normal" or craft.method == "cooking") then
if not better_randomizer.random_crafts[craft.method][craft.output] then
table.insert(better_randomizer.all_crafts[craft.method], craft.output)
better_randomizer.random_crafts[craft.method][craft.output] = craft.output
end
end
end
end
for _, craft in pairs({ "craft_predict", "on_craft" }) do
minetest["register_" .. craft](function(itemstack, player, old_craft_grid, craft_inv)
if storage:get_int("crafts_randomized") ~= 1 then return end
if itemstack ~= nil and itemstack ~= ItemStack("") then
local itemstring = better_randomizer.random_crafts.normal[itemstack:to_string()]
if itemstring then return ItemStack(itemstring) end
end
end)
end
if randomize_crafts then
better_randomizer.randomize_crafts()
else
better_randomizer.random_crafts = minetest.deserialize(storage:get_string("crafts")) or better_randomizer.random_crafts
end
end)
local old_craft_result = minetest.get_craft_result
-- This makes furnaces work.
minetest.get_craft_result = function(input)
local output, decremented_input = old_craft_result(input)
if storage:get_int("crafts_randomized") == 1 then
if input.method == "normal" or input.method == "cooking" then
local itemstring = better_randomizer.random_crafts[input.method][output.item:to_string()]
if itemstring and (itemstring ~= "") then output.item = ItemStack(itemstring) end
end
end
return output, decremented_input
end
if randomize_node_drops then
better_randomizer.randomize_node_drops()
elseif storage:get_int("node_drops_randomized") == 1 then
better_randomizer.random_node_drops = minetest.deserialize(storage:get_string("node_drops"))
better_randomizer.load_node_drops()
end
if randomize_entity_drops then
better_randomizer.randomize_entity_drops()
elseif storage:get_int("entity_drops_randomized") == 1 then
better_randomizer.random_entity_drops = minetest.deserialize(storage:get_string("entity_drops"))
better_randomizer.load_entity_drops()
end