Compare commits

...

596 Commits

Author SHA1 Message Date
FossFanatic d83c6fe906 Merge pull request 'Dry Biome Rain Fixes' (#3472) from dry_biome_rain_fixes into master
Reviewed-on: MineClone2/MineClone2#3472
Reviewed-by: Nicu <kneekoo@noreply.git.minetest.land>
2023-02-25 08:27:38 +00:00
FossFanatic e7c6043f06 Merge pull request 'Mintest Fix' (#3477) from api_typo_fix into master
Reviewed-on: MineClone2/MineClone2#3477
Reviewed-by: Nicu <kneekoo@noreply.git.minetest.land>
2023-02-22 14:19:24 +00:00
FossFanatic 65b1fd163b Fix fatal typo
This typo caused the game to crash, instead of spitting out an error message as it was supposed to.
2023-02-22 13:05:18 +00:00
FossFanatic eff0a546e5 Merge pull request 'Add Biome Coloured Water' (#3461) from biome_colored_water into master
Reviewed-on: MineClone2/MineClone2#3461
Reviewed-by: Nicu <kneekoo@noreply.git.minetest.land>
2023-02-22 07:20:35 +00:00
FossFanatic 61ee14b1a6 Fix rain issues in dry biomes
This commit adds an extra check at the ABMs which prevent the rain from affecting dry biomes, even though there isn't supposed to any rain there.
2023-02-21 10:12:29 +00:00
FossFanatic 968f6ae963 Add the original palette back as an _alt version 2023-02-20 07:22:55 +00:00
FossFanatic 2e2bbf0b17 Make the water palette more diluted 2023-02-20 07:22:24 +00:00
FossFanatic 8060b02cbd Add extra check to guarantee no nil values 2023-02-19 07:49:09 +00:00
FossFanatic 693d40b6c4 Fix villages generating with incorrect water
This commit fixes an issue where villages would generate with water which wasn't of the correct biome.

The new function simply looks for water source nodes around the entire village and replaces any it finds with the same node, except with blank params so that the `on_construct` of the newly placed water source node gets called.
2023-02-18 13:51:31 +00:00
FossFanatic ecfbb1ae07 Fix waterlogged mangrove roots textures 2023-02-18 08:54:57 +00:00
FossFanatic 14e630a1e2 Fix cauldron water textures 2023-02-18 08:53:36 +00:00
FossFanatic 62afbb4509 Remove reference to removed texture 2023-02-18 08:42:21 +00:00
FossFanatic f02764bc08 Remove now unused river water source texture 2023-02-18 08:32:00 +00:00
FossFanatic aa1a928898 Remove now unused flowing river water texture 2023-02-18 08:31:36 +00:00
FossFanatic 45952a6fd6 Add greyscale water textures & water palette 2023-02-18 08:30:44 +00:00
FossFanatic 33bbeb1a4d Improve river water 2023-02-18 08:27:22 +00:00
FossFanatic d3253ecf4f Change small part of buckets code 2023-02-18 08:25:47 +00:00
FossFanatic 0abda8ff20 Add new function for water nodes 2023-02-18 08:25:08 +00:00
FossFanatic 9bb3d8311b Append stuff to the new function 2023-02-18 08:24:12 +00:00
FossFanatic 686bb38546 Add lbm and register_on_generated for water 2023-02-18 08:23:40 +00:00
FossFanatic c4f6944a03 Add water palette indexes and waterfog to the code 2023-02-18 08:22:56 +00:00
FossFanatic c1647a5cce Improve underwater sky colour code 2023-02-18 08:22:04 +00:00
FossFanatic 624c853cb3 Improve water 2023-02-18 08:21:24 +00:00
ancientmarinerdev e8641c3c20 Merge pull request 'Fix custom spawners spawning mobs regardless of light level' (#3421) from GuyLiner/MineClone2:fix-spawner into master
Reviewed-on: MineClone2/MineClone2#3421
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-17 22:43:59 +00:00
GuyLiner f39cec2442 Added slime_big to non_spawn_specific instead of creating an exception for them in spawning.lua 2023-02-16 20:48:30 -05:00
GuyLiner e99a46b52d Removed comment 2023-02-16 20:48:30 -05:00
GuyLiner cd1c8bd92e Refactored logic for getting light levels for mobs
Removed mob_light_table, simplied loop, changed return values and
fixed dimension priority error in loop. Slimes also don't have a
hardcoded exception for their light levels anymore, and instead
are apart of spawn specific.
2023-02-16 20:48:28 -05:00
GuyLiner 3830171347 Adjusted mob_light_lvl for changed return value 2023-02-16 19:43:50 -05:00
GuyLiner 48b16a23b6 If player in creative mode, don't drop experience from destroyed spawners 2023-02-16 19:43:50 -05:00
GuyLiner 0a9be4b79c Added light level parameters to the mobs_mcl.setup_spawner() function, fixing #221
There is now a call to mcl_mobs:mob_light_lvl that returns a table for the name of the mob that you pass to it that contains
the light levels for that mob.
2023-02-16 19:43:50 -05:00
GuyLiner 540319d948 Added non_spawn_dictionary and function for getting mob light levels
The non_spawn_dictionary will cover all mobs that don't spawn naturally, and holds the the minimum and maximum light values for each of them.
A function has also been created that will go through both the spawn_dictionary and the non_spawn_dictionary and determine which one
a mob exists in, with the execption of slimes which cannot spawn from a custom spawner at the moment.

Mobs who don't have light levels for the world that you are currently trying to set your custom spawner in will default to their overworld values
2023-02-16 19:43:50 -05:00
GuyLiner fbb2923a0b Added mcl_mobs:non_spawn_specific function for mobs that don't naturally spawn and for mobs that don't spawn in the overworld 2023-02-16 19:43:50 -05:00
ancientmarinerdev b2e0b9b08b Merge pull request 'Mob Step error handling' (#3452) from mobs_error_handling into master
Reviewed-on: MineClone2/MineClone2#3452
2023-02-16 23:34:07 +00:00
ancientmarinerdev 4d61e32021 Clean up error handling 2023-02-16 23:15:55 +00:00
ancientmarinerdev 7c602ce82c Tidy up error handling. 2023-02-16 23:15:55 +00:00
ancientmarinerdev ae92c51155 Adding error handling to the mob step function 2023-02-16 23:15:55 +00:00
ancientmarinerdev db7f4699eb Merge pull request 'Add Biome Coloured Foliage' (#3420) from biome_colored_foliage into master
Reviewed-on: MineClone2/MineClone2#3420
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-16 22:35:05 +00:00
ancientmarinerdev b23fc6d23d Merge branch 'master' into biome_colored_foliage 2023-02-16 22:14:40 +00:00
FossFanatic 68e6965dd0 Remove excessive functions and change the appropriate stuff 2023-02-16 18:09:39 +00:00
FossFanatic 7d642c9929 Remove the tab before the curly bracket 2023-02-16 17:25:21 +00:00
FossFanatic 406b27852b Improve the new function somewhat 2023-02-16 07:54:00 +00:00
ancientmarinerdev d00f183456 Merge pull request 'Prevent setting fire on top of water' (#3446) from emptyshore/MineClone2:3152-fire-water into master
Reviewed-on: MineClone2/MineClone2#3446
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-15 20:13:32 +00:00
emptyshore b121d0f804 Prevent placement of fire into nodes above water
This addresses the edge case where fire is set to the top of a non-water
block that represents water (such as kelp).

Note this is forbidding theoretically legitimate setups for fire over
water where fire is set to the side of a block diagonally from the
water.

Fire is still permitted next to water (so it can be set to the face of a
block diagonally from a water column).
2023-02-16 08:56:17 +13:00
FossFanatic 8f8385e4a1 Use metadata method to make player mangrove leaves 2023-02-15 18:29:56 +00:00
FossFanatic 17fc7a3256 Use metadata method to make player leaves 2023-02-15 18:29:18 +00:00
ancientmarinerdev c08153fa7f Merge pull request 'Texture-Rename-2' (#3456) from Texture-Rename-2 into master
Reviewed-on: MineClone2/MineClone2#3456
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-15 16:26:40 +00:00
ancientmarinerdev ba708010a2 Fix incorrect crimson texture issue 2023-02-15 16:23:08 +00:00
Michieal 6601ecf788 Basic signs texture replacement. 2023-02-15 14:52:00 +00:00
Michieal 660c85dddc Changed mcl_buckets' image use to be named properly. This fixes issue #3455 2023-02-15 14:52:00 +00:00
Michieal 2d0b4dd8f7 Finished mcl_crimson. 2023-02-15 14:52:00 +00:00
FossFanatic 10d9eb2980 Upload files to 'mods/MAPGEN/mcl_mapgen_core' 2023-02-15 12:23:58 +00:00
FossFanatic 3d9df5c797 Fix issue with vines in certain biomes
This commit removes some excessive checks which caused vines to not get a biome colour in certain biomes at certain rotations.
2023-02-15 12:20:15 +00:00
Michieal 8cc90b6714 Merge pull request 'Document hotfix release process' (#3453) from hotfix_process_document into master
Reviewed-on: MineClone2/MineClone2#3453
Reviewed-by: Michieal <michieal@noreply.git.minetest.land>
2023-02-15 08:02:37 +00:00
ancientmarinerdev db4ff13aeb Document hotfix release process 2023-02-15 00:30:01 +00:00
FossFanatic f919f73c24 Improve some code 2023-02-14 18:14:10 +00:00
FossFanatic 319beb91ce Improve vines code 2023-02-14 18:11:43 +00:00
FossFanatic bea9bbe212 Improve certain functions 2023-02-14 18:10:49 +00:00
FossFanatic 8fd40eaf46 Replace get_registered_biome_from_pos with get_palette_indexes_from_pos 2023-02-14 18:08:59 +00:00
FossFanatic fcaa2c4ce1 revert 55478f6953
revert Fix crash with mapgen v6
2023-02-14 14:22:03 +00:00
FossFanatic 55478f6953 Fix crash with mapgen v6 2023-02-14 14:01:14 +00:00
FossFanatic 57882ae56a Merge branch 'master' into biome_colored_foliage 2023-02-14 13:27:37 +00:00
FossFanatic fee4ccf096 Convert old player leaves into new system
This commit adds a couple of lines to the `mcl_mapgen_core:fix_foliage_palette_indexes"` LBM, which ensures that player leaves which were placed before this update get converted into the new player leaves.

I would have included mangrove leaves, but decided against it because of an issue where the `param2` of mangrove leaves was accidentally set to 1 (in the schematics?). This meant that if I included mangrove leaves, the LBM would have converted the natural leaves as well.

This would have made it very tedious to clean up the leaves after chopping down a mangrove tree, since these would not rot by themselves.
2023-02-14 11:20:00 +00:00
FossFanatic f653f47f26 Improve the new code somewhat 2023-02-14 08:36:49 +00:00
FossFanatic 7b7e213925 Fix mcl_util.get_registered_biome_from_pos(pos)
Adds something which was missing from the function.
2023-02-14 08:12:55 +00:00
ancientmarinerdev cf829b6481 Merge pull request 'Disable crafting white and blue dye from lily of the valley and cornflowers respectively' (#3449) from disable_lily_dye_craft into master
Reviewed-on: MineClone2/MineClone2#3449
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-14 02:46:10 +00:00
PrairieWind f62546a54f Comment out crafting white and blue dye from lily of the valley and cornflowers respectively 2023-02-13 19:37:04 -07:00
ancientmarinerdev 7b6d946d7b Merge pull request 'Campfire API' (#3437) from campfire_api into master
Reviewed-on: MineClone2/MineClone2#3437
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-14 02:35:34 +00:00
PrairieWind 1da272a941 Add campfires to the list of working item APIs 2023-02-14 02:25:50 +00:00
PrairieWind e3f14a3a99 Campfire API 2023-02-14 02:25:50 +00:00
ancientmarinerdev a9a61a034c Merge pull request 'Texture Conversion: Name Change Set 1 - Fixed Branch' (#3448) from fix_files_rename_branch into master
Reviewed-on: MineClone2/MineClone2#3448
2023-02-14 02:09:04 +00:00
ancientmarinerdev 6f98ba5118 Fix crimson mushroom naming issue 2023-02-14 02:00:19 +00:00
ancientmarinerdev f6f812257e Fix crimson name mismatch 2023-02-14 01:50:06 +00:00
Michieal f05e976d18 changed comment. 2023-02-14 01:50:05 +00:00
Michieal 5533ec7bac fix mobs losing their textures. 2023-02-14 01:50:05 +00:00
Michieal b66e2a117f fix json reading error. 2023-02-14 01:50:05 +00:00
Michieal 09ef5fd96b optipng the textures. 2023-02-14 01:50:05 +00:00
Michieal 1e61fc3069 Fixed "mcl_crimson_mcl_crimson" issue.
Fixed colors.json stupidity.
2023-02-14 01:50:05 +00:00
Michieal ef30646788 Changed mcl_crimson - finished. 2023-02-14 01:50:02 +00:00
Michieal 70e4aaa3a7 Changed mcl_crimson part 1. 2023-02-14 01:48:11 +00:00
Michieal 8bfa55fa7a Changed Salmon, Glow Squid, Cod, Cartography Table, Awards_Axolotl, Armor_Stand_Item. Glow-Ink_sac. 2023-02-14 01:43:16 +00:00
Michieal 2ba6a60e55 Deleted unused _alt textures from mcl_crimson. 2023-02-14 01:43:16 +00:00
FossFanatic aeddb7675f Don't run LBMs at every load
This commit makes it so the LBMs don't run at every load.

This commit also adds some new `minetest.register_on_generated()` code, which should ensure that any newly generated mapblocks have the correct foliage colours.
2023-02-13 18:50:26 +00:00
FossFanatic 2ccfd89379 Add nil checks 2023-02-13 15:49:19 +00:00
FossFanatic 3a24903a01 Add nil check 2023-02-13 15:46:45 +00:00
FossFanatic abdd5e11c0 Shorten code slightly 2023-02-13 15:46:08 +00:00
FossFanatic e17fab385b Add nil checks 2023-02-13 15:44:23 +00:00
FossFanatic 17cae6896e Add back the logical code?
My gut feeling tells me that it is somehow a bad idea to have removed this.
2023-02-13 11:17:51 +00:00
FossFanatic 1c84bc6572 Put all affected grass blocks in a local
This commit puts all nodes which make use of the grass palette in a local, to make for less messy code.
2023-02-13 10:33:47 +00:00
FossFanatic 4d29fab932 Improve some trees code 2023-02-13 10:22:28 +00:00
FossFanatic a2087b19a5 Delete rogue file 2023-02-13 10:20:48 +00:00
PrairieWind 84119d8f34 Merge pull request 'Add Lily of the Valley and Cornflower Flowers' (#3438) from lily_of_the_valley into master
Reviewed-on: MineClone2/MineClone2#3438
Reviewed-by: Nicu <kneekoo@noreply.git.minetest.land>
2023-02-13 01:21:56 +00:00
PrairieWind 5da6c25ccf Fix cornflower biomes and change seed values for cornflowers and lilies of the valley 2023-02-12 23:29:02 +00:00
PrairieWind b79f74c390 Update Translation Template for flowers 2023-02-12 23:29:02 +00:00
PrairieWind 06f47a0756 Add Cornflowers
Evidently I didn't include the lily texture in the lily of the valley commit, so it is in this one. Again, lily of the valley texture by Nicu
2023-02-12 23:29:02 +00:00
PrairieWind ff79af26e4 Add Lily of the Valley Flower
Awesome Lily Texture by Nicu
2023-02-12 23:29:02 +00:00
ancientmarinerdev de56c72e15 Merge pull request 'Change kelp to use ABMs to solve performance issues' (#3417) from i_need_professional_kelp into master
Reviewed-on: MineClone2/MineClone2#3417
2023-02-12 23:13:25 +00:00
ancientmarinerdev e3c8d995b5 Finish clean up# 2023-02-12 22:48:20 +00:00
ancientmarinerdev b8b45210e9 Clean up and remove old code 2023-02-12 22:48:20 +00:00
ancientmarinerdev a1f10205f6 Init age on plant so not all kelp grow to top of ocean 2023-02-12 22:48:20 +00:00
ancientmarinerdev 6f7505b6c6 Change kelp to use ABMs to solve performance issues 2023-02-12 22:48:20 +00:00
PrairieWind e323ab6e88 Merge pull request 'Make sea pickles smelt into lime dye' (#3436) from sea_pickle_dye into master
Reviewed-on: MineClone2/MineClone2#3436
Reviewed-by: Nicu <kneekoo@noreply.git.minetest.land>
2023-02-12 16:23:55 +00:00
FossFanatic c88f0047c1 Merge branch 'master' into biome_colored_foliage 2023-02-12 08:44:29 +00:00
FossFanatic 0400d9a2a5 Even further improvements to some foliage code 2023-02-12 08:28:21 +00:00
FossFanatic 3590ff6dfb Improve some LBM code 2023-02-12 08:23:19 +00:00
FossFanatic d1ceacf7ba Improve some vines code 2023-02-12 08:22:07 +00:00
FossFanatic a70a6ef13d Improve some foliage code 2023-02-12 08:21:14 +00:00
FossFanatic b4e84dadb0 Add new function
Adds the `get_registered_biome_from_pos` function, which does what the name says.
2023-02-12 07:57:04 +00:00
PrairieWind 194ff53400 Make sea pickles smelt into lime dye 2023-02-12 01:09:25 +00:00
ancientmarinerdev e7e0b082c4 Merge pull request 'Footer Annoyance Fix' (#3431) from footer_annoyance_fix into master
Reviewed-on: MineClone2/MineClone2#3431
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-12 01:00:45 +00:00
FossFanatic 18b888da8b Remove the thing above the "o" in "version" 2023-02-12 00:06:01 +00:00
ancientmarinerdev 15a15158b8 Merge pull request 'Pathfinding optimisations and villager has earlier bed time' (#3410) from villager_tweaks into master
Reviewed-on: MineClone2/MineClone2#3410
2023-02-11 10:48:36 +00:00
ancientmarinerdev 9445e10834 Pathfinding optimisations and villager has earlier bed time 2023-02-11 10:36:56 +00:00
ancientmarinerdev 35a75491f4 Merge pull request 'Fix hungry sheep and hyrdophobic passive mobs' (#3435) from drowning_and_hungry_mobs into master
Reviewed-on: MineClone2/MineClone2#3435
2023-02-11 10:26:19 +00:00
FossFanatic 81dbdaab94 Adjust palette foliage check
The excessive 128 blocks high check has been changed to now check only up to 30 blocks, since the tallest 2x2 jungle tree I seemed to get was only 29 blocks tall.

I also discovered that the search area wasn't wide enough, so sometimes the most outer leaves avoided the check. I also adjusted that.
2023-02-11 07:53:12 +00:00
ancientmarinerdev 2fd7f8c69f Fix hungry sheep and hyrdophobic passive mobs 2023-02-11 00:37:16 +00:00
ancientmarinerdev 6a34a30941 Merge pull request 'Mob spawning improvements and balancing' (#3356) from mob_cap_fixes into master
Reviewed-on: MineClone2/MineClone2#3356
2023-02-10 19:09:06 +00:00
ancientmarinerdev d4c2802afb Implement review/testing feedback 2023-02-10 19:01:29 +00:00
ancientmarinerdev b2dbf48e92 Default setting fix 2023-02-10 19:01:29 +00:00
ancientmarinerdev bf50a17f2e Limit spawning of mobs outside y axis as well 2023-02-10 19:01:29 +00:00
ancientmarinerdev b817c079ba Improve balancing for early game 2023-02-10 19:01:29 +00:00
ancientmarinerdev cfa276f722 Add settings for percentage of hostile and peaceful groups spawned 2023-02-10 19:01:29 +00:00
ancientmarinerdev 86b1d8bc3e Add world gen limits to spawning to avoid things spawning past the world gen limits 2023-02-10 19:01:29 +00:00
ancientmarinerdev 9c2f43a242 Limit peaceful spawning and add configurable option 2023-02-10 19:01:29 +00:00
ancientmarinerdev 044a91e831 Change spawn cap groups to spawn_type to give water it's own spawn cap. 2023-02-10 19:01:29 +00:00
ancientmarinerdev 106979e64a Clean up 2023-02-10 19:01:29 +00:00
ancientmarinerdev 4482068211 Nerf group spawning until group spawn is based on pack size, not per spawn attempt 2023-02-10 19:01:29 +00:00
ancientmarinerdev 1dc7cab6be Add logging 2023-02-10 19:01:29 +00:00
ancientmarinerdev 634379dfe9 Retry if failing to find spawn position 2023-02-10 19:01:29 +00:00
ancientmarinerdev c2ac33ac61 Mobs now can spawn in multiple positions around you per spawning cycle 2023-02-10 19:01:29 +00:00
ancientmarinerdev b5c0830060 Restructure code and tidy 2023-02-10 19:01:29 +00:00
ancientmarinerdev c43c723e08 Clean logging etc. 2023-02-10 19:01:29 +00:00
ancientmarinerdev bd3a4ff0df Clean up 2023-02-10 19:01:28 +00:00
ancientmarinerdev 0267ad2f31 Decrease change of groups spawning for peacefuls. Refresh total mobs check on spawn. 2023-02-10 19:01:28 +00:00
ancientmarinerdev a2f9ea81cc Fix mobs debug crash 2023-02-10 19:01:28 +00:00
ancientmarinerdev 7c7f4b930c Move cap check out of spawn checks and reimplement close cap check 2023-02-10 19:01:28 +00:00
ancientmarinerdev 60529d3d5d Add in constants for spawn zones 2023-02-10 19:01:28 +00:00
ancientmarinerdev 6ea4b43249 Limit group spawn to available cap space. Total mobs check once per spawn cycle. 2023-02-10 19:01:28 +00:00
FossFanatic 1fb300ef18 Fix leaves not dropping
Due to some renaming, leaves no longer dropped from any of the `mcl_core` trees.

This has now been fixed.
2023-02-10 18:40:35 +00:00
FossFanatic b789845f62 Indentation improvements 2023-02-10 15:19:02 +00:00
FossFanatic f368fb3e43 Indentation improvements 2023-02-10 15:17:46 +00:00
FossFanatic d63ecac7cb Indentation improvements 2023-02-10 15:14:53 +00:00
FossFanatic 7fbc84971e Remove useless function
This commit removes an useless function which wasn't really needed.
2023-02-10 15:12:37 +00:00
FossFanatic 953044cc4b Mangrove propagules also grab biome colour on growth 2023-02-10 11:33:58 +00:00
FossFanatic 6744967d02 Make placed mangrove leaves always become player leaves
The same thing as with the `mcl_core` leaves.
2023-02-10 10:41:43 +00:00
FossFanatic fdb2333493 Make placed leaves always become player leaves
Any players which still have leaves in their inventory from before this update would have had those leaves rot if someone were to break any log withing 6 nodes of the leaves if they were placed. This commit adds an `after_place_node` callback which makes sure that any leaves placed by the player, become non-rotting player leaves.
2023-02-10 10:39:43 +00:00
FossFanatic 1defd03408 Make the function work self grown saplings
Saplings now also get the biome's foliage colour when grown by themselves.
2023-02-10 10:06:55 +00:00
FossFanatic d163faeb42 Use more fitting names for the newly added function
Basically renaming anything related to leaves in the new function to something more broad such as foliage, so vines aren't indirectly considered leaves. An aesthetic change, basically.
2023-02-10 08:08:28 +00:00
FossFanatic 197d3ae00b Make sapling foliage grab biome colour 2023-02-10 08:04:13 +00:00
ancientmarinerdev 6b8226dae3 Merge pull request 'Bamboo Piston Fix.' (#3424) from Bamboo_Piston_fix into master
Reviewed-on: MineClone2/MineClone2#3424
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-10 03:49:40 +00:00
Michieal f6b77aa458 reformated code. 2023-02-10 03:42:34 +00:00
Michieal 1558c852d8 Undo mesecon.register_mvps_dropper() and use abms until more research can be done. 2023-02-10 03:42:34 +00:00
Michieal 6c0525f00e Fix merge / rebase crossing massacre.
[Michieal] 83bc60722d Begin: make bamboo dig-able by Pistons for Farm Creation.

[Michieal] 449cbdb330 Make Bamboo & Bamboo items not sticky for pistons.

[Michieal] a44566f863 hijack the ABM to check for orphaned bamboo nodes.

[Michieal] 5dff9e1994 Fixed the ABM situation so that now bamboo "breaks" when pushed by pistons.
Probably not the most elegant, but hey. It works.

[Michieal] 76507025d9 Cleaned up the global function to match the current ABM.

[Michieal] dfa849e19a Merge branch 'master' into Bamboo-Piston-Dig

[Michieal] a5bdc8a166 fix bamboo mosaic recipe.

[Michieal] 14383d6c6f update mod.conf to use optional depends mesecons_mvps

[Michieal] f81d530912 Update init.lua to register dropper callback.
2023-02-10 03:42:34 +00:00
ancientmarinerdev 3c13ce1d6b Merge pull request 'Fix "mcl_core:dirt_with_dry_grass" to be "mcl_core:dirt_with_grass" with the savanna color index.' (#3408) from fix_dirt_dry_grass into master
Reviewed-on: MineClone2/MineClone2#3408
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-10 02:50:27 +00:00
ancientmarinerdev c1d5d4280e Merge pull request 'Fixed weather not clearing after sleep' (#3414) from rain_bed_skip into master
Reviewed-on: MineClone2/MineClone2#3414
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-10 02:00:23 +00:00
PrairieWind 70fb4f8a0d Fixed weather not clearing after sleep
Isnt as clean as it should be because making it clean made some very funky results
2023-02-10 01:51:28 +00:00
ancientmarinerdev 620a0af483 Merge pull request 'Fix damage desyncing entity from chest node, making it invisible' (#3385) from emptyshore/MineClone2:fix-lightning-chests into master
Reviewed-on: MineClone2/MineClone2#3385
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-10 00:38:55 +00:00
ancientmarinerdev 428b1b2c12 Merge pull request 'remove "mushroom" from the names of crimson fungus and warped fungus' (#3406) from SmokeyDope/MineClone2:change_fungus_name into master
Reviewed-on: MineClone2/MineClone2#3406
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2023-02-09 18:22:04 +00:00
FossFanatic 4ddab8bdf1 Remove the ABMs
There are likely better ways to fix any palettes that the LBMs missed.
2023-02-09 16:16:13 +00:00
FossFanatic bfe4b2fd31 Merge branch 'master' into biome_colored_foliage 2023-02-09 15:24:20 +00:00
FossFanatic cc8675602a Optimised foliage 2 2023-02-09 13:02:02 +00:00
FossFanatic aff1d5f667 Optimised foliage 1 2023-02-09 13:01:23 +00:00
FossFanatic 169019096e Change the waterlily code
Waterlilies now use a brownish grey texture with a coded hex colour.
2023-02-09 09:46:18 +00:00
FossFanatic 049db13b28 Add new waterlily texture 2023-02-09 09:40:17 +00:00
SmokeyDope dfbee5cb93 Add "mushroom" to the warped fungus and crimson fungus item descriptions for creative search 2023-02-09 03:22:17 +00:00
SmokeyDope 378af531a9 remove "mushroom" from the names of crimson fungus and warped fungus 2023-02-09 03:22:17 +00:00
ancientmarinerdev 088cda4f1c Merge pull request 'Make minecart rails unable to be broken with water & lava' (#3415) from minecart_track_water_breaking_3 into master
Reviewed-on: MineClone2/MineClone2#3415
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-09 02:03:47 +00:00
SmokeyDope 71671f8b5f Make minecart rails unable to be broken with lava 2023-02-09 01:53:52 +00:00
SmokeyDope c4d60e50cc Make minecart rails unable to be broken with water 2023-02-09 01:53:52 +00:00
ancientmarinerdev 9421c7ca6b Merge pull request 'Make The Footer Correct' (#3423) from beta_footer into master
Reviewed-on: MineClone2/MineClone2#3423
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-09 01:22:58 +00:00
FossFanatic d9982e20d2 Make the footer more with the times 2023-02-08 19:57:00 +00:00
ancientmarinerdev 30bb1ab075 Merge pull request 'Mobs fix crash and not drop XP when dying by fire from sunlight' (#3398) from mob_death_xp_drop into master
Reviewed-on: MineClone2/MineClone2#3398
2023-02-08 19:44:12 +00:00
ancientmarinerdev b834e790a7 Fix game crashes 2023-02-08 19:34:04 +00:00
ancientmarinerdev 39d4434df1 Reorder on_step calls 2023-02-08 19:34:04 +00:00
ancientmarinerdev 4b9482cb09 Mobs should not drop XP when dying by fire from sunlight 2023-02-08 19:34:04 +00:00
FossFanatic 4757e62968 Add vine texture I forgot
I forgot to add this one with the batch.
2023-02-08 16:20:42 +00:00
FossFanatic b95ebb3fca Add LBMs, ABMs, and more
This commit adds 1 new LBM (for foliage) and 2 new ABMs (one for foliage, and one for grass).

This also adds a new generator so any new maps created will have biome coloured leaves with a faster method. (Vines are excluded from this generator since I don't know yet how to get those to work with this.)
2023-02-08 16:17:33 +00:00
FossFanatic 07f332f0cd Add foliage palette indexes
This commit adds foliage palette indexes to every biome, this makes it possible for foliage to use biome colouring.
2023-02-08 16:15:04 +00:00
FossFanatic f4e8088e60 Improve mangrove leaves
This commit makes it so mangrove leaves also no longer use `param2` to see if they rot or not. The leaves also use the biome colours now.
2023-02-08 16:13:13 +00:00
FossFanatic 198375a18e Change stuff in mcl_core
Simply put, this commit changes some code so that leaves don't use `param2` to see if they rot or not, and will now use the biome colours.

This commit also makes it so vines do the same (use biome colours).
2023-02-08 16:11:38 +00:00
FossFanatic c26cddeafc Add batch 2 of the new leaf textures + foliage palette 2023-02-08 16:06:08 +00:00
FossFanatic 714d159072 Add batch 1 of the new leaf textures 2023-02-08 16:05:34 +00:00
emptyshore bdc82b76b5 Respect immortal armor group, ensuring objects are not dealt damage
Context: some objects such as chest, frame or sign entities are set to
be immortal, because they are tied to a node and should not be removed
on their own.

However since immortality wasn't respected, it would lead to odd desync
issues between nodes and accompanying entities. An example is a chest
that becomes invisible when struck by lightning or anvil.
2023-02-08 15:59:36 +13:00
ancientmarinerdev 6f67f0e095 Merge pull request 'Updated credits and contributing' (#3413) from translation_credit_anarquimico into master
Reviewed-on: MineClone2/MineClone2#3413
2023-02-07 17:15:11 +00:00
ancientmarinerdev d5687716a0 Updated credits and contributing 2023-02-07 17:12:56 +00:00
ancientmarinerdev 5f0d91cf26 Merge pull request 'anarquimico_translations_1' (#3412) from anarquimico_translations_1 into master
Reviewed-on: MineClone2/MineClone2#3412
2023-02-07 16:53:53 +00:00
anarquimico e2de5908c7 5th ITEMS batch 2023-02-07 16:39:24 +00:00
anarquimico 439c879508 4th batch of ITEMs translation 2023-02-07 16:39:23 +00:00
anarquimico 67977b0d26 Third batch of ITEMS translation 2023-02-07 16:39:23 +00:00
anarquimico ed8c3e7d26 Second batch of ITEMS translated 2023-02-07 16:39:22 +00:00
anarquimico 7add59992f First batch of ITEMS translation 2023-02-07 16:39:22 +00:00
ancientmarinerdev d72a674097 Merge pull request 'fix_copper_blocks' (#3390) from fix_copper_blocks into master
Reviewed-on: MineClone2/MineClone2#3390
Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-06 23:16:11 +00:00
Michieal ef4e4b1b7b Merge branch 'master' into fix_copper_blocks 2023-02-06 16:58:38 -05:00
Michieal 0e000e6491 Merge branch 'master' into fix_dirt_dry_grass 2023-02-06 16:55:14 -05:00
Michieal ec7a97ba3e Made LBM run at every load, so that it catches anything missed from previous passes. 2023-02-06 16:54:23 -05:00
PrairieWind 290680fb3d Merge pull request 'Add compostability to nether plants' (#3404) from SmokeyDope/MineClone2:nether_plants_composting into master
Reviewed-on: MineClone2/MineClone2#3404
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2023-02-06 20:20:42 +00:00
SmokeyDope 48eb934d64 Add compostability to warped wart blocks and shroomlight 2023-02-06 13:08:28 -07:00
SmokeyDope 88cf3a5900 Add compostability to nether sprouts 2023-02-06 13:08:27 -07:00
SmokeyDope 1401652015 Add compostability to warped roots and crimson roots 2023-02-06 13:08:26 -07:00
SmokeyDope cac6e15736 Add compostability to twisting vines and weeping vines 2023-02-06 13:08:24 -07:00
SmokeyDope 156d096a78 Add compostability to warped fungus and crimson fungus 2023-02-06 13:08:23 -07:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 db3483a6cb Merge pull request 'Fix mapgen issue for mcl5 to mcl2 conversion' (#3349) from fix_villages_crash_mcl5 into master
Reviewed-on: MineClone2/MineClone2#3349
Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
2023-02-06 19:25:49 +00:00
ancientmarinerdev ace6f8db43 Ensure index for heightmap entry is within bounds 2023-02-06 13:16:15 -06:00
ancientmarinerdev 9aeafe6053 Fix mapgen issue for mcl5 to mcl2 conversion 2023-02-06 13:16:15 -06:00
Michieal de00b7228e Fix "mcl_core:dirt_with_dry_grass" to be "mcl_core:dirt_with_grass" with the savanna color index. 2023-02-05 21:17:53 -05:00
ancientmarinerdev d454697953 Merge pull request 'More Sky Improvements' (#3391) from more_sky_improvements into master
Reviewed-on: MineClone2/MineClone2#3391
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-06 01:48:38 +00:00
FossFanatic ce2011218c Make the default sunrisebg invisible 2023-02-06 01:42:10 +00:00
FossFanatic ccef2d1147 More sky improvements 2023-02-06 01:40:25 +00:00
ancientmarinerdev 5fbec2f6b5 Merge pull request 'Added conditional based on existing fire damage conditional that will apply fire damage to a' (#3405) from magma_damage_guy into master
Reviewed-on: MineClone2/MineClone2#3405
2023-02-06 00:22:48 +00:00
GuyLiner 4d922d9edf Added conditional based on existing fire damage conditional that will apply fire damage to a
mob standing on top of a magma node that belongs to the "fire" group. The magma node
has also been added to the fire group, making it so that standing on the node will
do damage to the mob.

In official Minecraft, magma blocks just do fire damage without the fire animation.
Source: https://minecraft.fandom.com/wiki/Magma_Block
2023-02-06 00:10:52 +00:00
Michieal 46ca650ea4 further optimize and reformat mcl_honey's init.lua 2023-02-04 16:31:18 -05:00
Michieal c4e4a8e4d2 Move Waxing function to MCL_Honey. Remove commented code. 2023-02-04 03:31:11 -05:00
Michieal 08610296fc Merge branch 'master' into fix_copper_blocks 2023-02-04 03:30:20 -05:00
ancientmarinerdev 7d46fa3362 Merge pull request 'texture-consolidation' (#3380) from texture-consolidation into master
Reviewed-on: MineClone2/MineClone2#3380
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-04 03:23:13 +00:00
ancientmarinerdev 58a08ea697 Merge pull request 'fix incorrect digtypes and missing sounds for some nether blocks' (#3351) from SmokeyDope/MineClone2:master into master
Reviewed-on: MineClone2/MineClone2#3351
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-04 00:27:48 +00:00
Michieal 50effaa807 Made Requested changes from Pull Request. 2023-02-03 14:09:16 -05:00
SmokeyDope 08df1fe02f Update overworld vine breaking logic with vector.offset 2023-02-03 00:50:25 +00:00
SmokeyDope bc4d9211cb Update nether vine breaking logic with vector.offset 2023-02-03 00:43:17 +00:00
SmokeyDope cf05771e30 remove unnecessary blank line 2023-02-02 23:12:09 +00:00
SmokeyDope 16a6dcb66c Completely remove selection box for warped fungus
Recommended by Michael
2023-02-02 22:45:06 +00:00
SmokeyDope 89eb458df7 Fix up indentation for warped and crimson wart block sounds part 2 2023-02-02 22:42:44 +00:00
SmokeyDope eae1ee7cee Fix indentation for shapeless type @ netherite ingot 2023-02-02 22:39:37 +00:00
SmokeyDope 27f5a94c6a Fix up indentation for warped and crimson wart block sounds 2023-02-02 22:36:33 +00:00
SmokeyDope b4719599b5 Fix up indentation 2023-02-02 22:30:15 +00:00
SmokeyDope 659f11bf6f Fixed up indentation and removed excess blank lines 2023-02-02 22:08:37 +00:00
SmokeyDope 88a7a8afab Removed handy, axey, swordy, from nether vines & removed useless comments 2023-02-02 21:37:23 +00:00
ancientmarinerdev cdc922d4ac Merge pull request 'Make fletcher buy sticks' (#3383) from mrminer/MineClone2-Fletcher-Fix:master into master
Reviewed-on: MineClone2/MineClone2#3383
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-02 15:37:35 +00:00
ancientmarinerdev 060732cd66 Merge pull request 'Adjust amethyst bud growth' (#3374) from Amethyst_Bud_Growth into master
Reviewed-on: MineClone2/MineClone2#3374
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-02 15:26:20 +00:00
Michieal ad43fbd237 Adjust amethyst bud growth speed. 2023-02-02 15:25:33 +00:00
Michieal 618313f0af Merge branch 'master' into fix_copper_blocks 2023-02-01 23:51:29 -05:00
ancientmarinerdev 31fb7faf16 Merge pull request 'feat: Rain particles move straight down, increase acceleration slightly' (#3369) from atomdmac/MineClone2:adjust-rain-velocity into master
Reviewed-on: MineClone2/MineClone2#3369
Reviewed-by: FossFanatic <fossfanatic@noreply.git.minetest.land>
Reviewed-by: epCode <epcode@noreply.git.minetest.land>
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-02 04:50:00 +00:00
Michieal a3bc3fd9b9 Removed old commented code to prevent accidental re-enabling, and put the todo into the correct spot. 2023-02-01 23:49:04 -05:00
Michieal c370f1884b Fixed the unwax copper blocks variants to be able to properly remove oxidization levels properly.
MCL_COPPER Blocks off all types (not stairs and slabs) now function properly.
2023-02-01 23:34:02 -05:00
Michieal b771f314fe Removed "scraping_copper_block" function.
Fixed the wax copper blocks variants to have the wax removed.
2023-02-01 23:24:59 -05:00
ancientmarinerdev f6a5004eab Merge pull request 'Fix wither crash on certain version of Lua.' (#3365) from fix_wither_head_crash into master
Reviewed-on: MineClone2/MineClone2#3365
Reviewed-by: Nicu <kneekoo@noreply.git.minetest.land>
2023-02-02 02:23:27 +00:00
ancientmarinerdev 7daa79a3f8 Fix wither crash on certain version of Lua. 2023-02-02 02:22:21 +00:00
Michieal 4b0b3217e2 added in TODO 2023-02-01 19:55:23 -05:00
ancientmarinerdev e363435134 Merge pull request 'mcl_starting_chest' (#3373) from mcl_starting_chest into master
Reviewed-on: MineClone2/MineClone2#3373
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-01 23:54:44 +00:00
Michieal 5b1c7f2d3a Everything *BUT* scraping works properly. 2023-02-01 18:39:13 -05:00
ancientmarinerdev 63ace64cae Merge pull request 'Underwater Darkness HUD Removal' (#3367) from water_darkness_hud_removal into master
Reviewed-on: MineClone2/MineClone2#3367
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-01 22:52:08 +00:00
FossFanatic 0c0845c1bd Change the underwater detection code a bit 2023-02-01 22:50:50 +00:00
FossFanatic 24b1078b61 Make the post effect alpha the same between water source and flow 2023-02-01 22:50:50 +00:00
FossFanatic 3546d04aaa Remove water HUD code 2023-02-01 22:50:50 +00:00
FossFanatic 1abd226e07 Remove water HUD 2023-02-01 22:50:50 +00:00
ancientmarinerdev f4b1116e21 Merge pull request 'Fix V6 & Singlenode Crash' (#3386) from v6_crash_fix into master
Reviewed-on: MineClone2/MineClone2#3386
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-01 22:37:02 +00:00
FossFanatic cbb3260471 Make the palette fix LBM not run on v6 & singlenode
This fixes a crash when loading a world that doesn't have any biomes and the LBM tries to give the grassy nodes a biome colour.
2023-02-01 22:35:13 +00:00
ancientmarinerdev 855659a2a1 Merge pull request 'Fix ender chest crash + remove map hand reference' (#3387) from ender_chest into master
Reviewed-on: MineClone2/MineClone2#3387
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-02-01 22:09:26 +00:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 8793ed211e Fix ender chest crash + remove map hand reference 2023-02-01 09:56:12 -06:00
mrminer 01f814267e Update 'mods/ENTITIES/mobs_mc/villager.lua' 2023-01-31 21:14:23 +00:00
mrminer 8f4c69084d Make fletcher buy sticks 2023-01-31 21:12:01 +00:00
Michieal 425cf53194 fix minor bug. 2023-01-30 23:57:50 -05:00
Michieal d04f162d8f Initialize Global variable. 2023-01-30 23:53:40 -05:00
Michieal 7f84922403 fix missing skin file 2023-01-30 23:14:44 -05:00
Michieal 025f97187a Adjust for mcl_skins requirements. 2023-01-30 23:07:23 -05:00
Michieal 06effcd786 Merge branch 'master' into texture-consolidation 2023-01-30 22:57:38 -05:00
Michieal 6265148727 Move textures all into one centralized directory. 2023-01-30 22:55:53 -05:00
ancientmarinerdev 2ad60b06ea Merge pull request 'Set freeze and warning when mobs too close to boundary of world' (#3363) from fix_mob_past_mapgen_limits into master
Reviewed-on: MineClone2/MineClone2#3363
Reviewed-by: Michieal <michieal@noreply.git.minetest.land>
2023-01-31 02:29:02 +00:00
ancientmarinerdev 245ce99223 Using mcl_vars 2023-01-31 02:28:04 +00:00
ancientmarinerdev 1f107ec0c7 Tidy 2023-01-31 02:28:04 +00:00
ancientmarinerdev c209537cfe Make it a bit less chatty for logging 2023-01-31 02:28:04 +00:00
ancientmarinerdev d583ccb986 Oooops, wrong number 2023-01-31 02:28:04 +00:00
ancientmarinerdev 7d803e174c Set freeze and warning when mobs too close to boundary of world 2023-01-31 02:28:04 +00:00
Michieal 319602508d Make copper block nodes use on_place. 2023-01-30 20:13:32 -05:00
Michieal 8c703f1352 Refactored out "varient" in foavor of "variant".
Set up a basic "on_place" function.

Made _mcl_copper_waxed_variant and _mcl_copper_unwaxed_variant node parameters so that the waxing_copper_block and scraping_copper_block functions can be made generic.

Adjusted said functions to look first for the variants, and added in protection checks for the blocks
2023-01-30 18:27:53 -05:00
Michieal 95b1429922 Add mcl_util to mcl_copper's mod.conf file. 2023-01-30 16:01:09 -05:00
SmokeyDope 32b5b435c5 Make weeping vines and twisting vines break instantly
Partial revert of previous commit, they should break instantly
2023-01-30 17:09:50 +00:00
SmokeyDope a3fe41128f Make netherite ingot crafting shapeless 2023-01-30 05:38:33 +00:00
SmokeyDope 1a495dd63a Make ancient debris smeltable in a blast furnace 2023-01-30 05:03:50 +00:00
Michieal 29597af738 Fixed noted errors from Pull Request. 2023-01-29 13:12:24 -05:00
Michieal f3e840a0ff Merge branch 'master' into mcl_starting_chest 2023-01-29 13:02:03 -05:00
Adam Macumber 7dd0293616 feat: Rain particles move straight down, increase acceleration slightly 2023-01-28 11:04:58 -05:00
ancientmarinerdev 63360bcab2 Merge pull request 'Nether & End Biome Sky/Fog Colours' (#3342) from biome_skycolor_otherworlds into master
Reviewed-on: MineClone2/MineClone2#3342
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-01-26 22:49:54 +00:00
ancientmarinerdev 0b1881d1d4 Merge pull request 'Slower creative digging' (#3284) from dig_speed into master
Reviewed-on: MineClone2/MineClone2#3284
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-01-26 22:43:38 +00:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 8cf6269dda Fix mesh hand unknown item bug + fix fast digging disabled for simple skins 2023-01-25 12:13:53 -06:00
SmokeyDope 1f09c0a128 Make weeping vines and twisting vines break the same speed as regular vines 2023-01-25 05:47:41 +00:00
SmokeyDope fb8060c366 lower hardness of warped wart block and shroomlight block to match nether wart block 2023-01-25 04:06:59 +00:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 da7320b14c Add survival tool capabilites to all items 2023-01-24 11:38:58 -06:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 66ff8ab8a9 Add a creative dig speed setting 2023-01-24 11:16:28 -06:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 a1cc24f8d3 Slowing creative digging 2023-01-24 11:16:28 -06:00
SmokeyDope 6f22d7daa4 Add node breaking logic to twisting vines and weeping vines
breaking twisting vines will break the ones above them, breaking weeping vines breaks the ones below them
2023-01-24 17:15:22 +00:00
SmokeyDope dc3eedac5f Add breaking sounds for warped fungus, nether sprouts, warped roots, crimson fungus, crimson roots 2023-01-24 16:24:35 +00:00
FossFanatic f3bed9f599 Move locals upward & uncomment some things (again) 2023-01-24 07:27:36 +00:00
FossFanatic f84bdbd777 Merge branch 'master' into biome_skycolor_otherworlds 2023-01-24 07:22:04 +00:00
FossFanatic 7712c45c4e Fix conflict 2023-01-24 07:21:48 +00:00
ancientmarinerdev 02ee8b757d Merge pull request 'Biome Colour Palette Fixes' (#3203) from simplified_palette_index into master
Reviewed-on: MineClone2/MineClone2#3203
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-01-24 00:21:12 +00:00
SmokeyDope 39b6e41a62 revert hitbox size for warped fungus 2023-01-23 22:34:22 +00:00
SmokeyDope ef1f7b8e20 make blackstone, basalt, and nether gold ore mineable with a wooden pickaxe
Fixes #3287
2023-01-23 22:17:12 +00:00
PrairieWind 5c32d1c106 Merge pull request 'Fix crash when leaves don't have a registered orphan but try to rot' (#3346) from rubber_crash_fix into master
Reviewed-on: MineClone2/MineClone2#3346
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2023-01-23 22:02:24 +00:00
SmokeyDope 70b56d7126 Fix hitbox size for Warped Fungus 2023-01-23 21:30:32 +00:00
ancientmarinerdev c4ea504123 Fix crash when leaves don't have a registered orphan but try to rot 2023-01-23 20:58:05 +00:00
ancientmarinerdev 6d60fb4160 Merge pull request 'Add some mob object checks to avoid crashing' (#3324) from fix_ghast_kill_crash into master
Reviewed-on: MineClone2/MineClone2#3324
Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
2023-01-23 20:19:34 +00:00
ancientmarinerdev e4f26a4688 Fix self object checks for check suspend 2023-01-23 20:10:28 +00:00
ancientmarinerdev af86e73280 Fix self object reference in player_in_active_range 2023-01-23 20:10:28 +00:00
ancientmarinerdev 32be8f9602 Fix more self object references in falling 2023-01-23 20:10:28 +00:00
ancientmarinerdev 15560d969c Change order of mob step 2023-01-23 20:10:28 +00:00
ancientmarinerdev 6bbf3af97b Remove log line 2023-01-23 20:10:28 +00:00
ancientmarinerdev 84317afc93 Review feedback implemented and planned changes 2023-01-23 20:10:28 +00:00
ancientmarinerdev 2cd6629ae1 Add some mob object checks to avoid crashing 2023-01-23 20:10:28 +00:00
SmokeyDope f971283798 Add placement sounds to twisting vines and weeping vines 2023-01-23 16:55:18 +00:00
FossFanatic 9afdd09d9d Fix wrong init accident
I accidentally put the `init.lua` of `mcl_biomes` instead of `mcl_mapgen_core` in my previous commit. This fixes that.
2023-01-23 10:25:48 +00:00
SmokeyDope 62bb7a85eb Add sounds to weeping vines and twisting vines, updated warped wart block and shroomlight sounds 2023-01-23 02:04:58 +00:00
SmokeyDope 42eb541eaa Add sound to warped wart block and shroomlight block 2023-01-23 01:28:55 +00:00
SmokeyDope 9e8ed7efc3 make hoes effective and swords slightly effective on nether wart blocks 2023-01-23 00:11:56 +00:00
SmokeyDope 36231241ba make hoes effective on warped wart blocks and shroomlight blocks 2023-01-23 00:06:46 +00:00
ancientmarinerdev 9a276489d1 Merge pull request 'Fix assist death messages rarely showing up' (#3265) from CyberMango/MineClone2:dev/mango/assist_death_messages_fix into master
Reviewed-on: MineClone2/MineClone2#3265
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-01-22 23:31:58 +00:00
CyberMango e2cbd4267c Added back sweet berries death messages. 2023-01-22 22:59:28 +02:00
CyberMango 4ec506b534 Turned a global constant into local. 2023-01-22 22:59:28 +02:00
CyberMango 06435e0f4c Mixed 2 conditions into 1. 2023-01-22 22:59:28 +02:00
CyberMango a1d98c080f Now only allowing players and lua entities to do assist kills. 2023-01-22 22:59:28 +02:00
CyberMango 96cd2657db Cleanup and removed debug prints. 2023-01-22 22:59:23 +02:00
CyberMango cd63f32cdd Fixed and optimized assist death messages.
Still left many log messages, a longer timeout and some unclean parts.
2023-01-22 22:58:46 +02:00
FossFanatic 2d81d153bd Unsimplify the LBM 2023-01-22 18:02:31 +00:00
FossFanatic dc7a46df4e Simplify the LBM even more 2023-01-22 17:46:17 +00:00
FossFanatic ad25b0bc4b Make set palette safer 2023-01-22 16:51:40 +00:00
FossFanatic b77260253a Make grass palette fix LBM more efficient 2023-01-22 15:59:10 +00:00
ancientmarinerdev ad9beebc70 Merge pull request 'Extra Breaking Animation Frame' (#3343) from extra_break_animation_frame into master
Reviewed-on: MineClone2/MineClone2#3343
Reviewed-by: AFCMS <afcm.contact@gmail.com>
2023-01-22 15:07:25 +00:00
FossFanatic b6951d00b9 Add an extra frame to the breaking animation 2023-01-22 15:06:51 +00:00
ancientmarinerdev 86e480aad0 Merge pull request 'Make sweet berries' velocity checks for damage conditions use absolute values.' (#3308) from CyberMango/MineClone2:dev/mango/make_berries_velocity_check_absolute into master
Reviewed-on: MineClone2/MineClone2#3308
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-01-22 00:56:48 +00:00
ancientmarinerdev ce7d493890 Merge pull request 'Iron golem fixes' (#3309) from gldrk/MineClone2:master into master
Reviewed-on: MineClone2/MineClone2#3309
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-01-22 00:45:53 +00:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 995679d7ae Merge pull request 'Fix most deaths not producing a death message.' (#3332) from CyberMango/MineClone2:dev/mango/fix_mt_deaths_messages into master
Reviewed-on: MineClone2/MineClone2#3332
Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
2023-01-20 22:32:22 +00:00
CyberMango c57f797226 Make the velocity checks absolute.
Now sweet berries will cause damage in all directions.
2023-01-20 19:15:55 +02:00
CyberMango 78f32d2dd4 Removed the approved field from death reasons.
This created a strange bug that only death reasons created by
mcl_utils.deal_damage were "approved" so only they triggered running the
death callbacks, so only they triggered printing a death message.
Therefore most deaths did not produce a death message.
2023-01-20 19:15:21 +02:00
FossFanatic a1ad84370c Move locals upward & uncomment some things
Some locals relating to the biome sky colours and fog colours have been moved upward since there otherwise were some issues.

The sky colours and fog colours of the Nether & End biomes have also been uncommented.
2023-01-20 15:44:03 +00:00
FossFanatic f6a3fe2128 Make Nether & End use biome sky- or fog colours 2023-01-20 15:41:44 +00:00
ancientmarinerdev 1c65e0ad68 Merge pull request 'Add how to play notes' (#3341) from add_download_notes into master
Reviewed-on: MineClone2/MineClone2#3341
2023-01-20 15:15:51 +00:00
ancientmarinerdev 6900748429 Add how to play notes 2023-01-20 15:14:45 +00:00
ancientmarinerdev f09b723885 Merge pull request 'Release 0.82' (#3337) from release_0_82_0 into master
Reviewed-on: MineClone2/MineClone2#3337
2023-01-20 14:43:45 +00:00
ancientmarinerdev efd3420d52 Post-release set version 0.82.0-SNAPSHOT 2023-01-19 23:34:04 +00:00
ancientmarinerdev 62be5a06f6 Update release notes 2023-01-19 22:22:48 +00:00
ancientmarinerdev 683799aea5 Update release steps 2023-01-19 21:54:01 +00:00
ancientmarinerdev 383cbf96a6 Pre-release set version 0.82.0 2023-01-19 21:51:16 +00:00
ancientmarinerdev a7632e767d Run credits update script for release 0.82 2023-01-19 21:09:42 +00:00
ancientmarinerdev 99d09c76ae Merge pull request 'mcl_bamboo2_cleanup' (#3327) from mcl_bamboo2_cleanup into master
Reviewed-on: MineClone2/MineClone2#3327
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-01-19 21:01:08 +00:00
ancientmarinerdev c7ebe1b8cd Updated Bamboo textures by Nicu. Updated credits as per request from Michieal 2023-01-19 20:51:49 +00:00
ancientmarinerdev 5c464f1c1d Merge pull request 'Grass Footstep Sound Fix' (#3312) from grass_sound_revert into master
Reviewed-on: MineClone2/MineClone2#3312
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-01-19 13:02:38 +00:00
ancientmarinerdev 87e6842c00 Merge pull request 'Update credits' (#3334) from release_0_82_credits into master
Reviewed-on: MineClone2/MineClone2#3334
2023-01-19 01:36:13 +00:00
Michieal b258ccffdc Merge Master into mcl_bamboo_cleanup 2023-01-18 20:29:40 -05:00
ancientmarinerdev 83b0807218 Update credits 2023-01-19 00:04:16 +00:00
Michieal a00ef4500d Merge branch 'master' into mcl_bamboo2_cleanup 2023-01-18 18:40:23 -05:00
PrairieWind c49aef3251 Merge pull request 'Disable zombie siege raid until we stop zombies pathing through door' (#3329) from disable_zombie_siege into master
Reviewed-on: MineClone2/MineClone2#3329
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2023-01-18 20:51:04 +00:00
ancientmarinerdev f3ba32d739 Disable zombie siege raid until we stop zombies pathing through door 2023-01-18 19:47:45 +00:00
Michieal ed03cb470d Change Bamboo Trapdoor to be Boring. 2023-01-17 22:12:57 -05:00
FossFanatic 9746dbc376 Make the LBM run at every load again
After testing this out, it seems that the LBM only works consistenly when it runs at every load.
2023-01-17 16:04:12 +00:00
FossFanatic d89a7e0326 Rename _mcl_palette_index back to _mcl_grass_palette_index 2023-01-17 12:55:40 +00:00
FossFanatic 5fd5cc9f1c Merge branch 'master' into simplified_palette_index 2023-01-17 12:53:09 +00:00
FossFanatic c75ec6916c Conflict fix attempt 2 2023-01-17 12:52:50 +00:00
FossFanatic 4b6b4d8398 revert 26e032687a
revert Fix conflict with most recent master
2023-01-17 12:49:43 +00:00
FossFanatic 513d148eaf Merge branch 'master' into grass_sound_revert 2023-01-17 12:44:16 +00:00
FossFanatic 26e032687a Fix conflict with most recent master 2023-01-17 12:39:15 +00:00
Michieal b99487b6ab Merge branch 'master' into mcl_bamboo2_cleanup 2023-01-16 20:19:03 -05:00
ancientmarinerdev 8adc1d48b2 Merge pull request 'Remove "mcl_farming:beetroot_item" from fortune drop, so Fortune only gives seeds.' (#3328) from beetroot_fortune_hotfix into master
Reviewed-on: MineClone2/MineClone2#3328
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-01-17 00:59:25 +00:00
Michieal ac30e25065 Remove "mcl_farming:beetroot_item" from fortune drop, so Fortune only gives seeds. 2023-01-16 19:40:07 -05:00
Michieal 0931af21c8 Remove most oak trees from Bamboo biomes. 2023-01-16 18:34:48 -05:00
Michieal 77a8ca689f Give textures more definition. 2023-01-16 18:16:26 -05:00
ancientmarinerdev 30d3b7ee23 Merge pull request 'mcl_bamboo Part 2.' (#3208) from mcl_bamboo_too into master
Reviewed-on: MineClone2/MineClone2#3208
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-01-16 20:22:09 +00:00
Michieal 55bb9800f4 removed errant logging line. 2023-01-16 15:07:57 -05:00
Michieal b805ae9926 Adjust bamboo growth rates to be close to the MC wiki. 2023-01-16 15:01:38 -05:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 90c74f4a6a Merge pull request 'Fix undeclared global variable in mcl_buckets' (#3314) from buckets_warning into master
Reviewed-on: MineClone2/MineClone2#3314
Reviewed-by: Michieal <michieal@noreply.git.minetest.land>
2023-01-16 19:02:34 +00:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 6e6c11cde2 Fix undeclared global variable in mcl_buckets 2023-01-16 12:56:59 -06:00
Michieal d48b3dcaee Starting Inventory fix #4 Optimized and remove chatcommand. 2023-01-16 02:12:39 -05:00
Michieal 88493091b6 Starting Inventory fix #3. turn off debugging in code.
Ready for testing.
2023-01-16 01:58:27 -05:00
Michieal d68667beb9 Starting Inventory fix #2. add in chat command, /give_starting_inventory. add in debug code. 2023-01-16 01:53:35 -05:00
Michieal 181628e539 Starting Inventory fix #2 2023-01-16 00:51:23 -05:00
Michieal c57a757510 Starting Inventory fix #1/ 2023-01-16 00:21:15 -05:00
Michieal 26f3275b7c renamed to mcl_starting_inventory... continued. Fixed the setting in settingtypes.txt 2023-01-15 21:23:49 -05:00
Michieal 45b4b4a458 renamed to mcl_starting_inventory as that is what it is. 2023-01-15 21:21:26 -05:00
Michieal 5424ca8c2b Created Starting Chest that is given to players.
Based on the "give_initial_stuff" mod.
2023-01-15 20:39:51 -05:00
ancientmarinerdev 8feefcdd7b Merge pull request 'Give longer to breed mobs. 1.5s is not enough' (#3298) from extend_breeding_time into master
Reviewed-on: MineClone2/MineClone2#3298
Reviewed-by: Michieal <michieal@noreply.git.minetest.land>
2023-01-16 00:01:40 +00:00
ancientmarinerdev 9b28baaad6 Give longer to breed mobs. 1.5s is not enough 2023-01-16 00:00:28 +00:00
PrairieWind 60a1a364dc Merge pull request 'Fix animals jumping way too high upon growing up' (#3316) from growth_jump_fixes into master
Reviewed-on: MineClone2/MineClone2#3316
Reviewed-by: Michieal <michieal@noreply.git.minetest.land>
2023-01-15 23:43:07 +00:00
b3nderman f9b021e4c6 Fix animals jumping way too high upon growing up 2023-01-15 22:47:05 +00:00
ancientmarinerdev 65fb911e5f Merge pull request 'Fix geode crash' (#3304) from fix_geode_crash into master
Reviewed-on: MineClone2/MineClone2#3304
Reviewed-by: Michieal <michieal@noreply.git.minetest.land>
2023-01-15 22:28:38 +00:00
ancientmarinerdev 38732e801d Fix geode crash 2023-01-15 22:27:02 +00:00
ancientmarinerdev 5ad2a990d4 Merge pull request 'Allow blaze spawners to be deactivated' (#3315) from fix_blaze_spawner_disable into master
Reviewed-on: MineClone2/MineClone2#3315
Reviewed-by: Michieal <michieal@noreply.git.minetest.land>
2023-01-15 22:24:59 +00:00
ancientmarinerdev 8f6c932e88 Allow blaze spawners to be deactivated 2023-01-15 22:22:14 +00:00
Michieal e9c202ae45 Added Bamboo Biomes to spawning.lua. 2023-01-15 15:30:34 -05:00
Michieal d6ee21d192 Merge branch 'master' into mcl_bamboo_too 2023-01-15 15:27:30 -05:00
PrairieWind 876fc2fb50 Merge pull request 'Fix tamed ocelot textures not being set correctly' (#3317) from tamed_cat_texture_fix into master
Reviewed-on: MineClone2/MineClone2#3317
Reviewed-by: Michieal <michieal@noreply.git.minetest.land>
2023-01-15 19:41:51 +00:00
Michieal 0c61035df0 Missing files from the optipng commit. (not exactly sure what happened.) 2023-01-15 14:30:12 -05:00
b3nderman a7fac7c550 Fix tamed ocelot textures not being set correctly 2023-01-15 16:57:47 +00:00
ancientmarinerdev 93c9fdfaae Merge pull request 'Light Blocks' (#3078) from light-blocks into master
Reviewed-on: MineClone2/MineClone2#3078
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-01-15 15:37:10 +00:00
AFCMS 3027965314 Add comment 2023-01-15 15:32:42 +00:00
AFCMS e9c9f151de Let user dig light blocks when wielding a light block 2023-01-15 15:32:42 +00:00
AFCMS fb8262bf57 Make light blocks `buildable_to` 2023-01-15 15:32:42 +00:00
AFCMS 726358da4b Rename callbacks parameters to match Minetest documentation 2023-01-15 15:32:42 +00:00
AFCMS 515204d296 Update translation template and add french translation 2023-01-15 15:32:42 +00:00
AFCMS eb5f5678d6 Fix typo in barrier help text 2023-01-15 15:32:42 +00:00
AFCMS 33e2b79b2b Make nearby light blocks spawn particles when player wield one 2023-01-15 15:32:42 +00:00
AFCMS 7c497d9604 Remove config file 2023-01-15 15:32:42 +00:00
AFCMS 7c20896d5e Make light blocks not walkable 2023-01-15 15:32:42 +00:00
AFCMS cd70dd5b88 Spawn particle then placing light blocks 2023-01-15 15:32:42 +00:00
AFCMS 302970d220 Basic light blocks 2023-01-15 15:32:42 +00:00
AFCMS 79876635af Use `mcl_util.call_on_rightclick` in `on_place` callback for barrier block 2023-01-15 15:32:42 +00:00
AFCMS b9238b4069 Use new vectors 2023-01-15 15:32:42 +00:00
AFCMS bf25fca47d Remove support for `use_texture_alpha` bool values (mt 5.3) 2023-01-15 15:32:42 +00:00
AFCMS 92261e5fb5 Remove `stack_max` fields duplicated with default value 2023-01-15 15:32:42 +00:00
AFCMS 1e31e383d4 Fix invalid function signature for `on_place` callbacks + handling of possible nil value 2023-01-15 15:32:42 +00:00
AFCMS 4457432d32 Format file 2023-01-15 15:32:42 +00:00
ancientmarinerdev fa96f9d593 Merge pull request 'Music Hyphenation & Concision' (#3311) from music_hyphenation into master
Reviewed-on: MineClone2/MineClone2#3311
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-01-14 22:00:15 +00:00
FossFanatic fbb4cf084f Revert grass footstep sound
This reverts the grass footstep sounds back to the one before the recent sound update by grorp.
2023-01-14 15:22:19 +00:00
FossFanatic 60b19b31ab Add hyphenation
This also adds hyphenation to `In-game`.
2023-01-14 10:21:35 +00:00
FossFanatic 871c4f24c2 Change some language stuff
This adds correct hyphenation and also makes things more concise.
2023-01-14 10:20:30 +00:00
FossFanatic 18c0e1f050 Change the indexes back to the older ones 2023-01-14 10:05:00 +00:00
FossFanatic fb8e41047d Use older palette PNG file 2023-01-14 10:00:42 +00:00
FossFanatic 2bd5e6a84f Delete text file 2023-01-14 10:00:19 +00:00
FossFanatic 23a13f14e0 Merge branch 'master' into simplified_palette_index 2023-01-14 09:51:47 +00:00
gldrk 5412206743 Make iron golem protect villagers 2023-01-14 01:37:32 +03:00
gldrk 30521a8b2f Make iron golem defend itself from players 2023-01-14 01:34:28 +03:00
gldrk 1536338199 Allow passive mobs to have protectors 2023-01-14 01:32:42 +03:00
gldrk 3697ef8069 Fix summoning friends for mobs 2023-01-14 01:28:35 +03:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 dd15092052 Merge pull request 'Give an option for players to disable the in game music' (#3299) from music_settings_switch into master
Reviewed-on: MineClone2/MineClone2#3299
Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
2023-01-13 21:31:20 +00:00
ancientmarinerdev ce485e89cd In game music review feedback fix 2023-01-13 15:04:40 -06:00
ancientmarinerdev 09a7348256 Give an option for players to disable the in game music 2023-01-13 15:04:40 -06:00
FossFanatic a500528613 Make the LBM run only once
Since some people complained about the LBM running at every load, I changed it so it only runs once instead. It shouldn't even need to run more than once anyways, unless somebody could prove the contrary.
2023-01-13 17:58:51 +00:00
FossFanatic 292e7129f2 Merge branch 'master' into simplified_palette_index 2023-01-13 17:50:39 +00:00
Michieal 3091e85b1c Optipng textures. 2023-01-12 22:17:26 -05:00
Michieal da277f9dc7 fixed missed line. 2023-01-12 22:16:02 -05:00
Michieal 27a487195a Merge branch 'master' into mcl_bamboo_too 2023-01-12 22:14:58 -05:00
Michieal 2fdc8cbdd4 Changed Bamboo Sign's inventory & wield image to match the placed sign.
Reduced the number of images that trapdoors need to work.
2023-01-12 22:12:05 -05:00
Michieal 0079cf807e Changed Bamboo Signs to use custom image. 2023-01-12 21:06:25 -05:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 899cfd5157 Merge pull request 'Added protection violation checker functions.' (#3274) from CyberMango/MineClone2:dev/mango/generic_protection_violation_functions into master
Reviewed-on: MineClone2/MineClone2#3274
Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
2023-01-12 21:03:26 +00:00
CyberMango 64a7f76d5b Replaced positions check with an area check.
This one is using the minetest.is_area_protected so it should work
faster. It also doesnt require the user to manually add all the points
that should be checked so its nicer to use.
2023-01-12 21:22:36 +02:00
CyberMango b0d9eed3e1 Removed specific functions and added usage examples.
The specific functions didnt end up adding much simplicity, but did add
some degree of confusion.
2023-01-12 20:04:44 +02:00
CyberMango 685a7ff256 Added a function for a single position and better naming.
Now the functions are named with "position" instead of "node" to better
reflect what they do and what args they expect.

Also added a function for cehcking just a single position since thats
the most common use case, so it saves a small performance overhead.
2023-01-12 20:04:44 +02:00
CyberMango 949a2b787e Added protection violation checker functions.
1 completley generic and 3 more that use it for more specific cases -
  placing a node, modifying a node and planting over a node.
2023-01-12 20:04:44 +02:00
FossFanatic 8849b2e98f Merge branch 'master' into simplified_palette_index 2023-01-12 15:32:46 +00:00
Michieal 9e76cd963d Adjust bamboo sign color 2023-01-12 03:51:42 -05:00
Michieal 522a7577de Fix Bamboo nodes showing up in creative inventory.
Fix lava bamboo node placement.
2023-01-12 03:47:13 -05:00
Michieal 7912239562 Merge remote-tracking branch 'origin/mcl_bamboo_too' into mcl_bamboo_too
# Conflicts:
#	mods/ITEMS/mcl_bamboo/textures/mcl_bamboo_bamboo_plank_mosaic.png
2023-01-12 03:30:01 -05:00
Michieal 396fedd8e7 temp commit - brownish, rather than yellow, colored palette for bamboo things. 2023-01-12 03:29:49 -05:00
Michieal f81eec6fff temp commit - brownish, rather than yellow, colored palette for bamboo things. 2023-01-12 03:28:29 -05:00
Michieal d2625d3ace Fix water node placement, and lava node placement. (Yes, nether lava too!) 2023-01-12 03:27:17 -05:00
Michieal a04d946879 Updated Licensing for additional images. 2023-01-11 21:50:34 -05:00
ancientmarinerdev 482a6071f5 Merge pull request 'Beetroot Seed fix' (#3294) from beetroot_seed_fix into master
Reviewed-on: MineClone2/MineClone2#3294
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-01-11 22:27:58 +00:00
Michieal 6993559330 Updated relevant Credits for Bamboo and recent work. 2023-01-11 07:26:01 -05:00
Michieal b572363b8e temp commit. recolor scaffolds. 2023-01-11 07:16:41 -05:00
Michieal 00408b998c Fix -- Bamboo grow, bamboo place to be correct. 2023-01-11 07:16:12 -05:00
Michieal e7c238c17e Merge remote-tracking branch 'origin/mcl_bamboo_too' into mcl_bamboo_too
# Conflicts:
#	mods/ITEMS/mcl_bamboo/bamboo_base.lua
2023-01-11 02:32:28 -05:00
Michieal 1de806f6f8 Put height into placed, base, bamboo stalk nodes so that height checks work properly.
Fix placing bamboo on top of other bamboo nodes, when it would go above the decided height. It now stops just before the endcap node placement.

Fixed Errant log message.
Fixed itemstack removal while in creative mode.
2023-01-11 02:31:36 -05:00
Michieal b07e6fccdc Put height into placed, base, bamboo stalk nodes so that height checks work properly.
Fix placing bamboo on top of other bamboo nodes, when it would go above the decided height. It now stops just before the endcap node placement.
2023-01-11 02:22:30 -05:00
Michieal 04efa74115 Prevent growing "around" things in the way. 2023-01-11 02:19:19 -05:00
Michieal 2e8f56d098 Merge branch 'master' into mcl_bamboo_too 2023-01-10 22:29:28 -05:00
Michieal ff7299a444 Fix beetroot seeds not dropping.
Changed drop rate to 1-4.

Added in Fortune drops too. (Per the minecraft wiki.)
2023-01-10 21:38:42 -05:00
Michieal aad2d114f9 temp commit. recolor of the planks and scaffolds. 2023-01-10 20:49:38 -05:00
ancientmarinerdev 2ed3c1c480 Merge pull request 'Mob Fixes' (#3242) from mob_fixes into master
Reviewed-on: MineClone2/MineClone2#3242
Reviewed-by: Michieal <michieal@noreply.git.minetest.land>
2023-01-11 01:11:07 +00:00
ancientmarinerdev 111c885417 Added burger alias 2023-01-11 01:07:18 +00:00
ancientmarinerdev 8e1f00d428 Villager breeding is now unburgered. Burger now needs right click to initiate follow. 2023-01-11 01:07:18 +00:00
ancientmarinerdev 4fd4425aae Improved mob debug 2023-01-11 01:07:18 +00:00
ancientmarinerdev ac4cd2c325 Improve performance for head swivel check 2023-01-11 01:07:18 +00:00
ancientmarinerdev 01c8009c6a Tidy on_step function 2023-01-11 01:07:18 +00:00
ancientmarinerdev ef90820f67 Fix farm animals so they don't get into combat state 2023-01-11 01:07:18 +00:00
ancientmarinerdev d6d11b9526 Zombie villagers cannot despawn during curing process 2023-01-11 01:07:17 +00:00
ancientmarinerdev b0264b2736 Endermen now despawn when not holding a block. 2023-01-11 01:07:17 +00:00
Michieal c12f2cc565 Fix placement of bamboo endcap 2023-01-10 19:23:40 -05:00
Michieal 9f94f12127 Fix placement of bamboo onto bamboo nodes going higher than max height. 2023-01-10 18:48:50 -05:00
Michieal 784f3ec226 Made plank textures more dried bamboo looking. 2023-01-10 16:40:18 -05:00
Michieal 44a769397d Fix bamboo mosaic using wrong texture.
Fix error.
2023-01-10 15:36:17 -05:00
PrairieWind b3da85be64 Merge pull request 'mcl_music_without_menu_music' (#3291) from mcl_music_without_menu_music into master
Reviewed-on: MineClone2/MineClone2#3291
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2023-01-10 19:15:22 +00:00
ancientmarinerdev 3ed32abc4e Add credit for nether music 2023-01-10 19:05:56 +00:00
kay27 9db6050638 Fix music interruption 2023-01-10 19:05:56 +00:00
kay27 7ceb953a56 Add different music for different dimensions 2023-01-10 19:05:56 +00:00
kay27 1894d8c5f0 Fix mcl_music: play to all players, play every day, overworld only 2023-01-10 19:05:56 +00:00
kay27 419d61edde Add trivial mcl_music mod and a piano track by diminixed 2023-01-10 19:05:55 +00:00
PrairieWind 9820309762 Merge pull request 'mcl_crimson_update' (#3289) from mcl_crimson_update into master
Reviewed-on: MineClone2/MineClone2#3289
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2023-01-10 18:17:39 +00:00
Michieal 726eba7ed8 Make bamboo fence/gate less yellow. It's bamboo, not corn XD 2023-01-10 04:42:31 -05:00
Michieal f46581905a Added veins to the Hyphae log sides. 2023-01-10 04:30:29 -05:00
Michieal 4f6de581dd fixed the warped fungus mushroom texture.
fixed the warped fungus selection box.
2023-01-10 04:29:47 -05:00
Michieal eb8f7360a2 Merge branch 'master' into mcl_bamboo_too 2023-01-09 18:56:05 -05:00
ancientmarinerdev db62631540 Merge pull request 'mcl_lectern' (#3282) from mcl_lectern into master
Reviewed-on: MineClone2/MineClone2#3282
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-01-09 22:33:31 +00:00
ancientmarinerdev fb30564827 Ooooooh, lecterns. My favourite. 2023-01-09 22:32:14 +00:00
Michieal 8c355db3ce Made Lecterns solid. 2023-01-09 22:32:14 +00:00
Michieal eae08f3010 Finished Lecterns.
Added in License.txt.
2023-01-09 22:32:14 +00:00
Michieal 4701c4d6e7 Built basic lectern model, texture, and node definition.
Created crafting recipe.

Marked Lecterns as WIP.

Started defining placement.

Added in README.txt.
2023-01-09 22:32:14 +00:00
Michieal 8df0b2a48e Made changes to the MapGen definitions because with the new grow code, bamboo creates its own height, and therefore places its own top. And, having multiple tops looks funny. 2023-01-09 16:31:02 -05:00
ancientmarinerdev 66f368531d Merge pull request 'Fix Country Lode HUD Issue' (#3268) from advancement_bug_fix into master
Reviewed-on: MineClone2/MineClone2#3268
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-01-09 21:17:41 +00:00
PrairieWind 7cb5c55d68 Update Translation Files
Fixes the translation error for other languages
2023-01-09 13:36:36 -07:00
Michieal 34faca3f2c Added in License.txt
Made the end cap node wave in the wind.
2023-01-08 23:08:12 -05:00
Michieal d5dda679eb fix vestigial variable names to not be so obtuse. 2023-01-07 16:45:36 -05:00
Michieal c65bbcd5a5 fixed missed spot for licensing. 2023-01-07 16:14:33 -05:00
Michieal 533f59bf27 Merge branch 'master' into mcl_bamboo_too 2023-01-06 18:08:33 -05:00
Michieal 3074c15d14 clear up comment confusion.
Factored out hard coded names for variable names.

removed "minecraft" from README.md.
2023-01-06 18:07:30 -05:00
Michieal 132178b8c7 clear up comment confusion. 2023-01-06 17:46:54 -05:00
Michieal ede21a8627 revert f92ea77849
revert accidental second commit.

Mega commit. lol.

Did a LOT of refactoring.

Cleaned up some vestigial code.

Cleaned up aliases.
2023-01-06 22:43:41 +00:00
Michieal 82fae13b47 Merge remote-tracking branch 'origin/mcl_bamboo_too' into mcl_bamboo_too 2023-01-06 17:41:57 -05:00
Michieal f92ea77849 Mega commit. lol.
Did a LOT of refactoring.

Cleaned up some vestigial code.

Cleaned up aliases.
2023-01-06 17:41:01 -05:00
Michieal 7ebf9b7ab8 Mega commit. lol.
Did a LOT of refactoring.

Cleaned up some vestigial code.

Cleaned up aliases.
2023-01-06 17:40:35 -05:00
Michieal 07a56165ed update optional depends. 2023-01-06 20:23:59 +00:00
Michieal ee0b355f51 Fix licensing. 2023-01-06 20:21:08 +00:00
PrairieWind 6fd799ac42 Fix Country Lode HUD Issue
Fixed the error that was thrown when the advancement is unlocked and also fixed the popup HUD so the advancement title fits correctly
2023-01-06 16:35:59 +00:00
ancientmarinerdev 01bb753549 Merge pull request 'Refactor mob_step and do_states' (#3231) from mob_tweaks into master
Reviewed-on: MineClone2/MineClone2#3231
Reviewed-by: Michieal <michieal@noreply.git.minetest.land>
2023-01-06 14:10:39 +00:00
ancientmarinerdev 59694ebc7c Fix merge conflict 2023-01-06 13:52:03 +00:00
Michieal cc24144bc6 Fixed collision and selection box for endcap nodes.
fixed typo in debug message.
2023-01-06 01:22:18 -05:00
Michieal e1cd16c971 Adjusted growth interval.
tested and fixed bamboo growth function.

Add debug code across growth function and scaffold place.

disabled debug for commit. removed finished todos.
2023-01-06 00:41:26 -05:00
ancientmarinerdev 00c4ecf643 Merge pull request 'Villagers and pathfinding improvements' (#3083) from village_town_bell_pathfix into master
Reviewed-on: MineClone2/MineClone2#3083
Reviewed-by: Michieal <michieal@noreply.git.minetest.land>
2023-01-06 02:59:48 +00:00
ancientmarinerdev e4db91d35c Fix crash bug 2023-01-06 02:59:02 +00:00
ancientmarinerdev 2527479401 Clean up on isle 5, please 2023-01-06 02:59:02 +00:00
ancientmarinerdev 85f7bbdb80 Optimisation. Don't even prepare to path if not ready to path 2023-01-06 02:59:02 +00:00
ancientmarinerdev 465a919f6b Villager will now reclaim job during the day even when it isn't work time 2023-01-06 02:59:02 +00:00
ancientmarinerdev 325a666c62 Added pathfinder constants to make it easier to tweak 2023-01-06 02:59:02 +00:00
ancientmarinerdev e9b54e85c2 Pathfinding clean up 2023-01-06 02:59:02 +00:00
ancientmarinerdev 4324fe2489 Villager will now path from one house to another in search of available job or bed 2023-01-06 02:59:02 +00:00
ancientmarinerdev d6804bf4b7 Fix distance to target issue, and refactor pathing actions 2023-01-06 02:59:02 +00:00
ancientmarinerdev 87f04bdd9f Prevent attempting to path through 2 doors until code supports it. Clean up also. 2023-01-06 02:59:02 +00:00
ancientmarinerdev e3307d647b Fix pathing to bell that is sat on the ground 2023-01-06 02:59:02 +00:00
ancientmarinerdev 29cd73cb84 Pathfinding through door should also check door closest to position so villager can leave current house 2023-01-06 02:59:02 +00:00
ancientmarinerdev 5c0a763b83 Optimisation - Only check for town bell if ready to path 2023-01-06 02:59:02 +00:00
ancientmarinerdev 9b1ceebf0d Villagers will now pathfind to town bell that isn't on the ground 2023-01-06 02:59:02 +00:00
Michieal ed64e7f733 Reverted scaffolding (WIP) for final push. Making an issue for it's continued work. Left wip in, but commented and future featured out. Will test changes forthwith.
Adjusted bamboo base code (randomize which one to use.) to do less math and accomplish the same thing.
2023-01-05 20:27:52 -05:00
ancientmarinerdev 856a60bcc2 Merge pull request 'Fix a few issues with sweet berries.' (#3187) from CyberMango/MineClone2:bug/mango/sweet_berry_fixes into master
Reviewed-on: MineClone2/MineClone2#3187
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-01-06 00:09:41 +00:00
Michieal 08f9c0074a REVERT: Fix mcl_dyes' mod.conf to use mcl_bamboo grow and check functions. 2023-01-05 18:31:21 -05:00
FossFanatic 09db6017c3 Merge branch 'master' into simplified_palette_index 2023-01-05 10:06:11 +00:00
Michieal c4969c13cd trying to fix redundancy error... 2023-01-05 00:30:18 -05:00
Michieal f70176da34 Fix mcl_dyes' mod.conf to use mcl_bamboo grow and check functions. 2023-01-04 23:56:51 -05:00
Michieal e314addeb3 Merge branch 'master' into mcl_bamboo_too
# Conflicts:
#	mods/ITEMS/mcl_dye/init.lua
2023-01-04 23:10:54 -05:00
Michieal df8fc65e1e temp commit. 2023-01-04 23:03:08 -05:00
Michieal 687887fe27 Incorporate applying bonemeal to Bamboo stalks. 2023-01-04 22:49:17 -05:00
Michieal 65aa956d9c Add alias for scaffolding.
Rework grow_bamboo to handle random heights, and to handle bonemeal.

 Remove "bamboo_node" in favor of is_bamboo()
2023-01-04 22:43:05 -05:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 ddd004c0f0 Merge pull request 'Fix incorrect foundation size for belltower' (#3147) from village_tweaks into master
Reviewed-on: MineClone2/MineClone2#3147
Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
2023-01-04 21:45:47 +00:00
ancientmarinerdev 609ef220ad Village building and paths should not spawn on top of snowy trees 2023-01-04 15:14:40 -06:00
ancientmarinerdev 32a7eb4087 Fix incorrect foundation size for belltower 2023-01-04 15:14:37 -06:00
CyberMango 5e969ba928 Added sweet berries death messages. 2023-01-04 23:04:19 +02:00
CyberMango 17e02aec3c Applying bone meal on a stage 3 sweet berry no longer grows it.
It now ignores the bone meal and harvests the sweet berry as normal.
2023-01-04 23:04:19 +02:00
CyberMango fb28e192e6 Bone meal applied on sweet berries only grows them by 1 stage now.
The interface of the grow plant is a bit confusing since even with
stages set to 0 the plant grows by 1 stage (if other conditions such as
light are met). Therefore changing it to 0 makes the plant grow by 1.
2023-01-04 23:04:19 +02:00
CyberMango 0f569fdbaa Bone meal on sweet berries in creative mode is no longer wasted and
minor fixes.

removed an unnecessary -- in a comment.
Removed a redundant concatination.
2023-01-04 23:04:19 +02:00
CyberMango 8a7fcfde82 Fixed sweet berries bugs.
Now they can only be placed a tile's upper part.
Also when destroyed bushes at stage 2 drop 1 or 2 berries, while bushes
at stage 3 drop 2 or 3 (instead of fixed numbers of 1 and 3
respectively).
Also harvesting sweet berries at stage 3 (final) brings them to stage 1
instead of just to stage 2. Number of dropped berries was adjusted.
2023-01-04 23:04:19 +02:00
CyberMango fb51067c78 Created a shared function for planting a seed that can also be consumed. 2023-01-04 23:04:19 +02:00
Michieal 8dd4a2611e Added alias for scaffolding. 2023-01-04 14:25:31 -05:00
Michieal f86ee99abf Further cleaned up bamboo base code.
Fixed some errors in Scaffolding, Commented out the in progress section.
2023-01-04 11:28:09 -05:00
FossFanatic 6cf1fa7b81 Merge branch 'master' into simplified_palette_index 2023-01-04 15:02:56 +00:00
ancientmarinerdev 7ea41a2f21 Merge pull request 'Fix baby zombies going through 1 node high space' (#3241) from short_baby_zombies into master
Reviewed-on: MineClone2/MineClone2#3241
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-01-04 14:56:26 +00:00
FossFanatic 39bcf2f961 Merge branch 'master' into simplified_palette_index 2023-01-04 14:01:58 +00:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 0b1916b807 Fix baby zombies going through 1 node high space 2023-01-04 07:52:48 -06:00
Michieal d1a017f6b2 optimized out some for loops, cleaned up code for bamboo placement.
tested the changes.
2023-01-03 18:40:40 -05:00
Michieal 50e50e2904 Continued some optimizations of code in bamboo.on_place.
Begun work on scaffolding.
2023-01-03 15:57:58 -05:00
Michieal 966c914a8e Updated .gitignore to exclude *.xcf (gimp) files. 2023-01-03 15:39:23 -05:00
Michieal 9351f72c15 Updated Bamboo translations template.txt 2023-01-03 15:38:34 -05:00
Michieal ef7fb0d2e3 Cleaned up the code. Fixed side placement of bamboo against bamboo.
Dinked with the random number generator some more.

Condensed some more of the code duplication (WIP).

Added in MCL_Log function.

Finally settled on a decent looking Bamboo top.
2023-01-03 01:38:12 -05:00
Michieal 5ef7d9f7a0 Added in Bamboo_Plank variable.
Dinked with the random number generator some.

Moved Bamboo Mosaic from base to items.

condensed some of the code duplication (WIP).

started to add in checks to prevent bamboo from being placed against itself horizontally.

Fixed a couple of naming issues.
2023-01-02 22:36:09 -05:00
ancientmarinerdev 0fca1ce469 Merge pull request 'Fix crash for sky colour if cannot find biome' (#3239) from fix_colour_crash_risk into master
Reviewed-on: MineClone2/MineClone2#3239
Reviewed-by: Michieal <michieal@noreply.git.minetest.land>
2023-01-03 01:02:19 +00:00
Michieal 388632cd46 Fixed BROKEN skycolor 2023-01-02 19:36:01 -05:00
Michieal dd4a0a4172 Fixed mcl_fishing depending on mcl_bamboo. 2023-01-02 19:24:56 -05:00
ancientmarinerdev df6d1c026a Fix crash for sky colour if cannot find biome 2023-01-02 21:48:58 +00:00
Michieal d586b3fecc Tracked down missing node type placement issues, and fixed them.
Now with Chicken Cherry Cola!
2023-01-02 03:54:26 -05:00
Michieal a7a0c4791a Many bug fixes, Adjusted randomizing code.
And, Now with Lime-Cherry Kool-aid!! Yum!
2023-01-02 02:19:33 -05:00
Michieal 23b62c296a Fix code caching errors, and remove unused variables from init. 2023-01-01 23:07:20 -05:00
ancientmarinerdev f8ae702ce4 Function name consistency 2023-01-02 00:58:23 +00:00
ancientmarinerdev 5faf060122 Fix crash and remove unused duplicate variables 2023-01-02 00:54:08 +00:00
ancientmarinerdev 8c648d1fc3 Refactor mob_step and do_states 2023-01-02 00:00:40 +00:00
ancientmarinerdev 46052e5b7e Merge pull request 'Add templates for issues and pull requests' (#3220) from gitea_templates into master
Reviewed-on: MineClone2/MineClone2#3220
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2023-01-01 19:04:12 +00:00
iliekprogrammar 6430fcf103 Clarify *missing feature request* template 2023-01-01 19:03:34 +00:00
iliekprogrammar 7376b08c61 Better headers. More distinct *missing feature* template 2023-01-01 19:03:34 +00:00
iliekprogrammar 2e28a3386b Revert "Add "Testing/Review needed" tag to pull request templates"
This reverts commit 45656d8b747eac6400b2752fe2de603308ca69ef.
2023-01-01 19:03:34 +00:00
iliekprogrammar 98dac6dcd7 Add "Testing/Review needed" tag to pull request templates 2023-01-01 19:03:34 +00:00
iliekprogrammar 3026808a71 Add templates for issues and pull requests 2023-01-01 19:03:34 +00:00
test1 7c7521ff15 Merge pull request 'Update readme' (#3223) from updated_readme into master
Reviewed-on: MineClone2/MineClone2#3223
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-31 13:23:03 +00:00
test1 50d8e95c16 Update readme 2022-12-31 13:16:52 +00:00
iliekprogrammar fc74bd5cfe Merge pull request 'fix-cocoa-place' (#3221) from fix-cocoa-place into master
Reviewed-on: MineClone2/MineClone2#3221
Reviewed-by: iliekprogrammar <iliekprogrammar@gmail.com>
2022-12-31 10:49:57 +00:00
kabou 2a37d38f6c Reformat cocoa pod node definition groups. 2022-12-31 11:18:04 +01:00
kabou 89821a8329 Rename cocoa pod placement function.
* Rename cocoa pod placement function to match the `on_place` call in
  the cocoa pods item definition.
* Make the function local, there are no callers outside of mcl_cocoas.
2022-12-31 10:41:39 +01:00
FossFanatic 3d2955c394 Merge branch 'master' into simplified_palette_index 2022-12-30 10:36:35 +00:00
Michieal 87327abfb9 Restructure Commit.
Recipes are in recipes.lua
Bamboo Basic nodes are in bamboo_base.lua
Bamboo items are in bamboo_items.lua
Bamboo api / globals are in globals.lua.
2022-12-29 13:16:48 -05:00
Michieal 34263c2ef3 Change bamboo back to Axey, instead of swordy. 2022-12-29 12:28:42 -05:00
Michieal 38c6969292 Fix mod.conf in mcl_fishing
Fix bamboo nodes on_destruct to handle the alt nodes too.
clean up ToDos
2022-12-29 11:31:13 -05:00
FossFanatic 54548ecfdf Merge branch 'master' into simplified_palette_index 2022-12-29 14:51:17 +00:00
FossFanatic 5ec7b8ed89 Add LBM to fix grass palette indexes
Adds a LBM which basically fixes the grass palette indexes of the nodes from older worlds. I have also added some more nodes to `block_fixes`.
2022-12-29 14:18:37 +00:00
FossFanatic 137179ac8e revert 3afb42b2f7
revert Add a LBM to fix grass palette indexes on older worlds
2022-12-29 14:13:50 +00:00
FossFanatic 3afb42b2f7 Add a LBM to fix grass palette indexes on older worlds 2022-12-29 14:12:00 +00:00
Michieal 1d0968f4f5 Fix bamboo nodes on_destruct to handle the alt nodes too.
clean up ToDos
2022-12-29 01:38:10 -05:00
Michieal 0f9d263e02 Add Bamboo to the Fishing Junk table.
Update the mod.conf to be aware of mcl_bamboo.
2022-12-29 01:29:25 -05:00
Michieal 26c1be3722 Fix bamboo node to be Swordy.
Added in secondary bamboo node types.
Changed the grow_bamboo function to make use of new alt nodes, and removed unneccessary "force" parameter.
2022-12-29 01:03:25 -05:00
Michieal acc2be7253 Merge remote-tracking branch 'origin/mcl_bamboo_too' into mcl_bamboo_too 2022-12-28 18:21:39 -05:00
Michieal 3015bfb8c4 Merge branch 'master' into mcl_bamboo_too 2022-12-28 23:16:01 +00:00
Michieal 28cb06421d Merge branch 'master' into mcl_bamboo_too 2022-12-28 18:13:51 -05:00
Michieal 731468cf5a Did a bit of code restructuring.
Removed another magic number.
Add in todo for fishing.
Added in the possibility for bamboo to grow two nodes in one success.
Added in a "force" param to use with bonemealing.
2022-12-28 18:10:12 -05:00
Michieal ff7693937a Did a bit of code restructuring.
Removed another magic number.
Add in todo for fishing.
Added in the possibility for bamboo to grow two nodes in one success.
Added in a "force" param to use with bonemealing.
2022-12-28 15:29:06 -05:00
FossFanatic c1cde073c8 Rename _mcl_palette_index to _mcl_grass_palette_index 2022-12-28 19:34:24 +00:00
Michieal 76669e1f3c Moved bamboo grow code to its own function, and made that function global so that it can be called outside of mcl_bamboo. 2022-12-28 14:34:14 -05:00
FossFanatic ef15477e37 Rename _mcl_palette_index to _mcl_grass_palette_index 2022-12-28 19:33:26 +00:00
FossFanatic a0c5a04d26 Rename _mcl_palette_index to _mcl_grass_palette_index 2022-12-28 19:32:42 +00:00
FossFanatic 18e932997d Rename _mcl_palette_index to _mcl_grass_palette_index 2022-12-28 19:31:11 +00:00
FossFanatic 1f601c68c5 Make snowy grass blocks have a palette index
This fixes the issue where snowy grass blocks always have the same coloured grass underneath them.
2022-12-28 17:02:58 +00:00
FossFanatic 9cf6c9ed5e Change swamp and mangrove grass palette index
Changes the grass palette index of the swamp and mangrove to use the swampier variant of the swamp colours.
2022-12-28 16:10:02 +00:00
FossFanatic 9f9cc3a629 Change grass block inventory colour
According to the wiki, the hex code of the grass block when held or in the inventory is #7CBD6B.
2022-12-27 21:19:33 +00:00
FossFanatic ac90350257 Change palette indexes to fit the new palette 2022-12-27 20:57:58 +00:00
FossFanatic a6841fe38b Simplify palette and add helpful text file 2022-12-27 20:55:24 +00:00
Michieal 6f05992c8b Fix Licensing.
Removed Make_Stairs check.
Made unified protection check.
Began work on the second half of scaffolding.
Removed comments that was no longer needed.
2022-12-25 07:30:31 -05:00
Michieal c55332bf42 Change mod.conf and readme's depends.
Optipng images, after adding in bamboo top image.
Try out a plantlike style top node for bamboo stalks.
Make Bamboo drop 1-2 bamboo.
Fix Bamboo top drops.
2022-12-24 00:57:44 -05:00
Michieal 42f8fbf9b8 Added in Fuel Recipes for bamboo slabs / stairs; including mosaics.
Finished Bamboo Mosaic nodes.
2022-12-23 17:27:01 -05:00
Michieal b0978d275d Abstracted variables in bamboo abm.
Fix Base scaffolding in Creative mode.
Fixed Lua Warnings.
2022-12-22 16:08:05 -05:00
Michieal 2b11b5c17a Added full node names for bamboo on_place.
Added in bamboo top destruct.
Removed mapgen.lua.
2022-12-21 22:23:46 -05:00
Michieal 9445b02dcc MapGen update. Adjusted decorations. 2022-12-21 20:57:34 -05:00
Michieal e0d48400a7 Fix the removal of bamboo extras. 2022-12-21 16:16:53 -05:00
Michieal 742a625c42 Added in aliasing for scaffolding, to prevent breakage for players using the "mcl_scaffolding" mod. 2022-12-21 15:55:50 -05:00
Michieal 95d3f9be07 Make Lantern API callable from outside of mcl_lanterns 2022-12-21 12:34:47 -05:00
Michieal 16d94a88db moved extras to the proper location 2022-12-21 12:32:09 -05:00
Michieal b14f055154 Merge branch 'master' into mcl_bamboo_too
# Conflicts:
#	mods/ITEMS/mcl_bamboo/init.lua
2022-12-20 23:19:29 -05:00
Michieal 773c760727 Added Bamboo Mosaic.
Added Tiki Lamp (extras) - Requires mcl_lanterns to be fixed to allow API to be called from other mods.
Moved Side Scaffolding to bambootoo.lua
2022-12-14 23:02:08 -05:00
3335 changed files with 19088 additions and 4147 deletions

View File

@ -0,0 +1,36 @@
---
name: "Bug report"
about: "File a bug report"
labels:
- unconfirmed
- bug
---
<!--
Thanks for taking the time to fill out this bug report!
Please follow our contributing guidelines first:
https://git.minetest.land/MineClone2/MineClone2/src/branch/master/CONTRIBUTING.md#rules-about-both-bugs-and-feature-requests
By submitting this issue, you agree to follow our Code of Conduct:
https://git.minetest.land/MineClone2/MineClone2/src/branch/master/CODE_OF_CONDUCT.md
-->
<!--
What version of MineClone2 are you using? We do not provide support for outdated versions of MineClone2.
Current latest version is listed here, at the top:
https://git.minetest.land/MineClone2/MineClone2/tags
-->
MineClone2 version:
### What happened?
Report about the bug! Please send large log snippets as an attachement file.
### What should happen:
Tell us what should happen!
### Steps to reproduce
Tell us how we can reproduce the bug!

View File

@ -0,0 +1,26 @@
---
name: "Feature request"
about: "File a feature request not in Minecraft"
labels:
- "non-Minecraft feature"
- "needs discussion"
---
<!--
Got a new non-Minecraft feature request? Explain to us why we should consider your idea.
Please follow our contributing guidelines first:
https://git.minetest.land/MineClone2/MineClone2/src/branch/master/CONTRIBUTING.md#rules-about-both-bugs-and-feature-requests
By submitting this issue, you agree to follow our Code of Conduct:
https://git.minetest.land/MineClone2/MineClone2/src/branch/master/CODE_OF_CONDUCT.md
-->
### Feature
Tell us about your requested feature not in Minecraft!
### Why
Tell us why should we implement it!

View File

@ -0,0 +1,25 @@
---
name: "Missing Feature request"
about: "File a missing feature request in Minecraft but not in MineClone2"
labels:
- "missing feature"
---
<!--
Thanks for taking the time to fill out this missing feature request!
Please follow our contributing guidelines first:
https://git.minetest.land/MineClone2/MineClone2/src/branch/master/CONTRIBUTING.md#rules-about-both-bugs-and-feature-requests
By submitting this issue, you agree to follow our Code of Conduct:
https://git.minetest.land/MineClone2/MineClone2/src/branch/master/CODE_OF_CONDUCT.md
-->
### Current feature in Minecraft
Tell us about the feature currently in Minecraft! What is it like on Minecraft?
### Current feature in MineClone2
Tell us about the feature currently in MineClone2! What is different?

View File

@ -0,0 +1,20 @@
---
name: "Pull request"
about: "Submit a pull request"
labels:
---
<!--
Please follow our contributing guidelines first:
https://git.minetest.land/MineClone2/MineClone2/src/branch/master/CONTRIBUTING.md#how-you-can-help-as-a-programmer
By submitting this pull request, you agree to follow our Code of Conduct:
https://git.minetest.land/MineClone2/MineClone2/src/branch/master/CODE_OF_CONDUCT.md
-->
Tell us about your pull request! Reference related issues, if necessary
### Testing
Tell us how to test your changes!

1
.gitignore vendored
View File

@ -4,3 +4,4 @@
*.blend2
*.blend3
/.idea/
*.xcf

1
API.md
View File

@ -41,6 +41,7 @@ A lot of things are possible by using one of the APIs in the mods. Note that not
* Beds: `ITEMS/mcl_beds`
* Buckets: `ITEMS/mcl_buckets`
* Dispenser support: `ITEMS/REDSTONE/mcl_dispensers`
* Campfires: `ITEMS/mcl_campfires`
### Mobs
* Mobs: `ENTITIES/mcl_mobs`

View File

@ -2,8 +2,8 @@
So you want to contribute to MineClone2?
Wow, thank you! :-)
MineClone2 is maintained by Nicu and Cora. If you have any
problems or questions, contact us (See Links section below).
MineClone2 is maintained by AncientMariner and Nicu. If you have any
problems or questions, contact us on Discord/Matrix (See Links section below).
You can help with MineClone2's development in many different ways,
whether you're a programmer or not.
@ -240,7 +240,7 @@ work causes problems, we ask you fix the issues as soon as possible.
### Changing Gameplay
Pull Requests that change gameplay have to be properly researched and
need to state their sources. These PRs also need Fleckenstein's approval
need to state their sources. These PRs also need the maintainer's approval
before they are merged.
You can use these sources:
@ -375,7 +375,7 @@ merged.
- Resolving conflicts and problems within the community
#### Current maintainers
* Cora - responsible for gameplay review, publishing releases,
* AncientMariner - responsible for gameplay review, publishing releases,
technical guidelines
* Nicu - responsible for community related issues

View File

@ -35,7 +35,8 @@
* SumianVoice
* MrRar
* talamh
* Faerraven
* Faerraven / Michieal
* FossFanatic
## Contributors
* Laurent Rocher
@ -96,6 +97,12 @@
* TheOnlyJoeEnderman
* Ranko Saotome
* Gregor Parzefall
* Wbjitscool
* b3nderman
* CyberMango
* gldrk
* SmokeyDope
* atomdmac
## MineClone5
* kay27
@ -147,11 +154,13 @@
* jordan4ibanez
* paramat
* cora
* Faerraven / Michieal
## 3D Models
* 22i
* tobyplowy
* epCode
* Faerraven / Michieal
## Textures
* XSSheep
@ -166,6 +175,7 @@
* RandomLegoBrick
* cora
* Faerraven / Michieal
* Nicu
## Translations
* Wuzzy
@ -180,9 +190,12 @@
* snowyu
* 3raven
* SakuraRiu
* anarquimico
## Funders
* 40W
* bauknecht
* Cora
## Special thanks
* celeron55 for creating Minetest

21
HOW_TO_PLAY.md Normal file
View File

@ -0,0 +1,21 @@
Survive, farm, build, explore, play with friends, and do much more. Inspired by a well known block game, pushing beyond.
How to play:
#### Download Minetest
- Navigate to https://www.minetest.net/ to download the client.
- Once installed, open and select the "Content" tab
#### Install MineClone2 from ContentDB
- Click "Browse Online Content" and filter by Games (select "Games" from the dropdown box)
- Find "MineClone2" (should be first on the list or on the first page)
- Click the [+] button next to MineClone2 and wait for download to finish
- Click "Back to Main Menu"
#### Create new world and play
- Click "Start Game" tab
- At the bottom click the MineClone2 icon (the 2 dirt with grass blocks)
- Click "New", give your world a name
- You can leave seed blank or put in a word of your choice
- Select your new world
- Click "Play Game" and enjoy!

View File

@ -2,8 +2,6 @@
An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils.
Developed by many people. Not developed or endorsed by Mojang AB.
Version: 0.82 (in development)
### Gameplay
You start in a randomly-generated world made entirely of cubes. You can explore
the world and dig and build almost every block in the world to create new
@ -158,7 +156,7 @@ The following features are incomplete:
* Some monsters and animals
* Redstone-related things
* Special minecarts
* Some special minecarts (hopper and chest minecarts work)
* A couple of non-trivial blocks and items
Bonus features (not found in Minecraft):

View File

@ -1,19 +1,75 @@
### Standard Release
#File to document release steps with a view to evolving into a script
#Update CREDITS.md
#Update version in README.md (soon to be game.conf from of 0.82.0)
#Update version in game.conf
lua tools/generate_ingame_credits.lua
git add CREDITS.md
git add mods/HUD/mcl_credits/people.lua
git add game.conf
git add README.md
# To uncomment when applicable
#git add game.conf
#git add RELEASE.md
git commit -m "Pre-release update credits and set version 0.81.1"
git commit -m "Pre-release update credits and set version 0.82.0"
git tag 0.81.1
git tag 0.82.0
git push origin 0.81.1
git push origin 0.82.0
#Update version in game.conf to -SNAPSHOT
git commit -m "Post-release set version 0.82.0-SNAPSHOT"
### Hotfix Release
##### Prepare release branch
When hotfixing, you should never release new features. Any new code increases risk of new bugs which has additional testing/release concerns.
To mitigate this, you just release the last release, and the relevant bug fix. For this, we do the following:
* Create release branch from the last release tag, push it:
git checkout -b release/0.82.1 0.82.0
git push origin release/0.82.1
##### Prepare feature branch and fix
* Create feature branch from that release branch (can review it to check only fix is there, nothing else, and use to also merge into master separately)
git checkout -b hotfix_bug_1_branch
* Fix crash/serious bug and commit
* Push branch and create pr to the release and also the master branch (Do not rebase, to reduce merge conflict risk. Do not delete after first merge or it needs to be repushed)
##### Update version and tag the release
* After all fixes are in release branch, pull it locally (best to avoid a merge conflict as feature branch will need to be merged into master also, which already changed version):
* Update version in game.conf to hotfix version and commit it. Example: version=0.82.1
* Tag it, push tag and branch:
git tag 0.82.1
git push origin 0.82.1
git push origin release/0.82.1
Note: If you have to do more than 1 hotfix release, can do it on the same release branch.
### Release via ContentDB
* Go to MineClone2 page (https://content.minetest.net/packages/Wuzzy/mineclone2/)
* Click +Release
* Enter the release tag number in the title and Git reference box. For example (without quotes): "0.82.1"
* In the minimum minetest version, put the oldest supported version (as of 14/02/2023 it is 5.5), leave the Maximum minetest version blank
* Click save. Release is now live.
##### Inform people
* Add a comment to the forum post with the release number and what is involved, and maintainer will update main post.
* Add a comment in Discord announcement

View File

@ -1,4 +1,4 @@
title = MineClone 2
description = A survival sandbox game. Survive, gather, hunt, build, explore, and do much more.
disallowed_mapgens = v6
version=MCL2-0.82-indev
version=0.82.0-SNAPSHOT

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -204,7 +204,7 @@ end
-- Checks if the given node would drop its useful drop if dug by a given tool.
-- Returns true if it will yield its useful drop, false otherwise.
function mcl_autogroup.can_harvest(nodename, toolname)
function mcl_autogroup.can_harvest(nodename, toolname, player)
local ndef = minetest.registered_nodes[nodename]
if not ndef then
@ -228,7 +228,9 @@ function mcl_autogroup.can_harvest(nodename, toolname)
end
-- Check if it can be dug by hand
local tdef = minetest.registered_tools[""]
if not player or not player:is_player() then return false end
local name = player:get_inventory():get_stack("hand", 1):get_name()
local tdef = minetest.registered_items[name]
if tdef then
for g, gdef in pairs(tdef._mcl_diggroups) do
if ndef.groups[g] then
@ -260,7 +262,7 @@ local function get_tool_capabilities(tdef)
-- If the damage group and punch interval from hand is not included,
-- then the user will not be able to attack with the tool.
local hand_toolcaps = minetest.registered_tools[""].tool_capabilities
local hand_toolcaps = mcl_meshhand.survival_hand_tool_caps
return {
full_punch_interval = hand_toolcaps.full_punch_interval,
damage_groups = hand_toolcaps.damage_groups
@ -280,7 +282,7 @@ end
-- would have to add _mcl_autogroup as a dependency which would break the mod
-- loading order.
function mcl_autogroup.get_groupcaps(toolname, efficiency)
local tdef = minetest.registered_tools[toolname]
local tdef = minetest.registered_items[toolname]
local groupcaps = table.copy(get_tool_capabilities(tdef).groupcaps or {})
add_groupcaps(toolname, groupcaps, tdef._mcl_diggroups, efficiency)
return groupcaps
@ -350,7 +352,7 @@ local function overwrite()
end
end
for tname, tdef in pairs(minetest.registered_tools) do
for tname, tdef in pairs(minetest.registered_items) do
-- Assign groupcaps for digging the registered digging groups
-- depending on the _mcl_diggroups in the tool definition
if tdef._mcl_diggroups then
@ -360,6 +362,12 @@ local function overwrite()
minetest.override_item(tname, {
tool_capabilities = toolcaps
})
else
-- This is needed to deal damage when punching mobs
-- with random items in hand in survival mode
minetest.override_item(tname, {
tool_capabilities = mcl_meshhand.survival_hand_tool_caps
})
end
end
end

View File

@ -1,10 +1,11 @@
# mcl_autogroup
This mod emulate digging times from mc.
## mcl_autogroup.can_harvest(nodename, toolname)
Return true if <nodename> can be dig with <toolname>.
## mcl_autogroup.can_harvest(nodename, toolname, player)
Return true if <nodename> can be dig with <toolname> by <player>.
* nodename: string, valid nodename
* toolname: (optional) string, valid toolname
* player: (optinal) ObjectRef, valid player
## mcl_autogroup.get_groupcaps(toolname, efficiency)
This function is used to calculate diggroups for tools.

View File

@ -155,7 +155,6 @@ end, true)
minetest.register_on_player_hpchange(function(player, hp_change, mt_reason)
if not damage_enabled then return 0 end
if player:get_hp() > 0 then
mt_reason.approved = true
if hp_change < 0 then
mcl_damage.run_damage_callbacks(player, -hp_change, mcl_damage.from_mt(mt_reason))
end
@ -163,9 +162,7 @@ minetest.register_on_player_hpchange(function(player, hp_change, mt_reason)
end, false)
minetest.register_on_dieplayer(function(player, mt_reason)
if mt_reason.approved then
mcl_damage.run_death_callbacks(player, mcl_damage.from_mt(mt_reason))
end
mcl_damage.run_death_callbacks(player, mcl_damage.from_mt(mt_reason))
minetest.log("action","Player "..player:get_player_name().." died at "..minetest.pos_to_string(vector.round(player:get_pos())))
end)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 B

View File

@ -2,8 +2,8 @@ mcl_util = {}
-- Updates all values in t using values from to*.
function table.update(t, ...)
for _, to in ipairs{...} do
for k,v in pairs(to) do
for _, to in ipairs {...} do
for k, v in pairs(to) do
t[k] = v
end
end
@ -12,8 +12,8 @@ end
-- Updates nil values in t using values from to*.
function table.update_nil(t, ...)
for _, to in ipairs{...} do
for k,v in pairs(to) do
for _, to in ipairs {...} do
for k, v in pairs(to) do
if t[k] == nil then
t[k] = v
end
@ -22,9 +22,9 @@ function table.update_nil(t, ...)
return t
end
local LOGGING_ON = minetest.settings:get_bool("mcl_logging_default",false)
local LOGGING_ON = minetest.settings:get_bool("mcl_logging_default", false)
local LOG_MODULE = "[MCL2]"
function mcl_util.mcl_log (message, module, bypass_default_logger)
function mcl_util.mcl_log(message, module, bypass_default_logger)
local selected_module = LOG_MODULE
if module then
selected_module = module
@ -34,7 +34,6 @@ function mcl_util.mcl_log (message, module, bypass_default_logger)
end
end
function mcl_util.file_exists(name)
if type(name) ~= "string" then return end
local f = io.open(name)
@ -69,7 +68,7 @@ function mcl_util.rotate_axis_and_place(itemstack, placer, pointed_thing, infini
local undef = minetest.registered_nodes[unode.name]
if undef and undef.on_rightclick then
undef.on_rightclick(pointed_thing.under, unode, placer,
itemstack, pointed_thing)
itemstack, pointed_thing)
return
end
local fdir = minetest.dir_to_facedir(placer:get_look_dir())
@ -151,23 +150,23 @@ end
function mcl_util.get_double_container_neighbor_pos(pos, param2, side)
if side == "right" then
if param2 == 0 then
return {x=pos.x-1, y=pos.y, z=pos.z}
return {x = pos.x - 1, y = pos.y, z = pos.z}
elseif param2 == 1 then
return {x=pos.x, y=pos.y, z=pos.z+1}
return {x = pos.x, y = pos.y, z = pos.z + 1}
elseif param2 == 2 then
return {x=pos.x+1, y=pos.y, z=pos.z}
return {x = pos.x + 1, y = pos.y, z = pos.z}
elseif param2 == 3 then
return {x=pos.x, y=pos.y, z=pos.z-1}
return {x = pos.x, y = pos.y, z = pos.z - 1}
end
else
if param2 == 0 then
return {x=pos.x+1, y=pos.y, z=pos.z}
return {x = pos.x + 1, y = pos.y, z = pos.z}
elseif param2 == 1 then
return {x=pos.x, y=pos.y, z=pos.z-1}
return {x = pos.x, y = pos.y, z = pos.z - 1}
elseif param2 == 2 then
return {x=pos.x-1, y=pos.y, z=pos.z}
return {x = pos.x - 1, y = pos.y, z = pos.z}
elseif param2 == 3 then
return {x=pos.x, y=pos.y, z=pos.z+1}
return {x = pos.x, y = pos.y, z = pos.z + 1}
end
end
end
@ -185,7 +184,7 @@ end
function mcl_util.get_eligible_transfer_item_slot(src_inventory, src_list, dst_inventory, dst_list, condition)
local size = src_inventory:get_size(src_list)
local stack
for i=1, size do
for i = 1, size do
stack = src_inventory:get_stack(src_list, i)
if not stack:is_empty() and (condition == nil or condition(stack, src_inventory, src_list, dst_inventory, dst_list)) then
return i
@ -288,10 +287,10 @@ function mcl_util.move_item_container(source_pos, destination_pos, source_list,
-- Main inventory for most container types
if sctype == 2 or sctype == 3 or sctype == 5 or sctype == 6 or sctype == 7 then
source_list = "main"
-- Furnace: output
-- Furnace: output
elseif sctype == 4 then
source_list = "dst"
-- Unknown source container type. Bail out
-- Unknown source container type. Bail out
else
return false
end
@ -344,7 +343,7 @@ function mcl_util.move_item_container(source_pos, destination_pos, source_list,
-- Main inventory for most container types
if dctype == 2 or dctype == 3 or dctype == 5 or dctype == 6 or dctype == 7 then
destination_list = "main"
-- Furnace source slot
-- Furnace source slot
elseif dctype == 4 then
destination_list = "src"
end
@ -409,7 +408,7 @@ end
-- Returns true if item (itemstring or ItemStack) can be used as a furnace fuel.
-- Returns false otherwise
function mcl_util.is_fuel(item)
return minetest.get_craft_result({method="fuel", width=1, items={item}}).time ~= 0
return minetest.get_craft_result({method = "fuel", width = 1, items = {item}}).time ~= 0
end
-- Returns a on_place function for plants
@ -456,7 +455,7 @@ function mcl_util.generate_on_place_plant_function(condition)
if success then
if idef.sounds and idef.sounds.place then
minetest.sound_play(idef.sounds.place, {pos=pointed_thing.above, gain=1}, true)
minetest.sound_play(idef.sounds.place, {pos = pointed_thing.above, gain = 1}, true)
end
end
itemstack = new_itemstack
@ -557,6 +556,11 @@ function mcl_util.deal_damage(target, damage, mcl_reason)
end
end
local is_immortal = target:get_armor_groups().immortal or 0
if is_immortal>0 then
return
end
local hp = target:get_hp()
if hp > 0 then
@ -643,78 +647,80 @@ end
local function roundN(n, d)
if type(n) ~= "number" then return n end
local m = 10^d
return math.floor(n * m + 0.5) / m
local m = 10 ^ d
return math.floor(n * m + 0.5) / m
end
local function close_enough(a,b)
local rt=true
local function close_enough(a, b)
local rt = true
if type(a) == "table" and type(b) == "table" then
for k,v in pairs(a) do
if roundN(v,2) ~= roundN(b[k],2) then
rt=false
for k, v in pairs(a) do
if roundN(v, 2) ~= roundN(b[k], 2) then
rt = false
break
end
end
else
rt = roundN(a,2) == roundN(b,2)
rt = roundN(a, 2) == roundN(b, 2)
end
return rt
end
local function props_changed(props,oldprops)
local changed=false
local p={}
for k,v in pairs(props) do
if not close_enough(v,oldprops[k]) then
p[k]=v
changed=true
local function props_changed(props, oldprops)
local changed = false
local p = {}
for k, v in pairs(props) do
if not close_enough(v, oldprops[k]) then
p[k] = v
changed = true
end
end
return changed,p
return changed, p
end
--tests for roundN
local test_round1=15
local test_round2=15.00199999999
local test_round3=15.00111111
local test_round4=15.00999999
local test_round1 = 15
local test_round2 = 15.00199999999
local test_round3 = 15.00111111
local test_round4 = 15.00999999
assert(roundN(test_round1,2)==roundN(test_round1,2))
assert(roundN(test_round1,2)==roundN(test_round2,2))
assert(roundN(test_round1,2)==roundN(test_round3,2))
assert(roundN(test_round1,2)~=roundN(test_round4,2))
assert(roundN(test_round1, 2) == roundN(test_round1, 2))
assert(roundN(test_round1, 2) == roundN(test_round2, 2))
assert(roundN(test_round1, 2) == roundN(test_round3, 2))
assert(roundN(test_round1, 2) ~= roundN(test_round4, 2))
-- tests for close_enough
local test_cb = {-0.35,0,-0.35,0.35,0.8,0.35} --collisionboxes
local test_cb_close = {-0.351213,0,-0.35,0.35,0.8,0.351212}
local test_cb_diff = {-0.35,0,-1.35,0.35,0.8,0.35}
local test_cb = {-0.35, 0, -0.35, 0.35, 0.8, 0.35} --collisionboxes
local test_cb_close = {-0.351213, 0, -0.35, 0.35, 0.8, 0.351212}
local test_cb_diff = {-0.35, 0, -1.35, 0.35, 0.8, 0.35}
local test_eh = 1.65 --eye height
local test_eh_close = 1.65123123
local test_eh_diff = 1.35
local test_nt = { r = 225, b = 225, a = 225, g = 225 } --nametag
local test_nt_diff = { r = 225, b = 225, a = 0, g = 225 }
local test_nt = {r = 225, b = 225, a = 225, g = 225} --nametag
local test_nt_diff = {r = 225, b = 225, a = 0, g = 225}
assert(close_enough(test_cb,test_cb_close))
assert(not close_enough(test_cb,test_cb_diff))
assert(close_enough(test_eh,test_eh_close))
assert(not close_enough(test_eh,test_eh_diff))
assert(not close_enough(test_nt,test_nt_diff)) --no floats involved here
assert(close_enough(test_cb, test_cb_close))
assert(not close_enough(test_cb, test_cb_diff))
assert(close_enough(test_eh, test_eh_close))
assert(not close_enough(test_eh, test_eh_diff))
assert(not close_enough(test_nt, test_nt_diff)) --no floats involved here
--tests for properties_changed
local test_properties_set1={collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 0.65, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}
local test_properties_set2={collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 1.35, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}
local test_properties_set1 = {collisionbox = {-0.35, 0, -0.35, 0.35, 0.8, 0.35}, eye_height = 0.65,
nametag_color = {r = 225, b = 225, a = 225, g = 225}}
local test_properties_set2 = {collisionbox = {-0.35, 0, -0.35, 0.35, 0.8, 0.35}, eye_height = 1.35,
nametag_color = {r = 225, b = 225, a = 225, g = 225}}
local test_p1,_=props_changed(test_properties_set1,test_properties_set1)
local test_p2,_=props_changed(test_properties_set1,test_properties_set2)
local test_p1, _ = props_changed(test_properties_set1, test_properties_set1)
local test_p2, _ = props_changed(test_properties_set1, test_properties_set2)
assert(not test_p1)
assert(test_p2)
function mcl_util.set_properties(obj,props)
local changed,p=props_changed(props,obj:get_properties())
function mcl_util.set_properties(obj, props)
local changed, p = props_changed(props, obj:get_properties())
if changed then
obj:set_properties(p)
end
@ -728,3 +734,302 @@ function mcl_util.set_bone_position(obj, bone, pos, rot)
obj:set_bone_position(bone, pos or current_pos, rot or current_rot)
end
end
---Return a function to use in `on_place`.
---
---Allow to bypass the `buildable_to` node field in a `on_place` callback.
---
---You have to make sure that the nodes you return true for have `buildable_to = true`.
---@param func fun(node_name: string): boolean Return `true` if node must not replace the buildable_to node which have `node_name`
---@return fun(itemstack: ItemStack, placer: ObjectRef, pointed_thing: pointed_thing, param2: integer): ItemStack?
function mcl_util.bypass_buildable_to(func)
--------------------------
-- MINETEST CODE: UTILS --
--------------------------
local function copy_pointed_thing(pointed_thing)
return {
type = pointed_thing.type,
above = pointed_thing.above and vector.copy(pointed_thing.above),
under = pointed_thing.under and vector.copy(pointed_thing.under),
ref = pointed_thing.ref,
}
end
local function user_name(user)
return user and user:get_player_name() or ""
end
-- Returns a logging function. For empty names, does not log.
local function make_log(name)
return name ~= "" and minetest.log or function() end
end
local function check_attached_node(p, n, group_rating)
local def = core.registered_nodes[n.name]
local d = vector.zero()
if group_rating == 3 then
-- always attach to floor
d.y = -1
elseif group_rating == 4 then
-- always attach to ceiling
d.y = 1
elseif group_rating == 2 then
-- attach to facedir or 4dir direction
if (def.paramtype2 == "facedir" or
def.paramtype2 == "colorfacedir") then
-- Attach to whatever facedir is "mounted to".
-- For facedir, this is where tile no. 5 point at.
-- The fallback vector here is in case 'facedir to dir' is nil due
-- to voxelmanip placing a wallmounted node without resetting a
-- pre-existing param2 value that is out-of-range for facedir.
-- The fallback vector corresponds to param2 = 0.
d = core.facedir_to_dir(n.param2) or vector.new(0, 0, 1)
elseif (def.paramtype2 == "4dir" or
def.paramtype2 == "color4dir") then
-- Similar to facedir handling
d = core.fourdir_to_dir(n.param2) or vector.new(0, 0, 1)
end
elseif def.paramtype2 == "wallmounted" or
def.paramtype2 == "colorwallmounted" then
-- Attach to whatever this node is "mounted to".
-- This where tile no. 2 points at.
-- The fallback vector here is used for the same reason as
-- for facedir nodes.
d = core.wallmounted_to_dir(n.param2) or vector.new(0, 1, 0)
else
d.y = -1
end
local p2 = vector.add(p, d)
local nn = core.get_node(p2).name
local def2 = core.registered_nodes[nn]
if def2 and not def2.walkable then
return false
end
return true
end
return function(itemstack, placer, pointed_thing, param2)
-------------------
-- MINETEST CODE --
-------------------
local def = itemstack:get_definition()
if def.type ~= "node" or pointed_thing.type ~= "node" then
return itemstack
end
local under = pointed_thing.under
local oldnode_under = minetest.get_node_or_nil(under)
local above = pointed_thing.above
local oldnode_above = minetest.get_node_or_nil(above)
local playername = user_name(placer)
local log = make_log(playername)
if not oldnode_under or not oldnode_above then
log("info", playername .. " tried to place"
.. " node in unloaded position " .. minetest.pos_to_string(above))
return itemstack
end
local olddef_under = minetest.registered_nodes[oldnode_under.name]
olddef_under = olddef_under or minetest.nodedef_default
local olddef_above = minetest.registered_nodes[oldnode_above.name]
olddef_above = olddef_above or minetest.nodedef_default
if not olddef_above.buildable_to and not olddef_under.buildable_to then
log("info", playername .. " tried to place"
.. " node in invalid position " .. minetest.pos_to_string(above)
.. ", replacing " .. oldnode_above.name)
return itemstack
end
---------------------
-- CUSTOMIZED CODE --
---------------------
-- Place above pointed node
local place_to = vector.copy(above)
-- If node under is buildable_to, check for callback result and place into it instead
if olddef_under.buildable_to and not func(oldnode_under.name) then
log("info", "node under is buildable to")
place_to = vector.copy(under)
end
-------------------
-- MINETEST CODE --
-------------------
if minetest.is_protected(place_to, playername) then
log("action", playername
.. " tried to place " .. def.name
.. " at protected position "
.. minetest.pos_to_string(place_to))
minetest.record_protection_violation(place_to, playername)
return itemstack
end
local oldnode = minetest.get_node(place_to)
local newnode = {name = def.name, param1 = 0, param2 = param2 or 0}
-- Calculate direction for wall mounted stuff like torches and signs
if def.place_param2 ~= nil then
newnode.param2 = def.place_param2
elseif (def.paramtype2 == "wallmounted" or
def.paramtype2 == "colorwallmounted") and not param2 then
local dir = vector.subtract(under, above)
newnode.param2 = minetest.dir_to_wallmounted(dir)
-- Calculate the direction for furnaces and chests and stuff
elseif (def.paramtype2 == "facedir" or
def.paramtype2 == "colorfacedir" or
def.paramtype2 == "4dir" or
def.paramtype2 == "color4dir") and not param2 then
local placer_pos = placer and placer:get_pos()
if placer_pos then
local dir = vector.subtract(above, placer_pos)
newnode.param2 = minetest.dir_to_facedir(dir)
log("info", "facedir: " .. newnode.param2)
end
end
local metatable = itemstack:get_meta():to_table().fields
-- Transfer color information
if metatable.palette_index and not def.place_param2 then
local color_divisor = nil
if def.paramtype2 == "color" then
color_divisor = 1
elseif def.paramtype2 == "colorwallmounted" then
color_divisor = 8
elseif def.paramtype2 == "colorfacedir" then
color_divisor = 32
elseif def.paramtype2 == "color4dir" then
color_divisor = 4
elseif def.paramtype2 == "colordegrotate" then
color_divisor = 32
end
if color_divisor then
local color = math.floor(metatable.palette_index / color_divisor)
local other = newnode.param2 % color_divisor
newnode.param2 = color * color_divisor + other
end
end
-- Check if the node is attached and if it can be placed there
local an = minetest.get_item_group(def.name, "attached_node")
if an ~= 0 and
not check_attached_node(place_to, newnode, an) then
log("action", "attached node " .. def.name ..
" cannot be placed at " .. minetest.pos_to_string(place_to))
return itemstack
end
log("action", playername .. " places node "
.. def.name .. " at " .. minetest.pos_to_string(place_to))
-- Add node and update
minetest.add_node(place_to, newnode)
-- Play sound if it was done by a player
if playername ~= "" and def.sounds and def.sounds.place then
minetest.sound_play(def.sounds.place, {
pos = place_to,
exclude_player = playername,
}, true)
end
local take_item = true
-- Run callback
if def.after_place_node then
-- Deepcopy place_to and pointed_thing because callback can modify it
local place_to_copy = vector.copy(place_to)
local pointed_thing_copy = copy_pointed_thing(pointed_thing)
if def.after_place_node(place_to_copy, placer, itemstack,
pointed_thing_copy) then
take_item = false
end
end
-- Run script hook
for _, callback in ipairs(minetest.registered_on_placenodes) do
-- Deepcopy pos, node and pointed_thing because callback can modify them
local place_to_copy = vector.copy(place_to)
local newnode_copy = {name = newnode.name, param1 = newnode.param1, param2 = newnode.param2}
local oldnode_copy = {name = oldnode.name, param1 = oldnode.param1, param2 = oldnode.param2}
local pointed_thing_copy = copy_pointed_thing(pointed_thing)
if callback(place_to_copy, newnode_copy, placer, oldnode_copy, itemstack, pointed_thing_copy) then
take_item = false
end
end
if take_item then
itemstack:take_item()
end
return itemstack
end
end
--[[Check for a protection violation in a given area.
--
-- Applies is_protected() to a 3D lattice of points in the defined volume. The points are spaced
-- evenly throughout the volume and have a spacing similar to, but no larger than, "interval".
--
-- @param pos1 A position table of the area volume's first edge.
-- @param pos2 A position table of the area volume's second edge.
-- @param player The player performing the action.
-- @param interval Optional. Max spacing between checked points at the volume.
-- Default: Same as minetest.is_area_protected.
--
-- @return true on protection violation detection. false otherwise.
--
-- @notes *All corners and edges of the defined volume are checked.
]]
function mcl_util.check_area_protection(pos1, pos2, player, interval)
local name = player and player:get_player_name() or ""
local protected_pos = minetest.is_area_protected(pos1, pos2, name, interval)
if protected_pos then
minetest.record_protection_violation(protected_pos, name)
return true
end
return false
end
--[[Check for a protection violation on a single position.
--
-- @param position A position table to check for protection violation.
-- @param player The player performing the action.
--
-- @return true on protection violation detection. false otherwise.
]]
function mcl_util.check_position_protection(position, player)
local name = player and player:get_player_name() or ""
if minetest.is_protected(position, name) then
minetest.record_protection_violation(position, name)
return true
end
return false
end
local palette_indexes = {grass_palette_index = 0, foliage_palette_index = 0, water_palette_index = 0}
function mcl_util.get_palette_indexes_from_pos(pos)
local biome_data = minetest.get_biome_data(pos)
local biome = biome_data.biome
local biome_name = minetest.get_biome_name(biome)
local reg_biome = minetest.registered_biomes[biome_name]
if reg_biome and reg_biome._mcl_grass_palette_index and reg_biome._mcl_foliage_palette_index and reg_biome._mcl_water_palette_index then
local gpi = reg_biome._mcl_grass_palette_index
local fpi = reg_biome._mcl_foliage_palette_index
local wpi = reg_biome._mcl_water_palette_index
local palette_indexes = {grass_palette_index = gpi, foliage_palette_index = fpi, water_palette_index = wpi}
return palette_indexes
else
return palette_indexes
end
end

Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 B

View File

@ -252,10 +252,17 @@ function minetest.handle_node_drops(pos, drops, digger)
-- NOTE: This function override allows digger to be nil.
-- This means there is no digger. This is a special case which allows this function to be called
-- by hand. Creative Mode is intentionally ignored in this case.
if (digger and digger:is_player() and minetest.is_creative_enabled(digger:get_player_name())) or doTileDrops == false then
if digger and digger:is_player() and minetest.is_creative_enabled(digger:get_player_name()) then
local inv = digger:get_inventory()
if inv then
for _, item in ipairs(drops) do
if not inv:contains_item("main", item, true) then
inv:add_item("main", item)
end
end
end
return
end
elseif not doTileDrops then return end
-- Check if node will yield its useful drop by the digger's tool
local dug_node = minetest.get_node(pos)
@ -263,9 +270,9 @@ function minetest.handle_node_drops(pos, drops, digger)
local tool
if digger then
tool = digger:get_wielded_item()
tooldef = minetest.registered_tools[tool:get_name()]
tooldef = minetest.registered_items[tool:get_name()]
if not mcl_autogroup.can_harvest(dug_node.name, tool:get_name()) then
if not mcl_autogroup.can_harvest(dug_node.name, tool:get_name(), digger) then
return
end
end

View File

@ -2,7 +2,7 @@ local S = minetest.get_translator(minetest.get_current_modname())
-- Template rail function
local function register_rail(itemstring, tiles, def_extras, creative)
local groups = {handy=1,pickaxey=1, attached_node=1,rail=1,connect_to_raillike=minetest.raillike_group("rail"),dig_by_water=1,destroy_by_lava_flow=1, transport=1}
local groups = {handy=1,pickaxey=1, attached_node=1,rail=1,connect_to_raillike=minetest.raillike_group("rail"),dig_by_water=0,destroy_by_lava_flow=0, transport=1}
if creative == false then
groups.not_in_creative_inventory = 1
end

Binary file not shown.

Before

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 285 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 259 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 260 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 257 B

View File

@ -2,10 +2,9 @@ local mob_class = mcl_mobs.mob_class
local mob_class_meta = {__index = mcl_mobs.mob_class}
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
-- API for Mobs Redo: MineClone 2 Edition (MRM)
local MAX_MOB_NAME_LENGTH = 30
local DEFAULT_FALL_SPEED = -9.81*1.5
local PATHFINDING = "gowp"
local CRASH_WARN_FREQUENCY = 60
-- Localize
local S = minetest.get_translator("mcl_mobs")
@ -17,27 +16,20 @@ local function mcl_log (message)
end
end
-- Invisibility mod check
mcl_mobs.invis = {}
-- localize math functions
local atann = math.atan
local function atan(x)
if not x or x ~= x then
return 0
else
return atann(x)
end
end
local remove_far = true
local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false
local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false
local mobs_debug = minetest.settings:get_bool("mobs_debug", false) -- Shows helpful debug info above each mob
local spawn_logging = minetest.settings:get_bool("mcl_logging_mobs_spawn",true)
local MAPGEN_LIMIT = mcl_vars.mapgen_limit
local MAPGEN_MOB_LIMIT = MAPGEN_LIMIT - 90
-- 30927 seems to be the edge of the world, so could be closer, but this is safer
-- Peaceful mode message so players will know there are no monsters
if minetest.settings:get_bool("only_peaceful_mobs", false) then
minetest.register_on_joinplayer(function(player)
@ -144,8 +136,8 @@ function mob_class:mob_activate(staticdata, def, dtime)
end
end
if not self.base_texture then
--If textures in definition change, reload textures
if not self.base_texture or (def.textures and table.indexof(def.textures, self.base_texture) == -1) then
-- compatiblity with old simple mobs textures
if type(def.textures[1]) == "string" then
def.textures = {def.textures}
@ -297,150 +289,193 @@ function mob_class:mob_activate(staticdata, def, dtime)
end
end
-- execute current state (stand, walk, run, attacks)
-- returns true if mob has died
function mob_class:do_states(dtime)
--if self.can_open_doors then check_doors(self) end
-- main mob function
function mob_class:on_step(dtime)
self.lifetimer = self.lifetimer - dtime
local pos = self.object:get_pos()
if not pos then return end
if self:check_despawn(pos) then return true end
local d = 0.85
if self:check_dying() then d = 0.92 end
local v = self.object:get_velocity()
if v then
--diffuse object velocity
self.object:set_velocity({x = v.x*d, y = v.y, z = v.z*d})
end
if self:falling(pos) then return end
self:check_suspend()
self:check_water_flow()
local yaw = 0
if self:is_at_water_danger() and self.state ~= "attack" then
if math.random(1, 10) <= 6 then
self:set_velocity(0)
self.state = "stand"
self:set_animation( "stand")
yaw = yaw + math.random(-0.5, 0.5)
yaw = self:set_yaw( yaw, 8)
end
else
if self.move_in_group ~= false then
self:check_herd(dtime)
if self.state == "stand" then
self:do_states_stand()
elseif self.state == PATHFINDING then
self:check_gowp(dtime)
elseif self.state == "walk" then
self:do_states_walk()
elseif self.state == "runaway" then
-- runaway when punched
self:do_states_runaway()
elseif self.state == "attack" then
-- attack routines (explode, dogfight, shoot, dogshoot)
if self:do_states_attack(dtime) then
return true
end
end
end
if self:is_at_cliff_or_danger() then
self:set_velocity(0)
self.state = "stand"
self:set_animation( "stand")
local yaw = self.object:get_yaw() or 0
yaw = self:set_yaw( yaw + 0.78, 8)
end
if not self.fire_resistant then
mcl_burning.tick(self.object, dtime, self)
-- mcl_burning.tick may remove object immediately
if not self.object:get_pos() then return end
end
if mobs_debug then self:update_tag() end
if self.state == "die" then return end
if self.jump_sound_cooloff > 0 then
self.jump_sound_cooloff = self.jump_sound_cooloff - dtime
end
if self.opinion_sound_cooloff > 0 then
self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime
end
--Mob following code.
self:follow_flop()
--set animation speed relitive to velocity
self:set_animation_speed()
self:check_smooth_rotation(dtime)
self:check_head_swivel(dtime)
self:do_jump()
self:set_armor_texture()
self:check_runaway_from()
self:monster_attack()
self:npc_attack()
self:check_breeding()
self:check_aggro(dtime)
-- run custom function (defined in mob lua file)
if self.do_custom then
-- when false skip going any further
if self.do_custom(self, dtime) == false then
return
end
end
-- knockback timer
local function update_timers (self, dtime)
-- knockback timer. set in on_punch
if self.pause_timer > 0 then
self.pause_timer = self.pause_timer - dtime
return
return true
end
-- attack timer
-- attack timer. Not anymore, it seems. Used for also occassionally processing mob step too!
self.timer = self.timer + dtime
if self.state ~= "attack" and self.state ~= PATHFINDING then
if self.timer < 1 then
return
return true
end
self.timer = 0
end
self:check_particlespawners(dtime)
self:check_item_pickup()
-- never go over 100
if self.timer > 100 then
self.timer = 1
end
end
-- mob plays random sound at times
if math.random(1, 70) == 1 then
self:mob_sound("random", true)
function mob_class:outside_limits()
local pos = self.object:get_pos()
if pos then
local posx = math.abs(pos.x)
local posy = math.abs(pos.y)
local posz = math.abs(pos.z)
if posx > MAPGEN_MOB_LIMIT or posy > MAPGEN_MOB_LIMIT or posz > MAPGEN_MOB_LIMIT then
--minetest.log("action", "Getting close to limits of worldgen: " .. minetest.pos_to_string(pos))
if posx > MAPGEN_LIMIT or posy > MAPGEN_LIMIT or posz > MAPGEN_LIMIT then
minetest.log("action", "Warning mob past limits of worldgen: " .. minetest.pos_to_string(pos))
else
if self.state ~= "stand" then
minetest.log("action", "Warning mob close to limits of worldgen: " .. minetest.pos_to_string(pos))
self.state = "stand"
self:set_animation("stand")
self.object:set_acceleration(vector.zero())
self.object:set_velocity(vector.zero())
end
end
return true
end
end
end
local function on_step_work (self, dtime)
local pos = self.object:get_pos()
if not pos then return end
if self:check_despawn(pos, dtime) then return true end
if self:outside_limits() then return end
-- Start: Death/damage processing
-- All damage needs to be undertaken at the start. We need to exit processing if the mob dies.
if self:check_death_and_slow_mob() then
--minetest.log("action", "Mob is dying: ".. tostring(self.name))
-- Do we abandon out of here now?
end
-- environmental damage timer (every 1 second)
self.env_damage_timer = self.env_damage_timer + dtime
if self:falling(pos) then return end
self:check_suspend()
if (self.state == "attack" and self.env_damage_timer > 1)
or self.state ~= "attack" then
self:check_entity_cramming()
self.env_damage_timer = 0
if not self.fire_resistant then
mcl_burning.tick(self.object, dtime, self)
if not self.object:get_pos() then return end -- mcl_burning.tick may remove object immediately
-- check for environmental damage (water, fire, lava etc.)
if self:do_env_damage() then
return
if self:check_for_death("fire", {type = "fire"}) then
return true
end
end
if self:env_damage (dtime, pos) then return end
if self.state == "die" then return end
-- End: Death/damage processing
self:check_water_flow()
self:env_danger_movement_checks (dtime)
self:follow_flop() -- Mob following code.
self:set_animation_speed() -- set animation speed relative to velocity
self:check_smooth_rotation(dtime)
self:check_head_swivel(dtime)
if self.jump_sound_cooloff > 0 then self.jump_sound_cooloff = self.jump_sound_cooloff - dtime end
self:do_jump()
self:check_runaway_from()
self:monster_attack()
self:npc_attack()
self:check_aggro(dtime)
if self.do_custom and self.do_custom(self, dtime) == false then return end
-- In certain circumstances, we abandon processing of certain functionality
local skip_processing = false
if update_timers(self, dtime) then
skip_processing = true
end
if not skip_processing then
self:check_breeding()
self:check_item_pickup()
self:set_armor_texture()
self:check_particlespawners(dtime)
if self.opinion_sound_cooloff > 0 then
self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime
end
-- mob plays random sound at times. Should be 120. Zombie and mob farms are ridiculous
if math.random(1, 70) == 1 then
self:mob_sound("random", true)
end
-- node replace check (cow eats grass etc.)
self:replace(pos)
if self:do_states(dtime) then return end
end
if self:do_states(dtime) then
return
end
if mobs_debug then self:update_tag() end
if not self.object:get_luaentity() then
return false
end
end
local last_crash_warn_time = 0
local on_step_error_handler = function ()
local info = debug.getinfo(1, "SnlufL")
local current_time = os.time()
local time_since_warning = current_time - last_crash_warn_time
--minetest.log("previous_crash_time: " .. current_time)
--minetest.log("last_crash_time: " .. last_crash_warn_time)
--minetest.log("time_since_warning: " .. time_since_warning)
if time_since_warning > CRASH_WARN_FREQUENCY then
last_crash_warn_time = current_time
minetest.log("A game crashing bug was prevented. Please provide debug.log information to MineClone2 dev team for investigation. (Search for: --- Bug report start)")
end
minetest.log("action", "--- Bug report start (please provide a few lines before this also for context) ---")
minetest.log("action", "Stack trace: ".. tostring(debug.traceback()))
minetest.log("action", "Bug info: ".. dump(info))
minetest.log("action", "--- Bug report end ---")
end
-- main mob function
function mob_class:on_step(dtime)
local status, retVal = xpcall(on_step_work, on_step_error_handler, self, dtime)
if status then
return retVal
end
end
local timer = 0
minetest.register_globalstep(function(dtime)
timer = timer + dtime

View File

@ -1,10 +1,9 @@
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
local mob_class = mcl_mobs.mob_class
local MAX_MOB_NAME_LENGTH = 30
local HORNY_TIME = 30
local HORNY_AGAIN_TIME = 300
local CHILD_GROW_TIME = 60*20
local HORNY_AGAIN_TIME = 30 -- was 300 or 15*20
local CHILD_GROW_TIME = 60
local LOGGING_ON = minetest.settings:get_bool("mcl_logging_mobs_villager",false)
@ -179,7 +178,7 @@ function mob_class:check_breeding()
-- jump when fully grown so as not to fall into ground
self.object:set_velocity({
x = 0,
y = self.jump_height*3,
y = self.jump_height,
z = 0
})
end
@ -191,18 +190,16 @@ function mob_class:check_breeding()
end
return
end
else
-- horny animal can mate for HORNY_TIME seconds,
-- afterwards horny animal cannot mate again for HORNY_AGAIN_TIME seconds
if self.horny == true then
self.hornytimer = self.hornytimer + 1
-- horny animal can mate for HORNY_TIME seconds,
-- afterwards horny animal cannot mate again for HORNY_AGAIN_TIME seconds
if self.horny == true
and self.hornytimer < HORNY_TIME + HORNY_AGAIN_TIME then
self.hornytimer = self.hornytimer + 1
if self.hornytimer >= HORNY_TIME + HORNY_AGAIN_TIME then
self.hornytimer = 0
self.horny = false
if self.hornytimer >= HORNY_TIME + HORNY_AGAIN_TIME then
self.hornytimer = 0
self.horny = false
end
end
end

View File

@ -8,6 +8,18 @@ local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false
local stuck_timeout = 3 -- how long before mob gets stuck in place and starts searching
local stuck_path_timeout = 10 -- how long will mob follow path before giving up
local enable_pathfinding = true
local atann = math.atan
local function atan(x)
if not x or x ~= x then
return 0
else
return atann(x)
end
end
-- check if daytime and also if mob is docile during daylight hours
function mob_class:day_docile()
if self.docile_by_day == false then
@ -734,7 +746,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir)
local name = hitter:get_player_name() or ""
-- attack puncher and call other mobs for help
-- attack puncher
if self.passive == false
and self.state ~= "flop"
and (self.child == false or self.type == "monster")
@ -746,37 +758,37 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir)
self:do_attack(hitter)
self._aggro= true
end
end
-- alert others to the attack
local objs = minetest.get_objects_inside_radius(hitter:get_pos(), self.view_range)
local obj = nil
-- alert others to the attack
local objs = minetest.get_objects_inside_radius(hitter:get_pos(), self.view_range)
local obj = nil
for n = 1, #objs do
for n = 1, #objs do
obj = objs[n]:get_luaentity()
obj = objs[n]:get_luaentity()
if obj then
-- only alert members of same mob or friends
if obj.group_attack
and obj.state ~= "attack"
and obj.owner ~= name then
if obj.name == self.name then
obj:do_attack(hitter)
elseif type(obj.group_attack) == "table" then
for i=1, #obj.group_attack do
if obj.name == obj.group_attack[i] then
obj._aggro = true
obj:do_attack(hitter)
break
end
if obj then
-- only alert members of same mob or friends
if obj.group_attack
and obj.state ~= "attack"
and obj.owner ~= name then
if obj.name == self.name then
obj:do_attack(hitter)
elseif type(obj.group_attack) == "table" then
for i=1, #obj.group_attack do
if obj.group_attack[i] == self.name then
obj._aggro = true
obj:do_attack(hitter)
break
end
end
end
end
-- have owned mobs attack player threat
if obj.owner == name and obj.owner_loyal then
obj:do_attack(self.object)
end
-- have owned mobs attack player threat
if obj.owner == name and obj.owner_loyal then
obj:do_attack(self.object)
end
end
end
@ -794,3 +806,397 @@ function mob_class:check_aggro(dtime)
end
self._check_aggro_timer = self._check_aggro_timer + dtime
end
function mob_class:do_states_attack (dtime)
local yaw = self.object:get_yaw() or 0
local s = self.object:get_pos()
local p = self.attack:get_pos() or s
-- stop attacking if player invisible or out of range
if not self.attack
or not self.attack:get_pos()
or not self:object_in_range(self.attack)
or self.attack:get_hp() <= 0
or (self.attack:is_player() and mcl_mobs.invis[ self.attack:get_player_name() ]) then
self.state = "stand"
self:set_velocity( 0)
self:set_animation( "stand")
self.attack = nil
self.v_start = false
self.timer = 0
self.blinktimer = 0
self.path.way = nil
return
end
-- calculate distance from mob and enemy
local dist = vector.distance(p, s)
if self.attack_type == "explode" then
local vec = {
x = p.x - s.x,
z = p.z - s.z
}
yaw = (atan(vec.z / vec.x) +math.pi/ 2) - self.rotate
if p.x > s.x then yaw = yaw +math.pi end
yaw = self:set_yaw( yaw, 0, dtime)
local node_break_radius = self.explosion_radius or 1
local entity_damage_radius = self.explosion_damage_radius
or (node_break_radius * 2)
-- start timer when in reach and line of sight
if not self.v_start
and dist <= self.reach
and self:line_of_sight( s, p, 2) then
self.v_start = true
self.timer = 0
self.blinktimer = 0
self:mob_sound("fuse", nil, false)
-- stop timer if out of reach or direct line of sight
elseif self.allow_fuse_reset
and self.v_start
and (dist >= self.explosiontimer_reset_radius
or not self:line_of_sight( s, p, 2)) then
self.v_start = false
self.timer = 0
self.blinktimer = 0
self.blinkstatus = false
self:remove_texture_mod("^[brighten")
end
-- walk right up to player unless the timer is active
if self.v_start and (self.stop_to_explode or dist < self.reach) then
self:set_velocity( 0)
else
self:set_velocity( self.run_velocity)
end
if self.animation and self.animation.run_start then
self:set_animation( "run")
else
self:set_animation( "walk")
end
if self.v_start then
self.timer = self.timer + dtime
self.blinktimer = (self.blinktimer or 0) + dtime
if self.blinktimer > 0.2 then
self.blinktimer = 0
if self.blinkstatus then
self:remove_texture_mod("^[brighten")
else
self:add_texture_mod("^[brighten")
end
self.blinkstatus = not self.blinkstatus
end
if self.timer > self.explosion_timer then
local pos = self.object:get_pos()
if mobs_griefing and not minetest.is_protected(pos, "") then
mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { drop_chance = 1.0 }, self.object)
else
minetest.sound_play(self.sounds.explode, {
pos = pos,
gain = 1.0,
max_hear_distance = self.sounds.distance or 32
}, true)
self:entity_physics(pos,entity_damage_radius)
mcl_mobs.effect(pos, 32, "mcl_particles_smoke.png", nil, nil, node_break_radius, 1, 0)
end
mcl_burning.extinguish(self.object)
self.object:remove()
return true
end
end
elseif self.attack_type == "dogfight"
or (self.attack_type == "dogshoot" and self:dogswitch(dtime) == 2) and (dist >= self.avoid_distance or not self.shooter_avoid_enemy)
or (self.attack_type == "dogshoot" and dist <= self.reach and self:dogswitch() == 0) then
if self.fly
and dist > self.reach then
local p1 = s
local me_y = math.floor(p1.y)
local p2 = p
local p_y = math.floor(p2.y + 1)
local v = self.object:get_velocity()
if self:flight_check( s) then
if me_y < p_y then
self.object:set_velocity({
x = v.x,
y = 1 * self.walk_velocity,
z = v.z
})
elseif me_y > p_y then
self.object:set_velocity({
x = v.x,
y = -1 * self.walk_velocity,
z = v.z
})
end
else
if me_y < p_y then
self.object:set_velocity({
x = v.x,
y = 0.01,
z = v.z
})
elseif me_y > p_y then
self.object:set_velocity({
x = v.x,
y = -0.01,
z = v.z
})
end
end
end
-- rnd: new movement direction
if self.path.following
and self.path.way
and self.attack_type ~= "dogshoot" then
-- no paths longer than 50
if #self.path.way > 50
or dist < self.reach then
self.path.following = false
return
end
local p1 = self.path.way[1]
if not p1 then
self.path.following = false
return
end
if math.abs(p1.x-s.x) + math.abs(p1.z - s.z) < 0.6 then
-- reached waypoint, remove it from queue
table.remove(self.path.way, 1)
end
-- set new temporary target
p = {x = p1.x, y = p1.y, z = p1.z}
end
local vec = {
x = p.x - s.x,
z = p.z - s.z
}
yaw = (atan(vec.z / vec.x) + math.pi / 2) - self.rotate
if p.x > s.x then yaw = yaw + math.pi end
yaw = self:set_yaw( yaw, 0, dtime)
-- move towards enemy if beyond mob reach
if dist > self.reach then
-- path finding by rnd
if self.pathfinding -- only if mob has pathfinding enabled
and enable_pathfinding then
self:smart_mobs(s, p, dist, dtime)
end
if self:is_at_cliff_or_danger() then
self:set_velocity( 0)
self:set_animation( "stand")
local yaw = self.object:get_yaw() or 0
yaw = self:set_yaw( yaw + 0.78, 8)
else
if self.path.stuck then
self:set_velocity( self.walk_velocity)
else
self:set_velocity( self.run_velocity)
end
if self.animation and self.animation.run_start then
self:set_animation( "run")
else
self:set_animation( "walk")
end
end
else -- rnd: if inside reach range
self.path.stuck = false
self.path.stuck_timer = 0
self.path.following = false -- not stuck anymore
self:set_velocity( 0)
if not self.custom_attack then
if self.timer > 1 then
self.timer = 0
if self.double_melee_attack
and math.random(1, 2) == 1 then
self:set_animation( "punch2")
else
self:set_animation( "punch")
end
local p2 = p
local s2 = s
p2.y = p2.y + .5
s2.y = s2.y + .5
if self:line_of_sight( p2, s2) == true then
-- play attack sound
self:mob_sound("attack")
-- punch player (or what player is attached to)
local attached = self.attack:get_attach()
if attached then
self.attack = attached
end
self.attack:punch(self.object, 1.0, {
full_punch_interval = 1.0,
damage_groups = {fleshy = self.damage}
}, nil)
end
end
else -- call custom attack every second
if self.custom_attack
and self.timer > 1 then
self.timer = 0
self.custom_attack(self, p)
end
end
end
elseif self.attack_type == "shoot"
or (self.attack_type == "dogshoot" and self:dogswitch(dtime) == 1)
or (self.attack_type == "dogshoot" and (dist > self.reach or dist < self.avoid_distance and self.shooter_avoid_enemy) and self:dogswitch() == 0) then
p.y = p.y - .5
s.y = s.y + .5
local dist = vector.distance(p, s)
local vec = {
x = p.x - s.x,
y = p.y - s.y,
z = p.z - s.z
}
yaw = (atan(vec.z / vec.x) +math.pi/ 2) - self.rotate
if p.x > s.x then yaw = yaw +math.pi end
yaw = self:set_yaw( yaw, 0, dtime)
local stay_away_from_player = vector.new(0,0,0)
--strafe back and fourth
--stay away from player so as to shoot them
if dist < self.avoid_distance and self.shooter_avoid_enemy then
self:set_animation( "shoot")
stay_away_from_player=vector.multiply(vector.direction(p, s), 0.33)
end
if self.strafes then
if not self.strafe_direction then
self.strafe_direction = 1.57
end
if math.random(40) == 1 then
self.strafe_direction = self.strafe_direction*-1
end
self.acc = vector.add(vector.multiply(vector.rotate_around_axis(vector.direction(s, p), vector.new(0,1,0), self.strafe_direction), 0.3*self.walk_velocity), stay_away_from_player)
else
self:set_velocity( 0)
end
local p = self.object:get_pos()
p.y = p.y + (self.collisionbox[2] + self.collisionbox[5]) / 2
if self.shoot_interval
and self.timer > self.shoot_interval
and not minetest.raycast(vector.add(p, vector.new(0,self.shoot_offset,0)), vector.add(self.attack:get_pos(), vector.new(0,1.5,0)), false, false):next()
and math.random(1, 100) <= 60 then
self.timer = 0
self:set_animation( "shoot")
-- play shoot attack sound
self:mob_sound("shoot_attack")
-- Shoot arrow
if minetest.registered_entities[self.arrow] then
local arrow, ent
local v = 1
if not self.shoot_arrow then
self.firing = true
minetest.after(1, function()
self.firing = false
end)
arrow = minetest.add_entity(p, self.arrow)
ent = arrow:get_luaentity()
if ent.velocity then
v = ent.velocity
end
ent.switch = 1
ent.owner_id = tostring(self.object) -- add unique owner id to arrow
-- important for mcl_shields
ent._shooter = self.object
ent._saved_shooter_pos = self.object:get_pos()
end
local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5
-- offset makes shoot aim accurate
vec.y = vec.y + self.shoot_offset
vec.x = vec.x * (v / amount)
vec.y = vec.y * (v / amount)
vec.z = vec.z * (v / amount)
if self.shoot_arrow then
vec = vector.normalize(vec)
self:shoot_arrow(p, vec)
else
arrow:set_velocity(vec)
end
end
end
else
end
end

View File

@ -1,4 +1,4 @@
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
local math, tonumber, vector, minetest, mcl_mobs = math, tonumber, vector, minetest, mcl_mobs
local mob_class = mcl_mobs.mob_class
local active_particlespawners = {}
local disable_blood = minetest.settings:get_bool("mobs_disable_blood")
@ -8,6 +8,15 @@ local player_transfer_distance = tonumber(minetest.settings:get("player_transfer
if player_transfer_distance == 0 then player_transfer_distance = math.huge end
local function validate_vector (vect)
if vect then
if tonumber(vect.x) and tonumber(vect.y) and tonumber(vect.z) then
return true
end
end
return false
end
-- custom particle effects
function mcl_mobs.effect(pos, amount, texture, min_size, max_size, radius, gravity, glow, go_down)
@ -116,6 +125,7 @@ function mob_class:mob_sound(soundname, is_opinion, fixed_pitch)
-- randomize the pitch a bit
pitch = pitch + math.random(-10, 10) * 0.005
end
-- Should be 0.1 to 0.2 for mobs. Cow and zombie farms loud. At least have cool down.
minetest.sound_play(sound, {
object = self.object,
gain = 1.0,
@ -279,30 +289,62 @@ local function dir_to_pitch(dir)
return -math.atan2(-dir.y, xz)
end
function mob_class:check_head_swivel(dtime)
if not self.head_swivel or type(self.head_swivel) ~= "string" then return end
local final_rotation = vector.new(0,0,0)
local oldp,oldr = self.object:get_bone_position(self.head_swivel)
local function who_are_you_looking_at (self)
local pos = self.object:get_pos()
for _, obj in pairs(minetest.get_objects_inside_radius(pos, 10)) do
if obj:is_player() and not self.attack or obj:get_luaentity() and obj:get_luaentity().name == self.name and self ~= obj:get_luaentity() then
if not self._locked_object then
if math.random(5000/self.curiosity) == 1 or vector.distance(pos,obj:get_pos())<4 and obj:is_player() then
self._locked_object = obj
end
else
if math.random(10000/self.curiosity) == 1 then
self._locked_object = nil
end
end
end
end
local stop_look_at_player_chance = math.random(833/self.curiosity)
-- was 10000 - div by 12 for avg entities as outside loop
local stop_look_at_player = stop_look_at_player_chance == 1
if self.attack or self.following then
self._locked_object = self.attack or self.following
elseif self._locked_object then
if stop_look_at_player then
--minetest.log("Stop look: ".. self.name)
self._locked_object = nil
end
elseif not self._locked_object then
if math.random(1, 30) then
--minetest.log("Change look check: ".. self.name)
-- For the wither this was 20/60=0.33, so probably need to rebalance and divide rates.
-- but frequency of check isn't good as it is costly. Making others too infrequent requires testing
local chance = 20/self.curiosity
if chance < 1 then chance = 1 end
local look_at_player_chance = math.random(chance)
-- was 5000 but called in loop based on entities. so div by 12 as estimate avg of entities found,
-- then div by 20 as less freq lookup
local look_at_player = look_at_player_chance == 1
for _, obj in pairs(minetest.get_objects_inside_radius(pos, 8)) do
if obj:is_player() and vector.distance(pos,obj:get_pos()) < 4 then
--minetest.log("Change look to player: ".. self.name)
self._locked_object = obj
break
elseif obj:is_player() or (obj:get_luaentity() and obj:get_luaentity().name == self.name and self ~= obj:get_luaentity()) then
if look_at_player then
--minetest.log("Change look to mob: ".. self.name)
self._locked_object = obj
break
end
end
end
end
end
end
function mob_class:check_head_swivel(dtime)
if not self.head_swivel or type(self.head_swivel) ~= "string" then return end
who_are_you_looking_at (self)
local final_rotation = vector.new(0,0,0)
local oldp,oldr = self.object:get_bone_position(self.head_swivel)
if self._locked_object and (self._locked_object:is_player() or self._locked_object:get_luaentity()) and self._locked_object:get_hp() > 0 then
local _locked_object_eye_height = 1.5
@ -317,6 +359,7 @@ function mob_class:check_head_swivel(dtime)
if self.object:get_attach() then
self_rot = self.object:get_attach():get_rotation()
end
if self.rot then
local player_pos = self._locked_object:get_pos()
local direction_player = vector.direction(vector.add(self.object:get_pos(), vector.new(0, self.head_eye_height*.7, 0)), vector.add(player_pos, vector.new(0, _locked_object_eye_height, 0)))
@ -345,12 +388,14 @@ function mob_class:check_head_swivel(dtime)
elseif not self._locked_object and math.abs(oldr.y) > 3 and math.abs(oldr.x) < 3 then
final_rotation = vector.multiply(oldr, 0.9)
else
final_rotation = vector.new(0,0,0)
--final_rotation = vector.new(0,0,0)
end
mcl_util.set_bone_position(self.object,self.head_swivel, vector.new(0,self.bone_eye_height,self.horrizonatal_head_height), final_rotation)
end
function mob_class:set_animation_speed()
local v = self.object:get_velocity()
if v then
@ -366,7 +411,7 @@ function mob_class:set_animation_speed()
end
end
--set_speed
if self.acc then
if validate_vector(self.acc) then
self.object:add_velocity(self.acc)
end
end

View File

@ -489,7 +489,7 @@ function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addeg
on_place = function(itemstack, placer, pointed_thing)
local pos = pointed_thing.above
-- am I clicking on something with existing on_rightclick function?
local under = minetest.get_node(pointed_thing.under)
local def = minetest.registered_nodes[under.name]
@ -503,6 +503,8 @@ function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addeg
local name = placer:get_player_name()
local privs = minetest.get_player_privs(name)
local dim = mcl_worlds.pos_to_dimension(placer:get_pos())
local mob_light_lvl = {mcl_mobs:mob_light_lvl(itemstack:get_name(),dim)}
if under.name == "mcl_mobspawners:spawner" then
if minetest.is_protected(pointed_thing.under, name) then
minetest.record_protection_violation(pointed_thing.under, name)
@ -512,7 +514,7 @@ function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addeg
minetest.chat_send_player(name, S("You need the “maphack” privilege to change the mob spawner."))
return itemstack
end
mcl_mobspawners.setup_spawner(pointed_thing.under, itemstack:get_name())
mcl_mobspawners.setup_spawner(pointed_thing.under, itemstack:get_name(), mob_light_lvl[1], mob_light_lvl[2])
if not minetest.is_creative_enabled(name) then
itemstack:take_item()
end

View File

@ -4,7 +4,6 @@ local DEFAULT_FALL_SPEED = -9.81*1.5
local FLOP_HEIGHT = 6
local FLOP_HOR_SPEED = 1.5
local PATHFINDING = "gowp"
local enable_pathfinding = true
local node_ice = "mcl_core:ice"
local node_snowblock = "mcl_core:snowblock"
@ -240,9 +239,15 @@ function mob_class:is_at_water_danger()
return false
end
local yaw = self.object:get_yaw()
local pos = self.object:get_pos()
if not yaw or not pos then
return
end
local dir_x = -math.sin(yaw) * (self.collisionbox[4] + 0.5)
local dir_z = math.cos(yaw) * (self.collisionbox[4] + 0.5)
local pos = self.object:get_pos()
local ypos = pos.y + self.collisionbox[2] -- just above floor
local free_fall, blocker = minetest.line_of_sight(
@ -269,6 +274,32 @@ function mob_class:is_at_water_danger()
return false
end
function mob_class:env_danger_movement_checks(dtime)
local yaw = 0
if self:is_at_water_danger() and self.state ~= "attack" then
if math.random(1, 10) <= 6 then
self:set_velocity(0)
self.state = "stand"
self:set_animation( "stand")
yaw = yaw + math.random(-0.5, 0.5)
yaw = self:set_yaw( yaw, 8)
end
else
-- This code should probably be moved to movement code
if self.move_in_group ~= false then
self:check_herd(dtime)
end
end
if self:is_at_cliff_or_danger() then
self:set_velocity(0)
self.state = "stand"
self:set_animation( "stand")
local yaw = self.object:get_yaw() or 0
yaw = self:set_yaw( yaw + 0.78, 8)
end
end
-- jump if facing a solid node (not fences or gates)
function mob_class:do_jump()
if not self.jump
@ -429,7 +460,7 @@ end
-- find and replace what mob is looking for (grass, wheat etc.)
function mob_class:replace(pos)
function mob_class:replace_node(pos)
if not self.replace_rate
or not self.replace_what
@ -769,591 +800,190 @@ function mob_class:teleport(target)
end
end
-- execute current state (stand, walk, run, attacks)
-- returns true if mob has died
function mob_class:do_states(dtime)
--if self.can_open_doors then check_doors(self) end
function mob_class:do_states_walk()
local yaw = self.object:get_yaw() or 0
if self.state == "stand" then
if math.random(1, 4) == 1 then
local s = self.object:get_pos()
local lp = nil
-- is there something I need to avoid?
if (self.water_damage > 0
and self.lava_damage > 0)
or self.breath_max ~= -1 then
lp = minetest.find_node_near(s, 1, {"group:water", "group:lava"})
elseif self.water_damage > 0 then
lp = minetest.find_node_near(s, 1, {"group:water"})
elseif self.lava_damage > 0 then
lp = minetest.find_node_near(s, 1, {"group:lava"})
elseif self.fire_damage > 0 then
lp = minetest.find_node_near(s, 1, {"group:fire"})
end
local is_in_danger = false
if lp then
-- If mob in or on dangerous block, look for land
if (self:is_node_dangerous(self.standing_in) or
self:is_node_dangerous(self.standing_on)) or (self:is_node_waterhazard(self.standing_in) or self:is_node_waterhazard(self.standing_on)) and (not self.fly) then
is_in_danger = true
-- If mob in or on dangerous block, look for land
if is_in_danger then
-- Better way to find shore - copied from upstream
lp = minetest.find_nodes_in_area_under_air(
{x = s.x - 5, y = s.y - 0.5, z = s.z - 5},
{x = s.x + 5, y = s.y + 1, z = s.z + 5},
{"group:solid"})
lp = #lp > 0 and lp[math.random(#lp)]
-- did we find land?
if lp then
local vec = {
x = lp.x - s.x,
z = lp.z - s.z
}
yaw = (atan(vec.z / vec.x) +math.pi/ 2) - self.rotate
if lp.x > s.x then yaw = yaw +math.pi end
-- look towards land and move in that direction
yaw = self:set_yaw( yaw, 6)
self:set_velocity(self.walk_velocity)
local s = self.object:get_pos()
local objs = minetest.get_objects_inside_radius(s, 3)
local lp
for n = 1, #objs do
if objs[n]:is_player() then
lp = objs[n]:get_pos()
break
end
end
-- look at any players nearby, otherwise turn randomly
if lp and self.look_at_players then
local vec = {
x = lp.x - s.x,
z = lp.z - s.z
}
yaw = (atan(vec.z / vec.x) +math.pi/ 2) - self.rotate
if lp.x > s.x then yaw = yaw +math.pi end
else
yaw = yaw + math.random(-0.5, 0.5)
end
yaw = self:set_yaw( yaw, 8)
end
if self.order == "sit" then
self:set_animation( "sit")
self:set_velocity(0)
else
self:set_animation( "stand")
self:set_velocity(0)
end
-- npc's ordered to stand stay standing
if self.order == "stand" or self.order == "sleep" or self.order == "work" then
else
if self.walk_chance ~= 0
and self.facing_fence ~= true
and math.random(1, 100) <= self.walk_chance
and self:is_at_cliff_or_danger() == false then
self:set_velocity(self.walk_velocity)
self.state = "walk"
self:set_animation( "walk")
end
end
elseif self.state == PATHFINDING then
self:check_gowp(dtime)
elseif self.state == "walk" then
local s = self.object:get_pos()
local lp = nil
-- is there something I need to avoid?
if (self.water_damage > 0
and self.lava_damage > 0)
or self.breath_max ~= -1 then
lp = minetest.find_node_near(s, 1, {"group:water", "group:lava"})
elseif self.water_damage > 0 then
lp = minetest.find_node_near(s, 1, {"group:water"})
elseif self.lava_damage > 0 then
lp = minetest.find_node_near(s, 1, {"group:lava"})
elseif self.fire_damage > 0 then
lp = minetest.find_node_near(s, 1, {"group:fire"})
end
local is_in_danger = false
if lp then
-- If mob in or on dangerous block, look for land
if (self:is_node_dangerous(self.standing_in) or
self:is_node_dangerous(self.standing_on)) or (self:is_node_waterhazard(self.standing_in) or self:is_node_waterhazard(self.standing_on)) and (not self.fly) then
is_in_danger = true
-- If mob in or on dangerous block, look for land
if is_in_danger then
-- Better way to find shore - copied from upstream
lp = minetest.find_nodes_in_area_under_air(
{x = s.x - 5, y = s.y - 0.5, z = s.z - 5},
{x = s.x + 5, y = s.y + 1, z = s.z + 5},
{"group:solid"})
lp = #lp > 0 and lp[math.random(#lp)]
-- did we find land?
if lp then
local vec = {
x = lp.x - s.x,
z = lp.z - s.z
}
yaw = (atan(vec.z / vec.x) +math.pi/ 2) - self.rotate
if lp.x > s.x then yaw = yaw +math.pi end
-- look towards land and move in that direction
yaw = self:set_yaw( yaw, 6)
self:set_velocity(self.walk_velocity)
end
end
-- A danger is near but mob is not inside
else
else
-- Randomly turn
if math.random(1, 100) <= 30 then
yaw = yaw + math.random(-0.5, 0.5)
yaw = self:set_yaw( yaw, 8)
end
-- Randomly turn
if math.random(1, 100) <= 30 then
yaw = yaw + math.random(-0.5, 0.5)
yaw = self:set_yaw( yaw, 8)
end
end
yaw = self:set_yaw( yaw, 8)
yaw = self:set_yaw( yaw, 8)
-- otherwise randomly turn
elseif math.random(1, 100) <= 30 then
yaw = yaw + math.random(-0.5, 0.5)
yaw = self:set_yaw( yaw, 8)
end
elseif math.random(1, 100) <= 30 then
yaw = yaw + math.random(-0.5, 0.5)
yaw = self:set_yaw( yaw, 8)
end
-- stand for great fall or danger or fence in front
local cliff_or_danger = false
if is_in_danger then
cliff_or_danger = self:is_at_cliff_or_danger()
end
if self.facing_fence == true
or cliff_or_danger
or math.random(1, 100) <= 30 then
-- stand for great fall or danger or fence in front
local cliff_or_danger = false
if is_in_danger then
cliff_or_danger = self:is_at_cliff_or_danger()
end
if self.facing_fence == true
or cliff_or_danger
or math.random(1, 100) <= 30 then
self:set_velocity(0)
self.state = "stand"
self:set_animation( "stand")
local yaw = self.object:get_yaw() or 0
yaw = self:set_yaw( yaw + 0.78, 8)
self:set_velocity(0)
self.state = "stand"
self:set_animation( "stand")
local yaw = self.object:get_yaw() or 0
yaw = self:set_yaw( yaw + 0.78, 8)
else
self:set_velocity(self.walk_velocity)
if self:flight_check()
and self.animation
and self.animation.fly_start
and self.animation.fly_end then
self:set_animation( "fly")
else
self:set_velocity(self.walk_velocity)
if self:flight_check()
and self.animation
and self.animation.fly_start
and self.animation.fly_end then
self:set_animation( "fly")
else
self:set_animation( "walk")
end
end
-- runaway when punched
elseif self.state == "runaway" then
self.runaway_timer = self.runaway_timer + 1
-- stop after 5 seconds or when at cliff
if self.runaway_timer > 5
or self:is_at_cliff_or_danger() then
self.runaway_timer = 0
self:set_velocity(0)
self.state = "stand"
self:set_animation( "stand")
local yaw = self.object:get_yaw() or 0
yaw = self:set_yaw( yaw + 0.78, 8)
else
self:set_velocity( self.run_velocity)
self:set_animation( "run")
end
-- attack routines (explode, dogfight, shoot, dogshoot)
elseif self.state == "attack" then
local s = self.object:get_pos()
local p = self.attack:get_pos() or s
-- stop attacking if player invisible or out of range
if not self.attack
or not self.attack:get_pos()
or not self:object_in_range(self.attack)
or self.attack:get_hp() <= 0
or (self.attack:is_player() and mcl_mobs.invis[ self.attack:get_player_name() ]) then
self.state = "stand"
self:set_velocity( 0)
self:set_animation( "stand")
self.attack = nil
self.v_start = false
self.timer = 0
self.blinktimer = 0
self.path.way = nil
return
end
-- calculate distance from mob and enemy
local dist = vector.distance(p, s)
if self.attack_type == "explode" then
local vec = {
x = p.x - s.x,
z = p.z - s.z
}
yaw = (atan(vec.z / vec.x) +math.pi/ 2) - self.rotate
if p.x > s.x then yaw = yaw +math.pi end
yaw = self:set_yaw( yaw, 0, dtime)
local node_break_radius = self.explosion_radius or 1
local entity_damage_radius = self.explosion_damage_radius
or (node_break_radius * 2)
-- start timer when in reach and line of sight
if not self.v_start
and dist <= self.reach
and self:line_of_sight( s, p, 2) then
self.v_start = true
self.timer = 0
self.blinktimer = 0
self:mob_sound("fuse", nil, false)
-- stop timer if out of reach or direct line of sight
elseif self.allow_fuse_reset
and self.v_start
and (dist >= self.explosiontimer_reset_radius
or not self:line_of_sight( s, p, 2)) then
self.v_start = false
self.timer = 0
self.blinktimer = 0
self.blinkstatus = false
self:remove_texture_mod("^[brighten")
end
-- walk right up to player unless the timer is active
if self.v_start and (self.stop_to_explode or dist < self.reach) then
self:set_velocity( 0)
else
self:set_velocity( self.run_velocity)
end
if self.animation and self.animation.run_start then
self:set_animation( "run")
else
self:set_animation( "walk")
end
if self.v_start then
self.timer = self.timer + dtime
self.blinktimer = (self.blinktimer or 0) + dtime
if self.blinktimer > 0.2 then
self.blinktimer = 0
if self.blinkstatus then
self:remove_texture_mod("^[brighten")
else
self:add_texture_mod("^[brighten")
end
self.blinkstatus = not self.blinkstatus
end
if self.timer > self.explosion_timer then
local pos = self.object:get_pos()
if mobs_griefing and not minetest.is_protected(pos, "") then
mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { drop_chance = 1.0 }, self.object)
else
minetest.sound_play(self.sounds.explode, {
pos = pos,
gain = 1.0,
max_hear_distance = self.sounds.distance or 32
}, true)
self:entity_physics(pos,entity_damage_radius)
mcl_mobs.effect(pos, 32, "mcl_particles_smoke.png", nil, nil, node_break_radius, 1, 0)
end
mcl_burning.extinguish(self.object)
self.object:remove()
return true
end
end
elseif self.attack_type == "dogfight"
or (self.attack_type == "dogshoot" and self:dogswitch(dtime) == 2) and (dist >= self.avoid_distance or not self.shooter_avoid_enemy)
or (self.attack_type == "dogshoot" and dist <= self.reach and self:dogswitch() == 0) then
if self.fly
and dist > self.reach then
local p1 = s
local me_y = math.floor(p1.y)
local p2 = p
local p_y = math.floor(p2.y + 1)
local v = self.object:get_velocity()
if self:flight_check( s) then
if me_y < p_y then
self.object:set_velocity({
x = v.x,
y = 1 * self.walk_velocity,
z = v.z
})
elseif me_y > p_y then
self.object:set_velocity({
x = v.x,
y = -1 * self.walk_velocity,
z = v.z
})
end
else
if me_y < p_y then
self.object:set_velocity({
x = v.x,
y = 0.01,
z = v.z
})
elseif me_y > p_y then
self.object:set_velocity({
x = v.x,
y = -0.01,
z = v.z
})
end
end
end
-- rnd: new movement direction
if self.path.following
and self.path.way
and self.attack_type ~= "dogshoot" then
-- no paths longer than 50
if #self.path.way > 50
or dist < self.reach then
self.path.following = false
return
end
local p1 = self.path.way[1]
if not p1 then
self.path.following = false
return
end
if math.abs(p1.x-s.x) + math.abs(p1.z - s.z) < 0.6 then
-- reached waypoint, remove it from queue
table.remove(self.path.way, 1)
end
-- set new temporary target
p = {x = p1.x, y = p1.y, z = p1.z}
end
local vec = {
x = p.x - s.x,
z = p.z - s.z
}
yaw = (atan(vec.z / vec.x) + math.pi / 2) - self.rotate
if p.x > s.x then yaw = yaw + math.pi end
yaw = self:set_yaw( yaw, 0, dtime)
-- move towards enemy if beyond mob reach
if dist > self.reach then
-- path finding by rnd
if self.pathfinding -- only if mob has pathfinding enabled
and enable_pathfinding then
self:smart_mobs(s, p, dist, dtime)
end
if self:is_at_cliff_or_danger() then
self:set_velocity( 0)
self:set_animation( "stand")
local yaw = self.object:get_yaw() or 0
yaw = self:set_yaw( yaw + 0.78, 8)
else
if self.path.stuck then
self:set_velocity( self.walk_velocity)
else
self:set_velocity( self.run_velocity)
end
if self.animation and self.animation.run_start then
self:set_animation( "run")
else
self:set_animation( "walk")
end
end
else -- rnd: if inside reach range
self.path.stuck = false
self.path.stuck_timer = 0
self.path.following = false -- not stuck anymore
self:set_velocity( 0)
if not self.custom_attack then
if self.timer > 1 then
self.timer = 0
if self.double_melee_attack
and math.random(1, 2) == 1 then
self:set_animation( "punch2")
else
self:set_animation( "punch")
end
local p2 = p
local s2 = s
p2.y = p2.y + .5
s2.y = s2.y + .5
if self:line_of_sight( p2, s2) == true then
-- play attack sound
self:mob_sound("attack")
-- punch player (or what player is attached to)
local attached = self.attack:get_attach()
if attached then
self.attack = attached
end
self.attack:punch(self.object, 1.0, {
full_punch_interval = 1.0,
damage_groups = {fleshy = self.damage}
}, nil)
end
end
else -- call custom attack every second
if self.custom_attack
and self.timer > 1 then
self.timer = 0
self.custom_attack(self, p)
end
end
end
elseif self.attack_type == "shoot"
or (self.attack_type == "dogshoot" and self:dogswitch(dtime) == 1)
or (self.attack_type == "dogshoot" and (dist > self.reach or dist < self.avoid_distance and self.shooter_avoid_enemy) and self:dogswitch() == 0) then
p.y = p.y - .5
s.y = s.y + .5
local dist = vector.distance(p, s)
local vec = {
x = p.x - s.x,
y = p.y - s.y,
z = p.z - s.z
}
yaw = (atan(vec.z / vec.x) +math.pi/ 2) - self.rotate
if p.x > s.x then yaw = yaw +math.pi end
yaw = self:set_yaw( yaw, 0, dtime)
local stay_away_from_player = vector.new(0,0,0)
--strafe back and fourth
--stay away from player so as to shoot them
if dist < self.avoid_distance and self.shooter_avoid_enemy then
self:set_animation( "shoot")
stay_away_from_player=vector.multiply(vector.direction(p, s), 0.33)
end
if self.strafes then
if not self.strafe_direction then
self.strafe_direction = 1.57
end
if math.random(40) == 1 then
self.strafe_direction = self.strafe_direction*-1
end
self.acc = vector.add(vector.multiply(vector.rotate_around_axis(vector.direction(s, p), vector.new(0,1,0), self.strafe_direction), 0.3*self.walk_velocity), stay_away_from_player)
else
self:set_velocity( 0)
end
local p = self.object:get_pos()
p.y = p.y + (self.collisionbox[2] + self.collisionbox[5]) / 2
if self.shoot_interval
and self.timer > self.shoot_interval
and not minetest.raycast(vector.add(p, vector.new(0,self.shoot_offset,0)), vector.add(self.attack:get_pos(), vector.new(0,1.5,0)), false, false):next()
and math.random(1, 100) <= 60 then
self.timer = 0
self:set_animation( "shoot")
-- play shoot attack sound
self:mob_sound("shoot_attack")
-- Shoot arrow
if minetest.registered_entities[self.arrow] then
local arrow, ent
local v = 1
if not self.shoot_arrow then
self.firing = true
minetest.after(1, function()
self.firing = false
end)
arrow = minetest.add_entity(p, self.arrow)
ent = arrow:get_luaentity()
if ent.velocity then
v = ent.velocity
end
ent.switch = 1
ent.owner_id = tostring(self.object) -- add unique owner id to arrow
-- important for mcl_shields
ent._shooter = self.object
ent._saved_shooter_pos = self.object:get_pos()
end
local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5
-- offset makes shoot aim accurate
vec.y = vec.y + self.shoot_offset
vec.x = vec.x * (v / amount)
vec.y = vec.y * (v / amount)
vec.z = vec.z * (v / amount)
if self.shoot_arrow then
vec = vector.normalize(vec)
self:shoot_arrow(p, vec)
else
arrow:set_velocity(vec)
end
end
end
else
self:set_animation( "walk")
end
end
end
function mob_class:do_states_stand()
local yaw = self.object:get_yaw() or 0
if math.random(1, 4) == 1 then
local s = self.object:get_pos()
local objs = minetest.get_objects_inside_radius(s, 3)
local lp
for n = 1, #objs do
if objs[n]:is_player() then
lp = objs[n]:get_pos()
break
end
end
-- look at any players nearby, otherwise turn randomly
if lp and self.look_at_players then
local vec = {
x = lp.x - s.x,
z = lp.z - s.z
}
yaw = (atan(vec.z / vec.x) +math.pi/ 2) - self.rotate
if lp.x > s.x then yaw = yaw +math.pi end
else
yaw = yaw + math.random(-0.5, 0.5)
end
yaw = self:set_yaw( yaw, 8)
end
if self.order == "sit" then
self:set_animation( "sit")
self:set_velocity(0)
else
self:set_animation( "stand")
self:set_velocity(0)
end
-- npc's ordered to stand stay standing
if self.order == "stand" or self.order == "sleep" or self.order == "work" then
else
if self.walk_chance ~= 0
and self.facing_fence ~= true
and math.random(1, 100) <= self.walk_chance
and self:is_at_cliff_or_danger() == false then
self:set_velocity(self.walk_velocity)
self.state = "walk"
self:set_animation( "walk")
end
end
end
function mob_class:do_states_runaway()
local yaw = self.object:get_yaw() or 0
self.runaway_timer = self.runaway_timer + 1
-- stop after 5 seconds or when at cliff
if self.runaway_timer > 5
or self:is_at_cliff_or_danger() then
self.runaway_timer = 0
self:set_velocity(0)
self.state = "stand"
self:set_animation( "stand")
local yaw = self.object:get_yaw() or 0
yaw = self:set_yaw( yaw + 0.78, 8)
else
self:set_velocity( self.run_velocity)
self:set_animation( "run")
end
end
function mob_class:check_smooth_rotation(dtime)
-- smooth rotation by ThomasMonroe314
if self._turn_to then

View File

@ -1,11 +1,27 @@
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
local mob_class = mcl_mobs.mob_class
local LOGGING_ON = minetest.settings:get_bool("mcl_logging_mobs_villager",false)
local PATHFINDING = "gowp"
local enable_pathfinding = true
local PATHFINDING_FAIL_THRESHOLD = 100 -- no. of ticks to fail before giving up. 20p/s. 5s helps them get through door
local PATHFINDING_FAIL_WAIT = 30 -- how long to wait before trying to path again
local PATHING_START_DELAY = 4 -- When doing non-prioritised pathing, how long to wait until last mob pathed
local LOG_MODULE = "[Mobs]"
local PATHFINDING_SEARCH_DISTANCE = 50 -- How big the square is that pathfinding will look
local PATHFINDING = "gowp"
local one_down = vector.new(0,-1,0)
local one_up = vector.new(0,1,0)
local plane_adjacents = {
vector.new(1,0,0),
vector.new(-1,0,0),
vector.new(0,0,1),
vector.new(0,0,-1),
}
local LOGGING_ON = minetest.settings:get_bool("mcl_logging_mobs_pathfinding",false)
local LOG_MODULE = "[Mobs Pathfinding]"
local function mcl_log (message)
if LOGGING_ON and message then
minetest.log(LOG_MODULE .. " " .. message)
@ -21,7 +37,7 @@ function output_table (wp)
end
function append_paths (wp1, wp2)
mcl_log("Start append")
--mcl_log("Start append")
if not wp1 or not wp2 then
mcl_log("Cannot append wp's")
return
@ -31,7 +47,7 @@ function append_paths (wp1, wp2)
for _,a in pairs (wp2) do
table.insert(wp1, a)
end
mcl_log("End append")
--mcl_log("End append")
end
local function output_enriched (wp_out)
@ -43,11 +59,12 @@ local function output_enriched (wp_out)
local action = outy["action"]
if action then
--mcl_log("Pos ".. i ..":" .. minetest.pos_to_string(outy["pos"]))
mcl_log("type: " .. action["type"])
mcl_log("action: " .. action["action"])
mcl_log("target: " .. minetest.pos_to_string(action["target"]))
end
mcl_log("failed attempts: " .. outy["failed_attempts"])
--mcl_log("failed attempts: " .. outy["failed_attempts"])
end
end
@ -56,34 +73,26 @@ end
-- an action, such as to open or close a door where we know that pos requires that action
local function generate_enriched_path(wp_in, door_open_pos, door_close_pos, cur_door_pos)
local wp_out = {}
-- TODO Just pass in door position and the index before is open, the index after is close
local current_door_index = -1
for i, cur_pos in pairs(wp_in) do
local action = nil
local one_down = vector.new(0,-1,0)
local cur_pos_to_add = vector.add(cur_pos, one_down)
if door_open_pos and vector.equals (cur_pos, door_open_pos) then
mcl_log ("Door open match")
--action = {type = "door", action = "open"}
action = {}
action["type"] = "door"
action["action"] = "open"
action["target"] = cur_door_pos
action = {type = "door", action = "open", target = cur_door_pos}
cur_pos_to_add = vector.add(cur_pos, one_down)
elseif door_close_pos and vector.equals(cur_pos, door_close_pos) then
mcl_log ("Door close match")
--action = {type = "door", action = "closed"}
action = {}
action["type"] = "door"
action["action"] = "close"
action["target"] = cur_door_pos
action = {type = "door", action = "close", target = cur_door_pos}
cur_pos_to_add = vector.add(cur_pos, one_down)
elseif cur_door_pos and vector.equals(cur_pos, cur_door_pos) then
mcl_log("Current door pos")
action = {type = "door", action = "open", target = cur_door_pos}
cur_pos_to_add = vector.add(cur_pos, one_down)
action = {}
action["type"] = "door"
action["action"] = "open"
action["target"] = cur_door_pos
else
cur_pos_to_add = cur_pos
--mcl_log ("Pos doesn't match")
@ -101,106 +110,166 @@ local function generate_enriched_path(wp_in, door_open_pos, door_close_pos, cur_
return wp_out
end
local plane_adjacents = {
vector.new(1,0,0),
vector.new(-1,0,0),
vector.new(0,0,1),
vector.new(0,0,-1),
}
local last_pathing_time = os.time()
function mob_class:ready_to_path(prioritised)
mcl_log("Check ready to path")
if self._pf_last_failed and (os.time() - self._pf_last_failed) < PATHFINDING_FAIL_WAIT then
mcl_log("Not ready to path as last fail is less than threshold: " .. (os.time() - self._pf_last_failed))
return false
else
local time_since_path_start = os.time() - last_pathing_time
mcl_log("time_since_path_start: " .. tostring(time_since_path_start))
if prioritised or (time_since_path_start) > PATHING_START_DELAY then
mcl_log("We are ready to pathfind, no previous fail or we are past threshold")
return true
end
end
end
-- This function is used to see if we can path. We could use to check a route, rather than making people move.
local function calculate_path_through_door (p, t, target)
-- target is the same as t, just 1 square difference. Maybe we don't need target
mcl_log("Plot route from mob: " .. minetest.pos_to_string(p) .. ", to target: " .. minetest.pos_to_string(t))
local function calculate_path_through_door (p, cur_door_pos, t)
if t then
mcl_log("Plot route through door from pos: " .. minetest.pos_to_string(p) .. ", to target: " .. minetest.pos_to_string(t))
else
mcl_log("Plot route through door from pos: " .. minetest.pos_to_string(p))
end
local enriched_path = nil
local wp, prospective_wp
local cur_door_pos = nil
local pos_closest_to_door = nil
local other_side_of_door = nil
--Path to door first
local wp = minetest.find_path(p,t,150,1,4)
if not wp then
mcl_log("No direct path. Path through door")
if cur_door_pos then
mcl_log("Found a door near: " .. minetest.pos_to_string(cur_door_pos))
-- This could improve. There could be multiple doors. Check you can path from door to target first.
local cur_door_pos = minetest.find_node_near(target,16,{"group:door"})
if cur_door_pos then
mcl_log("Found a door near: " .. minetest.pos_to_string(cur_door_pos))
for _,v in pairs(plane_adjacents) do
pos_closest_to_door = vector.add(cur_door_pos,v)
for _,v in pairs(plane_adjacents) do
pos_closest_to_door = vector.add(cur_door_pos,v)
other_side_of_door = vector.add(cur_door_pos,-v)
local n = minetest.get_node(pos_closest_to_door)
if n.name == "air" then
wp = minetest.find_path(p,pos_closest_to_door,150,1,4)
if wp then
mcl_log("Found a path to next to door".. minetest.pos_to_string(pos_closest_to_door))
other_side_of_door = vector.add(cur_door_pos,-v)
mcl_log("Opposite is: ".. minetest.pos_to_string(other_side_of_door))
local n = minetest.get_node(pos_closest_to_door)
if n.name == "air" then
mcl_log("We have air space next to door at: " .. minetest.pos_to_string(pos_closest_to_door))
prospective_wp = minetest.find_path(p, pos_closest_to_door, PATHFINDING_SEARCH_DISTANCE, 1, 4)
if prospective_wp then
mcl_log("Found a path to next to door".. minetest.pos_to_string(pos_closest_to_door))
mcl_log("Opposite is: ".. minetest.pos_to_string(other_side_of_door))
table.insert(prospective_wp, cur_door_pos)
if t then
mcl_log("We have t, lets go from door to target")
local wp_otherside_door_to_target = minetest.find_path(other_side_of_door, t, PATHFINDING_SEARCH_DISTANCE, 1, 4)
local wp_otherside_door_to_target = minetest.find_path(other_side_of_door,t,150,1,4)
if wp_otherside_door_to_target and #wp_otherside_door_to_target > 0 then
table.insert(wp, cur_door_pos)
append_paths (wp, wp_otherside_door_to_target)
enriched_path = generate_enriched_path(wp, pos_closest_to_door, other_side_of_door, cur_door_pos)
append_paths (prospective_wp, wp_otherside_door_to_target)
wp = prospective_wp
mcl_log("We have a path from outside door to target")
else
mcl_log("We cannot path from outside door to target")
end
break
else
mcl_log("This block next to door doesn't work.")
mcl_log("No t, just add other side of door")
table.insert(prospective_wp, other_side_of_door)
wp = prospective_wp
end
if wp then
enriched_path = generate_enriched_path(wp, pos_closest_to_door, other_side_of_door, cur_door_pos)
break
end
else
mcl_log("Block is not air, it is: ".. n.name)
mcl_log("Cannot path to this air block next to door.")
end
end
else
mcl_log("No door found")
end
else
mcl_log("We have a direct route")
mcl_log("No door found")
end
if wp and not enriched_path then
mcl_log("Wp but not enriched")
enriched_path = generate_enriched_path(wp)
end
return enriched_path
end
local gopath_last = os.time()
function mob_class:gopath(target,callback_arrived)
function mob_class:gopath(target, callback_arrived, prioritised)
if self.state == PATHFINDING then mcl_log("Already pathfinding, don't set another until done.") return end
if not self:ready_to_path(prioritised) then return end
if self._pf_last_failed and (os.time() - self._pf_last_failed) < 30 then
mcl_log("We are not ready to path as last fail is less than threshold: " .. (os.time() - self._pf_last_failed))
return
else
mcl_log("We are ready to pathfind, no previous fail or we are past threshold")
end
--if os.time() - gopath_last < 5 then
-- mcl_log("Not ready to path yet")
-- return
--end
--gopath_last = os.time()
last_pathing_time = os.time()
self.order = nil
local p = self.object:get_pos()
local t = vector.offset(target,0,1,0)
local wp = calculate_path_through_door(p, t, target)
--Check direct route
local wp = minetest.find_path(p, t, PATHFINDING_SEARCH_DISTANCE, 1, 4)
if not wp then
mcl_log("### No direct path. Path through door closest to target.")
local door_near_target = minetest.find_node_near(target, 16, {"group:door"})
wp = calculate_path_through_door(p, door_near_target, t)
if not wp then
mcl_log("### No path though door closest to target. Try door closest to origin.")
local door_closest = minetest.find_node_near(p, 16, {"group:door"})
wp = calculate_path_through_door(p, door_closest, t)
-- Path through 2 doors
if not wp then
mcl_log("### Still not wp. Need to path through 2 doors.")
local path_through_closest_door = calculate_path_through_door(p, door_closest)
if path_through_closest_door and #path_through_closest_door > 0 then
mcl_log("We have path through first door")
mcl_log("Number of pos in path through door: " .. tostring(#path_through_closest_door))
local pos_after_door_entry = path_through_closest_door[#path_through_closest_door]
if pos_after_door_entry then
local pos_after_door = vector.add(pos_after_door_entry["pos"], one_up)
mcl_log("pos_after_door: " .. minetest.pos_to_string(pos_after_door))
local path_after_door = calculate_path_through_door(pos_after_door, door_near_target, t)
if path_after_door and #path_after_door > 1 then
mcl_log("We have path after first door")
table.remove(path_after_door, 1) -- Remove duplicate
wp = path_through_closest_door
append_paths (wp, path_after_door)
else
mcl_log("Path after door is not good")
end
else
mcl_log("No pos after door")
end
else
mcl_log("Path through closest door empty or null")
end
else
mcl_log("ok, we have a path through 1 door")
end
end
else
wp = generate_enriched_path(wp)
mcl_log("We have a direct route")
end
if not wp then
mcl_log("Could not calculate path")
self._pf_last_failed = os.time()
-- Cover for a flaw in pathfind where it chooses the wrong door and gets stuck. Take a break, allow others.
-- If cannot path, don't immediately try again
end
--output_table(wp)
if wp and #wp > 0 then
--output_table(wp)
self._target = t
self.callback_arrived = callback_arrived
local current_location = table.remove(wp,1)
@ -269,17 +338,7 @@ function mob_class:do_pathfind_action(action)
end
end
local gowp_etime = 0
function mob_class:check_gowp(dtime)
gowp_etime = gowp_etime + dtime
-- 0.1 is optimal.
--less frequently = villager will get sent back after passing a point.
--more frequently = villager will fail points they shouldn't they just didn't get there yet
--if gowp_etime < 0.05 then return end
--gowp_etime = 0
local p = self.object:get_pos()
-- no destination
@ -292,7 +351,7 @@ function mob_class:check_gowp(dtime)
-- arrived at location, finish gowp
local distance_to_targ = vector.distance(p,self._target)
--mcl_log("Distance to targ: ".. tostring(distance_to_targ))
if distance_to_targ < 2 then
if distance_to_targ < 1.8 then
mcl_log("Arrived at _target")
self.waypoints = nil
self._target = nil
@ -303,6 +362,8 @@ function mob_class:check_gowp(dtime)
self.object:set_acceleration({x = 0, y = 0, z = 0})
if self.callback_arrived then return self.callback_arrived(self) end
return true
elseif not self.current_target then
mcl_log("Not close enough to targ: ".. tostring(distance_to_targ))
end
-- More pathing to be done
@ -315,7 +376,7 @@ function mob_class:check_gowp(dtime)
-- 0.8 is optimal for 0.025 frequency checks and also 1... Actually. 0.8 is winning
-- 0.9 and 1.0 is also good. Stick with unless door open or closing issues
if self.waypoints and #self.waypoints > 0 and ( not self.current_target or not self.current_target["pos"] or distance_to_current_target < 0.9 ) then
-- We have waypoints, and no current target, or we're at it. We need a new current_target.
-- We have waypoints, and are at current_target or have no current target. We need a new current_target.
self:do_pathfind_action (self.current_target["action"])
local failed_attempts = self.current_target["failed_attempts"]
@ -325,10 +386,11 @@ function mob_class:check_gowp(dtime)
self:go_to_pos(self.current_target["pos"])
return
elseif self.current_target and self.current_target["pos"] then
-- No waypoints left, but have current target. Potentially last waypoint to go to.
-- No waypoints left, but have current target and not close enough. Potentially last waypoint to go to.
self.current_target["failed_attempts"] = self.current_target["failed_attempts"] + 1
local failed_attempts = self.current_target["failed_attempts"]
if failed_attempts >= 50 then
if failed_attempts >= PATHFINDING_FAIL_THRESHOLD then
mcl_log("Failed to reach position (" .. minetest.pos_to_string(self.current_target["pos"]) .. ") too many times. Abandon route. Times tried: " .. failed_attempts)
self.state = "stand"
self.current_target = nil
@ -348,9 +410,22 @@ function mob_class:check_gowp(dtime)
-- Is a little sensitive and could take 1 - 7 times. A 10 fail count might be a good exit condition.
mcl_log("We don't have waypoints or a current target. Let's try to path to target")
local final_wp = minetest.find_path(p,self._target,150,1,4)
if self.waypoints then
mcl_log("WP: " .. tostring(self.waypoints))
mcl_log("WP num: " .. tostring(#self.waypoints))
else
mcl_log("No wp set")
end
if self.current_target then
mcl_log("Current target: " .. tostring(self.current_target))
else
mcl_log("No current target")
end
local final_wp = minetest.find_path(p, self._target, PATHFINDING_SEARCH_DISTANCE, 1, 4)
if final_wp then
mcl_log("We might be able to get to target here.")
mcl_log("We can get to target here.")
-- self.waypoints = final_wp
self:go_to_pos(self._target)
else
@ -374,9 +449,9 @@ function mob_class:check_gowp(dtime)
self:go_to_pos(self._current_target)
else
mcl_log("close to current target: ".. minetest.pos_to_string(self.current_target["pos"]))
mcl_log("target is: ".. minetest.pos_to_string(self._target))
self.current_target = nil
end
return
end
end

View File

@ -5,8 +5,7 @@ local ENTITY_CRAMMING_MAX = 24
local CRAMMING_DAMAGE = 3
local DEATH_DELAY = 0.5
local DEFAULT_FALL_SPEED = -9.81*1.5
local FLOP_HEIGHT = 6
local FLOP_HOR_SPEED = 1.5
local PATHFINDING = "gowp"
local mobs_debug = minetest.settings:get_bool("mobs_debug", false)
local mobs_drop_items = minetest.settings:get_bool("mobs_drop_items") ~= false
@ -48,7 +47,8 @@ end
function mob_class:player_in_active_range()
for _,p in pairs(minetest.get_connected_players()) do
if vector.distance(self.object:get_pos(),p:get_pos()) <= mob_active_range then return true end
local pos = self.object:get_pos()
if pos and vector.distance(pos, p:get_pos()) <= mob_active_range then return true end
-- slightly larger than the mc 32 since mobs spawn on that circle and easily stand still immediately right after spawning.
end
end
@ -183,6 +183,19 @@ function mob_class:collision()
return({x,z})
end
function mob_class:check_death_and_slow_mob()
local d = 0.85
local dying = self:check_dying()
if dying then d = 0.92 end
local v = self.object:get_velocity()
if v then
--diffuse object velocity
self.object:set_velocity({x = v.x*d, y = v.y, z = v.z*d})
end
return dying
end
-- move mob in facing direction
function mob_class:set_velocity(v)
local c_x, c_y = 0, 0
@ -298,6 +311,8 @@ end
function mob_class:set_yaw(yaw, delay, dtime)
if self.noyaw then return end
if not self.object:get_yaw() or not self.object:get_pos() then return end
if self.state ~= PATHFINDING then
self._turn_to = yaw
end
@ -449,6 +464,14 @@ function mob_class:check_for_death(cause, cmi_cause)
self:mob_sound("death")
local function death_handle(self)
if cmi_cause and cmi_cause["type"] then
--minetest.log("cmi_cause: " .. tostring(cmi_cause["type"]))
end
--minetest.log("cause: " .. tostring(cause))
-- TODO other env damage shouldn't drop xp
-- "rain", "water", "drowning", "suffocation"
-- dropped cooked item if mob died in fire or lava
if cause == "lava" or cause == "fire" then
self:item_drop(true, 0)
@ -509,17 +532,16 @@ function mob_class:check_for_death(cause, cmi_cause)
self:set_velocity(0)
local acc = self.object:get_acceleration()
acc.x, acc.y, acc.z = 0, DEFAULT_FALL_SPEED, 0
self.object:set_acceleration(acc)
if acc then
acc.x, acc.y, acc.z = 0, DEFAULT_FALL_SPEED, 0
self.object:set_acceleration(acc)
end
local length
-- default death function and die animation (if defined)
if self.instant_death then
length = 0
elseif self.animation
and self.animation.die_start
and self.animation.die_end then
elseif self.animation and self.animation.die_start and self.animation.die_end then
local frames = self.animation.die_end - self.animation.die_start
local speed = self.animation.die_speed or 15
length = math.max(frames / speed, 0) + DEATH_DELAY
@ -535,7 +557,6 @@ function mob_class:check_for_death(cause, cmi_cause)
if not self.object:get_luaentity() then
return
end
death_handle(self)
local dpos = self.object:get_pos()
local cbox = self.collisionbox
@ -544,6 +565,7 @@ function mob_class:check_for_death(cause, cmi_cause)
self.object:remove()
mcl_mobs.death_effect(dpos, yaw, cbox, not self.instant_death)
end
if length <= 0 then
kill(self)
else
@ -632,11 +654,11 @@ function mob_class:do_env_damage()
end
local nodef = minetest.registered_nodes[self.standing_in]
local nodef2 = minetest.registered_nodes[self.standing_on]
-- rain
if self.rain_damage > 0 then
if mcl_weather.rain.raining and mcl_weather.is_outdoor(pos) then
self.health = self.health - self.rain_damage
if self:check_for_death("rain", {type = "environment",
@ -649,13 +671,9 @@ function mob_class:do_env_damage()
pos.y = pos.y + 1 -- for particle effect position
-- water damage
if self.water_damage > 0
and nodef.groups.water then
if self.water_damage > 0 and nodef.groups.water then
if self.water_damage ~= 0 then
self.health = self.health - self.water_damage
mcl_mobs.effect(pos, 5, "mcl_particles_smoke.png", nil, nil, 1, nil)
if self:check_for_death("water", {type = "environment",
@ -663,15 +681,10 @@ function mob_class:do_env_damage()
return true
end
end
-- lava damage
elseif self.lava_damage > 0
and (nodef.groups.lava) then
elseif self.lava_damage > 0 and (nodef.groups.lava) then
-- lava damage
if self.lava_damage ~= 0 then
self.health = self.health - self.lava_damage
mcl_mobs.effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil)
mcl_burning.set_on_fire(self.object, 10)
@ -680,15 +693,20 @@ function mob_class:do_env_damage()
return true
end
end
-- fire damage
elseif self.fire_damage > 0
and (nodef.groups.fire) then
elseif self.fire_damage > 0 and (nodef2.groups.fire) then
-- magma damage
if self.fire_damage ~= 0 then
self.health = self.health - self.fire_damage
if self:check_for_death("fire", {type = "environment",
pos = pos, node = self.standing_in}) then
return true
end
end
elseif self.fire_damage > 0 and (nodef.groups.fire) then
-- fire damage
if self.fire_damage ~= 0 then
self.health = self.health - self.fire_damage
mcl_mobs.effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil)
mcl_burning.set_on_fire(self.object, 5)
@ -697,12 +715,9 @@ function mob_class:do_env_damage()
return true
end
end
-- damage_per_second node check
elseif nodef.damage_per_second ~= 0 and not nodef.groups.lava and not nodef.groups.fire then
-- damage_per_second node check
self.health = self.health - nodef.damage_per_second
mcl_mobs.effect(pos, 5, "mcl_particles_smoke.png")
if self:check_for_death("dps", {type = "environment",
@ -714,6 +729,7 @@ function mob_class:do_env_damage()
-- Drowning damage
if self.breath_max ~= -1 then
local drowning = false
if self.breathes_in_water then
if minetest.get_item_group(self.standing_in, "water") == 0 then
drowning = true
@ -721,10 +737,9 @@ function mob_class:do_env_damage()
elseif nodef.drowning > 0 then
drowning = true
end
if drowning then
self.breath = math.max(0, self.breath - 1)
mcl_mobs.effect(pos, 2, "bubble.png", nil, nil, 1, nil)
if self.breath <= 0 then
local dmg
@ -775,7 +790,26 @@ function mob_class:do_env_damage()
self.suffocation_timer = 0
end
return self:check_for_death("", {type = "unknown"})
return self:check_for_death("unknown", {type = "unknown"})
end
function mob_class:env_damage (dtime, pos)
-- environmental damage timer (every 1 second)
self.env_damage_timer = self.env_damage_timer + dtime
if self.env_damage_timer > 1 then
self.env_damage_timer = 0
self:check_entity_cramming()
-- check for environmental damage (water, fire, lava etc.)
if self:do_env_damage() then
return true
end
self:replace_node(pos) -- (sheep eats grass etc.)
end
end
function mob_class:damage_mob(reason,damage)
@ -841,33 +875,32 @@ function mob_class:falling(pos)
-- floating in water (or falling)
local v = self.object:get_velocity()
if v then
if v.y > 0 then
-- apply gravity when moving up
self.object:set_acceleration({
x = 0,
y = DEFAULT_FALL_SPEED,
z = 0
})
if v.y > 0 then
-- apply gravity when moving up
self.object:set_acceleration({
x = 0,
y = DEFAULT_FALL_SPEED,
z = 0
})
elseif v.y <= 0 and v.y > self.fall_speed then
-- fall downwards at set speed
self.object:set_acceleration({
x = 0,
y = self.fall_speed,
z = 0
})
else
-- stop accelerating once max fall speed hit
self.object:set_acceleration({x = 0, y = 0, z = 0})
elseif v.y <= 0 and v.y > self.fall_speed then
-- fall downwards at set speed
self.object:set_acceleration({
x = 0,
y = self.fall_speed,
z = 0
})
else
-- stop accelerating once max fall speed hit
self.object:set_acceleration({x = 0, y = 0, z = 0})
end
end
local acc = self.object:get_acceleration()
if minetest.registered_nodes[node_ok(pos).name].groups.lava then
if self.floats_on_lava == 1 then
if acc and self.floats_on_lava == 1 then
self.object:set_acceleration({
x = 0,
y = -self.fall_speed / (math.max(1, v.y) ^ 2),
@ -878,9 +911,7 @@ function mob_class:falling(pos)
-- in water then float up
if minetest.registered_nodes[node_ok(pos).name].groups.water then
if self.floats == 1 then
if acc and self.floats == 1 then
self.object:set_acceleration({
x = 0,
y = -self.fall_speed / (math.max(1, v.y) ^ 2),
@ -888,10 +919,8 @@ function mob_class:falling(pos)
})
end
else
-- fall damage onto solid ground
if self.fall_damage == 1
and self.object:get_velocity().y == 0 then
if self.fall_damage == 1 and self.object:get_velocity().y == 0 then
local n = node_ok(vector.offset(pos,0,-1,0)).name
local d = (self.old_y or 0) - self.object:get_pos().y
@ -952,24 +981,31 @@ end
function mob_class:check_dying()
if ((self.state and self.state=="die") or self:check_for_death()) and not self.animation.die_end then
local rot = self.object:get_rotation()
rot.z = ((math.pi/2-rot.z)*.2)+rot.z
self.object:set_rotation(rot)
if rot then
rot.z = ((math.pi/2-rot.z)*.2)+rot.z
self.object:set_rotation(rot)
end
return true
end
end
function mob_class:check_suspend()
if not self:player_in_active_range() then
local pos = self.object:get_pos()
local pos = self.object:get_pos()
if pos and not self:player_in_active_range() then
local node_under = node_ok(vector.offset(pos,0,-1,0)).name
local acc = self.object:get_acceleration()
self:set_animation( "stand", true)
if acc.y > 0 or node_under ~= "air" then
self.object:set_acceleration(vector.new(0,0,0))
self.object:set_velocity(vector.new(0,0,0))
end
if acc.y == 0 and node_under == "air" then
self:falling(pos)
local acc = self.object:get_acceleration()
if acc then
if acc.y > 0 or node_under ~= "air" then
self.object:set_acceleration(vector.new(0,0,0))
self.object:set_velocity(vector.new(0,0,0))
end
if acc.y == 0 and node_under == "air" then
self:falling(pos)
end
end
return true
end

View File

@ -24,25 +24,60 @@ local vector_floor = vector.floor
local table_copy = table.copy
local table_remove = table.remove
local pairs = pairs
local LOGGING_ON = minetest.settings:get_bool("mcl_logging_mobs_spawning", false)
local function mcl_log (message)
if LOGGING_ON then
mcl_util.mcl_log (message, "[Mobs spawn]", true)
end
end
local dbg_spawn_attempts = 0
local dbg_spawn_succ = 0
local dbg_spawn_counts = {}
-- range for mob count
local aoc_range = 136
local remove_far = true
local WAIT_FOR_SPAWN_ATTEMPT = 10
local FIND_SPAWN_POS_RETRIES = 16
local FIND_SPAWN_POS_RETRIES_SUCCESS_RESPIN = 8
local MOB_SPAWN_ZONE_INNER = 24
local MOB_SPAWN_ZONE_MIDDLE = 32
local MOB_SPAWN_ZONE_OUTER = 128
-- range for mob count
local MOB_CAP_INNER_RADIUS = 32
local aoc_range = 136
local MISSING_CAP_DEFAULT = 15
local MOBS_CAP_CLOSE = 5
local SPAWN_MAPGEN_LIMIT = mcl_vars.mapgen_limit - 150
local mob_cap = {
monster = tonumber(minetest.settings:get("mcl_mob_cap_monster")) or 70,
animal = tonumber(minetest.settings:get("mcl_mob_cap_animal")) or 10,
hostile = tonumber(minetest.settings:get("mcl_mob_cap_monster")) or 70,
passive = tonumber(minetest.settings:get("mcl_mob_cap_animal")) or 13,
ambient = tonumber(minetest.settings:get("mcl_mob_cap_ambient")) or 15,
water = tonumber(minetest.settings:get("mcl_mob_cap_water")) or 5, --currently unused
water = tonumber(minetest.settings:get("mcl_mob_cap_water")) or 8,
water_ambient = tonumber(minetest.settings:get("mcl_mob_cap_water_ambient")) or 20, --currently unused
player = tonumber(minetest.settings:get("mcl_mob_cap_player")) or 75,
total = tonumber(minetest.settings:get("mcl_mob_cap_total")) or 500,
}
local peaceful_percentage_spawned = tonumber(minetest.settings:get("mcl_mob_peaceful_percentage_spawned")) or 35
local peaceful_group_percentage_spawned = tonumber(minetest.settings:get("mcl_mob_peaceful_group_percentage_spawned")) or 15
local hostile_group_percentage_spawned = tonumber(minetest.settings:get("mcl_mob_hostile_group_percentage_spawned")) or 20
mcl_log("Mob cap hostile: " .. mob_cap.hostile)
mcl_log("Mob cap water: " .. mob_cap.water)
mcl_log("Mob cap passive: " .. mob_cap.passive)
mcl_log("Percentage of peacefuls spawned: " .. peaceful_percentage_spawned)
mcl_log("Percentage of peaceful spawns are group: " .. peaceful_group_percentage_spawned)
mcl_log("Percentage of hostile spawns are group: " .. hostile_group_percentage_spawned)
--do mobs spawn?
local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false
local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false
@ -169,6 +204,8 @@ local list_of_all_biomes = {
"MushroomIslandShore",
"JungleM_shore",
"Jungle_shore",
"BambooJungleM_shore",
"BambooJungle_shore",
"MangroveSwamp_shore",
-- dimension biome:
@ -216,6 +253,10 @@ local list_of_all_biomes = {
"JungleEdge",
"SavannaM",
"MangroveSwamp",
"BambooJungle",
"BambooJungleEdge",
"BambooJungleEdgeM",
"BambooJungleM",
}
-- count how many mobs are in an area
@ -244,6 +285,60 @@ local function count_mobs_total(mob_type)
return num
end
local function count_mobs_add_entry (mobs_list, mob_cat)
if mobs_list[mob_cat] then
mobs_list[mob_cat] = mobs_list[mob_cat] + 1
else
mobs_list[mob_cat] = 1
end
end
--categorise_by can be name or type or spawn_class
local function count_mobs_all(categorise_by, pos)
local mobs_found_wide = {}
local mobs_found_close = {}
local num = 0
for _,entity in pairs(minetest.luaentities) do
if entity and entity.is_mob then
local add_entry = false
--local mob_type = entity.type -- animal / monster / npc
local mob_cat = entity[categorise_by]
if pos then
local mob_pos = entity.object:get_pos()
if mob_pos then
local distance = vector.distance(pos, mob_pos)
--mcl_log("distance: ".. distance)
if distance <= MOB_SPAWN_ZONE_MIDDLE then
--mcl_log("distance is close")
count_mobs_add_entry (mobs_found_close, mob_cat)
count_mobs_add_entry (mobs_found_wide, mob_cat)
add_entry = true
elseif distance <= MOB_SPAWN_ZONE_OUTER then
--mcl_log("distance is wide")
count_mobs_add_entry (mobs_found_wide, mob_cat)
add_entry = true
else
--mcl_log("mob_pos: " .. minetest.pos_to_string(mob_pos))
end
end
else
count_mobs_add_entry (mobs_found_wide, mob_cat)
add_entry = true
end
if add_entry then
num = num + 1
end
end
end
--mcl_log("num: ".. num)
return mobs_found_close, mobs_found_wide, num
end
local function count_mobs_total_cap(mob_type)
local num = 0
for _,l in pairs(minetest.luaentities) do
@ -256,6 +351,32 @@ local function count_mobs_total_cap(mob_type)
return num
end
local function output_mob_stats(mob_counts, total_mobs, chat_display)
if (total_mobs) then
local total_output = "Total mobs found: " .. total_mobs
if chat_display then
minetest.log(total_output)
else
minetest.log("action", total_output)
end
end
local detailed = ""
if mob_counts then
for k, v1 in pairs(mob_counts) do
detailed = detailed .. tostring(k) .. ": " .. tostring(v1) .. "; "
end
end
if detailed and detailed ~= "" then
if chat_display then
minetest.log(detailed)
else
minetest.log("action", detailed)
end
end
end
-- global functions
function mcl_mobs:spawn_abm_check(pos, node, name)
@ -292,6 +413,8 @@ WARNING: BIOME INTEGRATION NEEDED -> How to get biome through lua??
--this is where all of the spawning information is kept
local spawn_dictionary = {}
--this is where all of the spawning information is kept for mobs that don't naturally spawn
local non_spawn_dictionary = {}
local summary_chance = 0
function mcl_mobs:spawn_setup(def)
@ -357,6 +480,47 @@ function mcl_mobs:spawn_setup(def)
summary_chance = summary_chance + chance
end
function mcl_mobs:mob_light_lvl(mob_name, dimension)
local spawn_dictionary_consolidated = {}
--see if the mob exists in the nonspawn dictionary, if so then return light values
if non_spawn_dictionary[mob_name] ~= nil then
local mob_dimension = non_spawn_dictionary[mob_name][dimension]
if mob_name ~= nil then
return mob_dimension.min_light,mob_dimension.max_light
else
return non_spawn_dictionary[mob_name]["overworld"].min_light, non_spawn_dictionary[mob_name]["overworld"].max_light
end
--if the mob doesn't exist in non_spawn, check spawn_dictonary
else
for i,v in pairs(spawn_dictionary) do
if spawn_dictionary[spawn_dictionary[i].name] == nil then
spawn_dictionary_consolidated[spawn_dictionary[i].name] = {}
end
spawn_dictionary_consolidated[spawn_dictionary[i].name][dimension] = {
["min_light"] = spawn_dictionary[i].min_light,
["max_light"] = spawn_dictionary[i].max_light
}
end
mob_dimension = spawn_dictionary_consolidated[mob_name][dimension]
mob_dimension_default = spawn_dictionary_consolidated[mob_name]["overworld"]
if spawn_dictionary_consolidated[mob_name] == mob_name and mob_dimension ~= nil then
return mob_dimension.min_light, mob_dimension.max_light
else
return mob_dimension_default.min_light, mob_dimension_default.max_light
end
end
end
function mcl_mobs:non_spawn_specific(mob_name,dimension,min_light,max_light)
table.insert(non_spawn_dictionary, mob_name)
non_spawn_dictionary[mob_name] = {
[dimension] = {
min_light = min_light , max_light = max_light
}
}
end
function mcl_mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_light, max_light, interval, chance, aoc, min_height, max_height, day_toggle, on_spawn)
-- Do mobs spawn at all?
@ -398,18 +562,23 @@ function mcl_mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_
summary_chance = summary_chance + chance
end
local two_pi = 2 * math.pi
local function get_next_mob_spawn_pos(pos)
local distance = math_random(25, 32)
-- TODO We should consider spawning something a little further away sporadically.
-- It would be good for sky farms and variance, rather than all being on the 24 - 32 block away radius
local distance = math_random(MOB_SPAWN_ZONE_INNER, MOB_SPAWN_ZONE_MIDDLE)
local angle = math_random() * two_pi
-- TODO Floor xoff and zoff and add 0.5 so it tries to spawn in the middle of the square. Less failed attempts.
local xoff = math_round(distance * math_cos(angle))
local yoff = math_round(distance * math_sin(angle))
return vector.offset(pos, xoff, 0, yoff)
local zoff = math_round(distance * math_sin(angle))
return vector.offset(pos, xoff, 0, zoff)
end
local function decypher_limits(posy)
posy = math_floor(posy)
return posy - 32, posy + 32
return posy - MOB_SPAWN_ZONE_MIDDLE, posy + MOB_SPAWN_ZONE_MIDDLE
end
--a simple helper function for mob_spawn
@ -460,7 +629,9 @@ local function has_room(self,pos)
return true
end
local function spawn_check(pos,spawn_def,ignore_caps)
local function spawn_check(pos, spawn_def)
if not spawn_def then return end
dbg_spawn_attempts = dbg_spawn_attempts + 1
local dimension = mcl_worlds.pos_to_dimension(pos)
@ -483,17 +654,8 @@ local function spawn_check(pos,spawn_def,ignore_caps)
local is_leaf = get_item_group(gotten_node, "leaves") ~= 0
local is_bedrock = gotten_node == "mcl_core:bedrock"
local is_grass = minetest.get_item_group(gotten_node,"grass_block") ~= 0
local mob_count_wide = 0
local mob_count = 0
if not ignore_caps then
mob_count = count_mobs(pos,32,mob_type)
mob_count_wide = count_mobs(pos,aoc_range,mob_type)
end
if pos and spawn_def
and ( mob_count_wide < (mob_cap[mob_type] or 15) )
and ( mob_count < 5 )
and pos.y >= spawn_def.min_height
and pos.y <= spawn_def.max_height
and spawn_def.dimension == dimension
@ -529,8 +691,7 @@ function mcl_mobs.spawn(pos,id)
end
local function spawn_group(p,mob,spawn_on,group_max,group_min)
if not group_min then group_min = 1 end
local function spawn_group(p,mob,spawn_on,amount_to_spawn)
local nn= minetest.find_nodes_in_area_under_air(vector.offset(p,-5,-3,-5),vector.offset(p,5,3,5),spawn_on)
local o
table.shuffle(nn)
@ -538,9 +699,10 @@ local function spawn_group(p,mob,spawn_on,group_max,group_min)
nn = {}
table.insert(nn,p)
end
for i = 1, math.random(group_min,group_max) do
for i = 1, amount_to_spawn do
local sp = vector.offset(nn[math.random(#nn)],0,1,0)
if spawn_check(nn[math.random(#nn)],mob,true) then
if spawn_check(nn[math.random(#nn)],mob) then
if mob.type_of_spawning == "water" then
sp = get_water_spawn(sp)
end
@ -628,25 +790,116 @@ if mobs_spawn then
local perlin_noise
local function spawn_a_mob(pos, dimension, y_min, y_max)
--create a disconnected clone of the spawn dictionary
--prevents memory leak
-- Get pos to spawn, x and z are randomised, y is range
local function mob_cap_space (pos, mob_type, mob_counts_close, mob_counts_wide)
-- Some mob examples
--type = "monster", spawn_class = "hostile",
--type = "animal", spawn_class = "passive",
--local cod = { type = "animal", spawn_class = "water",
local type_cap = mob_cap[mob_type] or MISSING_CAP_DEFAULT
local close_zone_cap = MOBS_CAP_CLOSE
local mob_total_wide = mob_counts_wide[mob_type]
if not mob_total_wide then
--mcl_log("none of type found. set as 0")
mob_total_wide = 0
end
local cap_space_wide = type_cap - mob_total_wide
if cap_space_wide < 1 then
cap_space_wide = 0
end
local mob_total_close = mob_counts_close[mob_type]
if not mob_total_close then
--mcl_log("none of type found. set as 0")
mob_total_close = 0
end
local cap_space_close = close_zone_cap - mob_total_close
if cap_space_close < 1 then
cap_space_close = 0
end
--mcl_log("spawn_class: " .. spawn_class)
if false and mob_type == "water" then
mcl_log("mob_type: " .. mob_type .. " and pos: " .. minetest.pos_to_string(pos))
mcl_log("wide: " .. mob_total_wide .. "/" .. type_cap)
mcl_log("cap_space_wide: " .. cap_space_wide)
mcl_log("close: " .. mob_total_close .. "/" .. close_zone_cap)
mcl_log("cap_space_close: " .. cap_space_close)
end
return cap_space_wide, cap_space_close
end
local function find_spawning_position(pos, max_times)
local spawning_position
local max_loops = 1
if max_times then max_loops = max_times end
local y_min, y_max = decypher_limits(pos.y)
mcl_log("mapgen_limit: " .. SPAWN_MAPGEN_LIMIT)
local i = 0
repeat
local goal_pos = get_next_mob_spawn_pos(pos)
if math.abs(goal_pos.x) <= SPAWN_MAPGEN_LIMIT and math.abs(pos.y) <= SPAWN_MAPGEN_LIMIT and math.abs(goal_pos.z) <= SPAWN_MAPGEN_LIMIT then
local spawning_position_list = find_nodes_in_area_under_air(
{x = goal_pos.x, y = y_min, z = goal_pos.z},
{x = goal_pos.x, y = y_max, z = goal_pos.z},
{"group:solid", "group:water", "group:lava"}
)
if #spawning_position_list > 0 then
mcl_log("Spawning positions available: " .. minetest.pos_to_string(goal_pos))
spawning_position = spawning_position_list[math_random(1, #spawning_position_list)]
else
mcl_log("Spawning position isn't good. Do not spawn: " .. minetest.pos_to_string(goal_pos))
end
else
mcl_log("Pos outside mapgen limits: " .. minetest.pos_to_string(goal_pos))
end
i = i + 1
if i >= max_loops then
mcl_log("Cancel finding spawn positions at: " .. max_loops)
break
end
until spawning_position
return spawning_position
end
local function spawn_a_mob(pos)
--create a disconnected clone of the spawn dictionary, prevents memory leak
local mob_library_worker_table = table_copy(spawn_dictionary)
local goal_pos = get_next_mob_spawn_pos(pos)
local spawning_position = find_spawning_position(pos, FIND_SPAWN_POS_RETRIES)
if not spawning_position then
minetest.log("action", "[Mobs spawn] Cannot find a valid spawn position after retries: " .. FIND_SPAWN_POS_RETRIES)
return
end
local mob_counts_close, mob_counts_wide, total_mobs = count_mobs_all("spawn_class", spawning_position)
--output_mob_stats(mob_counts_close, total_mobs)
--output_mob_stats(mob_counts_wide)
--grab mob that fits into the spawning location
--randomly grab a mob, don't exclude any possibilities
local spawning_position_list = find_nodes_in_area_under_air(
{x = goal_pos.x, y = y_min, z = goal_pos.z},
{x = goal_pos.x, y = y_max, z = goal_pos.z},
{"group:solid", "group:water", "group:lava"}
)
if #spawning_position_list <= 0 then return end
local spawning_position = spawning_position_list[math_random(1, #spawning_position_list)]
perlin_noise = perlin_noise or minetest_get_perlin(noise_params)
local noise = perlin_noise:get_3d(spawning_position)
local current_summary_chance = summary_chance
table.shuffle(mob_library_worker_table)
while #mob_library_worker_table > 0 do
local mob_chance_offset = (math_round(noise * current_summary_chance + 12345) % current_summary_chance) + 1
local mob_index = 1
@ -657,39 +910,95 @@ if mobs_spawn then
mob_chance = mob_library_worker_table[mob_index].chance
step_chance = step_chance + mob_chance
end
local mob_def = mob_library_worker_table[mob_index]
--minetest.log(mob_def.name.." "..step_chance.. " "..mob_chance)
local mob_def = mob_library_worker_table[mob_index]
if mob_def and mob_def.name and minetest.registered_entities[mob_def.name] then
local spawn_in_group = minetest.registered_entities[mob_def.name].spawn_in_group or 4
local spawn_in_group_min = minetest.registered_entities[mob_def.name].spawn_in_group_min or 1
local mob_type = minetest.registered_entities[mob_def.name].type
if spawn_check(spawning_position,mob_def) then
if mob_def.type_of_spawning == "water" then
spawning_position = get_water_spawn(spawning_position)
if not spawning_position then
minetest.log("warning","[mcl_mobs] no water spawn for mob "..mob_def.name.." found at "..minetest.pos_to_string(vector.round(pos)))
local mob_def_ent = minetest.registered_entities[mob_def.name]
--local mob_type = mob_def_ent.type
local mob_spawn_class = mob_def_ent.spawn_class
--mcl_log("mob_spawn_class: " .. mob_spawn_class)
local cap_space_wide, cap_space_close = mob_cap_space (spawning_position, mob_spawn_class, mob_counts_close, mob_counts_wide)
if cap_space_close > 0 and cap_space_wide > 0 then
--mcl_log("Cap space available")
-- Spawn caps for animals and water creatures fill up rapidly. Need to throttle this somewhat
-- for performance and for early game challenge. We don't want to reduce hostiles though.
local spawn_hostile = (mob_spawn_class == "hostile")
local spawn_passive = (mob_spawn_class ~= "hostile") and math.random(100) < peaceful_percentage_spawned
-- or not hostile
--mcl_log("Spawn_passive: " .. tostring(spawn_passive))
--mcl_log("Spawn_hostile: " .. tostring(spawn_hostile))
if (spawn_hostile or spawn_passive) and spawn_check(spawning_position,mob_def) then
if mob_def.type_of_spawning == "water" then
spawning_position = get_water_spawn(spawning_position)
if not spawning_position then
minetest.log("warning","[mcl_mobs] no water spawn for mob "..mob_def.name.." found at "..minetest.pos_to_string(vector.round(pos)))
return
end
end
if mob_def_ent.can_spawn and not mob_def_ent.can_spawn(spawning_position) then
minetest.log("warning","[mcl_mobs] mob "..mob_def.name.." refused to spawn at "..minetest.pos_to_string(vector.round(spawning_position)))
return
end
end
if minetest.registered_entities[mob_def.name].can_spawn and not minetest.registered_entities[mob_def.name].can_spawn(spawning_position) then
minetest.log("warning","[mcl_mobs] mob "..mob_def.name.." refused to spawn at "..minetest.pos_to_string(vector.round(spawning_position)))
return
end
--everything is correct, spawn mob
local object
if spawn_in_group and ( mob_type ~= "monster" or math.random(5) == 1 ) then
if logging then
minetest.log("action", "[mcl_mobs] A group of mob " .. mob_def.name .. " spawns on " ..minetest.get_node(vector.offset(spawning_position,0,-1,0)).name .." at " .. minetest.pos_to_string(spawning_position, 1))
end
object = spawn_group(spawning_position,mob_def,{minetest.get_node(vector.offset(spawning_position,0,-1,0)).name},spawn_in_group,spawn_in_group_min)
else
if logging then
minetest.log("action", "[mcl_mobs] Mob " .. mob_def.name .. " spawns on " ..minetest.get_node(vector.offset(spawning_position,0,-1,0)).name .." at ".. minetest.pos_to_string(spawning_position, 1))
--everything is correct, spawn mob
local spawn_in_group = mob_def_ent.spawn_in_group or 4
local spawn_group_hostile = (mob_spawn_class == "hostile") and (math.random(100) < hostile_group_percentage_spawned)
local spawn_group_passive = (mob_spawn_class ~= "hostile") and (math.random(100) < peaceful_group_percentage_spawned)
mcl_log("spawn_group_hostile: " .. tostring(spawn_group_hostile))
mcl_log("spawn_group_passive: " .. tostring(spawn_group_passive))
local spawned
if spawn_in_group and (spawn_group_hostile or spawn_group_passive) then
local group_min = mob_def_ent.spawn_in_group_min or 1
if not group_min then group_min = 1 end
local amount_to_spawn = math.random(group_min,spawn_in_group)
if amount_to_spawn > cap_space_wide then
mcl_log("Spawning quantity: " .. amount_to_spawn)
mcl_log("Throttle amount to cap space: " .. cap_space_wide)
amount_to_spawn = cap_space_wide
end
if logging then
minetest.log("action", "[mcl_mobs] A group of " ..amount_to_spawn .. " " .. mob_def.name .. " mob spawns on " ..minetest.get_node(vector.offset(spawning_position,0,-1,0)).name .." at " .. minetest.pos_to_string(spawning_position, 1))
end
spawned = spawn_group(spawning_position,mob_def,{minetest.get_node(vector.offset(spawning_position,0,-1,0)).name}, amount_to_spawn)
else
if logging then
minetest.log("action", "[mcl_mobs] Mob " .. mob_def.name .. " spawns on " ..minetest.get_node(vector.offset(spawning_position,0,-1,0)).name .." at ".. minetest.pos_to_string(spawning_position, 1))
end
spawned = mcl_mobs.spawn(spawning_position, mob_def.name)
end
object = mcl_mobs.spawn(spawning_position, mob_def.name)
if spawned then
--mcl_log("We have spawned")
mob_counts_close, mob_counts_wide, total_mobs = count_mobs_all("type", pos)
local new_spawning_position = find_spawning_position(pos, FIND_SPAWN_POS_RETRIES_SUCCESS_RESPIN)
if new_spawning_position then
mcl_log("Setting new spawning position")
spawning_position = new_spawning_position
else
mcl_log("Cannot set new spawning position")
end
end
else
mcl_log("Spawn check failed")
end
else
mcl_log("Cap space full")
end
end
current_summary_chance = current_summary_chance - mob_chance
table_remove(mob_library_worker_table, mob_index)
@ -701,28 +1010,32 @@ if mobs_spawn then
local timer = 0
minetest.register_globalstep(function(dtime)
timer = timer + dtime
if timer < 10 then return end
if timer < WAIT_FOR_SPAWN_ATTEMPT then return end
timer = 0
local players = get_connected_players()
local total_mobs = count_mobs_total_cap()
if total_mobs > mob_cap.total or total_mobs > #players * mob_cap.player then
minetest.log("action","[mcl_mobs] global mob cap reached. no cycle spawning.")
return
end --mob cap per player
for _, player in pairs(players) do
local pos = player:get_pos()
local dimension = mcl_worlds.pos_to_dimension(pos)
-- ignore void and unloaded area
if dimension ~= "void" and dimension ~= "default" then
local y_min, y_max = decypher_limits(pos.y)
spawn_a_mob(pos, dimension, y_min, y_max)
spawn_a_mob(pos)
end
end
end)
end
function mob_class:check_despawn(pos)
function mob_class:check_despawn(pos, dtime)
self.lifetimer = self.lifetimer - dtime
-- Despawning: when lifetimer expires, remove mob
if remove_far
and self.can_despawn == true
@ -746,14 +1059,16 @@ function mob_class:check_despawn(pos)
end
end
minetest.register_chatcommand("mobstats",{
privs = { debug = true },
func = function(n,param)
minetest.chat_send_player(n,dump(dbg_spawn_counts))
--minetest.chat_send_player(n,dump(dbg_spawn_counts))
local pos = minetest.get_player_by_name(n):get_pos()
minetest.chat_send_player(n,"mobs within 32 radius of player:"..count_mobs(pos,32))
minetest.chat_send_player(n,"total mobs:"..count_mobs_total())
minetest.chat_send_player(n,"spawning attempts since server start:"..dbg_spawn_attempts)
minetest.chat_send_player(n,"successful spawns since server start:"..dbg_spawn_succ)
minetest.chat_send_player(n,"mobs: within 32 radius of player/total loaded :"..count_mobs(pos,MOB_CAP_INNER_RADIUS) .. "/" .. count_mobs_total())
minetest.chat_send_player(n,"spawning attempts since server start:" .. dbg_spawn_succ .. "/" .. dbg_spawn_attempts)
local mob_counts_close, mob_counts_wide, total_mobs = count_mobs_all("name") -- Can use "type"
output_mob_stats(mob_counts_wide, total_mobs, true)
end
})

Binary file not shown.

Before

Width:  |  Height:  |  Size: 895 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 229 B

View File

@ -207,5 +207,6 @@ mcl_mobs.register_arrow("mobs_mc:blaze_fireball", {
end
})
-- spawn eggs
mcl_mobs:non_spawn_specific("mobs_mc:blaze", "overworld", 0, 11)
-- spawn eggs.
mcl_mobs.register_egg("mobs_mc:blaze", S("Blaze"), "#f6b201", "#fff87e", 0)

View File

@ -12,13 +12,13 @@ mcl_mobs.register_mob("mobs_mc:chicken", {
description = S("Chicken"),
type = "animal",
spawn_class = "passive",
passive = true,
runaway = true,
hp_min = 4,
hp_max = 4,
xp_min = 1,
xp_max = 3,
collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.69, 0.2},
runaway = true,
floats = 1,
head_swivel = "head.control",
bone_eye_height = 4,

View File

@ -40,14 +40,14 @@ local cod = {
xp_max = 3,
armor = 100,
rotate = 180,
spawn_in_group_min = 3,
spawn_in_group = 8,
spawn_in_group_min = 2, -- was 3
spawn_in_group = 4, -- was 8 nerfed until we can cap them properly locally. this is a group size, not a per spawn attempt
tilt_swim = true,
collisionbox = {-0.3, 0.0, -0.3, 0.3, 0.79, 0.3},
visual = "mesh",
mesh = "extra_mobs_cod.b3d",
textures = {
{"extra_mobs_cod.png"}
{"mobs_mc_cod.png"}
},
sounds = {
},

View File

@ -7,13 +7,14 @@ local cow_def = {
type = "animal",
spawn_class = "passive",
passive = true,
runaway = true,
hp_min = 10,
hp_max = 10,
xp_min = 1,
xp_max = 3,
collisionbox = {-0.45, -0.01, -0.45, 0.45, 1.39, 0.45},
spawn_in_group = 4,
spawn_in_group_min = 3,
spawn_in_group_min = 2,
visual = "mesh",
mesh = "mobs_mc_cow.b3d",
textures = { {
@ -40,7 +41,6 @@ local cow_def = {
max = 2,
looting = "common",},
},
runaway = true,
sounds = {
random = "mobs_mc_cow",
damage = "mobs_mc_cow_hurt",
@ -93,8 +93,8 @@ mcl_mobs.register_mob("mobs_mc:cow", cow_def)
-- Mooshroom
local mooshroom_def = table.copy(cow_def)
mooshroom_def.description = S("Mooshroom")
mooshroom_def.spawn_in_group_min = 4
mooshroom_def.spawn_in_group = 8
mooshroom_def.spawn_in_group_min = 2
mooshroom_def.spawn_in_group = 4
mooshroom_def.textures = { {"mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png"}, {"mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } }
mooshroom_def.on_rightclick = function(self, clicker)
if self:feed_tame(clicker, 1, true, false) then return end

View File

@ -42,8 +42,8 @@ local dolphin = {
walk_chance = 100,
breath_max = 120,
rotate = 180,
spawn_in_group_min = 3,
spawn_in_group = 5,
spawn_in_group_min = 2, -- was 3
spawn_in_group = 4, -- was 4. nerfed until water has own cap, and it represents max pack size rather than per spawn attempt
tilt_swim = true,
collisionbox = {-0.3, 0.0, -0.3, 0.3, 0.79, 0.3},
visual = "mesh",

View File

@ -174,3 +174,4 @@ mcl_mobs.register_egg("mobs_mc:enderdragon", S("Ender Dragon"), "#252525", "#b31
mcl_wip.register_wip_item("mobs_mc:enderdragon")
mcl_mobs:non_spawn_specific("mobs_mc:enderdragon","overworld",0,minetest.LIGHT_MAX+1)

View File

@ -259,6 +259,7 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
description = S("Enderman"),
type = "monster",
spawn_class = "passive",
can_despawn = true,
passive = true,
pathfinding = 1,
hp_min = 40,
@ -442,6 +443,7 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
end
end
end
-- TAKE AND PLACE STUFF BEHAVIOUR BELOW.
if not mobs_griefing then
return
@ -469,6 +471,7 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
local dug = minetest.get_node_or_nil(take_pos)
if dug and dug.name == "air" then
self._taken_node = node.name
self.can_despawn = false
local def = minetest.registered_nodes[self._taken_node]
-- Update animation and texture accordingly (adds visibly carried block)
local block_type
@ -519,6 +522,7 @@ mcl_mobs.register_mob("mobs_mc:enderman", {
if success then
local def = minetest.registered_nodes[self._taken_node]
-- Update animation accordingly (removes visible block)
self.can_despawn = true
self.animation = select_enderman_animation("normal")
self:set_animation(self.animation.current)
if def.sounds and def.sounds.place then

View File

@ -39,3 +39,4 @@ mcl_mobs.register_mob("mobs_mc:endermite", {
})
mcl_mobs.register_egg("mobs_mc:endermite", S("Endermite"), "#161616", "#6d6d6d", 0)
mcl_mobs:non_spawn_specific("mobs_mc:endermite","overworld",0,7)

View File

@ -139,6 +139,6 @@ mcl_mobs.register_arrow("mobs_mc:fireball", {
mcl_mobs:non_spawn_specific("mobs_mc:ghast","overworld","0","7")
-- spawn eggs
mcl_mobs.register_egg("mobs_mc:ghast", S("Ghast"), "#f9f9f9", "#bcbcbc", 0)

View File

@ -25,7 +25,7 @@ local base_psdef = {
local psdefs = {}
for i=1,4 do
local p = table.copy(base_psdef)
p.texture = "extra_mobs_glow_squid_glint"..i..".png"
p.texture = "mobs_mc_glow_squid_glint"..i..".png"
table.insert(psdefs,p)
end
@ -47,7 +47,7 @@ mcl_mobs.register_mob("mobs_mc:glow_squid", {
visual = "mesh",
mesh = "extra_mobs_glow_squid.b3d",
textures = {
{ "extra_mobs_glow_squid.png" }
{ "mobs_mc_glow_squid.png" }
},
sounds = {
damage = { name = "mobs_mc_squid_hurt", gain = 0.3 },

View File

@ -131,5 +131,7 @@ minetest.LIGHT_MAX+1,
mcl_vars.mg_nether_min,
mcl_vars.mg_nether_max)
mcl_mobs:non_spawn_specific("mobs_mc:hoglin","overworld",0,7)
-- spawn eggs
mcl_mobs.register_egg("mobs_mc:hoglin", S("Hoglin"), "#85682e", "#2b2140", 0)

View File

@ -125,7 +125,7 @@ local horse = {
type = "animal",
spawn_class = "passive",
spawn_in_group_min = 2,
spawn_in_group = 6,
spawn_in_group = 4, -- was 6. nerfed until group size is a cap rather than per spawn cycle
visual = "mesh",
mesh = "mobs_mc_horse.b3d",
visual_size = {x=3.0, y=3.0},

View File

@ -15,7 +15,7 @@ mcl_mobs.register_mob("mobs_mc:iron_golem", {
description = S("Iron Golem"),
type = "npc",
spawn_class = "passive",
passive = true,
passive = false,
hp_min = 100,
hp_max = 100,
breath_max = -1,
@ -42,7 +42,7 @@ mcl_mobs.register_mob("mobs_mc:iron_golem", {
damage = 14,
knock_back = false,
reach = 3,
group_attack = true,
group_attack = { "mobs_mc:villager" },
attacks_monsters = true,
attack_type = "dogfight",
_got_poppy = false,
@ -206,3 +206,4 @@ function mobs_mc.check_iron_golem_summon(pos)
end
end
end
mcl_mobs:non_spawn_specific("mobs_mc:iron_golem","overworld",0,minetest.LIGHT_MAX+1)

View File

@ -56,8 +56,8 @@ mcl_mobs.register_mob("mobs_mc:llama", {
shoot_interval = 5.5,
arrow = "mobs_mc:llamaspit",
shoot_offset = 1, --3.5 *would* be a good value visually but it somehow messes with the projectiles trajectory
spawn_in_group_min = 4,
spawn_in_group = 6,
spawn_in_group_min = 2, -- was 4
spawn_in_group = 4, -- was 6 nerfed until we can cap them properly locally. this is a group size, not a per spawn attempt
head_swivel = "head.control",
bone_eye_height = 11,

View File

@ -164,7 +164,7 @@ cat.on_spawn = function(self)
if not self._texture then
self._texture = cat.textures[math.random(#cat.textures)]
end
self.object:set_properties({textures = {self._texture}})
self.object:set_properties({textures = self._texture})
end
mcl_mobs.register_mob("mobs_mc:cat", cat)

View File

@ -6,6 +6,7 @@ mcl_mobs.register_mob("mobs_mc:pig", {
description = S("Pig"),
type = "animal",
spawn_class = "passive",
passive = true,
runaway = true,
hp_min = 10,
hp_max = 10,

View File

@ -283,6 +283,7 @@ piglin_brute.group_attack = { "mobs_mc:piglin", "mobs_mc:piglin_brute" }
mcl_mobs.register_mob("mobs_mc:piglin_brute", piglin_brute)
mcl_mobs:non_spawn_specific("mobs_mc:piglin","overworld",0,7)
-- Regular spawning in the Nether
mcl_mobs:spawn_specific(
"mobs_mc:piglin",
@ -299,7 +300,7 @@ minetest.LIGHT_MAX+1,
3,
mcl_vars.mg_lava_nether_max,
mcl_vars.mg_nether_max)
mcl_mobs:non_spawn_specific("mobs_mc:sword_piglin","overworld",0,7)
mcl_mobs:spawn_specific(
"mobs_mc:sword_piglin",
"nether",

View File

@ -122,3 +122,4 @@ pillager = {
mcl_mobs.register_mob("mobs_mc:pillager", pillager)
mcl_mobs.register_egg("mobs_mc:pillager", S("Pillager"), "#532f36", "#959b9b", 0)
mcl_mobs:non_spawn_specific("mobs_mc:pillager","overworld",0,7)

View File

@ -25,7 +25,7 @@ local salmon = {
visual = "mesh",
mesh = "extra_mobs_salmon.b3d",
textures = {
{"extra_mobs_salmon.png"}
{"mobs_mc_salmon.png"}
},
sounds = {
},

View File

@ -56,6 +56,7 @@ mcl_mobs.register_mob("mobs_mc:sheep", {
description = S("Sheep"),
type = "animal",
spawn_class = "passive",
passive = true,
hp_min = 8,
hp_max = 8,
xp_min = 1,

View File

@ -178,7 +178,7 @@ mcl_mobs.register_arrow("mobs_mc:shulkerbullet", {
mcl_mobs.register_egg("mobs_mc:shulker", S("Shulker"), "#946694", "#4d3852", 0)
mcl_mobs:non_spawn_specific("mobs_mc:shulker","overworld",0,minetest.LIGHT_MAX+1)
--[[
mcl_mobs:spawn_specific(
"mobs_mc:shulker",

View File

@ -56,3 +56,4 @@ mcl_mobs.register_mob("mobs_mc:silverfish", {
})
mcl_mobs.register_egg("mobs_mc:silverfish", S("Silverfish"), "#6d6d6d", "#313131", 0)
mcl_mobs:non_spawn_specific("mobs_mc:silverfish","overworld",0,11)

View File

@ -118,3 +118,4 @@ mcl_vars.mg_nether_max)
--]]
-- spawn eggs
mcl_mobs.register_egg("mobs_mc:witherskeleton", S("Wither Skeleton"), "#141414", "#474d4d", 0)
mcl_mobs:non_spawn_specific("mobs_mc:witherskeleton","overworld",0,7)

View File

@ -278,7 +278,6 @@ swamp_light_max,
4,
swamp_min,
swamp_max)
-- Magma cube
local magma_cube_big = {
description = S("Magma Cube"),
@ -431,6 +430,11 @@ nether_max)
-- spawn eggs
mcl_mobs.register_egg("mobs_mc:magma_cube_big", S("Magma Cube"), "#350000", "#fcfc00")
-- non_spawn_specific is typically for mobs who don't spawn in the overworld, or mobs that don't spawn
-- naturally. However, slimes are a particular case where they spawn under different conditions in the same
-- dimension.
mcl_mobs:non_spawn_specific("mobs_mc:slime_big","overworld",0,minetest.LIGHT_MAX+1)
mcl_mobs:non_spawn_specific("mobs_mc:magma_cube_big","overworld",0, minetest.LIGHT_MAX+1)
mcl_mobs.register_egg("mobs_mc:slime_big", S("Slime"), "#52a03e", "#7ebf6d")
-- FIXME: add spawn eggs for small and tiny slimes and magma cubes

View File

@ -197,3 +197,4 @@ end
-- Spawn egg
mcl_mobs.register_egg("mobs_mc:snowman", S("Snow Golem"), "#f2f2f2", "#fd8f47", 0)
mcl_mobs:non_spawn_specific("mobs_mc:snowman","overworld",0,minetest.LIGHT_MAX+1)

View File

@ -246,3 +246,4 @@ mcl_mobs:spawn_setup({
-- spawn eggs
mcl_mobs.register_egg("mobs_mc:strider", S("Strider"), "#000000", "#FF0000", 0)
mcl_mobs:non_spawn_specific("mobs_mc:strider","nether",0,minetest.LIGHT_MAX+1)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 443 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 426 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 755 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

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