Tons of changes, still not release-ready
This commit is contained in:
parent
8220af3a8b
commit
74f7c9465c
|
@ -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).
|
||||
|
||||
|
|
|
@ -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).
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
7
init.lua
7
init.lua
|
@ -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")
|
2
mod.conf
2
mod.conf
|
@ -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
24
orb.lua
|
@ -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,
|
||||
})
|
||||
|
||||
|
|
|
@ -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
|
|
@ -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,
|
||||
|
|
|
@ -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, ""},
|
||||
}
|
||||
})
|
|
@ -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, ""}
|
||||
}
|
||||
})
|
|
@ -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, ""}
|
||||
}
|
||||
})
|
Loading…
Reference in New Issue