Tons of changes, still not release-ready

This commit is contained in:
ThePython 2023-06-10 13:55:47 -07:00
parent 8220af3a8b
commit 74f7c9465c
13 changed files with 994 additions and 133 deletions

View File

@ -32,12 +32,16 @@ All energy values are in `energy.lua`. You can also change the speed at which th
* Left-click and sneak-left-click to transmute blocks in range (two different modes with minor differences)
* Aux1-left-click to open enchanting table (MineClone only)
* Aux1-right-click to open crafting table (MineClone only)
* Ability to exchange charcoal/coal/iron/copper/tin/gold/mese/diamond by crafting (the Philosopher's Stone is always returned)
* Ability to exchange charcoal/coal/iron/copper/tin/gold/mese/emerald/diamond by crafting (the Philosopher's Stone is always returned)
* Alchemical Coal, Mobius Fuel, and Aeternalis Fuel
* Dark Matter Orbs, Blocks, and tools
* Red Matter Orbs and Blocks
I don't actually own MineCraft, meaning I don't know how the original mod (Equivalent Exchange) works. I will probably make some minor mistakes, since all I have to go on is the internet.
## Known issues:
* When items are inserted into machines with MineClone hoppers, it does not trigger the machines to start.
* When items are inserted into the Energy Collector, Deconstructor, or Constructor with MineClone hoppers, it does not trigger the machines to start.
* When machines are exploded, they (and the items inside) do not drop.
* Dark Matter Shears will sometimes be treated as
If you have a suggestion or notice a bug, visit the [GitHub issues page](https://github.com/thepython10110/exchangeclone/issues).

View File

@ -1,39 +1,56 @@
1.0.0
Initial release
New features:
MineClone support, including (sort of) hoppers
Added the ability to add items by group
Shift-clicking (listrings)!
Changes:
Completely redone recipes, now includes all items.
Tools' energy value now depends on wear.
Bugfixes:
Items can no longer be put in the Constructor's output slot.
2.0
Added a changelog
Changed version numbers from x.x.x to x.x.
Added all items from Why
Added Philosopher's Stone
Left click to increase range (minimum = 0, maximum = 4).
Shift+left click to decrease range.
Aux1+left click to open enchanting table (MineClone only).
Right click to transmute blocks in range.
Shift+right click transmute blocks in range (mode 2, some differences).
Aux1+right click to open crafting table (MineClone only).
Crafted with a diamond in the middle, glowstone dust in the corners, and redstone dust on the sides (MineClone)
Crafted with a diamond in the middle, tin ingots in the corners, and obsidian on the sides (Minetest Game)
Can use to craft coal into iron, mese into diamonds, etc.
Why's Ghost blocks are now worth 0 instead of 1 (to prevent infinite energy)
Fixed stairs and slabs not working in Minetest Game
Changed the recipe for the Exchange Orb
New recipe is a Philosopher's Stone in the middle, diamonds in the corners, and iron/steel ingots on the sides.
Changed the energy values of tin, copper, and bronze in Minetest Game.
Renamed images to reflect mod name change ("exchangeclone" instead of "ee" for Element Exchange)
Deleted unnecessary "config.lua"
2.1
The Energy Collector setting is now energy/second instead of second/energy to fit much higher costs than Element Exchange (default is 5 energy/s).
Fixed Exchange Orb energy value (forgot to change it after changing the recipe)
PS's enchanting table now is limited to 10-bookshelf enchantments to make it more balanced.
Added Alchemical Coal, Mobius Fuel, Aeternalis Fuel, Dark Matter, and Red Matter
Added Dark Matter sword, pickaxe, axe, shovel, hoe, and shears
Changed constructor, deconstructor, and collector recipes and energy values to make them cheaper
The Constructor, Deconstructor, and Energy Collector are now not unbreakable in MineClone (I really should test in survival).
The Energy Collector now drops its contents when broken in MineClone.
Copper blocks are now worth 4 times as much as copper ingots instead of 9 (MineClone).
Fixed terracotta values (MineClone)
Set gravel value to 1 to match sand/stone/dirt/etc (MineClone).
Tuff, blackstone, and basalt are now transmutable (MineClone).
A couple of minor transmutation changes (MineClone).
Changed emerald value to 4096 (MineClone).
Gold cannot be crafted into diamonds using the PS; it can now be crafted into emeralds and emeralds into diamonds (MineClone).
New features:
Added a changelog (you're reading it now)
Added all items from Why (a MineClone modpack I made)
Added Philosopher's Stone
Left click to increase range (minimum = 0, maximum = 4).
Shift+left click to decrease range.
Aux1+left click to open enchanting table (MineClone only).
Right click to transmute blocks in range.
Shift+right click transmute blocks in range (mode 2, some differences).
Aux1+right click to open crafting table (MineClone only).
Crafted with a diamond in the middle, glowstone dust in the corners, and redstone dust on the sides (MineClone)
Crafted with a diamond in the middle, tin ingots in the corners, and obsidian on the sides (Minetest Game)
Can use to craft coal into iron, mese into diamonds, etc.
Changes:
Changed version numbers from x.x.x to x.x.
Changed the recipe for the Exchange Orb
New recipe is a Philosopher's Stone in the middle, diamonds in the corners, and iron/steel ingots on the sides.
Changed the energy values of tin, copper, and bronze in Minetest Game.
Renamed images to reflect mod name change ("exchangeclone" instead of "ee" for Element Exchange)
Deleted unnecessary "config.lua"
Bugfixes:
Ghost Blocks (from Why) are now worth 0 instead of 1 (to prevent infinite energy)
Fixed stairs and slabs not working in Minetest Game
3.0
New features:
Added Alchemical Coal, Mobius Fuel, Aeternalis Fuel, Dark Matter, and Red Matter
Added Dark and Red Matter tools
Changes:
The Energy Collector setting is now energy/second instead of second/energy to fit much higher costs than Element Exchange (default is 5 energy/s).
Set gravel value to 1 to match sand/stone/dirt/etc (MineClone).
Tuff, blackstone, and basalt are now transmutable (MineClone).
A couple of minor transmutation changes (MineClone).
Changed emerald value to 4096 (MineClone).
Gold cannot be crafted into diamonds using the PS; it can now be crafted into emeralds and emeralds into diamonds (MineClone).
The PS's enchanting table now is limited to 8-bookshelf enchantments to make it more balanced.
Bugfixes:
Copper blocks are now worth 4 times as much as copper ingots instead of 9 (MineClone).
Fixed terracotta values (MineClone)
The Energy Collector now drops its contents when broken in MineClone.
Fixed Exchange Orb energy value (forgot to change it after changing the recipe)
Changed constructor, deconstructor, and collector recipes and energy values to make them cheaper.
The Constructor, Deconstructor, and Energy Collector are now not unbreakable in MineClone (I really should test in survival).

View File

@ -58,7 +58,6 @@ local function on_timer(pos, elapsed)
local update = true
while elapsed > 0 and update do
update = false
local fuel_stack = inv:get_stack("fuel", 1)
local src_stack = inv:get_stack("src", 1)
local dst_stack = inv:get_stack("dst", 1)
@ -70,7 +69,7 @@ local function on_timer(pos, elapsed)
end
end
-- make sure orb has enough charge
local orb_charge = fuel_stack:get_meta():get_float("stored_charge") or 0
local orb_charge = exchangeclone.get_orb_energy(inv, "fuel", 1)
local energy_cost = exchangeclone.get_item_energy(src_stack:get_name())
if energy_cost > 0 then
orb_charge = orb_charge - energy_cost
@ -78,9 +77,7 @@ local function on_timer(pos, elapsed)
break
end
-- give orb new charge value
fuel_stack:get_meta():set_float("stored_charge", orb_charge)
fuel_stack:get_meta():set_string("description", "Exchange Orb\nCurrent Charge: "..tostring(orb_charge))
inv:set_stack("fuel", 1, fuel_stack)
exchangeclone.set_orb_energy(inv, "fuel", 1, orb_charge)
-- "convert" charge into a node at dst
if dst_stack:is_empty() then
-- create a new stack

View File

@ -2,7 +2,7 @@ local sound_mod = mcl_sounds or default
--Renamed "fuel" inventory to "main" to (almost) work with hoppers
function get_element_deconstructor_formspec()
local function get_element_deconstructor_formspec()
if not exchangeclone.mineclone then
local formspec = {
"size[8,9]",
@ -67,17 +67,14 @@ local function on_timer(pos, elapsed)
energy_value = math.floor(energy_value * (65536 / wear))
end
-- only get 1 orb as we can only use one
local dest_orb = inv:get_stack("dst", 1)
local stored = dest_orb:get_meta():get_float("stored_charge") or 0
local stored = exchangeclone.get_orb_energy(inv, "dst", 1)
if stored + energy_value < stored then
return --will hopefully prevent overflow, not that overflow is likely
end
fuel_stack:set_count(fuel_stack:get_count() - 1)
inv:set_stack("main", 1, fuel_stack)
stored = stored + energy_value
dest_orb:get_meta():set_float("stored_charge", stored)
dest_orb:get_meta():set_string("description", "Exchange Orb\nCurrent Charge: "..tostring(stored))
inv:set_stack("dst", 1, dest_orb)
exchangeclone.set_orb_energy(inv, "dst", 1, stored)
end
update = true
end

View File

@ -1,8 +1,9 @@
local sound_mod = mcl_sounds or default
local function get_energy_collector_formspec()
local formspec
if not exchangeclone.mineclone then
local formspec = {
formspec = {
"size[8,9]",
"label[3,2;Orb]",
"list[context;main;4,2;1,1;]",
@ -10,9 +11,8 @@ local function get_energy_collector_formspec()
"listring[current_player;main]",
"listring[context;main]"
}
return table.concat(formspec, "")
else
local formspec = {
formspec = {
"size[9,10]",
"label[3,2;Orb]",
"list[context;main;4,2;1,1;]",
@ -24,8 +24,8 @@ local function get_energy_collector_formspec()
"listring[current_player;main]",
"listring[context;main]"
}
return table.concat(formspec, "")
end
return table.concat(formspec, "")
end
local function can_dig(pos, player)
@ -50,11 +50,9 @@ local function on_timer(pos, elapsed)
if minetest.get_natural_light(pos) == 15 then
local dest_orb = inv:get_stack("main", 1)
local stored = dest_orb:get_meta():get_float("stored_charge") or 0
local stored = exchangeclone.get_orb_energy(inv, "main", 1)
stored = stored + exchangeclone.collector_speed
dest_orb:get_meta():set_float("stored_charge", stored)
dest_orb:get_meta():set_string("description", "Exchange Orb\nCurrent Charge: "..tostring(stored))
inv:set_stack("main", 1, dest_orb)
exchangeclone.set_orb_energy(inv, "main", 1, stored)
end
return true
end
@ -70,7 +68,6 @@ end
local function allow_metadata_inventory_put(pos, listname, index, stack, player)
if minetest.is_protected(pos, player:get_player_name()) then
minetest.log("blocked put")
return 0
end
local meta = minetest.get_meta(pos)
@ -107,7 +104,6 @@ local function on_blast(pos)
return drops
end
local function on_dig_node(pos, oldnode, oldmetadata, digger)
if exchangeclone.mineclone then
local meta = minetest.get_meta(pos)

View File

@ -30,6 +30,11 @@ dofile(default_path.."/deconstructor.lua")
dofile(default_path.."/energy_collector.lua")
dofile(default_path.."/orb.lua")
dofile(default_path.."/craftitems.lua")
dofile(default_path.."/dark_and_red_tools.lua")
dofile(default_path.."/tools.lua")
if exchangeclone.mineclone then
dofile(default_path.."/shears.lua")
end
dofile(default_path.."/swords.lua")
dofile(default_path.."/philosophers_stone.lua")
dofile(default_path.."/pesa.lua")
dofile(default_path.."/energy.lua")

View File

@ -2,5 +2,5 @@ name = exchangeclone
title = ExchangeClone
description = Exchange nodes into other nodes
min_minetest_version = 5.5
optional_depends = mcl_core, default, moreswords, mcl_stairs, pipeworks, meat_blocks, ghost_blocks, sticky_things, fake_liquids, sound_machine, stairs
optional_depends = mcl_core, default, moreswords, mcl_stairs, pipeworks, meat_blocks, ghost_blocks, sticky_things, fake_liquids, sound_machine, stairs, mcl_dispensers
author = ThePython10110

24
orb.lua
View File

@ -1,13 +1,33 @@
function exchangeclone.read_orb_charge(itemstack, user, pointed_thing)
local stored = itemstack:get_meta():get_int("stored_charge") or 0
local stored = itemstack:get_meta():get_float("stored_charge") or 0
minetest.chat_send_player(user:get_player_name(), "Current Charge: "..stored)
return itemstack
end
function exchangeclone.get_orb_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)
if not itemstack then return end
return itemstack:get_meta():get_float("stored_energy")
end
function exchangeclone.set_orb_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)
if not itemstack then return end
itemstack:get_meta():set_float("stored_energy", amount)
itemstack:get_meta():set_string("description", "Exchange Orb\nCurrent Charge: "..amount)
inventory:set_stack(listname, index, itemstack)
end
minetest.register_tool("exchangeclone:exchange_orb", {
description = "Exchange Orb\nCurrent Charge: 0",
inventory_image = "exchangeclone_exchange_orb.png",
energy_value = 33792,
--energy_value = 33792,
on_use = exchangeclone.read_orb_charge,
})

78
pesa.lua Normal file
View File

@ -0,0 +1,78 @@
--Personal Energy Storage Accessor (PESA)
local formspec
if not exchangeclone.mineclone then
formspec = {
"size[8,9]",
"label[0.5,0.5;Personal Energy Storage Accessor (PESA)]",
"list[current_player;exchangeclone_pesa;4,2;1,1;]",
"list[current_player;main;0,5;8,4;]",
"listring[current_player;main]",
"listring[current_player;exchangeclone_pesa]"
}
else
formspec = {
"size[9,10]",
"label[0.5,0.5;Personal Energy Storage Accessor (PESA)]",
"list[current_player;exchangeclone_pesa;4,2;1,1;]",
mcl_formspec.get_itemslot_bg(4,2,1,1),
"list[current_player;main;0,5;9,3;9]",
mcl_formspec.get_itemslot_bg(0,5,9,3),
"list[current_player;main;0,8.5;9,1;]",
mcl_formspec.get_itemslot_bg(0,8.5,9,1),
"listring[current_player;main]",
"listring[current_player;exchangeclone_pesa]"
}
end
formspec = table.concat(formspec, "")
local function on_rightclick(itemstack, user, pointed_thing)
if pointed_thing.type == "node" then
-- Use pointed node's on_rightclick function first, if present
local node = minetest.get_node(pointed_thing.under)
if user and not user:get_player_control().sneak then
if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack
end
end
end
minetest.show_formspec(user:get_player_name(), "exchangeclone_pesa", formspec)
end
minetest.register_tool("exchangeclone:pesa", {
description = "Personal Energy Storage Accessor (PESA)",
on_secondary_use = on_rightclick,
on_place = on_rightclick,
})
minetest.register_on_joinplayer(function(player)
player:get_inventory():set_size("exchangeclone_pesa", 1)
end)
minetest.register_allow_player_inventory_action(function(player, action, inv, info)
if inv:get_location().type == "player" and (
action == "move" and (info.from_list == "exchangeclone_pesa" or info.to_list == "exchangeclone_pesa")
or action == "put" and info.listname == "exchangeclone_pesa"
or action == "take" and info.listname == "exchangeclone_pesa"
) then
if player:get_wielded_item():get_name() == "exchangeclone:pesa" then
local stack = player:get_inventory():get_stack(info.from_list, info.from_index)
if action == "take" then
return stack:get_count()
end
if stack:get_name() == "exchangeclone:exchange_orb" then
return stack:get_count()
else
return 0
end
end
end
end)
function exchangeclone.get_player_energy(player)
return exchangeclone.get_orb_energy(player:get_inventory(), "exchangeclone_pesa", 1)
end
function exchangeclone.set_player_energy(player, amount)
exchangeclone.set_orb_energy(player:get_inventory(), "exchangeclone_pesa", 1, amount)
end

View File

@ -1,6 +1,6 @@
local function show_enchanting(player)
local player_meta = player:get_meta()
player_meta:set_int("mcl_enchanting:num_bookshelves", 10)
player_meta:set_int("mcl_enchanting:num_bookshelves", 8)
player_meta:set_string("mcl_enchanting:table_name", "Enchanting Table")
mcl_enchanting.show_enchanting_formspec(player)
end
@ -244,10 +244,10 @@ end
local function on_left_click(itemstack, player, pointed_thing)
if player:get_player_control().sneak then
local range = tonumber(itemstack:get_meta():get_int("exchangeclone_stone_range"))
local range = tonumber(itemstack:get_meta():get_int("exchangeclone_item_range"))
if range == 0 then range = 5 end
range = range - 1
itemstack:get_meta():set_int("exchangeclone_stone_range", range or 0)
itemstack:get_meta():set_int("exchangeclone_item_range", range or 0)
minetest.chat_send_player(player:get_player_name(), "Current Range: "..range)
return itemstack
elseif not player:get_player_control().aux1 then
@ -255,10 +255,10 @@ local function on_left_click(itemstack, player, pointed_thing)
if new_stack then
return new_stack
end
local range = itemstack:get_meta():get_int("exchangeclone_stone_range")
local range = itemstack:get_meta():get_int("exchangeclone_item_range")
if range == 4 then range = -1 end
range = range + 1
itemstack:get_meta():set_int("exchangeclone_stone_range", range or 0)
itemstack:get_meta():set_int("exchangeclone_item_range", range or 0)
minetest.chat_send_player(player:get_player_name(), "Current Range: "..range)
return itemstack
elseif exchangeclone.mineclone then
@ -268,21 +268,55 @@ end
local function on_right_click(itemstack, player, pointed_thing)
if player:get_player_control().sneak then
local range = tonumber(itemstack:get_meta():get_int("exchangeclone_stone_range"))
local range = tonumber(itemstack:get_meta():get_int("exchangeclone_item_range"))
exchangeclone.transmute_nodes(player, range, 2)
elseif not player:get_player_control().aux1 then
local range = itemstack:get_meta():get_int("exchangeclone_stone_range")
local range = itemstack:get_meta():get_int("exchangeclone_item_range")
exchangeclone.transmute_nodes(player, range, 1)
elseif exchangeclone.mineclone then
mcl_crafting_table.show_crafting_form(player)
end
end
local tt_help = "(Shift-)click: change range, (shift-)right-click: transmute blocks."
local item1 = "mese crystals"
if exchangeclone.mineclone then
item1 = "emeralds"
end
local longdesc = "A mysterious device discovered by alchemists millenia ago. The crafting recipe was recently rediscovered by ThePython.\n\n"..
"It has the ability to transmute nearby blocks into other blocks. The range can be increased or decreased from 0 to 4 by (shift-)clicking.\n"..
"Transmute blocks by (shift-)right-clicking (holding shift causes a few differences in transmutation). They are changed in a cube centered on "..
"the block directly below you, with a radius equal to the range.\n"..
"The ancient tome (entitled the \"Tekkit Wiki\") vaguely mentioned a \"cooldown\" when used to transmute large areas, "..
"but ThePython was far to lazy to implement such a thing.\n\n"..
"The Philosopher's Stone is also useful in converting various resources, such as turning coal into iron, or gold into "..item1..".\n"..
"See the crafting guide for recipes. The Philosopher's Stone is NEVER used up in crafting recipes (if it is, it's a bug). The transmutation "..
"range is reset when used in a crafting recipe."
local usagehelp = "The range can be increased or decreased from 0 to 4 by (shift-)clicking. Transmute blocks by (shift-)right-clicking (holding shift causes a few differences in transmutation). They are changed in a cube centered on "..
"the block directly below you, with a radius equal to the range.\n\n"..
"The Philosopher's Stone is also useful in converting various resources, such as turning coal into iron, or gold into "..item1..".\n"..
"See the crafting guide for recipes. The Philosopher's Stone is NEVER used up in crafting recipes (if it is, it's a bug). The transmutation "..
"range is reset when used in a crafting recipe."
if exchangeclone.mineclone then
tt_help = tt_help.."\nAux1+click: enchanting table. Aux1+right-click: crafting table."
local extra_stuff = "\n\nIn MineClone, Aux1+right-click opens a 3x3 crafting table and Aux1+left-click opens an enchanting table (the equivalent of a real "..
"enchanting table with eight bookshelves around it)."
longdesc = longdesc..extra_stuff
usagehelp = usagehelp..extra_stuff
end
minetest.register_tool("exchangeclone:philosophers_stone", {
description = "Philosopher's Stone",
inventory_image = "exchangeclone_philosophers_stone.png",
wield_image = "exchangeclone_philosophers_stone.png",
exchangeclone_stone_range = 0,
_tt_help = tt_help,
_doc_items_longdesc = longdesc,
_doc_items_usagehelp = usagehelp,
exchangeclone_item_range = 0,
on_use = on_left_click,
on_place = on_right_click,
on_secondary_use = on_right_click,

465
shears.lua Normal file
View File

@ -0,0 +1,465 @@
--[[
Yes, shears need an entire file... it's a huge amount of code.
They were originally with the other tools, but the code just
got too long.
]]
local function round(num)
if num % 1 < 0.5 then
return math.floor(num)
else
return math.ceil(num)
end
end
local shear_cube = function(player, distance)
local player_pos = player:get_pos()
local pos = {}
local node_positions = {}
pos.x = round(player_pos.x)
pos.y = math.floor(player_pos.y) --make sure y is node BELOW player's feet
pos.z = round(player_pos.z)
for x = pos.x-distance, pos.x+distance do
for y = pos.y-distance, pos.y+distance do
for z = pos.z-distance, pos.z+distance do
local new_pos = {x=x,y=y,z=z}
local node = minetest.get_node(new_pos) or "air"
local node_def = minetest.registered_items[node.name]
if node_def.groups.shearsy or node_def.groups.shearsy_cobweb then
if minetest.is_protected(new_pos, player:get_player_name()) then
minetest.record_protection_violation(new_pos, player:get_player_name())
else
local drop_name = node.name
if node_def._mcl_shears_drop and not node_def._mcl_shears_drop == true then
drop_name = node_def._mcl_shears_drop
end
node_positions[#node_positions + 1] = {pos = new_pos, name = drop_name}
end
end
end
end
end
minetest.log(dump(node_positions))
local player_energy = exchangeclone.get_player_energy(player)
local energy_cost = 0
for _, data in ipairs(node_positions) do
if energy_cost + 16 > player_energy then
break
end
energy_cost = energy_cost + 16
minetest.set_node(data.pos, {name = "air"})
minetest.add_item(player_pos, data.name)
end
exchangeclone.set_player_energy(player, player_energy - energy_cost)
end
local shears_rightclick = function(itemstack, player, pointed_thing)
-- Use pointed node's on_rightclick function first, if present
local node
if pointed_thing and pointed_thing.under then
node = minetest.get_node(pointed_thing.under)
if player and not player:get_player_control().sneak then
if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, player, itemstack) or itemstack
end
end
end
if player:get_player_control().aux1 then
local range = tonumber(itemstack:get_meta():get_int("exchangeclone_item_range"))
if player:get_player_control().sneak then
if range == 0 then
range = 4
else
range = range - 1
end
end
if range == 4 then
range = 0
else
range = range + 1
end
minetest.chat_send_player(player:get_player_name(), "Current Range: "..range)
itemstack:get_meta():set_int("exchangeclone_item_range", range)
return itemstack
end
if player:get_player_control().sneak or not (pointed_thing and pointed_thing.above) then
local range = tonumber(itemstack:get_meta():get_int("exchangeclone_item_range"))
shear_cube(player, range)
return itemstack
end
if not (pointed_thing and pointed_thing.above) then return itemstack end
-- Only carve pumpkin if used on side
if pointed_thing.above.y ~= pointed_thing.under.y then
return
end
if node.name == "mcl_farming:pumpkin" 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
return itemstack
end
minetest.register_tool("exchangeclone:dark_matter_shears", {
description = "Dark Matter Shears\nImage coming soon.",
stack_max = 1,
groups = { tool=1, shears=1, dig_speed_class=7, },
tool_capabilities = {
full_punch_interval = 0.4,
max_drop_level=1,
damage_groups = { fleshy = 2, },
},
on_place = shears_rightclick,
on_secondary_use = shears_rightclick,
sound = { breaks = "default_tool_breaks" },
_mcl_toollike_wield = true,
_mcl_diggroups = {
shearsy = { speed = 5, level = 2, uses = 0 },
shearsy_wool = { speed = 10, level = 2, uses = 0 },
shearsy_cobweb = { speed = 30, level = 2, uses = 0 }
},
})
minetest.register_tool("exchangeclone:red_matter_shears", {
description = "Red Matter Shears\nImage coming soon.",
stack_max = 1,
groups = { tool=1, shears=1, dig_speed_class=8, },
tool_capabilities = {
full_punch_interval = 0.3,
max_drop_level=1,
damage_groups = { fleshy = 4, },
},
on_place = shears_rightclick,
on_secondary_use = shears_rightclick,
sound = { breaks = "default_tool_breaks" },
_mcl_toollike_wield = true,
_mcl_diggroups = {
shearsy = { speed = 8, level = 3, uses = 0 },
shearsy_wool = { speed = 14, level = 3, uses = 0 },
shearsy_cobweb = { speed = 34, level = 3, uses = 0 }
},
})
local colors = {
-- group = { wool, textures }
unicolor_white = { "mcl_wool:white", "#FFFFFF00" },
unicolor_dark_orange = { "mcl_wool:brown", "#502A00D0" },
unicolor_grey = { "mcl_wool:silver", "#5B5B5BD0" },
unicolor_darkgrey = { "mcl_wool:grey", "#303030D0" },
unicolor_blue = { "mcl_wool:blue", "#0000CCD0" },
unicolor_dark_green = { "mcl_wool:green", "#005000D0" },
unicolor_green = { "mcl_wool:lime", "#50CC00D0" },
unicolor_violet = { "mcl_wool:purple" , "#5000CCD0" },
unicolor_light_red = { "mcl_wool:pink", "#FF5050D0" },
unicolor_yellow = { "mcl_wool:yellow", "#CCCC00D0" },
unicolor_orange = { "mcl_wool:orange", "#CC5000D0" },
unicolor_red = { "mcl_wool:red", "#CC0000D0" },
unicolor_cyan = { "mcl_wool:cyan", "#00CCCCD0" },
unicolor_red_violet = { "mcl_wool:magenta", "#CC0050D0" },
unicolor_black = { "mcl_wool:black", "#000000D0" },
unicolor_light_blue = { "mcl_wool:light_blue", "#5050FFD0" },
}
local gotten_texture = { "blank.png", "mobs_mc_sheep.png" }
local old_sheep_function = minetest.registered_entities["mobs_mc:sheep"].on_rightclick
minetest.registered_entities["mobs_mc:sheep"].on_rightclick = function(self, clicker)
local item = clicker:get_wielded_item()
if (item:get_name() == "exchangeclone:dark_matter_shears" or item:get_name() == "exchangeclone:red_matter_shears")
and not self.gotten and not self.child then
local pos = self.object:get_pos()
local chance = 30 --percent
if item:get_name() == "exchangeclone:red_matter_shears" then chance = 60 end
if math.random(1, 100) <= chance then
local new_sheep = minetest.add_entity(pos, "mobs_mc:sheep"):get_luaentity() --clone the sheep
for attribute, value in pairs(self) do
if attribute ~= "object" then
new_sheep[attribute] = value
end
end
new_sheep.object:set_properties({
nametag = self.nametag,
textures = self.base_texture
})
end
self.gotten = true
minetest.sound_play("mcl_tools_shears_cut", {pos = pos}, true)
pos = clicker:get_pos() --drop directly on player
if not self.color then
self.color = "unicolor_white"
end
local max_wool = 8
if item:get_name() == "exchangeclone:red_matter_shears" then max_wool = 12 end
minetest.add_item(pos, ItemStack(colors[self.color][1].." "..math.random(1,max_wool))) --normally 3
self.base_texture = gotten_texture
self.object:set_properties({
textures = self.base_texture,
})
self.drops = {
{name = "mcl_mobitems:mutton",
chance = 1,
min = 1,
max = 2,},
}
return
else
old_sheep_function(self, clicker)
end
end
local old_mooshroom_function = minetest.registered_entities["mobs_mc:mooshroom"].on_rightclick
minetest.registered_entities["mobs_mc:mooshroom"].on_rightclick = function(self, clicker)if self:feed_tame(clicker, 1, true, false) then return end
if mcl_mobs:protect(self, clicker) then return end
if self.child then
return
end
local item = clicker:get_wielded_item()
-- Use shears to get mushrooms and turn mooshroom into cow
if item:get_name() == "exchangeclone:dark_matter_shears" or item:get_name() == "exchangeclone:red_matter_shears" then
local pos = self.object:get_pos()
local player_pos = clicker:get_pos()
minetest.sound_play("mcl_tools_shears_cut", {pos = pos}, true)
local amount = 8
if item:get_name() == "exchangeclone:red_matter_shears" then
amount = 12
end
if self.base_texture[1] == "mobs_mc_mooshroom_brown.png" then
minetest.add_item(player_pos, "mcl_mushrooms:mushroom_brown "..amount)
else
minetest.add_item(player_pos, "mcl_mushrooms:mushroom_red "..amount)
end
local chance = 30 --percent
if item:get_name() == "exchangeclone:red_matter_shears" then chance = 60 end
if math.random(1, 100) <= chance then
local new_mooshroom = minetest.add_entity(pos, "mobs_mc:mooshroom"):get_luaentity() --clone the mooshroom
for attribute, value in pairs(self) do
if attribute ~= "object" then
new_mooshroom[attribute] = value
end
end
new_mooshroom.object:set_properties({
nametag = self.nametag,
textures = self.base_texture
})
end
local oldyaw = self.object:get_yaw()
self.object:remove()
local cow = minetest.add_entity(pos, "mobs_mc:cow")
cow:set_yaw(oldyaw)
else
old_mooshroom_function(self, clicker)
end
end
local old_honey_harvest = minetest.registered_items["mcl_beehives:bee_nest_5"].on_rightclick
for _, itemstring in ipairs({"mcl_beehives:bee_nest_5", "mcl_beehives:beehive_5"}) do
minetest.registered_items[itemstring].on_rightclick = function(pos, node, player, itemstack, pointed_thing)
local inv = player:get_inventory()
local shears = player:get_wielded_item():get_name() == "exchangeclone:dark_matter_shears"
or player:get_wielded_item():get_name() == "exchangeclone:red_matter_shears"
local beehive = "mcl_beehives:beehive"
local campfire_area = vector.offset(pos, 0, -5, 0)
local campfire = minetest.find_nodes_in_area(pos, campfire_area, "group:lit_campfire")
if node.name == "mcl_beehives:beehive_5" then
beehive = "mcl_beehives:beehive"
elseif node.name == "mcl_beehives:bee_nest_5" then
beehive = "mcl_beehives:bee_nest"
end
if shears then
minetest.add_item(pos, "mcl_honey:honeycomb 3")
node.name = beehive
minetest.set_node(pos, node)
if not campfire[1] then mcl_util.deal_damage(player, 3) end --significantly less damage
else
old_honey_harvest()
end
end
local old_dispenser_function = minetest.registered_items["mcl_dispensers:dispenser"].mesecons.effector.action_on
local new_dispenser_function = function(pos, node)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local droppos, dropdir
if node.name == "mcl_dispensers:dispenser" then
dropdir = vector.multiply(minetest.facedir_to_dir(node.param2), -1)
droppos = vector.add(pos, dropdir)
elseif node.name == "mcl_dispensers:dispenser_up" then
dropdir = {x=0, y=1, z=0}
droppos = {x=pos.x, y=pos.y+1, z=pos.z}
elseif node.name == "mcl_dispensers:dispenser_down" then
dropdir = {x=0, y=-1, z=0}
droppos = {x=pos.x, y=pos.y-1, z=pos.z}
end
local dropnode = minetest.get_node(droppos)
local dropnodedef = minetest.registered_nodes[dropnode.name]
local stacks = {}
for i=1,inv:get_size("main") do
local stack = inv:get_stack("main", i)
if not stack:is_empty() then
table.insert(stacks, {stack = stack, stackpos = i})
end
end
if #stacks >= 1 then
local r = math.random(1, #stacks)
local stack = stacks[r].stack
local dropitem = ItemStack(stack)
dropitem:set_count(1)
local stack_id = stacks[r].stackpos
local stackdef = stack:get_definition()
if not stackdef then
return
end
local iname = stack:get_name()
local igroups = stackdef.groups
if iname == "exchangeclone:dark_matter_shears" or iname == "exchangeclone:red_matter_shears" then
for _, obj in pairs(minetest.get_objects_inside_radius(droppos, 1)) do
local entity = obj:get_luaentity()
if entity and not entity.child and not entity.gotten then
local entname = entity.name
local pos = obj:get_pos()
local used = false
local texture
if entname == "mobs_mc:sheep" then
local max_wool = 8
if iname == "exchangeclone:red_matter_shears" then max_wool = 12 end
minetest.add_item(pos, entity.drops[2].name.." "..math.random(1,max_wool)) --normally 3
if not entity.color then
entity.color = "unicolor_white"
end
local chance = 30 --percent
if iname == "exchangeclone:red_matter_shears" then chance = 60 end
if math.random(1, 100) <= chance then
local new_sheep = minetest.add_entity(pos, "mobs_mc:sheep"):get_luaentity() --clone the sheep
for attribute, value in pairs(entity) do
if attribute ~= "object" then
new_sheep[attribute] = value
end
end
new_sheep.object:set_properties({
nametag = entity.nametag,
textures = entity.base_texture
})
end
entity.base_texture = { "blank.png", "mobs_mc_sheep.png" }
texture = entity.base_texture
entity.drops = {
{ name = "mcl_mobitems:mutton", chance = 1, min = 1, max = 2 },
}
used = true
elseif entname == "mobs_mc:snowman" then
texture = {
"mobs_mc_snowman.png",
"blank.png", "blank.png",
"blank.png", "blank.png",
"blank.png", "blank.png",
}
used = true
elseif entname == "mobs_mc:mooshroom" then
local amount = 8
if iname == "exchangeclone:red_matter_shears" then
amount = 12
end
if entity.base_texture[1] == "mobs_mc_mooshroom_brown.png" then
minetest.add_item(droppos, "mcl_mushrooms:mushroom_brown "..amount)
else
minetest.add_item(droppos, "mcl_mushrooms:mushroom_red "..amount)
end
local chance = 30 --percent
if iname == "exchangeclone:red_matter_shears" then chance = 60 end
if math.random(1, 100) <= chance then
local new_mooshroom = minetest.add_entity(pos, "mobs_mc:mooshroom"):get_luaentity() --clone the mooshroom
for attribute, value in pairs(entity) do
if attribute ~= "object" then
new_mooshroom[attribute] = value
end
end
new_mooshroom.object:set_properties({
nametag = entity.nametag,
textures = entity.base_texture
})
end
obj = mcl_util.replace_mob(obj, "mobs_mc:cow")
entity = obj:get_luaentity()
used = true
end
if used then
obj:set_properties({ textures = texture })
entity.gotten = true
minetest.sound_play("mcl_tools_shears_cut", { pos = pos }, true)
inv:set_stack("main", stack_id, stack)
break
end
end
end
end
else
old_dispenser_function(pos, node)
end
end
for _, itemstring in ipairs({"mcl_dispensers:dispenser", "mcl_dispensers:dispenser_up", "mcl_dispensers:dispenser_down"}) do
minetest.registered_items[itemstring].mesecons.effector.action_on = new_dispenser_function
end
end
local gotten_texture = {
"mobs_mc_snowman.png",
"blank.png",
"blank.png",
"blank.png",
"blank.png",
"blank.png",
"blank.png",
}
local old_snowman_function = minetest.registered_entities["mobs_mc:snowman"].on_rightclick
minetest.registered_entities["mobs_mc:snowman"].on_rightclick = function(self, clicker)
local item = clicker:get_wielded_item()
if self.gotten ~= true and (item:get_name() == "exchangeclone:dark_matter_shears" or item:get_name() == "exchangeclone:red_matter_shears") then
-- Remove pumpkin
self.gotten = true
self.object:set_properties({
textures = gotten_texture,
})
local pos = self.object:get_pos()
minetest.sound_play("mcl_tools_shears_cut", {pos = pos}, true)
if minetest.registered_items["mcl_farming:pumpkin_face"] then
minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, "mcl_farming:pumpkin_face")
end
else
old_snowman_function(self, clicker)
end
end
local diamond_itemstring = "default:diamond"
if exchangeclone.mineclone then
diamond_itemstring = "mcl_core:diamond"
end
minetest.register_craft({
output = "exchangeclone:dark_matter_shears",
recipe = {
{"", "exchangeclone:dark_matter"},
{diamond_itemstring, ""},
}
})

237
swords.lua Normal file
View File

@ -0,0 +1,237 @@
local wield_scale
if exchangeclone.mineclone then
local wield_scale = mcl_vars.tool_wield_scale
else
local wield_scale = {x=1,y=1,z=1}
end
local aoe_exclude = { --any entity not beginning with "mobs_mc:" is automatically added to this list.
["mobs_mc:spider_eyes"] = true,
["mobs_mc:wither_skull"] = true,
["mobs_mc:fireball"] = true,
["mobs_mc:dragon_fireball"] = true,
["mobs_mc:blaze_fireball"] = true,
["mobs_mc:shulkerbullet"] = true,
["mobs_mc:potion_arrow"] = true,
["mobs_mc:llamaspit"] = true,
}
local hostile_mobs = { --for Red Matter Sword
["mobs_mc:blaze"] = true,
["mobs_mc:villager_zombie"] = true,
["mobs_mc:endermite"] = true,
["mobs_mc:killer_bunny"] = true,
["mobs_mc:ghast"] = true,
["mobs_mc:witch"] = true,
["mobs_mc:zombie"] = true,
["mobs_mc:baby_zombie"] = true,
["mobs_mc:stray"] = true,
["mobs_mc:enderdragon"] = true,
["mobs_mc:magma_cube_big"] = true,
["mobs_mc:piglin_brute"] = true,
["mobs_mc:wither"] = true,
["mobs_mc:skeleton"] = true,
["mobs_mc:witherskeleton"] = true,
["mobs_mc:slime_big"] = true,
["mobs_mc:husk"] = true,
["mobs_mc:evoker"] = true,
["mobs_mc:creeper_charged"] = true,
["mobs_mc:guardian_elder"] = true,
["mobs_mc:guardian"] = true,
["mobs_mc:creeper"] = true,
["mobs_mc:vindicator"] = true,
["mobs_mc:zoglin"] = true,
["mobs_mc:baby_hoglin"] = true,
["mobs_mc:silverfish"] = true,
["mobs_mc:magma_cube_small"] = true,
["mobs_mc:pillager"] = true,
["mobs_mc:magma_cube_tiny"] = true,
["mobs_mc:shulker"] = true,
["mobs_mc:baby_husk"] = true,
["mobs_mc:hoglin"] = true,
["mobs_mc:slime_tiny"] = true,
["mobs_mc:vex"] = true,
["mobs_mc:illusioner"] = true,
}
minetest.register_on_mods_loaded(function()
for name, def in pairs(minetest.registered_entities) do
if not name:find("mobs_mc:") then
aoe_exclude[name] = true
end
end
end)
local sword_aoe = function(info)
if not info then return end
local max_damage = info.max_damage
local knockback = info.knockback
local radius = info.radius
local damage_all = info.damage_all --damage all mobs/players or just hostile ones
if not max_damage or not knockback or not radius then return end
if damage_all == nil then damage_all = 1 end
return function(itemstack, player, pointed_thing) --copied from MineClone's TNT; I would simply use the explosion function but it would hurt the player.
-- Use pointed node's on_rightclick function first, if present
if pointed_thing and pointed_thing.under then
local node = minetest.get_node(pointed_thing.under)
if player and not player:get_player_control().sneak then
if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, player, itemstack) or itemstack
end
end
end
local player_energy = exchangeclone.get_player_energy(player)
if player_energy >= 384 then
exchangeclone.set_player_energy(player, player_energy - 384)
else
return
end
local pos = player:get_pos()
-- Entities in radius of explosion
local objs = minetest.get_objects_inside_radius(pos, radius)
-- Trace rays for entity damage
for _, obj in pairs(objs) do
local ent = obj:get_luaentity()
-- Ignore items to lower lag
if (obj:is_player()
or (ent and not aoe_exclude[ent.name]
and not (damage_all == 0 and not hostile_mobs[ent.name]))) --ignore hostile mobs if necessary
and obj:get_hp() > 0 and obj ~= player then
local opos = obj:get_pos()
local distance = vector.distance(pos, opos)
-- Punch entity with damage depending on explosion exposure and
-- distance to explosion
local punch_vec = vector.subtract(opos, pos)
local punch_dir = vector.normalize(punch_vec)
punch_dir = {x=punch_dir.x, y=punch_dir.y+0.3, z=punch_dir.z} -- knockback should be more upward
if distance < 1 then distance = 1 end --to prevent huge amounts of damage and dividing by zero
local damage = max_damage/distance
--minetest.log(dump({name=ent.name, distance=distance, damage=damage}))
local sleep_formspec_doesnt_close_mt53 = false
if obj:is_player() then
local name = obj:get_player_name()
if mcl_beds then
local meta = obj:get_meta()
if meta:get_string("mcl_beds:sleeping") == "true" then
minetest.close_formspec(name, "") -- ABSOLUTELY NECESSARY FOR MT5.3 -- TODO: REMOVE THIS IN THE FUTURE
sleep_formspec_doesnt_close_mt53 = true
end
end
end
if sleep_formspec_doesnt_close_mt53 then
minetest.after(0.3,
function() -- 0.2 is minimum delay for closing old formspec and open died formspec -- TODO: REMOVE THIS IN THE FUTURE
if not obj:is_player() then
return
end
if exchangeclone.mineclone then
mcl_util.deal_damage(obj, damage, { type = "generic", direct = player})
else
obj:set_hp(obj:get_hp() - damage)
end
obj:add_velocity(vector.multiply(punch_dir, knockback/distance))
end)
else
if exchangeclone.mineclone then
mcl_util.deal_damage(obj, damage, { type = "generic", direct = player})
else
obj:set_hp(obj:get_hp() - damage)
end
obj:add_velocity(vector.multiply(punch_dir, knockback/distance))
end
end
end
end
end
local red_matter_sword_action = function(itemstack, player, pointed_thing)
local damage_all = itemstack:get_meta():get_int("exchangeclone_damage_all")
if not damage_all == 0 then damage_all = 1 end
if player:get_player_control().sneak then
if damage_all == 0 then
damage_all = 1
minetest.chat_send_player(player:get_player_name(), "Damage all mobs")
else
damage_all = 0
minetest.chat_send_player(player:get_player_name(), "Damage hostile mobs")
end
itemstack:get_meta():set_int("exchangeclone_damage_all", damage_all)
return itemstack
end
local aoe_function = sword_aoe({max_damage = 15, knockback = 20, radius = 7, damage_all = damage_all})
aoe_function(itemstack, player, pointed_thing)
end
minetest.register_tool("exchangeclone:sword_dark_matter", {
description = "Dark Matter Sword\nImage coming soon.",
groups = { tool=1, sword=1, dig_speed_class=7, enchantability=0 },
wield_scale = wield_scale,
tool_capabilities = {
-- 1/1.2
full_punch_interval = 0.25,
max_drop_level=5,
damage_groups = {fleshy=12},
punch_attack_uses = 0,
groupcaps={
snappy = {times={[1]=0.95, [2]=0.45, [3]=0.15}, uses=0, maxlevel=4},
},
},
on_secondary_use = sword_aoe({max_damage = 11, knockback = 12, radius = 5}),
on_place = sword_aoe({max_damage = 11, knockback = 12, radius = 5}),
sound = { breaks = "default_tool_breaks" },
_mcl_toollike_wield = true,
_mcl_diggroups = {
swordy = { speed = 16, level = 7, uses = 0 }
},
})
minetest.register_tool("exchangeclone:sword_red_matter", {
description = "Red Matter Sword\nImage coming soon.",
groups = { tool=1, sword=1, dig_speed_class=8, enchantability=0 },
wield_scale = wield_scale,
tool_capabilities = {
-- 1/1.2
full_punch_interval = 0.17,
max_drop_level=6,
damage_groups = {fleshy=16},
punch_attack_uses = 0,
groupcaps={
snappy = {times={[1]=0.6, [2]=0.25, [3]=0.1}, uses=0, maxlevel=5},
},
},
on_secondary_use = red_matter_sword_action,
on_place = red_matter_sword_action,
sound = { breaks = "default_tool_breaks" },
_mcl_toollike_wield = true,
_mcl_diggroups = {
swordy = { speed = 20, level = 7, uses = 0 }
},
})
local diamond_itemstring = "default:diamond"
if exchangeclone.mineclone then
diamond_itemstring = "mcl_core:diamond"
end
minetest.register_craft({
output = "exchangeclone:sword_dark_matter",
recipe = {
{"", "exchangeclone:dark_matter", ""},
{"", "exchangeclone:dark_matter", ""},
{"", diamond_itemstring, ""}
}
})

View File

@ -5,10 +5,10 @@ else
local wield_scale = {x=1,y=1,z=1}
end
local make_grass_path
local make_stripped_trunk
local shovel_on_place
local axe_on_place
if exchangeclone.mineclone then
make_grass_path = function(itemstack, placer, pointed_thing)
shovel_on_place = function(itemstack, placer, pointed_thing)
-- Use pointed node's on_rightclick function first, if present
local node = minetest.get_node(pointed_thing.under)
if placer and not placer:get_player_control().sneak then
@ -30,15 +30,6 @@ if exchangeclone.mineclone then
minetest.record_protection_violation(pointed_thing.under, placer:get_player_name())
return itemstack
end
if not minetest.is_creative_enabled(placer:get_player_name()) then
-- Add wear (as if digging a shovely node)
local toolname = itemstack:get_name()
local wear = mcl_autogroup.get_wear(toolname, "shovely")
if wear then
itemstack:add_wear(wear)
end
end
minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = above}, true)
minetest.swap_node(pointed_thing.under, {name="mcl_core:grass_path"})
end
@ -46,7 +37,7 @@ if exchangeclone.mineclone then
return itemstack
end
make_stripped_trunk = function(itemstack, placer, pointed_thing)
axe_on_place = function(itemstack, placer, pointed_thing)
if pointed_thing.type ~= "node" then return end
local node = minetest.get_node(pointed_thing.under)
@ -71,50 +62,56 @@ if exchangeclone.mineclone then
return itemstack
else
minetest.swap_node(pointed_thing.under, {name=noddef._mcl_stripped_variant, param2=node.param2})
if not minetest.is_creative_enabled(placer:get_player_name()) then
-- Add wear (as if digging a axey node)
local toolname = itemstack:get_name()
local wear = mcl_autogroup.get_wear(toolname, "axey")
if wear then
itemstack:add_wear(wear)
end
end
end
return itemstack
end
end
local carve_pumpkin
if minetest.get_modpath("mcl_farming") then
carve_pumpkin = function(itemstack, placer, pointed_thing)
-- Use pointed node's on_rightclick function first, if present
local node = minetest.get_node(pointed_thing.under)
if placer and not placer:get_player_control().sneak then
if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack
end
local function create_soil(pos, inv)
if pos == nil then
return false
end
local node = minetest.get_node(pos)
local name = node.name
local above = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z})
if minetest.get_item_group(name, "cultivatable") == 2 then
if above.name == "air" then
node.name = "mcl_farming:soil"
minetest.set_node(pos, node)
minetest.sound_play("default_dig_crumbly", { pos = pos, gain = 0.5 }, true)
return true
end
elseif minetest.get_item_group(name, "cultivatable") == 1 then
if above.name == "air" then
node.name = "mcl_core:dirt"
minetest.set_node(pos, node)
minetest.sound_play("default_dig_crumbly", { pos = pos, gain = 0.6 }, true)
return true
end
end
return false
end
-- Only carve pumpkin if used on side
if pointed_thing.above.y ~= pointed_thing.under.y then
return
local hoe_on_place = function(itemstack, user, pointed_thing)
if minetest.get_modpath("farming") and farming then
return farming.hoe_on_use(itemstack, user, pointed_thing)
elseif not mineclone then
return
end
-- Call on_rightclick if the pointed node defines it
local node = minetest.get_node(pointed_thing.under)
if user and not user:get_player_control().sneak then
if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack
end
if node.name == "mcl_farming:pumpkin" then
if not minetest.is_creative_enabled(placer:get_player_name()) then
-- Add wear (as if digging a shearsy node)
local toolname = itemstack:get_name()
local wear = mcl_autogroup.get_wear(toolname, "shearsy")
if wear then
itemstack:add_wear(wear)
end
end
end
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
if minetest.is_protected(pointed_thing.under, user:get_player_name()) then
minetest.record_protection_violation(pointed_thing.under, user:get_player_name())
return itemstack
end
if create_soil(pointed_thing.under, user:get_inventory()) then
return itemstack
end
end
@ -155,7 +152,7 @@ minetest.register_tool("exchangeclone:shovel_dark_matter", {
},
},
sound = { breaks = "default_tool_breaks" },
on_place = make_grass_path,
on_place = shovel_on_place,
_mcl_toollike_wield = true,
_mcl_diggroups = {
shovely = { speed = 16, level = 7, uses = 0 }
@ -177,34 +174,30 @@ minetest.register_tool("exchangeclone:axe_dark_matter", {
},
},
sound = { breaks = "default_tool_breaks" },
on_place = make_stripped_trunk,
on_place = axe_on_place,
_mcl_toollike_wield = true,
_mcl_diggroups = {
axey = { speed = 16, level = 7, uses = 0 }
},
})
minetest.register_tool("exchangeclone:sword_dark_matter", {
description = "Dark Matter Sword\nImage coming soon.",
groups = { tool=1, sword=1, dig_speed_class=7, enchantability=0 },
minetest.register_tool("exchangeclone:dark_matter_hoe", {
description = "Dark Matter Hoe",
wield_scale = wield_scale,
on_place = hoe_on_place,
groups = { tool=1, hoe=1, enchantability=0 },
tool_capabilities = {
-- 1/1.2
full_punch_interval = 0.25,
max_drop_level=5,
damage_groups = {fleshy=14},
punch_attack_uses = 0,
groupcaps={
snappy = {times={[1]=0.95, [2]=0.45, [3]=0.15}, uses=0, maxlevel=4},
},
damage_groups = { fleshy = 7, },
},
sound = { breaks = "default_tool_breaks" },
_mcl_toollike_wield = true,
_mcl_diggroups = {
swordy = { speed = 16, level = 7, uses = 0 }
hoey = { speed = 12, level = 7, uses = 0 }
},
})
--Crafting recipes
local diamond_itemstring = "default:diamond"
if exchangeclone.mineclone then
diamond_itemstring = "mcl_core:diamond"
@ -227,3 +220,21 @@ minetest.register_craft({
{"", diamond_itemstring, ""}
}
})
minetest.register_craft({
output = "exchangeclone:axe_dark_matter",
recipe = {
{"exchangeclone:dark_matter", "exchangeclone:dark_matter", ""},
{"exchangeclone:dark_matter", diamond_itemstring, ""},
{"", diamond_itemstring, ""}
}
})
minetest.register_craft({
output = "exchangeclone:dark_matter_hoe",
recipe = {
{"exchangeclone:dark_matter", "exchangeclone:dark_matter", ""},
{"", diamond_itemstring, ""},
{"", diamond_itemstring, ""}
}
})