Compare commits
44 Commits
6395f791e8
...
d6c2fdc768
Author | SHA1 | Date |
---|---|---|
ThePython | d6c2fdc768 | |
ThePython | f1c222ef1a | |
ThePython | ab1c28c041 | |
ThePython | 233d84d3e2 | |
ThePython | 638fd4666d | |
ThePython | 829991ed39 | |
ThePython | 473e7912a9 | |
ThePython | 18429268f3 | |
ThePython | b21c182365 | |
ThePython | d5c153e45f | |
ThePython | c39ff263d9 | |
ThePython | 0058a05069 | |
ThePython | b8ed0fa57f | |
ThePython | 002b5da71e | |
ThePython | 40cf7088da | |
ThePython | 72b84587aa | |
ThePython10110 | 8c277cc130 | |
ThePython10110 | cb428c46a2 | |
ThePython | ceaf25fa4f | |
ThePython | 7064d4e2a4 | |
ThePython | 5ed7c7e92f | |
ThePython | 362310b041 | |
ThePython | 0be468496b | |
ThePython | ad73cdefe7 | |
ThePython | 7aae74608f | |
ThePython | 9290294154 | |
ThePython | 9c9c620b84 | |
ThePython | 3874c608f3 | |
ThePython | 3c8345da1b | |
ThePython | 15645ebeec | |
ThePython | d5e62aa99e | |
ThePython | bb3e694f4f | |
ThePython | cb0f322668 | |
ThePython | 81b374223b | |
ThePython | 37d30ebe65 | |
ThePython | e7f7907146 | |
ThePython | 2f6f2a6388 | |
ThePython | e1d856d62b | |
ThePython | 3fa283b956 | |
ThePython | 281b2a90df | |
ThePython | a683beb709 | |
ThePython | 3821ae518c | |
ThePython | cd5bd99269 | |
ThePython | a3f72e5b0f |
|
@ -11,6 +11,7 @@ read_globals = {
|
|||
"mcl_burning",
|
||||
"mcl_util",
|
||||
"mcl_formspec",
|
||||
"mcl_copper",
|
||||
"mcl_item_id",
|
||||
"mcl_enchanting",
|
||||
"mcl_hunger",
|
||||
|
@ -31,6 +32,10 @@ read_globals = {
|
|||
"mcl_crafting_table",
|
||||
"mcl_enchantments",
|
||||
|
||||
"technic",
|
||||
"hopper",
|
||||
"pipeworks",
|
||||
|
||||
"Raycast",
|
||||
"Settings",
|
||||
"PseudoRandom",
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"editor.inlineSuggest.showToolbar": "always"
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
# Code of Conduct
|
||||
Don't be evil.
|
||||
Don't be evil.
|
||||
|
||||
That's it.
|
||||
|
||||
|
|
|
@ -3,4 +3,6 @@ If you want to contribute, please do so, either through issues or pull requests.
|
|||
|
||||
Feel free to report any problems or suggestions (including things as small as typos). If you know how to fix it, a PR would be even more useful.
|
||||
|
||||
Please follow the [Code of Conduct](CODE_OF_CONDUCT.md) when contributing.
|
||||
Translations and textures are also welcome! I don't really like the textures for a lot of things. Mostly the nodes, but textures for the tools that don't look quite so similar to EE2/ProjectE would be nice.
|
||||
|
||||
Please follow the [Code of Conduct](CODE_OF_CONDUCT.md) when contributing.
|
160
README.md
|
@ -1,12 +1,14 @@
|
|||
# ExchangeClone
|
||||
Allows players to turn items into energy, and energy into items. Supports all items in Minetest Game and MineClone 2, and anything that can be made from them! Also adds a whole bunch of other stuff.
|
||||
|
||||
Look at the "dev" branch to see what I'm currently working on!
|
||||
If you would like to see the latest changes, check out (pun) the dev branch! Beware of bugs.
|
||||
|
||||
ExchangeClone is tested with the latest release of Minetest, Minetest Game, MineClone2, and Mineclonia.
|
||||
|
||||
## ExchangeClone's Features:
|
||||
* Energy
|
||||
* Philosopher's Stone
|
||||
* Transmutation Table
|
||||
* Energy
|
||||
* Alchemical Tome
|
||||
* Exchange Orb
|
||||
* Deconstructor
|
||||
|
@ -17,7 +19,7 @@ Look at the "dev" branch to see what I'm currently working on!
|
|||
* Dark and Red Matter Tools
|
||||
* Dark and Red Matter Armor
|
||||
* Dark and Red Matter Furnaces
|
||||
* PESA (deprecated)
|
||||
* PESA (deprecated, WILL BE REMOVED in 7.0)
|
||||
|
||||
See the [wiki](https://github.com/ThePython10110/ExchangeClone/wiki) for more information
|
||||
|
||||
|
@ -35,10 +37,14 @@ Dependencies: Minetest Game or MineClone.
|
|||
|
||||
|
||||
## Known issues:
|
||||
* It is impossible to die from most things when wearing DM/RM armor... MineClone's damage system is annoying.
|
||||
* When machines are exploded, they (and the items inside) do not drop. I can't figure out why.
|
||||
* Dark/Red matter shears will sometimes (randomly) be treated as normal shears when used by MineClone dispensers. This will not be fixed.
|
||||
* Nodes destroyed by special abilities will not usually update surrounding nodes (so you may end up with floating gravel, flowers, torches, etc.). This will *probably* not be fixed, unless a change to Minetest makes it easier.
|
||||
* Dark/Red Matter armor don't work they way they should, especially in MTG. I would greatly appreciate a PR that makes them work more like ProjectE.
|
||||
* The sword/katar AOE ability does not take upgrades into account. This will probably not be fixed (MCL)
|
||||
* For technical reasons (making them work with MCL hoppers), Exchange Orbs and Upgrades can be used as fuel. This isn't really a problem, but it will be removed once I decide the new hopper API is new enough that most people are using it.
|
||||
* Dark/Red Matter Shears will sometimes (randomly) be treated as normal shears when used by dispensers. This will not be fixed.
|
||||
* In Mineclonia, when inserting items into Dark/Red Matter Furnaces with hoppers, they will not start at the correct speed, instead being limited to a maximum of 1 item/second. This will not be fixed unless Mineclonia changes how things work.
|
||||
* In Mineclonia, hoppers can put invalid items into Energy Collectors.
|
||||
* DM/RM tools and armor aren't great... the DM tools are TOO fast and the armor is (depending on which game you're playing), too good or not good enough. I would love it if someone with more patience would submit a PR to improve them. I would like them to be as close to ProjectE as possible, and as similar as possible between MTG and MCL... but I just hate doing that kind of thing.
|
||||
* DM tools mine RM nodes too quickly for something that doesn't drop (MCL).
|
||||
|
||||
**If you have a suggestion or notice a bug, visit the [GitHub issues page](https://github.com/thepython10110/exchangeclone/issues).**
|
||||
|
||||
|
@ -51,31 +57,102 @@ Dependencies: Minetest Game or MineClone.
|
|||
* Energy Collector, Deconstructor, Constructor: Directly from Element Exchange, GPLv3+.
|
||||
* Exchange Orb: *Slightly* modified from Element Exchange (I just changed the color to white so it could change colors correctly)
|
||||
* Alchemical Coal, Mobius Fuel, and Aeternalis Fuel: modified versions of MineClone's coal texture (CC-BY-SA-3.0).
|
||||
* Covalence Dust: Slightly modified from MineClon(e2/ia)'s redstone dust (CC-BY-SA-3.0)
|
||||
* Dark and Red Matter Armor (and maybe eventually Gem Armor): modified versions of diamond armor from 3D Armor (CC-BY-SA-3.0) and `mcl_armor` (CC-BY-SA-3.0).
|
||||
* All other textures (and sounds): Created by me, inspired by Equivalent Exchange and licensed under CC-BY-SA-3.0.
|
||||
|
||||
<details><summary><h1>Changelog:</h1></summary>
|
||||
-----
|
||||
|
||||
### 5.4
|
||||
## Changelog
|
||||
<details><summary>Look at this fancy expanding changelog</summary>
|
||||
|
||||
### v6.0 (The Compatibility Update)
|
||||
This update took a while... there was just so much that had to be done.
|
||||
|
||||
**The biggest changes:**
|
||||
* I'm naming updates now for some reason.
|
||||
* Automatic energy values! This means I don't have to manually add energy values for every single item. If it's craftable or cookable, ExchangeClone will automatically figure out an energy value for it. There's also an API (with very little documentation because I'm lazy) for adding custom energy recipes and recipe types.
|
||||
* The minimum Minetest version has been changed to 5.7.0, because I'm never going to test on any older versions. Of course, it will probably still work (at least mostly) on other versions, but I can't promise anything.
|
||||
* Players can now have up to 1 trillion personal energy!
|
||||
* Energy values now better match ProjectE's.
|
||||
* Changed A LOT of things internally. Any mods depending on ExchangeClone (probably not very many, which is good) will probably need to update stuff.
|
||||
* **The PESA will be removed in version 7.0.**
|
||||
|
||||
I didn't get to everything I wanted to, mostly because the automatic energy values required quite a lot of work.
|
||||
|
||||
#### Full Changelog**
|
||||
* New Features:
|
||||
* Automatically generated energy values! Based on crafting and cooking recipes.
|
||||
* Depending on the number of crafting recipes you have, this could increase load times. This is definitely a bit of an issue in MineClone2, probably due to the number of banner/dye recipes. Eventually (hopefully), loom functionality will be added and this will improve quite a bit.
|
||||
* Technic recipe types (grinding, alloying, etc.) work, as long as their `output_size` is 1 (meaning they only output one item at a time, so not the centrifuge or separator).
|
||||
* Also supports Mineclonia's stonecutter recipes, Netherite upgrades, and more.
|
||||
* Added various ways of adding custom energy values or energy recipes (`exchangeclone.register_alias`, `exchangeclone.register_craft_type`, and `exchangeclone.register_craft`)
|
||||
* Support for Pipeworks and Hopper mods! (MCL hoppers already worked)
|
||||
* Added energy values for More Ores and Technic.
|
||||
* Infinite food (costs 64 energy to use, but isn't consumed, equal to MCL steak)
|
||||
* Alchemical Chests, Alchemical Bags, and Advanced Alchemical Chests
|
||||
* Labels on items in the Transmutation GUI showing how many items can be created.
|
||||
* Added comma separators when energy is shown (to make it easier to identify large numbers)
|
||||
* Covalence Dust
|
||||
* Left-click (or aux1-left-click in MCL) with Philosopher's Stone to open repairing menu; only tools with an energy value can be repaired)
|
||||
* 5 more Energy Collectors (to go with the increased energy limit)
|
||||
* Chat commands to set/add/remove energy from a player (requires `privs` privilege):
|
||||
* `/add_player_energy [player] value` (player defaults to self, value can be negative)
|
||||
* `/set_player_energy [player] value` (player defaults to self, value can be "limit" to set to the limit)
|
||||
* Changes:
|
||||
* **Removed the compatibility thing for Constructors, Deconstructors, and Energy Collectors** (there seems to have been a bug that was making it happen too much) meaning that **old worlds REALLY SHOULD NOT be updated to this version.** And they probably shouldn't have been updated to 5.0 either. So... sorry if I ruined things for you. In the future, I will try to make everything a lot more backwards-compatible.
|
||||
* ExchangeClone is now a modpack for [annoying reasons](https://forum.minetest.net/viewtopic.php?f=47&p=429775s).
|
||||
* Energy values are now in `zzzz_exchangeclone_init/base_energy_values.lua`, and are laid out differently, and aliases now work.
|
||||
* The default energy value is no longer 1 but none.
|
||||
* The 2.14-billion-ish personal energy limit is has been increased to 1,000,000,000,000 (1 trillion). Any higher (literally ANY higher) and there are precision-based exploits like being able to create an unlimited amount of anything with an energy value less than 1. I considered finding some library for arbitrary precision in Lua, but decided it was too much work (and nobody really needs more than a trillion energy anyway).
|
||||
* Energy values are now multiples of 0.05 instead of 0.25, for no real reason.
|
||||
* MineClon(e2/ia) energy values now (mostly) match ProjectE's, with a few minor differences, including these:
|
||||
* Emeralds are still worth less than diamonds because of villager trades (in my opinion, this should be changed in ProjectE as well)
|
||||
* Dyes are worth different amounts based on their crafting recipes, so different colors of things are worth different amounts.
|
||||
* Since fractional energy values are allowed, some energy values may be slightly different.
|
||||
* A couple changes involving the Philosopher's Stone:
|
||||
* Ender pearls can now be crafted with 4 iron and the Philosopher's Stone (MCL).
|
||||
* Copper's energy value has been changed (128 instead of 85), and the recipe has been changed accordingly.
|
||||
* Ice and obsidian can now be transmuted into water and lava, respectively.
|
||||
* It is now impossible to transmute between bedrock and barriers (MCL). I thought it was funny originally, but now I'm realizing that I don't want this to be annoying to people who run servers (are there any servers with this mod?)
|
||||
* It now costs 4 dark/red matter to make a block, which is great news if you already have some (because they're now worth more), but not so great if you don't. Sorry or you're welcome.
|
||||
* Tool abilities now have no energy cost (to match ProjectE).
|
||||
* Tool abilities now take upgrades into account (silk touch, fortune, etc.) except for the sword AOE ability (which would require irritating hacky workarounds).
|
||||
* Several neutral mobs (endermen, spiders, piglins) are now affected by the dark/red matter sword in "slay hostile" mode, to match ProjectE.
|
||||
* No more mod whitelist.
|
||||
* Bugfixes:
|
||||
* Fixed potion energy values (MCL)
|
||||
* Fixed Red Matter Shield recipe (MTG)
|
||||
* Fixed other modes of DM/RM tools not having energy values
|
||||
* Deconstructors and Constructors will now continue trying to work instead of just stopping when there is too much or too little energy.
|
||||
* Tool abilities now update nodes that require support (torches, sand, etc.).
|
||||
* MCL raw copper, iron, and gold blocks now correctly double in DM/RM furnaces.
|
||||
* Finally fixed that bug where things don't drop when exploded.
|
||||
|
||||
### v5.4
|
||||
* Fixed a minor bug with the Energy Collector (thanks @programmerjake!)
|
||||
* Now adding v's to version numbers... because it looks nice, I guess.
|
||||
|
||||
### 5.3
|
||||
* Fixed shearing beehives in MCL (thanks @Ranko-Saotome!)
|
||||
|
||||
### 5.2
|
||||
* Removed unnecessary logging (thanks @Ranko-Saotome!).
|
||||
* Removed unnecessary logging every time players take damage (I was testing stuff out with the armor, thanks @Ranko-Saotome for reporting)
|
||||
|
||||
### 5.1
|
||||
* Fixed Mineclonia energy values (I foolishly assumed that all items would have the same itemstrings and groups, thanks @Ranko-Saotome for reporting this).
|
||||
* Added new Mineclonia items (pottery, sculk, smithing templates, suspicious sand, etc.)
|
||||
* Changed a couple of energy values (enchanted golden apple was way too cheap, clay seemed too expensive)
|
||||
* Sword/Katar AOE damage now matches ProjectE (DM sword = 12, RM sword = 16, katar = 1000... kinda OP). All AOE cooldowns (including swinging swords/katar) are now 0.7 seconds.
|
||||
* DM/RM pickaxe/hammer/morningstar dig times now are approximately the same as ProjectE (at full charge), meaning they are now maybe too fast.
|
||||
* Red Matter Armor no longer increases player health (the wiki lied to me).
|
||||
* A couple of changes to DM/RM armor in MineClone, which may or may not be noticeable. I really don't know.
|
||||
* New Features:
|
||||
* Added new Mineclonia items (pottery, sculk, smithing templates, suspicious sand, etc.)
|
||||
* Changes:
|
||||
* Changed a couple of energy values (enchanted golden apple was way too cheap, clay seemed too expensive)
|
||||
* Sword/Katar AOE damage now matches ProjectE (DM sword = 12, RM sword = 16, katar = 1000... kinda OP). All AOE cooldowns (including swinging swords/katar) are now 0.7 seconds.
|
||||
* DM/RM pickaxe/hammer/morningstar dig times now are approximately the same as ProjectE (at full charge), meaning they are now probably annoying fast.
|
||||
* Red Matter Armor no longer increases player health (the wiki lied to me).
|
||||
* A couple of changes to DM/RM armor in MineClone, which may or may not be noticeable. I really don't know.
|
||||
* Bugfixes:
|
||||
* Fixed Mineclonia energy values (I foolishly assumed that all items would have the same itemstrings and groups, thanks @Ranko-Saotome for reporting this).
|
||||
|
||||
### 5.0 (the most insteresting release so far)
|
||||
**You MUST break and replace any existing Constructors, Deconstructors, and Energy Collectors when updating from any previous version. Nothing will be lost (hopefully). In Minetest Game, this is a bit of a problem (try blowing it up maybe? I don't know, sorry).**
|
||||
### 5.0 (bigger release than any before it)
|
||||
**I would recommend not updating to or past this version (any Constructors, Deconstructors, and Energy Collectors may become unusable...)**
|
||||
* New features:
|
||||
* Added a [wiki](https://github.com/ThePython10110/ExchangeClone/wiki)! This is where you can find more complete information on pretty much everything.
|
||||
* Because the wiki exists, I won't be including anywhere near as many details about how features work in the changelog.
|
||||
|
@ -89,6 +166,7 @@ Dependencies: Minetest Game or MineClone.
|
|||
* Energy values for [Portability](https://github.com/thepython10110/Portability).
|
||||
* Added energy value for Why's Falling Block Tool
|
||||
* Mod developers can now set their own energy values by setting `exchangeclone_custom_energy` in the item/node definition.
|
||||
* The Vital patch for the ExchangeClone ability sound is now included.
|
||||
* Changes
|
||||
* The changelog now has the most recent updates first, to make things easier to find.
|
||||
* Energy for Dark/Red Matter tool abilities (as well as the Transmutation Table) is no longer stored in an orb, but inside the player (called "personal energy").
|
||||
|
@ -112,10 +190,10 @@ Dependencies: Minetest Game or MineClone.
|
|||
* Fixed a couple of armor texture issues in Minetest Game (though it still looks like diamond armor; 3D Armor doesn't support texture modifiers)
|
||||
* The Red Katar is now actually craftable in Minetest Game (I just forgot that shears were only in MCL2)
|
||||
* A couple other minor things that I've forgotten about.
|
||||
* Fixed an error message about the `invert` texture modifier
|
||||
|
||||
### 4.4
|
||||
* New Features
|
||||
* Mineclonia Support
|
||||
* Added Mineclonia Support (or at least, I thought I did)
|
||||
* The version numbers kind of disagree around here and I'm too lazy to fix it.
|
||||
|
||||
### 4.3
|
||||
|
@ -130,13 +208,11 @@ Dependencies: Minetest Game or MineClone.
|
|||
* Exchange Orbs will now correctly display their energy value (I typed `orb` instead of `exchange_orb` in the energy value list)
|
||||
|
||||
### 4.2
|
||||
* Bugfixes:
|
||||
* Fixed a dependency error (thanks, @opfromthestart!)
|
||||
* Fixed a dependency error (thanks, @opfromthestart!)
|
||||
|
||||
### 4.1
|
||||
* Bugfixes:
|
||||
* Added energy values for new armor/tools
|
||||
* Removed unnecessary chestplate image (not only is it unused, but I put it in the wrong folder for some reason)
|
||||
* Added energy values for new armor/tools
|
||||
* Removed unnecessary chestplate image (not only is it unused, but I put it in the wrong folder for some reason)
|
||||
|
||||
### 4.0
|
||||
* New features:
|
||||
|
@ -155,15 +231,12 @@ Dependencies: Minetest Game or MineClone.
|
|||
* Fixed an issue where MineClone dispensers could ONLY be used with Dark/Red Matter Shears (whoops).
|
||||
|
||||
### 3.2
|
||||
* Changes:
|
||||
* Set MineClone mod namespace to `exchangeclone`
|
||||
* Set MineClone mod namespace to `exchangeclone`
|
||||
|
||||
### 3.1
|
||||
* Changes:
|
||||
* Added new energy values from Why (and Why's new Minetest Game energy values)
|
||||
* Bugfixes:
|
||||
* Fixed crash based on PESA inventory movement
|
||||
* Added `mcl_blackstone` to the mod whitelist
|
||||
* Added new energy values from Why (and Why's new Minetest Game energy values)
|
||||
* Fixed crash based on PESA inventory movement
|
||||
* Added `mcl_blackstone` to the mod whitelist
|
||||
|
||||
### 3.0 (the formerly most interesting release)
|
||||
* New features:
|
||||
|
@ -254,19 +327,9 @@ Dependencies: Minetest Game or MineClone.
|
|||
|
||||
</details>
|
||||
|
||||
### Plans for 6.0
|
||||
* Automatically generated energy values based on crafting recipes
|
||||
* A slightly better method for tools that break multiple nodes at once (hammer, hoe, pickaxe, morningstar, and katar) that may slightly decrease lag.
|
||||
* Alchemical Chest
|
||||
* Repair Talisman (maybe, would only work in Alchemical Chest)
|
||||
* Covalence Dust (maybe custom repairer machine)
|
||||
* Mind, Life, Body, and Soul Stones (although MTG will only have the soul stone).
|
||||
* Ability to smelt with the Philosopher's Stone and coal/charcoal (irritatingly difficult, so maybe not)
|
||||
* Mercurial Eye (maybe)
|
||||
* Energy Condenser (maybe, IDK why anyone would use it)
|
||||
|
||||
### Features that I plan on adding eventually:
|
||||
* As soon as Minetest 5.8 comes out, better textures for armor...
|
||||
* Achievements
|
||||
* ~~As soon as Minetest 5.8 comes out, better textures for armor...~~ Don't want to limit it to 5.8
|
||||
* Divining Rods
|
||||
* Rings (I'll probably add a new PESA-like item for holding rings)
|
||||
* Archangel's Smite (arrows will not track targets, MineClone only)
|
||||
|
@ -276,4 +339,9 @@ Dependencies: Minetest Game or MineClone.
|
|||
* Harvest Band (maybe not)
|
||||
* Ring of Arcana (possibly without the Harvest Band)
|
||||
* Gem Armor
|
||||
* Catalytic Lens
|
||||
* Catalytic Lens
|
||||
* Mind, Life, Body, and Soul Stones
|
||||
* Mercurial Eye
|
||||
* Talisman of Repair
|
||||
* Gem of Eternal Density
|
||||
* Probably other things
|
236
constructor.lua
|
@ -1,236 +0,0 @@
|
|||
local function get_constructor_formspec()
|
||||
if not exchangeclone.mcl then
|
||||
local formspec = {
|
||||
"size[8,9]",
|
||||
"label[2,1;Orb]",
|
||||
"list[context;fuel;2,2;1,1;]",
|
||||
"label[3,1;Source]",
|
||||
"list[context;src;3,2;1,1;]",
|
||||
"label[5,1;Output]",
|
||||
"list[context;dst;5,2;1,1;]",
|
||||
"list[current_player;main;0,5;8,4;]",
|
||||
"listring[current_player;main]",
|
||||
"listring[context;src]",
|
||||
"listring[current_player;main]",
|
||||
"listring[context;fuel]",
|
||||
"listring[current_player;main]",
|
||||
"listring[context;dst]",
|
||||
}
|
||||
return table.concat(formspec, "")
|
||||
else
|
||||
local formspec = {
|
||||
"size[9,10]",
|
||||
"label[2,1;Orb]",
|
||||
"list[context;fuel;2,2;1,1;]",
|
||||
mcl_formspec.get_itemslot_bg(2,2,1,1),
|
||||
"label[3,1;Source]",
|
||||
"list[context;src;3,2;1,1;]",
|
||||
mcl_formspec.get_itemslot_bg(3,2,1,1),
|
||||
"label[5,1;Output]",
|
||||
"list[context;dst;5,2;1,1;]",
|
||||
mcl_formspec.get_itemslot_bg(5,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[context;src]",
|
||||
"listring[current_player;main]",
|
||||
"listring[context;fuel]",
|
||||
"listring[current_player;main]",
|
||||
"listring[context;dst]",
|
||||
}
|
||||
return table.concat(formspec, "")
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_alias("exchangeclone:element_constructor", "exchangeclone:constructor")
|
||||
|
||||
-- Register LBM to update constructors
|
||||
minetest.register_lbm({
|
||||
name = "exchangeclone:constructor_alert",
|
||||
nodenames = {"exchangeclone:constructor"},
|
||||
run_at_every_load = false,
|
||||
action = function(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("formspec", "size[3,1]label[0,0;Break and replace.\nNothing will be lost.]")
|
||||
end,
|
||||
})
|
||||
|
||||
local function can_dig(pos, player)
|
||||
if exchangeclone.mcl then return true end
|
||||
local meta = minetest.get_meta(pos);
|
||||
local inv = meta:get_inventory()
|
||||
return inv:is_empty("fuel") and inv:is_empty("src") and inv:is_empty("dst")
|
||||
end
|
||||
|
||||
local function constructor_action(pos)
|
||||
local using_orb = true
|
||||
local player
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
if inv:get_stack("fuel", 1):get_name() ~= "exchangeclone:exchange_orb" then
|
||||
using_orb = false
|
||||
player = minetest.get_player_by_name(meta:get_string("exchangeclone_placer"))
|
||||
if not (player and player ~= "") then return end
|
||||
end
|
||||
local src_stack = inv:get_stack("src", 1)
|
||||
local dst_stack = inv:get_stack("dst", 1)
|
||||
|
||||
if not inv:is_empty("src") then
|
||||
-- make sure the stack at dst is same as the src (including enchantments)
|
||||
if not inv:is_empty("dst") then
|
||||
if src_stack:get_name() ~= dst_stack:get_name() then
|
||||
if exchangeclone.mcl then
|
||||
if not(string.sub(src_stack:get_name(), -10, -1) == "_enchanted"
|
||||
and string.sub(src_stack:get_name(), 1, -11) == dst_stack:get_name()
|
||||
and src_stack:get_name() ~= "mcl_core:apple_gold_enchanted") then
|
||||
return
|
||||
end
|
||||
else
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
local result = src_stack:get_name()
|
||||
if exchangeclone.mcl
|
||||
and string.sub(result, -10, -1) == "_enchanted"
|
||||
and result ~= "mcl_core:apple_gold_enchanted" then
|
||||
result = string.sub(src_stack:get_name(), 1, -11)
|
||||
end
|
||||
-- make sure orb/player has enough energy
|
||||
local current_energy
|
||||
if using_orb then
|
||||
current_energy = exchangeclone.get_orb_energy(inv, "fuel", 1)
|
||||
else
|
||||
current_energy = exchangeclone.get_player_energy(player)
|
||||
end
|
||||
local energy_value = exchangeclone.get_item_energy(src_stack:get_name())
|
||||
if energy_value > 0 then
|
||||
local max_amount = math.min(src_stack:get_stack_max(), math.floor(current_energy/energy_value))
|
||||
local added_amount = max_amount - inv:add_item("dst", ItemStack(result.." "..max_amount)):get_count()
|
||||
local result_energy = math.min(current_energy, current_energy - (energy_value * added_amount)) -- not sure if "math.min()" is necessary
|
||||
if using_orb then
|
||||
exchangeclone.set_orb_energy(inv, "fuel", 1, result_energy)
|
||||
else
|
||||
exchangeclone.set_player_energy(player, result_energy)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function on_construct(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
inv:set_size("fuel", 1)
|
||||
inv:set_size("src", 1)
|
||||
inv:set_size("dst", 1)
|
||||
meta:set_string("formspec", get_constructor_formspec())
|
||||
meta:set_string("infotext", "Constructor")
|
||||
end
|
||||
|
||||
local function allow_metadata_inventory_put(pos, listname, index, stack, player)
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
return 0
|
||||
end
|
||||
if listname == "fuel" then
|
||||
if stack:get_name() == "exchangeclone:exchange_orb" then
|
||||
return stack:get_count()
|
||||
else
|
||||
return 0
|
||||
end
|
||||
elseif listname == "src" then
|
||||
return stack:get_count()
|
||||
|
||||
elseif listname == "dst" then
|
||||
return 0
|
||||
end
|
||||
end
|
||||
|
||||
local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local stack = inv:get_stack(from_list, from_index)
|
||||
return allow_metadata_inventory_put(pos, to_list, to_index, stack, player)
|
||||
end
|
||||
|
||||
local function allow_metadata_inventory_take(pos, listname, index, stack, player)
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
return 0
|
||||
end
|
||||
return stack:get_count()
|
||||
end
|
||||
|
||||
local function on_blast(pos)
|
||||
local drops = {}
|
||||
exchangeclone.get_inventory_drops(pos, "fuel", drops)
|
||||
exchangeclone.get_inventory_drops(pos, "src", drops)
|
||||
exchangeclone.get_inventory_drops(pos, "dst", drops)
|
||||
drops[#drops+1] = "exchangeclone:constructor"
|
||||
minetest.remove_node(pos)
|
||||
return drops
|
||||
end
|
||||
|
||||
minetest.register_node("exchangeclone:constructor", {
|
||||
description = "Constructor",
|
||||
tiles = {
|
||||
"exchangeclone_constructor_up.png",
|
||||
"exchangeclone_constructor_down.png",
|
||||
"exchangeclone_constructor_right.png",
|
||||
"exchangeclone_constructor_right.png",
|
||||
"exchangeclone_constructor_right.png",
|
||||
"exchangeclone_constructor_right.png"
|
||||
},
|
||||
groups = {cracky = 2, container = 4, pickaxey = 2},
|
||||
_mcl_hardness = 3,
|
||||
_mcl_blast_resistance = 6,
|
||||
sounds = exchangeclone.sound_mod.node_sound_metal_defaults(),
|
||||
is_ground_content = false,
|
||||
can_dig = can_dig,
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, player)
|
||||
if exchangeclone.mcl then
|
||||
local meta = minetest.get_meta(pos)
|
||||
local meta2 = meta:to_table()
|
||||
meta:from_table(oldmetadata)
|
||||
local inv = meta:get_inventory()
|
||||
for _, listname in ipairs({"src", "dst", "fuel"}) do
|
||||
local stack = inv:get_stack(listname, 1)
|
||||
if not stack:is_empty() then
|
||||
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
|
||||
minetest.add_item(p, stack)
|
||||
end
|
||||
end
|
||||
meta:from_table(meta2)
|
||||
end
|
||||
end,
|
||||
after_place_node = function(pos, player, itemstack, pointed_thing)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("exchangeclone_placer", player:get_player_name())
|
||||
end,
|
||||
on_construct = on_construct,
|
||||
on_metadata_inventory_move = constructor_action,
|
||||
on_metadata_inventory_put = constructor_action,
|
||||
on_metadata_inventory_take = function(pos, listname, index, stack, player)
|
||||
if listname == "fuel" then return end
|
||||
constructor_action(pos)
|
||||
end,
|
||||
on_blast = on_blast,
|
||||
allow_metadata_inventory_put = allow_metadata_inventory_put,
|
||||
allow_metadata_inventory_move = allow_metadata_inventory_move,
|
||||
allow_metadata_inventory_take = allow_metadata_inventory_take,
|
||||
})
|
||||
|
||||
local recipe_ingredient = "default:pick_diamond"
|
||||
|
||||
if exchangeclone.mcl then
|
||||
recipe_ingredient = "mcl_tools:pick_diamond"
|
||||
end
|
||||
minetest.register_craft({
|
||||
type = "shaped",
|
||||
output = "exchangeclone:constructor",
|
||||
recipe = {
|
||||
{"", "exchangeclone:exchange_orb",""},
|
||||
{"", recipe_ingredient, ""},
|
||||
{"", "exchangeclone:exchange_orb", ""}
|
||||
}
|
||||
})
|
|
@ -1,216 +0,0 @@
|
|||
local function get_deconstructor_formspec()
|
||||
if not exchangeclone.mcl then
|
||||
local formspec = {
|
||||
"size[8,9]",
|
||||
"label[2,1;Items]",
|
||||
"list[context;src;2,2;1,1;]",
|
||||
"label[5,1;Orb]",
|
||||
"list[context;fuel;5,2;1,1;]",
|
||||
"list[current_player;main;0,5;8,4;]",
|
||||
"listring[current_player;main]",
|
||||
"listring[context;src]",
|
||||
"listring[current_player;main]",
|
||||
"listring[context;fuel]",
|
||||
}
|
||||
return table.concat(formspec, "")
|
||||
else
|
||||
local formspec = {
|
||||
"size[9,10]",
|
||||
"label[2,1;Items]",
|
||||
"list[context;src;2,2;1,1;]",
|
||||
mcl_formspec.get_itemslot_bg(2,2,1,1),
|
||||
"label[5,1;Orb]",
|
||||
"list[context;fuel;5,2;1,1;]",
|
||||
mcl_formspec.get_itemslot_bg(5,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[context;src]",
|
||||
"listring[current_player;main]",
|
||||
"listring[context;fuel]"
|
||||
}
|
||||
return table.concat(formspec, "")
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_alias("exchangeclone:element_deconstructor", "exchangeclone:deconstructor")
|
||||
|
||||
-- Register LBM to update deconstructors
|
||||
minetest.register_lbm({
|
||||
name = "exchangeclone:deconstructor_alert",
|
||||
nodenames = {"exchangeclone:deconstructor"},
|
||||
run_at_every_load = false,
|
||||
action = function(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("formspec", "size[3,1]label[0,0;Break and replace.\nNothing will be lost.]")
|
||||
end,
|
||||
})
|
||||
|
||||
local function can_dig(pos, player)
|
||||
if exchangeclone.mcl then return true end
|
||||
local meta = minetest.get_meta(pos);
|
||||
local inv = meta:get_inventory()
|
||||
return inv:is_empty("src") and inv:is_empty("fuel") and inv:is_empty("main")
|
||||
end
|
||||
|
||||
local function deconstructor_action(pos)
|
||||
local limit = exchangeclone.orb_max
|
||||
local using_orb = true
|
||||
local player
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
if inv:get_stack("fuel", 1):get_name() ~= "exchangeclone:exchange_orb" then
|
||||
limit = 2147483647
|
||||
using_orb = false
|
||||
player = minetest.get_player_by_name(meta:get_string("exchangeclone_placer"))
|
||||
if not (player and player ~= "") then return end
|
||||
end
|
||||
local stack = inv:get_stack("src", 1)
|
||||
local individual_energy_value = exchangeclone.get_item_energy(stack:get_name())
|
||||
if individual_energy_value <= 0 then return end
|
||||
local wear = stack:get_wear()
|
||||
if wear and wear > 1 then
|
||||
individual_energy_value = math.floor(individual_energy_value * (65536 / wear))
|
||||
end
|
||||
if stack:get_name() == "exchangeclone:exchange_orb" then
|
||||
individual_energy_value = individual_energy_value + exchangeclone.get_orb_itemstack_energy(stack)
|
||||
end
|
||||
local current_energy
|
||||
if using_orb then
|
||||
current_energy = exchangeclone.get_orb_energy(inv, "fuel", 1)
|
||||
else
|
||||
current_energy = exchangeclone.get_player_energy(player)
|
||||
end
|
||||
local max_count = math.floor((limit - current_energy)/individual_energy_value)
|
||||
local add_count = math.min(max_count, stack:get_count())
|
||||
local energy_value = individual_energy_value * add_count
|
||||
local result = current_energy + energy_value
|
||||
if result < 0 or result > limit then return end
|
||||
if using_orb then
|
||||
exchangeclone.set_orb_energy(inv, "fuel", 1, result)
|
||||
else
|
||||
exchangeclone.set_player_energy(player, result)
|
||||
end
|
||||
stack:set_count(stack:get_count() - add_count)
|
||||
if stack:get_count() == 0 then stack = ItemStack("") end
|
||||
inv:set_stack("src", 1, stack)
|
||||
end
|
||||
|
||||
local function on_construct(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
inv:set_size("src", 1)
|
||||
inv:set_size("fuel", 1)
|
||||
meta:set_string("formspec", get_deconstructor_formspec())
|
||||
meta:set_string("infotext", "Deconstructor")
|
||||
deconstructor_action(pos, 0)
|
||||
end
|
||||
|
||||
local function allow_metadata_inventory_put(pos, listname, index, stack, player)
|
||||
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
return 0
|
||||
end
|
||||
if listname == "fuel" then
|
||||
if stack:get_name() == "exchangeclone:exchange_orb" then
|
||||
return stack:get_count()
|
||||
else
|
||||
return 0
|
||||
end
|
||||
elseif listname == "src" then
|
||||
return stack:get_count()
|
||||
else
|
||||
return 0
|
||||
end
|
||||
end
|
||||
|
||||
local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local stack = inv:get_stack(from_list, from_index)
|
||||
return allow_metadata_inventory_put(pos, to_list, to_index, stack, player)
|
||||
end
|
||||
|
||||
local function allow_metadata_inventory_take(pos, listname, index, stack, player)
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
return 0
|
||||
end
|
||||
return stack:get_count()
|
||||
end
|
||||
|
||||
local function on_blast(pos)
|
||||
local drops = {}
|
||||
exchangeclone.get_inventory_drops(pos, "src", drops)
|
||||
exchangeclone.get_inventory_drops(pos, "fuel", drops)
|
||||
drops[#drops+1] = "exchangeclone:deconstructor"
|
||||
minetest.remove_node(pos)
|
||||
return drops
|
||||
end
|
||||
|
||||
minetest.register_node("exchangeclone:deconstructor", {
|
||||
description = "Deconstructor",
|
||||
tiles = {
|
||||
"exchangeclone_deconstructor_up.png",
|
||||
"exchangeclone_deconstructor_down.png",
|
||||
"exchangeclone_deconstructor_right.png",
|
||||
"exchangeclone_deconstructor_right.png",
|
||||
"exchangeclone_deconstructor_right.png",
|
||||
"exchangeclone_deconstructor_right.png"
|
||||
},
|
||||
groups = {cracky = 2, container = 4, pickaxey = 2},
|
||||
_mcl_hardness = 3,
|
||||
_mcl_blast_resistance = 6,
|
||||
sounds = exchangeclone.sound_mod.node_sound_metal_defaults(),
|
||||
is_ground_content = false,
|
||||
can_dig = can_dig,
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, player)
|
||||
if exchangeclone.mcl then
|
||||
local meta = minetest.get_meta(pos)
|
||||
local meta2 = meta:to_table()
|
||||
meta:from_table(oldmetadata)
|
||||
local inv = meta:get_inventory()
|
||||
for _, listname in ipairs({"src", "fuel"}) do
|
||||
local stack = inv:get_stack(listname, 1)
|
||||
if not stack:is_empty() then
|
||||
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
|
||||
minetest.add_item(p, stack)
|
||||
end
|
||||
end
|
||||
meta:from_table(meta2)
|
||||
end
|
||||
end,
|
||||
after_place_node = function(pos, player, itemstack, pointed_thing)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("exchangeclone_placer", player:get_player_name())
|
||||
end,
|
||||
on_timer = deconstructor_action,
|
||||
on_construct = on_construct,
|
||||
on_metadata_inventory_move = deconstructor_action,
|
||||
on_metadata_inventory_put = deconstructor_action,
|
||||
on_metadata_inventory_take = function(pos, listname, index, stack, player)
|
||||
if listname == "fuel" then return end
|
||||
deconstructor_action(pos)
|
||||
end,
|
||||
on_blast = on_blast,
|
||||
allow_metadata_inventory_put = allow_metadata_inventory_put,
|
||||
allow_metadata_inventory_move = allow_metadata_inventory_move,
|
||||
allow_metadata_inventory_take = allow_metadata_inventory_take,
|
||||
})
|
||||
|
||||
local recipe_ingredient = "default:furnace"
|
||||
|
||||
if exchangeclone.mcl then
|
||||
recipe_ingredient = "mcl_furnaces:furnace"
|
||||
end
|
||||
|
||||
minetest.register_craft({
|
||||
type = "shaped",
|
||||
output = "exchangeclone:deconstructor",
|
||||
recipe = {
|
||||
{"", "exchangeclone:exchange_orb",""},
|
||||
{"", recipe_ingredient, ""},
|
||||
{"", "exchangeclone:exchange_orb", ""}
|
||||
}
|
||||
})
|
1981
energy.lua
|
@ -0,0 +1,192 @@
|
|||
local S = minetest.get_translator()
|
||||
|
||||
-- color is nil for regular alchemical chests (not advanced/bags)
|
||||
local function alchemical_formspec(color)
|
||||
local listname, label
|
||||
local centered = exchangeclone.mcl and 2 or 2.5
|
||||
if color then
|
||||
local codified_color = string.lower(color):gsub(" ", "_")
|
||||
listname = "current_player;"..codified_color.."_alchemical_inventory"
|
||||
label = S("@1 Alchemical Inventory", color)
|
||||
else
|
||||
listname = "context;main"
|
||||
label = S("Alchemical Chest")
|
||||
end
|
||||
local formspec =
|
||||
"size[14,13]"..
|
||||
"label[0.25,0.0;"..label.."]"..
|
||||
"list["..listname..";0,0.5;13,8]"..
|
||||
exchangeclone.inventory_formspec(centered, 9)..
|
||||
"listring[current_player;main]"..
|
||||
"listring["..listname.."]"
|
||||
if exchangeclone.mcl then
|
||||
formspec = formspec..mcl_formspec.get_itemslot_bg(0,0.5,13,8)
|
||||
end
|
||||
return formspec
|
||||
end
|
||||
|
||||
local function alchemical_on_construct(color)
|
||||
return function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("formspec", alchemical_formspec(color))
|
||||
meta:set_string("infotext", color.." Advanced Alchemical Chest")
|
||||
end
|
||||
end
|
||||
|
||||
local pipeworks_connect = exchangeclone.pipeworks and "^pipeworks_tube_connection_stony.png" or ""
|
||||
|
||||
minetest.register_node("exchangeclone:alchemical_chest", {
|
||||
description = S("Alchemical Chest"),
|
||||
groups = {container = 2, alchemical_chest = 1, cracky = 2, pickaxey = 2, tubedevice = 1, tubedevice_receiver = 1},
|
||||
_mcl_hardness = 3,
|
||||
_mcl_blast_resistance = 6,
|
||||
paramtype2 = "4dir",
|
||||
tiles = {
|
||||
"exchangeclone_alchemical_chest_top.png"..pipeworks_connect,
|
||||
"exchangeclone_alchemical_chest_bottom.png"..pipeworks_connect,
|
||||
"exchangeclone_alchemical_chest_side.png"..pipeworks_connect,
|
||||
"exchangeclone_alchemical_chest_side.png"..pipeworks_connect,
|
||||
"exchangeclone_alchemical_chest_side.png"..pipeworks_connect,
|
||||
"exchangeclone_alchemical_chest_front.png"..pipeworks_connect,
|
||||
},
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
meta:set_string("formspec", alchemical_formspec())
|
||||
meta:set_string("infotext", S("Alchemical Chest"))
|
||||
inv:set_size("main", 104)
|
||||
inv:set_width("main", 13)
|
||||
end,
|
||||
tube = exchangeclone.pipeworks and {
|
||||
input_inventory = "main",
|
||||
connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1},
|
||||
insert_object = function(pos, node, stack, direction)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local result = inv:add_item("main", stack)
|
||||
if result then
|
||||
local func = minetest.registered_items[node.name].on_metadata_inventory_put
|
||||
if func then func(pos) end
|
||||
end
|
||||
return result
|
||||
end
|
||||
},
|
||||
on_blast = exchangeclone.on_blast({"main"}),
|
||||
on_rotate = exchangeclone.pipeworks and pipeworks.on_rotate,
|
||||
after_place_node = exchangeclone.pipeworks and pipeworks.after_place,
|
||||
after_dig_node = exchangeclone.drop_after_dig({"main"}),
|
||||
can_dig = exchangeclone.can_dig,
|
||||
})
|
||||
|
||||
local stone_itemstring = exchangeclone.mcl and "mcl_core:stone" or "default:stone"
|
||||
local chest_itemstring = exchangeclone.mcl and "mcl_chests:chest" or "default:chest"
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:alchemical_chest",
|
||||
recipe = {
|
||||
{"exchangeclone:low_covalence_dust", "exchangeclone:medium_covalence_dust", "exchangeclone:high_covalence_dust"},
|
||||
{stone_itemstring, exchangeclone.itemstrings.diamond, stone_itemstring},
|
||||
{exchangeclone.itemstrings.iron, chest_itemstring, exchangeclone.itemstrings.iron}
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_on_joinplayer(function(player, last_login)
|
||||
local inv = player:get_inventory()
|
||||
for color, color_data in pairs(exchangeclone.colors) do
|
||||
inv:set_size(color.."_alchemical_inventory", 104)
|
||||
inv:set_width(color.."_alchemical_inventory", 13)
|
||||
end
|
||||
end)
|
||||
|
||||
for color, color_data in pairs(exchangeclone.colors) do
|
||||
local bag_itemstring = "exchangeclone:alchemical_bag_"..color
|
||||
local advanced_itemstring = "exchangeclone:advanced_alchemical_chest_"..color
|
||||
local wool_itemstring = (exchangeclone.mcl and "mcl_wool:" or "wool:")..color
|
||||
local dye_itemstring = (exchangeclone.mcl and "mcl_dye:" or "dye:")..color
|
||||
|
||||
local bag_modifier = "^[multiply:"..color_data.hex
|
||||
if color == "white" then bag_modifier = "" end
|
||||
if color == "black" then bag_modifier = "^[invert:rgb" end
|
||||
local chest_modifier = bag_modifier
|
||||
if color == "black" then chest_modifier = "^[invert:rgb^[colorize:#000000:220" end
|
||||
|
||||
local function alchemical_bag_action(itemstack, player, pointed_thing)
|
||||
local click_test = exchangeclone.check_on_rightclick(itemstack, player, pointed_thing)
|
||||
if click_test ~= false then
|
||||
return click_test
|
||||
end
|
||||
if pointed_thing.type == "node"
|
||||
and minetest.get_item_group(minetest.get_node(pointed_thing.under).name, "advanced_alchemical_chest") > 0 then
|
||||
if minetest.is_protected(player) then
|
||||
minetest.record_protection_violation(player)
|
||||
else
|
||||
minetest.set_node(pointed_thing.under, {name=advanced_itemstring})
|
||||
local on_construct = alchemical_on_construct(color_data.name)
|
||||
on_construct(pointed_thing.under)
|
||||
return
|
||||
end
|
||||
else
|
||||
minetest.show_formspec(player:get_player_name(), bag_itemstring, alchemical_formspec(color_data.name))
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_tool(bag_itemstring, {
|
||||
description = S("@1 Alchemical Bag", color_data.name),
|
||||
inventory_image = "exchangeclone_alchemical_bag.png"..bag_modifier,
|
||||
wield_image = "exchangeclone_alchemical_bag.png"..bag_modifier,
|
||||
groups = {disable_repair = 1, alchemical_bag = 1},
|
||||
on_secondary_use = alchemical_bag_action,
|
||||
on_place = alchemical_bag_action
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = bag_itemstring,
|
||||
recipe = {
|
||||
{"exchangeclone:high_covalence_dust", "exchangeclone:high_covalence_dust", "exchangeclone:high_covalence_dust"},
|
||||
{wool_itemstring, "exchangeclone:alchemical_chest", wool_itemstring},
|
||||
{wool_itemstring, wool_itemstring, wool_itemstring},
|
||||
}
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = bag_itemstring,
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
"group:alchemical_bag",
|
||||
dye_itemstring
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_node(advanced_itemstring, {
|
||||
description = S("@1 Advanced Alchemical Chest", color_data.name).."\n"..S("Shift+right-click with an alchemical bag to change the color."),
|
||||
_mcl_hardness = 3,
|
||||
_mcl_blast_resistance = 6,
|
||||
groups = {container = 1, advanced_alchemical_chest = 1, cracky = 2, pickaxey = 2},
|
||||
paramtype2 = "4dir",
|
||||
tiles = {
|
||||
"exchangeclone_advanced_alchemical_chest_top.png"..chest_modifier,
|
||||
"exchangeclone_advanced_alchemical_chest_bottom.png"..chest_modifier,
|
||||
"exchangeclone_advanced_alchemical_chest_side.png"..chest_modifier,
|
||||
"exchangeclone_advanced_alchemical_chest_side.png"..chest_modifier,
|
||||
"exchangeclone_advanced_alchemical_chest_side.png"..chest_modifier,
|
||||
"exchangeclone_advanced_alchemical_chest_front.png"..chest_modifier,
|
||||
},
|
||||
on_construct = alchemical_on_construct(color_data.name)
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = advanced_itemstring,
|
||||
recipe = {
|
||||
{"exchangeclone:dark_matter", "exchangeclone:low_covalence_dust", "exchangeclone:dark_matter"},
|
||||
{"exchangeclone:medium_covalence_dust", "exchangeclone:alchemical_bag_"..color, "exchangeclone:medium_covalence_dust"},
|
||||
{"exchangeclone:high_covalence_dust", "exchangeclone:low_covalence_dust", "exchangeclone:high_covalence_dust"},
|
||||
}
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = advanced_itemstring,
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
"group:advanced_alchemical_chest",
|
||||
dye_itemstring
|
||||
}
|
||||
})
|
||||
end
|
|
@ -1,12 +1,15 @@
|
|||
local S = minetest.get_translator()
|
||||
|
||||
-- true = blocks all damage
|
||||
-- {base_block, block_per_rm}: Amount blocked by full dark matter, extra amount per red matter armor piece
|
||||
-- only applies in MCL
|
||||
local blocked_damage_types = {
|
||||
drown = true,
|
||||
lava = true,
|
||||
in_fire = true,
|
||||
on_fire = true,
|
||||
hot_floor = true,
|
||||
fall = {0.9, 0.0125},
|
||||
fall = {0.8, exchangeclone.mcl and 0.025 or 0.02},
|
||||
}
|
||||
|
||||
local function get_armor_texture(type, matter, preview)
|
||||
|
@ -47,11 +50,11 @@ if exchangeclone.mcl then
|
|||
mcl_armor.register_set({
|
||||
name = "dark_matter",
|
||||
description = "Dark Matter",
|
||||
descriptions = exchangeclone.mineclonia and {
|
||||
head = "Dark Matter Helmet",
|
||||
torso = "Dark Matter Chestplate",
|
||||
legs = "Dark Matter Leggings",
|
||||
feet = "Dark Matter Boots"
|
||||
descriptions = exchangeclone.mcla and {
|
||||
head = S("Dark Matter Helmet"),
|
||||
torso = S("Dark Matter Chestplate"),
|
||||
legs = S("Dark Matter Leggings"),
|
||||
feet = S("Dark Matter Boots")
|
||||
},
|
||||
durability = -1,
|
||||
enchantability = 0,
|
||||
|
@ -75,11 +78,11 @@ if exchangeclone.mcl then
|
|||
mcl_armor.register_set({
|
||||
name = "red_matter",
|
||||
description = "Red Matter",
|
||||
descriptions = exchangeclone.mineclonia and {
|
||||
head = "Red Matter Helmet",
|
||||
torso = "Red Matter Chestplate",
|
||||
legs = "Red Matter Leggings",
|
||||
feet = "Red Matter Boots"
|
||||
descriptions = exchangeclone.mcla and {
|
||||
head = S("Red Matter Helmet"),
|
||||
torso = S("Red Matter Chestplate"),
|
||||
legs = S("Red Matter Leggings"),
|
||||
feet = S("Red Matter Boots")
|
||||
},
|
||||
durability = -1,
|
||||
enchantability = 0,
|
||||
|
@ -101,8 +104,8 @@ if exchangeclone.mcl then
|
|||
cook_material = "exchangeclone:dark_matter",
|
||||
})
|
||||
|
||||
for _, matter in ipairs({"dark", "red"}) do
|
||||
for _, type in ipairs({"helmet", "chestplate", "leggings", "boots"}) do
|
||||
for _, matter in pairs({"dark", "red"}) do
|
||||
for _, type in pairs({"helmet", "chestplate", "leggings", "boots"}) do
|
||||
minetest.override_item("exchangeclone:"..type.."_"..matter.."_matter", {
|
||||
inventory_image = get_armor_texture("inv_"..type, matter),
|
||||
wield_image = get_armor_texture("inv_"..type, matter),
|
||||
|
@ -111,7 +114,6 @@ if exchangeclone.mcl then
|
|||
end
|
||||
|
||||
mcl_damage.register_modifier(function(obj, damage, reason)
|
||||
--minetest.log(dump({damage, reason}))
|
||||
local blocked = blocked_damage_types[reason.type]
|
||||
local inv = mcl_util.get_inventory(obj)
|
||||
if inv then
|
||||
|
@ -141,7 +143,7 @@ if exchangeclone.mcl then
|
|||
end)
|
||||
else
|
||||
armor:register_armor("exchangeclone:helmet_dark_matter", {
|
||||
description = "Dark Matter Helmet",
|
||||
description = S("Dark Matter Helmet"),
|
||||
texture = get_armor_texture("helmet","dark"),
|
||||
inventory_image = get_armor_texture("inv_helmet","dark"),
|
||||
preview = get_armor_texture("helmet","dark", true),
|
||||
|
@ -149,7 +151,7 @@ else
|
|||
groups = {armor_head = 1, dark_matter_armor = 1, armor_heal = 5, armor_fire = 1, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
|
||||
})
|
||||
armor:register_armor("exchangeclone:chestplate_dark_matter", {
|
||||
description = "Dark Matter Chestplate",
|
||||
description = S("Dark Matter Chestplate"),
|
||||
texture = get_armor_texture("chestplate","dark"),
|
||||
inventory_image = get_armor_texture("inv_chestplate","dark"),
|
||||
preview = get_armor_texture("chestplate","dark", true),
|
||||
|
@ -157,7 +159,7 @@ else
|
|||
groups = {armor_torso = 1, dark_matter_armor = 1, armor_heal = 8, armor_fire = 2, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
|
||||
})
|
||||
armor:register_armor("exchangeclone:leggings_dark_matter", {
|
||||
description = "Dark Matter Leggings",
|
||||
description = S("Dark Matter Leggings"),
|
||||
texture = get_armor_texture("leggings","dark"),
|
||||
inventory_image = get_armor_texture("inv_leggings","dark"),
|
||||
preview = get_armor_texture("leggings","dark", true),
|
||||
|
@ -165,7 +167,7 @@ else
|
|||
groups = {armor_legs = 1, dark_matter_armor = 1, armor_heal = 7, armor_fire = 1, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
|
||||
})
|
||||
armor:register_armor("exchangeclone:boots_dark_matter", {
|
||||
description = "Dark Matter Boots",
|
||||
description = S("Dark Matter Boots"),
|
||||
texture = get_armor_texture("boots","dark"),
|
||||
inventory_image = get_armor_texture("inv_boots","dark"),
|
||||
preview = get_armor_texture("boots","dark", true),
|
||||
|
@ -173,7 +175,7 @@ else
|
|||
groups = {armor_feet = 1, dark_matter_armor = 1, armor_heal = 4, armor_fire = 1, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
|
||||
})
|
||||
armor:register_armor("exchangeclone:shield_dark_matter", {
|
||||
description = "Dark Matter Shield",
|
||||
description = S("Dark Matter Shield"),
|
||||
texture = get_armor_texture("shield","dark"),
|
||||
inventory_image = get_armor_texture("inv_shield","dark"),
|
||||
preview = get_armor_texture("shield","dark", true),
|
||||
|
@ -181,7 +183,7 @@ else
|
|||
groups = {armor_shield = 1, dark_matter_armor = 1, armor_heal = 7, armor_fire = 1, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
|
||||
})
|
||||
armor:register_armor("exchangeclone:helmet_red_matter", {
|
||||
description = "Red Matter Helmet",
|
||||
description = S("Red Matter Helmet"),
|
||||
texture = get_armor_texture("helmet","red"),
|
||||
inventory_image = get_armor_texture("inv_helmet","red"),
|
||||
preview = get_armor_texture("helmet","red", true),
|
||||
|
@ -189,7 +191,7 @@ else
|
|||
groups = {armor_head = 1, red_matter_armor = 1, armor_heal = 10, armor_fire = 2, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
|
||||
})
|
||||
armor:register_armor("exchangeclone:chestplate_red_matter", {
|
||||
description = "Red Matter Chestplate",
|
||||
description = S("Red Matter Chestplate"),
|
||||
texture = get_armor_texture("chestplate","red"),
|
||||
inventory_image = get_armor_texture("inv_chestplate","red"),
|
||||
preview = get_armor_texture("chestplate","red", true),
|
||||
|
@ -197,7 +199,7 @@ else
|
|||
groups = {armor_torso = 1, red_matter_armor = 1, armor_heal = 16, armor_fire = 2, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
|
||||
})
|
||||
armor:register_armor("exchangeclone:leggings_red_matter", {
|
||||
description = "Red Matter Leggings",
|
||||
description = S("Red Matter Leggings"),
|
||||
texture = get_armor_texture("leggings","red"),
|
||||
inventory_image = get_armor_texture("inv_leggings","red"),
|
||||
preview = get_armor_texture("leggings","red", true),
|
||||
|
@ -205,7 +207,7 @@ else
|
|||
groups = {armor_legs = 1, red_matter_armor = 1, armor_heal = 14, armor_fire = 2, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
|
||||
})
|
||||
armor:register_armor("exchangeclone:boots_red_matter", {
|
||||
description = "Red Matter Boots",
|
||||
description = S("Red Matter Boots"),
|
||||
texture = get_armor_texture("boots","red"),
|
||||
inventory_image = get_armor_texture("inv_boots","red"),
|
||||
preview = get_armor_texture("boots","red", true),
|
||||
|
@ -213,7 +215,7 @@ else
|
|||
groups = {armor_feet = 1, red_matter_armor = 1, armor_heal = 8, armor_fire = 2, armor_water = 1, disable_repair = 1, exchangeclone_upgradable = 1}
|
||||
})
|
||||
armor:register_armor("exchangeclone:shield_red_matter", {
|
||||
description = "Red Matter Shield",
|
||||
description = S("Red Matter Shield"),
|
||||
texture = get_armor_texture("shield","red"),
|
||||
inventory_image = get_armor_texture("inv_shield","red"),
|
||||
preview = get_armor_texture("shield","red", true),
|
||||
|
@ -295,9 +297,9 @@ if minetest.get_modpath("3d_armor") then
|
|||
minetest.register_craft({
|
||||
output = "exchangeclone:shield_red_matter",
|
||||
recipe = {
|
||||
{d,d,d},
|
||||
{d,d,d},
|
||||
{"exchangeclone:shield_dark_matter",d,""},
|
||||
{r,r,r},
|
||||
{r,r,r},
|
||||
{"exchangeclone:shield_dark_matter",r,""},
|
||||
}
|
||||
})
|
||||
end
|
||||
end
|
|
@ -1,19 +1,20 @@
|
|||
local S = minetest.get_translator()
|
||||
|
||||
exchangeclone.axe_action = {
|
||||
start_action = function(player, center, range)
|
||||
start_action = function(player, center, range, itemstack)
|
||||
if exchangeclone.check_cooldown(player, "axe") then return end
|
||||
local data = {}
|
||||
data.player_energy = exchangeclone.get_player_energy(player)
|
||||
data.energy_cost = 0
|
||||
if exchangeclone.mcl then
|
||||
data.strip = not player:get_player_control().sneak
|
||||
end
|
||||
if range > 0 or not data.strip then
|
||||
exchangeclone.play_ability_sound(player)
|
||||
end
|
||||
data.itemstack = itemstack
|
||||
data.remove_positions = {}
|
||||
return data
|
||||
end,
|
||||
action = function(player, pos, node, data)
|
||||
if data.energy_cost + 8 > data.player_energy then return end
|
||||
local node_def = minetest.registered_items[node.name]
|
||||
if (node_def.groups.tree or node_def.groups.leaves) then
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
|
@ -21,22 +22,20 @@ exchangeclone.axe_action = {
|
|||
else
|
||||
if data.strip then
|
||||
if node_def._mcl_stripped_variant ~= nil then
|
||||
data.energy_cost = data.energy_cost + 4
|
||||
minetest.swap_node(pos, {name=node_def._mcl_stripped_variant, param2=node.param2})
|
||||
end
|
||||
else
|
||||
data.energy_cost = data.energy_cost + 8
|
||||
local drops = minetest.get_node_drops(node.name, "exchangeclone:red_matter_axe")
|
||||
local drops = minetest.get_node_drops(node.name, data.itemstack)
|
||||
exchangeclone.drop_items_on_player(pos, drops, player)
|
||||
minetest.set_node(pos, {name = "air"})
|
||||
table.insert(data.remove_positions, pos)
|
||||
end
|
||||
end
|
||||
end
|
||||
return data
|
||||
end,
|
||||
end_action = function(player, center, range, data)
|
||||
exchangeclone.remove_nodes(data.remove_positions)
|
||||
if range > 0 or not data.strip then
|
||||
exchangeclone.set_player_energy(player, data.player_energy - data.energy_cost)
|
||||
exchangeclone.start_cooldown(player, "axe", range/6)
|
||||
end
|
||||
end
|
||||
|
@ -60,15 +59,15 @@ local function axe_on_place(itemstack, player, pointed_thing)
|
|||
|
||||
local center = player:get_pos()
|
||||
if pointed_thing.type == "node" then center = pointed_thing.under end
|
||||
exchangeclone.node_radius_action(player, center, range, exchangeclone.axe_action)
|
||||
exchangeclone.node_radius_action(player, center, range, exchangeclone.axe_action, itemstack)
|
||||
return itemstack
|
||||
end
|
||||
|
||||
minetest.register_tool("exchangeclone:dark_matter_axe", {
|
||||
description = "Dark Matter Axe",
|
||||
description = S("Dark Matter Axe"),
|
||||
wield_image = "exchangeclone_dark_matter_axe.png",
|
||||
inventory_image = "exchangeclone_dark_matter_axe.png",
|
||||
groups = { tool=1, axe=1, dig_speed_class=7, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
groups = { tool=1, axe=1, dig_speed_class=5, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
wield_scale = exchangeclone.wield_scale,
|
||||
tool_capabilities = {
|
||||
-- 1/1.2
|
||||
|
@ -85,15 +84,15 @@ minetest.register_tool("exchangeclone:dark_matter_axe", {
|
|||
on_secondary_use = axe_on_place,
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
axey = { speed = 16, level = 7, uses = 0 }
|
||||
axey = { speed = 16, level = 5, uses = 0 }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_tool("exchangeclone:red_matter_axe", {
|
||||
description = "Red Matter Axe",
|
||||
description = S("Red Matter Axe"),
|
||||
wield_image = "exchangeclone_red_matter_axe.png",
|
||||
inventory_image = "exchangeclone_red_matter_axe.png",
|
||||
groups = { tool=1, axe=1, dig_speed_class=8, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
groups = { tool=1, axe=1, dig_speed_class=6, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
wield_scale = exchangeclone.wield_scale,
|
||||
tool_capabilities = {
|
||||
-- 1/1.2
|
||||
|
@ -110,7 +109,7 @@ minetest.register_tool("exchangeclone:red_matter_axe", {
|
|||
on_secondary_use = axe_on_place,
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
axey = { speed = 20, level = 8, uses = 0 }
|
||||
axey = { speed = 20, level = 6, uses = 0 }
|
||||
},
|
||||
})
|
||||
|
||||
|
@ -118,8 +117,8 @@ minetest.register_craft({
|
|||
output = "exchangeclone:dark_matter_axe",
|
||||
recipe = {
|
||||
{"exchangeclone:dark_matter", "exchangeclone:dark_matter"},
|
||||
{"exchangeclone:dark_matter", exchangeclone.diamond_itemstring},
|
||||
{"", exchangeclone.diamond_itemstring}
|
||||
{"exchangeclone:dark_matter", exchangeclone.itemstrings.diamond},
|
||||
{"", exchangeclone.itemstrings.diamond}
|
||||
}
|
||||
})
|
||||
|
|
@ -0,0 +1,162 @@
|
|||
-- Currently none of this stuff actually runs (didn't get to it in v6.0)
|
||||
|
||||
local S = minetest.get_translator()
|
||||
|
||||
local storage = minetest.get_mod_storage()
|
||||
exchangeclone.bauble_data = minetest.deserialize(storage:get_string("bauble_data"))
|
||||
|
||||
--[[
|
||||
|
||||
Bauble data format:
|
||||
{
|
||||
action_name = {
|
||||
player = {
|
||||
player_name = true,
|
||||
player_name = true,
|
||||
}
|
||||
detached = {
|
||||
detached_name = true,
|
||||
detached_name = true,
|
||||
}
|
||||
node = {
|
||||
pos_string = true,
|
||||
pos_string = true,
|
||||
}
|
||||
}
|
||||
}
|
||||
For example:
|
||||
{
|
||||
repair = {
|
||||
player = {
|
||||
"singleplayer",
|
||||
"ThePython"
|
||||
},
|
||||
detached = {
|
||||
"exchangeclone_transmutation_ThePython",
|
||||
}
|
||||
node = {
|
||||
["(0,0,0)"] = true,
|
||||
["(0,999,0)"] = true,
|
||||
}
|
||||
}
|
||||
density = {
|
||||
player = {
|
||||
"singleplayer"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
What is done with these values must be handled by the actions themselves.
|
||||
|
||||
--]]
|
||||
|
||||
local time = 0
|
||||
local saving_time = 0
|
||||
|
||||
function exchangeclone.run_bauble_actions()
|
||||
for _, data in ipairs(exchangeclone.bauble_data) do
|
||||
for _, action in ipairs(data[2]) do
|
||||
local func = exchangeclone.bauble_actions[action]
|
||||
if func then func(data) end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_on_globalstep(function(dtime)
|
||||
time = time + dtime
|
||||
saving_time = saving_time + dtime
|
||||
if time >= 1 then
|
||||
exchangeclone.run_bauble_actions()
|
||||
time = 0
|
||||
end
|
||||
end)
|
||||
|
||||
function exchangeclone.show_baubles(player)
|
||||
local formspec
|
||||
minetest.show_formspec(player:get_name(), "exchangeclone_baubles", formspec)
|
||||
end
|
||||
|
||||
minetest.register_tool("exchangeclone:bauble_accessor", {
|
||||
description = S("Bauble Accessor"),
|
||||
groups = {disable_repair = 1},
|
||||
})
|
||||
|
||||
minetest.register_tool("exchangeclone:repair_talisman", {
|
||||
description = S("Repair Talisman"),
|
||||
groups = {disable_repair = 1, bauble = 1},
|
||||
bauble_info = {
|
||||
action = "repair",
|
||||
hotbar = true
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_tool("exchangeclone:gem_of_eternal_density", {
|
||||
description = S("Gem of Eternal Density"),
|
||||
groups = {disable_repair = 1, bauble = 1},
|
||||
bauble_info = {
|
||||
action = "density",
|
||||
hotbar = true
|
||||
}
|
||||
})
|
||||
|
||||
function exchangeclone.check_baubles(inv, list)
|
||||
if not inv then return end
|
||||
list = list or "main"
|
||||
end
|
||||
|
||||
minetest.register_on_player_inventory_action(function(player, action, inventory, info)
|
||||
-- Make sure that it's the player owning the inventory, not just the player editing the inventory
|
||||
player = minetest.get_player_by_name(inventory:get_location().name)
|
||||
if not player then return end
|
||||
if action == "move" then
|
||||
local stack = inventory:get_stack(info.to_list, info.to_index)
|
||||
if stack:is_empty() then return end
|
||||
local def = minetest.registered_items[stack:get_name()]
|
||||
if not (def and def.groups.bauble) then return end
|
||||
|
||||
end
|
||||
end)
|
||||
|
||||
local function repair_item(stack)
|
||||
if not stack:is_empty() then
|
||||
local def = minetest.registered_items[stack:get_name()]
|
||||
if def
|
||||
and def.type == "tool"
|
||||
and (not def.wear_represents or def.wear_represents == "mechanical_wear")
|
||||
and stack:get_wear() ~= 0
|
||||
and ((exchangeclone.mcl and def.durability > 0) or exchangeclone.mtg) then
|
||||
local uses
|
||||
if exchangeclone.mcl then
|
||||
if def.durability then
|
||||
uses = def.durability
|
||||
elseif def._mcl_diggroups then
|
||||
uses = def._mcl_diggroups[1].uses
|
||||
end
|
||||
else
|
||||
if def.tool_capabilities and def.tool_capabilities.groupcaps then
|
||||
local groupcaps = def.tool_capabilities.groupcaps[1]
|
||||
uses = groupcaps.uses*math.pow(3, groupcaps.max_level)
|
||||
elseif def.groups.armor_use then
|
||||
uses = def.groups.armor_use
|
||||
end
|
||||
end
|
||||
if not uses then uses = 1000 end
|
||||
if uses then
|
||||
stack:set_wear(stack:get_wear() + 65535/uses)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return stack
|
||||
end
|
||||
|
||||
exchangeclone.bauble_actions = {
|
||||
repair = function(data)
|
||||
for _, player in ipairs(data.player) do
|
||||
local inv = player:get_inventory()
|
||||
for i = 1, inv:get_size("main") do
|
||||
inv:set_stack("main", i, repair_item(inv:get_stack("main", i)))
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
|
@ -0,0 +1,214 @@
|
|||
local S = minetest.get_translator()
|
||||
|
||||
local formspec =
|
||||
"size["..(exchangeclone.mcl and 9 or 8)..",9]"..
|
||||
"label[2,1;"..S("Orb").."]"..
|
||||
"list[context;fuel;2,2;1,1;]"..
|
||||
"label[3,1;"..S("Source").."]"..
|
||||
"list[context;src;3,2;1,1;]"..
|
||||
"label[5,1;"..S("Output").."]"..
|
||||
"list[context;dst;5,2;1,1;]"..
|
||||
exchangeclone.inventory_formspec(0,5)..
|
||||
"listring[current_player;main]"..
|
||||
"listring[context;src]"..
|
||||
"listring[current_player;main]"..
|
||||
"listring[context;fuel]"..
|
||||
"listring[current_player;main]"..
|
||||
"listring[context;dst]"
|
||||
if exchangeclone.mcl then
|
||||
formspec = formspec..
|
||||
mcl_formspec.get_itemslot_bg(2,2,1,1)..
|
||||
mcl_formspec.get_itemslot_bg(3,2,1,1)..
|
||||
mcl_formspec.get_itemslot_bg(5,2,1,1)
|
||||
end
|
||||
|
||||
minetest.register_alias("exchangeclone:element_constructor", "exchangeclone:constructor")
|
||||
|
||||
local function constructor_action(pos)
|
||||
local using_orb = true
|
||||
local player
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
if inv:get_stack("fuel", 1):get_name() ~= "exchangeclone:exchange_orb" then
|
||||
using_orb = false
|
||||
player = minetest.get_player_by_name(meta:get_string("exchangeclone_placer"))
|
||||
if not (player and player ~= "") then return end
|
||||
end
|
||||
local src_stack = inv:get_stack("src", 1)
|
||||
local dst_stack = inv:get_stack("dst", 1)
|
||||
|
||||
if not inv:is_empty("src") then
|
||||
-- make sure the stack at dst is same as the src (including enchantments)
|
||||
if not inv:is_empty("dst") then
|
||||
if exchangeclone.handle_alias(src_stack) ~= dst_stack:get_name() then
|
||||
return
|
||||
end
|
||||
end
|
||||
local result = exchangeclone.handle_alias(src_stack)
|
||||
-- make sure orb/player has enough energy
|
||||
local current_energy
|
||||
if using_orb then
|
||||
current_energy = exchangeclone.get_orb_energy(inv, "fuel", 1)
|
||||
else
|
||||
current_energy = exchangeclone.get_player_energy(player)
|
||||
end
|
||||
local energy_value = exchangeclone.get_item_energy(src_stack:get_name())
|
||||
if energy_value and energy_value > 0 then
|
||||
local max_amount = math.min(src_stack:get_stack_max(), math.floor(current_energy/energy_value))
|
||||
local added_amount = max_amount - inv:add_item("dst", ItemStack(result.." "..max_amount)):get_count()
|
||||
local result_energy = math.min(current_energy, current_energy - (energy_value * added_amount)) -- not sure if "math.min()" is necessary
|
||||
if using_orb then
|
||||
exchangeclone.set_orb_energy(inv, "fuel", 1, result_energy)
|
||||
else
|
||||
exchangeclone.set_player_energy(player, result_energy)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
if inv:get_stack("src", 1):is_empty() then
|
||||
timer:stop()
|
||||
else
|
||||
if not timer:is_started() then
|
||||
timer:start(1) -- keep trying to construct if there are items in the src stack
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function on_construct(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
inv:set_size("fuel", 1)
|
||||
inv:set_size("src", 1)
|
||||
inv:set_size("dst", 1)
|
||||
meta:set_string("formspec", formspec)
|
||||
meta:set_string("infotext", S("Constructor"))
|
||||
end
|
||||
|
||||
local function allow_metadata_inventory_put(pos, listname, index, stack, player)
|
||||
if player and player.get_player_name and minetest.is_protected(pos, player:get_player_name()) then
|
||||
return 0
|
||||
end
|
||||
if listname == "fuel" then
|
||||
if stack:get_name() == "exchangeclone:exchange_orb" then
|
||||
return stack:get_count()
|
||||
else
|
||||
return 0
|
||||
end
|
||||
elseif listname == "src" then
|
||||
return stack:get_count()
|
||||
|
||||
elseif listname == "dst" then
|
||||
return 0
|
||||
end
|
||||
end
|
||||
|
||||
local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local stack = inv:get_stack(from_list, from_index)
|
||||
return allow_metadata_inventory_put(pos, to_list, to_index, stack, player)
|
||||
end
|
||||
|
||||
local function allow_metadata_inventory_take(pos, listname, index, stack, player)
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
return 0
|
||||
end
|
||||
return stack:get_count()
|
||||
end
|
||||
|
||||
local pipeworks_connect = exchangeclone.pipeworks and "^pipeworks_tube_connection_metallic.png" or ""
|
||||
|
||||
minetest.register_node("exchangeclone:constructor", {
|
||||
description = S("Constructor"),
|
||||
tiles = {
|
||||
"exchangeclone_constructor_up.png"..pipeworks_connect,
|
||||
"exchangeclone_constructor_down.png"..pipeworks_connect,
|
||||
"exchangeclone_constructor_right.png"..pipeworks_connect,
|
||||
"exchangeclone_constructor_right.png"..pipeworks_connect,
|
||||
"exchangeclone_constructor_right.png"..pipeworks_connect,
|
||||
"exchangeclone_constructor_right.png"..pipeworks_connect,
|
||||
},
|
||||
groups = {cracky = 2, container = exchangeclone.mcl2 and 2 or 4, pickaxey = 2, tubedevice = 1, tubedevice_receiver = 1},
|
||||
_mcl_hardness = 3,
|
||||
_mcl_blast_resistance = 6,
|
||||
sounds = exchangeclone.sound_mod.node_sound_metal_defaults(),
|
||||
is_ground_content = false,
|
||||
can_dig = exchangeclone.can_dig,
|
||||
after_dig_node = exchangeclone.drop_after_dig({"src", "fuel", "dst"}),
|
||||
after_place_node = function(pos, player, itemstack, pointed_thing)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("exchangeclone_placer", player:get_player_name())
|
||||
if exchangeclone.pipeworks then
|
||||
pipeworks.after_place(pos, player, itemstack, pointed_thing)
|
||||
end
|
||||
end,
|
||||
on_construct = on_construct,
|
||||
on_metadata_inventory_move = constructor_action,
|
||||
on_metadata_inventory_put = constructor_action,
|
||||
on_metadata_inventory_take = function(pos, listname, index, stack, player)
|
||||
constructor_action(pos)
|
||||
end,
|
||||
on_blast = exchangeclone.on_blast({"src", "fuel", "dst"}),
|
||||
allow_metadata_inventory_put = allow_metadata_inventory_put,
|
||||
allow_metadata_inventory_move = allow_metadata_inventory_move,
|
||||
allow_metadata_inventory_take = allow_metadata_inventory_take,
|
||||
on_timer = constructor_action,
|
||||
_mcl_hoppers_on_try_pull = exchangeclone.mcl2_hoppers_on_try_pull(),
|
||||
_mcl_hoppers_on_try_push = exchangeclone.mcl2_hoppers_on_try_push(nil, function(stack) return stack:get_name() == "exchangeclone:exchange_orb" end),
|
||||
_mcl_hoppers_on_after_push = function(pos)
|
||||
minetest.get_node_timer(pos):start(1.0)
|
||||
end,
|
||||
_on_hopper_in = exchangeclone.mcla_on_hopper_in(
|
||||
nil,
|
||||
function(stack) return stack:get_name() == "exchangeclone:exchange_orb" end
|
||||
),
|
||||
})
|
||||
|
||||
if exchangeclone.pipeworks then
|
||||
local function get_list(direction)
|
||||
return (direction.y == 0 and "src") or "fuel"
|
||||
end
|
||||
minetest.override_item("exchangeclone:constructor", {
|
||||
tube = {
|
||||
input_inventory = "dst",
|
||||
connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1},
|
||||
insert_object = function(pos, node, stack, direction)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local result = inv:add_item(get_list(direction), stack)
|
||||
if result then
|
||||
constructor_action(pos)
|
||||
end
|
||||
return result
|
||||
end,
|
||||
can_insert = function(pos, node, stack, direction)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
if get_list(direction) == "fuel" then
|
||||
if stack:get_name() == "exchangeclone:exchange_orb" then
|
||||
return inv:room_for_item("fuel", stack)
|
||||
end
|
||||
else
|
||||
return inv:room_for_item("src", stack)
|
||||
end
|
||||
end,
|
||||
},
|
||||
on_rotate = pipeworks.on_rotate,
|
||||
})
|
||||
end
|
||||
|
||||
local recipe_ingredient = "default:pick_diamond"
|
||||
|
||||
if exchangeclone.mcl then
|
||||
recipe_ingredient = "mcl_tools:pick_diamond"
|
||||
end
|
||||
minetest.register_craft({
|
||||
type = "shaped",
|
||||
output = "exchangeclone:constructor",
|
||||
recipe = {
|
||||
{"exchangeclone:exchange_orb"},
|
||||
{recipe_ingredient},
|
||||
{"exchangeclone:exchange_orb"}
|
||||
}
|
||||
})
|
|
@ -0,0 +1,149 @@
|
|||
local S = minetest.get_translator()
|
||||
|
||||
exchangeclone.tool_types = exchangeclone.tool_types or {}
|
||||
|
||||
for group, amount in pairs({
|
||||
pickaxe = 3,
|
||||
pick = 3,
|
||||
sword = 2,
|
||||
axe = 3,
|
||||
shovel = 1,
|
||||
hoe = 2,
|
||||
hammer = 2,
|
||||
shears = 2,
|
||||
helmet = 5,
|
||||
chestplate = 8,
|
||||
leggings = 7,
|
||||
boots = 4,
|
||||
shield = exchangeclone.mcl and 1 or 7,
|
||||
}) do
|
||||
exchangeclone.tool_types[group] = exchangeclone.tool_types[group] or amount
|
||||
end
|
||||
|
||||
local charcoal_itemstring = exchangeclone.mcl and "mcl_core:charcoal_lump" or "group:tree"
|
||||
|
||||
minetest.register_craftitem("exchangeclone:low_covalence_dust", {
|
||||
description = S("Low Covalence Dust"),
|
||||
groups = {covalence_dust = 1},
|
||||
inventory_image = "exchangeclone_dust.png^[colorize:#00ff00:128",
|
||||
wield_image = "exchangeclone_dust.png^[colorize:#00ff00:128",
|
||||
})
|
||||
minetest.register_craftitem("exchangeclone:medium_covalence_dust", {
|
||||
description = S("Medium Covalence Dust"),
|
||||
groups = {covalence_dust = 2},
|
||||
inventory_image = "exchangeclone_dust.png^[colorize:#00ffff:128",
|
||||
wield_image = "exchangeclone_dust.png^[colorize:#00ffff:128",
|
||||
})
|
||||
|
||||
minetest.register_craftitem("exchangeclone:high_covalence_dust", {
|
||||
description = S("High Covalence Dust"),
|
||||
groups = {covalence_dust = 3},
|
||||
inventory_image = "exchangeclone_dust.png^[colorize:#0000ff:128",
|
||||
wield_image = "exchangeclone_dust.png^[colorize:#0000ff:128",
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:low_covalence_dust 40",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
exchangeclone.itemstrings.cobble,
|
||||
exchangeclone.itemstrings.cobble,
|
||||
exchangeclone.itemstrings.cobble,
|
||||
exchangeclone.itemstrings.cobble,
|
||||
exchangeclone.itemstrings.cobble,
|
||||
exchangeclone.itemstrings.cobble,
|
||||
exchangeclone.itemstrings.cobble,
|
||||
exchangeclone.itemstrings.cobble,
|
||||
charcoal_itemstring,
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:medium_covalence_dust 40",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
exchangeclone.itemstrings.iron, exchangeclone.itemstrings.redstoneworth
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:high_covalence_dust 40",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
exchangeclone.itemstrings.diamond, exchangeclone.itemstrings.coal
|
||||
}
|
||||
})
|
||||
|
||||
local listnames = {exchangeclone_covalence_dust = true, exchangeclone_covalence_gear = true, exchangeclone_covalence_output = true}
|
||||
|
||||
local function is_repairable_gear(item)
|
||||
item = ItemStack(item)
|
||||
if item:get_wear() <= 0 then return end
|
||||
if (exchangeclone.get_item_energy(item) or 0) <= 0 then return end
|
||||
|
||||
local result = 0
|
||||
for group, amount in pairs(exchangeclone.tool_types) do
|
||||
if minetest.get_item_group(item:get_name(), group) > 0 then
|
||||
result = result + amount
|
||||
end
|
||||
end
|
||||
return (result > 0) and result
|
||||
end
|
||||
|
||||
-- Doesn't even get to repairable_gear function
|
||||
minetest.register_allow_player_inventory_action(function(player, action, inventory, info)
|
||||
if action == "take" and listnames[info.listname] then
|
||||
return info.stack:get_count()
|
||||
elseif action == "move" and listnames[info.to_list] then
|
||||
if info.to_list == "exchangeclone_covalence_output" then
|
||||
return 0
|
||||
elseif info.to_list == "exchangeclone_covalence_gear" then
|
||||
local stack = inventory:get_stack(info.from_list, info.from_index)
|
||||
return is_repairable_gear(stack) and info.count or 0
|
||||
elseif info.to_list == "exchangeclone_covalence_dust" then
|
||||
local stack = inventory:get_stack(info.from_list, info.from_index)
|
||||
return (minetest.get_item_group(stack:get_name(), "covalence_dust") > 0) and info.count or 0
|
||||
end
|
||||
elseif action == "put" and listnames[info.listname] then
|
||||
if info.listname == "exchangeclone_covalence_output" then
|
||||
return 0
|
||||
elseif info.listname == "exchangeclone_covalence_gear" then
|
||||
return is_repairable_gear(info.stack) and info.stack:get_count() or 0
|
||||
elseif info.listname == "exchangeclone_covalence_dust" then
|
||||
return (minetest.get_item_group(info.stack:get_name(), "covalence_dust") > 0) and info.stack:get_count() or 0
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
-- I'm aware that this does not account for tools that can stack, but that's just because I don't think that's even possible.
|
||||
minetest.register_on_player_inventory_action(function(player, action, inventory, info)
|
||||
if ((action == "take" or action == "put") and listnames[info.listname])
|
||||
or (action == "move" and (listnames[info.to_list] or listnames[info.from_list])) then
|
||||
local gear_stack = inventory:get_stack("exchangeclone_covalence_gear", 1)
|
||||
local dust_stack = inventory:get_stack("exchangeclone_covalence_dust", 1)
|
||||
if gear_stack:is_empty() or dust_stack:is_empty() then return end
|
||||
if not inventory:room_for_item("exchangeclone_covalence_output", gear_stack) then return end
|
||||
local amount = is_repairable_gear(gear_stack)
|
||||
local energy_value = exchangeclone.get_item_energy(gear_stack)
|
||||
local tier = 3
|
||||
if energy_value/amount < 50 then
|
||||
tier = 1
|
||||
elseif energy_value/amount < 6000 then
|
||||
tier = 2
|
||||
end
|
||||
if minetest.get_item_group(dust_stack:get_name(), "covalence_dust") >= tier and dust_stack:get_count() >= amount then
|
||||
local new_stack = ItemStack(gear_stack)
|
||||
new_stack:set_wear(0)
|
||||
inventory:add_item("exchangeclone_covalence_output", new_stack)
|
||||
inventory:set_stack("exchangeclone_covalence_gear", 1, ItemStack(""))
|
||||
dust_stack:set_count(dust_stack:get_count() - amount)
|
||||
inventory:set_stack("exchangeclone_covalence_dust", 1, dust_stack)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_on_joinplayer(function(player, time_since_whatever)
|
||||
for listname, _ in pairs(listnames) do
|
||||
player:get_inventory():set_size(listname, 1)
|
||||
end
|
||||
end)
|
|
@ -1,3 +1,5 @@
|
|||
local S = minetest.get_translator()
|
||||
|
||||
local function get_level(level)
|
||||
if exchangeclone.mcl then
|
||||
return nil
|
||||
|
@ -7,21 +9,21 @@ local function get_level(level)
|
|||
end
|
||||
|
||||
minetest.register_craftitem("exchangeclone:alchemical_coal", {
|
||||
description = "Alchemical Coal",
|
||||
description = S("Alchemical Coal"),
|
||||
wield_image = "exchangeclone_alchemical_coal.png",
|
||||
inventory_image = "exchangeclone_alchemical_coal.png",
|
||||
groups = { craftitem=1},
|
||||
})
|
||||
|
||||
minetest.register_craftitem("exchangeclone:mobius_fuel", {
|
||||
description = "Mobius Fuel",
|
||||
description = S("Mobius Fuel"),
|
||||
wield_image = "exchangeclone_mobius_fuel.png",
|
||||
inventory_image = "exchangeclone_mobius_fuel.png",
|
||||
groups = { craftitem=1},
|
||||
})
|
||||
|
||||
minetest.register_craftitem("exchangeclone:aeternalis_fuel", {
|
||||
description = "Aeternalis Fuel",
|
||||
description = S("Aeternalis Fuel"),
|
||||
wield_image = "exchangeclone_aeternalis_fuel.png",
|
||||
inventory_image = "exchangeclone_aeternalis_fuel.png",
|
||||
groups = { craftitem=1},
|
||||
|
@ -46,21 +48,21 @@ minetest.register_craft({
|
|||
})
|
||||
|
||||
minetest.register_craftitem("exchangeclone:dark_matter", {
|
||||
description = "Dark Matter Orb",
|
||||
description = S("Dark Matter Orb"),
|
||||
wield_image = "exchangeclone_dark_matter.png",
|
||||
inventory_image = "exchangeclone_dark_matter.png",
|
||||
groups = {craftitem = 1}
|
||||
})
|
||||
|
||||
minetest.register_craftitem("exchangeclone:red_matter", {
|
||||
description = "Red Matter Orb",
|
||||
description = S("Red Matter Orb"),
|
||||
wield_image = "exchangeclone_red_matter.png",
|
||||
inventory_image = "exchangeclone_red_matter.png",
|
||||
groups = {craftitem = 1},
|
||||
})
|
||||
|
||||
minetest.register_node("exchangeclone:dark_matter_block", {
|
||||
description = "Dark Matter Block",
|
||||
description = S("Dark Matter Block"),
|
||||
tiles = {"exchangeclone_dark_matter_block.png"},
|
||||
is_ground_content = false,
|
||||
sounds = exchangeclone.sound_mod.node_sound_stone_defaults(),
|
||||
|
@ -70,12 +72,12 @@ minetest.register_node("exchangeclone:dark_matter_block", {
|
|||
})
|
||||
|
||||
minetest.register_node("exchangeclone:red_matter_block", {
|
||||
description = "Red Matter Block",
|
||||
description = S("Red Matter Block"),
|
||||
tiles = {"exchangeclone_red_matter_block.png"},
|
||||
is_ground_content = false,
|
||||
light_source = 14,
|
||||
sounds = exchangeclone.sound_mod.node_sound_stone_defaults(),
|
||||
groups = {pickaxey=5, material_stone=1, cracky = 3, level = get_level(5)},
|
||||
groups = {pickaxey=6, material_stone=1, cracky = 3, level = get_level(5)},
|
||||
_mcl_blast_resistance = 1500,
|
||||
_mcl_hardness = 100,
|
||||
})
|
||||
|
@ -109,7 +111,7 @@ minetest.register_craft({
|
|||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:dark_matter_block 4",
|
||||
output = "exchangeclone:dark_matter_block",
|
||||
recipe = {
|
||||
{"exchangeclone:dark_matter", "exchangeclone:dark_matter"},
|
||||
{"exchangeclone:dark_matter", "exchangeclone:dark_matter"}
|
||||
|
@ -117,7 +119,7 @@ minetest.register_craft({
|
|||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:red_matter_block 4",
|
||||
output = "exchangeclone:red_matter_block",
|
||||
recipe = {
|
||||
{"exchangeclone:red_matter", "exchangeclone:red_matter"},
|
||||
{"exchangeclone:red_matter", "exchangeclone:red_matter"}
|
||||
|
@ -127,15 +129,13 @@ minetest.register_craft({
|
|||
minetest.register_craft({
|
||||
output = "exchangeclone:dark_matter 4",
|
||||
recipe = {
|
||||
{"exchangeclone:dark_matter_block","exchangeclone:dark_matter_block"},
|
||||
{"exchangeclone:dark_matter_block","exchangeclone:dark_matter_block"}
|
||||
{"exchangeclone:dark_matter_block"}
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:red_matter 4",
|
||||
recipe = {
|
||||
{"exchangeclone:red_matter_block","exchangeclone:red_matter_block"},
|
||||
{"exchangeclone:red_matter_block","exchangeclone:red_matter_block"}
|
||||
{"exchangeclone:red_matter_block",}
|
||||
}
|
||||
})
|
|
@ -0,0 +1,214 @@
|
|||
local S = minetest.get_translator()
|
||||
|
||||
local formspec =
|
||||
"size["..(exchangeclone.mcl and 9 or 8)..",9]"..
|
||||
"label[2,1;"..S("Input").."]"..
|
||||
"list[context;src;2,2;1,1;]"..
|
||||
"label[5,1;"..S("Orb").."]"..
|
||||
"list[context;fuel;5,2;1,1;]"..
|
||||
exchangeclone.inventory_formspec(0,5)..
|
||||
"listring[current_player;main]"..
|
||||
"listring[context;src]"..
|
||||
"listring[current_player;main]"..
|
||||
"listring[context;fuel]"..
|
||||
"listring[current_player;main]"..
|
||||
"listring[context;dst]"
|
||||
if exchangeclone.mcl then
|
||||
formspec = formspec..
|
||||
mcl_formspec.get_itemslot_bg(2,2,1,1)..
|
||||
mcl_formspec.get_itemslot_bg(5,2,1,1)
|
||||
end
|
||||
|
||||
minetest.register_alias("exchangeclone:element_deconstructor", "exchangeclone:deconstructor")
|
||||
|
||||
local function deconstructor_action(pos, elapsed)
|
||||
local limit = exchangeclone.orb_max
|
||||
local using_orb = true
|
||||
local player
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
|
||||
if inv:get_stack("fuel", 1):get_name() ~= "exchangeclone:exchange_orb" then
|
||||
limit = exchangeclone.limit
|
||||
using_orb = false
|
||||
player = minetest.get_player_by_name(meta:get_string("exchangeclone_placer"))
|
||||
if not (player and player ~= "") then return end
|
||||
end
|
||||
|
||||
local stack = inv:get_stack("src", 1)
|
||||
local individual_energy_value = exchangeclone.get_item_energy(stack:get_name())
|
||||
if not (individual_energy_value and individual_energy_value > 0) then return end
|
||||
local wear = stack:get_wear()
|
||||
if wear and wear > 0 then
|
||||
individual_energy_value = math.max(math.floor(individual_energy_value * (65536 / wear)), 1)
|
||||
end
|
||||
if stack:get_name() == "exchangeclone:exchange_orb" then
|
||||
individual_energy_value = individual_energy_value + exchangeclone.get_orb_itemstack_energy(stack)
|
||||
end
|
||||
|
||||
local current_energy
|
||||
if using_orb then
|
||||
current_energy = exchangeclone.get_orb_energy(inv, "fuel", 1)
|
||||
else
|
||||
current_energy = exchangeclone.get_player_energy(player)
|
||||
end
|
||||
local max_count = math.floor((limit - current_energy)/individual_energy_value)
|
||||
local add_count = math.min(max_count, stack:get_count())
|
||||
local energy_value = individual_energy_value * add_count
|
||||
local result = current_energy + energy_value
|
||||
if result < 0 or result > limit then return end
|
||||
|
||||
if using_orb then
|
||||
exchangeclone.set_orb_energy(inv, "fuel", 1, result)
|
||||
else
|
||||
exchangeclone.set_player_energy(player, result)
|
||||
end
|
||||
stack:set_count(stack:get_count() - add_count)
|
||||
if stack:get_count() == 0 then stack = ItemStack("") end
|
||||
inv:set_stack("src", 1, stack)
|
||||
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
if inv:get_stack("src", 1):is_empty() then
|
||||
timer:stop()
|
||||
else
|
||||
if not timer:is_started() then
|
||||
timer:start(1) -- keep trying to deconstruct if there are items in the src stack
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function on_construct(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
inv:set_size("src", 1)
|
||||
inv:set_size("fuel", 1)
|
||||
meta:set_string("formspec", formspec)
|
||||
meta:set_string("infotext", S("Deconstructor"))
|
||||
deconstructor_action(pos, 0)
|
||||
end
|
||||
|
||||
local function allow_metadata_inventory_put(pos, listname, index, stack, player)
|
||||
if player and player.get_player_name and minetest.is_protected(pos, player:get_player_name()) then
|
||||
return 0
|
||||
end
|
||||
if listname == "fuel" then
|
||||
if stack:get_name() == "exchangeclone:exchange_orb" then
|
||||
return stack:get_count()
|
||||
else
|
||||
return 0
|
||||
end
|
||||
elseif listname == "src" then
|
||||
return stack:get_count()
|
||||
else
|
||||
return 0
|
||||
end
|
||||
end
|
||||
|
||||
local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local stack = inv:get_stack(from_list, from_index)
|
||||
return allow_metadata_inventory_put(pos, to_list, to_index, stack, player)
|
||||
end
|
||||
|
||||
local function allow_metadata_inventory_take(pos, listname, index, stack, player)
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
return 0
|
||||
end
|
||||
return stack:get_count()
|
||||
end
|
||||
|
||||
local pipeworks_connect = exchangeclone.pipeworks and "^pipeworks_tube_connection_metallic.png" or ""
|
||||
|
||||
minetest.register_node("exchangeclone:deconstructor", {
|
||||
description = S("Deconstructor"),
|
||||
tiles = {
|
||||
"exchangeclone_deconstructor_up.png"..pipeworks_connect,
|
||||
"exchangeclone_deconstructor_down.png"..pipeworks_connect,
|
||||
"exchangeclone_deconstructor_right.png"..pipeworks_connect,
|
||||
"exchangeclone_deconstructor_right.png"..pipeworks_connect,
|
||||
"exchangeclone_deconstructor_right.png"..pipeworks_connect,
|
||||
"exchangeclone_deconstructor_right.png"..pipeworks_connect,
|
||||
},
|
||||
groups = {cracky = 2, container = exchangeclone.mcl2 and 2 or 4, pickaxey = 2, tubedevice = 1, tubedevice_receiver = 1},
|
||||
_mcl_hardness = 3,
|
||||
_mcl_blast_resistance = 6,
|
||||
sounds = exchangeclone.sound_mod.node_sound_metal_defaults(),
|
||||
is_ground_content = false,
|
||||
can_dig = exchangeclone.can_dig,
|
||||
after_dig_node = exchangeclone.drop_after_dig({"src", "fuel"}),
|
||||
after_place_node = function(pos, player, itemstack, pointed_thing)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("exchangeclone_placer", player:get_player_name())
|
||||
if exchangeclone.pipeworks then
|
||||
pipeworks.after_place(pos, player, itemstack, pointed_thing)
|
||||
end
|
||||
end,
|
||||
on_construct = on_construct,
|
||||
on_metadata_inventory_move = deconstructor_action,
|
||||
on_metadata_inventory_put = deconstructor_action,
|
||||
on_metadata_inventory_take = function(pos, listname, index, stack, player)
|
||||
deconstructor_action(pos)
|
||||
end,
|
||||
on_blast = exchangeclone.on_blast({"src", "fuel"}),
|
||||
allow_metadata_inventory_put = allow_metadata_inventory_put,
|
||||
allow_metadata_inventory_move = allow_metadata_inventory_move,
|
||||
allow_metadata_inventory_take = allow_metadata_inventory_take,
|
||||
on_timer = deconstructor_action,
|
||||
_mcl_hoppers_on_try_push = exchangeclone.mcl2_hoppers_on_try_push(nil, function(stack) return stack:get_name() == "exchangeclone:exchange_orb" end),
|
||||
_mcl_hoppers_on_after_push = function(pos)
|
||||
minetest.get_node_timer(pos):start(1.0)
|
||||
end,
|
||||
_on_hopper_in = exchangeclone.mcla_on_hopper_in(
|
||||
nil,
|
||||
function(stack) return stack:get_name() == "exchangeclone:exchange_orb" end
|
||||
),
|
||||
})
|
||||
|
||||
if exchangeclone.pipeworks then
|
||||
local function get_list(direction)
|
||||
return (direction.y == 0 and "src") or "fuel"
|
||||
end
|
||||
minetest.override_item("exchangeclone:deconstructor", {
|
||||
tube = {
|
||||
input_inventory = "src",
|
||||
connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1},
|
||||
insert_object = function(pos, node, stack, direction)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local result = inv:add_item(get_list(direction), stack)
|
||||
if result then
|
||||
deconstructor_action(pos)
|
||||
end
|
||||
return result
|
||||
end,
|
||||
can_insert = function(pos, node, stack, direction)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
if get_list(direction) == "fuel" then
|
||||
if stack:get_name() == "exchangeclone:exchange_orb" then
|
||||
return inv:room_for_item("fuel", stack)
|
||||
end
|
||||
else
|
||||
return inv:room_for_item("src", stack)
|
||||
end
|
||||
end,
|
||||
},
|
||||
on_rotate = pipeworks.on_rotate,
|
||||
})
|
||||
end
|
||||
|
||||
local recipe_ingredient = "default:furnace"
|
||||
|
||||
if exchangeclone.mcl then
|
||||
recipe_ingredient = "mcl_furnaces:furnace"
|
||||
end
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:deconstructor",
|
||||
recipe = {
|
||||
{"exchangeclone:exchange_orb"},
|
||||
{recipe_ingredient},
|
||||
{"exchangeclone:exchange_orb"}
|
||||
}
|
||||
})
|
|
@ -1,56 +1,19 @@
|
|||
local function get_energy_collector_formspec()
|
||||
local formspec
|
||||
if not exchangeclone.mcl then
|
||||
formspec = {
|
||||
"size[8,9]",
|
||||
"label[3,2;Orb]",
|
||||
"list[context;main;4,2;1,1;]",
|
||||
"list[current_player;main;0,5;8,4;]",
|
||||
"listring[current_player;main]",
|
||||
"listring[context;main]"
|
||||
}
|
||||
else
|
||||
formspec = {
|
||||
"size[9,10]",
|
||||
"label[3,2;Orb]",
|
||||
"list[context;main;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[context;main]"
|
||||
}
|
||||
end
|
||||
return table.concat(formspec, "")
|
||||
end
|
||||
local S = minetest.get_translator()
|
||||
|
||||
local formspec =
|
||||
"size["..(exchangeclone.mcl and 9 or 8)..",9]"..
|
||||
"label[3,2;"..S("Orb").."]"..
|
||||
"list[context;main;4,2;1,1;]"..
|
||||
exchangeclone.inventory_formspec(0,5)..
|
||||
"listring[current_player;main]"..
|
||||
"listring[context;main]"..
|
||||
(exchangeclone.mcl and mcl_formspec.get_itemslot_bg(4,2,1,1) or "")
|
||||
|
||||
minetest.register_alias("exchangeclone:energy_collector", "exchangeclone:energy_collector_mk1")
|
||||
|
||||
-- Register LBM to update deconstructors
|
||||
minetest.register_lbm({
|
||||
name = "exchangeclone:collector_alert",
|
||||
nodenames = {"exchangeclone:energy_collector_mk1"},
|
||||
run_at_every_load = false,
|
||||
action = function(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("formspec", "size[3,1]label[0,0;Break and replace.\nNothing will be lost.]")
|
||||
end,
|
||||
})
|
||||
|
||||
local check_positions = {
|
||||
{x=0,y=0,z=1},
|
||||
{x=0,y=0,z=-1},
|
||||
{x=0,y=1,z=0},
|
||||
{x=0,y=-1,z=0},
|
||||
{x=1,y=0, z=0},
|
||||
{x=-1,y=0,z=0},
|
||||
}
|
||||
|
||||
local function check_for_furnaces(pos, set_furnace, start)
|
||||
local found = false
|
||||
for _, check_pos in ipairs(check_positions) do
|
||||
for _, check_pos in pairs(exchangeclone.neighbors) do
|
||||
local new_pos = vector.add(pos, check_pos)
|
||||
local node = minetest.get_node(new_pos)
|
||||
local furnace = minetest.get_item_group(node.name, "exchangeclone_furnace")
|
||||
|
@ -75,13 +38,6 @@ local function check_for_furnaces(pos, set_furnace, start)
|
|||
return found
|
||||
end
|
||||
|
||||
local function can_dig(pos, player)
|
||||
if exchangeclone.mcl then return true end
|
||||
local meta = minetest.get_meta(pos);
|
||||
local inv = meta:get_inventory()
|
||||
return inv:is_empty("main")
|
||||
end
|
||||
|
||||
local function on_timer(pos, elapsed)
|
||||
local meta = minetest.get_meta(pos)
|
||||
|
||||
|
@ -116,8 +72,7 @@ local function on_timer(pos, elapsed)
|
|||
if placer and placer ~= "" then
|
||||
local player = minetest.get_player_by_name(placer)
|
||||
if player then
|
||||
local player_energy = exchangeclone.get_player_energy(player)
|
||||
exchangeclone.set_player_energy(player, player_energy + amount)
|
||||
exchangeclone.add_player_energy(player, amount)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -131,7 +86,7 @@ local function on_construct(pos)
|
|||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
inv:set_size("main", 1)
|
||||
meta:set_string("formspec", get_energy_collector_formspec())
|
||||
meta:set_string("formspec", formspec)
|
||||
minetest.get_node_timer(pos):start(1)
|
||||
end
|
||||
|
||||
|
@ -162,33 +117,10 @@ local function allow_metadata_inventory_take(pos, listname, index, stack, player
|
|||
return stack:get_count()
|
||||
end
|
||||
|
||||
local function on_blast(pos)
|
||||
local drops = {}
|
||||
exchangeclone.get_inventory_drops(pos, "main", drops)
|
||||
drops[#drops+1] = "exchangeclone:energy_collector"
|
||||
minetest.remove_node(pos)
|
||||
|
||||
return drops
|
||||
end
|
||||
|
||||
local function on_dig_node(pos, oldnode, oldmetadata, player)
|
||||
if exchangeclone.mcl then
|
||||
local meta = minetest.get_meta(pos)
|
||||
local meta2 = meta:to_table()
|
||||
meta:from_table(oldmetadata)
|
||||
local inv = meta:get_inventory()
|
||||
local stack = inv:get_stack("main", 1)
|
||||
if not stack:is_empty() then
|
||||
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
|
||||
minetest.add_item(p, stack)
|
||||
end
|
||||
meta:from_table(meta2)
|
||||
end
|
||||
end
|
||||
|
||||
function exchangeclone.register_energy_collector(itemstring, name, amount, modifier, recipe)
|
||||
if exchangeclone.pipeworks then modifier = modifier.."^pipeworks_tube_connection_stony.png" end
|
||||
minetest.register_node(itemstring, {
|
||||
description = name,
|
||||
description = name.."\nGenerates "..exchangeclone.format_number(amount).." energy/second",
|
||||
tiles = {
|
||||
"exchangeclone_energy_collector_up.png"..modifier,
|
||||
"exchangeclone_energy_collector_down.png"..modifier,
|
||||
|
@ -197,15 +129,15 @@ function exchangeclone.register_energy_collector(itemstring, name, amount, modif
|
|||
"exchangeclone_energy_collector_right.png"..modifier,
|
||||
"exchangeclone_energy_collector_right.png"..modifier
|
||||
},
|
||||
groups = {cracky = 2, container = 2, pickaxey = 2, energy_collector = amount},
|
||||
groups = {cracky = 2, container = 2, pickaxey = 2, energy_collector = amount, tubedevice = 1, tubedevice_receiver = 1},
|
||||
_mcl_hardness = 3,
|
||||
_mcl_blast_resistance = 6,
|
||||
sounds = exchangeclone.sound_mod.node_sound_metal_defaults(),
|
||||
is_ground_content = false,
|
||||
can_dig = can_dig,
|
||||
can_dig = exchangeclone.can_dig,
|
||||
on_timer = on_timer,
|
||||
on_construct = on_construct,
|
||||
after_dig_node = on_dig_node,
|
||||
after_dig_node = exchangeclone.drop_after_dig({"main"}),
|
||||
on_metadata_inventory_move = function(pos)
|
||||
minetest.get_node_timer(pos):start(1)
|
||||
end,
|
||||
|
@ -223,9 +155,12 @@ function exchangeclone.register_energy_collector(itemstring, name, amount, modif
|
|||
local meta = minetest.get_meta(pos)
|
||||
meta:set_int("collector_amount", amount)
|
||||
meta:set_string("exchangeclone_placer", player_name)
|
||||
meta:set_string("infotext", name.."\nOwned by"..player_name)
|
||||
meta:set_string("infotext", name.."\n"..S("Owned by ")..player_name)
|
||||
if exchangeclone.pipeworks then
|
||||
pipeworks.after_place(pos, player, itemstack, pointed_thing)
|
||||
end
|
||||
end,
|
||||
on_blast = on_blast,
|
||||
on_blast = exchangeclone.on_blast({"main"}),
|
||||
allow_metadata_inventory_put = allow_metadata_inventory_put,
|
||||
allow_metadata_inventory_move = allow_metadata_inventory_move,
|
||||
allow_metadata_inventory_take = allow_metadata_inventory_take,
|
||||
|
@ -234,78 +169,106 @@ function exchangeclone.register_energy_collector(itemstring, name, amount, modif
|
|||
output = itemstring,
|
||||
recipe = recipe
|
||||
})
|
||||
|
||||
if exchangeclone.pipeworks then
|
||||
minetest.override_item(itemstring, {
|
||||
tube = {
|
||||
input_inventory = "main",
|
||||
connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1},
|
||||
insert_object = function(pos, node, stack, direction)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
return inv:add_item("main", stack)
|
||||
end,
|
||||
can_insert = function(pos, node, stack, direction)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
if stack:get_name() == "exchangeclone:exchange_orb" then
|
||||
return inv:room_for_item("main", stack)
|
||||
end
|
||||
end,
|
||||
},
|
||||
on_rotate = pipeworks.on_rotate,
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
--[[if minetest.get_modpath("pipeworks") then
|
||||
minetest.override_item("exchangeclone:energy_collector", {
|
||||
tube = {
|
||||
input_inventory = "main",
|
||||
connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1},
|
||||
insert_object = function(pos, node, stack, direction)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
return inv:add_item("main", stack)
|
||||
end,
|
||||
can_insert = function(pos, node, stack, direction)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
if stack:get_name() == "exchangeclone:exchange_orb" then
|
||||
minetest.log(inv:room_for_item("main", stack))
|
||||
return inv:room_for_item("main", stack)
|
||||
else
|
||||
minetest.log("failed")
|
||||
end
|
||||
end,
|
||||
},
|
||||
after_place_node = function(pos, player)
|
||||
pipeworks.after_place(pos)
|
||||
end,
|
||||
after_dig_node = pipeworks.after_dig,
|
||||
on_rotate = pipeworks.on_rotate,
|
||||
})
|
||||
end]]
|
||||
|
||||
local iron = "default:steelblock"
|
||||
local iron_block = "default:steelblock"
|
||||
local glass = "default:glass"
|
||||
local chest = "default:chest"
|
||||
|
||||
if exchangeclone.mcl then
|
||||
iron = "mcl_core:ironblock"
|
||||
iron_block = "mcl_core:ironblock"
|
||||
glass = "mcl_core:glass"
|
||||
chest = "mcl_chests:chest"
|
||||
end
|
||||
|
||||
exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk1", "Energy Collector MK1", 4, "", {
|
||||
exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk1", S("Energy Collector MK1"), 4, "", {
|
||||
{glass, glass, glass},
|
||||
{"exchangeclone:exchange_orb", chest, "exchangeclone:exchange_orb"},
|
||||
{iron, iron, iron}
|
||||
{iron_block, iron_block, iron_block}
|
||||
}
|
||||
)
|
||||
|
||||
exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk2", "Energy Collector MK2", 12, "^[multiply:#555555", {
|
||||
{iron, iron, iron},
|
||||
exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk2", S("Energy Collector MK2"), 12, "^[multiply:#555555", {
|
||||
{iron_block, iron_block, iron_block},
|
||||
{"exchangeclone:energy_collector_mk1", "exchangeclone:energy_collector_mk1", "exchangeclone:energy_collector_mk1"},
|
||||
{iron, iron, iron}
|
||||
{iron_block, iron_block, iron_block}
|
||||
}
|
||||
)
|
||||
|
||||
exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk3", "Energy Collector MK3", 40, "^[multiply:#770000", {
|
||||
{iron, iron, iron},
|
||||
exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk3", S("Energy Collector MK3"), 40, "^[multiply:#770000", {
|
||||
{iron_block, iron_block, iron_block},
|
||||
{"exchangeclone:energy_collector_mk2", "exchangeclone:energy_collector_mk2", "exchangeclone:energy_collector_mk2"},
|
||||
{iron, iron, iron}
|
||||
{iron_block, iron_block, iron_block}
|
||||
}
|
||||
)
|
||||
|
||||
exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk4", "Energy Collector MK4", 160, "^[multiply:#007700", {
|
||||
{iron, iron, iron},
|
||||
exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk4", S("Energy Collector MK4"), 160, "^[multiply:#aa7700", {
|
||||
{iron_block, iron_block, iron_block},
|
||||
{"exchangeclone:energy_collector_mk3", "exchangeclone:energy_collector_mk3", "exchangeclone:energy_collector_mk3"},
|
||||
{iron, iron, iron}
|
||||
{iron_block, iron_block, iron_block}
|
||||
}
|
||||
)
|
||||
|
||||
exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk5", "Energy Collector MK5", 640, "^[multiply:#000077", {
|
||||
{iron, iron, iron},
|
||||
exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk5", S("Energy Collector MK5"), 640, "^[multiply:#007700", {
|
||||
{iron_block, iron_block, iron_block},
|
||||
{"exchangeclone:energy_collector_mk4", "exchangeclone:energy_collector_mk4", "exchangeclone:energy_collector_mk4"},
|
||||
{iron, iron, iron}
|
||||
{iron_block, iron_block, iron_block}
|
||||
}
|
||||
)
|
||||
|
||||
exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk6", S("Energy Collector MK6"), 2560, "^[multiply:#007777", {
|
||||
{iron_block, iron_block, iron_block},
|
||||
{"exchangeclone:energy_collector_mk5", "exchangeclone:energy_collector_mk5", "exchangeclone:energy_collector_mk5"},
|
||||
{iron_block, iron_block, iron_block}
|
||||
}
|
||||
)
|
||||
|
||||
exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk7", S("Energy Collector MK7"), 10240, "^[multiply:#000077", {
|
||||
{iron_block, iron_block, iron_block},
|
||||
{"exchangeclone:energy_collector_mk6", "exchangeclone:energy_collector_mk6", "exchangeclone:energy_collector_mk6"},
|
||||
{iron_block, iron_block, iron_block}
|
||||
}
|
||||
)
|
||||
|
||||
exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk8", S("Energy Collector MK8"), 40960, "^[multiply:#770077", {
|
||||
{iron_block, iron_block, iron_block},
|
||||
{"exchangeclone:energy_collector_mk7", "exchangeclone:energy_collector_mk7", "exchangeclone:energy_collector_mk7"},
|
||||
{iron_block, iron_block, iron_block}
|
||||
}
|
||||
)
|
||||
|
||||
exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk9", S("Energy Collector MK9"), 163840, "^[brighten", {
|
||||
{iron_block, iron_block, iron_block},
|
||||
{"exchangeclone:energy_collector_mk8", "exchangeclone:energy_collector_mk8", "exchangeclone:energy_collector_mk8"},
|
||||
{iron_block, iron_block, iron_block}
|
||||
}
|
||||
)
|
||||
|
||||
exchangeclone.register_energy_collector("exchangeclone:energy_collector_mk10", S("Energy Collector MK10"), 655360, "^[invert:rgb", {
|
||||
{iron_block, iron_block, iron_block},
|
||||
{"exchangeclone:energy_collector_mk9", "exchangeclone:energy_collector_mk9", "exchangeclone:energy_collector_mk9"},
|
||||
{iron_block, iron_block, iron_block}
|
||||
}
|
||||
)
|
|
@ -1,12 +1,28 @@
|
|||
local S = minetest.get_translator()
|
||||
|
||||
-- Everything with the exchangeclone_ore group is also included (see pickaxes.lua)
|
||||
-- This is pretty much the one thing I can't really figure out how to automate.
|
||||
local ores = {
|
||||
["mcl_raw_ores:raw_gold"] = true,
|
||||
["mcl_raw_ores:raw_iron"] = true,
|
||||
["mcl_copper:raw_copper"] = true,
|
||||
["default:copper_lump"] = true,
|
||||
["default:gold_lump"] = true,
|
||||
["default:iron_lump"] = true,
|
||||
["default:tin_lump"] = true,
|
||||
|
||||
["mcl_copper:raw_copper"] = true,
|
||||
["mcl_copper:block_raw"] = true,
|
||||
["mcl_raw_ores:raw_iron"] = true,
|
||||
["mcl_raw_ores:raw_iron_block"] = true,
|
||||
["mcl_raw_ores:raw_gold"] = true,
|
||||
["mcl_raw_ores:raw_gold_block"] = true,
|
||||
|
||||
["moreores:mithril_lump"] = true,
|
||||
["moreores:silver_lump"] = true,
|
||||
["moreores:tin_lump"] = true, -- tin is built into MTG but it's also in the moreores code
|
||||
|
||||
["technic:chromium_lump"] = true,
|
||||
["technic:lead_lump"] = true,
|
||||
["technic:uranium_lump"] = true,
|
||||
["technic:zinc_lump"] = true,
|
||||
}
|
||||
|
||||
local furnace_itemstring = "default:furnace"
|
||||
|
@ -31,7 +47,7 @@ end
|
|||
|
||||
local LIGHT_ACTIVE_FURNACE = 13
|
||||
|
||||
--90% of the code is copied from MineClone's blast furnaces.
|
||||
-- Modified from MineClone's blast furnaces.
|
||||
|
||||
--
|
||||
-- Formspecs
|
||||
|
@ -43,7 +59,7 @@ local base_formspec =
|
|||
--"image_button[8,0;1,1;craftguide_book.png;craftguide;]"..
|
||||
--"tooltip[craftguide;"..minetest.formspec_escape("Recipe book").."]"..
|
||||
"size[10,8.75]"..
|
||||
"label[0,4;Inventory]"..
|
||||
"label[0,4;"..S("Inventory").."]"..
|
||||
exchangeclone.inventory_formspec(0,4.5)..
|
||||
"list[context;src;2.9,0.5;1,1]"..
|
||||
"list[context;fuel;2.9,2.5;1,1;]"..
|
||||
|
@ -64,12 +80,12 @@ if exchangeclone.mcl then
|
|||
mcl_formspec.get_itemslot_bg(5.75,1.5,1,1)
|
||||
end
|
||||
|
||||
local function inactive_formspec(type)
|
||||
local num_columns = (type == "Dark" and 2) or 3
|
||||
local function inactive_formspec(matter_type)
|
||||
local num_columns = (matter_type == "Dark" and 2) or 3
|
||||
local result = base_formspec..
|
||||
"list[context;src;0,0.5;"..tostring(num_columns)..",3;1]"..
|
||||
"list[context;dst;7,0.5;"..tostring(num_columns)..",3;1]"..
|
||||
"label[2.9,0;"..type.." Matter Furnace]"..
|
||||
"label[2.9,0;"..S("@1 Matter Furnace", matter_type).."]"..
|
||||
"image[2.9,1.5;1,1;default_furnace_fire_bg.png]"..
|
||||
"image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[transformR270]"
|
||||
if exchangeclone.mcl then
|
||||
|
@ -80,16 +96,16 @@ local function inactive_formspec(type)
|
|||
return result
|
||||
end
|
||||
|
||||
local function active_formspec(fuel_percent, item_percent, type)
|
||||
local num_columns = (type == "Dark" and 2) or 3
|
||||
local function active_formspec(fuel_percent, item_percent, matter_type)
|
||||
local num_columns = (matter_type == "Dark" and 2) or 3
|
||||
local result = base_formspec..
|
||||
"image[2.9,1.5;1,1;default_furnace_fire_bg.png^[lowpart:"..
|
||||
(100-fuel_percent)..":default_furnace_fire_fg.png]"..
|
||||
"list[context;src;0,0.5;"..tostring(num_columns)..",3;1]"..
|
||||
"list[context;dst;7,0.5;"..tostring(num_columns)..",3;1]"..
|
||||
"label[2.9,0;"..S("@1 Matter Furnace", matter_type).."]"..
|
||||
"image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[lowpart:"..
|
||||
(item_percent)..":gui_furnace_arrow_fg.png^[transformR270]"..
|
||||
"label[2.9,0;"..type.." Matter Furnace]"
|
||||
(item_percent)..":gui_furnace_arrow_fg.png^[transformR270]"
|
||||
if exchangeclone.mcl then
|
||||
result = result..
|
||||
mcl_formspec.get_itemslot_bg(0,0.5,num_columns,3)..
|
||||
|
@ -123,10 +139,12 @@ end]]
|
|||
--
|
||||
|
||||
local function allow_metadata_inventory_put(pos, listname, index, stack, player)
|
||||
local name = player:get_player_name()
|
||||
if minetest.is_protected(pos, name) then
|
||||
minetest.record_protection_violation(pos, name)
|
||||
return 0
|
||||
if player and player.get_player_name then
|
||||
local name = player:get_player_name()
|
||||
if minetest.is_protected(pos, name) then
|
||||
minetest.record_protection_violation(pos, name)
|
||||
return 0
|
||||
end
|
||||
end
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
|
@ -321,10 +339,10 @@ local function furnace_node_timer(pos, elapsed)
|
|||
|
||||
local using_collector = meta:get_int("using_collector") > 0
|
||||
|
||||
local type = "Dark"
|
||||
local matter_type = "Dark"
|
||||
local speed = 22 -- /10 to get items/second
|
||||
if minetest.get_node(pos).name:find("red_matter") then
|
||||
type = "Red"
|
||||
matter_type = "Red"
|
||||
speed = 66
|
||||
end
|
||||
|
||||
|
@ -400,7 +418,7 @@ local function furnace_node_timer(pos, elapsed)
|
|||
if src_time >= cooked.time then
|
||||
local count = cooked.item:get_count()
|
||||
if is_ore(srclist[1]:get_name()) and (count * 2 <= cooked.item:get_stack_max()) then
|
||||
if type == "Red" or (type == "Dark" and math.random(1,2) == 1) then
|
||||
if matter_type == "Red" or (matter_type == "Dark" and math.random(1,2) == 1) then
|
||||
cooked.item:set_count(count*2)
|
||||
end
|
||||
end
|
||||
|
@ -428,7 +446,7 @@ local function furnace_node_timer(pos, elapsed)
|
|||
--
|
||||
-- Update formspec and node
|
||||
--
|
||||
local formspec = inactive_formspec(type)
|
||||
local formspec = inactive_formspec(matter_type)
|
||||
local item_percent = 0
|
||||
if cookable then
|
||||
item_percent = math.floor(src_time / cooked.time * 100)
|
||||
|
@ -441,12 +459,12 @@ local function furnace_node_timer(pos, elapsed)
|
|||
if fuel_totaltime > 0 then
|
||||
fuel_percent = math.floor(fuel_time / fuel_totaltime * 100)
|
||||
end
|
||||
formspec = active_formspec(fuel_percent, item_percent, type)
|
||||
swap_node(pos, "exchangeclone:"..type:lower().."_matter_furnace_active")
|
||||
formspec = active_formspec(fuel_percent, item_percent, matter_type)
|
||||
swap_node(pos, "exchangeclone:"..matter_type:lower().."_matter_furnace_active")
|
||||
-- make sure timer restarts automatically
|
||||
result = true
|
||||
else
|
||||
swap_node(pos, "exchangeclone:"..type:lower().."_matter_furnace")
|
||||
swap_node(pos, "exchangeclone:"..matter_type:lower().."_matter_furnace")
|
||||
-- stop timer on the inactive furnace
|
||||
minetest.get_node_timer(pos):stop()
|
||||
end
|
||||
|
@ -479,50 +497,30 @@ if minetest.get_modpath("screwdriver") then
|
|||
return
|
||||
end
|
||||
spawn_flames(pos, node.param2)
|
||||
if exchangeclone.pipeworks then
|
||||
pipeworks.on_rotate(pos)
|
||||
end
|
||||
end
|
||||
end
|
||||
local pipeworks_connect = exchangeclone.pipeworks and "^pipeworks_tube_connection_stony.png" or ""
|
||||
|
||||
local inactive_def = {
|
||||
description = "Dark Matter Furnace",
|
||||
description = S("Dark Matter Furnace"),
|
||||
tiles = {
|
||||
"exchangeclone_dark_matter_block.png",
|
||||
"exchangeclone_dark_matter_block.png",
|
||||
"exchangeclone_dark_matter_block.png",
|
||||
"exchangeclone_dark_matter_block.png",
|
||||
"exchangeclone_dark_matter_block.png",
|
||||
"exchangeclone_dark_matter_block.png"..pipeworks_connect,
|
||||
"exchangeclone_dark_matter_block.png"..pipeworks_connect,
|
||||
"exchangeclone_dark_matter_block.png"..pipeworks_connect,
|
||||
"exchangeclone_dark_matter_block.png"..pipeworks_connect,
|
||||
"exchangeclone_dark_matter_block.png"..pipeworks_connect,
|
||||
"exchangeclone_dark_matter_furnace.png",
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
groups = {pickaxey=5, cracky = 3, container=4, material_stone=1, level = get_level(4), exchangeclone_furnace = 1},
|
||||
paramtype2 = "4dir",
|
||||
groups = {pickaxey=5, cracky = 3, container = exchangeclone.mcl2 and 2 or 4, material_stone=1, level = get_level(4), exchangeclone_furnace = 1, tubedevice = 1, tubedevice_receiver = 1},
|
||||
is_ground_content = false,
|
||||
sounds = exchangeclone.sound_mod.node_sound_stone_defaults(),
|
||||
|
||||
on_timer = furnace_node_timer,
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local meta2 = meta:to_table()
|
||||
meta:from_table(oldmetadata)
|
||||
local inv = meta:get_inventory()
|
||||
for _, listname in ipairs({"src", "dst", "fuel"}) do
|
||||
if listname == "src" or listname == "dst" then
|
||||
for i = 1,7 do
|
||||
local stack = inv:get_stack(listname, i)
|
||||
if not stack:is_empty() then
|
||||
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
|
||||
minetest.add_item(p, stack)
|
||||
end
|
||||
end
|
||||
else
|
||||
local stack = inv:get_stack(listname, 1)
|
||||
if not stack:is_empty() then
|
||||
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
|
||||
minetest.add_item(p, stack)
|
||||
end
|
||||
end
|
||||
end
|
||||
meta:from_table(meta2)
|
||||
end,
|
||||
|
||||
after_dig_node = exchangeclone.drop_after_dig({"src", "fuel", "dst"}),
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("formspec", inactive_formspec("Dark"))
|
||||
|
@ -567,52 +565,36 @@ local inactive_def = {
|
|||
_mcl_blast_resistance = 1500,
|
||||
_mcl_hardness = 75,
|
||||
on_rotate = on_rotate,
|
||||
can_dig = exchangeclone.can_dig,
|
||||
after_place_node = exchangeclone.pipeworks and pipeworks.after_place,
|
||||
_mcl_hoppers_on_try_pull = exchangeclone.mcl2_hoppers_on_try_pull(),
|
||||
_mcl_hoppers_on_try_push = exchangeclone.mcl2_hoppers_on_try_push(),
|
||||
_mcl_hoppers_on_after_push = function(pos)
|
||||
minetest.get_node_timer(pos):start(0.45)
|
||||
end,
|
||||
_on_hopper_in = exchangeclone.mcla_on_hopper_in(),
|
||||
_on_hopper_out = exchangeclone.mcla_on_hopper_out(),
|
||||
}
|
||||
|
||||
local active_def = {
|
||||
description = "Active Dark Matter Furnace",
|
||||
description = S("Active Dark Matter Furnace"),
|
||||
tiles = {
|
||||
"exchangeclone_dark_matter_block.png",
|
||||
"exchangeclone_dark_matter_block.png",
|
||||
"exchangeclone_dark_matter_block.png",
|
||||
"exchangeclone_dark_matter_block.png",
|
||||
"exchangeclone_dark_matter_block.png",
|
||||
"exchangeclone_dark_matter_block.png"..pipeworks_connect,
|
||||
"exchangeclone_dark_matter_block.png"..pipeworks_connect,
|
||||
"exchangeclone_dark_matter_block.png"..pipeworks_connect,
|
||||
"exchangeclone_dark_matter_block.png"..pipeworks_connect,
|
||||
"exchangeclone_dark_matter_block.png"..pipeworks_connect,
|
||||
"exchangeclone_dark_matter_furnace.png",
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
paramtype = "light",
|
||||
paramtype2 = "4dir",
|
||||
parammatter_type = "light",
|
||||
light_source = LIGHT_ACTIVE_FURNACE,
|
||||
drop = "exchangeclone:dark_matter_furnace",
|
||||
groups = {pickaxey=5, not_in_creative_inventory = 1, container = 4, material_stone=1, cracky = 3, level = get_level(4), exchangeclone_furnace = 1},
|
||||
groups = {pickaxey=5, not_in_creative_inventory = 1, container = exchangeclone.mcl2 and 2 or 4, material_stone=1, cracky = 3, level = get_level(4), exchangeclone_furnace = 1, tubedevice = 1, tubedevice_receiver = 1},
|
||||
is_ground_content = false,
|
||||
sounds = exchangeclone.sound_mod.node_sound_stone_defaults(),
|
||||
on_timer = furnace_node_timer,
|
||||
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local meta2 = meta:to_table()
|
||||
meta:from_table(oldmetadata)
|
||||
local inv = meta:get_inventory()
|
||||
for _, listname in ipairs({"src", "dst", "fuel"}) do
|
||||
if listname == "src" or listname == "dst" then
|
||||
for i = 1,7 do
|
||||
local stack = inv:get_stack(listname, i)
|
||||
if not stack:is_empty() then
|
||||
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
|
||||
minetest.add_item(p, stack)
|
||||
end
|
||||
end
|
||||
else
|
||||
local stack = inv:get_stack(listname, 1)
|
||||
if not stack:is_empty() then
|
||||
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
|
||||
minetest.add_item(p, stack)
|
||||
end
|
||||
end
|
||||
end
|
||||
meta:from_table(meta2)
|
||||
end,
|
||||
|
||||
after_dig_node = exchangeclone.drop_after_dig({"src", "fuel", "dst"}),
|
||||
on_construct = function(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
spawn_flames(pos, node.param2)
|
||||
|
@ -632,25 +614,58 @@ local active_def = {
|
|||
_mcl_blast_resistance = 1500,
|
||||
_mcl_hardness = 75,
|
||||
on_rotate = on_rotate,
|
||||
can_dig = exchangeclone.can_dig,
|
||||
after_rotate = after_rotate_active,
|
||||
after_place_node = exchangeclone.pipeworks and pipeworks.after_place,
|
||||
_mcl_hoppers_on_try_pull = exchangeclone.mcl2_hoppers_on_try_pull(),
|
||||
_mcl_hoppers_on_try_push = exchangeclone.mcl2_hoppers_on_try_push(),
|
||||
_on_hopper_in = exchangeclone.mcla_on_hopper_in(),
|
||||
_on_hopper_out = exchangeclone.mcla_on_hopper_out(),
|
||||
}
|
||||
|
||||
if exchangeclone.pipeworks then
|
||||
local function get_list(direction)
|
||||
return (direction.y == 0 and "src") or "fuel"
|
||||
end
|
||||
for _, table in pairs({inactive_def, active_def}) do
|
||||
table.tube = {
|
||||
input_inventory = "dst",
|
||||
connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1},
|
||||
insert_object = function(pos, node, stack, direction)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local result = inv:add_item(get_list(direction), stack)
|
||||
if result then
|
||||
local func = minetest.registered_items[node.name].on_metadata_inventory_put
|
||||
if func then func(pos) end
|
||||
end
|
||||
return result
|
||||
end,
|
||||
can_insert = function(pos, node, stack, direction)
|
||||
if allow_metadata_inventory_put(pos, get_list(direction), 1, stack) > 0 then
|
||||
return true
|
||||
end
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node("exchangeclone:dark_matter_furnace", table.copy(inactive_def))
|
||||
minetest.register_node("exchangeclone:red_matter_furnace", table.copy(inactive_def))
|
||||
minetest.register_node("exchangeclone:dark_matter_furnace_active", table.copy(active_def))
|
||||
minetest.register_node("exchangeclone:red_matter_furnace_active", table.copy(active_def))
|
||||
|
||||
minetest.override_item("exchangeclone:red_matter_furnace", {
|
||||
description = "Red Matter Furnace",
|
||||
description = S("Red Matter Furnace"),
|
||||
tiles = {
|
||||
"exchangeclone_red_matter_block.png",
|
||||
"exchangeclone_red_matter_block.png",
|
||||
"exchangeclone_red_matter_block.png",
|
||||
"exchangeclone_red_matter_block.png",
|
||||
"exchangeclone_red_matter_block.png",
|
||||
"exchangeclone_red_matter_block.png"..pipeworks_connect,
|
||||
"exchangeclone_red_matter_block.png"..pipeworks_connect,
|
||||
"exchangeclone_red_matter_block.png"..pipeworks_connect,
|
||||
"exchangeclone_red_matter_block.png"..pipeworks_connect,
|
||||
"exchangeclone_red_matter_block.png"..pipeworks_connect,
|
||||
"exchangeclone_red_matter_furnace.png",
|
||||
},
|
||||
groups = {pickaxey=5, cracky = 3, container=4, deco_block=1, material_stone=1, level = get_level(5), exchangeclone_furnace = 2},
|
||||
groups = {pickaxey=6, cracky = 3, container = exchangeclone.mcl2 and 2 or 4, deco_block=1, material_stone=1, level = get_level(5), exchangeclone_furnace = 2, tubedevice = 1, tubedevice_receiver = 1},
|
||||
_mcl_hardness = 100,
|
||||
|
||||
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
||||
|
@ -684,36 +699,18 @@ minetest.override_item("exchangeclone:red_matter_furnace", {
|
|||
inv:set_size("fuel", 1)
|
||||
inv:set_size("dst", 10)
|
||||
end,
|
||||
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local meta2 = meta:to_table()
|
||||
meta:from_table(oldmetadata)
|
||||
local inv = meta:get_inventory()
|
||||
for _, listname in ipairs({"src", "dst", "fuel"}) do
|
||||
if listname == "src" or listname == "dst" then
|
||||
for i = 1,10 do
|
||||
local stack = inv:get_stack(listname, i)
|
||||
if not stack:is_empty() then
|
||||
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
|
||||
minetest.add_item(p, stack)
|
||||
end
|
||||
end
|
||||
else
|
||||
local stack = inv:get_stack(listname, 1)
|
||||
if not stack:is_empty() then
|
||||
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
|
||||
minetest.add_item(p, stack)
|
||||
end
|
||||
end
|
||||
end
|
||||
meta:from_table(meta2)
|
||||
_mcl_hoppers_on_try_pull = exchangeclone.mcl2_hoppers_on_try_pull(),
|
||||
_mcl_hoppers_on_try_push = exchangeclone.mcl2_hoppers_on_try_push(),
|
||||
_mcl_hoppers_on_after_push = function(pos)
|
||||
minetest.get_node_timer(pos):start(0.16)
|
||||
end,
|
||||
_on_hopper_in = exchangeclone.mcla_on_hopper_in(),
|
||||
_on_hopper_out = exchangeclone.mcla_on_hopper_out(),
|
||||
|
||||
})
|
||||
|
||||
minetest.override_item("exchangeclone:red_matter_furnace_active", {
|
||||
description = "Active Red Matter Furnace",
|
||||
description = S("Active Red Matter Furnace"),
|
||||
tiles = {
|
||||
"exchangeclone_red_matter_block.png",
|
||||
"exchangeclone_red_matter_block.png",
|
||||
|
@ -723,7 +720,7 @@ minetest.override_item("exchangeclone:red_matter_furnace_active", {
|
|||
"exchangeclone_red_matter_furnace.png",
|
||||
},
|
||||
drop = "exchangeclone:red_matter_furnace",
|
||||
groups = {pickaxey=5, not_in_creative_inventory = 1, cracky = 3, container=4, deco_block=1, material_stone=1, level = get_level(5), exchangeclone_furnace = 2},
|
||||
groups = {pickaxey=6, not_in_creative_inventory = 1, cracky = 3, container = exchangeclone.mcl2 and 2 or 4, deco_block=1, material_stone=1, level = get_level(5), exchangeclone_furnace = 2, tubedevice = 1, tubedevice_receiver = 1},
|
||||
_mcl_hardness = 100,
|
||||
|
||||
on_construct = function(pos)
|
||||
|
@ -734,32 +731,6 @@ minetest.override_item("exchangeclone:red_matter_furnace_active", {
|
|||
inv:set_size("fuel", 1)
|
||||
inv:set_size("dst", 10)
|
||||
end,
|
||||
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local meta2 = meta:to_table()
|
||||
meta:from_table(oldmetadata)
|
||||
local inv = meta:get_inventory()
|
||||
for _, listname in ipairs({"src", "dst", "fuel"}) do
|
||||
if listname == "src" or listname == "dst" then
|
||||
for i = 1,10 do
|
||||
local stack = inv:get_stack(listname, i)
|
||||
if not stack:is_empty() then
|
||||
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
|
||||
minetest.add_item(p, stack)
|
||||
end
|
||||
end
|
||||
else
|
||||
local stack = inv:get_stack(listname, 1)
|
||||
if not stack:is_empty() then
|
||||
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
|
||||
minetest.add_item(p, stack)
|
||||
end
|
||||
end
|
||||
end
|
||||
meta:from_table(meta2)
|
||||
end,
|
||||
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
|
@ -1,34 +1,34 @@
|
|||
local S = minetest.get_translator()
|
||||
|
||||
local stone_group = "cracky"
|
||||
if exchangeclone.mcl then
|
||||
stone_group = "pickaxey"
|
||||
end
|
||||
|
||||
exchangeclone.hammer_action = {
|
||||
start_action = function(player, center, range)
|
||||
start_action = function(player, center, range, itemstack)
|
||||
if exchangeclone.check_cooldown(player, "hammer") then return end
|
||||
local data = {}
|
||||
exchangeclone.multidig[player:get_player_name()] = true -- to prevent doing 3x3 as well as AOE
|
||||
exchangeclone.play_ability_sound(player)
|
||||
data.player_energy = exchangeclone.get_player_energy(player)
|
||||
data.energy_cost = 0
|
||||
data.itemstack = itemstack
|
||||
data.remove_positions = {}
|
||||
return data
|
||||
end,
|
||||
action = function(player, pos, node, data)
|
||||
if data.energy_cost + 8 > data.player_energy then return end
|
||||
if minetest.get_item_group(node.name, stone_group) ~= 0 then
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
minetest.record_protection_violation(pos, player:get_player_name())
|
||||
else
|
||||
data.energy_cost = data.energy_cost + 8
|
||||
local drops = minetest.get_node_drops(node.name, "exchangeclone:red_matter_hammer")
|
||||
local drops = minetest.get_node_drops(node.name, data.itemstack)
|
||||
exchangeclone.drop_items_on_player(pos, drops, player)
|
||||
minetest.set_node(pos, {name = "air"})
|
||||
table.insert(data.remove_positions, pos)
|
||||
end
|
||||
end
|
||||
return data
|
||||
end,
|
||||
end_action = function(player, center, range, data)
|
||||
exchangeclone.set_player_energy(player, data.player_energy - data.energy_cost)
|
||||
exchangeclone.remove_nodes(data.remove_positions)
|
||||
exchangeclone.multidig[player:get_player_name()] = nil
|
||||
exchangeclone.start_cooldown(player, "hammer", range/2) -- The hammer has by far the most lag potential and therefore a long cooldown.
|
||||
end
|
||||
|
@ -52,10 +52,10 @@ local function hammer_on_place(itemstack, player, pointed_thing)
|
|||
local current_name = itemstack:get_name()
|
||||
if string.sub(current_name, -4, -1) == "_3x3" then
|
||||
itemstack:set_name(string.sub(current_name, 1, -5))
|
||||
minetest.chat_send_player(player:get_player_name(), "Single node mode")
|
||||
minetest.chat_send_player(player:get_player_name(), S("Single node mode"))
|
||||
else
|
||||
itemstack:set_name(current_name.."_3x3")
|
||||
minetest.chat_send_player(player:get_player_name(), "3x3 mode")
|
||||
minetest.chat_send_player(player:get_player_name(), S("3x3 mode"))
|
||||
end
|
||||
return itemstack
|
||||
end
|
||||
|
@ -65,14 +65,14 @@ local function hammer_on_place(itemstack, player, pointed_thing)
|
|||
if pointed_thing.type == "node" then
|
||||
center = pointed_thing.under
|
||||
end
|
||||
exchangeclone.node_radius_action(player, center, range, exchangeclone.hammer_action)
|
||||
exchangeclone.node_radius_action(player, center, range, exchangeclone.hammer_action, itemstack)
|
||||
end
|
||||
|
||||
minetest.register_tool("exchangeclone:dark_matter_hammer", {
|
||||
description = "Dark Matter Hammer",
|
||||
description = S("Dark Matter Hammer").."\n"..S("Single node mode"),
|
||||
wield_image = "exchangeclone_dark_matter_hammer.png",
|
||||
inventory_image = "exchangeclone_dark_matter_hammer.png",
|
||||
groups = { tool=1, hammer=1, dig_speed_class=7, enchantability=0, dark_matter_hammer = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
groups = { tool=1, hammer=1, dig_speed_class=5, enchantability=0, dark_matter_hammer = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
wield_scale = exchangeclone.wield_scale,
|
||||
tool_capabilities = {
|
||||
-- 1/1.2
|
||||
|
@ -87,17 +87,17 @@ minetest.register_tool("exchangeclone:dark_matter_hammer", {
|
|||
sound = { breaks = "default_tool_breaks" },
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
pickaxey = { speed = 16, level = 7, uses = 0 }
|
||||
pickaxey = { speed = 16, level = 5, uses = 0 }
|
||||
},
|
||||
on_place = hammer_on_place,
|
||||
on_secondary_use = hammer_on_place,
|
||||
})
|
||||
|
||||
minetest.register_tool("exchangeclone:dark_matter_hammer_3x3", {
|
||||
description = "Dark Matter Hammer",
|
||||
description = S("Dark Matter Hammer").."\n"..S("3x3 mode"),
|
||||
wield_image = "exchangeclone_dark_matter_hammer.png",
|
||||
inventory_image = "exchangeclone_dark_matter_hammer.png",
|
||||
groups = { tool=1, hammer=1, dig_speed_class=7, enchantability=0, dark_matter_hammer = 1, not_in_creative_inventory = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
groups = { tool=1, hammer=1, dig_speed_class=5, enchantability=0, dark_matter_hammer = 1, not_in_creative_inventory = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
wield_scale = exchangeclone.wield_scale,
|
||||
tool_capabilities = {
|
||||
-- 1/1.2
|
||||
|
@ -112,17 +112,19 @@ minetest.register_tool("exchangeclone:dark_matter_hammer_3x3", {
|
|||
sound = { breaks = "default_tool_breaks" },
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
pickaxey = { speed = 12, level = 7, uses = 0 }
|
||||
pickaxey = { speed = 12, level = 5, uses = 0 }
|
||||
},
|
||||
on_place = hammer_on_place,
|
||||
on_secondary_use = hammer_on_place,
|
||||
})
|
||||
|
||||
exchangeclone.register_alias("exchangeclone:dark_matter_hammer", "exchangeclone:dark_matter_hammer_3x3")
|
||||
|
||||
minetest.register_tool("exchangeclone:red_matter_hammer", {
|
||||
description = "Red Matter Hammer",
|
||||
description = S("Red Matter Hammer").."\n"..S("Single node mode"),
|
||||
wield_image = "exchangeclone_red_matter_hammer.png",
|
||||
inventory_image = "exchangeclone_red_matter_hammer.png",
|
||||
groups = { tool=1, hammer=1, dig_speed_class=7, enchantability=0, red_matter_hammer = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
groups = { tool=1, hammer=1, dig_speed_class=6, enchantability=0, red_matter_hammer = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
wield_scale = exchangeclone.wield_scale,
|
||||
tool_capabilities = {
|
||||
-- 1/1.2
|
||||
|
@ -137,17 +139,17 @@ minetest.register_tool("exchangeclone:red_matter_hammer", {
|
|||
sound = { breaks = "default_tool_breaks" },
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
pickaxey = { speed = 19, level = 8, uses = 0 }
|
||||
pickaxey = { speed = 19, level = 6, uses = 0 }
|
||||
},
|
||||
on_place = hammer_on_place,
|
||||
on_secondary_use = hammer_on_place,
|
||||
})
|
||||
|
||||
minetest.register_tool("exchangeclone:red_matter_hammer_3x3", {
|
||||
description = "Red Matter Hammer",
|
||||
description = S("Red Matter Hammer\n3x3 mode"),
|
||||
wield_image = "exchangeclone_red_matter_hammer.png",
|
||||
inventory_image = "exchangeclone_red_matter_hammer.png",
|
||||
groups = { tool=1, hammer=1, dig_speed_class=7, enchantability=0, red_matter_hammer = 1, not_in_creative_inventory = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
groups = { tool=1, hammer=1, dig_speed_class=6, enchantability=0, red_matter_hammer = 1, not_in_creative_inventory = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
wield_scale = exchangeclone.wield_scale,
|
||||
tool_capabilities = {
|
||||
-- 1/1.2
|
||||
|
@ -162,18 +164,20 @@ minetest.register_tool("exchangeclone:red_matter_hammer_3x3", {
|
|||
sound = { breaks = "default_tool_breaks" },
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
pickaxey = { speed = 14, level = 8, uses = 0 }
|
||||
pickaxey = { speed = 14, level = 6, uses = 0 }
|
||||
},
|
||||
on_place = hammer_on_place,
|
||||
on_secondary_use = hammer_on_place,
|
||||
})
|
||||
|
||||
exchangeclone.register_alias("exchangeclone:red_matter_hammer", "exchangeclone:red_matter_hammer_3x3")
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:dark_matter_hammer",
|
||||
recipe = {
|
||||
{"exchangeclone:dark_matter", exchangeclone.diamond_itemstring, "exchangeclone:dark_matter"},
|
||||
{"", exchangeclone.diamond_itemstring, ""},
|
||||
{"", exchangeclone.diamond_itemstring, ""}
|
||||
{"exchangeclone:dark_matter", exchangeclone.itemstrings.diamond, "exchangeclone:dark_matter"},
|
||||
{"", exchangeclone.itemstrings.diamond, ""},
|
||||
{"", exchangeclone.itemstrings.diamond, ""}
|
||||
}
|
||||
})
|
||||
|
|
@ -1,3 +1,5 @@
|
|||
local S = minetest.get_translator()
|
||||
|
||||
local function create_soil(itemstack, player, pointed_thing)
|
||||
if not pointed_thing.under then return end
|
||||
if not pointed_thing.under.x then return end
|
||||
|
@ -30,7 +32,11 @@ local hoe_function
|
|||
if exchangeclone.mcl then
|
||||
hoe_function = create_soil
|
||||
else
|
||||
hoe_function = farming.hoe_on_use -- assuming farming exists
|
||||
if farming then
|
||||
hoe_function = farming.hoe_on_use
|
||||
else
|
||||
hoe_function = function(...) end
|
||||
end
|
||||
end
|
||||
|
||||
exchangeclone.hoe_action = {
|
||||
|
@ -40,27 +46,22 @@ exchangeclone.hoe_action = {
|
|||
if range > 0 then
|
||||
exchangeclone.play_ability_sound(player)
|
||||
end
|
||||
data.player_energy = exchangeclone.get_player_energy(player)
|
||||
data.energy_cost = 0
|
||||
data.itemstack = itemstack
|
||||
return data
|
||||
end,
|
||||
action = function(player, pos, node, data)
|
||||
local new_pointed_thing = {type = "node", under = pos, above = {x=pos.x,y=pos.y+1,z=pos.z}}
|
||||
data.energy_cost = data.energy_cost + 4
|
||||
hoe_function(data.itemstack, player, new_pointed_thing)
|
||||
return data
|
||||
end,
|
||||
end_action = function(player, center, range, data)
|
||||
if range > 0 then
|
||||
exchangeclone.set_player_energy(player, data.player_energy - data.energy_cost)
|
||||
exchangeclone.start_cooldown(player, "hoe", range/4)
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
local hoe_on_place = function(itemstack, player, pointed_thing)
|
||||
|
||||
local click_test = exchangeclone.check_on_rightclick(itemstack, player, pointed_thing)
|
||||
if click_test ~= false then
|
||||
return click_test
|
||||
|
@ -78,10 +79,10 @@ local hoe_on_place = function(itemstack, player, pointed_thing)
|
|||
local current_name = itemstack:get_name()
|
||||
if string.sub(current_name, -4, -1) == "_3x3" then
|
||||
itemstack:set_name(string.sub(current_name, 1, -5))
|
||||
minetest.chat_send_player(player:get_player_name(), "Single node mode")
|
||||
minetest.chat_send_player(player:get_player_name(), S("Single node mode"))
|
||||
else
|
||||
itemstack:set_name(current_name.."_3x3")
|
||||
minetest.chat_send_player(player:get_player_name(), "3x3 mode")
|
||||
minetest.chat_send_player(player:get_player_name(), S("3x3 mode"))
|
||||
end
|
||||
return itemstack
|
||||
end
|
||||
|
@ -109,7 +110,7 @@ for name, def in pairs(minetest.registered_nodes) do
|
|||
end
|
||||
|
||||
local hoe_def = {
|
||||
description = "Dark Matter Hoe",
|
||||
description = S("Dark Matter Hammer").."\n"..S("Single node mode"),
|
||||
wield_image = "exchangeclone_dark_matter_hoe.png",
|
||||
inventory_image = "exchangeclone_dark_matter_hoe.png",
|
||||
wield_scale = exchangeclone.wield_scale,
|
||||
|
@ -133,13 +134,16 @@ local hoe_def = {
|
|||
minetest.register_tool("exchangeclone:dark_matter_hoe", table.copy(hoe_def))
|
||||
|
||||
local hoe_3x3_def = table.copy(hoe_def)
|
||||
hoe_3x3_def.description = S("Dark Matter Hammer").."\n"..S("3x3 mode")
|
||||
hoe_3x3_def.groups.not_in_creative_inventory = 1
|
||||
hoe_3x3_def.tool_capabilities.groupcaps.exchangeclone_dirt.times = {[1]=0.4, [2]=0.4, [3]=0.4}
|
||||
hoe_3x3_def._mcl_diggroups.exchangeclone_dirt = { speed = 8, level = 7, uses = 0 }
|
||||
|
||||
minetest.register_tool("exchangeclone:dark_matter_hoe_3x3", table.copy(hoe_3x3_def))
|
||||
|
||||
hoe_def.description = "Red Matter Hoe"
|
||||
exchangeclone.register_alias("exchangeclone:dark_matter_hoe", "exchangeclone:dark_matter_hoe_3x3")
|
||||
|
||||
hoe_def.description = S("Red Matter Hammer").."\n"..S("Single node mode")
|
||||
hoe_def.wield_image = "exchangeclone_red_matter_hoe.png"
|
||||
hoe_def.inventory_image = "exchangeclone_red_matter_hoe.png"
|
||||
hoe_def.groups = { tool=1, hoe=1, enchantability=0, red_matter_hoe = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1}
|
||||
|
@ -158,18 +162,21 @@ hoe_def._mcl_diggroups = {
|
|||
minetest.register_tool("exchangeclone:red_matter_hoe", table.copy(hoe_def))
|
||||
|
||||
hoe_3x3_def = table.copy(hoe_def)
|
||||
hoe_3x3_def.description = S("Red Matter Hammer").."\n"..S("3x3 mode")
|
||||
hoe_3x3_def.groups.not_in_creative_inventory = 1
|
||||
hoe_3x3_def.tool_capabilities.groupcaps.exchangeclone_dirt.times = {[1]=0.25, [2]=0.25, [3]=0.25}
|
||||
hoe_3x3_def._mcl_diggroups.exchangeclone_dirt = { speed = 9, level = 8, uses = 0 }
|
||||
|
||||
minetest.register_tool("exchangeclone:red_matter_hoe_3x3", table.copy(hoe_3x3_def))
|
||||
|
||||
exchangeclone.register_alias("exchangeclone:red_matter_hoe", "exchangeclone:red_matter_hoe_3x3")
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:dark_matter_hoe",
|
||||
recipe = {
|
||||
{"exchangeclone:dark_matter", "exchangeclone:dark_matter"},
|
||||
{"", exchangeclone.diamond_itemstring},
|
||||
{"", exchangeclone.diamond_itemstring}
|
||||
{"", exchangeclone.itemstrings.diamond},
|
||||
{"", exchangeclone.itemstrings.diamond}
|
||||
}
|
||||
})
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
-- Runs only if the hopper mod is detected. This pretty much makes it so that anything that works with
|
||||
-- MineClone hoppers will automatically work with other hoppers.
|
||||
|
||||
hopper:add_container({
|
||||
{"top", "group:container=2", "main"},
|
||||
{"bottom", "group:container=2", "main"},
|
||||
{"side", "group:container=2", "main"},
|
||||
})
|
||||
|
||||
hopper:add_container({
|
||||
{"top", "group:container=3", "main"},
|
||||
{"bottom", "group:container=3", "main"},
|
||||
{"side", "group:container=3", "main"},
|
||||
})
|
||||
|
||||
-- I assumed "top" meant when it's on top of a node, not when there's a node on top of it. Whoops.
|
||||
hopper:add_container({
|
||||
{"top", "group:container=4", "dst"},
|
||||
{"side", "group:container=4", "fuel"},
|
||||
{"bottom", "group:container=4", "src"},
|
||||
})
|
||||
|
||||
-- Hoppers will only be able to insert into one side of a double chest, I think (unless you have 1 hopper per side)
|
||||
hopper:add_container({
|
||||
{"top", "group:container=5", "main"},
|
||||
{"bottom", "group:container=5", "main"},
|
||||
{"side", "group:container=5", "main"},
|
||||
})
|
||||
hopper:add_container({
|
||||
{"top", "group:container=6", "main"},
|
||||
{"bottom", "group:container=6", "main"},
|
||||
{"side", "group:container=6", "main"},
|
||||
})
|
|
@ -0,0 +1,55 @@
|
|||
local S = minetest.get_translator()
|
||||
|
||||
local stamina_exists = minetest.get_modpath("stamina")
|
||||
local stamina_max = minetest.settings:get("stamina.visual_max") or 20
|
||||
|
||||
local function infinite_food_function(itemstack, player, pointed_thing)
|
||||
local click_test = exchangeclone.check_on_rightclick(itemstack, player, pointed_thing)
|
||||
local original = ItemStack(itemstack)
|
||||
if click_test ~= false then
|
||||
return click_test
|
||||
end
|
||||
local player_energy = exchangeclone.get_player_energy(player)
|
||||
if player_energy >= 64 then
|
||||
if stamina_exists then
|
||||
if stamina.get_saturation(player) >= stamina_max then
|
||||
return nil
|
||||
end
|
||||
elseif not exchangeclone.mcl and player:get_hp() >= player:get_properties().hp_max then
|
||||
return nil
|
||||
end
|
||||
-- no idea why this is different between games but it works
|
||||
local hunger_restore = minetest.item_eat(8, exchangeclone.mcl and ItemStack("") or original)
|
||||
hunger_restore(itemstack, player, pointed_thing)
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
minetest.register_tool("exchangeclone:infinite_food", {
|
||||
description = S("Infinite Food").."\n"..S("Consumes 64 energy when eaten"),
|
||||
wield_image = "farming_bread.png^[colorize:#ffff00:128",
|
||||
inventory_image = "farming_bread.png^[colorize:#ffff00:128",
|
||||
groups = { food = 2, eatable = 8, disable_repair = 1, fire_immune = 1},
|
||||
on_place = exchangeclone.mcl and infinite_food_function,
|
||||
on_secondary_use = exchangeclone.mcl and infinite_food_function,
|
||||
on_use = (not exchangeclone.mcl) and infinite_food_function,
|
||||
_mcl_saturation = 12.8,
|
||||
})
|
||||
|
||||
minetest.register_on_item_eat(function(hp_change, replace_with_item, itemstack, player, pointed_thing)
|
||||
local player_energy = exchangeclone.get_player_energy(player)
|
||||
if itemstack:get_name() == "exchangeclone:infinite_food" then
|
||||
exchangeclone.set_player_energy(player, player_energy - 64)
|
||||
end
|
||||
end)
|
||||
|
||||
local bread_itemstring = exchangeclone.mcl and "mcl_farming:bread" or "farming:bread"
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:infinite_food",
|
||||
recipe = {
|
||||
{bread_itemstring, bread_itemstring, bread_itemstring,},
|
||||
{bread_itemstring, "exchangeclone:transmutation_tablet", bread_itemstring,},
|
||||
{bread_itemstring, bread_itemstring, bread_itemstring,},
|
||||
}
|
||||
})
|
|
@ -0,0 +1,146 @@
|
|||
if not exchangeclone then
|
||||
error("Disable and re-enable the ExchangeClone modpack.")
|
||||
end
|
||||
|
||||
local start_time = minetest.get_us_time()
|
||||
minetest.log("action", "[ExchangeClone] Registering own stuff")
|
||||
|
||||
-- Decides what mod to use for sounds
|
||||
exchangeclone.sound_mod = exchangeclone.mcl and mcl_sounds or default
|
||||
|
||||
local modpath = minetest.get_modpath("exchangeclone")
|
||||
|
||||
exchangeclone.colors = {}
|
||||
|
||||
if exchangeclone.mcl then
|
||||
-- I finally found a good place to get color data in both games.
|
||||
for unicolor, data in pairs(mcl_banners.colors) do
|
||||
if not exchangeclone.colors[data[1]] then
|
||||
exchangeclone.colors[data[1]] = {
|
||||
name = data[6],
|
||||
hex = data[4],
|
||||
dye = data[5],
|
||||
}
|
||||
end
|
||||
end
|
||||
else
|
||||
-- color hex values taken from MCLA
|
||||
exchangeclone.colors = {
|
||||
white = {
|
||||
name = "White",
|
||||
hex = "#d0d6d7",
|
||||
dye = "dye:white",
|
||||
},
|
||||
grey = {
|
||||
name = "Grey",
|
||||
hex = "#818177",
|
||||
dye = "dye:grey",
|
||||
},
|
||||
dark_grey = {
|
||||
name = "Dark Grey",
|
||||
hex = "#383c40",
|
||||
dye = "dye:dark_grey",
|
||||
},
|
||||
black = {
|
||||
name = "Black",
|
||||
hex = "#080a10",
|
||||
dye = "dye:black",
|
||||
},
|
||||
violet = {
|
||||
name = "Violet",
|
||||
hex = "#6821a0",
|
||||
dye = "dye:violet",
|
||||
},
|
||||
blue = {
|
||||
name = "Blue",
|
||||
hex = "#2e3094",
|
||||
dye = "dye:blue",
|
||||
},
|
||||
cyan = {
|
||||
name = "Cyan",
|
||||
hex = "#167b8c",
|
||||
dye = "dye:cyan",
|
||||
},
|
||||
dark_green = {
|
||||
name = "Dark Green",
|
||||
hex = "#4b5e25",
|
||||
dye = "dye:dark_green",
|
||||
},
|
||||
green = {
|
||||
name = "Green",
|
||||
hex = "#60ac19",
|
||||
dye = "dye:green",
|
||||
},
|
||||
yellow = {
|
||||
name = "Yellow",
|
||||
hex = "#f1b216",
|
||||
dye = "dye:yellow",
|
||||
},
|
||||
brown = {
|
||||
name = "Brown",
|
||||
hex = "#633d20",
|
||||
dye = "dye:brown",
|
||||
},
|
||||
orange = {
|
||||
name = "Orange",
|
||||
hex = "#e26501",
|
||||
dye = "dye:orange",
|
||||
},
|
||||
red = {
|
||||
name = "Red",
|
||||
hex = "#912222",
|
||||
dye = "dye:red",
|
||||
},
|
||||
magenta = {
|
||||
name = "Magenta",
|
||||
hex = "#ab31a2",
|
||||
dye = "dye:magenta",
|
||||
},
|
||||
pink = {
|
||||
name = "Pink",
|
||||
hex = "#d56791",
|
||||
dye = "dye:pink",
|
||||
},
|
||||
}
|
||||
end
|
||||
|
||||
dofile(modpath.."/constructor.lua")
|
||||
dofile(modpath.."/deconstructor.lua")
|
||||
dofile(modpath.."/energy_collector.lua")
|
||||
dofile(modpath.."/orb.lua")
|
||||
dofile(modpath.."/craftitems.lua")
|
||||
if exchangeclone.mcl or minetest.get_modpath("3d_armor") then
|
||||
dofile(modpath.."/armor.lua")
|
||||
end
|
||||
if exchangeclone.mcl then
|
||||
mcl_item_id.set_mod_namespace("exchangeclone")
|
||||
dofile(modpath.."/shears.lua")
|
||||
dofile(modpath.."/tool_upgrades.lua")
|
||||
end
|
||||
dofile(modpath.."/multidig.lua")
|
||||
dofile(modpath.."/swords.lua")
|
||||
dofile(modpath.."/axes.lua")
|
||||
dofile(modpath.."/hoes.lua")
|
||||
dofile(modpath.."/pickaxes.lua")
|
||||
dofile(modpath.."/hammers.lua")
|
||||
dofile(modpath.."/shovels.lua")
|
||||
dofile(modpath.."/red_matter_multitools.lua")
|
||||
dofile(modpath.."/covalence_dust.lua")
|
||||
if minetest.get_modpath("hopper") then
|
||||
dofile(modpath.."/hopper_compat.lua")
|
||||
end
|
||||
dofile(modpath.."/philosophers_stone.lua")
|
||||
dofile(modpath.."/pesa.lua")
|
||||
dofile(modpath.."/infinite_food.lua")
|
||||
dofile(modpath.."/alchemical_chests.lua")
|
||||
dofile(modpath.."/transmutation_table.lua")
|
||||
dofile(modpath.."/furnaces.lua")
|
||||
|
||||
minetest.register_on_mods_loaded(function()
|
||||
local energy_start_time = minetest.get_us_time()
|
||||
minetest.log("action", "[ExchangeClone] Registering energy values")
|
||||
dofile(modpath.."/register_energy.lua")
|
||||
minetest.log("action", "[ExchangeClone] Done registering energy values ("..((minetest.get_us_time() - energy_start_time)/1000000).." seconds)")
|
||||
end)
|
||||
|
||||
minetest.log("action", "[ExchangeClone] Done ("..((minetest.get_us_time() - start_time)/1000).." milliseconds)")
|
|
@ -0,0 +1,6 @@
|
|||
name = exchangeclone
|
||||
title = ExchangeClone
|
||||
description = The main part of the modpack (depends on both the other mods)
|
||||
depends = zzzz_exchangeclone_init
|
||||
optional_depends = mcl_core, default, mcl_armor, 3d_armor, mcl_item_id, mobs_mc, hopper, pipeworks, mcl_dispensers
|
||||
author = ThePython10110
|
|
@ -1,19 +1,13 @@
|
|||
exchangeclone.multidig = {}
|
||||
|
||||
local stone_group = "cracky"
|
||||
if exchangeclone.mcl then
|
||||
stone_group = "pickaxey"
|
||||
end
|
||||
local stone_group = exchangeclone.mcl and "pickaxey" or "cracky"
|
||||
|
||||
local dirt_group = "crumbly"
|
||||
if exchangeclone.mcl then
|
||||
dirt_group = "shovely"
|
||||
end
|
||||
local dirt_group = exchangeclone.mcl and "shovely" or "crumbly"
|
||||
|
||||
local function dig_if_group(pos, player, groups)
|
||||
local node = minetest.get_node(pos)
|
||||
for _, group in ipairs(groups) do
|
||||
if minetest.get_item_group(node.name, group) ~= 0 then
|
||||
for _, group in pairs(groups) do
|
||||
if minetest.get_item_group(node.name, group) > 0 then
|
||||
minetest.node_dig(pos, minetest.get_node(pos), player)
|
||||
end
|
||||
end
|
||||
|
@ -37,7 +31,7 @@ minetest.register_on_dignode(
|
|||
local itemname = player:get_wielded_item():get_name()
|
||||
local dig_data = special_dig[itemname]
|
||||
if not dig_data then return end
|
||||
|
||||
|
||||
local playername = player:get_player_name()
|
||||
if(playername == "" or exchangeclone.multidig[playername]) then
|
||||
return
|
|
@ -1,3 +1,5 @@
|
|||
local S = minetest.get_translator()
|
||||
|
||||
local function read_orb_charge(itemstack, player, pointed_thing)
|
||||
local click_test = exchangeclone.check_on_rightclick(itemstack, player, pointed_thing)
|
||||
if click_test ~= false then
|
||||
|
@ -5,41 +7,32 @@ local function read_orb_charge(itemstack, player, pointed_thing)
|
|||
end
|
||||
|
||||
local stored = exchangeclone.get_orb_itemstack_energy(itemstack)
|
||||
minetest.chat_send_player(player:get_player_name(), "Current Charge: "..stored)
|
||||
minetest.chat_send_player(player:get_player_name(), S("Current Charge: @1", exchangeclone.format_number(stored)))
|
||||
return itemstack
|
||||
end
|
||||
|
||||
minetest.register_tool("exchangeclone:exchange_orb", {
|
||||
description = "Exchange Orb\nCurrent Charge: 0",
|
||||
description = S("Exchange Orb").."\n"..S("Current Charge: @1", 0),
|
||||
inventory_image = "exchangeclone_exchange_orb.png",
|
||||
energy_value = 33792,
|
||||
color = "#000000",
|
||||
on_secondary_use = read_orb_charge,
|
||||
on_place = read_orb_charge,
|
||||
groups = {exchange_orb = 1, disable_repair = 1, fire_immune = 1}
|
||||
})
|
||||
|
||||
local recipe_item_1 = "default:steel_ingot"
|
||||
local recipe_item_2 = "default:diamond"
|
||||
|
||||
if exchangeclone.mcl then
|
||||
recipe_item_1 = "mcl_core:iron_ingot"
|
||||
recipe_item_2 = "mcl_core:diamond"
|
||||
end
|
||||
|
||||
minetest.register_craft({
|
||||
type = "shaped",
|
||||
output = "exchangeclone:exchange_orb",
|
||||
groups = {},
|
||||
recipe = {
|
||||
{recipe_item_2, recipe_item_1, recipe_item_2},
|
||||
{recipe_item_1, "exchangeclone:philosophers_stone", recipe_item_1},
|
||||
{recipe_item_2, recipe_item_1, recipe_item_2}
|
||||
{exchangeclone.itemstrings.diamond, exchangeclone.itemstrings.iron, exchangeclone.itemstrings.diamond},
|
||||
{exchangeclone.itemstrings.iron, "exchangeclone:philosophers_stone", exchangeclone.itemstrings.iron},
|
||||
{exchangeclone.itemstrings.diamond, exchangeclone.itemstrings.iron, exchangeclone.itemstrings.diamond}
|
||||
},
|
||||
replacements = {{"exchangeclone:philosophers_stone", "exchangeclone:philosophers_stone"}}
|
||||
})
|
||||
minetest.register_craft({ --Making it fuel so hopper will work with constructor better
|
||||
minetest.register_craft({ -- Making it fuel so MineClone hoppers will work with (de)constructors
|
||||
type = "fuel",
|
||||
recipe = "exchangeclone:exchange_orb",
|
||||
burntime = 24000 --Basically 30 coal blocks... it should be worth it.
|
||||
burntime = 24000 --Basically 30 coal blocks...
|
||||
})
|
|
@ -1,6 +1,8 @@
|
|||
-- Personal Energy Storage Accessor (PESA)
|
||||
-- Deprecated now that personal energy exists.
|
||||
|
||||
-- Not bothering to add translation stuff.
|
||||
|
||||
local formspec
|
||||
if not exchangeclone.mcl then
|
||||
formspec = {
|
|
@ -0,0 +1,663 @@
|
|||
local S = minetest.get_translator()
|
||||
|
||||
local phil = "exchangeclone:philosophers_stone"
|
||||
|
||||
local function show_enchanting(player)
|
||||
local player_meta = player:get_meta()
|
||||
player_meta:set_int("mcl_enchanting:num_bookshelves", 8) -- 15 for max enchantments
|
||||
player_meta:set_string("mcl_enchanting:table_name", S("Enchanting Table").." (".. S("Philosopher's Stone")..")")
|
||||
mcl_enchanting.show_enchanting_formspec(player)
|
||||
end
|
||||
|
||||
local width = (exchangeclone.mcl and 9) or 8
|
||||
|
||||
local repairing_formspec =
|
||||
"size["..tostring(width)..", 7]"..
|
||||
"label[0.5,0.5;Repairing]"..
|
||||
"label["..tostring(width/3-0.5)..",0.5;Dust]"..
|
||||
"list[current_player;exchangeclone_covalence_dust;"..tostring(width/3-0.5)..",1;1,1]"..
|
||||
"label["..tostring(width/2-0.5)..",0.5;Gear]"..
|
||||
"list[current_player;exchangeclone_covalence_gear;"..tostring(width/2-0.5)..",1;1,1]"..
|
||||
"label["..tostring(2*width/3-0.5)..",0.5;Output]"..
|
||||
"list[current_player;exchangeclone_covalence_output;"..tostring(2*width/3-0.5)..",1;1,1]"..
|
||||
exchangeclone.inventory_formspec(0,2.75)..
|
||||
"listring[current_player;main]"..
|
||||
"listring[current_player;exchangeclone_covalence_gear]"..
|
||||
"listring[current_player;main]"..
|
||||
"listring[current_player;exchangeclone_covalence_dust]"..
|
||||
"listring[current_player;main]"..
|
||||
"listring[current_player;exchangeclone_covalence_output]"..
|
||||
"listring[current_player;main]"
|
||||
|
||||
if exchangeclone.mcl then
|
||||
repairing_formspec = repairing_formspec..
|
||||
mcl_formspec.get_itemslot_bg(width/3-0.5,1,1,1)..
|
||||
mcl_formspec.get_itemslot_bg(width/2-0.5,1,1,1)..
|
||||
mcl_formspec.get_itemslot_bg(2*width/3-0.5,1,1,1)
|
||||
end
|
||||
|
||||
exchangeclone.node_transmutations = {
|
||||
{ --use
|
||||
["mcl_core:stone"] = "mcl_core:cobble",
|
||||
["mcl_core:cobble"] = "mcl_core:stone",
|
||||
["mcl_core:dirt_with_grass"] = "mcl_core:sand",
|
||||
["mcl_core:dirt"] = "mcl_core:sand",
|
||||
["mcl_core:sand"] = "mcl_core:dirt_with_grass",
|
||||
["mcl_core:podzol"] = "mcl_core:redsand",
|
||||
["mcl_core:redsand"] = "mcl_core:podzol",
|
||||
["mcl_flowers:tallgrass"] = "mcl_flowers:fern",
|
||||
["mcl_flowers:fern"] = "mcl_flowers:tallgrass",
|
||||
["mcl_core:redsandstone"] = "mcl_core:gravel",
|
||||
["mcl_farming:pumpkin"] = "mcl_farming:melon",
|
||||
["mcl_farming:melon"] = "mcl_farming:pumpkin",
|
||||
["mcl_core:water_source"] = "mcl_core:ice",
|
||||
["mclx_core:river_water_source"] = "mcl_core:ice",
|
||||
["mcl_core:ice"] = "mcl_core:water_source",
|
||||
["mcl_core:lava_source"] = "mcl_core:obsidian",
|
||||
["mcl_core:obsidian"] = "mcl_core:lava_source",
|
||||
["mcl_flowers:dandelion"] = "mcl_flowers:poppy",
|
||||
["mcl_flowers:poppy"] = "mcl_flowers:dandelion",
|
||||
["mcl_mushrooms:mushroom_brown"] = "mcl_mushrooms:mushroom_red",
|
||||
["mcl_mushrooms:mushroom_red"] = "mcl_mushrooms:mushroom_brown",
|
||||
["mcl_core:acacialeaves"] = "mcl_core:birchleaves",
|
||||
["mcl_core:birchleaves"] = "mcl_core:darkleaves",
|
||||
["mcl_core:darkleaves"] = "mcl_core:jungleleaves",
|
||||
["mcl_core:jungleleaves"] = "mcl_mangrove:mangroveleaves",
|
||||
["mcl_mangrove:mangroveleaves"] = "mcl_core:leaves",
|
||||
["mcl_core:leaves"] = "mcl_core:spruceleaves",
|
||||
["mcl_core:spruceleaves"] = "mcl_core:acacialeaves",
|
||||
["mcl_core:acaciatree"] = "mcl_core:birchtree",
|
||||
["mcl_core:birchtree"] = "mcl_core:darktree",
|
||||
["mcl_core:darktree"] = "mcl_core:jungletree",
|
||||
["mcl_core:jungletree"] = "mcl_mangrove:mangrove_tree",
|
||||
["mcl_mangrove:mangrove_tree"] = "mcl_core:tree",
|
||||
["mcl_core:tree"] = "mcl_core:sprucetree",
|
||||
["mcl_core:sprucetree"] = "mcl_core:acaciatree",
|
||||
["mcl_crimson:warped_fungus"] = "mcl_crimson:crimson_fungus",
|
||||
["mcl_crimson:warped_hyphae"] = "mcl_crimson:crimson_hyphae",
|
||||
["mcl_crimson:warped_nylium"] = "mcl_crimson:crimson_nylium",
|
||||
["mcl_crimson:warped_roots"] = "mcl_crimson:crimson_roots",
|
||||
["mcl_crimson:warped_wart_block"] = "mcl_nether:nether_wart_block",
|
||||
["mcl_crimson:crimson_fungus"] = "mcl_crimson:warped_fungus",
|
||||
["mcl_crimson:crimson_hyphae"] = "mcl_crimson:warped_hyphae",
|
||||
["mcl_crimson:crimson_nylium"] = "mcl_crimson:warped_nylium",
|
||||
["mcl_crimson:crimson_roots"] = "mcl_crimson:warped_roots",
|
||||
["mcl_nether:nether_wart_block"] = "mcl_crimson:warped_wart_block",
|
||||
["mcl_core:glass"] = "mcl_core:sand",
|
||||
["mcl_blackstone:blackstone"] = "mcl_blackstone:basalt",
|
||||
["mcl_blackstone:basalt"] = "mcl_blackstone:blackstone",
|
||||
["mcl_flowers:double_grass"] = "mcl_flowers:fern",
|
||||
--["mcl_flowers:double_grass_top"] = "air",
|
||||
["mcl_core:andesite"] = "mcl_core:diorite",
|
||||
["mcl_core:diorite"] = "mcl_core:granite",
|
||||
["mcl_core:granite"] = "mcl_deepslate:tuff",
|
||||
["mcl_deepslate:tuff"] = "mcl_core:andesite",
|
||||
["mcl_deepslate:deepslate"] = "mcl_deepslate:deepslate_cobbled",
|
||||
["mcl_deepslate:deepslate_cobbled"] = "mcl_deepslate:deepslate",
|
||||
["mcl_core:stone_with_coal"] = "mcl_deepslate:deepslate_with_coal",
|
||||
["mcl_core:stone_with_iron"] = "mcl_deepslate:deepslate_with_iron",
|
||||
["mcl_core:stone_with_lapis"] = "mcl_deepslate:deepslate_with_lapis",
|
||||
["mcl_core:stone_with_gold"] = "mcl_deepslate:deepslate_with_gold",
|
||||
["mcl_core:stone_with_emerald"] = "mcl_deepslate:deepslate_with_emerald",
|
||||
["mcl_core:stone_with_redstone"] = "mcl_deepslate:deepslate_with_redstone",
|
||||
["mcl_core:stone_with_redstone_lit"] = "mcl_deepslate:deepslate_with_redstone_lit",
|
||||
["mcl_core:stone_with_diamond"] = "mcl_deepslate:deepslate_with_diamond",
|
||||
["mcl_copper:stone_with_copper"] = "mcl_deepslate:deepslate_with_copper",
|
||||
["mcl_deepslate:deepslate_with_coal"] = "mcl_core:stone_with_coal",
|
||||
["mcl_deepslate:deepslate_with_iron"] = "mcl_core:stone_with_iron",
|
||||
["mcl_deepslate:deepslate_with_lapis"] = "mcl_core:stone_with_lapis",
|
||||
["mcl_deepslate:deepslate_with_gold"] = "mcl_core:stone_with_gold",
|
||||
["mcl_deepslate:deepslate_with_emerald"] = "mcl_core:stone_with_emerald",
|
||||
["mcl_deepslate:deepslate_with_redstone"] = "mcl_core:stone_with_redstone",
|
||||
["mcl_deepslate:deepslate_with_diamond"] = "mcl_core:stone_with_diamond",
|
||||
["mcl_deepslate:deepslate_with_copper"] = "mcl_copper:stone_with_copper",
|
||||
["mcl_end:end_stone"] = "mcl_nether:netherrack",
|
||||
["mcl_nether:soul_sand"] = "mcl_blackstone:soul_soil",
|
||||
["mcl_blackstone:soul_soil"] = "mcl_nether:soul_sand",
|
||||
|
||||
["default:stone"] = "default:cobble",
|
||||
["default:desert_stone"] = "default:desert_cobble",
|
||||
["default:cobble"] = "default:stone",
|
||||
["default:desert_cobble"] = "default:desert_stone",
|
||||
["default:dirt_with_grass"] = "default:sand",
|
||||
["default:dirt_with_snow"] = "default:sand",
|
||||
["default:dirt_with_dry_grass"] = "default:sand",
|
||||
["default:dry_dirt_with_dry_grass"] = "default:desert_sand",
|
||||
["default:dirt"] = "default:sand",
|
||||
["default:dry_dirt"] = "default:desert_sand",
|
||||
["default:dirt_with_coniferous_litter"] = "default:sand",
|
||||
["default:dirt_with_rainforest_litter"] = "default:sand",
|
||||
["default:sand"] = "default:dirt_with_grass",
|
||||
["default:desert_sand"] = "default:dry_dirt_with_dry_grass",
|
||||
["default:silver_sand"] = "default:dirt_with_grass",
|
||||
["default:grass_1"] = "default:dry_shrub",
|
||||
["default:grass_2"] = "default:dry_shrub",
|
||||
["default:grass_3"] = "default:dry_shrub",
|
||||
["default:grass_4"] = "default:dry_shrub",
|
||||
["default:grass_5"] = "default:dry_shrub",
|
||||
["default:gravel"] = "default:sandstone",
|
||||
["default:sandstone"] = "default:gravel",
|
||||
["default:desert_sandstone"] = "default:gravel",
|
||||
["default:silver_sandstone"] = "default:gravel",
|
||||
["default:water_source"] = "default:ice",
|
||||
["default:river_water_source"] = "default:ice",
|
||||
["default:ice"] = "default:water_source",
|
||||
["default:lava_source"] = "default:obsidian",
|
||||
["default:obsidian"] = "default:lava_source",
|
||||
["flowers:mushroom_brown"] = "flowers:mushroom_red",
|
||||
["flowers:mushroom_red"] = "flowers:mushroom_brown",
|
||||
["flowers:dandelion_yellow"] = "flowers:rose",
|
||||
["flowers:rose"] = "flowers:dandelion_yellow",
|
||||
["default:acacia_tree"] = "default:tree",
|
||||
["default:tree"] = "default:aspen_tree",
|
||||
["default:aspen_tree"] = "default:jungletree",
|
||||
["default:jungletree"] = "default:pine_tree",
|
||||
["default:pine_tree"] = "default:acacia_tree",
|
||||
["default:acacia_leaves"] = "default:leaves",
|
||||
["default:leaves"] = "default:aspen_leaves",
|
||||
["default:aspen_leaves"] = "default:jungleleaves",
|
||||
["default:jungleleaves"] = "default:pine_needles",
|
||||
["default:pine_needles"] = "default:acacia_leaves",
|
||||
["default:acacia_bush_leaves"] = "default:bush_leaves",
|
||||
["default:bush_leaves"] = "default:pine_bush_needles",
|
||||
["default:pine_bush_needles"] = "default:acacia_bush_leaves",
|
||||
["default:acacia_bush_stem"] = "default:bush_stem",
|
||||
["default:bush_stem"] = "default:pine_bush_stem",
|
||||
["default:pine_bush_stem"] = "default:acacia_bush_stem",
|
||||
["default:glass"] = "default:sand",
|
||||
},
|
||||
{ --sneak+use
|
||||
["mcl_core:stone"] = "mcl_core:dirt_with_grass",
|
||||
["mcl_core:cobble"] = "mcl_core:dirt_with_grass",
|
||||
["mcl_deepslate:deepslate"] = "mcl_core:podzol",
|
||||
["mcl_deepslate:deepslate_cobbled"] = "mcl_core:podzol",
|
||||
["mcl_core:sand"] = "mcl_core:cobble",
|
||||
["mcl_core:redsand"] = "mcl_core:cobble",
|
||||
["mcl_core:dirt_with_grass"] = "mcl_core:cobble",
|
||||
["mcl_core:dirt"] = "mcl_core:cobble",
|
||||
["mcl_core:podzol"] = "mcl_deepslate:deepslate_cobbled",
|
||||
["mcl_deepslate:tuff"] = "mcl_core:granite",
|
||||
["mcl_core:granite"] = "mcl_core:diorite",
|
||||
["mcl_core:diorite"] = "mcl_core:andesite",
|
||||
["mcl_core:andesite"] = "mcl_deepslate:tuff",
|
||||
["mcl_core:acacialeaves"] = "mcl_core:spruceleaves",
|
||||
["mcl_core:birchleaves"] = "mcl_core:acacialeaves",
|
||||
["mcl_core:darkleaves"] = "mcl_core:birchleaves",
|
||||
["mcl_core:jungleleaves"] = "mcl_core:darkleaves",
|
||||
["mcl_mangrove:mangroveleaves"] = "mcl_core:jungleleaves",
|
||||
["mcl_core:leaves"] = "mcl_mangrove:mangroveleaves",
|
||||
["mcl_core:spruceleaves"] = "mcl_core:leaves",
|
||||
["mcl_core:acaciatree"] = "mcl_core:sprucetree",
|
||||
["mcl_core:birchtree"] = "mcl_core:acaciatree",
|
||||
["mcl_core:darktree"] = "mcl_core:birchtree",
|
||||
["mcl_core:jungletree"] = "mcl_core:darktree",
|
||||
["mcl_mangrove:mangrove_tree"] = "mcl_core:jungletree",
|
||||
["mcl_core:tree"] = "mcl_mangrove:mangrove_tree",
|
||||
["mcl_core:sprucetree"] = "mcl_core:tree",
|
||||
["mcl_nether:netherrack"] = "mcl_end:end_stone",
|
||||
|
||||
["default:stone"] = "default:dirt_with_grass",
|
||||
["default:cobble"] = "default:dirt_with_grass",
|
||||
["default:desert_stone"] = "default:dry_dirt_with_dry_grass",
|
||||
["default:desert_cobble"] = "default:dry_dirt_with_dry_grass",
|
||||
["default:dry_dirt_with_dry_grass"] = "default:desert_cobble",
|
||||
["default:dirt_with_dry_grass"] = "default:cobble",
|
||||
["default:dirt_with_grass"] = "default:cobble",
|
||||
["default:dirt_with_snow"] = "default:cobble",
|
||||
["default:dirt"] = "default:cobble",
|
||||
["default:dry_dirt"] = "default:desert_cobble",
|
||||
["default:dirt_with_coniferous_litter"] = "default:cobble",
|
||||
["default:dirt_with_rainforest_litter"] = "default:cobble",
|
||||
["default:sand"] = "default:cobble",
|
||||
["default:desert_sand"] = "default:desert_cobble",
|
||||
["default:silver_sand"] = "default:cobble",
|
||||
["default:acacia_tree"] = "default:pine_tree",
|
||||
["default:tree"] = "default:acacia_tree",
|
||||
["default:aspen_tree"] = "default:tree",
|
||||
["default:jungletree"] = "default:aspen_tree",
|
||||
["default:pine_tree"] = "default:jungletree",
|
||||
["default:acacia_leaves"] = "default:pine_needles",
|
||||
["default:leaves"] = "default:acacia_leaves",
|
||||
["default:aspen_leaves"] = "default:leaves",
|
||||
["default:jungleleaves"] = "default:aspen_leaves",
|
||||
["default:pine_needles"] = "default:jungleleaves",
|
||||
["default:acacia_bush_leaves"] = "default:pine_bush_needles",
|
||||
["default:bush_leaves"] = "default:acacia_bush_leaves",
|
||||
["default:pine_bush_needles"] = "default:bush_leaves",
|
||||
["default:acacia_bush_stem"] = "default:pine_bush_stem",
|
||||
["default:bush_stem"] = "default:acacia_bush_stem",
|
||||
["default:pine_bush_stem"] = "default:bush_stem",
|
||||
}
|
||||
}
|
||||
|
||||
exchangeclone.stone_action = {
|
||||
start_action = function(player, center, range, mode)
|
||||
-- Yes, I named the cooldown Phil. His last name is Osophersstone.
|
||||
if exchangeclone.check_cooldown(player, "phil") then return end
|
||||
exchangeclone.play_ability_sound(player)
|
||||
return mode
|
||||
end,
|
||||
action = function(player, pos, node, mode)
|
||||
local new_node = exchangeclone.node_transmutations[mode][node.name]
|
||||
if not new_node and mode == 2 then
|
||||
new_node = exchangeclone.node_transmutations[1][node.name]
|
||||
end
|
||||
if new_node then
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
minetest.record_protection_violation(pos, player:get_player_name())
|
||||
else
|
||||
node.name = new_node
|
||||
minetest.swap_node(pos, node)
|
||||
end
|
||||
end
|
||||
return true
|
||||
end,
|
||||
end_action = function(player, center, range, data)
|
||||
exchangeclone.start_cooldown(player, "phil", 0.3)
|
||||
end
|
||||
}
|
||||
|
||||
local on_left_click = nil
|
||||
if exchangeclone.mcl then
|
||||
on_left_click = function(itemstack, player, pointed_thing)
|
||||
if player:get_player_control().sneak then
|
||||
show_enchanting(player)
|
||||
else
|
||||
if player:get_player_control().aux1 then
|
||||
minetest.show_formspec(player:get_player_name(), "exchangeclone_repairing", repairing_formspec)
|
||||
else
|
||||
mcl_crafting_table.show_crafting_form(player)
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
on_left_click = function(itemstack, player, pointed_thing)
|
||||
minetest.show_formspec(player:get_player_name(), "exchangeclone_repairing", repairing_formspec)
|
||||
end
|
||||
end
|
||||
|
||||
local function on_right_click(itemstack, player, pointed_thing)
|
||||
local click_test = exchangeclone.check_on_rightclick(itemstack, player, pointed_thing)
|
||||
if click_test ~= false then
|
||||
return click_test
|
||||
end
|
||||
if player:get_player_control().aux1 then
|
||||
return exchangeclone.range_update(itemstack, player)
|
||||
end
|
||||
local center = player:get_pos()
|
||||
if pointed_thing and pointed_thing.type == "node" then
|
||||
center = pointed_thing.under
|
||||
end
|
||||
if player:get_player_control().sneak then
|
||||
local range = tonumber(itemstack:get_meta():get_int("exchangeclone_item_range"))
|
||||
exchangeclone.node_radius_action(player, center, range, exchangeclone.stone_action, 2)
|
||||
else
|
||||
local range = itemstack:get_meta():get_int("exchangeclone_item_range")
|
||||
exchangeclone.node_radius_action(player, center, range, exchangeclone.stone_action, 1)
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_tool("exchangeclone:philosophers_stone", {
|
||||
description = S("Philosopher's Stone").."\n"..S("Always returned when crafting"),
|
||||
inventory_image = "exchangeclone_philosophers_stone.png",
|
||||
wield_image = "exchangeclone_philosophers_stone.png",
|
||||
exchangeclone_item_range = 0,
|
||||
on_use = on_left_click,
|
||||
on_place = on_right_click,
|
||||
on_secondary_use = on_right_click,
|
||||
groups = {philosophers_stone = 1, disable_repair = 1, fire_immune = 1}
|
||||
})
|
||||
|
||||
local diamond = exchangeclone.itemstrings.diamond
|
||||
local corner = exchangeclone.itemstrings.glowstoneworth
|
||||
local side = exchangeclone.itemstrings.redstoneworth
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:philosophers_stone",
|
||||
recipe = {
|
||||
{corner, side, corner},
|
||||
{side, diamond, side},
|
||||
{corner, side, corner}
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_core:coal_lump",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"mcl_core:charcoal_lump",
|
||||
"mcl_core:charcoal_lump",
|
||||
"mcl_core:charcoal_lump",
|
||||
"mcl_core:charcoal_lump"
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_core:charcoal_lump 4",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"mcl_core:coal_lump"
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = exchangeclone.itemstrings.iron,
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
exchangeclone.itemstrings.coal,
|
||||
exchangeclone.itemstrings.coal,
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = exchangeclone.itemstrings.coal.." 2",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
exchangeclone.itemstrings.iron
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = exchangeclone.itemstrings.copper.." 2",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
exchangeclone.itemstrings.iron,
|
||||
exchangeclone.itemstrings.iron,
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = exchangeclone.itemstrings.iron.." 2",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
exchangeclone.itemstrings.copper,
|
||||
exchangeclone.itemstrings.copper,
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_throwing:ender_pearl",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"mcl_core:iron_ingot",
|
||||
"mcl_core:iron_ingot",
|
||||
"mcl_core:iron_ingot",
|
||||
"mcl_core:iron_ingot",
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "default:tin_ingot 4",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"default:copper_ingot",
|
||||
"default:copper_ingot",
|
||||
"default:copper_ingot",
|
||||
"default:copper_ingot",
|
||||
"default:copper_ingot",
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "default:copper_ingot 5",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"default:tin_ingot",
|
||||
"default:tin_ingot",
|
||||
"default:tin_ingot",
|
||||
"default:tin_ingot",
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = exchangeclone.itemstrings.iron.." 8",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
exchangeclone.itemstrings.gold
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = exchangeclone.itemstrings.gold,
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
exchangeclone.itemstrings.iron,
|
||||
exchangeclone.itemstrings.iron,
|
||||
exchangeclone.itemstrings.iron,
|
||||
exchangeclone.itemstrings.iron,
|
||||
exchangeclone.itemstrings.iron,
|
||||
exchangeclone.itemstrings.iron,
|
||||
exchangeclone.itemstrings.iron,
|
||||
exchangeclone.itemstrings.iron,
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = exchangeclone.itemstrings.emeraldworth,
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
exchangeclone.itemstrings.gold,
|
||||
exchangeclone.itemstrings.gold,
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = exchangeclone.itemstrings.gold.." 2",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
exchangeclone.itemstrings.emeraldworth,
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = exchangeclone.itemstrings.diamond,
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
exchangeclone.itemstrings.emeraldworth,
|
||||
exchangeclone.itemstrings.emeraldworth,
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = exchangeclone.itemstrings.emeraldworth.." 2",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
exchangeclone.itemstrings.diamond
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_nether:ancient_debris",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"mcl_core:diamond",
|
||||
"mcl_core:diamond",
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_core:diamond 2",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"mcl_nether:ancient_debris"
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_core:diamond 2",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"mcl_nether:netherite_scrap"
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_core:diamond 9",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"mcl_nether:netherite_ingot"
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_nether:netherite_ingot",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"mcl_core:diamondblock"
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_nether:glowstone_dust",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"mesecons:redstone",
|
||||
"mesecons:redstone",
|
||||
"mesecons:redstone",
|
||||
"mesecons:redstone",
|
||||
"mesecons:redstone",
|
||||
"mesecons:redstone",
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mesecons:redstone 6",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"mcl_nether:glowstone_dust",
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_core:lapis",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"mcl_nether:glowstone_dust",
|
||||
"mcl_nether:glowstone_dust"
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_nether:glowstone_dust 2",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"mcl_core:lapis",
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:alchemical_coal",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
exchangeclone.itemstrings.coal,
|
||||
exchangeclone.itemstrings.coal,
|
||||
exchangeclone.itemstrings.coal,
|
||||
exchangeclone.itemstrings.coal,
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = exchangeclone.itemstrings.coal.." 4",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"exchangeclone:alchemical_coal",
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:mobius_fuel",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"exchangeclone:alchemical_coal",
|
||||
"exchangeclone:alchemical_coal",
|
||||
"exchangeclone:alchemical_coal",
|
||||
"exchangeclone:alchemical_coal",
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:alchemical_coal 4",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"exchangeclone:mobius_fuel",
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:aeternalis_fuel",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"exchangeclone:mobius_fuel",
|
||||
"exchangeclone:mobius_fuel",
|
||||
"exchangeclone:mobius_fuel",
|
||||
"exchangeclone:mobius_fuel",
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:mobius_fuel 4",
|
||||
type = "shapeless",
|
||||
recipe = {
|
||||
phil,
|
||||
"exchangeclone:aeternalis_fuel",
|
||||
},
|
||||
replacements = {{phil, phil}}
|
||||
})
|
|
@ -1,24 +1,22 @@
|
|||
function exchangeclone.mine_vein(player, player_energy, start_pos, node_name, pos)
|
||||
-- Not very efficient, but it SHOULD work.
|
||||
if not player then return 0 end
|
||||
if not start_pos then return 0 end
|
||||
if not pos then pos = start_pos end
|
||||
local S = minetest.get_translator()
|
||||
|
||||
function exchangeclone.mine_vein(player, start_pos, node_name, pos, depth)
|
||||
-- Not the most efficient, but it works.
|
||||
if not player then return end
|
||||
if not start_pos then return end
|
||||
pos = pos or start_pos
|
||||
depth = depth or 0
|
||||
local node = minetest.get_node(pos)
|
||||
if not node_name then node_name = node.name end
|
||||
local distance = vector.distance(pos, start_pos)
|
||||
if distance > 10 then return 0 end
|
||||
if player_energy < 8 then return 0 end
|
||||
if node_name == node.name then
|
||||
local energy_cost = 8
|
||||
exchangeclone.drop_items_on_player(pos, minetest.get_node_drops(node.name, "exchangeclone:red_matter_pickaxe"), player)
|
||||
exchangeclone.check_nearby_falling(pos)
|
||||
minetest.set_node(pos, {name = "air"})
|
||||
for x = pos.x-1,pos.x+1 do for y = pos.y-1,pos.y+1 do for z = pos.z-1,pos.z+1 do
|
||||
local cost = exchangeclone.mine_vein(player, player_energy, start_pos, node_name, {x=x,y=y,z=z})
|
||||
if cost and cost > 0 then
|
||||
energy_cost = energy_cost + cost
|
||||
if depth <= 10 then
|
||||
exchangeclone.mine_vein(player, start_pos, node_name, {x=x,y=y,z=z}, depth+1)
|
||||
end
|
||||
end end end
|
||||
return energy_cost
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
@ -44,17 +42,17 @@ local function pickaxe_on_use(itemstack, player, pointed_thing)
|
|||
if current_mode == "1x1" then
|
||||
itemstack:set_name(current_name.."_3x1") -- set to 3x1 pick
|
||||
meta:set_string("exchangeclone_pick_mode", "tall")
|
||||
minetest.chat_send_player(player:get_player_name(), "3x1 tall mode")
|
||||
minetest.chat_send_player(player:get_player_name(), S("3x1 tall mode"))
|
||||
elseif current_mode == "tall" then
|
||||
meta:set_string("exchangeclone_pick_mode", "wide")
|
||||
minetest.chat_send_player(player:get_player_name(), "3x1 wide mode")
|
||||
minetest.chat_send_player(player:get_player_name(), S("3x1 wide mode"))
|
||||
elseif current_mode == "wide" then
|
||||
meta:set_string("exchangeclone_pick_mode", "long")
|
||||
minetest.chat_send_player(player:get_player_name(), "3x1 long mode")
|
||||
minetest.chat_send_player(player:get_player_name(), S("3x1 long mode"))
|
||||
elseif current_mode == "long" then
|
||||
itemstack:set_name(string.sub(current_name, 1, -5)) -- set to 1x1 pick
|
||||
meta:set_string("exchangeclone_pick_mode", "1x1")
|
||||
minetest.chat_send_player(player:get_player_name(), "Single node mode")
|
||||
minetest.chat_send_player(player:get_player_name(), S("Single node mode"))
|
||||
end
|
||||
return itemstack
|
||||
end
|
||||
|
@ -62,46 +60,26 @@ local function pickaxe_on_use(itemstack, player, pointed_thing)
|
|||
if pointed_thing.type == "node" then
|
||||
if exchangeclone.check_cooldown(player, "pickaxe") then return itemstack end
|
||||
if (minetest.get_item_group(minetest.get_node(pointed_thing.under).name, "exchangeclone_ore") > 0) then
|
||||
local player_energy = exchangeclone.get_player_energy(player)
|
||||
exchangeclone.play_ability_sound(player)
|
||||
exchangeclone.multidig[player:get_player_name()] = true
|
||||
local energy_cost = exchangeclone.mine_vein(player, player_energy, pointed_thing.under)
|
||||
exchangeclone.mine_vein(player, pointed_thing.under)
|
||||
exchangeclone.multidig[player:get_player_name()] = nil
|
||||
if energy_cost then
|
||||
exchangeclone.set_player_energy(player, player_energy - energy_cost)
|
||||
end
|
||||
elseif itemstack:get_name():find("red") then
|
||||
local player_energy = exchangeclone.get_player_energy(player)
|
||||
torch_on_place(ItemStack(torch_itemstring), player, pointed_thing)
|
||||
exchangeclone.set_player_energy(player, player_energy - math.max(exchangeclone.get_item_energy(torch_itemstring), 8))
|
||||
exchangeclone.set_player_energy(player, player_energy - math.max(exchangeclone.get_item_energy(torch_itemstring) or 0, 8))
|
||||
-- If the torch could not be placed, it still costs energy... not sure how to fix that
|
||||
end
|
||||
exchangeclone.start_cooldown(player, "pickaxe", 0.3)
|
||||
end
|
||||
end
|
||||
|
||||
for name, def in pairs(minetest.registered_nodes) do
|
||||
if name:find("_ore")
|
||||
or name:find("stone_with")
|
||||
or name:find("deepslate_with")
|
||||
or name:find("diorite_with")
|
||||
or name:find("andesite_with")
|
||||
or name:find("granite_with")
|
||||
or name:find("tuff_with")
|
||||
or (name == "mcl_blackstone:nether_gold")
|
||||
or (name == "mcl_nether:ancient_debris") then
|
||||
local groups = table.copy(def.groups)
|
||||
groups.exchangeclone_ore = 1
|
||||
minetest.override_item(name, {groups = groups})
|
||||
end
|
||||
end
|
||||
|
||||
local pick_def = {
|
||||
description = "Dark Matter Pickaxe",
|
||||
description = S("Dark Matter Pickaxe").."\n"..S("Single node mode"),
|
||||
wield_image = "exchangeclone_dark_matter_pickaxe.png",
|
||||
inventory_image = "exchangeclone_dark_matter_pickaxe.png",
|
||||
exchangeclone_pick_mode = "1x1",
|
||||
groups = { tool=1, pickaxe=1, dig_speed_class=7, enchantability=0, dark_matter_pickaxe=1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
groups = { tool=1, pickaxe=1, dig_speed_class=5, enchantability=0, dark_matter_pickaxe=1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
wield_scale = exchangeclone.wield_scale,
|
||||
tool_capabilities = {
|
||||
-- 1/1.2
|
||||
|
@ -116,7 +94,7 @@ local pick_def = {
|
|||
sound = { breaks = "default_tool_breaks" },
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
pickaxey = { speed = 40, level = 7, uses = 0 }
|
||||
pickaxey = { speed = 40, level = 5, uses = 0 }
|
||||
},
|
||||
on_secondary_use = pickaxe_on_use,
|
||||
on_place = pickaxe_on_use,
|
||||
|
@ -125,6 +103,7 @@ local pick_def = {
|
|||
minetest.register_tool("exchangeclone:dark_matter_pickaxe", table.copy(pick_def))
|
||||
|
||||
local pick_def_3x1 = table.copy(pick_def)
|
||||
pick_def_3x1.description = S("Dark Matter Pickaxe").."\n"..S("3x1 mode")
|
||||
pick_def_3x1.exchangeclone_pick_mode = "tall"
|
||||
pick_def_3x1.groups.not_in_creative_inventory = 1
|
||||
pick_def_3x1.tool_capabilities.groupcaps.cracky.times = {[1]=0.45, [2]=0.27, [3]=0.11}
|
||||
|
@ -132,12 +111,14 @@ pick_def_3x1._mcl_diggroups.pickaxey.speed = 35
|
|||
|
||||
minetest.register_tool("exchangeclone:dark_matter_pickaxe_3x1", table.copy(pick_def_3x1))
|
||||
|
||||
pick_def.description = "Red Matter Pickaxe"
|
||||
exchangeclone.register_alias("exchangeclone:dark_matter_pickaxe", "exchangeclone:dark_matter_pickaxe_3x1")
|
||||
|
||||
pick_def.description = S("Red Matter Pickaxe").."\n"..S("Single node mode")
|
||||
pick_def.wield_image = "exchangeclone_red_matter_pickaxe.png"
|
||||
pick_def.inventory_image = "exchangeclone_red_matter_pickaxe.png"
|
||||
pick_def.groups.dark_matter_pickaxe = nil
|
||||
pick_def.groups.red_matter_pickaxe = 1
|
||||
pick_def.groups.dig_speed_class = 8
|
||||
pick_def.groups.dig_speed_class = 6
|
||||
pick_def.tool_capabilities = {
|
||||
full_punch_interval = 0.5,
|
||||
max_drop_level=7,
|
||||
|
@ -147,11 +128,12 @@ pick_def.tool_capabilities = {
|
|||
cracky = {times={[1]=0.27, [2]=0.13, [3]=0.07}, uses=0, maxlevel=5},
|
||||
},
|
||||
}
|
||||
pick_def._mcl_diggroups.pickaxey = { speed = 60, level = 8, uses = 0 }
|
||||
pick_def._mcl_diggroups.pickaxey = { speed = 60, level = 6, uses = 0 }
|
||||
|
||||
minetest.register_tool("exchangeclone:red_matter_pickaxe", table.copy(pick_def))
|
||||
|
||||
local pick_def_3x1 = table.copy(pick_def)
|
||||
pick_def_3x1.description = S("Red Matter Pickaxe").."\n"..S("3x1 mode")
|
||||
pick_def_3x1 = table.copy(pick_def)
|
||||
pick_def_3x1.exchangeclone_pick_mode = "tall"
|
||||
pick_def_3x1.groups.not_in_creative_inventory = 1
|
||||
pick_def_3x1.tool_capabilities.groupcaps.cracky.times = {[1]=0.32, [2]=0.16, [3]=0.08}
|
||||
|
@ -159,12 +141,14 @@ pick_def_3x1._mcl_diggroups.pickaxey.speed = 52
|
|||
|
||||
minetest.register_tool("exchangeclone:red_matter_pickaxe_3x1", table.copy(pick_def_3x1))
|
||||
|
||||
exchangeclone.register_alias("exchangeclone:red_matter_pickaxe", "exchangeclone:red_matter_pickaxe_3x1")
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:dark_matter_pickaxe",
|
||||
recipe = {
|
||||
{"exchangeclone:dark_matter", "exchangeclone:dark_matter", "exchangeclone:dark_matter"},
|
||||
{"", exchangeclone.diamond_itemstring, ""},
|
||||
{"", exchangeclone.diamond_itemstring, ""}
|
||||
{"", exchangeclone.itemstrings.diamond, ""},
|
||||
{"", exchangeclone.itemstrings.diamond, ""}
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -175,4 +159,23 @@ minetest.register_craft({
|
|||
{"", "group:dark_matter_pickaxe", ""},
|
||||
{"", "exchangeclone:dark_matter", ""}
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
minetest.register_on_mods_loaded(function()
|
||||
for name, def in pairs(minetest.registered_nodes) do
|
||||
if name:find("_ore")
|
||||
or name:find("stone_with")
|
||||
or name:find("deepslate_with")
|
||||
or name:find("diorite_with")
|
||||
or name:find("andesite_with")
|
||||
or name:find("granite_with")
|
||||
or name:find("tuff_with")
|
||||
or name:find("mineral_")
|
||||
or (name == "mcl_blackstone:nether_gold")
|
||||
or (name == "mcl_nether:ancient_debris") then
|
||||
local groups = table.copy(def.groups)
|
||||
groups.exchangeclone_ore = 1
|
||||
minetest.override_item(name, {groups = groups})
|
||||
end
|
||||
end
|
||||
end)
|
|
@ -1,3 +1,5 @@
|
|||
local S = minetest.get_translator()
|
||||
|
||||
--------------------------------------RED KATAR--------------------------------------
|
||||
|
||||
local katar_on_use = function(itemstack, player, pointed_thing)
|
||||
|
@ -38,9 +40,9 @@ local katar_on_use = function(itemstack, player, pointed_thing)
|
|||
exchangeclone.node_radius_action(player, center, range, exchangeclone.hoe_action, itemstack)
|
||||
end
|
||||
elseif minetest.get_item_group(node.name, "tree") > 0 then
|
||||
exchangeclone.node_radius_action(player, center, range, exchangeclone.axe_action)
|
||||
exchangeclone.node_radius_action(player, center, range, exchangeclone.axe_action, itemstack)
|
||||
elseif minetest.get_item_group(node.name, "shearsy") > 0 or minetest.get_item_group(node.name, "shearsy_cobweb") > 0 then
|
||||
exchangeclone.node_radius_action(player, center, range, exchangeclone.shear_action)
|
||||
exchangeclone.node_radius_action(player, center, range, exchangeclone.shear_action, itemstack)
|
||||
end
|
||||
else
|
||||
local damage_all = itemstack:get_meta():get_int("exchangeclone_damage_all")
|
||||
|
@ -63,12 +65,12 @@ local katar_on_use = function(itemstack, player, pointed_thing)
|
|||
end
|
||||
|
||||
local katar_def = {
|
||||
description = "Red Katar",
|
||||
description = S("Red Katar").."\n"..S("Single node mode"),
|
||||
wield_image = "exchangeclone_red_katar.png",
|
||||
inventory_image = "exchangeclone_red_katar.png",
|
||||
on_secondary_use = katar_on_use,
|
||||
on_place = katar_on_use,
|
||||
groups = { tool=1, red_katar = 1, sword = 1, axe=1, hoe = 1, shears = 1, dig_speed_class=8, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
groups = { tool=1, red_katar = 1, sword = 1, axe=1, hoe = 1, shears = 1, dig_speed_class=7, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
wield_scale = exchangeclone.wield_scale,
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 0.3,
|
||||
|
@ -95,11 +97,16 @@ local katar_def = {
|
|||
}
|
||||
|
||||
minetest.register_tool("exchangeclone:red_katar", table.copy(katar_def))
|
||||
|
||||
katar_def.description = S("Red Katar").."\n"..S("3x3 mode")
|
||||
katar_def.groups.not_in_creative_inventory = 1
|
||||
katar_def._mcl_diggroups.exchangeclone_dirt = {speed = 8, level = 8, uses = 0}
|
||||
katar_def.tool_capabilities.groupcaps.exchangeclone_dirt = {times={[1]=0.25,[2]=0.25,[3]=0.25}}
|
||||
|
||||
minetest.register_tool("exchangeclone:red_katar_3x3", table.copy(katar_def))
|
||||
|
||||
exchangeclone.register_alias("exchangeclone:red_katar", "exchangeclone:red_katar_3x3")
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:red_katar",
|
||||
type = "shapeless",
|
||||
|
@ -118,32 +125,30 @@ minetest.register_craft({
|
|||
|
||||
--------------------------------------RED MORNINGSTAR--------------------------------------
|
||||
exchangeclone.morningstar_action = {
|
||||
start_action = function(player, center, range)
|
||||
start_action = function(player, center, range, itemstack)
|
||||
if exchangeclone.check_cooldown(player, "shovel") then return end
|
||||
if exchangeclone.check_cooldown(player, "hammer") then return end
|
||||
local data = {}
|
||||
data.player_energy = exchangeclone.get_player_energy(player)
|
||||
data.energy_cost = 0
|
||||
data.itemstack = itemstack
|
||||
exchangeclone.play_ability_sound(player)
|
||||
data.remove_positions = {}
|
||||
return data
|
||||
end,
|
||||
action = function(player, pos, node, data)
|
||||
if data.energy_cost + 8 > data.player_energy then return end
|
||||
if ((minetest.get_item_group(node.name, "crumbly") > 0) or (minetest.get_item_group(node.name, "shovely") > 0))
|
||||
or ((minetest.get_item_group(node.name, "cracky") > 0) or (minetest.get_item_group(node.name, "pickaxey") > 0)) then
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
minetest.record_protection_violation(pos, player:get_player_name())
|
||||
else
|
||||
data.energy_cost = data.energy_cost + 8
|
||||
local drops = minetest.get_node_drops(node.name, "exchangeclone:red_morningstar")
|
||||
local drops = minetest.get_node_drops(node.name, data.itemstack)
|
||||
exchangeclone.drop_items_on_player(pos, drops, player)
|
||||
minetest.set_node(pos, {name = "air"})
|
||||
table.insert(data.remove_positions, pos)
|
||||
end
|
||||
end
|
||||
return data
|
||||
end,
|
||||
end_action = function(player, center, range, data)
|
||||
exchangeclone.set_player_energy(player, data.player_energy - data.energy_cost)
|
||||
exchangeclone.remove_nodes(data.remove_positions)
|
||||
exchangeclone.start_cooldown(player, "shovel", range/4) -- Longish cooldown
|
||||
exchangeclone.start_cooldown(player, "hammer", range/2)
|
||||
end
|
||||
|
@ -172,24 +177,20 @@ local function morningstar_on_use(itemstack, player, pointed_thing)
|
|||
if pointed_thing.type == "node" then
|
||||
center = pointed_thing.under
|
||||
if player:get_player_control().sneak then
|
||||
exchangeclone.node_radius_action(player, center, range, exchangeclone.morningstar_action)
|
||||
exchangeclone.node_radius_action(player, center, range, exchangeclone.morningstar_action, itemstack)
|
||||
return
|
||||
elseif (minetest.get_item_group(minetest.get_node(pointed_thing.under).name, "exchangeclone_ore") > 0) then
|
||||
if exchangeclone.check_cooldown(player, "pickaxe") then return itemstack end
|
||||
local player_energy = exchangeclone.get_player_energy(player)
|
||||
exchangeclone.play_ability_sound(player)
|
||||
exchangeclone.multidig[player:get_player_name()] = true
|
||||
local energy_cost = exchangeclone.mine_vein(player, player_energy, pointed_thing.under)
|
||||
exchangeclone.mine_vein(player, pointed_thing.under)
|
||||
exchangeclone.multidig[player:get_player_name()] = nil
|
||||
if energy_cost then
|
||||
exchangeclone.set_player_energy(player, player_energy - energy_cost)
|
||||
end
|
||||
exchangeclone.start_cooldown(player, "pickaxe", 0.3)
|
||||
return
|
||||
else
|
||||
local player_energy = exchangeclone.get_player_energy(player)
|
||||
torch_on_place(ItemStack(torch_itemstring), player, pointed_thing)
|
||||
exchangeclone.set_player_energy(player, player_energy - exchangeclone.get_item_energy(torch_itemstring))
|
||||
exchangeclone.set_player_energy(player, player_energy - math.max(exchangeclone.get_item_energy(torch_itemstring) or 0, 8))
|
||||
-- If the torch could not be placed, it still costs energy... not sure how to fix that
|
||||
exchangeclone.start_cooldown(player, "pickaxe", 0.3)
|
||||
return
|
||||
|
@ -202,36 +203,36 @@ local function morningstar_on_use(itemstack, player, pointed_thing)
|
|||
if current_mode == "1x1" then
|
||||
itemstack:set_name(current_name.."_3x3") -- set to 3x3 pick
|
||||
meta:set_string("exchangeclone_pick_mode", "3x3")
|
||||
minetest.chat_send_player(player:get_player_name(), "3x3 mode")
|
||||
minetest.chat_send_player(player:get_player_name(), S("3x3 mode"))
|
||||
elseif current_mode == "3x3" then
|
||||
itemstack:set_name(string.sub(current_name, 1, -5).."_3x1") -- set to 3x1 pick
|
||||
meta:set_string("exchangeclone_pick_mode", "tall")
|
||||
minetest.chat_send_player(player:get_player_name(), "3x1 tall mode")
|
||||
minetest.chat_send_player(player:get_player_name(), S("3x1 tall mode"))
|
||||
elseif current_mode == "tall" then
|
||||
meta:set_string("exchangeclone_pick_mode", "wide")
|
||||
minetest.chat_send_player(player:get_player_name(), "3x1 wide mode")
|
||||
minetest.chat_send_player(player:get_player_name(), S("3x1 wide mode"))
|
||||
elseif current_mode == "wide" then
|
||||
meta:set_string("exchangeclone_pick_mode", "long")
|
||||
minetest.chat_send_player(player:get_player_name(), "3x1 long mode")
|
||||
minetest.chat_send_player(player:get_player_name(), S("3x1 long mode"))
|
||||
elseif current_mode == "long" then
|
||||
itemstack:set_name(string.sub(current_name, 1, -5)) -- set to 1x1 pick
|
||||
meta:set_string("exchangeclone_pick_mode", "1x1")
|
||||
minetest.chat_send_player(player:get_player_name(), "Single node mode")
|
||||
minetest.chat_send_player(player:get_player_name(), S("Single node mode"))
|
||||
end
|
||||
return itemstack
|
||||
else
|
||||
exchangeclone.node_radius_action(player, center, range, exchangeclone.morningstar_action)
|
||||
exchangeclone.node_radius_action(player, center, range, exchangeclone.morningstar_action, itemstack)
|
||||
end
|
||||
end
|
||||
|
||||
local morningstar_def = {
|
||||
description = "Red Morningstar",
|
||||
description = S("Red Morningstar").."\n"..S("Single node mode"),
|
||||
wield_image = "exchangeclone_red_morningstar.png",
|
||||
inventory_image = "exchangeclone_red_morningstar.png",
|
||||
on_secondary_use = morningstar_on_use,
|
||||
exchangeclone_pick_mode = "1x1",
|
||||
on_place = morningstar_on_use,
|
||||
groups = { tool=1, red_morningstar = 1, shovel = 1, hammer=1, pickaxe = 1, dig_speed_class=8, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
groups = { tool=1, red_morningstar = 1, shovel = 1, hammer=1, pickaxe = 1, dig_speed_class=7, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
wield_scale = exchangeclone.wield_scale,
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 0.3,
|
||||
|
@ -247,9 +248,9 @@ local morningstar_def = {
|
|||
sound = { breaks = "default_tool_breaks" },
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
pickaxey = {speed = 80, level = 8, uses = 0},
|
||||
shovely = {speed = 22, level = 8, uses = 0},
|
||||
axey = { speed = 22, level = 8, uses = 0 }
|
||||
pickaxey = {speed = 80, level = 7, uses = 0},
|
||||
shovely = {speed = 22, level = 7, uses = 0},
|
||||
axey = { speed = 22, level = 7, uses = 0 }
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -259,19 +260,26 @@ for k, v in pairs({cracky = "pickaxey", crumbly = "shovely"}) do
|
|||
morningstar_def.tool_capabilities.groupcaps[k].times = {[1]=0.7,[2]=0.5,[3]=0.25}
|
||||
morningstar_def._mcl_diggroups[v].speed = 70
|
||||
end
|
||||
morningstar_def.description = S("Red Morningstar").."\n"..S("3x3 mode")
|
||||
morningstar_def.groups.not_in_creative_inventory = 1
|
||||
morningstar_def.exchangeclone_pick_mode = "3x3"
|
||||
|
||||
minetest.register_tool("exchangeclone:red_morningstar_3x3", table.copy(morningstar_def))
|
||||
|
||||
exchangeclone.register_alias("exchangeclone:red_morningstar", "exchangeclone:red_morningstar_3x3")
|
||||
|
||||
for k, v in pairs({cracky = "pickaxey", crumbly = "shovely"}) do
|
||||
morningstar_def.tool_capabilities.groupcaps[k].times = {[1]=0.6,[2]=0.4,[3]=0.20}
|
||||
morningstar_def._mcl_diggroups[v].speed = 60
|
||||
morningstar_def._mcl_diggroups[v].speed = 80
|
||||
end
|
||||
morningstar_def.exchangeclone_pick_mode = "tall"
|
||||
|
||||
morningstar_def.description = S("Red Morningstar").."\n"..S("3x1 mode")
|
||||
|
||||
minetest.register_tool("exchangeclone:red_morningstar_3x1", table.copy(morningstar_def))
|
||||
|
||||
exchangeclone.register_alias("exchangeclone:red_morningstar", "exchangeclone:red_morningstar_3x1")
|
||||
|
||||
minetest.register_craft({
|
||||
output = "exchangeclone:red_morningstar",
|
||||
type = "shapeless",
|
|
@ -0,0 +1,418 @@
|
|||
-- Calculates the cheapest recipe given an itemstring.
|
||||
-- Would probably benefit from another function, since there's quite a bit
|
||||
-- of duplicate code.
|
||||
|
||||
local function get_cheapest_recipe(itemstring, log)
|
||||
itemstring = ItemStack(itemstring):get_name()
|
||||
local recipes = exchangeclone.recipes[itemstring]
|
||||
if not recipes then return end
|
||||
local cheapest
|
||||
for _, recipe in pairs(recipes) do
|
||||
local ingredient_cost = 0
|
||||
local output_count = ItemStack(recipe.output):get_count()
|
||||
local skip = false
|
||||
local identical_replacements = {}
|
||||
if recipe.replacements then
|
||||
for _, replacement in pairs(recipe.replacements) do
|
||||
if replacement[1] == replacement[2] then
|
||||
identical_replacements[replacement[1]] = (identical_replacements[replacement[1]] or 0) + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
if not recipe.type or exchangeclone.craft_types[recipe.type].type == "shaped" then
|
||||
for _, row in pairs(recipe.recipe) do
|
||||
for _, item in pairs(row) do
|
||||
if item ~= "" then
|
||||
if item == itemstring then
|
||||
output_count = math.max(0, output_count - 1)
|
||||
else
|
||||
local replaced = identical_replacements[item]
|
||||
if replaced and replaced > 0 then
|
||||
identical_replacements[item] = replaced - 1
|
||||
else
|
||||
local cost = exchangeclone.get_item_energy(item)
|
||||
if (not cost) or cost == 0 then
|
||||
skip = item
|
||||
else
|
||||
ingredient_cost = ingredient_cost + cost
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif exchangeclone.craft_types[recipe.type].type == "shapeless" then
|
||||
for _, item in pairs(recipe.recipe) do
|
||||
if item ~= "" then
|
||||
if item == itemstring then
|
||||
output_count = math.max(0, output_count - 1)
|
||||
else
|
||||
local replaced = identical_replacements[item]
|
||||
if replaced and replaced > 0 then
|
||||
identical_replacements[item] = replaced - 1
|
||||
else
|
||||
local cost = exchangeclone.get_item_energy(item)
|
||||
if (not cost) or cost == 0 then
|
||||
skip = item
|
||||
else
|
||||
ingredient_cost = ingredient_cost + cost
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif exchangeclone.craft_types[recipe.type].type == "cooking" then
|
||||
local item = recipe.recipe
|
||||
if item ~= "" then
|
||||
if item == itemstring then
|
||||
output_count = math.max(0, output_count - 1)
|
||||
else
|
||||
local replaced = identical_replacements[item]
|
||||
if replaced and replaced > 0 then
|
||||
identical_replacements[item] = replaced - 1
|
||||
else
|
||||
local cost = exchangeclone.get_item_energy(item)
|
||||
if (not cost) or cost == 0 then
|
||||
skip = item
|
||||
else
|
||||
ingredient_cost = ingredient_cost + cost
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif exchangeclone.craft_types[recipe.type].type == "energy" then
|
||||
ingredient_cost = recipe.recipe
|
||||
end
|
||||
if recipe.replacements and not skip then
|
||||
for _, item in pairs(recipe.replacements) do
|
||||
if item[1] ~= item[2] then
|
||||
local cost = exchangeclone.get_item_energy(item[2])
|
||||
if (not cost) or cost == 0 then
|
||||
skip = item[2]
|
||||
else
|
||||
ingredient_cost = ingredient_cost - cost
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if output_count < 1 then skip = true end
|
||||
if not skip then
|
||||
local total_cost = math.floor(ingredient_cost*20/math.max(1, output_count))/20 -- allow .05, won't work with huge numbers
|
||||
if (not cheapest) or (cheapest[1] > total_cost) then
|
||||
cheapest = {total_cost, recipe}
|
||||
end
|
||||
end
|
||||
if log then minetest.log("action", dump({
|
||||
recipe = recipe,
|
||||
ingredient_cost = ingredient_cost,
|
||||
output_count = output_count
|
||||
})) end
|
||||
end
|
||||
return cheapest and cheapest[1]
|
||||
end
|
||||
|
||||
exchangeclone.energy_values = {}
|
||||
|
||||
-- Sets the energy value of an item, must be called during load time.
|
||||
local function set_item_energy(itemstring, energy_value)
|
||||
if not (energy_value and itemstring) then return end
|
||||
energy_value = math.floor(energy_value*20)/20 -- floor to nearest .05
|
||||
if energy_value < 0 then return end
|
||||
local def = minetest.registered_items[itemstring]
|
||||
if not def then return end
|
||||
local description = def.description or ""
|
||||
|
||||
-- Override energy value if it already exists
|
||||
local existing_energy_value = description:find("Energy Value: ([%d%.,]+)")
|
||||
if existing_energy_value then
|
||||
description = description:gsub("Energy Value: ([%d%.,]+)", "Energy Value: "..exchangeclone.format_number(energy_value))
|
||||
else
|
||||
if description[#description] ~= "\n" then
|
||||
description = description.."\n"
|
||||
end
|
||||
description = description.."Energy Value: "..exchangeclone.format_number(energy_value)
|
||||
end
|
||||
minetest.override_item(itemstring, {
|
||||
description = description,
|
||||
energy_value = energy_value,
|
||||
})
|
||||
if energy_value > 0 then
|
||||
exchangeclone.energy_values[itemstring] = energy_value
|
||||
else
|
||||
exchangeclone.energy_values[itemstring] = nil
|
||||
end
|
||||
end
|
||||
|
||||
local auto = {}
|
||||
|
||||
-- Handle stonecutter recipes and decaychains in Mineclonia
|
||||
if exchangeclone.mcla then
|
||||
exchangeclone.register_craft_type("stonecutting", "cooking")
|
||||
-- TODO: Check recipe_yield for every Mineclonia update
|
||||
local recipe_yield = { --maps itemgroup to the respective recipe yield, default is 1
|
||||
["slab"] = 2,
|
||||
["cut_copper"] = 4,
|
||||
}
|
||||
for result, def in pairs(minetest.registered_items) do
|
||||
if minetest.get_item_group(result,"not_in_creative_inventory") == 0 then
|
||||
if def._mcl_stonecutter_recipes then
|
||||
for _, source in pairs(def._mcl_stonecutter_recipes) do
|
||||
local yield = 1
|
||||
for k,v in pairs(recipe_yield) do if minetest.get_item_group(result,k) > 0 then yield = v end end
|
||||
exchangeclone.register_craft({output = result.." "..yield, type = "stonecutting", recipe = source})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if mcl_copper then
|
||||
exchangeclone.register_craft_type("decaychain", "cooking")
|
||||
exchangeclone.register_craft_type("preserving", "cooking")
|
||||
local decaychains = mcl_copper.registered_decaychains
|
||||
for name, data in pairs(decaychains) do
|
||||
for i, itemstring in ipairs(data.nodes) do
|
||||
if minetest.get_item_group(name,"not_in_creative_inventory") == 0 then
|
||||
local preserved_itemstring = itemstring.."_preserved"
|
||||
exchangeclone.register_craft({output = preserved_itemstring, type = "preserving", recipe = {itemstring, "group:"..data.preserve_group}})
|
||||
if i > 1 then
|
||||
exchangeclone.register_craft({output = itemstring, type = "decaychain", recipe = data.nodes[i-1]})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Register clock/compass aliases, handle enchanted/netherite stuff, potions, and concrete, and register coral energy values
|
||||
if exchangeclone.mcl then
|
||||
for i = 0, 31 do
|
||||
exchangeclone.register_alias("mcl_compass:18", "mcl_compass:"..i)
|
||||
exchangeclone.register_alias("mcl_compass:18", "mcl_compass:"..i.."_lodestone")
|
||||
end
|
||||
for i = 0, 63 do
|
||||
exchangeclone.register_alias("mcl_clock:clock", "mcl_clock:clock_"..i)
|
||||
end
|
||||
exchangeclone.register_alias("doc_identifier:identifier_solid", "doc_identifier:identifier_liquid")
|
||||
exchangeclone.register_alias("mcl_books:writable_book", "mcl_books:written_book")
|
||||
|
||||
-- Potions
|
||||
exchangeclone.register_craft_type("brewing", "shapeless")
|
||||
local function add_potion_recipe(info)
|
||||
if not info.bases then info.bases = {"mcl_potions:awkward"} end
|
||||
for _, base in pairs(info.bases) do
|
||||
local ingredient = info.ingredient
|
||||
local normal = "mcl_potions:"..info.name
|
||||
local splash = normal.."_splash"
|
||||
local lingering = normal.."_lingering"
|
||||
exchangeclone.register_craft({output = normal.." 3", type = "brewing", recipe = {base, base, base, ingredient}})
|
||||
exchangeclone.register_craft({output = normal.."_splash 3", type = "brewing", recipe = {normal, normal, normal, "mcl_mobitems:gunpowder"}})
|
||||
exchangeclone.register_craft({output = normal.."_lingering 3", type = "brewing", recipe = {normal, normal, normal, "mcl_potions:dragon_breath"}})
|
||||
if info.plus then
|
||||
exchangeclone.register_craft({output = normal.."_plus 3", type = "brewing", recipe = {normal, normal, normal, "mcl_nether:glowstone_dust"}})
|
||||
exchangeclone.register_craft({output = normal.."_plus_splash 3", type = "brewing", recipe = {splash, splash, splash, "mcl_nether:glowstone_dust"}})
|
||||
exchangeclone.register_craft({output = normal.."_plus_lingering 3", type = "brewing", recipe = {lingering, lingering, lingering, "mcl_nether:glowstone_dust"}})
|
||||
end
|
||||
if info.two then
|
||||
exchangeclone.register_craft({output = normal.."_2 3", type = "brewing", recipe = {normal, normal, normal, "mesecons:redstone"}})
|
||||
exchangeclone.register_craft({output = normal.."_2_splash 3", type = "brewing", recipe = {splash, splash, splash, "mesecons:redstone"}})
|
||||
exchangeclone.register_craft({output = normal.."_2_lingering 3", type = "brewing", recipe = {lingering, lingering, lingering, "mesecons:redstone"}})
|
||||
end
|
||||
end
|
||||
end
|
||||
for _, info in pairs(exchangeclone.mcl_potion_data) do
|
||||
add_potion_recipe(info)
|
||||
end
|
||||
|
||||
-- Enchanted/netherite tools
|
||||
exchangeclone.register_craft_type("upgrading", "shapeless")
|
||||
for name, def in pairs(minetest.registered_items) do
|
||||
if def._mcl_enchanting_enchanted_tool then
|
||||
exchangeclone.register_alias(name, def._mcl_enchanting_enchanted_tool)
|
||||
end
|
||||
if def._mcl_upgrade_item then
|
||||
if not name:find("enchanted") then
|
||||
exchangeclone.register_craft({output = def._mcl_upgrade_item, type = "upgrading", recipe = {name, "mcl_nether:netherite_ingot"}})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
exchangeclone.register_craft_type("hardening", "cooking")
|
||||
-- Concrete and banners/shields (don't remember why the shields don't work)
|
||||
for color, color_data in pairs(exchangeclone.colors) do
|
||||
exchangeclone.register_craft({output = "mcl_colorblocks:concrete_"..color, type = "hardening", recipe = "mcl_colorblocks:concrete_powder_"..color})
|
||||
--exchangeclone.register_craft({output = "mcl_shields:shield_"..color, type = "shapeless", recipe = {"mcl_banners:banner_item_"..color, "mcl_shields:shield"}})
|
||||
end
|
||||
|
||||
-- Maps
|
||||
exchangeclone.register_alias("mcl_maps:empty_map", "mcl_maps:filled_map")
|
||||
local mcl_skins_enabled = minetest.global_exists("mcl_skins")
|
||||
if mcl_skins_enabled then
|
||||
-- Generate a node for every skin
|
||||
local list = mcl_skins.get_skin_list()
|
||||
for _, skin in pairs(list) do
|
||||
exchangeclone.register_alias("mcl_maps:empty_map", "mcl_maps:filled_map_" .. skin.id)
|
||||
end
|
||||
else
|
||||
exchangeclone.register_alias("mcl_maps:empty_map", "mcl_maps:filled_map_hand")
|
||||
end
|
||||
|
||||
-- Sponges
|
||||
exchangeclone.register_alias("mcl_sponges:sponge", "mcl_sponges:sponge_wet")
|
||||
exchangeclone.register_alias("mcl_sponges:sponge", "mcl_sponges:sponge_wet_river_water")
|
||||
end
|
||||
|
||||
-- Register copper block/stonecutting energy recipes in MineClone2
|
||||
if exchangeclone.mcl2 then
|
||||
exchangeclone.register_craft_type("oxidation", "cooking")
|
||||
local states = {"", "_exposed", "_weathered", "_oxidized"}
|
||||
for i = 2, #states do
|
||||
exchangeclone.register_craft({output = "mcl_copper:block"..states[i], type = "oxidation", recipe = "mcl_copper:block"..states[i-1]})
|
||||
end
|
||||
exchangeclone.register_craft_type("stonecutting", "cooking")
|
||||
for input, outputs in pairs(mcl_stonecutter.registered_recipes) do
|
||||
for output, amount in pairs(outputs) do
|
||||
exchangeclone.register_craft({output = output.." "..amount, type = "stonecutting", recipe = input})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if not exchangeclone.mcl then
|
||||
exchangeclone.register_alias("default:book", "default:book_written")
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
-- Up to this point, no energy values have actually been set.
|
||||
|
||||
|
||||
|
||||
|
||||
-- Register group energy values
|
||||
local groupnames = {}
|
||||
for index, group in ipairs(exchangeclone.group_values) do
|
||||
groupnames[#groupnames + 1] = group[1] --Get list of group names
|
||||
end
|
||||
local grouped_items = exchangeclone.get_group_items(groupnames, true, true)
|
||||
for index, group in ipairs(exchangeclone.group_values) do
|
||||
for i, item in pairs(grouped_items[group[1]]) do
|
||||
set_item_energy(item, group[2])
|
||||
end
|
||||
end
|
||||
|
||||
-- Register base energy values
|
||||
for itemstring, energy_value in pairs(exchangeclone.base_energy_values) do
|
||||
set_item_energy(itemstring, energy_value)
|
||||
end
|
||||
|
||||
-- Register `exchangeclone_custom_energy` values and decide whether to automatically register energy values
|
||||
for itemstring, def in pairs(minetest.registered_items) do
|
||||
if def.exchangeclone_custom_energy then
|
||||
set_item_energy(itemstring, def.exchangeclone_custom_energy)
|
||||
else
|
||||
itemstring = exchangeclone.handle_alias(itemstring) or itemstring
|
||||
def = minetest.registered_items[itemstring] -- in case itemstring changed
|
||||
local _, _, mod_name, item_name = itemstring:find("([%d_%l]+):([%d_%l]+)")
|
||||
if (
|
||||
def
|
||||
and item_name
|
||||
and mod_name
|
||||
and def.description
|
||||
and def.description ~= ""
|
||||
and ((minetest.get_item_group(item_name, "not_in_creative_inventory") < 1) or mod_name == "mcl_compass")
|
||||
and (not exchangeclone.get_item_energy(itemstring))
|
||||
and exchangeclone.recipes[itemstring]
|
||||
) then
|
||||
auto[itemstring] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- handle aliases in exchangeclone.recipes
|
||||
for itemstring, recipes in pairs(exchangeclone.recipes) do
|
||||
local new_name = ItemStack(itemstring):get_name()
|
||||
if new_name and new_name ~= "" and new_name ~= itemstring then
|
||||
exchangeclone.recipes[new_name] = exchangeclone.recipes[new_name] or {}
|
||||
for _, recipe in pairs(recipes) do
|
||||
table.insert(exchangeclone.recipes[new_name], recipe)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local old_auto
|
||||
local same = false
|
||||
local i = 1
|
||||
-- Automatically register energy values
|
||||
while not same do
|
||||
minetest.log("action", "[ExchangeClone] \tIteration #"..i)
|
||||
if auto == {} then break end
|
||||
if old_auto then
|
||||
same = true
|
||||
for itemstring, _ in pairs(old_auto) do
|
||||
if itemstring ~= "" and not auto[itemstring] then
|
||||
same = false
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
if same then
|
||||
minetest.log("action", "[ExchangeClone]\tNo change, stopping.")
|
||||
break
|
||||
end
|
||||
old_auto = table.copy(auto)
|
||||
for itemstring, _ in pairs(auto) do
|
||||
local cheapest = get_cheapest_recipe(itemstring)
|
||||
if cheapest then
|
||||
set_item_energy(itemstring, cheapest)
|
||||
auto[itemstring] = nil
|
||||
end
|
||||
end
|
||||
i = i + 1
|
||||
end
|
||||
|
||||
if exchangeclone.mcl then
|
||||
set_item_energy("mcl_campfires:campfire", exchangeclone.get_item_energy("mcl_campfires:campfire_lit"))
|
||||
set_item_energy("mcl_campfires:soul_campfire", exchangeclone.get_item_energy("mcl_campfires:soul_campfire_lit"))
|
||||
-- Recovery compasses use a random compass frame for the crafting recipe... Incredibly irritating.
|
||||
for i = 0, 31 do
|
||||
if exchangeclone.get_item_energy("mcl_compass:"..i.."_recovery") then
|
||||
for j = 0, 31 do
|
||||
exchangeclone.register_alias("mcl_compass:"..i.."_recovery", "mcl_compass:"..j.."_recovery")
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local cheapest_color = {""}
|
||||
|
||||
for color, color_data in pairs(exchangeclone.colors) do
|
||||
local dye_itemstring = (exchangeclone.mcl and "mcl_dye:" or "dye:")..color
|
||||
local dye_energy = exchangeclone.get_item_energy(dye_itemstring)
|
||||
if dye_energy then
|
||||
if (not cheapest_color[2]) or (dye_energy < cheapest_color[2]) then
|
||||
cheapest_color[1] = color
|
||||
cheapest_color[2] = dye_energy
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
cheapest_color = cheapest_color[1] -- No idea why I'm doing it this way.
|
||||
|
||||
local cheapest_advanced_itemstring = "exchangeclone:advanced_alchemical_chest_"..cheapest_color
|
||||
|
||||
for color, color_data in pairs(exchangeclone.colors) do
|
||||
local advanced_itemstring = "exchangeclone:advanced_alchemical_chest_"..color
|
||||
set_item_energy(advanced_itemstring, exchangeclone.get_item_energy(cheapest_advanced_itemstring))
|
||||
end
|
||||
|
||||
-- Adds energy values to aliased items, even though they're not used (just so it's displayed)
|
||||
for alias, itemstring in pairs(exchangeclone.energy_aliases) do
|
||||
set_item_energy(itemstring, exchangeclone.get_item_energy(alias))
|
||||
end
|
||||
|
||||
-- Delete unnecessary data (waste of memory)
|
||||
if not exchangeclone.keep_data then
|
||||
exchangeclone.recipes = nil
|
||||
exchangeclone.base_energy_values = nil
|
||||
end
|
|
@ -1,36 +1,38 @@
|
|||
-- TODO: Before releasing, check the shears. Just do it.
|
||||
-- I know you don't want to... but test EVERY SINGLE FUNCTION.
|
||||
-- MineClonia probably broke them.
|
||||
|
||||
exchangeclone.shear_action = {
|
||||
start_action = function(player, center, range)
|
||||
start_action = function(player, center, range, itemstack)
|
||||
if exchangeclone.check_cooldown(player, "shears") then return end
|
||||
local data = {}
|
||||
data.player_energy = exchangeclone.get_player_energy(player)
|
||||
if data.player_energy < 8 then return end
|
||||
exchangeclone.play_ability_sound(player)
|
||||
data.energy_cost = 0
|
||||
data.itemstack = itemstack
|
||||
data.remove_positions = {}
|
||||
return data
|
||||
end,
|
||||
action = function(player, pos, node, data)
|
||||
if data.energy_cost + 8 > data.player_energy then return end
|
||||
local node_def = minetest.registered_items[node.name]
|
||||
local node_def = minetest.registered_items[ItemStack(node.name):get_name()]
|
||||
if not node_def then return data end
|
||||
if (node_def.groups.shearsy or node_def.groups.shearsy_cobweb) and node.name ~= "mcl_flowers:double_grass_top" then
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
minetest.record_protection_violation(pos, player:get_player_name())
|
||||
else
|
||||
data.energy_cost = data.energy_cost + 8
|
||||
local drops = minetest.get_node_drops(node.name, "exchangeclone:red_matter_shears")
|
||||
local drops = minetest.get_node_drops(node.name, data.itemstack)
|
||||
exchangeclone.drop_items_on_player(pos, drops, player)
|
||||
-- Annoying manual override
|
||||
if node.name:sub(1,18) == "mcl_ocean:seagrass" then
|
||||
minetest.set_node(pos, {name="sand"})
|
||||
else
|
||||
minetest.set_node(pos, {name="air"})
|
||||
table.insert(data.remove_positions, pos)
|
||||
end
|
||||
end
|
||||
end
|
||||
return data
|
||||
end,
|
||||
end_action = function(player, center, range, data)
|
||||
exchangeclone.set_player_energy(player, data.player_energy - data.energy_cost)
|
||||
exchangeclone.remove_nodes(data.remove_positions)
|
||||
exchangeclone.start_cooldown(player, "shears", (range+1)/7)
|
||||
return data
|
||||
end
|
||||
}
|
||||
|
||||
|
@ -66,7 +68,7 @@ local shears_rightclick = function(itemstack, player, pointed_thing)
|
|||
center = pointed_thing.under
|
||||
end
|
||||
local range = tonumber(itemstack:get_meta():get_int("exchangeclone_item_range"))
|
||||
exchangeclone.node_radius_action(player, center, range, exchangeclone.shear_action)
|
||||
exchangeclone.node_radius_action(player, center, range, exchangeclone.shear_action, itemstack)
|
||||
return itemstack
|
||||
end
|
||||
|
||||
|
@ -75,7 +77,7 @@ minetest.register_tool("exchangeclone:dark_matter_shears", {
|
|||
wield_image = "exchangeclone_dark_matter_shears.png",
|
||||
inventory_image = "exchangeclone_dark_matter_shears.png",
|
||||
stack_max = 1,
|
||||
groups = { tool=1, shears=1, dig_speed_class=7, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
groups = { tool=1, shears=1, dig_speed_class=5, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 0.4,
|
||||
max_drop_level=1,
|
||||
|
@ -97,7 +99,7 @@ minetest.register_tool("exchangeclone:red_matter_shears", {
|
|||
wield_image = "exchangeclone_red_matter_shears.png",
|
||||
inventory_image = "exchangeclone_red_matter_shears.png",
|
||||
stack_max = 1,
|
||||
groups = { tool=1, shears=1, dig_speed_class=8, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
groups = { tool=1, shears=1, dig_speed_class=6, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 0.3,
|
||||
max_drop_level=1,
|
||||
|
@ -237,7 +239,7 @@ minetest.registered_entities["mobs_mc:mooshroom"].on_rightclick = function(self,
|
|||
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
|
||||
for _, itemstring in pairs({"mcl_beehives:bee_nest_5", "mcl_beehives:beehive_5"}) do
|
||||
minetest.registered_items[itemstring].on_rightclick = function(pos, node, player, itemstack, pointed_thing)
|
||||
local held_name = player:get_wielded_item():get_name()
|
||||
local shears = special_shears[held_name]
|
||||
|
@ -383,7 +385,7 @@ local new_dispenser_function = function(pos, node)
|
|||
old_dispenser_function(pos, node)
|
||||
end
|
||||
|
||||
for _, itemstring in ipairs({"mcl_dispensers:dispenser", "mcl_dispensers:dispenser_up", "mcl_dispensers:dispenser_down"}) do
|
||||
for _, itemstring in pairs({"mcl_dispensers:dispenser", "mcl_dispensers:dispenser_up", "mcl_dispensers:dispenser_down"}) do
|
||||
minetest.registered_items[itemstring].mesecons.effector.action_on = new_dispenser_function
|
||||
end
|
||||
|
||||
|
@ -423,7 +425,7 @@ minetest.register_craft({
|
|||
output = "exchangeclone:dark_matter_shears",
|
||||
recipe = {
|
||||
{"", "exchangeclone:dark_matter"},
|
||||
{exchangeclone.diamond_itemstring, ""},
|
||||
{exchangeclone.itemstrings.diamond, ""},
|
||||
}
|
||||
})
|
||||
|
|
@ -1,46 +1,43 @@
|
|||
exchangeclone.shovel_action = {
|
||||
start_action = function(player, center, range)
|
||||
start_action = function(player, center, range, itemstack)
|
||||
if exchangeclone.check_cooldown(player, "shovel") then return end
|
||||
local data = {}
|
||||
data.player_energy = exchangeclone.get_player_energy(player)
|
||||
data.energy_cost = 0
|
||||
if exchangeclone.mcl then
|
||||
data.path = not player:get_player_control().sneak
|
||||
end
|
||||
if range > 0 or not data.path then
|
||||
exchangeclone.play_ability_sound(player)
|
||||
end
|
||||
data.itemstack = itemstack
|
||||
data.remove_positions = {}
|
||||
return data
|
||||
end,
|
||||
action = function(player, pos, node, data)
|
||||
if data.energy_cost + 8 > data.player_energy then return end
|
||||
if ((minetest.get_item_group(node.name, "crumbly") > 0) or (minetest.get_item_group(node.name, "shovely") > 0)) then
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
minetest.record_protection_violation(pos, player:get_player_name())
|
||||
else
|
||||
if data.path then
|
||||
-- TODO: Fix potential "shovel_on_place" functions that aren't paths in Mineclonia
|
||||
-- TODO: Fix potential "shovel_on_place" functions that aren't paths in Mineclonia (same with axes)
|
||||
if minetest.registered_items[node.name]._on_shovel_place or
|
||||
minetest.get_item_group(node.name, "path_creation_possible") == 1 then
|
||||
if minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}).name == "air" then
|
||||
minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = pos}, true)
|
||||
data.energy_cost = data.energy_cost + 4
|
||||
minetest.swap_node(pos, {name="mcl_core:grass_path"})
|
||||
end
|
||||
end
|
||||
else
|
||||
data.energy_cost = data.energy_cost + 8
|
||||
local drops = minetest.get_node_drops(node.name, "exchangeclone:red_matter_shovel")
|
||||
local drops = minetest.get_node_drops(node.name, data.itemstack)
|
||||
exchangeclone.drop_items_on_player(pos, drops, player)
|
||||
minetest.set_node(pos, {name = "air"})
|
||||
table.insert(data.remove_positions, pos)
|
||||
end
|
||||
end
|
||||
end
|
||||
return data
|
||||
end,
|
||||
end_action = function(player, center, range, data)
|
||||
exchangeclone.remove_nodes(data.remove_positions)
|
||||
if range > 0 or not data.path then
|
||||
exchangeclone.set_player_energy(player, data.player_energy - data.energy_cost)
|
||||
exchangeclone.start_cooldown(player, "shovel", range/4) -- Longish cooldown
|
||||
end
|
||||
end
|
||||
|
@ -68,7 +65,7 @@ local function shovel_on_place(itemstack, player, pointed_thing)
|
|||
center = pointed_thing.under
|
||||
end
|
||||
|
||||
exchangeclone.node_radius_action(player, center, range, exchangeclone.shovel_action)
|
||||
exchangeclone.node_radius_action(player, center, range, exchangeclone.shovel_action, itemstack)
|
||||
|
||||
return itemstack
|
||||
end
|
||||
|
@ -77,7 +74,7 @@ minetest.register_tool("exchangeclone:dark_matter_shovel", {
|
|||
description = "Dark Matter Shovel",
|
||||
wield_image = "exchangeclone_dark_matter_shovel.png",
|
||||
inventory_image = "exchangeclone_dark_matter_shovel.png",
|
||||
groups = { tool=1, shovel=1, dig_speed_class=6, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
groups = { tool=1, shovel=1, dig_speed_class=5, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
wield_scale = exchangeclone.wield_scale,
|
||||
tool_capabilities = {
|
||||
-- 1/1.2
|
||||
|
@ -94,7 +91,7 @@ minetest.register_tool("exchangeclone:dark_matter_shovel", {
|
|||
on_secondary_use = shovel_on_place,
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
shovely = { speed = 16, level = 7, uses = 0 }
|
||||
shovely = { speed = 16, level = 5, uses = 0 }
|
||||
},
|
||||
})
|
||||
|
||||
|
@ -102,7 +99,7 @@ minetest.register_tool("exchangeclone:red_matter_shovel", {
|
|||
description = "Red Matter Shovel",
|
||||
wield_image = "exchangeclone_red_matter_shovel.png",
|
||||
inventory_image = "exchangeclone_red_matter_shovel.png",
|
||||
groups = { tool=1, shovel=1, dig_speed_class=7, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
groups = { tool=1, shovel=1, dig_speed_class=6, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
wield_scale = exchangeclone.wield_scale,
|
||||
tool_capabilities = {
|
||||
-- 1/1.2
|
||||
|
@ -119,7 +116,7 @@ minetest.register_tool("exchangeclone:red_matter_shovel", {
|
|||
on_secondary_use = shovel_on_place,
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
shovely = { speed = 19, level = 8, uses = 0 }
|
||||
shovely = { speed = 19, level = 6, uses = 0 }
|
||||
},
|
||||
})
|
||||
|
||||
|
@ -129,8 +126,8 @@ minetest.register_craft({
|
|||
output = "exchangeclone:dark_matter_shovel",
|
||||
recipe = {
|
||||
{"exchangeclone:dark_matter"},
|
||||
{exchangeclone.diamond_itemstring},
|
||||
{exchangeclone.diamond_itemstring}
|
||||
{exchangeclone.itemstrings.diamond},
|
||||
{exchangeclone.itemstrings.diamond}
|
||||
}
|
||||
})
|
||||
|
|
@ -9,42 +9,47 @@ local aoe_exclude = { --any entity not including "mobs" is automatically added t
|
|||
["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,
|
||||
local hostile_mobs = { --for Red Matter Sword/Katar
|
||||
["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:baby_zombie"] = true,
|
||||
["mobs_mc:blaze"] = true,
|
||||
["mobs_mc:cave_spider"] = true,
|
||||
["mobs_mc:creeper"] = true,
|
||||
["mobs_mc:creeper_charged"] = true,
|
||||
["mobs_mc:enderdragon"] = true,
|
||||
["mobs_mc:enderman"] = true,
|
||||
["mobs_mc:endermite"] = true,
|
||||
["mobs_mc:evoker"] = true,
|
||||
["mobs_mc:ghast"] = true,
|
||||
["mobs_mc:guardian"] = true,
|
||||
["mobs_mc:guardian_elder"] = true,
|
||||
["mobs_mc:hoglin"] = true,
|
||||
["mobs_mc:slime_tiny"] = true,
|
||||
["mobs_mc:vex"] = true,
|
||||
["mobs_mc:husk"] = true,
|
||||
["mobs_mc:illusioner"] = true,
|
||||
["mobs_mc:killer_bunny"] = true,
|
||||
["mobs_mc:magma_cube_big"] = true,
|
||||
["mobs_mc:magma_cube_small"] = true,
|
||||
["mobs_mc:magma_cube_tiny"] = true,
|
||||
["mobs_mc:piglin"] = true,
|
||||
["mobs_mc:piglin_brute"] = true,
|
||||
["mobs_mc:pillager"] = true,
|
||||
["mobs_mc:shulker"] = true,
|
||||
["mobs_mc:skeleton"] = true,
|
||||
["mobs_mc:silverfish"] = true,
|
||||
["mobs_mc:slime_big"] = true,
|
||||
["mobs_mc:slime_tiny"] = true,
|
||||
["mobs_mc:spider"] = true,
|
||||
["mobs_mc:stray"] = true,
|
||||
["mobs_mc:vex"] = true,
|
||||
["mobs_mc:villager_zombie"] = true,
|
||||
["mobs_mc:vindicator"] = true,
|
||||
["mobs_mc:witch"] = true,
|
||||
["mobs_mc:wither"] = true,
|
||||
["mobs_mc:witherskeleton"] = true,
|
||||
["mobs_mc:zombified_piglin"] = true,
|
||||
["mobs_mc:zoglin"] = true,
|
||||
["mobs_mc:zombie"] = true,
|
||||
}
|
||||
|
||||
minetest.register_on_mods_loaded(function()
|
||||
|
@ -55,7 +60,7 @@ minetest.register_on_mods_loaded(function()
|
|||
end
|
||||
end)
|
||||
|
||||
exchangeclone.aoe_attack = function(info)
|
||||
function exchangeclone.aoe_attack(info)
|
||||
if not info then return end
|
||||
local damage = info.damage or 12 -- 12 = DM sword AOE
|
||||
local knockback = info.knockback
|
||||
|
@ -74,13 +79,6 @@ exchangeclone.aoe_attack = function(info)
|
|||
|
||||
if exchangeclone.check_cooldown(player, "sword") then return 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
|
||||
|
||||
exchangeclone.play_ability_sound(player)
|
||||
|
||||
local pos = player:get_pos()
|
||||
|
@ -94,9 +92,9 @@ exchangeclone.aoe_attack = function(info)
|
|||
|
||||
-- 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
|
||||
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 = math.max(1, vector.distance(pos, opos))
|
||||
|
@ -106,7 +104,6 @@ exchangeclone.aoe_attack = function(info)
|
|||
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
|
||||
--minetest.log(dump({name=ent.name, distance=distance, damage=damage}))
|
||||
|
||||
local sleep_formspec_doesnt_close_mt53 = false
|
||||
if obj:is_player() then
|
||||
|
@ -127,7 +124,7 @@ exchangeclone.aoe_attack = function(info)
|
|||
return
|
||||
end
|
||||
if exchangeclone.mcl then
|
||||
mcl_util.deal_damage(obj, damage, { type = "generic", direct = player})
|
||||
mcl_util.deal_damage(obj, damage, { type = "hit", direct = player})
|
||||
else
|
||||
obj:set_hp(obj:get_hp() - damage)
|
||||
end
|
||||
|
@ -135,7 +132,7 @@ exchangeclone.aoe_attack = function(info)
|
|||
end)
|
||||
else
|
||||
if exchangeclone.mcl then
|
||||
mcl_util.deal_damage(obj, damage, { type = "generic", direct = player})
|
||||
mcl_util.deal_damage(obj, damage, { type = "hit", direct = player})
|
||||
else
|
||||
obj:set_hp(obj:get_hp() - damage)
|
||||
end
|
||||
|
@ -171,7 +168,7 @@ minetest.register_tool("exchangeclone:dark_matter_sword", {
|
|||
description = "Dark Matter Sword",
|
||||
wield_image = "exchangeclone_dark_matter_sword.png",
|
||||
inventory_image = "exchangeclone_dark_matter_sword.png",
|
||||
groups = { tool=1, sword=1, dig_speed_class=6, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
groups = { tool=1, sword=1, dig_speed_class=5, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
wield_scale = exchangeclone.wield_scale,
|
||||
tool_capabilities = {
|
||||
-- 1/1.2
|
||||
|
@ -188,7 +185,7 @@ minetest.register_tool("exchangeclone:dark_matter_sword", {
|
|||
sound = { breaks = "default_tool_breaks" },
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
swordy = { speed = 16, level = 7, uses = 0 }
|
||||
swordy = { speed = 16, level = 5, uses = 0 }
|
||||
},
|
||||
})
|
||||
|
||||
|
@ -196,7 +193,7 @@ minetest.register_tool("exchangeclone:red_matter_sword", {
|
|||
description = "Red Matter Sword",
|
||||
wield_image = "exchangeclone_red_matter_sword.png",
|
||||
inventory_image = "exchangeclone_red_matter_sword.png",
|
||||
groups = { tool=1, sword=1, dig_speed_class=7, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
groups = { tool=1, sword=1, dig_speed_class=6, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
wield_scale = exchangeclone.wield_scale,
|
||||
tool_capabilities = {
|
||||
-- 1/1.2
|
||||
|
@ -213,7 +210,7 @@ minetest.register_tool("exchangeclone:red_matter_sword", {
|
|||
sound = { breaks = "default_tool_breaks" },
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
swordy = { speed = 20, level = 7, uses = 0 }
|
||||
swordy = { speed = 20, level = 6, uses = 0 }
|
||||
},
|
||||
})
|
||||
|
||||
|
@ -222,7 +219,7 @@ minetest.register_craft({
|
|||
recipe = {
|
||||
{"exchangeclone:dark_matter"},
|
||||
{"exchangeclone:dark_matter"},
|
||||
{exchangeclone.diamond_itemstring}
|
||||
{exchangeclone.itemstrings.diamond}
|
||||
}
|
||||
})
|
||||
|
Before Width: | Height: | Size: 571 B After Width: | Height: | Size: 571 B |
After Width: | Height: | Size: 852 B |
After Width: | Height: | Size: 962 B |
After Width: | Height: | Size: 970 B |
After Width: | Height: | Size: 917 B |
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 665 B |
After Width: | Height: | Size: 4.7 KiB |
After Width: | Height: | Size: 920 B |
After Width: | Height: | Size: 986 B |
After Width: | Height: | Size: 944 B |
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 7.7 KiB |
Before Width: | Height: | Size: 731 B After Width: | Height: | Size: 731 B |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 613 B After Width: | Height: | Size: 613 B |
Before Width: | Height: | Size: 595 B After Width: | Height: | Size: 595 B |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 760 B After Width: | Height: | Size: 760 B |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 744 B After Width: | Height: | Size: 744 B |
Before Width: | Height: | Size: 796 B After Width: | Height: | Size: 796 B |
Before Width: | Height: | Size: 810 B After Width: | Height: | Size: 810 B |
Before Width: | Height: | Size: 822 B After Width: | Height: | Size: 822 B |
Before Width: | Height: | Size: 816 B After Width: | Height: | Size: 816 B |
Before Width: | Height: | Size: 793 B After Width: | Height: | Size: 793 B |
Before Width: | Height: | Size: 547 B After Width: | Height: | Size: 547 B |
Before Width: | Height: | Size: 614 B After Width: | Height: | Size: 614 B |
Before Width: | Height: | Size: 598 B After Width: | Height: | Size: 598 B |
After Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 545 B After Width: | Height: | Size: 545 B |
Before Width: | Height: | Size: 598 B After Width: | Height: | Size: 598 B |
Before Width: | Height: | Size: 572 B After Width: | Height: | Size: 572 B |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 216 B After Width: | Height: | Size: 216 B |
Before Width: | Height: | Size: 310 B After Width: | Height: | Size: 310 B |
Before Width: | Height: | Size: 315 B After Width: | Height: | Size: 315 B |
Before Width: | Height: | Size: 229 B After Width: | Height: | Size: 229 B |
Before Width: | Height: | Size: 251 B After Width: | Height: | Size: 251 B |
Before Width: | Height: | Size: 217 B After Width: | Height: | Size: 217 B |
Before Width: | Height: | Size: 256 B After Width: | Height: | Size: 256 B |
Before Width: | Height: | Size: 292 B After Width: | Height: | Size: 292 B |
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 8.1 KiB |
Before Width: | Height: | Size: 265 B After Width: | Height: | Size: 265 B |
Before Width: | Height: | Size: 270 B After Width: | Height: | Size: 270 B |
Before Width: | Height: | Size: 429 B After Width: | Height: | Size: 429 B |
Before Width: | Height: | Size: 290 B After Width: | Height: | Size: 290 B |
Before Width: | Height: | Size: 353 B After Width: | Height: | Size: 353 B |
Before Width: | Height: | Size: 269 B After Width: | Height: | Size: 269 B |
Before Width: | Height: | Size: 220 B After Width: | Height: | Size: 220 B |
Before Width: | Height: | Size: 264 B After Width: | Height: | Size: 264 B |
Before Width: | Height: | Size: 189 B After Width: | Height: | Size: 189 B |
Before Width: | Height: | Size: 213 B After Width: | Height: | Size: 213 B |
Before Width: | Height: | Size: 281 B After Width: | Height: | Size: 281 B |
Before Width: | Height: | Size: 294 B After Width: | Height: | Size: 294 B |
Before Width: | Height: | Size: 308 B After Width: | Height: | Size: 308 B |
Before Width: | Height: | Size: 347 B After Width: | Height: | Size: 347 B |
Before Width: | Height: | Size: 349 B After Width: | Height: | Size: 349 B |
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 896 B After Width: | Height: | Size: 896 B |
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |