Compare commits

...

44 Commits

Author SHA1 Message Date
ThePython d6c2fdc768 Remove todo list 2023-12-26 17:54:30 -08:00
ThePython f1c222ef1a Remove shield 2023-12-26 17:51:45 -08:00
ThePython ab1c28c041 fix shield 2023-12-26 17:51:13 -08:00
ThePython 233d84d3e2 Fix shield 2023-12-26 17:50:32 -08:00
ThePython 638fd4666d v6.0 2023-12-26 17:49:27 -08:00
ThePython 829991ed39 I think it's pretty much ready (finally) 2023-12-26 17:07:40 -08:00
ThePython 473e7912a9 Almost done, I think. 2023-12-25 09:56:50 -08:00
ThePython 18429268f3 Fixed #10 2023-12-25 08:54:42 -08:00
ThePython b21c182365 Bunch of random things again 2023-12-25 07:57:42 -08:00
ThePython d5c153e45f Couple fixes 2023-12-21 12:37:52 -08:00
ThePython c39ff263d9 Update readme 2023-12-20 17:14:04 -08:00
ThePython 0058a05069 Features complete! Time for testing... :( 2023-12-20 16:52:46 -08:00
ThePython b8ed0fa57f Some cool stuff and maybe a logo 2023-12-18 14:57:30 -08:00
ThePython 002b5da71e Lots of random stuff (only 2 mods now) 2023-12-14 15:09:59 -08:00
ThePython 40cf7088da Decaychains and stonecutter now work 2023-11-27 15:02:12 -08:00
ThePython 72b84587aa Merge remote-tracking branch 'origin/MoreManualStuff' into dev 2023-11-26 14:25:00 -08:00
ThePython10110 8c277cc130 More 2023-11-26 07:24:45 -08:00
ThePython10110 cb428c46a2 Automatic coral
(this branch exists because I'm using a different computer and forgot to
push my changes on my main one).
2023-11-24 15:51:46 -08:00
ThePython ceaf25fa4f Random commit 2023-11-23 09:48:11 -08:00
ThePython 7064d4e2a4 Trying to make stonecutter work 2023-11-23 09:17:53 -08:00
ThePython 5ed7c7e92f thingsnstuff 2023-11-22 10:36:16 -08:00
ThePython 362310b041 Merge branch 'main' into dev 2023-11-21 13:47:55 -08:00
ThePython 0be468496b Merge branch 'main' into dev 2023-11-21 13:27:50 -08:00
ThePython ad73cdefe7 Energy values now match ProjectE better 2023-11-21 13:26:27 -08:00
ThePython 7aae74608f Added some textures; don't like chest textures. 2023-11-20 12:35:10 -08:00
ThePython 9290294154 Added pipeworks support (closes #8) 2023-11-20 09:17:17 -08:00
ThePython 9c9c620b84 Hoppers work now, among other things. 2023-11-19 16:01:56 -08:00
ThePython 3874c608f3 Improvements and aliases 2023-11-18 16:48:35 -08:00
ThePython 3c8345da1b Technic works, hoppers don't yet 2023-11-12 17:30:16 -08:00
ThePython 15645ebeec Readme edit 2023-11-10 14:47:57 -08:00
ThePython d5e62aa99e Merge branch 'main' into dev 2023-11-10 14:45:49 -08:00
ThePython bb3e694f4f Finished automatic energy values! (I hope) 2023-11-10 14:43:10 -08:00
ThePython cb0f322668 Merge branch 'main' into dev 2023-11-09 19:00:54 -08:00
ThePython 81b374223b Automatic energy values MOSTLY work. 2023-11-09 18:35:23 -08:00
ThePython 37d30ebe65 Merge branch 'automatic-energy-values' into dev 2023-11-07 18:13:38 -08:00
ThePython e7f7907146 Auto energy values work (mostly) 2023-11-07 18:00:09 -08:00
ThePython 2f6f2a6388 Working on baubles 2023-11-07 16:02:24 -08:00
ThePython e1d856d62b Still testing 2023-11-02 17:29:17 -07:00
ThePython 3fa283b956 Fix a couple of things, add comments 2023-11-02 17:24:26 -07:00
ThePython 281b2a90df Couple of things 2023-11-02 16:53:52 -07:00
ThePython a683beb709 Giving up for now. 2023-11-02 16:33:30 -07:00
ThePython 3821ae518c Merge branch 'main' into dev 2023-10-30 16:59:32 -07:00
ThePython cd5bd99269 v5.2 2023-10-30 16:56:30 -07:00
ThePython a3f72e5b0f Converted to modpack 2023-10-30 16:54:59 -07:00
126 changed files with 4348 additions and 4630 deletions

View File

@ -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",

3
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"editor.inlineSuggest.showToolbar": "always"
}

View File

@ -1,5 +1,5 @@
# Code of Conduct
Don't be evil.
Don't be evil.
That's it.

View File

@ -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
View File

@ -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

View File

@ -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", ""}
}
})

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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

View File

@ -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}
}
})

162
exchangeclone/baubles.lua Normal file
View File

@ -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
}

View File

@ -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"}
}
})

View File

@ -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)

View File

@ -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",}
}
})

View File

@ -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"}
}
})

View File

@ -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}
}
)

View File

@ -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({

View File

@ -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, ""}
}
})

View File

@ -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}
}
})

View File

@ -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"},
})

View File

@ -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,},
}
})

146
exchangeclone/init.lua Normal file
View File

