Replaced orbs with stars (untested)

This commit is contained in:
ThePython10110 2024-02-12 10:02:52 -08:00 committed by GitHub
parent 62c6c5341b
commit 28a99bc0f9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 167 additions and 149 deletions

View File

@ -81,7 +81,7 @@ Dependencies: Minetest Game or MineClone.
* Unfortunately, due to an [engine bug](https://github.com/minetest/minetest/issues/14344), this means that players are kind of invincible most of the time.
[ ] Remove and add alias for DM/RM shields
[ ] Upgrades affect energy value
[ ] Multiple levels of Exchange Orbs (change to Klein Stars)
[ ] Multiple levels of Exchange Orbs (change to Klein Stars, adjust recipes)
[ ] Divining rods
[ ] Swiftwolf's Rending Gale (maybe rename?)
[ ] Mind, Life, Body and Soul Stones (Mind = MCL only)
@ -98,6 +98,7 @@ Dependencies: Minetest Game or MineClone.
[ ] Modify tools page
[ ] Remove page for PESA
[ ] DM/RM blocks can only be broken by correct (or higher) type.
[ ] Change energy collector recipes to match ProjectE
## Changelog
<details><summary>Look at this fancy expanding changelog</summary>

View File

@ -2,7 +2,7 @@ local S = minetest.get_translator()
local formspec =
"size["..(exchangeclone.mcl and 9 or 8)..",9]"..
"label[2,1;"..S("Orb").."]"..
"label[2,1;"..S("Star").."]"..
"list[context;fuel;2,2;1,1;]"..
"label[3,1;"..S("Source").."]"..
"list[context;src;3,2;1,1;]"..
@ -25,12 +25,12 @@ end
minetest.register_alias("exchangeclone:element_constructor", "exchangeclone:constructor")
local function constructor_action(pos)
local using_orb = true
local using_star = true
local player
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if inv:get_stack("fuel", 1):get_name() ~= "exchangeclone:exchange_orb" then
using_orb = false
if minetest.get_item_group(inv:get_stack("fuel", 1):get_name(), "klein_star" < 1 then
using_star = false
player = minetest.get_player_by_name(meta:get_string("exchangeclone_placer"))
if not (player and player ~= "") then return end
end
@ -45,10 +45,10 @@ local function constructor_action(pos)
end
end
local result = exchangeclone.handle_alias(src_stack)
-- make sure orb/player has enough energy
-- make sure star/player has enough energy
local current_energy
if using_orb then
current_energy = exchangeclone.get_orb_energy(inv, "fuel", 1)
if using_star then
current_energy = exchangeclone.get_star_energy(inv, "fuel", 1)
else
current_energy = exchangeclone.get_player_energy(player)
end
@ -57,8 +57,8 @@ local function constructor_action(pos)
local max_amount = math.min(src_stack:get_stack_max(), math.floor(current_energy/energy_value))
local added_amount = max_amount - inv:add_item("dst", ItemStack(result.." "..max_amount)):get_count()
local result_energy = math.min(current_energy, current_energy - (energy_value * added_amount)) -- not sure if "math.min()" is necessary
if using_orb then
exchangeclone.set_orb_energy(inv, "fuel", 1, result_energy)
if using_star then
exchangeclone.set_star_energy(inv, "fuel", 1, result_energy)
else
exchangeclone.set_player_energy(player, result_energy)
end
@ -90,7 +90,7 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player)
return 0
end
if listname == "fuel" then
if stack:get_name() == "exchangeclone:exchange_orb" then
if minetest.get_item_group(stack:get_name(), "klein_star") > 0 then
return stack:get_count()
else
return 0
@ -155,13 +155,13 @@ minetest.register_node("exchangeclone:constructor", {
allow_metadata_inventory_take = allow_metadata_inventory_take,
on_timer = constructor_action,
_mcl_hoppers_on_try_pull = exchangeclone.mcl2_hoppers_on_try_pull(),
_mcl_hoppers_on_try_push = exchangeclone.mcl2_hoppers_on_try_push(nil, function(stack) return stack:get_name() == "exchangeclone:exchange_orb" end),
_mcl_hoppers_on_try_push = exchangeclone.mcl2_hoppers_on_try_push(nil, function(stack) return minetest.get_item_group(stack:get_name(), "klein_star") > 0 end),
_mcl_hoppers_on_after_push = function(pos)
minetest.get_node_timer(pos):start(1.0)
end,
_on_hopper_in = exchangeclone.mcla_on_hopper_in(
nil,
function(stack) return stack:get_name() == "exchangeclone:exchange_orb" end
function(stack) return minetest.get_item_group(stack:get_name(), "klein_star") > 0 end
),
})
@ -186,7 +186,7 @@ if exchangeclone.pipeworks then
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if get_list(direction) == "fuel" then
if stack:get_name() == "exchangeclone:exchange_orb" then
if minetest.get_item_group(stack:get_name(), "klein_star") > 0 then
return inv:room_for_item("fuel", stack)
end
else
@ -207,8 +207,8 @@ minetest.register_craft({
type = "shaped",
output = "exchangeclone:constructor",
recipe = {
{"exchangeclone:exchange_orb"},
{"exchangeclone:klein_star_drei"},
{recipe_ingredient},
{"exchangeclone:exchange_orb"}
{"exchangeclone:klein_star_drei"}
}
})

View File

@ -4,7 +4,7 @@ local formspec =
"size["..(exchangeclone.mcl and 9 or 8)..",9]"..
"label[2,1;"..S("Input").."]"..
"list[context;src;2,2;1,1;]"..
"label[5,1;"..S("Orb").."]"..
"label[5,1;"..S("Star").."]"..
"list[context;fuel;5,2;1,1;]"..
exchangeclone.inventory_formspec(0,5)..
"listring[current_player;main]"..
@ -22,17 +22,19 @@ end
minetest.register_alias("exchangeclone:element_deconstructor", "exchangeclone:deconstructor")
local function deconstructor_action(pos, elapsed)
local limit = exchangeclone.orb_max
local using_orb = true
local limit
local using_star = true
local player
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if inv:get_stack("fuel", 1):get_name() ~= "exchangeclone:exchange_orb" then
if minetest.get_item_group(inv:get_stack("fuel", 1):get_name(), "klein_star") < 1 then
limit = exchangeclone.limit
using_orb = false
using_star = false
player = minetest.get_player_by_name(meta:get_string("exchangeclone_placer"))
if not (player and player ~= "") then return end
else
limit = exchangeclone.get_star_max(inv:get_stack("fuel", 1))
end
local stack = inv:get_stack("src", 1)
@ -42,13 +44,13 @@ local function deconstructor_action(pos, elapsed)
if wear and wear > 0 then
individual_energy_value = math.max(math.floor(individual_energy_value * ((65536 - wear)/65536)), 1)
end
if stack:get_name() == "exchangeclone:exchange_orb" then
individual_energy_value = individual_energy_value + exchangeclone.get_orb_itemstack_energy(stack)
if minetest.get_item_group(stack:get_name(), "klein_star") > 0 then
individual_energy_value = individual_energy_value + exchangeclone.get_star_itemstack_energy(stack)
end
local current_energy
if using_orb then
current_energy = exchangeclone.get_orb_energy(inv, "fuel", 1)
if using_star then
current_energy = exchangeclone.get_star_energy(inv, "fuel", 1)
else
current_energy = exchangeclone.get_player_energy(player)
end
@ -58,8 +60,8 @@ local function deconstructor_action(pos, elapsed)
local result = current_energy + energy_value
if result < 0 or result > limit then return end
if using_orb then
exchangeclone.set_orb_energy(inv, "fuel", 1, result)
if using_star then
exchangeclone.set_star_energy(inv, "fuel", 1, result)
else
exchangeclone.set_player_energy(player, result)
end
@ -92,7 +94,7 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player)
return 0
end
if listname == "fuel" then
if stack:get_name() == "exchangeclone:exchange_orb" then
if minetest.get_item_group(stack:get_name(), "klein_star") > 0 then
return stack:get_count()
else
return 0
@ -155,13 +157,13 @@ minetest.register_node("exchangeclone:deconstructor", {
allow_metadata_inventory_move = allow_metadata_inventory_move,
allow_metadata_inventory_take = allow_metadata_inventory_take,
on_timer = deconstructor_action,
_mcl_hoppers_on_try_push = exchangeclone.mcl2_hoppers_on_try_push(nil, function(stack) return stack:get_name() == "exchangeclone:exchange_orb" end),
_mcl_hoppers_on_try_push = exchangeclone.mcl2_hoppers_on_try_push(nil, function(stack) return minetest.get_item_group(stack:get_name(), "klein_star") > 0 end),
_mcl_hoppers_on_after_push = function(pos)
minetest.get_node_timer(pos):start(1.0)
end,
_on_hopper_in = exchangeclone.mcla_on_hopper_in(
nil,
function(stack) return stack:get_name() == "exchangeclone:exchange_orb" end
function(stack) return minetest.get_item_group(stack:get_name(), "klein_star") > 0 end
),
})
@ -186,7 +188,7 @@ if exchangeclone.pipeworks then
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if get_list(direction) == "fuel" then
if stack:get_name() == "exchangeclone:exchange_orb" then
if minetest.get_item_group(stack:get_name(), "klein_star") > 0 then
return inv:room_for_item("fuel", stack)
end
else
@ -207,8 +209,8 @@ end
minetest.register_craft({
output = "exchangeclone:deconstructor",
recipe = {
{"exchangeclone:exchange_orb"},
{"exchangeclone:klein_star_drei"},
{recipe_ingredient},
{"exchangeclone:exchange_orb"}
{"exchangeclone:klein_star_drei"}
}
})

View File

@ -2,7 +2,7 @@ local S = minetest.get_translator()
local formspec =
"size["..(exchangeclone.mcl and 9 or 8)..",9]"..
"label[3,2;"..S("Orb").."]"..
"label[3,2;"..S("Star").."]"..
"list[context;main;4,2;1,1;]"..
exchangeclone.inventory_formspec(0,5)..
"listring[current_player;main]"..
@ -46,9 +46,9 @@ local function on_timer(pos, elapsed)
-- get node above
local above = vector.add({x=0,y=1,z=0}, pos)
local using_orb = true
local using_star = true
if inv:is_empty("main") then
using_orb = false
using_star = false
end
local light = minetest.get_natural_light(above)
@ -59,14 +59,15 @@ local function on_timer(pos, elapsed)
return true
end
local amount = meta:get_int("collector_amount")
if using_orb then
local stored = exchangeclone.get_orb_energy(inv, "main", 1)
if stored + amount <= exchangeclone.orb_max then
if using_star then
local max = exchangeclone.get_star_max(inv:get_stack("main", 1))
local stored = exchangeclone.get_star_energy(inv, "main", 1)
if stored + amount <= max then
stored = stored + amount
else
stored = math.max(stored, exchangeclone.orb_max)
stored = math.max(stored, max)
end
exchangeclone.set_orb_energy(inv, "main", 1, stored)
exchangeclone.set_star_energy(inv, "main", 1, stored)
else
local placer = meta:get_string("exchangeclone_placer")
if placer and placer ~= "" then
@ -95,7 +96,7 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player)
return 0
end
if listname == "main" then
if stack:get_name() == "exchangeclone:exchange_orb" then
if minetest.get_item_group(stack:get_name(), "klein_star") > 0 then
return stack:get_count()
else
return 0
@ -122,12 +123,12 @@ function exchangeclone.register_energy_collector(itemstring, name, amount, modif
minetest.register_node(itemstring, {
description = name.."\nGenerates "..exchangeclone.format_number(amount).." energy/second",
tiles = {
"exchangeclone_energy_collector_base.png"..modifier,
"exchangeclone_energy_collector_down.png"..modifier,
"exchangeclone_energy_collector_right.png"..modifier,
"exchangeclone_energy_collector_right.png"..modifier,
"exchangeclone_energy_collector_right.png"..modifier,
"exchangeclone_energy_collector_right.png"..modifier
"exchangeclone_energy_collector_base.png^(exchangeclone_energy_collector_overlay.png"..modifier..")",
"exchangeclone_energy_collector_base.png",
"exchangeclone_energy_collector_base.png",
"exchangeclone_energy_collector_base.png",
"exchangeclone_energy_collector_base.png",
"exchangeclone_energy_collector_base.png",
},
groups = {cracky = 2, container = 2, pickaxey = 2, energy_collector = amount, tubedevice = 1, tubedevice_receiver = 1},
_mcl_hardness = 3,
@ -183,7 +184,7 @@ function exchangeclone.register_energy_collector(itemstring, name, amount, modif
can_insert = function(pos, node, stack, direction)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if stack:get_name() == "exchangeclone:exchange_orb" then
if minetest.get_item_group(stack:get_name(), "klein_star") > 0 then
return inv:room_for_item("main", stack)
end
end,
@ -205,7 +206,7 @@ end
exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk1", S("Energy Collector MK1"), 4, "", {
{glass, glass, glass},
{"exchangeclone:exchange_orb", chest, "exchangeclone:exchange_orb"},
{"exchangeclone:klein_star_drei", chest, "exchangeclone:klein_star_drei"},
{iron_block, iron_block, iron_block}
}
)

View File

@ -584,7 +584,7 @@ local active_def = {
"exchangeclone_dark_matter_block.png"..pipeworks_connect,
"exchangeclone_dark_matter_block.png"..pipeworks_connect,
"exchangeclone_dark_matter_block.png"..pipeworks_connect,
"exchangeclone_dark_matter_furnace.png",
"exchangeclone_dark_matter_furnace_active.png",
},
paramtype2 = "4dir",
parammatter_type = "light",
@ -717,7 +717,7 @@ minetest.override_item("exchangeclone:red_matter_furnace_active", {
"exchangeclone_red_matter_block.png",
"exchangeclone_red_matter_block.png",
"exchangeclone_red_matter_block.png",
"exchangeclone_red_matter_furnace.png",
"exchangeclone_red_matter_furnace_active.png",
},
drop = "exchangeclone:red_matter_furnace",
groups = {pickaxey=6, not_in_creative_inventory = 1, cracky = 3, container = exchangeclone.mcl2 and 2 or 4, deco_block=1, material_stone=1, level = get_level(5), exchangeclone_furnace = 2, tubedevice = 1, tubedevice_receiver = 1},

View File

@ -111,7 +111,7 @@ end
dofile(modpath.."/constructor.lua")
dofile(modpath.."/deconstructor.lua")
dofile(modpath.."/energy_collector.lua")
dofile(modpath.."/orb.lua")
dofile(modpath.."/klein_stars.lua")
dofile(modpath.."/craftitems.lua")
if exchangeclone.mcl or minetest.get_modpath("3d_armor") then
dofile(modpath.."/armor.lua")

View File

@ -0,0 +1,74 @@
local S = minetest.get_translator()
local function read_star_charge(itemstack, player, pointed_thing)
local click_test = exchangeclone.check_on_rightclick(itemstack, player, pointed_thing)
if click_test ~= false then
return click_test
end
local stored = exchangeclone.get_star_itemstack_energy(itemstack)
minetest.chat_send_player(player:get_player_name(), S("Current Charge: @1", exchangeclone.format_number(stored)))
return itemstack
end
local names = {
"Klein Star Ein",
"Klein Star Zwei",
"Klein Star Drei",
"Klein Star Vier",
"Klein Star Sphere",
"Klein Star Omega",
"Magnum Star Ein",
"Magnum Star Zwei",
"Magnum Star Drei",
"Magnum Star Vier",
"Magnum Star Sphere",
"Magnum Star Omega",
}
minetest.register_alias("exchangeclone:exchange_orb", "exchangeclone:klein_star_omega")
for i, name in ipairs(names) do
local codified_name = name:lower():gsub(" ", "_")
minetest.register_tool("exchangeclone:"..codified_name, {
description = S(name).."\n"..S("Current Charge: @1", 0)
inventory_image = "exchangeclone_"..codified_name..".png",
wield_image = "exchangeclone_"..codified_name..".png",
on_secondary_use = read_star_charge,
on_place = read_star_charge,
groups = {klein_star = i, disable_repair = 1, fire_immune = 1},
max_capacity = 50000*math.pow(4,i-1),
_mcl_generate_description = function(itemstack)
return name.."\n"..S("Current Charge: @1", exchangeclone.get_star_itemstack_energy(itemstack))
end
})
if i > 1 then
previous_codified_name = names[i-1]:lower():gsub(" ", "_")
minetest.register_craft({
output = "exchangeclone:"..codified_name,
type = "shapeless",
recipe = {
"exchangeclone:"..previous_codified_name,
"exchangeclone:"..previous_codified_name,
"exchangeclone:"..previous_codified_name,
"exchangeclone:"..previous_codified_name,
}
})
end
minetest.register_craft({ -- Making it fuel so old versions of MCL's hoppers will work with (de)constructors
type = "fuel",
recipe = "exchangeclone:"..codified_name,
burntime = 24000 --Basically 30 coal blocks...
})
end
minetest.register_craft({
output = "exchangeclone:klein_star_ein",
recipe = {
{"exchangeclone:mobius_fuel", "exchangeclone:mobius_fuel", "exchangeclone:mobius_fuel"},
{"exchangeclone:mobius_fuel", exchangeclone.itemstrings.diamond, "exchangeclone:mobius_fuel"},
{"exchangeclone:mobius_fuel", "exchangeclone:mobius_fuel", "exchangeclone:mobius_fuel"},
}
})

View File

@ -1,38 +0,0 @@
local S = minetest.get_translator()
local function read_orb_charge(itemstack, player, pointed_thing)
local click_test = exchangeclone.check_on_rightclick(itemstack, player, pointed_thing)
if click_test ~= false then
return click_test
end
local stored = exchangeclone.get_orb_itemstack_energy(itemstack)
minetest.chat_send_player(player:get_player_name(), S("Current Charge: @1", exchangeclone.format_number(stored)))
return itemstack
end
minetest.register_tool("exchangeclone:exchange_orb", {
description = S("Exchange Orb").."\n"..S("Current Charge: @1", 0),
inventory_image = "exchangeclone_exchange_orb.png",
color = "#000000",
on_secondary_use = read_orb_charge,
on_place = read_orb_charge,
groups = {exchange_orb = 1, disable_repair = 1, fire_immune = 1}
})
minetest.register_craft({
type = "shaped",
output = "exchangeclone:exchange_orb",
groups = {},
recipe = {
{exchangeclone.itemstrings.diamond, exchangeclone.itemstrings.iron, exchangeclone.itemstrings.diamond},
{exchangeclone.itemstrings.iron, "exchangeclone:philosophers_stone", exchangeclone.itemstrings.iron},
{exchangeclone.itemstrings.diamond, exchangeclone.itemstrings.iron, exchangeclone.itemstrings.diamond}
},
replacements = {{"exchangeclone:philosophers_stone", "exchangeclone:philosophers_stone"}}
})
minetest.register_craft({ -- Making it fuel so MineClone hoppers will work with (de)constructors
type = "fuel",
recipe = "exchangeclone:exchange_orb",
burntime = 24000 --Basically 30 coal blocks...
})

View File

@ -139,8 +139,8 @@ local function handle_inventory(player, inventory, to_list)
if wear and wear > 1 then
individual_energy_value = math.max(math.floor(individual_energy_value * ((65536 - wear)/65536)), 1)
end
if itemstring == "exchangeclone:exchange_orb" then
individual_energy_value = individual_energy_value + exchangeclone.get_orb_itemstack_energy(stack)
if minetest.get_item_group(itemstring, "klein_star") then
individual_energy_value = individual_energy_value + exchangeclone.get_star_itemstack_energy(stack)
end
local player_energy = exchangeclone.get_player_energy(player)
local max_count = math.floor((exchangeclone.limit - player_energy)/individual_energy_value)
@ -164,11 +164,11 @@ local function handle_inventory(player, inventory, to_list)
return
elseif to_list == "charge" then
local player_energy = exchangeclone.get_player_energy(player)
local orb_energy = exchangeclone.get_orb_itemstack_energy(stack)
local charge_amount = math.min(exchangeclone.orb_max - orb_energy, player_energy)
local star_energy = exchangeclone.get_star_itemstack_energy(stack)
local charge_amount = math.min(exchangeclone.get_star_max(stack) - star_energy, player_energy)
if charge_amount > 0 then
exchangeclone.add_player_energy(player, 0-charge_amount)
exchangeclone.set_orb_energy(inventory, to_list, 1, orb_energy + charge_amount)
exchangeclone.set_star_energy(inventory, to_list, 1, star_energy + charge_amount)
exchangeclone.show_transmutation_table_formspec(player)
end
end
@ -193,7 +193,7 @@ local function allow_inventory_action(player, stack, to_list, count, move, inven
if not check_for_table(player, inventory) then return 0 end
if to_list == "output" then
return 0
elseif to_list == "charge" and stack:get_name() ~= "exchangeclone:exchange_orb" then
elseif to_list == "charge" and minetest.get_item_group(stack:get_name, "klein_star") then
return 0
elseif to_list == "learn" then
if stack:get_name() == "exchangeclone:alchemical_tome" then return count end
@ -375,7 +375,7 @@ minetest.register_node("exchangeclone:transmutation_table", {
})
minetest.register_tool("exchangeclone:alchemical_tome", {
description = "Alchemical Tome\nOrbs in crafting recipe must be full",
description = "Alchemical Tome\Magnum Star Omegas in crafting recipe must be full",
inventory_image = "exchangeclone_alchemical_tome.png",
wield_image = "exchangeclone_alchemical_tome.png",
groups = {disable_repair = 1, fire_immune = 1}
@ -414,7 +414,7 @@ if minetest.settings:get_bool("exchangeclone.allow_crafting_alchemical_tome", tr
output = "exchangeclone:alchemical_tome",
recipe = {
{"", book, ""},
{"exchangeclone:exchange_orb", "exchangeclone:philosophers_stone", "exchangeclone:exchange_orb"},
{"exchangeclone:magnum_star_omega", "exchangeclone:philosophers_stone", "exchangeclone:magnum_star_omega"},
{"", "exchangeclone:red_matter", ""}
},
replacements = {{"exchangeclone:philosophers_stone", "exchangeclone:philosophers_stone"}}
@ -423,11 +423,11 @@ end
minetest.register_craft_predict(function(itemstack, player, old_craft_grid, craft_inv)
if itemstack == ItemStack("exchangeclone:alchemical_tome") then
if exchangeclone.get_orb_itemstack_energy(old_craft_grid[4]) >= exchangeclone.orb_max
and exchangeclone.get_orb_itemstack_energy(old_craft_grid[6]) >= exchangeclone.orb_max then
return
else
return ItemStack("")
for _, i in {4,6} do
local stack = old_craft_grid[i]
if exchangeclone.get_star_itemstack_energy(stack) < exchangeclone.get_star_max(stack) then
return ItemStack("")
end
end
end
end)

View File

@ -1,7 +1,4 @@
# Exchange Orb maximum energy (default 51200000)
exchangeclone.orb_max (Exchange Orb maximum energy) int 51200000
# Keep unnecessary temporary data (such as the list of recipes) after load time for debugging purposes.
Keep unnecessary temporary data (such as the list of recipes) after load time for debugging purposes.
exchangeclone.keep_data (Keep temporary data after loading) bool false
# Allow the crafting recipe for the Alchemical Tome

View File

@ -14,7 +14,6 @@ if exchangeclone.mcl2 or exchangeclone.mcla then exchangeclone.mcl = true end
if not exchangeclone.mcl then exchangeclone.mtg = true end
exchangeclone.pipeworks = minetest.get_modpath("pipeworks")
exchangeclone.orb_max = minetest.settings:get("exchangeclone.orb_max") or 51200000 -- Max capacity of Klein Star Omega in ProjectE
exchangeclone.keep_data = minetest.settings:get_bool("exchangeclone.keep_data", false)
local modpath = minetest.get_modpath("zzzz_exchangeclone_init")

View File

@ -78,9 +78,9 @@ function exchangeclone.get_item_energy(item)
end
local def = minetest.registered_items[item:get_name()]
if not def then return end
if item:get_name() == "exchangeclone:exchange_orb" then
if minetest.get_item_group(item:get_name(), "klein_star" then
if def.energy_value then
return def.energy_value + exchangeclone.get_orb_itemstack_energy(item)
return def.energy_value + exchangeclone.get_star_itemstack_energy(item)
end
end
if def.energy_value then
@ -94,71 +94,53 @@ function exchangeclone.map(input, min1, max1, min2, max2)
return (input - min1) / (max1 - min1) * (max2 - min2) + min2
end
-- Gets the energy stored in a specified exchange_orb itemstack.
function exchangeclone.get_orb_itemstack_energy(itemstack)
-- Gets the energy stored in a specified star itemstack.
function exchangeclone.get_star_itemstack_energy(itemstack)
if not itemstack then return end
if itemstack:get_name() ~= "exchangeclone:exchange_orb" then return end
if minetest.get_item_group(itemstack:get_name(), "klein_star") < 1 then return end
return math.max(itemstack:get_meta():get_float("stored_energy"), 0)
end
-- Gets the amount of energy stored in an orb in a specific inventory slot
function exchangeclone.get_orb_energy(inventory, listname, index)
-- Gets the amount of energy stored in a star in a specific inventory slot
function exchangeclone.get_star_energy(inventory, listname, index)
if not inventory then return end
if not listname then listname = "main" end
if not index then index = 1 end
local itemstack = inventory:get_stack(listname, index)
return exchangeclone.get_orb_itemstack_energy(itemstack)
return exchangeclone.get_star_itemstack_energy(itemstack)
end
function exchangeclone.set_orb_itemstack_energy(itemstack, amount)
function exchangeclone.set_star_itemstack_energy(itemstack, amount)
if not itemstack or not amount then return end
if itemstack:get_name() ~= "exchangeclone:exchange_orb" then return end
local old_energy = exchangeclone.get_orb_itemstack_energy(itemstack)
if amount > old_energy and old_energy > exchangeclone.orb_max then return end -- don't allow more energy to be put into an over-filled orb
local old_energy = exchangeclone.get_star_itemstack_energy(itemstack)
local max = exchangeclone.get_star_max(itemstack)
if amount > old_energy and old_energy > max then return end -- don't allow more energy to be put into an over-filled star
-- Square roots will hopefully make it less linear
-- And if they don't, I don't really care and I don't want to think about math anymore.
local sqrt_amount = math.sqrt(amount)
local sqrt_max = math.sqrt(exchangeclone.orb_max)
local r, g, b = 0, 0, 0
if amount <= 0 then
-- do nothing
elseif sqrt_amount < (sqrt_max/4) then
r = exchangeclone.map(sqrt_amount, 0, sqrt_max/4, 0, 255)
elseif sqrt_amount < (sqrt_max/2) then
g = exchangeclone.map(sqrt_amount, sqrt_max/4, sqrt_max/2, 0, 255)
r = 255 - g
elseif sqrt_amount < (3*sqrt_max/4) then
b = exchangeclone.map(sqrt_amount, sqrt_max/2, 3*sqrt_max/4, 0, 255)
g = 255 - b
else
r = math.min(exchangeclone.map(sqrt_amount, 3*sqrt_max/4, sqrt_max, 0, 255), 255)
b = 255
end
local colorstring = minetest.rgba(r,g,b)
local meta = itemstack:get_meta()
meta:set_float("stored_energy", amount)
meta:set_string("description", S("Exchange Orb").."\n"..S("Current Charge: @1", exchangeclone.format_number(amount)))
meta:set_string("color", colorstring)
local wear = math.min(1, math.max(65535, 65535 - 65535*amount/exchangeclone.orb_max))
minetest.log(dump(wear))
meta:set_string("description", itemstack:_mcl_generate_description())
local wear = math.min(1, math.max(65535, 65535 - 65535*amount/max))
itemstack:set_wear(wear)
return itemstack
end
-- Sets the amount of energy in an orb in a specific inventory slot
function exchangeclone.set_orb_energy(inventory, listname, index, amount)
-- Sets the amount of energy in a star in a specific inventory slot
function exchangeclone.set_star_energy(inventory, listname, index, amount)
if not inventory or not amount or amount < 0 then return end
if not listname then listname = "main" end
if not index then index = 1 end
local itemstack = inventory:get_stack(listname, index)
local new_stack = exchangeclone.set_orb_itemstack_energy(itemstack, amount)
local new_stack = exchangeclone.set_star_itemstack_energy(itemstack, amount)
if not new_stack then return end
inventory:set_stack(listname, index, new_stack)
end
function exchangeclone.get_star_max(item)
item = ItemStack(item)
return item:get_definition().max_capacity or 0
end
-- HUD stuff (show energy value in bottom right)
local hud_elements = {}