Tool/armor changes

This commit is contained in:
ThePython 2024-02-04 13:29:48 -08:00
parent c639113d6d
commit b44c7903a9
16 changed files with 587 additions and 499 deletions

View File

@ -38,16 +38,16 @@ See the [wiki](https://github.com/ThePython10110/ExchangeClone/wiki) for more in
Dependencies: Minetest Game or MineClone.
## Known issues:
* Dark/Red Matter armor don't work they way they should, especially in MTG. I would greatly appreciate a PR that makes them work more like ProjectE.
* Dark/Red Matter armor don't work they way they should, especially in MTG. I would greatly appreciate a PR that makes them more like ProjectE.
* The sword/katar AOE ability does not take upgrades into account. This will probably not be fixed (MCL)
* For technical reasons (making them work with MCL hoppers), Exchange Orbs and Upgrades can be used as fuel. This isn't really a problem, but it will be removed once I decide the new hopper API is new enough that most people are using it.
* For technical reasons (making them work with MCL hoppers), Exchange Orbs and Upgrades can be used as fuel. This isn't really a problem, but it will be removed once I decide the new hopper APIs is new enough that most people are using them.
* Dark/Red Matter Shears will sometimes (randomly) be treated as normal shears when used by dispensers. This will not be fixed.
* In Mineclonia, when inserting items into Dark/Red Matter Furnaces with hoppers, they will not start at the correct speed, instead being limited to a maximum of 1 item/second. This will not be fixed unless Mineclonia changes how things work.
* In Mineclonia, hoppers can put invalid items into Energy Collectors.
* DM/RM armor isn't great... the armor is (depending on which game you're playing), too good or not good enough. I would love it if someone with more patience would submit a PR to improve them. I would like them to be as close to ProjectE as possible, and as similar as possible between MTG and MCL... but I just hate doing that kind of thing.
* Tools do not show the wear bar (to show the charge level) when first created or crafted. It only appears after changing the range. This will not be fixed.
* Unfortunately, caused by the performance improvements to various tool abilities, using the shear ability on sea grass (MCL) will also remove the sand below the sea grass. I can't think of a good way to fix it.
**If you have a suggestion or notice a bug, visit the [GitHub issues page](https://github.com/thepython10110/exchangeclone/issues).**
**If you have a suggestion or notice a bug that isn't on this list, visit the [GitHub issues page](https://github.com/thepython10110/exchangeclone/issues).**
![Screenshot](screenshot.png)
![Transmutation GUI Screenshot](transmutation_screenshot.png)
@ -67,22 +67,23 @@ Dependencies: Minetest Game or MineClone.
### PLANS/TODO FOR v7.0 (see dev branch for current progress)
* Achievements/advancements/awards
* Improvements to tools
* Improvements to tools (mostly only in MCL at the moment)
[x] Wear bar for charge level
[ ] Charge levels match ProjectE (both in number and in range)
[ ] Charge level affects speed
[ ] Correct/accurate speeds compared to ProjectE (hopefully)
[ ] Wear bar on Exchange Orbs for energy
[ ] Only one item per tool (not a separate 3x3 tool)
[ ] Make Philosopher's Stone only affect the node type you click on (and also not work when not pointed at anything), so clicking on a grass block will only transmute grass blocks in range (not everything else)
[ ] Shovels can remove paths (MCL2)
[ ] *MAYBE* changes to armor (but it's so hard to get it right)
[x] Charge levels match ProjectE (both in number and in range)
[x] Charge level affects speed
[x] Correct/accurate speeds compared to ProjectE (hopefully)
[x] Wear bar on Exchange Orbs for energy
[x] Only one item per tool (not a separate 3x3 tool)
[x] Make Philosopher's Stone only affect the node type you click on (and also not work when not pointed at anything), so clicking on a grass block will only transmute grass blocks in range (not everything else)
[x] Shovels can remove paths (MCL2)
[x] Changes to armor (but it's so hard to get it right)
* 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.
* Divining rods
* Swiftwolf's Rending Gale (maybe rename?)
* Mind, Life, Body and Soul Stones (Mind = MCL only)
* Talisman of Repair (will only work in player inventory, not Alchemical Chests like ProjectE)
* Gem of Eternal Density (will only work in player inventory, not Alchemical Chests like ProjectE)
* Remove deprecated PESA item (add alias to some existing item with 64 energy)
* Remove and add alias for DM/RM shields
* Edit wiki:
* Add pages for:
* Achievements?
@ -108,13 +109,19 @@ Dependencies: Minetest Game or MineClone.
#### Full changelog:
* Changes:
* I'm now using a free AI tool called Codeium (no relation to VSCodium), which seems to work well. This obviously isn't a change to the mod, but it makes it easier to do certain things.
* The pickaxe vein mining ability is now more efficient, only checking each position once.
* Tools do not mine slower in 3x1/3x3 modes (to match ProjectE)
* Tools do not have a separate 3x1/3x3 item.
* Charge level is now shown by the wear/durability bar
* Charge level now affects tool speed
* Got rid of `exchangeclone.node_radius_action` function (it was pretty much over-refactoring and made things so much more complicated)
* I'm started a free AI tool called Codeium (no relation to VSCodium), which seems to work well. This obviously isn't a change to the mod, but it makes it easier to do certain things.
* Several improvements to tools:
* The pickaxe vein mining ability is now more efficient, only checking each position once.
* Tools do not mine slower in 3x1/3x3 modes (to match ProjectE)
* Tools do not have a separate 3x1/3x3 item.
* Charge level is now shown by the wear/durability bar
* Charge level now affects tool speed
* Got rid of `exchangeclone.node_radius_action` function (it was pretty much over-refactoring and made things so much more complicated)
* Several changes to tool abilities (*mostly* making them closer to the ProjectE versions)
* Removed the deprecated PESA.
* Removed dark and red matter shields (so I could use the same math for MTG and MCL)
* Bugfixes
* The Philosopher's Stone is no longer unable to transmute logs and leaves in Mineclonia.
### v6.7
* Made More Ores energy values not MTG-specific

View File

@ -1,17 +1,5 @@
local S = minetest.get_translator()
-- true = blocks all damage
-- {base_block, block_per_rm}: Amount blocked by full dark matter, extra amount per red matter armor piece
-- only applies in MCL
local blocked_damage_types = {
drown = true,
lava = true,
in_fire = true,
on_fire = true,
hot_floor = true,
fall = {0.8, exchangeclone.mcl and 0.025 or 0.02},
}
local function get_armor_texture(type, matter, preview)
local modifier
-- hsl only works in 5.8 which hasn't been released yet
@ -33,6 +21,106 @@ local function get_armor_texture(type, matter, preview)
return result
end
local armor_pieces = {
["exchangeclone:helmet_dark_matter"] = {material = "dark_matter", piece = "helmet", category = "weak"},
["exchangeclone:helmet_red_matter"] = {material = "red_matter", piece = "helmet", category = "weak"},
["exchangeclone:chestplate_dark_matter"] = {material = "dark_matter", piece = "chestplate", category = "strong"},
["exchangeclone:chestplate_red_matter"] = {material = "red_matter", piece = "chestplate", category = "strong"},
["exchangeclone:leggings_dark_matter"] = {material = "dark_matter", piece = "leggings", category = "strong"},
["exchangeclone:leggings_red_matter"] = {material = "red_matter", piece = "leggings", category = "strong"},
["exchangeclone:boots_dark_matter"] = {material = "dark_matter", piece = "boots", category = "weak"},
["exchangeclone:boots_red_matter"] = {material = "red_matter", piece = "boots", category = "weak"},
}
local armor_categories = {
weak = {dark_matter = exchangeclone.mcl and 0.16 or 0.13, red_matter = exchangeclone.mcl and 0.18 or 0.15},
strong = {dark_matter = exchangeclone.mcl and 0.24 or 0.18, red_matter = exchangeclone.mcl and 0.27 or 0.2}
}
local function a_damage_formula(armor_data, damage, reason)
local start
local threshold
local first_value
if armor_data.material == "dark_matter" then
if armor_data.category == "weak" then
if reason.type == "explosion" then
start = 70
else
start = 20
end
threshold = start + 6
first_value = 0.9
else
if reason.type == "explosion" then
start = 105
else
start = 45
end
threshold = start + 16
first_value = 0.7
end
else
if armor_data.category == "weak" then
if reason.type == "explosion" then
start = 100
else
start = 50
end
threshold = start + 6
first_value = 0.9
else
if reason.type == "explosion" then
start = 150
threshold = 162
first_value = 0.78
else
start = 70
threshold = 76
first_value = 0.9
end
end
end
if damage < start then
return damage
elseif damage <= threshold then
-- This formula took me unnecessarily long to figure out.
return damage-(first_value+((damage-1)*((0.03*(damage)/2)+first_value)))
else
return damage*0.05 -- Not exact (some armor pieces are 3%, some are 7%, but I don't care)
end
end
local function get_blocked_damage(itemstack, damage, reason)
local armor_data = armor_pieces[itemstack:get_name()]
if not armor_data then return 0 end
local base_block = armor_categories[armor_data.category][armor_data.material]
if reason.type == "lava" then
return damage
elseif reason.type == "fall" then
if armor_data.piece == "boots" then
if armor_data.material == "dark_matter" then
if damage < 31 then
return 5
end
elseif damage < 55 then
return 10
end
end
return base_block*damage
elseif reason.type == "explosion" or reason.type == "anvil" or reason.flags.is_projectile then
return a_damage_formula(armor_data, damage, reason)
elseif reason.type == "drown" then
if armor_data.piece == "helmet" then
if damage < 10 then
return 2
end
end
return base_block*damage
end
return base_block*damage
end
-- Reset health
function exchangeclone.check_armor_health(obj)
if obj:get_meta():get_int("exchangeclone_red_matter_armor") == 1 then
@ -58,11 +146,12 @@ if exchangeclone.mcl then
},
durability = -1,
enchantability = 0,
-- No armor points because I don't want MCL's armor code messing up the math.
points = {
head = 6,
torso = 10,
legs = 8,
feet = 4,
head = 0,
torso = 0,
legs = 0,
feet = 0,
},
textures = {
head = get_armor_texture("helmet","dark"),
@ -74,6 +163,8 @@ if exchangeclone.mcl then
groups = {dark_matter_armor = 1, fire_immune = 1, exchangeclone_upgradable = 1},
craft_material = "exchangeclone:dark_matter",
cook_material = "mcl_core:diamondblock",
sound_equip = "mcl_armor_equip_diamond",
sound_unequip = "mcl_armor_unequip_diamond",
})
mcl_armor.register_set({
name = "red_matter",
@ -86,11 +177,12 @@ if exchangeclone.mcl then
},
durability = -1,
enchantability = 0,
-- No armor points because I don't want MCL's armor code messing up the math.
points = {
head = 7,
torso = 12,
legs = 9,
feet = 5,
head = 0,
torso = 0,
legs = 0,
feet = 0,
},
textures = {
head = get_armor_texture("helmet","red"),
@ -102,6 +194,8 @@ if exchangeclone.mcl then
groups = {red_matter_armor = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
craft_material = "exchangeclone:red_matter",
cook_material = "exchangeclone:dark_matter",
sound_equip = "mcl_armor_equip_diamond",
sound_unequip = "mcl_armor_unequip_diamond",
})
for _, matter in pairs({"dark", "red"}) do
@ -114,115 +208,108 @@ if exchangeclone.mcl then
end
mcl_damage.register_modifier(function(obj, damage, reason)
local blocked = blocked_damage_types[reason.type]
local start_time = minetest.get_us_time()
if not obj:is_player() then return end
minetest.log(dump({damage, reason}))
local inv = mcl_util.get_inventory(obj)
local blocked = 0
if inv then
local armor_pieces = 0
local red_armor_pieces = 0
for name, element in pairs(mcl_armor.elements) do
local itemstack = inv:get_stack("armor", element.index)
if not itemstack:is_empty() then
if minetest.get_item_group(itemstack:get_name(), "dark_matter_armor") > 0 then
armor_pieces = armor_pieces + 1
elseif minetest.get_item_group(itemstack:get_name(), "red_matter_armor") > 0 then
armor_pieces = armor_pieces + 1
red_armor_pieces = red_armor_pieces + 1
end
end
end
if armor_pieces >= 4 then
if blocked then
if blocked == true then
return 0
else
return (blocked[1] + blocked[2]*red_armor_pieces) * damage
end
end
local item_blocked = math.max(0,get_blocked_damage(itemstack, damage, reason))
blocked = blocked + item_blocked
minetest.log(dump({name, item_blocked}))
end
minetest.log(((minetest.get_us_time() - start_time)/1000).." milliseconds")
return math.max(0, damage - blocked)
end
end)
end, -100)
else
armor:register_armor("exchangeclone:helmet_dark_matter", {
description = S("Dark Matter Helmet"),
texture = get_armor_texture("helmet","dark"),
inventory_image = get_armor_texture("inv_helmet","dark"),
preview = get_armor_texture("helmet","dark", true),
armor_groups = {fleshy = 13},
groups = {armor_head = 1, dark_matter_armor = 1, armor_heal = 5, armor_fire = 1, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
groups = {armor_head = 1, dark_matter_armor = 1, disable_repair = 1, exchangeclone_upgradable = 1}
})
armor:register_armor("exchangeclone:chestplate_dark_matter", {
description = S("Dark Matter Chestplate"),
texture = get_armor_texture("chestplate","dark"),
inventory_image = get_armor_texture("inv_chestplate","dark"),
preview = get_armor_texture("chestplate","dark", true),
armor_groups = {fleshy = 21},
groups = {armor_torso = 1, dark_matter_armor = 1, armor_heal = 8, armor_fire = 2, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
groups = {armor_torso = 1, dark_matter_armor = 1, disable_repair = 1, exchangeclone_upgradable = 1}
})
armor:register_armor("exchangeclone:leggings_dark_matter", {
description = S("Dark Matter Leggings"),
texture = get_armor_texture("leggings","dark"),
inventory_image = get_armor_texture("inv_leggings","dark"),
preview = get_armor_texture("leggings","dark", true),
armor_groups = {fleshy = 18},
groups = {armor_legs = 1, dark_matter_armor = 1, armor_heal = 7, armor_fire = 1, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
groups = {armor_legs = 1, dark_matter_armor = 1, disable_repair = 1, exchangeclone_upgradable = 1}
})
armor:register_armor("exchangeclone:boots_dark_matter", {
description = S("Dark Matter Boots"),
texture = get_armor_texture("boots","dark"),
inventory_image = get_armor_texture("inv_boots","dark"),
preview = get_armor_texture("boots","dark", true),
armor_groups = {fleshy = 10},
groups = {armor_feet = 1, dark_matter_armor = 1, armor_heal = 4, armor_fire = 1, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
groups = {armor_feet = 1, dark_matter_armor = 1, disable_repair = 1, exchangeclone_upgradable = 1, armor_feather = 1}
})
armor:register_armor("exchangeclone:shield_dark_matter", {
description = S("Dark Matter Shield"),
texture = get_armor_texture("shield","dark"),
inventory_image = get_armor_texture("inv_shield","dark"),
preview = get_armor_texture("shield","dark", true),
armor_groups = {fleshy = 18},
groups = {armor_shield = 1, dark_matter_armor = 1, armor_heal = 7, armor_fire = 1, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
groups = {armor_shield = 1, dark_matter_armor = 1, disable_repair = 1, exchangeclone_upgradable = 1}
})
armor:register_armor("exchangeclone:helmet_red_matter", {
description = S("Red Matter Helmet"),
texture = get_armor_texture("helmet","red"),
inventory_image = get_armor_texture("inv_helmet","red"),
preview = get_armor_texture("helmet","red", true),
armor_groups = {fleshy = 15},
groups = {armor_head = 1, red_matter_armor = 1, armor_heal = 10, armor_fire = 2, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
groups = {armor_head = 1, red_matter_armor = 1, disable_repair = 1, exchangeclone_upgradable = 1}
})
armor:register_armor("exchangeclone:chestplate_red_matter", {
description = S("Red Matter Chestplate"),
texture = get_armor_texture("chestplate","red"),
inventory_image = get_armor_texture("inv_chestplate","red"),
preview = get_armor_texture("chestplate","red", true),
armor_groups = {fleshy = 23},
groups = {armor_torso = 1, red_matter_armor = 1, armor_heal = 16, armor_fire = 2, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
groups = {armor_torso = 1, red_matter_armor = 1, disable_repair = 1, exchangeclone_upgradable = 1}
})
armor:register_armor("exchangeclone:leggings_red_matter", {
description = S("Red Matter Leggings"),
texture = get_armor_texture("leggings","red"),
inventory_image = get_armor_texture("inv_leggings","red"),
preview = get_armor_texture("leggings","red", true),
armor_groups = {fleshy = 20},
groups = {armor_legs = 1, red_matter_armor = 1, armor_heal = 14, armor_fire = 2, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
groups = {armor_legs = 1, red_matter_armor = 1, disable_repair = 1, exchangeclone_upgradable = 1}
})
armor:register_armor("exchangeclone:boots_red_matter", {
description = S("Red Matter Boots"),
texture = get_armor_texture("boots","red"),
inventory_image = get_armor_texture("inv_boots","red"),
preview = get_armor_texture("boots","red", true),
armor_groups = {fleshy = 12},
groups = {armor_feet = 1, red_matter_armor = 1, armor_heal = 8, armor_fire = 2, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
groups = {armor_feet = 1, red_matter_armor = 1, disable_repair = 1, exchangeclone_upgradable = 1}
})
armor:register_armor("exchangeclone:shield_red_matter", {
description = S("Red Matter Shield"),
texture = get_armor_texture("shield","red"),
inventory_image = get_armor_texture("inv_shield","red"),
preview = get_armor_texture("shield","red", true),
armor_groups = {fleshy = 20},
groups = {armor_shield = 1, red_matter_armor = 1, armor_heal = 14, armor_fire = 2, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
groups = {armor_shield = 1, red_matter_armor = 1, disable_repair = 1, exchangeclone_upgradable = 1}
})
minetest.register_on_player_hpchange(function(player, hp_change, reason)
if hp_change < 0 then
local _, armor_inv = armor:get_valid_player(player, "3d_armor")
local blocked = 0
for i = 1, 6 do
local itemstack = armor_inv:get_stack("armor", i)
blocked = blocked + get_blocked_damage(itemstack, hp_change, reason)
end
return math.max(0, hp_change - blocked)
else
return hp_change
end
end, true)
end
local d = "exchangeclone:dark_matter"
local r = "exchangeclone:red_matter"
minetest.register_craft({

View File

@ -34,10 +34,15 @@ function exchangeclone.axe_action(itemstack, player, center)
else
if strip then
if node.param2 == start_node.param2 then
local on_axe_place = minetest.registered_items[node.name]._on_axe_place
if on_axe_place then
on_axe_place(itemstack, player, {type="node",under=pos})
end
minetest.swap_node(pos, {name=stripped_variant, param2=node.param2})
end
else
local drops = minetest.get_node_drops(node.name, itemstack:get_name())
-- specify the tool so the katar doesn't shear all the leaves
local drops = minetest.get_node_drops(node.name, "exchangeclone:red_matter_axe")
exchangeclone.drop_items_on_player(pos, drops, player)
end
end
@ -61,7 +66,7 @@ local function axe_on_place(itemstack, player, pointed_thing)
end
if pointed_thing.type == "node" then
if minetest.get_item_group(minetest.get_node(pointed_thing.under), "tree" > 0) then
if minetest.get_item_group(minetest.get_node(pointed_thing.under).name, "tree") > 0 then
exchangeclone.axe_action(itemstack, player, pointed_thing.under)
end
end

View File

@ -3,9 +3,9 @@ local S = minetest.get_translator()
exchangeclone.tool_types = exchangeclone.tool_types or {}
for group, amount in pairs({
sword = 2,
pickaxe = 3,
pick = 3,
sword = 2,
axe = 3,
shovel = 1,
hoe = 2,
@ -79,6 +79,7 @@ local listnames = {exchangeclone_covalence_dust = true, exchangeclone_covalence_
local function is_repairable_gear(item)
item = ItemStack(item)
if item:get_wear() <= 0 then return end
if minetest.get_item_group(item:get_name(), "disable_repair") then return end
if (exchangeclone.get_item_energy(item) or 0) <= 0 then return end
local result = 0

View File

@ -9,7 +9,7 @@ function exchangeclone.hammer_action(itemstack, player, center)
local pos1, pos2 = vector.add(center, vector1), vector.add(center, vector2)
exchangeclone.play_ability_sound(player)
local nodes = minetest.find_nodes_in_area(pos1, pos2, {"group:"..exchangeclone.stone_group})
local nodes = minetest.find_nodes_in_area(pos1, pos2, {"group:"..exchangeclone.pickaxe_group})
for _, pos in pairs(nodes) do
if minetest.is_protected(pos, player:get_player_name()) then
minetest.record_protection_violation(pos, player:get_player_name())
@ -75,7 +75,7 @@ minetest.register_tool("exchangeclone:dark_matter_hammer", {
on_secondary_use = hammer_on_place
})
exchangeclone.register_multidig_tool("exchangeclone:dark_matter_hammer", {"group:"..exchangeclone.stone_group})
exchangeclone.register_multidig_tool("exchangeclone:dark_matter_hammer", {"group:"..exchangeclone.pickaxe_group})
minetest.register_alias("exchangeclone:dark_matter_hammer_3x3", "exchangeclone:dark_matter_hammer")
exchangeclone.set_charge_type("exchangeclone:dark_matter_hammer", "dark_matter")
@ -103,7 +103,7 @@ minetest.register_tool("exchangeclone:red_matter_hammer", {
on_secondary_use = hammer_on_place,
})
exchangeclone.register_multidig_tool("exchangeclone:red_matter_hammer", {"group:"..exchangeclone.stone_group})
exchangeclone.register_multidig_tool("exchangeclone:red_matter_hammer", {"group:"..exchangeclone.pickaxe_group})
minetest.register_alias("exchangeclone:red_matter_hammer_3x3", "exchangeclone:red_matter_hammer")
exchangeclone.set_charge_type("exchangeclone:red_matter_hammer", "red_matter")

View File

@ -129,8 +129,8 @@ minetest.register_tool("exchangeclone:dark_matter_hoe", {
},
_mcl_toollike_wield = true,
_mcl_diggroups = {
exchangeclone_dirt = { speed = 14, level = 7, uses = 0 },
hoey = { speed = 14, level = 7, uses = 0 }
exchangeclone_dirt = { speed = 14, level = 5, uses = 0 },
hoey = { speed = 14, level = 5, uses = 0 }
},
})
@ -155,8 +155,8 @@ minetest.register_tool("exchangeclone:red_matter_hoe", {
},
_mcl_toollike_wield = true,
_mcl_diggroups = {
exchangeclone_dirt = { speed = 16, level = 8, uses = 0 },
hoey = { speed = 16, level = 8, uses = 0 }
exchangeclone_dirt = { speed = 16, level = 6, uses = 0 },
hoey = { speed = 16, level = 6, uses = 0 }
},
})

View File

@ -36,226 +36,40 @@ if exchangeclone.mcl then
mcl_formspec.get_itemslot_bg(2*width/3-0.5,1,1,1)
end
exchangeclone.node_transmutations = {
{ --use
["mcl_core:stone"] = "mcl_core:cobble",
["mcl_core:cobble"] = "mcl_core:stone",
["mcl_core:dirt_with_grass"] = "mcl_core:sand",
["mcl_core:dirt"] = "mcl_core:sand",
["mcl_core:sand"] = "mcl_core:dirt_with_grass",
["mcl_core:podzol"] = "mcl_core:redsand",
["mcl_core:redsand"] = "mcl_core:podzol",
["mcl_flowers:tallgrass"] = "mcl_flowers:fern",
["mcl_flowers:fern"] = "mcl_flowers:tallgrass",
["mcl_core:redsandstone"] = "mcl_core:gravel",
["mcl_farming:pumpkin"] = "mcl_farming:melon",
["mcl_farming:melon"] = "mcl_farming:pumpkin",
["mcl_core:water_source"] = "mcl_core:ice",
["mclx_core:river_water_source"] = "mcl_core:ice",
["mcl_core:ice"] = "mcl_core:water_source",
["mcl_core:lava_source"] = "mcl_core:obsidian",
["mcl_core:obsidian"] = "mcl_core:lava_source",
["mcl_flowers:dandelion"] = "mcl_flowers:poppy",
["mcl_flowers:poppy"] = "mcl_flowers:dandelion",
["mcl_mushrooms:mushroom_brown"] = "mcl_mushrooms:mushroom_red",
["mcl_mushrooms:mushroom_red"] = "mcl_mushrooms:mushroom_brown",
["mcl_core:acacialeaves"] = "mcl_core:birchleaves",
["mcl_core:birchleaves"] = "mcl_core:darkleaves",
["mcl_core:darkleaves"] = "mcl_core:jungleleaves",
["mcl_core:jungleleaves"] = "mcl_mangrove:mangroveleaves",
["mcl_mangrove:mangroveleaves"] = "mcl_core:leaves",
["mcl_core:leaves"] = "mcl_core:spruceleaves",
["mcl_core:spruceleaves"] = "mcl_core:acacialeaves",
["mcl_core:acaciatree"] = "mcl_core:birchtree",
["mcl_core:birchtree"] = "mcl_core:darktree",
["mcl_core:darktree"] = "mcl_core:jungletree",
["mcl_core:jungletree"] = "mcl_mangrove:mangrove_tree",
["mcl_mangrove:mangrove_tree"] = "mcl_core:tree",
["mcl_core:tree"] = "mcl_core:sprucetree",
["mcl_core:sprucetree"] = "mcl_core:acaciatree",
["mcl_crimson:warped_fungus"] = "mcl_crimson:crimson_fungus",
["mcl_crimson:warped_hyphae"] = "mcl_crimson:crimson_hyphae",
["mcl_crimson:warped_nylium"] = "mcl_crimson:crimson_nylium",
["mcl_crimson:warped_roots"] = "mcl_crimson:crimson_roots",
["mcl_crimson:warped_wart_block"] = "mcl_nether:nether_wart_block",
["mcl_crimson:crimson_fungus"] = "mcl_crimson:warped_fungus",
["mcl_crimson:crimson_hyphae"] = "mcl_crimson:warped_hyphae",
["mcl_crimson:crimson_nylium"] = "mcl_crimson:warped_nylium",
["mcl_crimson:crimson_roots"] = "mcl_crimson:warped_roots",
["mcl_nether:nether_wart_block"] = "mcl_crimson:warped_wart_block",
["mcl_core:glass"] = "mcl_core:sand",
["mcl_blackstone:blackstone"] = "mcl_blackstone:basalt",
["mcl_blackstone:basalt"] = "mcl_blackstone:blackstone",
["mcl_flowers:double_grass"] = "mcl_flowers:fern",
--["mcl_flowers:double_grass_top"] = "air",
["mcl_core:andesite"] = "mcl_core:diorite",
["mcl_core:diorite"] = "mcl_core:granite",
["mcl_core:granite"] = "mcl_deepslate:tuff",
["mcl_deepslate:tuff"] = "mcl_core:andesite",
["mcl_deepslate:deepslate"] = "mcl_deepslate:deepslate_cobbled",
["mcl_deepslate:deepslate_cobbled"] = "mcl_deepslate:deepslate",
["mcl_core:stone_with_coal"] = "mcl_deepslate:deepslate_with_coal",
["mcl_core:stone_with_iron"] = "mcl_deepslate:deepslate_with_iron",
["mcl_core:stone_with_lapis"] = "mcl_deepslate:deepslate_with_lapis",
["mcl_core:stone_with_gold"] = "mcl_deepslate:deepslate_with_gold",
["mcl_core:stone_with_emerald"] = "mcl_deepslate:deepslate_with_emerald",
["mcl_core:stone_with_redstone"] = "mcl_deepslate:deepslate_with_redstone",
["mcl_core:stone_with_redstone_lit"] = "mcl_deepslate:deepslate_with_redstone_lit",
["mcl_core:stone_with_diamond"] = "mcl_deepslate:deepslate_with_diamond",
["mcl_copper:stone_with_copper"] = "mcl_deepslate:deepslate_with_copper",
["mcl_deepslate:deepslate_with_coal"] = "mcl_core:stone_with_coal",
["mcl_deepslate:deepslate_with_iron"] = "mcl_core:stone_with_iron",
["mcl_deepslate:deepslate_with_lapis"] = "mcl_core:stone_with_lapis",
["mcl_deepslate:deepslate_with_gold"] = "mcl_core:stone_with_gold",
["mcl_deepslate:deepslate_with_emerald"] = "mcl_core:stone_with_emerald",
["mcl_deepslate:deepslate_with_redstone"] = "mcl_core:stone_with_redstone",
["mcl_deepslate:deepslate_with_diamond"] = "mcl_core:stone_with_diamond",
["mcl_deepslate:deepslate_with_copper"] = "mcl_copper:stone_with_copper",
["mcl_end:end_stone"] = "mcl_nether:netherrack",
["mcl_nether:soul_sand"] = "mcl_blackstone:soul_soil",
["mcl_blackstone:soul_soil"] = "mcl_nether:soul_sand",
-- exchangeclone.node_transmutations moved to zzzz_exchangeclone_init/init.lua so it would load first
-- This means it can be modified by other mods
["default:stone"] = "default:cobble",
["default:desert_stone"] = "default:desert_cobble",
["default:cobble"] = "default:stone",
["default:desert_cobble"] = "default:desert_stone",
["default:dirt_with_grass"] = "default:sand",
["default:dirt_with_snow"] = "default:sand",
["default:dirt_with_dry_grass"] = "default:sand",
["default:dry_dirt_with_dry_grass"] = "default:desert_sand",
["default:dirt"] = "default:sand",
["default:dry_dirt"] = "default:desert_sand",
["default:dirt_with_coniferous_litter"] = "default:sand",
["default:dirt_with_rainforest_litter"] = "default:sand",
["default:sand"] = "default:dirt_with_grass",
["default:desert_sand"] = "default:dry_dirt_with_dry_grass",
["default:silver_sand"] = "default:dirt_with_grass",
["default:grass_1"] = "default:dry_shrub",
["default:grass_2"] = "default:dry_shrub",
["default:grass_3"] = "default:dry_shrub",
["default:grass_4"] = "default:dry_shrub",
["default:grass_5"] = "default:dry_shrub",
["default:gravel"] = "default:sandstone",
["default:sandstone"] = "default:gravel",
["default:desert_sandstone"] = "default:gravel",
["default:silver_sandstone"] = "default:gravel",
["default:water_source"] = "default:ice",
["default:river_water_source"] = "default:ice",
["default:ice"] = "default:water_source",
["default:lava_source"] = "default:obsidian",
["default:obsidian"] = "default:lava_source",
["flowers:mushroom_brown"] = "flowers:mushroom_red",
["flowers:mushroom_red"] = "flowers:mushroom_brown",
["flowers:dandelion_yellow"] = "flowers:rose",
["flowers:rose"] = "flowers:dandelion_yellow",
["default:acacia_tree"] = "default:tree",
["default:tree"] = "default:aspen_tree",
["default:aspen_tree"] = "default:jungletree",
["default:jungletree"] = "default:pine_tree",
["default:pine_tree"] = "default:acacia_tree",
["default:acacia_leaves"] = "default:leaves",
["default:leaves"] = "default:aspen_leaves",
["default:aspen_leaves"] = "default:jungleleaves",
["default:jungleleaves"] = "default:pine_needles",
["default:pine_needles"] = "default:acacia_leaves",
["default:acacia_bush_leaves"] = "default:bush_leaves",
["default:bush_leaves"] = "default:pine_bush_needles",
["default:pine_bush_needles"] = "default:acacia_bush_leaves",
["default:acacia_bush_stem"] = "default:bush_stem",
["default:bush_stem"] = "default:pine_bush_stem",
["default:pine_bush_stem"] = "default:acacia_bush_stem",
["default:glass"] = "default:sand",
},
{ --sneak+use
["mcl_core:stone"] = "mcl_core:dirt_with_grass",
["mcl_core:cobble"] = "mcl_core:dirt_with_grass",
["mcl_deepslate:deepslate"] = "mcl_core:podzol",
["mcl_deepslate:deepslate_cobbled"] = "mcl_core:podzol",
["mcl_core:sand"] = "mcl_core:cobble",
["mcl_core:redsand"] = "mcl_core:cobble",
["mcl_core:dirt_with_grass"] = "mcl_core:cobble",
["mcl_core:dirt"] = "mcl_core:cobble",
["mcl_core:podzol"] = "mcl_deepslate:deepslate_cobbled",
["mcl_deepslate:tuff"] = "mcl_core:granite",
["mcl_core:granite"] = "mcl_core:diorite",
["mcl_core:diorite"] = "mcl_core:andesite",
["mcl_core:andesite"] = "mcl_deepslate:tuff",
["mcl_core:acacialeaves"] = "mcl_core:spruceleaves",
["mcl_core:birchleaves"] = "mcl_core:acacialeaves",
["mcl_core:darkleaves"] = "mcl_core:birchleaves",
["mcl_core:jungleleaves"] = "mcl_core:darkleaves",
["mcl_mangrove:mangroveleaves"] = "mcl_core:jungleleaves",
["mcl_core:leaves"] = "mcl_mangrove:mangroveleaves",
["mcl_core:spruceleaves"] = "mcl_core:leaves",
["mcl_core:acaciatree"] = "mcl_core:sprucetree",
["mcl_core:birchtree"] = "mcl_core:acaciatree",
["mcl_core:darktree"] = "mcl_core:birchtree",
["mcl_core:jungletree"] = "mcl_core:darktree",
["mcl_mangrove:mangrove_tree"] = "mcl_core:jungletree",
["mcl_core:tree"] = "mcl_mangrove:mangrove_tree",
["mcl_core:sprucetree"] = "mcl_core:tree",
["mcl_nether:netherrack"] = "mcl_end:end_stone",
["default:stone"] = "default:dirt_with_grass",
["default:cobble"] = "default:dirt_with_grass",
["default:desert_stone"] = "default:dry_dirt_with_dry_grass",
["default:desert_cobble"] = "default:dry_dirt_with_dry_grass",
["default:dry_dirt_with_dry_grass"] = "default:desert_cobble",
["default:dirt_with_dry_grass"] = "default:cobble",
["default:dirt_with_grass"] = "default:cobble",
["default:dirt_with_snow"] = "default:cobble",
["default:dirt"] = "default:cobble",
["default:dry_dirt"] = "default:desert_cobble",
["default:dirt_with_coniferous_litter"] = "default:cobble",
["default:dirt_with_rainforest_litter"] = "default:cobble",
["default:sand"] = "default:cobble",
["default:desert_sand"] = "default:desert_cobble",
["default:silver_sand"] = "default:cobble",
["default:acacia_tree"] = "default:pine_tree",
["default:tree"] = "default:acacia_tree",
["default:aspen_tree"] = "default:tree",
["default:jungletree"] = "default:aspen_tree",
["default:pine_tree"] = "default:jungletree",
["default:acacia_leaves"] = "default:pine_needles",
["default:leaves"] = "default:acacia_leaves",
["default:aspen_leaves"] = "default:leaves",
["default:jungleleaves"] = "default:aspen_leaves",
["default:pine_needles"] = "default:jungleleaves",
["default:acacia_bush_leaves"] = "default:pine_bush_needles",
["default:bush_leaves"] = "default:acacia_bush_leaves",
["default:pine_bush_needles"] = "default:bush_leaves",
["default:acacia_bush_stem"] = "default:pine_bush_stem",
["default:bush_stem"] = "default:acacia_bush_stem",
["default:pine_bush_stem"] = "default:bush_stem",
}
}
exchangeclone.stone_action = {
start_action = function(player, center, range, mode)
-- Yes, I named the cooldown Phil. His last name is Osophersstone.
if exchangeclone.check_cooldown(player, "phil") then return end
exchangeclone.play_ability_sound(player)
return mode
end,
action = function(player, pos, node, mode)
local new_node = exchangeclone.node_transmutations[mode][node.name]
if not new_node and mode == 2 then
new_node = exchangeclone.node_transmutations[1][node.name]
end
if new_node then
if minetest.is_protected(pos, player:get_player_name()) then
minetest.record_protection_violation(pos, player:get_player_name())
else
node.name = new_node
minetest.swap_node(pos, node)
end
end
return true
end,
end_action = function(player, center, range, data)
exchangeclone.start_cooldown(player, "phil", 0.3)
function exchangeclone.phil_action(itemstack, player, center)
if exchangeclone.check_cooldown(player, "phil") then return end
local mode = player:get_player_control().sneak and 2 or 1
local start_node = minetest.get_node(center)
local transmute_name = exchangeclone.node_transmutations[mode][start_node.name]
if not transmute_name and mode == 2 then
transmute_name = exchangeclone.node_transmutations[1][start_node.name]
end
}
if not transmute_name then return end
local charge = math.max(itemstack:get_meta():get_int("exchangeclone_tool_charge"), 1)
local nodes
if charge == 1 then
nodes = {center}
else
local vector1, vector2 = exchangeclone.process_range(player, "basic_radius", charge)
if not (vector1 and vector2) then return end
local pos1, pos2 = vector.add(center, vector1), vector.add(center, vector2)
nodes = minetest.find_nodes_in_area(pos1, pos2, start_node.name)
end
exchangeclone.play_ability_sound(player)
for i, pos in pairs(nodes) do
if minetest.is_protected(pos, player:get_player_name()) then
minetest.record_protection_violation(pos, player:get_player_name())
else
local node = minetest.get_node(pos)
node.name = transmute_name
minetest.swap_node(pos, node)
end
end
exchangeclone.start_cooldown(player, "phil", 0.3)
end
local on_left_click
if exchangeclone.mcl then
@ -284,16 +98,8 @@ local function on_right_click(itemstack, player, pointed_thing)
if player:get_player_control().aux1 then
return exchangeclone.charge_update(itemstack, player)
end
local center = player:get_pos()
if pointed_thing and pointed_thing.type == "node" then
center = pointed_thing.under
end
if player:get_player_control().sneak then
local range = tonumber(itemstack:get_meta():get_int("exchangeclone_tool_charge"))
exchangeclone.node_radius_action(player, center, range, exchangeclone.stone_action, 2)
else
local range = itemstack:get_meta():get_int("exchangeclone_tool_charge")
exchangeclone.node_radius_action(player, center, range, exchangeclone.stone_action, 1)
exchangeclone.phil_action(itemstack, player, pointed_thing.under)
end
end
@ -308,6 +114,8 @@ minetest.register_tool("exchangeclone:philosophers_stone", {
groups = {philosophers_stone = 1, disable_repair = 1, fire_immune = 1}
})
exchangeclone.set_charge_type("exchangeclone:philosophers_stone", "phil")
local diamond = exchangeclone.itemstrings.diamond
local corner = exchangeclone.itemstrings.glowstoneworth
local side = exchangeclone.itemstrings.redstoneworth

View File

@ -37,13 +37,6 @@ function exchangeclone.mine_vein(player, start_pos, node_name, pos, depth, visit
end
end
local torch_itemstring = "default:torch"
if exchangeclone.mcl then
torch_itemstring = "mcl_torches:torch"
end
local torch_on_place = minetest.registered_items[torch_itemstring].on_place
local function pickaxe_on_use(itemstack, player, pointed_thing)
local click_test = exchangeclone.check_on_rightclick(itemstack, player, pointed_thing)
if click_test ~= false then
@ -76,9 +69,8 @@ local function pickaxe_on_use(itemstack, player, pointed_thing)
exchangeclone.mine_vein(player, pointed_thing.under)
exchangeclone.start_cooldown(player, "pickaxe", 0.5)
elseif itemstack:get_name():find("red_") then
local player_energy = exchangeclone.get_player_energy(player)
minetest.log(dump(torch_on_place(ItemStack(torch_itemstring), player, pointed_thing):get_name()))
exchangeclone.set_player_energy(player, player_energy - math.max(exchangeclone.get_item_energy(torch_itemstring) or 0, 8))
exchangeclone.place_torch(player, pointed_thing)
exchangeclone.add_player_energy(player, -math.max(exchangeclone.get_item_energy(exchangeclone.itemstrings.torch) or 0, 8))
-- If the torch could not be placed, it still costs energy... not sure how to fix that
end
end
@ -107,7 +99,7 @@ minetest.register_tool("exchangeclone:dark_matter_pickaxe", {
on_place = pickaxe_on_use,
})
exchangeclone.register_multidig_tool("exchangeclone:dark_matter_pickaxe", {"group:"..exchangeclone.stone_group})
exchangeclone.register_multidig_tool("exchangeclone:dark_matter_pickaxe", {"group:"..exchangeclone.pickaxe_group})
minetest.register_alias("exchangeclone:dark_matter_pickaxe_3x1", "exchangeclone:dark_matter_pickaxe")
exchangeclone.set_charge_type("exchangeclone:dark_matter_pickaxe", "dark_matter")
@ -134,7 +126,7 @@ minetest.register_tool("exchangeclone:red_matter_pickaxe", {
on_place = pickaxe_on_use,
})
exchangeclone.register_multidig_tool("exchangeclone:red_matter_pickaxe", {"group:"..exchangeclone.stone_group})
exchangeclone.register_multidig_tool("exchangeclone:red_matter_pickaxe", {"group:"..exchangeclone.pickaxe_group})
minetest.register_alias("exchangeclone:red_matter_pickaxe_3x1", "exchangeclone:red_matter_pickaxe")
exchangeclone.set_charge_type("exchangeclone:red_matter_pickaxe", "red_matter")

View File

@ -18,31 +18,40 @@ local katar_on_use = function(itemstack, player, pointed_thing)
return -- Don't do AOE when pointed at sheep/mooshroom, shear instead.
end
end
if pointed_thing.type == "node" then
local node = minetest.get_node(pointed_thing.under)
local range = itemstack:get_meta():get_int("exchangeclone_tool_charge")
local center = player:get_pos()
if pointed_thing.type == "node" then
center = pointed_thing.under
local on_shears_place = minetest.registered_items[node.name]._on_shears_place
if on_shears_place then
return on_shears_place(itemstack, player, pointed_thing)
end
if minetest.get_item_group(node.name, "exchangeclone_dirt") > 0 then
if node.name == "mcl_farming:pumpkin" and (pointed_thing.above.y ~= pointed_thing.under.y) then
minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = pointed_thing.above}, true)
local dir = vector.subtract(pointed_thing.under, pointed_thing.above)
local param2 = minetest.dir_to_facedir(dir)
minetest.set_node(pointed_thing.under, {name="mcl_farming:pumpkin_face", param2 = param2})
minetest.add_item(pointed_thing.above, "mcl_farming:pumpkin_seeds 4")
elseif minetest.get_item_group(node.name, "exchangeclone_dirt") > 0 then
if player:get_player_control().sneak then
local current_name = itemstack:get_name()
if string.sub(current_name, -4, -1) == "_3x3" then
itemstack:set_name(string.sub(current_name, 1, -5))
minetest.chat_send_player(player:get_player_name(), "Single node mode")
local meta = itemstack:get_meta()
local current_mode = meta:get_string("exchangeclone_multidig_mode")
if current_mode == "3x3" then
meta:set_string("exchangeclone_multidig_mode", "1x1")
minetest.chat_send_player(player:get_player_name(), S("Single node mode"))
else
itemstack:set_name(current_name.."_3x3")
minetest.chat_send_player(player:get_player_name(), "3x3 mode")
meta:set_string("exchangeclone_multidig_mode", "3x3")
minetest.chat_send_player(player:get_player_name(), S("3x3 mode"))
end
return itemstack
else
exchangeclone.node_radius_action(player, center, range, exchangeclone.hoe_action, itemstack)
exchangeclone.hoe_action(itemstack, player, pointed_thing.under)
end
elseif minetest.get_item_group(node.name, "tree") > 0 then
exchangeclone.node_radius_action(player, center, range, exchangeclone.axe_action, itemstack)
elseif minetest.get_item_group(node.name, "shearsy") > 0 or minetest.get_item_group(node.name, "shearsy_cobweb") > 0 then
exchangeclone.node_radius_action(player, center, range, exchangeclone.shear_action, itemstack)
exchangeclone.axe_action(itemstack, player, pointed_thing.under)
elseif exchangeclone.mcl
and (minetest.get_item_group(node.name, "shearsy") > 0
or minetest.get_item_group(node.name, "shearsy_cobweb") > 0) then
exchangeclone.shear_action(itemstack, player, pointed_thing.under)
end
else
local damage_all = itemstack:get_meta():get_int("exchangeclone_damage_all")
@ -59,12 +68,12 @@ local katar_on_use = function(itemstack, player, pointed_thing)
return itemstack
end
local aoe_function = exchangeclone.aoe_attack({damage = 1000, knockback = 20, radius = 10, damage_all = damage_all, cooldown = 0.7})
local aoe_function = exchangeclone.aoe_attack({damage = 1000, knockback = 20, radius = 10, damage_all = damage_all, cooldown = 0.625})
aoe_function(itemstack, player, pointed_thing)
end
end
local katar_def = {
minetest.register_tool("exchangeclone:red_katar", {
description = S("Red Katar").."\n"..S("Single node mode"),
wield_image = "exchangeclone_red_katar.png",
inventory_image = "exchangeclone_red_katar.png",
@ -86,26 +95,19 @@ local katar_def = {
sound = { breaks = "default_tool_breaks" },
_mcl_toollike_wield = true,
_mcl_diggroups = {
exchangeclone_dirt = { speed = 64, level = 8, uses = 0 },
exchangeclone_dirt = { speed = 64, level = 7, uses = 0 },
shearsy = { speed = 64, level = 3, uses = 0 },
shearsy_wool = { speed = 64, level = 3, uses = 0 },
shearsy_cobweb = { speed = 64, level = 3, uses = 0 },
hoey = { speed = 64, level = 8, uses = 0 },
swordy = { speed = 64, level = 8, uses = 0 },
axey = { speed = 64, level = 8, uses = 0 }
shearsy_wool = { speed = 64, level = 7, uses = 0 },
shearsy_cobweb = { speed = 64, level = 7, uses = 0 },
hoey = { speed = 64, level = 7, uses = 0 },
swordy = { speed = 64, level = 7, uses = 0 },
axey = { speed = 64, level = 7, uses = 0 }
},
}
})
minetest.register_tool("exchangeclone:red_katar", table.copy(katar_def))
katar_def.description = S("Red Katar").."\n"..S("3x3 mode")
katar_def.groups.not_in_creative_inventory = 1
katar_def._mcl_diggroups.exchangeclone_dirt = {speed = 8, level = 8, uses = 0}
katar_def.tool_capabilities.groupcaps.exchangeclone_dirt = {times={[1]=0.25,[2]=0.25,[3]=0.25}}
minetest.register_tool("exchangeclone:red_katar_3x3", table.copy(katar_def))
exchangeclone.register_alias("exchangeclone:red_katar", "exchangeclone:red_katar_3x3")
minetest.register_alias("exchangeclone:red_katar_3x3", "exchangeclone:red_katar")
exchangeclone.register_multidig_tool("exchangeclone:red_katar", {"group:exchangeclone_dirt"})
exchangeclone.set_charge_type("exchangeclone:red_katar", "red_multi")
minetest.register_craft({
output = "exchangeclone:red_katar",
@ -114,7 +116,7 @@ minetest.register_craft({
"exchangeclone:red_matter_sword",
"exchangeclone:red_matter_axe",
"group:red_matter_hoe",
(exchangeclone.mcl and "exchangeclone:red_matter_shears") or "exchangeclone:red_matter",
exchangeclone.mcl and "exchangeclone:red_matter_shears" or "exchangeclone:red_matter",
"exchangeclone:red_matter",
"exchangeclone:red_matter",
"exchangeclone:red_matter",
@ -124,42 +126,22 @@ minetest.register_craft({
})
--------------------------------------RED MORNINGSTAR--------------------------------------
exchangeclone.morningstar_action = {
start_action = function(player, center, range, itemstack)
if exchangeclone.check_cooldown(player, "shovel") then return end
if exchangeclone.check_cooldown(player, "hammer") then return end
local data = {}
data.itemstack = itemstack
exchangeclone.play_ability_sound(player)
data.remove_positions = {}
return data
end,
action = function(player, pos, node, data)
if ((minetest.get_item_group(node.name, "crumbly") > 0) or (minetest.get_item_group(node.name, "shovely") > 0))
or ((minetest.get_item_group(node.name, "cracky") > 0) or (minetest.get_item_group(node.name, "pickaxey") > 0)) then
if minetest.is_protected(pos, player:get_player_name()) then
minetest.record_protection_violation(pos, player:get_player_name())
else
local drops = minetest.get_node_drops(node.name, data.itemstack:get_name())
exchangeclone.drop_items_on_player(pos, drops, player)
table.insert(data.remove_positions, pos)
end
end
return data
end,
end_action = function(player, center, range, data)
exchangeclone.remove_nodes(data.remove_positions)
exchangeclone.start_cooldown(player, "shovel", range/4) -- Longish cooldown
exchangeclone.start_cooldown(player, "hammer", range/2)
end
}
local torch_itemstring = "default:torch"
if exchangeclone.mcl then
torch_itemstring = "mcl_torches:torch"
end
local torch_on_place = minetest.registered_items[torch_itemstring].on_place
-- If pointed_thing has on_rightclick
-- Run on_rightclick function
-- Elseif player holding aux1
-- Range update
-- Elseif pointed at node:
-- If node is an ore:
-- Vein mine
-- Elseif node is dirt and MCL:
-- Shovel action (since paths exist, there has to be a way to do it without sneaking)
-- Elseif node is shovely and player is sneaking
-- Shovel action
-- Elseif node is pickaxey:
-- Hammer action
-- Elseif player is sneaking
-- Update the mode
local function morningstar_on_use(itemstack, player, pointed_thing)
local click_test = exchangeclone.check_on_rightclick(itemstack, player, pointed_thing)
@ -168,69 +150,61 @@ local function morningstar_on_use(itemstack, player, pointed_thing)
end
if player:get_player_control().aux1 then
return exchangeclone.charge_update(itemstack, player, 5)
return exchangeclone.charge_update(itemstack, player)
end
local range = itemstack:get_meta():get_int("exchangeclone_tool_charge")
local center = player:get_pos()
local sneaking = player:get_player_control().sneak
if pointed_thing.type == "node" then
center = pointed_thing.under
if player:get_player_control().sneak then
exchangeclone.node_radius_action(player, center, range, exchangeclone.morningstar_action, itemstack)
return
elseif (minetest.get_item_group(minetest.get_node(pointed_thing.under).name, "exchangeclone_ore") > 0) then
local name = minetest.get_node(pointed_thing.under).name
if (minetest.get_item_group(name, "exchangeclone_ore") > 0) then
if exchangeclone.check_cooldown(player, "pickaxe") then return itemstack end
exchangeclone.play_ability_sound(player)
exchangeclone.multidig_data[player:get_player_name()] = true
exchangeclone.mine_vein(player, pointed_thing.under)
exchangeclone.multidig_data[player:get_player_name()] = nil
exchangeclone.start_cooldown(player, "pickaxe", 0.3)
exchangeclone.start_cooldown(player, "pickaxe", 0.5)
return
elseif minetest.get_item_group(name, "exchangeclone_dirt") > 0 and exchangeclone.mcl then
exchangeclone.shovel_action(itemstack, player, pointed_thing.under)
elseif minetest.get_item_group(name, exchangeclone.shovel_group) > 0 and sneaking then
exchangeclone.shovel_action(itemstack, player, pointed_thing.under)
elseif minetest.get_item_group(name, exchangeclone.pickaxe_group) > 0 and sneaking then
exchangeclone.hammer_action(itemstack, player, pointed_thing.under)
else
local player_energy = exchangeclone.get_player_energy(player)
torch_on_place(ItemStack(torch_itemstring), player, pointed_thing)
exchangeclone.set_player_energy(player, player_energy - math.max(exchangeclone.get_item_energy(torch_itemstring) or 0, 8))
exchangeclone.place_torch(player, pointed_thing)
exchangeclone.add_player_energy(player, -math.max(exchangeclone.get_item_energy(exchangeclone.itemstrings.torch) or 0, 8))
-- If the torch could not be placed, it still costs energy... not sure how to fix that
exchangeclone.start_cooldown(player, "pickaxe", 0.3)
return
end
elseif player:get_player_control().sneak then
local current_name = itemstack:get_name()
elseif sneaking then
local meta = itemstack:get_meta()
local current_mode = itemstack:get_meta():get_string("exchangeclone_pick_mode")
local current_mode = itemstack:get_meta():get_string("exchangeclone_multidig_mode")
if current_mode == "" or not current_mode then current_mode = "1x1" end
if current_mode == "1x1" then
itemstack:set_name(current_name.."_3x3") -- set to 3x3 pick
meta:set_string("exchangeclone_pick_mode", "3x3")
meta:set_string("exchangeclone_multidig_mode", "3x3")
minetest.chat_send_player(player:get_player_name(), S("3x3 mode"))
elseif current_mode == "3x3" then
itemstack:set_name(string.sub(current_name, 1, -5).."_3x1") -- set to 3x1 pick
meta:set_string("exchangeclone_pick_mode", "tall")
meta:set_string("exchangeclone_multidig_mode", "3x1_tall")
minetest.chat_send_player(player:get_player_name(), S("3x1 tall mode"))
elseif current_mode == "tall" then
meta:set_string("exchangeclone_pick_mode", "wide")
elseif current_mode == "3x1_tall" then
meta:set_string("exchangeclone_multidig_mode", "3x1_wide")
minetest.chat_send_player(player:get_player_name(), S("3x1 wide mode"))
elseif current_mode == "wide" then
meta:set_string("exchangeclone_pick_mode", "long")
elseif current_mode == "3x1_wide" then
meta:set_string("exchangeclone_multidig_mode", "3x1_long")
minetest.chat_send_player(player:get_player_name(), S("3x1 long mode"))
elseif current_mode == "long" then
itemstack:set_name(string.sub(current_name, 1, -5)) -- set to 1x1 pick
meta:set_string("exchangeclone_pick_mode", "1x1")
elseif current_mode == "3x1_long" then
meta:set_string("exchangeclone_multidig_mode", "1x1")
minetest.chat_send_player(player:get_player_name(), S("Single node mode"))
end
return itemstack
else
exchangeclone.node_radius_action(player, center, range, exchangeclone.morningstar_action, itemstack)
end
end
local morningstar_def = {
minetest.register_tool("exchangeclone:red_morningstar", {
description = S("Red Morningstar").."\n"..S("Single node mode"),
wield_image = "exchangeclone_red_morningstar.png",
inventory_image = "exchangeclone_red_morningstar.png",
on_secondary_use = morningstar_on_use,
exchangeclone_pick_mode = "1x1",
on_place = morningstar_on_use,
groups = { tool=1, red_morningstar = 1, shovel = 1, hammer=1, pickaxe = 1, dig_speed_class=7, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
wield_scale = exchangeclone.wield_scale,
@ -252,33 +226,12 @@ local morningstar_def = {
shovely = {speed = 64, level = 7, uses = 0},
axey = { speed = 64, level = 7, uses = 0 },
},
}
})
minetest.register_tool("exchangeclone:red_morningstar", table.copy(morningstar_def))
for k, v in pairs({cracky = "pickaxey", crumbly = "shovely"}) do
morningstar_def.tool_capabilities.groupcaps[k].times = {[1]=0.7,[2]=0.5,[3]=0.25}
morningstar_def._mcl_diggroups[v].speed = 70
end
morningstar_def.description = S("Red Morningstar").."\n"..S("3x3 mode")
morningstar_def.groups.not_in_creative_inventory = 1
morningstar_def.exchangeclone_pick_mode = "3x3"
minetest.register_tool("exchangeclone:red_morningstar_3x3", table.copy(morningstar_def))
exchangeclone.register_alias("exchangeclone:red_morningstar", "exchangeclone:red_morningstar_3x3")
for k, v in pairs({cracky = "pickaxey", crumbly = "shovely"}) do
morningstar_def.tool_capabilities.groupcaps[k].times = {[1]=0.6,[2]=0.4,[3]=0.20}
morningstar_def._mcl_diggroups[v].speed = 80
end
morningstar_def.exchangeclone_pick_mode = "tall"
morningstar_def.description = S("Red Morningstar").."\n"..S("3x1 mode")
minetest.register_tool("exchangeclone:red_morningstar_3x1", table.copy(morningstar_def))
exchangeclone.register_alias("exchangeclone:red_morningstar", "exchangeclone:red_morningstar_3x1")
minetest.register_alias("exchangeclone:red_morningstar_3x1", "exchangeclone:red_morningstar")
minetest.register_alias("exchangeclone:red_morningstar_3x3", "exchangeclone:red_morningstar")
exchangeclone.register_multidig_tool("exchangeclone:red_morningstar", {"group:"..exchangeclone.pickaxe_group, "group:"..exchangeclone.shovel_group})
exchangeclone.set_charge_type("exchangeclone:red_morningstar", "red_multi")
minetest.register_craft({
output = "exchangeclone:red_morningstar",

View File

@ -21,8 +21,7 @@ function exchangeclone.shear_action(itemstack, player, center)
exchangeclone.drop_items_on_player(pos, drops, player)
-- Annoying manual override
if node.name:sub(1,18) == "mcl_ocean:seagrass" then
minetest.set_node(pos, {name="sand"})
nodes[i] = nil
minetest.set_node(pos, {name="mcl_core:sand"})
end
end
end
@ -42,22 +41,20 @@ local shears_rightclick = function(itemstack, player, pointed_thing)
return exchangeclone.charge_update(itemstack, player)
end
if (pointed_thing.type == "node") and pointed_thing.above and not player:get_player_control().sneak then
if (pointed_thing.type == "node") and not player:get_player_control().sneak then
local node = minetest.get_node(pointed_thing.under)
local on_shears_place = minetest.registered_items[node.name]._on_shears_place
if on_shears_place then
return on_shears_place(itemstack, player, pointed_thing)
end
if node.name == "mcl_farming:pumpkin" and (pointed_thing.above.y ~= pointed_thing.under.y) then
minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = pointed_thing.above}, true)
local dir = vector.subtract(pointed_thing.under, pointed_thing.above)
local param2 = minetest.dir_to_facedir(dir)
minetest.set_node(pointed_thing.under, {name="mcl_farming:pumpkin_face", param2 = param2})
minetest.add_item(pointed_thing.above, "mcl_farming:pumpkin_seeds 4")
end
end
if pointed_thing.type == "node" then
local node = minetest.get_node(pointed_thing.under)
if minetest.get_item_group(node.name, "shearsy") > 0
or minetest.get_item_group(node.name, "shearsy_cobweb") > 0
or minetest.get_item_group(node.name, "leaves") > 0 then
elseif minetest.get_item_group(node.name, "shearsy") > 0
or minetest.get_item_group(node.name, "shearsy_cobweb") then
exchangeclone.shear_action(itemstack, player, pointed_thing.under)
end
end
@ -80,12 +77,15 @@ minetest.register_tool("exchangeclone:dark_matter_shears", {
sound = { breaks = "default_tool_breaks" },
_mcl_toollike_wield = true,
_mcl_diggroups = {
shearsy = { speed = 14, level = 2, uses = 0 },
shearsy_wool = { speed = 14, level = 2, uses = 0 },
shearsy_cobweb = { speed = 14, level = 2, uses = 0 }
shearsy = { speed = 14, level = 5, uses = 0 },
shearsy_wool = { speed = 14, level = 5, uses = 0 },
shearsy_cobweb = { speed = 14, level = 5, uses = 0 }
},
})
exchangeclone.set_charge_type("exchangeclone:dark_matter_shears", "dark_matter")
minetest.register_tool("exchangeclone:red_matter_shears", {
description = "Red Matter Shears",
wield_image = "exchangeclone_red_matter_shears.png",
@ -102,12 +102,14 @@ minetest.register_tool("exchangeclone:red_matter_shears", {
sound = { breaks = "default_tool_breaks" },
_mcl_toollike_wield = true,
_mcl_diggroups = {
shearsy = { speed = 16, level = 3, uses = 0 },
shearsy_wool = { speed = 16, level = 3, uses = 0 },
shearsy_cobweb = { speed = 16, level = 3, uses = 0 }
shearsy = { speed = 16, level = 6, uses = 0 },
shearsy_wool = { speed = 16, level = 6, uses = 0 },
shearsy_cobweb = { speed = 16, level = 6, uses = 0 }
},
})
exchangeclone.set_charge_type("exchangeclone:red_matter_shears", "red_matter")
local special_shears = {
["exchangeclone:dark_matter_shears"] = true,
["exchangeclone:red_matter_shears"] = true,

View File

@ -19,17 +19,13 @@ function exchangeclone.shovel_action(itemstack, player, center)
(not player:get_player_control().sneak or charge == 1) then
action = "unpath"
elseif start_node.name == exchangeclone.itemstrings.gravel or start_node.name == exchangeclone.itemstrings.clay then
if player:get_player_control().sneak and charge > 1 then
if charge > 1 then
action = "crumbly"
else
return
end
else
if player:get_player_control().sneak and charge > 1 then
action = "crumbly_flat"
else
return
end
elseif charge > 1 then
action = "crumbly_flat"
end
end
@ -69,10 +65,10 @@ function exchangeclone.shovel_action(itemstack, player, center)
if exchangeclone.mcla then
local on_shovel_place = minetest.registered_items[node.name]._on_shovel_place
if on_shovel_place then
on_shovel_place(itemstack, player, pos)
on_shovel_place(itemstack, player, {type="node",under=pos,above=vector.offset(pos,0,1,0)})
end
else -- in MCL2, it only searches for pathable nodes
if minetest.get_node(vector.offset(center,0,1,0)).name == "air" then
if minetest.get_node(vector.offset(pos,0,1,0)).name == "air" then
minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = pos}, true)
minetest.swap_node(pos, {name="mcl_core:grass_path"})
end

Binary file not shown.

Binary file not shown.

View File

@ -1,3 +1,6 @@
exchangeclone.group_values = {}
exchangeclone.base_energy_values = {}
if exchangeclone.mcl then
--[[ Groups are organized so that order matters. Groups that are lower on the
list will have their energies applied later, making them higher priority. It's
@ -206,8 +209,7 @@ if exchangeclone.mcl then
exchangeclone.base_energy_values[itemstring] = exchangeclone.base_energy_values[itemstring] or energy_value
end
-- TODO: Check after every update
exchangeclone.mcl_potion_data = exchangeclone.mcl_potion_data or {}
table.insert_all(exchangeclone.mcl_potion_data, { -- automatically assumes base is awkward potion if not specified
exchangeclone.mcl_potion_data = { -- automatically assumes base is awkward potion if not specified
{name = "water", bases = {"mcl_potions:glass_bottle"}, no_arrow = true},
{name = "awkward", bases = {"mcl_potions:water"}, ingredient = "mcl_nether:nether_wart_item", no_arrow = true},
{name = "mundane", ingredient_cost = 32, no_arrow = true, custom_base_cost = 0},
@ -224,7 +226,7 @@ if exchangeclone.mcl then
{name = "water_breathing", ingredient = "mcl_fishing:pufferfish_raw", plus = true},
{name = "invisibility", bases = {"mcl_potions:night_vision"}, ingredient = "mcl_potions:fermented_spider_eye", custom_base_cost = 623, plus = true},
{name = "withering", ingredient = "mcl_flowers:wither_rose", plus = true, two = true}
})
}
else
-- MTG stuff
table.insert_all(exchangeclone.group_values, {
@ -308,3 +310,213 @@ table.insert_all(exchangeclone.group_values, {
{"useless", 0},
{"exchangeclone_dirt", 1},
})
-- Moved here so other mods could modify it without dependency issues
exchangeclone.node_transmutations = {
{ --use (mode 1)
-- Basic nodes
["mcl_core:stone"] = "mcl_core:cobble",
["mcl_core:cobble"] = "mcl_core:stone",
["mcl_core:dirt_with_grass"] = "mcl_core:sand",
["mcl_core:dirt"] = "mcl_core:sand",
["mcl_core:sand"] = "mcl_core:dirt_with_grass",
["mcl_core:podzol"] = "mcl_core:redsand",
["mcl_core:redsand"] = "mcl_core:podzol",
["mcl_core:redsandstone"] = "mcl_core:gravel",
["mcl_core:glass"] = "mcl_core:sand",
["mcl_blackstone:blackstone"] = "mcl_blackstone:basalt",
["mcl_blackstone:basalt"] = "mcl_blackstone:blackstone",
["mcl_flowers:double_grass"] = "mcl_flowers:fern",
["mcl_deepslate:deepslate"] = "mcl_deepslate:deepslate_cobbled",
["mcl_deepslate:deepslate_cobbled"] = "mcl_deepslate:deepslate",
["mcl_end:end_stone"] = "mcl_nether:netherrack",
["mcl_nether:soul_sand"] = "mcl_blackstone:soul_soil",
["mcl_blackstone:soul_soil"] = "mcl_nether:soul_sand",
-- "Frozen" liquids
["mcl_core:obsidian"] = "mcl_core:lava_source",
["mcl_core:ice"] = "mcl_core:water_source",
-- Plants
["mcl_flowers:tallgrass"] = "mcl_flowers:fern",
["mcl_flowers:fern"] = "mcl_flowers:tallgrass",
["mcl_farming:pumpkin"] = "mcl_farming:melon",
["mcl_farming:melon"] = "mcl_farming:pumpkin",
["mcl_flowers:dandelion"] = "mcl_flowers:poppy",
["mcl_flowers:poppy"] = "mcl_flowers:dandelion",
["mcl_mushrooms:mushroom_brown"] = "mcl_mushrooms:mushroom_red", --technically not plants
["mcl_mushrooms:mushroom_red"] = "mcl_mushrooms:mushroom_brown",
-- Warped/crimson
["mcl_crimson:warped_fungus"] = "mcl_crimson:crimson_fungus",
["mcl_crimson:warped_hyphae"] = "mcl_crimson:crimson_hyphae",
["mcl_crimson:warped_nylium"] = "mcl_crimson:crimson_nylium",
["mcl_crimson:warped_roots"] = "mcl_crimson:crimson_roots",
["mcl_crimson:warped_wart_block"] = "mcl_nether:nether_wart_block",
["mcl_crimson:crimson_fungus"] = "mcl_crimson:warped_fungus",
["mcl_crimson:crimson_hyphae"] = "mcl_crimson:warped_hyphae",
["mcl_crimson:crimson_nylium"] = "mcl_crimson:warped_nylium",
["mcl_crimson:crimson_roots"] = "mcl_crimson:warped_roots",
["mcl_nether:nether_wart_block"] = "mcl_crimson:warped_wart_block",
-- Ores
["mcl_core:stone_with_coal"] = "mcl_deepslate:deepslate_with_coal",
["mcl_core:stone_with_iron"] = "mcl_deepslate:deepslate_with_iron",
["mcl_core:stone_with_lapis"] = "mcl_deepslate:deepslate_with_lapis",
["mcl_core:stone_with_gold"] = "mcl_deepslate:deepslate_with_gold",
["mcl_core:stone_with_emerald"] = "mcl_deepslate:deepslate_with_emerald",
["mcl_core:stone_with_redstone"] = "mcl_deepslate:deepslate_with_redstone",
["mcl_core:stone_with_redstone_lit"] = "mcl_deepslate:deepslate_with_redstone_lit",
["mcl_core:stone_with_diamond"] = "mcl_deepslate:deepslate_with_diamond",
["mcl_copper:stone_with_copper"] = "mcl_deepslate:deepslate_with_copper",
["mcl_deepslate:deepslate_with_coal"] = "mcl_core:stone_with_coal",
["mcl_deepslate:deepslate_with_iron"] = "mcl_core:stone_with_iron",
["mcl_deepslate:deepslate_with_lapis"] = "mcl_core:stone_with_lapis",
["mcl_deepslate:deepslate_with_gold"] = "mcl_core:stone_with_gold",
["mcl_deepslate:deepslate_with_emerald"] = "mcl_core:stone_with_emerald",
["mcl_deepslate:deepslate_with_redstone"] = "mcl_core:stone_with_redstone",
["mcl_deepslate:deepslate_with_diamond"] = "mcl_core:stone_with_diamond",
["mcl_deepslate:deepslate_with_copper"] = "mcl_copper:stone_with_copper",
-- Basic nodes
["default:stone"] = "default:cobble",
["default:desert_stone"] = "default:desert_cobble",
["default:cobble"] = "default:stone",
["default:desert_cobble"] = "default:desert_stone",
["default:dirt_with_grass"] = "default:sand",
["default:dirt_with_snow"] = "default:sand",
["default:dirt_with_dry_grass"] = "default:sand",
["default:dry_dirt_with_dry_grass"] = "default:desert_sand",
["default:dirt"] = "default:sand",
["default:dry_dirt"] = "default:desert_sand",
["default:dirt_with_coniferous_litter"] = "default:sand",
["default:dirt_with_rainforest_litter"] = "default:sand",
["default:sand"] = "default:dirt_with_grass",
["default:desert_sand"] = "default:dry_dirt_with_dry_grass",
["default:silver_sand"] = "default:dirt_with_grass",
["default:sandstone"] = "default:gravel",
["default:desert_sandstone"] = "default:gravel",
["default:silver_sandstone"] = "default:gravel",
["default:gravel"] = "default:sandstone",
["default:glass"] = "default:sand",
-- "Frozen" liquids
["default:ice"] = "default:water_source",
["default:obsidian"] = "default:lava_source",
-- Plants
["default:grass_1"] = "default:dry_shrub",
["default:grass_2"] = "default:dry_shrub",
["default:grass_3"] = "default:dry_shrub",
["default:grass_4"] = "default:dry_shrub",
["default:grass_5"] = "default:dry_shrub",
["flowers:mushroom_brown"] = "flowers:mushroom_red",
["flowers:mushroom_red"] = "flowers:mushroom_brown",
["flowers:dandelion_yellow"] = "flowers:rose",
["flowers:rose"] = "flowers:dandelion_yellow",
},
{ --sneak+use (mode 2)
["mcl_core:stone"] = "mcl_core:dirt_with_grass",
["mcl_core:cobble"] = "mcl_core:dirt_with_grass",
["mcl_deepslate:deepslate"] = "mcl_core:podzol",
["mcl_deepslate:deepslate_cobbled"] = "mcl_core:podzol",
["mcl_core:sand"] = "mcl_core:cobble",
["mcl_core:redsand"] = "mcl_core:cobble",
["mcl_core:dirt_with_grass"] = "mcl_core:cobble",
["mcl_core:dirt"] = "mcl_core:cobble",
["mcl_core:podzol"] = "mcl_deepslate:deepslate_cobbled",
["mcl_nether:netherrack"] = "mcl_end:end_stone",
["default:stone"] = "default:dirt_with_grass",
["default:cobble"] = "default:dirt_with_grass",
["default:desert_stone"] = "default:dry_dirt_with_dry_grass",
["default:desert_cobble"] = "default:dry_dirt_with_dry_grass",
["default:dry_dirt_with_dry_grass"] = "default:desert_cobble",
["default:dirt_with_dry_grass"] = "default:cobble",
["default:dirt_with_grass"] = "default:cobble",
["default:dirt_with_snow"] = "default:cobble",
["default:dirt"] = "default:cobble",
["default:dry_dirt"] = "default:desert_cobble",
["default:dirt_with_coniferous_litter"] = "default:cobble",
["default:dirt_with_rainforest_litter"] = "default:cobble",
["default:sand"] = "default:cobble",
["default:desert_sand"] = "default:desert_cobble",
["default:silver_sand"] = "default:cobble",
}
}
if exchangeclone.mcl2 then
exchangeclone.add_transmutation_loop({
"mcl_core:acacialeaves",
"mcl_core:birchleaves",
"mcl_core:darkleaves",
"mcl_core:jungleleaves",
"mcl_mangrove:mangroveleaves",
"mcl_core:leaves",
"mcl_core:spruceleaves",
})
exchangeclone.add_transmutation_loop({
"mcl_core:acaciatree",
"mcl_core:birchtree",
"mcl_core:darktree",
"mcl_core:jungletree",
"mcl_mangrove:mangrovetree",
"mcl_core:tree",
"mcl_core:sprucetree",
})
elseif exchangeclone.mcla then
exchangeclone.add_transmutation_loop({
"mcl_lush_caves:azalea_leaves",
"mcl_lush_caves:azalea_leaves_flowering",
"mcl_trees:leaves_acacia",
"mcl_trees:leaves_birch",
"mcl_trees:leaves_dark_oak",
"mcl_trees:leaves_jungle",
"mcl_trees:leaves_mangrove",
"mcl_trees:leaves_oak",
"mcl_trees:leaves_spruce",
})
exchangeclone.add_transmutation_loop({
"mcl_trees:tree_acacia",
"mcl_trees:tree_birch",
"mcl_trees:tree_dark_oak",
"mcl_trees:tree_jungle",
"mcl_trees:tree_mangrove",
"mcl_trees:tree_oak",
"mcl_trees:tree_spruce",
})
else
exchangeclone.add_transmutation_loop({
"default:acacia_leaves",
"default:leaves",
"default:aspen_leaves",
"default:jungleleaves",
"default:pine_needles"
})
exchangeclone.add_transmutation_loop({
"default:acacia_tree",
"default:tree",
"default:aspen_tree",
"default:jungle_tree",
"default:pine_tree",
})
exchangeclone.add_transmutation_loop({
"default:acacia_bush_leaves",
"default:bush_leaves",
"default:pine_bush_needles"
})
exchangeclone.add_transmutation_loop({
"default:acacia_bush_stem",
"default:bush_stem",
"default:pine_bush_stem"
})
end
if exchangeclone.mcl then
exchangeclone.add_transmutation_loop({
"mcl_core:andesite",
"mcl_core:diorite",
"mcl_core:granite",
"mcl_deepslate:tuff"
})
end

View File

@ -1,7 +1,7 @@
-- The z's at the beginning of this mod's name (zzzz_exchangeclone_init) are to ensure that it
-- loads first, since Minetest loads mods in reverse alphabetical order.
exchangeclone = {recipes = {}, base_energy_values = {}, group_values = {}}
exchangeclone = {recipes = {}}
if (not minetest.get_modpath("mcl_core")) and (not minetest.get_modpath("default")) then
error("ExchangeClone requires Minetest Game, MineClone2, or MineClonia (and possibly variant subgames).\nPlease use one of those games.")

View File

@ -142,6 +142,9 @@ function exchangeclone.set_orb_itemstack_energy(itemstack, amount)
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))
itemstack:set_wear(wear)
return itemstack
end
@ -324,13 +327,18 @@ function exchangeclone.charge_update(itemstack, player)
local charge_type = exchangeclone.charge_types[itemstack:get_name()]
local max_charge = exchangeclone.tool_levels.count[charge_type]
if not max_charge then return itemstack end
local charge = itemstack:get_meta():get_int("exchangeclone_tool_charge") or 1
local charge = math.max(itemstack:get_meta():get_int("exchangeclone_tool_charge"), 1)
if player:get_player_control().sneak then
charge = math.max(1, charge - 1)
else
charge = math.min(max_charge, charge + 1)
if charge > 1 then
charge = charge - 1
local new_pitch = 1+(charge-3)/8 + (math.random(-10, 10) / 200)
minetest.sound_play("exchangeclone_charge_down", {pitch = new_pitch, pos = player:get_pos(), max_hear_distance = 20, })
end
elseif charge < max_charge then
charge = charge + 1
local new_pitch = 1+(charge-3)/8 + (math.random(-10, 10) / 200)
minetest.sound_play("exchangeclone_charge_up", {pitch = new_pitch, pos = player:get_pos(), max_hear_distance = 20, })
end
minetest.log(charge)
itemstack:get_meta():set_int("exchangeclone_tool_charge", charge)
itemstack:set_wear(math.max(1, math.min(65535, 65535-(65535/(max_charge-1))*(charge-1))))
itemstack = exchangeclone.update_tool_capabilities(itemstack)
@ -351,6 +359,8 @@ exchangeclone.itemstrings = {
gravel = exchangeclone.mcl and "mcl_core:gravel" or "default:gravel",
dirt = exchangeclone.mcl and "mcl_core:dirt" or "default:dirt",
clay = exchangeclone.mcl and "mcl_core:clay" or "default:clay",
sand = exchangeclone.mcl and "mcl_core:sand" or "default:sand",
torch = exchangeclone.mcl and "mcl_torches:torch" or "default:torch"
}
exchangeclone.energy_aliases = {}
@ -915,9 +925,9 @@ function exchangeclone.can_dig(pos)
return true
end
exchangeclone.stone_group = exchangeclone.mcl and "pickaxey" or "cracky"
exchangeclone.pickaxe_group = exchangeclone.mcl and "pickaxey" or "cracky"
exchangeclone.dirt_group = exchangeclone.mcl and "shovely" or "crumbly"
exchangeclone.shovel_group = exchangeclone.mcl and "shovely" or "crumbly"
exchangeclone.multidig_data = {tools = {}, players = {}}
@ -1105,10 +1115,11 @@ end
function exchangeclone.update_tool_capabilities(itemstack)
itemstack = ItemStack(itemstack) -- don't affect original
local meta = itemstack:get_meta()
local charge_type = exchangeclone.charge_types[itemstack:get_name()]
local charge_level = meta:get_int("exchangeclone_tool_charge")
local efficiency = exchangeclone.tool_levels.efficiency[charge_type][charge_level+1]
if not exchangeclone.tool_levels.efficiency[charge_type] then return itemstack end
local meta = itemstack:get_meta()
local charge_level = math.max(1, meta:get_int("exchangeclone_tool_charge"))
local efficiency = exchangeclone.tool_levels.efficiency[charge_type][charge_level]
local tool_capabilities = table.copy(minetest.registered_items[itemstack:get_name()].tool_capabilities)
tool_capabilities.groupcaps = exchangeclone.get_groupcaps(itemstack, efficiency)
meta:set_tool_capabilities(tool_capabilities)
@ -1152,4 +1163,18 @@ function exchangeclone.process_range(player, range, charge)
[depth] = player_rotation[depth]*range_amounts[3]
}
end
end
function exchangeclone.add_transmutation_loop(itemstrings)
for i, itemstring in ipairs(itemstrings) do
exchangeclone.node_transmutations[1][itemstring] = itemstrings[i+1] or itemstrings[1]
exchangeclone.node_transmutations[2][itemstring] = itemstrings[i-1] or itemstrings[#itemstrings]
end
end
function exchangeclone.place_torch(player, pointed_thing)
local torch_on_place = minetest.registered_items[exchangeclone.itemstrings.torch].on_place
if torch_on_place then
torch_on_place(ItemStack(exchangeclone.itemstrings.torch), player, pointed_thing)
end
end