@ -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)")

6
exchangeclone/mod.conf Normal file
View File

@ -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

View File

@ -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

View File

@ -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...
})

View File

@ -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 = {

View File

@ -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}}
})

View File

@ -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)

View File

@ -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",

View File

@ -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

View File

@ -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, ""},
}
})

View File

@ -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}
}
})

View File

@ -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}
}
})

View File

Before

Width:  |  Height:  |  Size: 571 B

After

Width:  |  Height:  |  Size: 571 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 852 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 962 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 970 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 917 B

View File

Before

Width:  |  Height:  |  Size: 7.6 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 665 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 920 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 986 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 944 B

View File

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

Before

Width:  |  Height:  |  Size: 731 B

After

Width:  |  Height:  |  Size: 731 B

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 613 B

After

Width:  |  Height:  |  Size: 613 B

View File

Before

Width:  |  Height:  |  Size: 595 B

After

Width:  |  Height:  |  Size: 595 B

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 760 B

After

Width:  |  Height:  |  Size: 760 B

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

Before

Width:  |  Height:  |  Size: 744 B

After

Width:  |  Height:  |  Size: 744 B

View File

Before

Width:  |  Height:  |  Size: 796 B

After

Width:  |  Height:  |  Size: 796 B

View File

Before

Width:  |  Height:  |  Size: 810 B

After

Width:  |  Height:  |  Size: 810 B

View File

Before

Width:  |  Height:  |  Size: 822 B

After

Width:  |  Height:  |  Size: 822 B

View File

Before

Width:  |  Height:  |  Size: 816 B

After

Width:  |  Height:  |  Size: 816 B

View File

Before

Width:  |  Height:  |  Size: 793 B

After

Width:  |  Height:  |  Size: 793 B

View File

Before

Width:  |  Height:  |  Size: 547 B

After

Width:  |  Height:  |  Size: 547 B

View File

Before

Width:  |  Height:  |  Size: 614 B

After

Width:  |  Height:  |  Size: 614 B

View File

Before

Width:  |  Height:  |  Size: 598 B

After

Width:  |  Height:  |  Size: 598 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

Before

Width:  |  Height:  |  Size: 545 B

After

Width:  |  Height:  |  Size: 545 B

View File

Before

Width:  |  Height:  |  Size: 598 B

After

Width:  |  Height:  |  Size: 598 B

View File

Before

Width:  |  Height:  |  Size: 572 B

After

Width:  |  Height:  |  Size: 572 B

View File

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

Before

Width:  |  Height:  |  Size: 216 B

After

Width:  |  Height:  |  Size: 216 B

View File

Before

Width:  |  Height:  |  Size: 310 B

After

Width:  |  Height:  |  Size: 310 B

View File

Before

Width:  |  Height:  |  Size: 315 B

After

Width:  |  Height:  |  Size: 315 B

View File

Before

Width:  |  Height:  |  Size: 229 B

After

Width:  |  Height:  |  Size: 229 B

View File

Before

Width:  |  Height:  |  Size: 251 B

After

Width:  |  Height:  |  Size: 251 B

View File

Before

Width:  |  Height:  |  Size: 217 B

After

Width:  |  Height:  |  Size: 217 B

View File

Before

Width:  |  Height:  |  Size: 256 B

After

Width:  |  Height:  |  Size: 256 B

View File

Before

Width:  |  Height:  |  Size: 292 B

After

Width:  |  Height:  |  Size: 292 B

View File

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

Before

Width:  |  Height:  |  Size: 265 B

After

Width:  |  Height:  |  Size: 265 B

View File

Before

Width:  |  Height:  |  Size: 270 B

After

Width:  |  Height:  |  Size: 270 B

View File

Before

Width:  |  Height:  |  Size: 429 B

After

Width:  |  Height:  |  Size: 429 B

View File

Before

Width:  |  Height:  |  Size: 290 B

After

Width:  |  Height:  |  Size: 290 B

View File

Before

Width:  |  Height:  |  Size: 353 B

After

Width:  |  Height:  |  Size: 353 B

View File

Before

Width:  |  Height:  |  Size: 269 B

After

Width:  |  Height:  |  Size: 269 B

View File

Before

Width:  |  Height:  |  Size: 220 B

After

Width:  |  Height:  |  Size: 220 B

View File

Before

Width:  |  Height:  |  Size: 264 B

After

Width:  |  Height:  |  Size: 264 B

View File

Before

Width:  |  Height:  |  Size: 189 B

After

Width:  |  Height:  |  Size: 189 B

View File

Before

Width:  |  Height:  |  Size: 213 B

After

Width:  |  Height:  |  Size: 213 B

View File

Before

Width:  |  Height:  |  Size: 281 B

After

Width:  |  Height:  |  Size: 281 B

View File

Before

Width:  |  Height:  |  Size: 294 B

After

Width:  |  Height:  |  Size: 294 B

View File

Before

Width:  |  Height:  |  Size: 308 B

After

Width:  |  Height:  |  Size: 308 B

View File

Before

Width:  |  Height:  |  Size: 347 B

After

Width:  |  Height:  |  Size: 347 B

View File

Before

Width:  |  Height:  |  Size: 349 B

After

Width:  |  Height:  |  Size: 349 B

View File

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

Before

Width:  |  Height:  |  Size: 896 B

After

Width:  |  Height:  |  Size: 896 B

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Some files were not shown because too many files have changed in this diff Show More