Compare commits

...

707 Commits

Author SHA1 Message Date
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 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 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
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 513d148eaf Merge branch 'master' into grass_sound_revert 2023-01-17 12:44:16 +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
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
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 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
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
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
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
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
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 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
iliekprogrammar 3249c13752 Merge pull request '`mcl_meshhand` fixes' (#2939) from mcl-meshhand-fixes into master
Reviewed-on: MineClone2/MineClone2#2939
Reviewed-by: iliekprogrammar <iliekprogrammar@gmail.com>
2022-12-30 18:50:46 +00:00
iliekprogrammar 2ea72ccda8 Merge branch 'master' into mcl-meshhand-fixes 2022-12-30 18:47:55 +00:00
iliekprogrammar 5237eca31e Merge pull request '`mcl_item_entity` fixes' (#2936) from mcl-item-entity-fixes into master
Reviewed-on: MineClone2/MineClone2#2936
Reviewed-by: iliekprogrammar <iliekprogrammar@gmail.com>
2022-12-30 18:39:34 +00:00
iliekprogrammar c2ba70a601 Merge branch 'master' into mcl-item-entity-fixes 2022-12-30 18:34:41 +00:00
iliekprogrammar 723fe9c532 Merge pull request 'mcl_init fixes' (#2862) from mcl-init-fixes into master
Reviewed-on: MineClone2/MineClone2#2862
Reviewed-by: iliekprogrammar <iliekprogrammar@gmail.com>
2022-12-30 18:18:21 +00:00
iliekprogrammar 661afed46c Merge branch 'master' into mcl-init-fixes 2022-12-30 18:11:08 +00:00
ancientmarinerdev e7ace0c87c Merge pull request 'Main Menu Rework' (#3193) from main_menu_rework into master
Reviewed-on: MineClone2/MineClone2#3193
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-30 01:27:49 +00:00
FossFanatic 9605e2ae0d Make the theme less loud 2022-12-30 01:27:03 +00:00
FossFanatic 80bb954814 Delete 'menu/theme_alt.ogg' 2022-12-30 01:27:03 +00:00
Michieal 10dc83b2a6 softer menu music ogg file 2022-12-30 01:27:02 +00:00
FossFanatic b95c623a74 Add a more original footer and headers 2022-12-30 01:27:02 +00:00
FossFanatic 0ab4553648 Add more credits 2022-12-30 01:27:02 +00:00
FossFanatic 65557152fb Add a menu theme 2022-12-30 01:27:02 +00:00
FossFanatic 1357193a78 Add a template for making splashes 2022-12-30 01:27:02 +00:00
FossFanatic aacbaddfe0 Add warped hyphae texture to the right folder 2022-12-30 01:27:02 +00:00
FossFanatic e246bf7ddf Remove stray warped hyphae texture? 2022-12-30 01:27:02 +00:00
FossFanatic 11bd29ed44 Add a couple of splash texts 2022-12-30 01:27:02 +00:00
FossFanatic de574729a2 Make footer have shadow and look better on 1080p monitors 2022-12-30 01:27:02 +00:00
FossFanatic 95e269a61f Add last background 2022-12-30 01:27:02 +00:00
FossFanatic 5bdc145872 Add second batch of backgrounds 2022-12-30 01:27:02 +00:00
FossFanatic 20e178d5d1 Add first batch of backgrounds 2022-12-30 01:27:01 +00:00
FossFanatic bdbc484c48 Delete 'menu/overlay.1.png' 2022-12-30 01:27:01 +00:00
FossFanatic 56c62e9fba Delete 'menu/overlay.2.png' 2022-12-30 01:27:01 +00:00
FossFanatic 3b1acc60db Delete 'menu/overlay.3.png' 2022-12-30 01:27:01 +00:00
FossFanatic 6026687e93 Delete 'menu/overlay.4.png' 2022-12-30 01:27:01 +00:00
FossFanatic e813c48ed5 Delete 'menu/overlay.5.png' 2022-12-30 01:27:01 +00:00
FossFanatic 75716d97e3 Delete 'menu/overlay.png' 2022-12-30 01:27:01 +00:00
ancientmarinerdev 6fe5bf8674 Merge pull request 'Update Code of Conduct email' (#3214) from update_coc_email into master
Reviewed-on: MineClone2/MineClone2#3214
2022-12-29 23:47:50 +00:00
ancientmarinerdev 9574ba7f09 Update Code of Conduct email 2022-12-29 23:47:03 +00:00
ancientmarinerdev 0df4f9518a Merge pull request 'Added credit for Japanese translations' (#3213) from add_japanese_credits into master
Reviewed-on: MineClone2/MineClone2#3213
2022-12-29 22:18:44 +00:00
ancientmarinerdev 3ee4a62107 Added credit for Japanese translations 2022-12-29 22:17:16 +00:00
ancientmarinerdev e6e898671a Merge pull request 'add japanese translation' (#3149) from SakuraRiu/MineClone2:master into master
Reviewed-on: MineClone2/MineClone2#3149
Reviewed-by: Michieal <michieal@noreply.git.minetest.land>
2022-12-29 22:14:48 +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 ab1cfde34d Merge pull request 'Put back default sky and fog color.' (#3201) from fix_v6_sky_color into master
Reviewed-on: MineClone2/MineClone2#3201
Reviewed-by: FossFanatic <fossfanatic@noreply.git.minetest.land>
2022-12-29 07:59:28 +00:00
FossFanatic d5f8129ea7 Merge branch 'master' into fix_v6_sky_color 2022-12-29 07:55:49 +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
ancientmarinerdev 1295b2dc12 Merge pull request 'Dye refactoring; untangle bone meal, lapis, ink sac and cocoa beans from dye items.' (#3176) from redo_dyes into master
Reviewed-on: MineClone2/MineClone2#3176
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-29 03:11:33 +00:00
kabou 44f724f677 Minor refactoring of mcl_dye, fix dye texture names.
* Reorganize dyes table.
* Rename dye item textures to conform to mcl naming standard.
* Refactor dye item registration.
* Shuffle recipes around in a more logical order.
* Remove unused dye names from lists that are probably equally unused.
2022-12-29 03:08:50 +00:00
kabou 92ee402971 Separate white dye from bone meal.
* Add craftitem for ":mcl_bone_meal:bone_meal" to mcl_dye (temporarily.)
* Add crafting recipe for bone meal.
* Add texture for white dye item.
* Merge craftitem registration for "mcl_dye:white" with generic dyes.
* Add crafting recipe for white dye.
* Add legacy conversion recipe.
* Update dyes table.
* Update translations.
* Update mcl_crimson and sweet berry on_rightclick handlers.
* Update composter output, both as freestanding and to hoppers.
* Update bone block crafting recipes.
* Update tropical fish, cod and salmon mob drops.
2022-12-29 03:08:50 +00:00
kabou 7d8fdc6ec3 Separate brown dye from cocoa beans.
* Add craftitem "mcl_cocoas:cocoa_beans".
* Add texture for brown dye item.
* Merge craftitem registration for "mcl_dye:brown" with generic dyes.
* Add crafting recipe for brown dye.
* Add legacy conversion recipe.
* Update dyes table.
* Update translations.
* Update cookie recipe.
2022-12-29 03:08:49 +00:00
kabou d2edc75407 Separate blue dye from lapis lazuli.
* Add craftitem "mcl_core:lapis".
* Add texture for blue dye item.
* Add crafting recipe for blue dye.
* Add legacy conversion recipe.
* Update dyes table.
* Update translations.
* Update lapis block crafting recipes.
* Update lapis ore drops.
* Update dungeon and shipwreck loot.
* Update enchanting table input.
* Update villager trade.
2022-12-29 03:08:49 +00:00
kabou 7311071303 Separate black dye from squid ink sac.
* Add craftitem "mcl_mobitems:ink_sac".
* Add texture for black dye item.
* Add crafting recipe for black dye.
* Add legacy conversion recipe.
* Update dyes table.
* Update translations.
* Update fishing loot.
2022-12-29 03:08:49 +00:00
ancientmarinerdev 437842134e Merge pull request 'Slime, magma cube and cow spawning fixes.' (#3162) from slime_fixes into master
Reviewed-on: MineClone2/MineClone2#3162
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-29 02:14:32 +00:00
kabou 60b0cfe89a Remove FIXME about slimes spawning in swamps.
* This has been fixed.
2022-12-29 02:13:57 +00:00
kabou d8a883e81f Limit size of cow herds spawning.
* Cows should spawn in herds of max 4, not 8.
2022-12-29 02:13:57 +00:00
kabou 15f5c3c30a Make slimes spawn at night in swamps.
* Adds spawn definitions for large, small and tiny slimes to spawn in
  Swampland and MangroveSwamp biomes when light levels are less than 7.
2022-12-29 02:13:57 +00:00
kabou 4af8148850 Refactor spawn registrations.
* Unduplicate spawnable biome lists for slimes and magma cubes.
* Rename min and max spawndepth identifiers.
2022-12-29 02:13:57 +00:00
kabou ea6201d32f Add missing biome to slime spawn list.
* Add "MangroveSwamp_underground" to the lists of spawnable biomes for
  big, small and tiny slimes.
2022-12-29 02:13:57 +00:00
kabou da17ff8ea0 Remove stray dependency.
While mobs_mc_gameconfig was deleted at some point during the mob
refactoring, it was still listed in mobs_mc's mod.conf.
2022-12-29 02:13:57 +00:00
kabou 6756ee340c Mob spawning chatcommand refactoring.
* Put calculations that are only used conditionally inside the
  related `if` block.
* Make code logic more explicit.
* Take logging statement out of return value assignment.
* Remove duplicate assignment.
* Fix a typo in the function's description.
2022-12-29 02:13:57 +00:00
kabou 0c454a34c9 Use vectors in `get_next_mob_spawn_pos()` 2022-12-29 02:13:57 +00:00
kabou 8279dcb3dd Add FIXME notes to slime mob code.
Missing features:
* Slimes should not only spawn in caves, but also at night in swamps.
* Slimes should only spawn on 10% of the map ("slime chunks").
* There are no spawn eggs registered for small and tiny slimes and magma
  cubes.
2022-12-29 02:13:57 +00:00
kabou ea19f02e14 Assorted `spawn_children_on_die` fixes.
* Use proper vector semantics.
* Optimize away superfluous temp variables and repetitive local variable
  declarations.
2022-12-29 02:13:57 +00:00
kabou 95cbac78a8 Change number of children spawned on die.
When a slime or magma cube dies, it should spawn between 2 to 4 smaller
children.  The code was always spawning 4 children (3 for big magma
cubes).  This commit makes the following changes to the function
`spawn_children_on_die`:
* Make the number of children spawned a random number between 2 and 4.
* No longer accept the `children_count` as an argument, because this
  number should always be a random number between 2 and 4 anyway.
* Update all callers accordingly.
2022-12-29 02:13:57 +00: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
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
ancientmarinerdev 81daec14a2 Merge pull request 'Update sounds from MTG' (#3157) from grorp/MineClone2:patch-1 into master
Reviewed-on: MineClone2/MineClone2#3157
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-27 21:36:33 +00:00
kabou 5e129985f2 Put back default sky and fog color.
Recent changes set the default colors to some pretty psychedelic ones.
The stated purpose was debugging, but in absense of any actual debugging
code other than v6 mapgen inadvertently assuming that role, more sensible
colors were reinstated.

If debugging code is desired, it should probably be added to the main
parts of mcl_weather.
2022-12-27 15:10:24 +01: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
PrairieWind 0dc31611ac Merge pull request 'Adjusts mcl_crimson Doors to have a specified side texture' (#3140) from Wbjitscool/MineClone2:master into master
Reviewed-on: MineClone2/MineClone2#3140
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-12-25 02:09:14 +00:00
PrairieWind b0070a3b83 Merge pull request 'Fix the disapearance of christmas texture of the ender chest once it is placed' (#3184) from 3raven/MineClone2:master into master
Reviewed-on: MineClone2/MineClone2#3184
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-12-25 01:46:14 +00:00
3raven 5964f25fa7 Merge branch 'master' into master 2022-12-24 17:01:13 +00:00
FossFanatic 2db9ea6459 Merge pull request 'Small Useless Textures Cleanup' (#3164) from useless_textures_cleanup into master
Reviewed-on: MineClone2/MineClone2#3164
Reviewed-by: kabou <kabou@noreply.git.minetest.land>
2022-12-24 15:16:28 +00:00
FossFanatic e0a9aca469 Merge branch 'master' into useless_textures_cleanup 2022-12-24 15:05:14 +00:00
FossFanatic fb8f59e918 Merge pull request 'Overworld Biome Sky And Fog Colours' (#3158) from biome_skycolor_overworld into master
Reviewed-on: MineClone2/MineClone2#3158
Reviewed-by: kabou <kabou@noreply.git.minetest.land>
2022-12-24 15:01:43 +00:00
FossFanatic 9eb86f011b Make the code clearer to read 2022-12-24 14:54:48 +00:00
3raven d3e8e24f42 Fix the disapearance of christmas texture of the ender chest once it is placed
Fix the disapearance of christmas texture of the ender chest once it is placed
2022-12-24 14:44:06 +00:00
FossFanatic 770dd0ec47 Merge branch 'master' into useless_textures_cleanup 2022-12-24 12:31:56 +00:00
FossFanatic 00b2afecad Merge branch 'master' into biome_skycolor_overworld 2022-12-24 12:31:10 +00: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
ancientmarinerdev cbf090485c Merge pull request 'Fix creative inventory view being reset upon taking damage' (#3102) from CyberMango/MineClone2:bug/mango/creative_inventory_view_resets_on_damage into master
Reviewed-on: MineClone2/MineClone2#3102
Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-24 01:18:16 +00: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
CyberMango bd38827f60 Fixes #2976
Now the inventory view on creative is no longer set to the survival
inventory upon taking damage.
Also the initial inventory view when openning a world in creative is at
the search page, not the survival inventory page.

mcl_inventory/init.lua no longer wraps mcl_armor.update_player to also
update the inventory view. This visual update happens anyways since it
is registered to happen on a visual change with
mcl_player.register_on_visual_change .

This also fixes a small visual bug that, on creative mode, if you would
equip/unequip an armor piece, the image of the player would be updated
twice.
2022-12-23 13:54:41 +02: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
FossFanatic 522bbbbe26 Delete 'mods/ENTITIES/mobs_mc/textures/mobs_mc_enderman_block.png' 2022-12-22 12:47:44 +00:00
FossFanatic e1f26ea70d Remove dry grass side texture
The same reason as why the dry grass top texture got removed.
2022-12-22 12:40:36 +00:00
FossFanatic 9ef4a850b1 Remove dry grass top texture
This is a remnant of Minetest Game and used to be for dry biomes before colour palettes were a thing in MineClone 2.
2022-12-22 12:40:10 +00:00
FossFanatic 4c23601d03 Remove useless amethyst texture
This texture is a remnant of the PixelPerfection resource pack and nowhere in the code does this texture get used.
2022-12-22 12:38:05 +00:00
FossFanatic 8d51e16b8e Remove obsolete texture 2022-12-22 12:34:14 +00: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
SakuraRiu 1b980849db Merge branch 'master' into master 2022-12-22 00:55:48 +00:00
Gregor Parzefall 14adcbbecb Make snow sound like snow while digging it 2022-12-21 22:39:26 +01:00
Michieal e0d48400a7 Fix the removal of bamboo extras. 2022-12-21 16:16:53 -05:00
Gregor Parzefall 7312c30f8e Update attribution of sounds
Also: Add myself to CREDITS.md
2022-12-21 22:13:08 +01: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
FossFanatic a50908e1eb Fix the flat biome having a beach sky colour 2022-12-21 16:00:04 +00:00
FossFanatic afbb8e2288 Add locals for certain hex codes that occur too many times 2022-12-21 15:57:33 +00:00
FossFanatic 79b1db4b1a Fix underwater fog colour regression 2022-12-21 14:04:47 +00:00
FossFanatic 1c752019f0 Make the explanation shorter 2022-12-21 13:08:23 +00:00
FossFanatic 1977dbf9a1 Remove excessive whitespace 2022-12-21 13:05:52 +00:00
FossFanatic 91836f3a1d Add sky and fog colour for each overworld biome 2022-12-21 13:04:46 +00:00
FossFanatic 35b2f3b638 Make overworld biome specific (daytime) sky and fog colours possible 2022-12-21 13:01:54 +00:00
Gregor Parzefall 4fcbe05be5 Remove a sound I forgot 2022-12-21 13:53:09 +01:00
Riu Sakura 8f80c6e6a6 Added missing word (Breeding). 2022-12-21 14:23:57 +09: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
Riu Sakura 3faa930bdc Added missing translations.
In addition, the translation of "Grass Block" has been corrected to a better phrase.
2022-12-21 10:24:26 +09:00
ancientmarinerdev a6e0da0e07 Merge pull request 'Fixes MineClone2/MineClone2#3120 | Complete re-upload of the mcl_bamboo branch.' (#3123) from mcl_bamboo_new into master
Reviewed-on: MineClone2/MineClone2#3123
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-21 00:47:21 +00:00
Michieal 41ab80183e Darken the Warped Hyphae Log (side) texture 2022-12-20 18:02:48 -05:00
ancientmarinerdev 1c24adb714 Merge pull request 'Animated Nether Tree Textures' (#3155) from FossFanatic/MineClone2:animated_nether_trees_possible into master
Reviewed-on: MineClone2/MineClone2#3155
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-20 21:19:45 +00:00
Michieal 7003459b8d Merge remote-tracking branch 'origin/master' 2022-12-20 16:13:54 -05:00
Michieal 8d440f8464 Made purple warped_hyphae trapdoor so that it matched the sides. (The top was green, the sides were purple.)
Renamed the old trapdoor top to _alt.
2022-12-20 16:13:07 -05:00
ancientmarinerdev 658a08181c Merge pull request 'Nether Ores And Blackstone Fixes' (#3154) from FossFanatic/MineClone2:nether_ores_and_blackstone_fixes into master
Reviewed-on: MineClone2/MineClone2#3154
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-20 21:04:52 +00:00
Gregor Parzefall 605e4de455 Restore MCL changes to grass / leaves sounds 2022-12-20 21:12:56 +01:00
Gregor Parzefall 8522b87444 Removed two duplicated sound definitions 2022-12-20 21:08:59 +01:00
Gregor Parzefall e4abbbf112 Sound changes in code 2022-12-20 20:57:57 +01:00
Gregor Parzefall 718cdb553d More sound changes from MTG 2022-12-20 18:54:52 +01:00
Gregor Parzefall e2ec660f25 Update sounds from MTG 2022-12-20 18:21:31 +01:00
Wbjitscool 1b4bcda9da Update 'mods/ITEMS/mcl_mangrove/init.lua' 2022-12-20 02:58:58 +00:00
Michieal 39714fb096 optipng the mangrove door sides, and then moved them to the textures directory for mcl_mangrove. 2022-12-19 21:48:51 -05:00
Wbjitscool 258a1534d2 Upload files to 'mods/ITEMS/mcl_mangrove' 2022-12-20 02:42:27 +00:00
Michieal c995c8418c Optipng'd mangrove textures
cleaned up warped door (inv/wield images)
2022-12-19 21:32:44 -05:00
Wbjitscool 00121d9d97 Upload files to 'mods/ITEMS/mcl_crimson/textures'
fixed transperancy issue
2022-12-20 02:18:15 +00:00
Michieal 4f90fbcedd put in green alt warped door textures.
resized large textures to 16px textures.
optipng'd' them.
2022-12-19 20:57:32 -05:00
Michieal c7104a6f72 Made the warped doors purple.
Optipng'd all the textures in this module.
2022-12-19 20:48:47 -05:00
Wbjitscool 223f6640d2 Upload files to 'mods/ITEMS/mcl_crimson/textures' 2022-12-20 01:36:25 +00:00
Michieal feea815604 Warped Hyphae textures update. 2022-12-20 01:32:36 +00:00
Riu Sakura b1b2e06dc7 Removed invisible character codes.
Updated translations with the latest templates.
2022-12-20 08:37:24 +09:00
Michieal 1a56a32fa8 misc. error fix 2022-12-19 16:16:54 -05:00
Michieal 0a4243a0f3 Merge remote-tracking branch 'origin/mcl_bamboo_new' into mcl_bamboo_new
# Conflicts:
#	mods/ITEMS/mcl_bamboo/init.lua
2022-12-19 16:00:05 -05:00
Michieal 66a7c5757e Made bamboo buttons flammable, and made them into a fuel source.
Converted commented code snippet, addgroups() into global function.

Stairs will be a fuel source in part 2.
2022-12-19 15:57:27 -05:00
FossFanatic 083a57a4a1 Allow for animated hyphae textures 2022-12-19 19:36:28 +00:00
FossFanatic c512d28f02 Add blackstone top texture 2022-12-19 19:02:18 +00:00
FossFanatic 1056b6ca14 Add blackstone side texture 2022-12-19 19:02:18 +00:00
FossFanatic c8ec57bdbd Delete 'mods/ITEMS/mcl_blackstone/textures/mcl_blackstone.png' 2022-12-19 19:02:18 +00:00
FossFanatic 2dffe11cdd Add seperate gilded blackstone texture 2022-12-19 19:02:18 +00:00
FossFanatic f29622dd59 Allow for both top/bottom and side textures 2022-12-19 19:02:18 +00:00
FossFanatic d9bd3e2601 Add seperate nether gold ore texture 2022-12-19 19:02:17 +00:00
Michieal e53d7576c3 Made bamboo buttons flammable, and made them into a fuel source.
Converted commented code snippet, addgroups() into global function.

Stairs will be a fuel source in part 2.
2022-12-19 13:44:24 -05:00
Riu Sakura 2b61231f82 add japanese translation 2022-12-19 15:33:31 +09:00
Wbjitscool 40f7215368 upload to 'mods\ITEMS\mcl_crimson\textures'
another update for mcl_crimson png files
2022-12-19 04:33:19 +00:00
Wbjitscool 620cc97bad Upload files to 'mods/ITEMS/mcl_crimson/textures' 2022-12-19 04:22:59 +00:00
Michieal 64c8afc8f0 Undo the revert.
>.< /facepalm *grumbles*
2022-12-19 04:11:25 +00:00
Michieal f737df79e5 revert 7a3f373425
revert Misc. Fixes.
Added in burn times for slabs.
And then amend the commit to remove an oops.
2022-12-19 04:06:33 +00:00
Michieal 7a3f373425 Misc. Fixes.
Added in burn times for slabs.
And then amend the commit to remove an oops.
2022-12-18 22:41:33 -05:00
Michieal 63ea851e63 Merge remote-tracking branch 'origin/mcl_bamboo_new' into mcl_bamboo_new
# Conflicts:
#	mods/ITEMS/mcl_bamboo/init.lua
2022-12-18 22:35:57 -05:00
Michieal fe26f117da Misc. Fixes.
Added in burn times for slabs.
And then amend the commit to remove an oops.
2022-12-18 22:28:50 -05:00
Michieal 5191326fc7 Misc. Fixes.
Added in burn times for slabs.
2022-12-18 21:04:43 -05:00
ancientmarinerdev 45c85841e8 Merge pull request 'Add bookshelves and anvils as structure constructed nodes' (#3133) from structure_construct_nodes into master
Reviewed-on: MineClone2/MineClone2#3133
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-19 01:14:39 +00:00
Wbjitscool 4b8493f1a4 update 'mods/ITEMS/mcl_crimson/init.lua'
fixed some accidental changes that were not meant to happen sorry
2022-12-19 01:04:59 +00:00
PrairieWind 0a2f57476e Update Woodland Outpost Schematic
Switched double chest with barrels so that they work correctly
2022-12-19 01:03:53 +00:00
PrairieWind 256655df83 Add bookshelves and anvils as structure constructed nodes 2022-12-19 01:03:53 +00:00
Wbjitscool b3a8ba57e7 update 'mods/items/mcl_crimson/init.lua'
some new changes
2022-12-19 00:43:32 +00:00
ancientmarinerdev 20ca34233c Merge pull request 'Respawn Anchor Cleanup & Fixes' (#3129) from FossFanatic/MineClone2:more_respawn_anchor_changes into master
Reviewed-on: MineClone2/MineClone2#3129
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-18 23:17:53 +00:00
ancientmarinerdev 93814880d0 Merge pull request 'Make Night Sky Darker' (#3138) from FossFanatic/MineClone2:minecraft_like_night_sky into master
Reviewed-on: MineClone2/MineClone2#3138
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-18 22:44:42 +00:00
Michieal 1861d7d30d Conversation Fix. (Removed extra IF statement.) 2022-12-17 01:23:48 +00:00
Wbjitscool 49fb36bac2 Upload files to 'mods/ITEMS/mcl_crimson/textures'
the png files for thoes changes
2022-12-16 05:27:23 +00:00
Michieal c09ed02801 A more elegant solution for slabs
After a good bit of trial and error, and asking questions... I have rewritten the override code and it works. (tested, slabs can now be used to make composters and barrels with this method.)
2022-12-16 05:24:54 +00:00
Michieal da4e359df0 Merge branch 'master' into mcl_bamboo_new 2022-12-16 04:09:56 +00:00
Michieal 4da20f5e73 Main - Fixed Bamboo Sign Errors.
Fixed Stripped Bamboo Block Description.
Added in Bamboo Plank Recipe that uses Stripped Bamboo Blocks.
Removed double translation of "Bamboo Sign" in sign registration. (Caused the Bamboo Sign Errors.)
Added bamboo plank slabs to the group "wood_slabs" so that the barrel recipe works oob.
2022-12-15 22:35:10 -05:00
ancientmarinerdev 4ba3af5c73 Merge pull request 'Add `.editorconfig` file to enforce codestyle in compatible editors' (#3091) from editorconfig into master
Reviewed-on: MineClone2/MineClone2#3091
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-15 22:59:08 +00:00
AFCMS 3a619ba8e4 Basic editorconfig file 2022-12-15 22:57:18 +00:00
ancientmarinerdev 1859f44bd6 Merge pull request 'Refactor leaf decay mechanics.' (#3099) from refactor-leaves into master
Reviewed-on: MineClone2/MineClone2#3099
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-15 22:44:19 +00:00
kabou 4e282df905 Mangrove roots are not leaves and some trivia.
* Remove `leaves` group from mangrove roots node registration.  Mangrove
  roots should not decay like leaves do.
* Fix some formatting weirdness.
* Add a "fixme" comment to some duplicated code that causes luacheck to
  complain.
2022-12-15 22:42:09 +00:00
kabou 1b0b2b8b04 Add `compostability` group to mangrove leaves. 2022-12-15 22:42:09 +00:00
kabou c33d7d0106 Remove duplicate callback registration.
* `on_place` was registered twice in mangrove tree trunk node
  registration.  Remove one.
2022-12-15 22:42:08 +00:00
kabou cec5b1668a Remove unused `leafdecay` group.
* This group is no longer used and is removed from leaves node groups.
* Since it was never added to GROUPS.md, nothing needs changed there.
* Remove the `leafdecay_distance` parameter from node registrations.
2022-12-15 22:42:08 +00:00
kabou adcf03e0c6 Refactor leaf decay ABM.
* The leaf decay ABM no longer scans all leaves nodes.  Now only
  "orphaned" leaves are decayed.  These nodes are placed by callbacks
  in tree trunk nodes upon their destruction.
* This commit also removes the tree trunk node caching system and an
  abm throttling mechanism and its associated globalstep function.
2022-12-15 22:42:08 +00:00
kabou a4ef367708 Add "orphaned" leaves nodes.
* Add "orphaned" leaves nodes, these are copies of the regular leaves
  nodes whose sole purpose is to replace leaves nodes when no more tree
  trunks are present nearby.  The orphaned nodes are swapped in by a
  callback on destruction of tree trunk nodes and will be decayed by a
  dedicated abm that processes all nodes in `group:leaves_orphan`.
* Add `mcl_core.update_leaves()` function, a `after_destruct` callback
  handler for tree trunk nodes.  The function finds leaves nodes nearby
  destroyed tree trunk nodes and swaps these for orphaned leaves nodes
  if no other tree trunk nodes remain near them.
* Add `after_destruct` callbacks to tree trunk node registrations in
  mcl_core/nodes_trees.lua and mcl_mangrove/init.lua to update orphaned
  leaves.
* Add entry for group `leaves_orphan` to GROUPS.md
* Also add entry for group `leaves` to GROUPS.md (it was missing).
2022-12-15 22:42:08 +00:00
ancientmarinerdev 20e78099d7 Merge pull request 'village_schema_fixes' (#2989) from village_schema_fixes into master
Reviewed-on: MineClone2/MineClone2#2989
2022-12-15 21:54:48 +00:00
ancientmarinerdev 94a37790aa Fix incorrectly sized foundations 2022-12-15 21:52:24 +00:00
ancientmarinerdev 89f5d41366 Fix village building foundation material for desert 2022-12-15 21:52:24 +00:00
ancientmarinerdev b33b87b9dd Fix village building foundations 2022-12-15 21:52:24 +00:00
ancientmarinerdev 295970fbac Adding extra row of blocks in front of doors to schemas so villagers can get out 2022-12-15 21:52:24 +00:00
ancientmarinerdev 639825a8da Merge pull request 'release/0.81.1_merge_conflict_fix' (#3132) from release/0.81.1_merge_conflict_fix into master
Reviewed-on: MineClone2/MineClone2#3132
2022-12-15 19:56:59 +00:00
FossFanatic 0f8cfbf106 Some small night sky adjustments 2022-12-15 16:46:47 +00:00
FossFanatic 39e9158c01 Make night sky darker 2022-12-15 16:05:34 +00: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
ancientmarinerdev 254caaff37 Merge conflict fixes for release 0.81.1 2022-12-14 21:38:53 +00:00
ancientmarinerdev 1ac6c45c7f Update release readme 2022-12-14 20:17:21 +00:00
ancientmarinerdev 5b68007902 Pre-release update credits and set version 0.81.1 2022-12-14 20:13:06 +00:00
FossFanatic 35967caf71 Change some things 2022-12-14 14:43:45 +00:00
Michieal 29bc74dde9 Code reformat. 2022-12-14 03:26:22 -05:00
Michieal ca1a46efa7 A complete re-upload of MineClone2/MineClone2#3120
Doing this to just fix it.
2022-12-13 23:32:54 -05:00
Michieal 997b6875a2 Merge pull request 'performance_fix_raids' (#3092) from performance_fix_raids into release/0.81.1
Reviewed-on: MineClone2/MineClone2#3092
Increases performance.
Tested by myself, and by other players.
2022-12-11 23:29:13 +00:00
ancientmarinerdev 38e49a4b80 Merge pull request '`mcl_hoppers` fixes' (#2983) from mcl-hoppers-fixes into master
Reviewed-on: MineClone2/MineClone2#2983
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-11 20:55:59 +00:00
ancientmarinerdev 9b94a752bd Fixed bug that crashes zombie siege in context where z cannot spawn 2022-12-11 20:22:06 +00:00
ancientmarinerdev ab3530c356 Merge pull request 'Nylium Block Fixes' (#3084) from FossFanatic/MineClone2:nylium_block_fixes into master
Reviewed-on: MineClone2/MineClone2#3084
Reviewed-by: kabou <kabou@noreply.git.minetest.land>
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-11 03:21:11 +00:00
ancientmarinerdev fbed60bd2d Merge pull request 'Bee Block Sounds' (#3085) from FossFanatic/MineClone2:bee_block_fixes into master
Reviewed-on: MineClone2/MineClone2#3085
Reviewed-by: kabou <kabou@noreply.git.minetest.land>
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-11 02:55:22 +00:00
ancientmarinerdev bf34ca5f50 Merge pull request 'Add Seagrass Item Texture' (#3088) from FossFanatic/MineClone2:seagrass_item_image_fix into master
Reviewed-on: MineClone2/MineClone2#3088
Reviewed-by: kabou <kabou@noreply.git.minetest.land>
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-11 02:29:06 +00:00
ancientmarinerdev 055432c1f7 Merge pull request 'Fix the bug that baby (non-monster) mobs cant jump over blocks' (#3093) from CyberMango/MineClone2:dev/mango/fix_baby_mobs_jump into master
Reviewed-on: MineClone2/MineClone2#3093
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-11 02:17:01 +00:00
AFCMS 7a371dc846
Format file again 2022-12-10 22:38:08 +01:00
AFCMS 7deec7ae03
Refactor hopper -> composter ABMs 2022-12-10 22:38:08 +01:00
AFCMS 47eda5b69e
Only register hopper -> composter ABMs if composter mod is enabled 2022-12-10 22:38:07 +01:00
AFCMS 8d921c0671
Add some type annotations 2022-12-10 22:38:07 +01:00
AFCMS 804aa388b5
Some manual formatting 2022-12-10 22:38:07 +01:00
AFCMS fcf9c35324
Use new vectors everywhere 2022-12-10 22:38:06 +01:00
AFCMS 9cc63ed716
Use `table.concat` for formspec generation 2022-12-10 22:38:06 +01:00
AFCMS c49f000894
Fix formating 2022-12-10 22:38:06 +01:00
CyberMango f7f2b97b13 Fixed #2313 - baby mobs cant jump over blocks.
Simply removed a line that specifies they shouldnt do that.
2022-12-10 19:54:44 +02:00
ancientmarinerdev f7f0a2be8b Raids performance optimisation. Check for village less and over less distance. 2022-12-09 22:59:58 +00:00
ancientmarinerdev e408dd45e5 Remove easter egg taking 3% of processing 2022-12-09 19:30:06 +00:00
FossFanatic adead97905 Add seagrass item texture 2022-12-08 17:37:14 +00:00
FossFanatic ef33891b3f Add seagrass item texture 2022-12-08 17:36:28 +00:00
FossFanatic 1c5170d36f Add sounds to bee nests and beehives 2022-12-08 11:43:58 +00:00
FossFanatic cf3e65e34e Add sounds to honey and honeycomb blocks 2022-12-08 11:43:06 +00:00
FossFanatic 0593a63626 Fix nylium blocks 2022-12-08 11:09:30 +00:00
AFCMS 2b46dd60c5 Merge pull request 'Fix right click on copper crash' (#3076) from bugfix/fix_copper_right_click into master
Reviewed-on: MineClone2/MineClone2#3076
Reviewed-by: AFCMS <afcm.contact@gmail.com>
2022-12-07 17:27:47 +00:00
ancientmarinerdev 9d87dcf611
Fix right click on copper crash 2022-12-07 18:27:11 +01:00
AFCMS 0f99373779 Merge pull request '`mobs_mc` silverfish fixes' (#2935) from mc-mobs-silverfish-fixes into master
Reviewed-on: MineClone2/MineClone2#2935
Reviewed-by: kabou <kabou@noreply.git.minetest.land>
2022-12-07 17:24:09 +00:00
AFCMS bbf21762a6
Format again 2022-12-07 18:22:54 +01:00
AFCMS 34a7cf3e9f
Remove duplicated `reach` field 2022-12-07 18:22:54 +01:00
AFCMS 3153c41f3a
Remove mtg compatibility code 2022-12-07 18:22:53 +01:00
AFCMS 489d3b7da6
Format file 2022-12-07 18:22:53 +01:00
ancientmarinerdev 2d05f9bc89 Merge pull request 'mcl_ver_info' (#3043) from mcl_ver_info into master
Reviewed-on: MineClone2/MineClone2#3043
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-06 23:43:00 +00:00
Michieal 8256fe6f04 remove extraneous messages 2022-12-06 23:40:11 +00:00
Michieal bceb9cd855 Removed the id= line.
Since we don't know when the api will be finished, I removed the ID line just in case.
2022-12-06 23:40:11 +00:00
Michieal 1c1ae53cec Fixed game.conf to work with the workaround by reubenwardy. 2022-12-06 23:40:11 +00:00
Michieal 0bc88b55e5 Added in Workaround for ID not yet implemented in 5.70-Dev Minetest.
For more information, please see: https://github.com/minetest/minetest/pull/12989#issuecomment-1336407807
2022-12-06 23:40:11 +00:00
Michieal d80dd41cb4 Add in template file for translations. 2022-12-06 23:40:11 +00:00
Michieal 43a69c445f Added in Error Handling
The /ver command now has error handling, so that it will work regardless of minetest version, and will tell the user to update the minetest version for support. 

Also updated the mod.conf to have the author field filled out. 

todo: still needs translation files.
2022-12-06 23:40:11 +00:00
Michieal dbe0437201 add in translator code for S("") 2022-12-06 23:40:11 +00:00
Michieal 51372da2b9 update game.conf to have version id code for /ver command. 2022-12-06 23:40:11 +00:00
Michieal 283b7c7410 Add in Versioning info using /ver command. 2022-12-06 23:40:10 +00:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 bfa75dbcd2 Merge pull request 'Pressure plates check for entity contact' (#3033) from pplates into master
Reviewed-on: MineClone2/MineClone2#3033
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-06 13:48:26 +00:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 7c87ed2d6c Add rightclick support to pplates 2022-12-05 14:25:11 -06:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 d8c16b1f31 Add 1 sec deactivation delay to pplates 2022-12-05 14:25:10 -06:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 ba292aeb5d Pressure plates check for entity contact 2022-12-05 14:25:10 -06:00
ancientmarinerdev 055a93843f Merge pull request 'Fix incorrect call to gopath for raid due to mobs refactor.' (#3063) from bugfix/raids_crash_gopath into master
Reviewed-on: MineClone2/MineClone2#3063
Reviewed-by: kabou <kabou@noreply.git.minetest.land>
2022-12-05 13:10:01 +00:00
ancientmarinerdev a3cded0133 Fix zombie siege calling gopath incorrectly 2022-12-05 00:13:49 +00:00
ancientmarinerdev 2b52eaa6ef Fix incorrect call to gopath for raid due to mobs refactor. 2022-12-04 22:34:31 +00:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 71a03bff6f Merge pull request 'Fix Axelotl crash for right click' (#3057) from axelotl_fix into master
Reviewed-on: MineClone2/MineClone2#3057
Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
2022-12-04 18:04:02 +00:00
ancientmarinerdev a0a0c69213 Fix Axelotl crash for right click 2022-12-04 11:34:48 -06:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 e57551f764 Merge pull request 'Replace lighting rod nodebox by 3d model' (#3042) from mcl-lightning-rod-model into master
Reviewed-on: MineClone2/MineClone2#3042
Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
2022-12-04 17:20:29 +00:00
AFCMS 18cfb88ae5 Replace lighting rod nodebox by 3d model 2022-12-04 11:13:36 -06:00
chmodsayshello 826b9fcc45 Merge pull request 'Add Recovery Compasses' (#3049) from recovery_compass into master
Reviewed-on: MineClone2/MineClone2#3049
Reviewed-by: AFCMS <afcm.contact@gmail.com>
2022-12-02 20:57:15 +00:00
chmodsayshello 7dacfe2cba make recovery compass spin randomly in other dimensions 2022-12-02 18:52:31 +01:00
chmodsayshello 7d57e73ae4 fix recovery compass overwriting every other item 2022-12-02 15:43:08 +01:00
chmodsayshello 7f59611914 add crafting recipie 2022-12-02 15:40:18 +01:00
chmodsayshello 927fd60786 translation stuff 2022-12-01 21:20:39 +01:00
chmodsayshello ab031daa5a recovery compass 2022-12-01 21:13:41 +01:00
cora 588425df73 Merge pull request 'Fix twisted vines breaking block when growing' (#3037) from fix_tvines_breaking into master
Reviewed-on: MineClone2/MineClone2#3037
2022-11-29 11:23:21 +00:00
cora 25d0f2b0c4 Fix twisted vines breaking block when growing 2022-11-29 12:21:33 +01:00
cora 85e7de6c14 Merge pull request 'Sweetberry, nethervines: Fix placing in protected area' (#3038) from fix_sweet_berry_protection into master
Reviewed-on: MineClone2/MineClone2#3038
2022-11-29 11:21:14 +00:00
cora d395c82183 Fix bonemeal creative for sweet berries and nether vines 2022-11-29 12:20:39 +01:00
cora 34a558ced9 Sweetberry, nethervines: Fix placing in protected area 2022-11-29 12:20:39 +01:00
cora 17f789550d Merge pull request 'Fix creeper crash (wrong self ref)' (#3044) from fix_creeper_crash into master
Reviewed-on: MineClone2/MineClone2#3044
2022-11-29 02:42:12 +00:00
cora 9508cd4c25 Fix creeper crash 2022-11-29 03:28:19 +01:00
cora c4808beef4 Merge pull request 'Mobs fixes' (#3032) from mobs_cleanup into master
Reviewed-on: MineClone2/MineClone2#3032
2022-11-28 03:26:53 +00:00
cora 69c64a2c24 Fix wrong self ref with mcl_mobs.spawn_child 2022-11-28 03:26:51 +01:00
cora 318da7e3c9 Fix local go_to_pos call 2022-11-28 03:26:51 +01:00
cora 5e022ef083 Merge pull request 'Epic hamburger fight PR' (#2959) from mcl_hamburger into master
Reviewed-on: MineClone2/MineClone2#2959
2022-11-28 02:06:48 +00:00
Michieal c45e4d292a Added in Author Info to the conf file. 2022-11-28 03:03:42 +01:00
Michieal a542503b72 Delete '.idea/vcs.xml' 2022-11-28 03:03:42 +01:00
Michieal 4b570b1aa9 Delete '.idea/modules.xml' 2022-11-28 03:03:42 +01:00
Michieal cc190eeb62 Delete '.idea/misc.xml' 2022-11-28 03:03:42 +01:00
Michieal 7e31ece325 Delete '.idea/MineClone2-mcl_hamburger.iml'
.
2022-11-28 03:03:42 +01:00
Michieal b783e616df Delete '.idea/.gitignore'
.
2022-11-28 03:03:42 +01:00
Michieal f1ae86ede5 Add in the Translation files for the base languages. 2022-11-28 03:03:42 +01:00
Michieal c63533c753 Updated the readme.txt to reflect the changes. 2022-11-28 03:03:42 +01:00
Michieal 81fa7cf74c Removed outdated translate files.
made new translation template.
Changed _alt image.
Updated the readme.txt to reflect the changes.

Added a secondary crafting recipe for the Hamburger.
2022-11-28 03:03:42 +01:00
Michieal 5378aae09e Add in achievement. 2022-11-28 03:03:42 +01:00
Michieal aec16ee62e Textures redo. 2022-11-28 03:03:42 +01:00
cora 0cdf84ab47 Fix translation warning 2022-11-28 03:03:42 +01:00
cora 31395a8830 make setting just hide the hamburger, not disable it 2022-11-28 03:03:42 +01:00
cora 8e74a5a56a some basic burger cleanup 2022-11-28 03:03:42 +01:00
Michieal 2149ca1147 Fixed the name in mod.conf.
updated the mod.conf so that it reflects the coding to come.
2022-11-28 03:03:42 +01:00
Michieal de7696ce69 Changed calling function. 2022-11-28 03:03:42 +01:00
Michieal 4b777b1d9c Fixed Indentation. 2022-11-28 03:03:42 +01:00
Michieal dadb8f9287 fix indentation. 2022-11-28 03:03:42 +01:00
Michieal 83b40f8cff add flavor text, code clean up
Changed to have the flavor text to give it character.
Fixed misspellings.
Cleaned up the code from the initial commit.
Changed from API to single item.
Fixed the mod name, so that it matches "mcl_" format.

Added comments.
2022-11-28 03:03:42 +01:00
cora ce95f034b4 Add setting to turn hamburgers on and off 2022-11-28 03:03:39 +01:00
Michieal 2b3ec8d944 remove .idea files 2022-11-28 03:02:51 +01:00
Michieal 972e9ea0f8 Fix initial commit. 2022-11-28 03:02:51 +01:00
Michieal df62a3aac1 Initial code comit 2022-11-28 03:02:51 +01:00
cora 7cc25c4670 Merge pull request 'grand mcl_mobs cleanup part 1' (#2925) from mobs_cleanup into master
Reviewed-on: MineClone2/MineClone2#2925
2022-11-27 13:57:35 +00:00
cora ebf214c043 Check if spawndef exists when spawning 2022-11-27 14:53:17 +01:00
cora 7bd0b5a9b1 Some more missing arg fixes 2022-11-27 14:53:16 +01:00
cora bc496a8682 Finally indent register_mob and make registered mobs global 2022-11-27 14:53:16 +01:00
cora a3415647d4 Fix do_jump call in combat.lua 2022-11-27 14:53:16 +01:00
cora 4909ef6ff7 Restructure on_step a bit 2022-11-27 14:53:16 +01:00
cora 3c6d79ecb3 Add entity name to debug box 2022-11-27 14:53:16 +01:00
cora 6948b77226 move debug/nametag code back to api.lua 2022-11-27 14:53:16 +01:00
cora 90321ee578 Fix leftover local do_attack call 2022-11-27 14:53:16 +01:00
cora 2b691dea07 Fix some more global var warnings 2022-11-27 14:53:16 +01:00
cora c25287e493 Some cleanup 2022-11-27 14:53:16 +01:00
epCode 762f64a4d1 Fix mob rotation glitching out near 0/360 in degrees
The problem mainly was that the set_yaw function was not allowing for negitive values.
2022-11-27 14:53:16 +01:00
cora db63f1c453 fix leftover pi shortcut 2022-11-27 14:53:16 +01:00
cora faa38ffab8 Fix some warnings 2022-11-27 14:53:16 +01:00
cora 19d6d43b39 move on_blast default to mob default def 2022-11-27 14:53:16 +01:00
cora 28b6fcf289 Move detach_child to mount.lua 2022-11-27 14:53:16 +01:00
cora 80490b4c11 Move smooth rotation to separate function 2022-11-27 14:53:16 +01:00
cora 5e177c61f6 Move on_step despawning to separate function 2022-11-27 14:53:16 +01:00
cora c9c2b874be move relative animation speed to separate function 2022-11-27 14:53:16 +01:00
cora 18c415f6a0 put head swivel in separate function 2022-11-27 14:53:16 +01:00
cora 49670d1d28 put water flow code in separate function 2022-11-27 14:53:16 +01:00
cora a25cd921f2 move do_states to movement.lua 2022-11-27 14:53:16 +01:00
cora 91b5b6266c move stray particle spawner func to effects 2022-11-27 14:53:16 +01:00
cora 148b30694f Fix monster_attack and some other settings issues 2022-11-27 14:53:16 +01:00
cora f4374d9efd Fix item drops 2022-11-27 14:53:16 +01:00
cora b41d6a1cae Fix mob_punch 2022-11-27 14:53:16 +01:00
cora 6548b7fe47 move stray pathfinding funcs to pathfinding file 2022-11-27 14:53:16 +01:00
cora c7681af53e Move registration functions to init.lua 2022-11-27 14:53:16 +01:00
cora cc77e109f5 Split off general movement functions 2022-11-27 14:53:16 +01:00
cora e7d9ded9ab Split off combat funcs 2022-11-27 14:53:16 +01:00
cora 96d697c5cd Split off pathfinding, use metatables 2022-11-27 14:53:16 +01:00
cora 01abfea16d Split off item management 2022-11-27 14:53:16 +01:00
cora bbba7cee41 Add compat for old "wrong" : notation 2022-11-27 14:53:16 +01:00
cora e82c318f0c Split off breeding 2022-11-27 14:53:16 +01:00
cora 70834d0f5d make register functions use the . notation 2022-11-27 14:53:16 +01:00
cora d62dbcb852 effects -> separate file + metatable 2022-11-27 14:53:16 +01:00
cora 67fd8c8b40 split off physics functions into separate file + use metatable 2022-11-27 14:53:16 +01:00
cora 90639ef99d remove unused functions 2022-11-27 14:53:16 +01:00
cora 31ef791cfd Add proper metatable to mobs 2022-11-27 14:53:16 +01:00
cora 4d5104ff8f Merge pull request 'Add disallowed mapgen setting for v6' (#3021) from disable_v6_mapgen into master
Reviewed-on: MineClone2/MineClone2#3021
2022-11-27 13:52:45 +00:00
cora b7962b067f Add disallowed mapgen setting for v6 2022-11-27 14:50:58 +01:00
cora 19dc86c951 Merge pull request 'Cocoa Pods Cleanup' (#2974) from FossFanatic/MineClone2:cocoa_pod_fixes into master
Reviewed-on: MineClone2/MineClone2#2974
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-27 13:49:24 +00:00
cora e3ee224532 Merge pull request 'version -> 0.82.0 (indev)' (#3030) from release_0.81.0 into master
Reviewed-on: MineClone2/MineClone2#3030
2022-11-27 13:36:22 +00:00
cora c209bff157 version -> 0.82.0 (indev) 2022-11-27 14:35:54 +01:00
cora 59a7608dfc Merge pull request 'Release 0.81.0' (#2952) from release_0.81.0 into master
Reviewed-on: MineClone2/MineClone2#2952
2022-11-27 12:59:28 +00:00
cora 8b08707e3f Add Faerraven to texture credits 2022-11-27 04:54:30 +01:00
cora dd8f64e039 Add Ranko Saotome to credits 2022-11-27 04:40:14 +01:00
cora 56519c881e Set version to 0.81 2022-11-27 04:40:14 +01:00
cora 944d53111a Update credits 2022-11-27 04:40:14 +01:00
PrairieWind 33c3007709 Merge pull request 'Final fixes for 0.81' (#3027) from final_fixes into master
Reviewed-on: MineClone2/MineClone2#3027
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-11-27 03:38:14 +00:00
PrairieWind 8d5aea9743 Fix New Button Names 2022-11-27 03:36:38 +00:00
cora fa2a2bb8ac Remove mcl_copper screenshot 2022-11-27 03:36:38 +00:00
cora ee808e8f84 optimize excessively large mcl_shield_hud.png texture 2022-11-27 03:36:38 +00:00
cora 53d11ec71b Add new wood types buttons 2022-11-27 03:36:38 +00:00
cora f1aca79f9c Merge pull request 'Player location using mcl_info' (#3022) from mcl_info_player_coords into master
Reviewed-on: MineClone2/MineClone2#3022
2022-11-27 03:33:48 +00:00
cora fb8b3d5f55 Cleanup mcl_info clutter and messy var localization 2022-11-27 04:31:24 +01:00
Michieal 8184d4938c Modify init.lua to allow normal player usage.
Changes made:
* Put in new chatcommand /whereami to allow normal players to turn on / off player location coords without needing special privs.
* Made Debug Coords level 2, Player Location level 1, and Off level 0. (Allows turning the location off.)
* Put in nil value check into get_text, to prevent errors caused by definitions accidentally not returning a value.
* Cached pairs, ipairs, and table because the code is called every 0.63 seconds, and it made sense to do so. (Hopefully, will help
  to mitigate the added load on framerate.)
2022-11-27 04:31:24 +01:00
Michieal da64a10403 mcl_info: Add player coords field to debug hud 2022-11-27 04:31:24 +01:00
cora 2a54ea6e74 mcl_info: Allow debug field that's visible for everyone 2022-11-27 04:31:24 +01:00
PrairieWind 8b7b2f02e9 Merge pull request 'Fish buckets save and restore object properties in item entity' (#3013) from fish_bucket_save into master
Reviewed-on: MineClone2/MineClone2#3013
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-11-27 03:10:11 +00:00
cora 927eff691c Fix node on_rightclick with fishbucket 2022-11-27 04:02:34 +01:00
cora efdd22d69f Fix fishbuckets placing water in the nether 2022-11-27 00:17:13 +01:00
cora f14bfdc0cd Clear item meta when turning fishbucket to empty bucket
before it simply set a different itemstring, now it creates a
whole new itemstack
2022-11-26 22:18:46 +01:00
cora 66322a873b Fix infinite fishbucket placement in survival/creative 2022-11-26 22:18:46 +01:00
cora e134cc5e65 make it possible to place fishbucket in flowing riverwater 2022-11-26 22:18:46 +01:00
cora 1fcedd1375 Fix fishbucket _on_dispense 2022-11-26 22:18:46 +01:00
cora bb73e5f1cd Make it possible to pick up fish with river water bucket 2022-11-26 22:18:46 +01:00
cora d4c2501d62 Axolotl cleanup, remove clutter 2022-11-26 22:18:46 +01:00
cora 708fcfb368 Axolotl: remove cod-inherited swarming code 2022-11-26 22:18:46 +01:00
cora ebf4678e54 mcl_buckets whitespace fixes 2022-11-26 22:18:46 +01:00
cora b4971b298d Move fish bucket code to separate file 2022-11-26 22:18:46 +01:00
cora d3349396b4 Save tropical fish properties in item meta on bucket pickup 2022-11-26 22:18:46 +01:00
cora 665e8a06a2 Save axolotl properties in item meta on bucket pickup 2022-11-26 22:18:46 +01:00
cora 67e8f13a96 Axolotl whitespace fixes 2022-11-26 22:18:46 +01:00
cora 99db678a44 Fish buckets set properties from bucket item meta 2022-11-26 22:18:46 +01:00
cora dd58bed5d1 refactor fish bucket code to not use bucket api
it was clearly not made for this
2022-11-26 22:18:46 +01:00
cora 9cf910c47f Merge pull request 'Event api, Raids, Zombie sieges' (#2833) from events into master
Reviewed-on: MineClone2/MineClone2#2833
Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
2022-11-26 21:12:46 +00:00
cora 69f5bad0bb Document mcl_events 2022-11-26 17:06:04 +01:00
cora ac7038e7a5 Raids/raidcaptain: Nil check cmi_cause
apparently is nil sometimes
2022-11-26 17:06:04 +01:00
cora 3b368fdd5a Fix wrong var name for mob table 2022-11-26 17:06:04 +01:00
cora 624092ddd3 Search the area before giving up when no mobs in table left
otherwise it will advance stages prematurely
2022-11-26 17:06:04 +01:00
cora dabc09adb2 Lower and unify distance check 2022-11-26 17:06:04 +01:00
cora d0ea7c4059 Set events metatable correctly 2022-11-26 17:06:04 +01:00
cora 87d5cdc439 Make raid end firework last a bit longer 2022-11-26 17:06:04 +01:00
cora c6fc388597 Add _harmless option for rocket arrows
so event fireworks dont grief things
2022-11-26 17:06:04 +01:00
cora 93e5034317 Add fireworks when raid complete 2022-11-26 17:06:04 +01:00
cora 8564a12398 Nerf vex summoning so evoker doesnt spawn infinite vexes 2022-11-26 17:06:04 +01:00
cora e5515ed119 Add debug field: active event counter
to verify it doesn't memleak
2022-11-26 17:06:04 +01:00
cora 94057aa7e5 Code cleanup 2022-11-26 17:06:04 +01:00
cora db4f9ec5a3 Fix raid instawin when no spawnable blocks found 2022-11-26 17:06:04 +01:00
cora 057a78ed30 Fix raid registering as completed when unloading the area 2022-11-26 17:06:04 +01:00
cora 22fa5096c9 Add debug command status feedback 2022-11-26 17:06:04 +01:00
cora 2147790b44 Add setting to disable events 2022-11-26 17:06:04 +01:00
PrairieWind a1e21b44c8 Add code to unlock Voluntary Exile advancement 2022-11-26 17:06:04 +01:00
cora 358250012f Remove banner when not attached 2022-11-26 17:06:04 +01:00
cora 608da950e4 Abort events when no player is near 2022-11-26 17:06:04 +01:00
cora c3455de604 Clear bad omen when raid complete 2022-11-26 17:06:04 +01:00
cora 6251c623dd Give player bad omen effect when killing captain 2022-11-26 17:06:04 +01:00
cora 62fe08de59 Make illagers pick up ominous banners and promote themselves to captain 2022-11-26 17:06:04 +01:00
cora af0c718538 Add natural raidcaptain spawning 2022-11-26 17:06:04 +01:00
cora 3600bc8066 Spawn raidcaptain in raids 2022-11-26 17:06:04 +01:00
cora d1788b5643 Add actual banner pattern, drop banner on death 2022-11-26 17:06:04 +01:00
cora c7cc9ccb3e Add raid captain spawn func with banner attach 2022-11-26 17:06:04 +01:00
cora 097ee8b4d4 Z sieges happen in 10% of the nights 2022-11-26 17:06:04 +01:00
cora 59d384020e Finx spawn positions in 16-radius 2022-11-26 17:06:04 +01:00
cora 1d18482103 Comment out excessive logging 2022-11-26 17:06:04 +01:00
cora b82912f30d Add zombie sieges 2022-11-26 17:06:04 +01:00
PrairieWind 48a8511052 Make bossbars enablable/disablable per event type. Update some capitalization. 2022-11-26 17:06:04 +01:00
PrairieWind 160d7ca6fa Add Voluntary Exile Advancement 2022-11-26 17:06:04 +01:00
cora ae90cbe3ef Set raiders on path to village after spawn 2022-11-26 17:06:04 +01:00
cora 9893dee1aa Add debug chatcommand to start events 2022-11-26 17:06:04 +01:00
cora 232f57c247 Add hero of the village achievement 2022-11-26 17:06:04 +01:00
cora dc017864fd raids: properly integrate potions api
supports "level" now, bad omen > 1 means extra wave additionally
the playername is saved in the event object now for later access
and events can be made exclusive to a certain radius now.
2022-11-26 17:06:04 +01:00
cora 2159edba05 Remove dependency on mcl_potions 2022-11-26 17:06:04 +01:00
cora 37144f8787 Check for actual raid conditions and positions 2022-11-26 17:06:04 +01:00
cora 7ab2c5fecd Make debug output an opt-in setting 2022-11-26 17:06:04 +01:00
cora 99fce095ef fix closure style function declarations
its BANNED in CONTRIB.md
2022-11-26 17:06:04 +01:00
cora 390aec5d7a Integrate raids with mcl_events 2022-11-26 17:06:04 +01:00
cora 052e76bfcc start at effective stage 1 2022-11-26 17:06:04 +01:00
cora f17a9220bb Add bossbar support 2022-11-26 17:06:04 +01:00
cora 627ce0dc3b Finish at max_stage not max_stage + 1 2022-11-26 17:06:04 +01:00
cora f06d5a1ee3 Add event api
prototype state, test with chatcommand /infest (debug priv)
2022-11-26 17:06:03 +01:00
PrairieWind 5dc1a3d456 Village Finder Tweaks 2022-11-26 17:06:03 +01:00
PrairieWind 1b6d778dd1 Add Village Checks 2022-11-26 17:06:03 +01:00
PrairieWind 96ac31bec3 Add Bad Omen Effect 2022-11-26 17:06:03 +01:00
PrairieAstronomer 8b6409b7f1 Add mcl_raids 2022-11-26 17:06:03 +01:00
cora 6e6f163b71 Merge pull request 'Fix pressure plates getting pressed by new chest size' (#3019) from pressureplates_chest_fix into master
Reviewed-on: MineClone2/MineClone2#3019
2022-11-26 16:03:53 +00:00
cora ba7da6a885 Fix pressure plates being pressed by new chest size
this fixes the problem for chests, with paintings it would need to
go down considerably ( .65 was the value i determined)
2022-11-26 16:52:19 +01:00
cora 3066d966a1 Add the missing wood types pressure plates 2022-11-26 16:52:19 +01:00
cora 626f61c2c1 Merge pull request 'Nether Plank Fixes' (#3023) from FossFanatic/MineClone2:nether_plank_fixes into master
Reviewed-on: MineClone2/MineClone2#3023
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-26 12:58:21 +00:00
FossFanatic f71759f184 Fix crimson & warped planks 2022-11-26 11:54:34 +00:00
cora 0942949c5d Merge pull request 'Fix axolotl breeding' (#3007) from Axolotl into master
Reviewed-on: MineClone2/MineClone2#3007
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-25 02:48:55 +00:00
cora b255c8c23e Merge pull request 'Fix Baby Striders being extra small' (#3010) from baby_strider_size_fix into master
Reviewed-on: MineClone2/MineClone2#3010
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-24 22:31:14 +00:00
PrairieWind e1ba319616 Fix Baby Striders being extra small 2022-11-24 14:46:54 -07:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 88897566d9 Fix axolotl breeding 2022-11-24 09:10:17 -06:00
PrairieWind 4cc0a5b0f1 Merge pull request 'Remove tools/remove_end.py' (#3000) from remove_remove_end into master
Reviewed-on: MineClone2/MineClone2#3000
Reviewed-by: AFCMS <afcm.contact@gmail.com>
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-11-23 17:08:18 +00:00
cora ab0f88ad37 Remove remove_end.py 2022-11-23 09:49:32 +01:00
cora 53c1ed9fbf Merge pull request 'Axolotl' (#2870) from TheOnlyJoeEnderman/MineClone2:Axolotl into master
Reviewed-on: MineClone2/MineClone2#2870
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-23 03:18:36 +00:00
FossFanatic dec2c2bade Merge branch 'master' into cocoa_pod_fixes 2022-11-18 08:27:19 +00:00
FossFanatic 9b392fcefc Upload files to 'mods/ITEMS/mcl_cocoas/models' 2022-11-16 13:44:35 +00:00
FossFanatic d091d634bb Delete 'mods/ITEMS/mcl_cocoas/models/emptyfile' 2022-11-16 13:44:23 +00:00
FossFanatic 16746f962f Upload files to 'mods/ITEMS/mcl_cocoas/models' 2022-11-16 13:44:15 +00:00
FossFanatic 00c596c126 Add 'mods/ITEMS/mcl_cocoas/models/emptyfile' 2022-11-16 13:43:40 +00:00
FossFanatic 993d7b6873 Delete 'mods/ITEMS/mcl_cocoas/models' 2022-11-16 13:43:23 +00:00
FossFanatic ceff91e2c3 Add 'mods/ITEMS/mcl_cocoas/models/' 2022-11-16 13:43:11 +00:00
FossFanatic 6bfcd9b1ea Delete 'mods/ITEMS/mcl_cocoas/models/emptyfile' 2022-11-16 13:42:49 +00:00
FossFanatic 6b826b45e1 Add 'mods/ITEMS/mcl_cocoas/models/emptyfile' 2022-11-16 13:42:36 +00:00
FossFanatic 3de1f9e4d6 Delete 'mods/ITEMS/mcl_cocoas/mcl_cocoas_cocoa_stage_2.obj' 2022-11-16 13:39:41 +00:00
FossFanatic 348434adf1 Delete 'mods/ITEMS/mcl_cocoas/mcl_cocoas_cocoa_stage_1.obj' 2022-11-16 13:39:36 +00:00
FossFanatic 6946573e65 Delete 'mods/ITEMS/mcl_cocoas/mcl_cocoas_cocoa_stage_0.obj' 2022-11-16 13:39:32 +00:00
FossFanatic 862d6a9e3e Upload files to 'mods/ITEMS/mcl_cocoas' 2022-11-16 13:39:19 +00:00
FossFanatic 78d45d23c2 change the code 2022-11-16 13:38:44 +00:00
FossFanatic b11d65cc82 Update cocoa textures 2022-11-16 13:35:01 +00:00
FossFanatic f4f57a9fe6 Delete 'mods/ITEMS/mcl_cocoas/textures/mcl_cocoas_cocoa_top_stage_2.png' 2022-11-16 13:33:42 +00:00
TheOnlyJoeEnderman 9e73c2cd46 Remove spaces on line 70 (71)
Actually delete the spaces this time.
2022-11-16 08:00:35 +00:00
TheOnlyJoeEnderman 50e6dd94b2 Code cleaning
Remove outdated comment. Fix spaces on lines 40, 67, 70.
2022-11-16 07:58:07 +00:00
AFCMS 96e83e866c
Make `mcl_item_entity` API public 2022-11-15 21:48:58 +01:00
AFCMS 3bb86fd436
Fix warnings + add type annotations
- fix wrong usage of `mcl_enchanting.get_enchantments`
- use new vectors everywhere
- simplify code
- make code lines less long
2022-11-15 21:48:57 +01:00
AFCMS 4acee8e64e
Fixes to `mcl_meshhand`
- fix actual crash when placing hand in world (undefined function)
- remove node fields redundant with default values
- remove support for `use_texture_alpha_string_modes`
- type annotation
- more explicit functions
2022-11-13 21:54:59 +01:00
TheOnlyJoeEnderman 6a9387b752 Reverse axolotl model to fix the head look direction 2022-11-11 03:50:39 +00:00
TheOnlyJoeEnderman cbb7a8edb0 Reverse axolotl model to fix the head look direction 2022-11-11 03:50:04 +00:00
TheOnlyJoeEnderman 012fe4b37e Move axolotl_bucket to buckets mod 2022-11-07 08:20:13 +00:00
TheOnlyJoeEnderman 3110f97868 Move axolotl_bucket to buckets mod 2022-11-07 08:19:44 +00:00
TheOnlyJoeEnderman dff028595c Remove old axolotl spawn icon 2022-11-07 08:13:26 +00:00
TheOnlyJoeEnderman 6e328153d4 axolotls are no longer mislabelled as passive 2022-11-06 02:18:47 +00:00
TheOnlyJoeEnderman 4695707188 Fix damage value for axolotls 2022-11-06 02:14:58 +00:00
TheOnlyJoeEnderman 432e196794 code cleaning
fixed some messy tabs/spaces, removed old comments.
2022-11-06 02:05:14 +00:00
TheOnlyJoeEnderman a592d69990 add all current underwater creatures to list of mob to kill 2022-11-06 02:00:28 +00:00
TheOnlyJoeEnderman 310237be33 Fix axolotl hitbox, clean up some comments 2022-11-06 01:47:31 +00:00
TheOnlyJoeEnderman cf6d04c716 fix flipped UVs on gill.right
That simple
2022-11-05 22:05:31 +00:00
TheOnlyJoeEnderman c22997db09 Add persistence, attempt to fix breeding, add random look at player event
They look away from the player randomly for some reason. I think the rotation needs to be mirrored, but I am unsure how one would do that.
2022-11-05 21:44:51 +00:00
TheOnlyJoeEnderman 8e74209c9b add axolotl to translation template 2022-11-04 02:32:59 +00:00
TheOnlyJoeEnderman faa7ca1f68 Change axolotl spawn egg to palette instead of texture 2022-11-04 02:21:58 +00:00
TheOnlyJoeEnderman 7e3d5f3553 add axolotl to bucket translation template 2022-11-04 01:58:04 +00:00
TheOnlyJoeEnderman 126de74904 add axolotl to language template 2022-11-02 22:54:21 +00:00
TheOnlyJoeEnderman fbc57192a0 Merge pull request 'Fix axolotl model' (#1) from MrRar/MineClone2:Axolotl into Axolotl
Reviewed-on: #1
2022-11-02 22:08:31 +00:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 963547a0ca Fix axolotl model 2022-11-02 12:45:12 -05:00
TheOnlyJoeEnderman d5ca4fca9b fix constant need to run for the hills, restore ability to jump
previous commit just added comments.
2022-11-02 04:30:09 +00:00
TheOnlyJoeEnderman 3bdd1ea160 Update 'mods/ENTITIES/mobs_mc/axolotl.lua' 2022-11-02 04:15:40 +00:00
TheOnlyJoeEnderman 5cc835df93 fix indentation ln 53, 72, 73; change list on ln 50 to seperate lines 2022-11-02 03:25:10 +00:00
TheOnlyJoeEnderman 88d02da047 Update 'mods/ENTITIES/mobs_mc/init.lua' 2022-10-31 18:17:14 +00:00
TheOnlyJoeEnderman 7aafb67923 fix flipped UVs 2022-10-31 00:07:30 +00:00
TheOnlyJoeEnderman e7bcc89e65 Merge branch 'master' into Axolotl 2022-10-30 21:14:49 +00:00
TheOnlyJoeEnderman 1e003a2571 Remove cold and non-water biomes from spawn list, add "LushCaves" to biome list
I will change it to only Lush Caves if/when they are added.
2022-10-29 22:29:09 +00:00
TheOnlyJoeEnderman 3001832b8f Update 'mods/ENTITIES/mobs_mc/init.lua' 2022-10-29 21:44:39 +00:00
TheOnlyJoeEnderman e2107601f4 move axolotl from MCL to voxelgoodenough 2022-10-29 05:40:13 +00:00
TheOnlyJoeEnderman 0624d9d169 Change spaces to tabs on line 127 2022-10-29 04:29:13 +00:00
TheOnlyJoeEnderman 2d7d577f31 Add Cutest Predator advancement 2022-10-29 04:20:13 +00:00
TheOnlyJoeEnderman 0fc09c6e89 revert 0ab82b5317
revert add cutest predator advancement, Fix accidental deletions.
2022-10-29 04:05:26 +00:00
TheOnlyJoeEnderman 35ac5c75f5 Update 'mods/ENTITIES/mobs_mc/init.lua' 2022-10-29 03:52:38 +00:00
TheOnlyJoeEnderman b1355513dd Merge branch 'master' into Axolotl 2022-10-28 07:18:37 +00:00
TheOnlyJoeEnderman 77bf8e0fb0 add axolotl 2022-10-28 07:15:49 +00:00
TheOnlyJoeEnderman 92d4e4f1e1 add axolotl to mob list 2022-10-27 04:39:22 +00:00
TheOnlyJoeEnderman ca0786f549 add animations to axolotl
they do not appear in-game. If you can fix it, please do.
2022-10-27 04:33:38 +00:00
TheOnlyJoeEnderman 7f291aa109 add animations to axolotl
They should appear in game, but they don't.
2022-10-27 04:32:17 +00:00
TheOnlyJoeEnderman 4683384da1 add animations to axolotl
They don't appear in game for some reason. I did everything correctly to my knowledge.
2022-10-27 04:31:00 +00:00
TheOnlyJoeEnderman d34710be85 add axolotl blender file so others can edit 2022-10-26 21:45:40 +00:00
TheOnlyJoeEnderman d324197609 Fix duplicate/unnecessary "fish" in several names 2022-10-26 21:43:41 +00:00
TheOnlyJoeEnderman e01f103723 add axolotl sounds 2022-10-26 21:37:11 +00:00
TheOnlyJoeEnderman 109d162bca add temporary axolotl model witn no animations 2022-10-26 21:15:19 +00:00
TheOnlyJoeEnderman d89c1c0e5e change axolotl texture name 2022-10-26 21:09:57 +00:00
TheOnlyJoeEnderman 1efacd5a1b change axolotl texture name 2022-10-26 21:09:17 +00:00
TheOnlyJoeEnderman 5abf7d187c Delete 'mods/ENTITIES/mobs_mc/textures/extra_mobs_spawn_icon_axolotl.png' 2022-10-26 21:06:19 +00:00
TheOnlyJoeEnderman 2f975f2155 Delete 'mods/ENTITIES/mobs_mc/textures/extra_mobs_axolotl_white.png' 2022-10-26 21:06:02 +00:00
TheOnlyJoeEnderman fbb1aaf29f Delete 'mods/ENTITIES/mobs_mc/textures/extra_mobs_axolotl_purple.png' 2022-10-26 21:05:49 +00:00
TheOnlyJoeEnderman 4bee5268cd Delete 'mods/ENTITIES/mobs_mc/textures/extra_mobs_axolotl_pink.png' 2022-10-26 21:05:36 +00:00
TheOnlyJoeEnderman d575e8394d Delete 'mods/ENTITIES/mobs_mc/textures/extra_mobs_axolotl_green.png' 2022-10-26 21:05:22 +00:00
TheOnlyJoeEnderman a8250e2544 Delete 'mods/ENTITIES/mobs_mc/textures/extra_mobs_axolotl_brown.png' 2022-10-26 21:05:08 +00:00
TheOnlyJoeEnderman 7e54597a25 Delete 'mods/ENTITIES/mobs_mc/textures/extra_mobs_axolotl_yellow.png' 2022-10-26 21:04:46 +00:00
TheOnlyJoeEnderman a47df3dcdc Delete 'mods/ENTITIES/mobs_mc/textures/extra_mobs_axolotl_black.png' 2022-10-26 21:04:20 +00:00
TheOnlyJoeEnderman 0ab82b5317 add cutest predator advancement 2022-10-26 20:33:41 +00:00
TheOnlyJoeEnderman eaa397a7da add new advancement, remove ability to jump 2022-10-26 20:27:14 +00:00
TheOnlyJoeEnderman e4995524de change axolotl model, texture, sound names 2022-10-26 20:24:48 +00:00
AFCMS bacec2c7e6
Make 2 last params of `mcl_vars.get_node` optional 2022-10-25 11:01:44 +02:00
AFCMS a3d459f020
Refactor `mcl_init`
- use new vectors
- make code less confuse
- type annotations
2022-10-25 11:01:44 +02:00
TheOnlyJoeEnderman 0589816c75 fix missing parts of textures 2022-10-21 01:10:55 +00:00
TheOnlyJoeEnderman 162fe3bc1c fix missing parts of textures 2022-10-21 01:10:35 +00:00
TheOnlyJoeEnderman f352e99eb6 add axolotl to list of bucketable fish 2022-10-21 00:44:18 +00:00
TheOnlyJoeEnderman 05329c908f add axolotl spawn icon 2022-10-21 00:41:27 +00:00
TheOnlyJoeEnderman f8fe943fa6 add axolotl skin 2022-10-21 00:40:34 +00:00
TheOnlyJoeEnderman 6ee8e98ae3 add axolotl skin 2022-10-21 00:40:12 +00:00
TheOnlyJoeEnderman 65c7b741bb Add axolotl bucket texture 2022-10-21 00:39:15 +00:00
TheOnlyJoeEnderman 8001a1ea07 add axolotl lua file 2022-10-21 00:38:24 +00:00
626 changed files with 17434 additions and 7571 deletions

12
.editorconfig Normal file
View File

@ -0,0 +1,12 @@
root = true
[*]
end_of_line = lf
[*.lua]
charset = utf8
indent_style = tab
insert_final_newline = true
trim_trailing_whitespace = true
keep_one_space_between_table_and_bracket = false
spaces_around_operators = true

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

View File

@ -60,7 +60,7 @@ representative at an online or offline event.
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
eliasfleckenstein@web.de.
ancientmariner_dev@proton.me.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the

View File

@ -8,12 +8,13 @@
## Maintainers
* AncientMariner
* Nicu
* cora
## Previous Maintainers
* Fleckenstein
* jordan4ibanez
* cora
## Developers
* bzoss
@ -34,6 +35,8 @@
* SumianVoice
* MrRar
* talamh
* Faerraven / Michieal
* FossFanatic
## Contributors
* Laurent Rocher
@ -89,6 +92,13 @@
* FossFanatic
* Herbert West
* GuyLiner
* 3raven
* anarquimico
* TheOnlyJoeEnderman
* Ranko Saotome
* Gregor Parzefall
* Wbjitscool
* b3nderman
## MineClone5
* kay27
@ -140,11 +150,13 @@
* jordan4ibanez
* paramat
* cora
* Faerraven / Michieal
## 3D Models
* 22i
* tobyplowy
* epCode
* Faerraven / Michieal
## Textures
* XSSheep
@ -158,6 +170,8 @@
* MysticTempest
* RandomLegoBrick
* cora
* Faerraven / Michieal
* Nicu
## Translations
* Wuzzy
@ -171,9 +185,12 @@
* Emojigit
* snowyu
* 3raven
* SakuraRiu
## Funders
* 40W
* bauknecht
* Cora
## Special thanks
* celeron55 for creating Minetest
@ -181,3 +198,4 @@
* wsor for working tirelessly in the shadows for the good of all of us, particularly helping with solving contentDB and copyright issues.
* The workaholics who spent way too much time writing for the Minecraft Wiki. It's an invaluable resource for creating this game
* Notch and Jeb for being the major forces behind Minecraft
* Dark Reaven Music (https://soundcloud.com/dark-reaven-music) for the main menu theme (Calmed Cube), which is licensed under https://creativecommons.org/licenses/by-sa/3.0/

View File

@ -74,6 +74,8 @@ Please read <http://minecraft.gamepedia.com/Breaking> to learn how digging times
* `coral_species=X`: Specifies the species of a coral; equal X means equal species
* `set_on_fire=X`: Sets any (not fire-resistant) mob or player on fire for X seconds when touching
* `compostability=X`: Item can be used on a composter block; X (1-100) is the % chance of adding a level of compost
* `leaves=X`: Node will spotaneously decay if no tree trunk nodes remain within 6 blocks distance.
* `leaves_orphan`: See above, these nodes are in the process of decayed.
#### Footnotes

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.81 (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):

22
RELEASE.md Normal file
View File

@ -0,0 +1,22 @@
#File to document release steps with a view to evolving into a script
#Update CREDITS.md
#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 RELEASE.md
git commit -m "Pre-release update credits and set version 0.82.0"
git tag 0.82.0
git push origin 0.82.0
#Update version in game.conf to -SNAPSHOT
git commit -m "Post-release set version 0.82.0-SNAPSHOT"

View File

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

BIN
menu/HeaderTemplate.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

BIN
menu/background.1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
menu/background.10.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 990 KiB

BIN
menu/background.2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
menu/background.3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
menu/background.4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

BIN
menu/background.5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
menu/background.6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

BIN
menu/background.7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

BIN
menu/background.8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 865 KiB

BIN
menu/background.9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 916 KiB

BIN
menu/background.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 628 B

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
menu/header.1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
menu/header.2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
menu/header.3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

BIN
menu/theme.ogg Normal file

Binary file not shown.

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)

View File

@ -0,0 +1,27 @@
## mcl_events
### Registering Events
`mlc_events.register_event("name",def)`
#### Event Definition
{
stage = 0,
max_stage = 1,
percent = 100,
bars = {},
completed = false,
cond_start = function() end,
--return table of paramtables e.g. { { player = playername, pos = position, ... } }, custom parameters will be passed to the event object/table
on_step = function(event) end,
--this function is run every game step when the event is active
on_start = function(event) end,
-- this function is run when the event starts
on_stage_begin = function(event) end,
-- this function runs when a new stage of the event starts
cond_progress = function(event) end, --return false or next stage id
--this function checks if the event should progress to the next (or any other) stage
cond_complete = function(event) end,
--return true if event finished successfully
}
### Debugging
* /event_start <event> -- starts the given event at the current player coordinates

View File

@ -0,0 +1,155 @@
mcl_events = {}
mcl_events.registered_events = {}
local disabled_events = minetest.settings:get("mcl_disabled_events")
if disabled_events then disabled_events = disabled_events:split(",")
else disabled_events = {} end
local DBG = minetest.settings:get_bool("mcl_logging_event_api",false)
local active_events = {}
local event_tpl = {
stage = 0,
max_stage = 1,
percent = 100,
bars = {},
completed = false,
cond_start = function(event) end, --return table of positions
on_step = function(event) end,
on_start = function(event) end,
on_stage_begin = function(event) end,
cond_progress = function(event) end, --return next stage
cond_complete = function(event) end, --return success
}
local function mcl_log(m,l)
if DBG then
if not l then l = "action" end
minetest.log(l,"[mcl_events] "..m)
end
end
function mcl_events.register_event(name,def)
if table.indexof(disabled_events,name) ~= -1 then return end
mcl_events.registered_events[name] = def
mcl_events.registered_events[name].name = name
end
local function addbars(self)
if not self.enable_bossbar then return end
for _,player in pairs(minetest.get_connected_players()) do
if vector.distance(self.pos,player:get_pos()) < 64 then
local bar = mcl_bossbars.add_bar(player, {color = "red", text = self.readable_name .. ": Wave "..self.stage.." / "..self.max_stage, percentage = self.percent }, true,1)
table.insert(self.bars,bar)
end
end
end
local function start_event(p,e)
mcl_log("[mcl_events] Event started: "..e.readable_name.." at "..minetest.pos_to_string(vector.round(p.pos)))
local idx = #active_events + 1
active_events[idx] = table.copy(e)
setmetatable(active_events[idx],{__index = event_tpl})
for k,v in pairs(p) do active_events[idx][k] = v end
active_events[idx].stage = 0
active_events[idx].percent = 100
active_events[idx].bars = {}
active_events[idx].time_start = os.time()
if active_events[idx].on_start then
active_events[idx]:on_start(p.pos)
end
addbars(active_events[idx])
end
local function finish_event(self,idx)
mcl_log("[mcl_events] Finished: "..self.readable_name.." at "..minetest.pos_to_string(vector.round(self.pos)))
if self.on_complete then self:on_complete() end
for _,b in pairs(self.bars) do
mcl_bossbars.remove_bar(b)
end
table.remove(active_events,idx)
end
local etime = 0
function check_events(dtime)
--process active events
for idx,ae in pairs(active_events) do
if ae.cond_complete and ae:cond_complete() then
ae.finished = true
finish_event(ae,idx)
elseif not ae.cond_complete and ae.max_stage and ae.max_stage <= ae.stage then
ae.finished = true
finish_event(ae,idx)
elseif not ae.finished and ae.cond_progress then
local p = ae:cond_progress()
if p == true then
ae.stage = ae.stage + 1
if ae:on_stage_begin() == true then
mcl_log("[mcl_events] Event "..ae.readable_name.." at "..minetest.pos_to_string(vector.round(ae.pos)).." failed at stage_begin of stage "..ae.stage )
active_events[idx] = nil
end
elseif tonumber(p) then
ae.stage = tonumber(p) or ae.stage + 1
ae:on_stage_begin()
end
elseif not ae.finished and ae.on_step then
ae:on_step(dtime)
end
addbars(ae)
end
-- check if a new event should be started
etime = etime - dtime
if etime > 0 then return end
etime = 10
for _,e in pairs(mcl_events.registered_events) do
local pp = e.cond_start()
if pp then
--minetest.log("It's gonna start the raid maybe")
for _,p in pairs(pp) do
local start = true
if e.exclusive_to_area then
for _,ae in pairs(active_events) do
if e.name == ae.name and vector.distance(p.pos,ae.pos) < e.exclusive_to_area then start = false end
end
end
if start then
--minetest.log("It's gonna start the raid definitely")
start_event(p,e)
elseif DBG then
mcl_log("[mcl_events] Event "..e.readable_name.." already active at "..minetest.pos_to_string(vector.round(p.pos)))
end
end
else
--minetest.log("Do not start this raid")
end
end
for idx,ae in pairs(active_events) do
local player_near = false
for _,pl in pairs(minetest.get_connected_players()) do
if ae.pos and vector.distance(pl:get_pos(),ae.pos) < 64 then player_near = true end
end
if ae.pos and not player_near then
mcl_log("[mcl_events] Event "..ae.readable_name.." at "..minetest.pos_to_string(vector.round(ae.pos)).." aborted - no players near." )
active_events[idx] = nil
end
end
end
minetest.register_globalstep(check_events)
mcl_info.register_debug_field("Active Events",{
level = 4,
func = function(pl,pos)
return tostring(#active_events)
end
})
minetest.register_chatcommand("event_start",{
privs = {debug = true},
description = "Debug command to start events",
func = function(pname,param)
local p = minetest.get_player_by_name(pname)
local evdef = mcl_events.registered_events[param]
if not evdef then return false,"Event "..param.." doesn't exist.'" end
start_event({pos=p:get_pos(),player=pname,factor=1},evdef)
return true,"Started event "..param
end,
})

View File

@ -0,0 +1,3 @@
name = mcl_events
author = cora
depends = mcl_mobs,mcl_bossbars, mcl_info

View File

@ -0,0 +1,2 @@
# textdomain:mcl_explosions
@1 was caught in an explosion.=@1は爆発に巻き込まれた。

View File

@ -3,26 +3,26 @@ mcl_vars = {}
mcl_vars.redstone_tick = 0.1
--- GUI / inventory menu settings
-- GUI / inventory menu settings
mcl_vars.gui_slots = "listcolors[#9990;#FFF7;#FFF0;#000;#FFF]"
-- nonbg is added as formspec prepend in mcl_formspec_prepend
mcl_vars.gui_nonbg = mcl_vars.gui_slots ..
"style_type[image_button;border=false;bgimg=mcl_inventory_button9.png;bgimg_pressed=mcl_inventory_button9_pressed.png;bgimg_middle=2,2]"..
"style_type[button;border=false;bgimg=mcl_inventory_button9.png;bgimg_pressed=mcl_inventory_button9_pressed.png;bgimg_middle=2,2]"..
"style_type[field;textcolor=#323232]"..
"style_type[label;textcolor=#323232]"..
"style_type[textarea;textcolor=#323232]"..
"style_type[checkbox;textcolor=#323232]"
mcl_vars.gui_nonbg = table.concat({
mcl_vars.gui_slots,
"style_type[image_button;border=false;bgimg=mcl_inventory_button9.png;bgimg_pressed=mcl_inventory_button9_pressed.png;bgimg_middle=2,2]",
"style_type[button;border=false;bgimg=mcl_inventory_button9.png;bgimg_pressed=mcl_inventory_button9_pressed.png;bgimg_middle=2,2]",
"style_type[field;textcolor=#323232]",
"style_type[label;textcolor=#323232]",
"style_type[textarea;textcolor=#323232]",
"style_type[checkbox;textcolor=#323232]",
})
-- Background stuff must be manually added by mods (no formspec prepend)
mcl_vars.gui_bg_color = "bgcolor[#00000000]"
mcl_vars.gui_bg_img = "background9[1,1;1,1;mcl_base_textures_background9.png;true;7]"
-- Legacy
mcl_vars.inventory_header = ""
-- Tool wield size
mcl_vars.tool_wield_scale = { x = 1.8, y = 1.8, z = 1 }
mcl_vars.tool_wield_scale = vector.new(1.8, 1.8, 1)
-- Mapgen variables
local mg_name = minetest.get_mapgen_setting("mg_name")
@ -35,55 +35,69 @@ mcl_vars.chunksize = math.max(1, tonumber(minetest.get_mapgen_setting("chunksize
mcl_vars.MAP_BLOCKSIZE = math.max(1, minetest.MAP_BLOCKSIZE or 16)
mcl_vars.mapgen_limit = math.max(1, tonumber(minetest.get_mapgen_setting("mapgen_limit")) or 31000)
mcl_vars.MAX_MAP_GENERATION_LIMIT = math.max(1, minetest.MAX_MAP_GENERATION_LIMIT or 31000)
local central_chunk_offset = -math.floor(mcl_vars.chunksize / 2)
mcl_vars.central_chunk_offset_in_nodes = central_chunk_offset * mcl_vars.MAP_BLOCKSIZE
mcl_vars.chunk_size_in_nodes = mcl_vars.chunksize * mcl_vars.MAP_BLOCKSIZE
local central_chunk_min_pos = central_chunk_offset * mcl_vars.MAP_BLOCKSIZE
local central_chunk_max_pos = central_chunk_min_pos + mcl_vars.chunk_size_in_nodes - 1
local ccfmin = central_chunk_min_pos - mcl_vars.MAP_BLOCKSIZE -- Fullminp/fullmaxp of central chunk, in nodes
local ccfmax = central_chunk_max_pos + mcl_vars.MAP_BLOCKSIZE
local mapgen_limit_b = math.floor(math.min(mcl_vars.mapgen_limit, mcl_vars.MAX_MAP_GENERATION_LIMIT) / mcl_vars.MAP_BLOCKSIZE)
local mapgen_limit_b = math.floor(math.min(mcl_vars.mapgen_limit, mcl_vars.MAX_MAP_GENERATION_LIMIT) /
mcl_vars.MAP_BLOCKSIZE)
local mapgen_limit_min = -mapgen_limit_b * mcl_vars.MAP_BLOCKSIZE
local mapgen_limit_max = (mapgen_limit_b + 1) * mcl_vars.MAP_BLOCKSIZE - 1
local numcmin = math.max(math.floor((ccfmin - mapgen_limit_min) / mcl_vars.chunk_size_in_nodes), 0) -- Number of complete chunks from central chunk
local numcmax = math.max(math.floor((mapgen_limit_max - ccfmax) / mcl_vars.chunk_size_in_nodes), 0) -- fullminp/fullmaxp to effective mapgen limits.
mcl_vars.mapgen_edge_min = central_chunk_min_pos - numcmin * mcl_vars.chunk_size_in_nodes
mcl_vars.mapgen_edge_max = central_chunk_max_pos + numcmax * mcl_vars.chunk_size_in_nodes
---@param x integer
---@return integer
local function coordinate_to_block(x)
return math.floor(x / mcl_vars.MAP_BLOCKSIZE)
end
---@param x integer
---@return integer
local function coordinate_to_chunk(x)
return math.floor((coordinate_to_block(x) - central_chunk_offset) / mcl_vars.chunksize)
end
---@param pos Vector
---@return Vector
function mcl_vars.pos_to_block(pos)
return {
x = coordinate_to_block(pos.x),
y = coordinate_to_block(pos.y),
z = coordinate_to_block(pos.z)
}
return vector.new(
coordinate_to_block(pos.x),
coordinate_to_block(pos.y),
coordinate_to_block(pos.z)
)
end
---@param pos Vector
---@return Vector
function mcl_vars.pos_to_chunk(pos)
return {
x = coordinate_to_chunk(pos.x),
y = coordinate_to_chunk(pos.y),
z = coordinate_to_chunk(pos.z)
}
return vector.new(
coordinate_to_chunk(pos.x),
coordinate_to_chunk(pos.y),
coordinate_to_chunk(pos.z)
)
end
local k_positive = math.ceil(mcl_vars.MAX_MAP_GENERATION_LIMIT / mcl_vars.chunk_size_in_nodes)
local k_positive_z = k_positive * 2
local k_positive_y = k_positive_z * k_positive_z
---@param pos Vector
---@return integer
function mcl_vars.get_chunk_number(pos) -- unsigned int
local c = mcl_vars.pos_to_chunk(pos)
return
(c.y + k_positive) * k_positive_y +
return (c.y + k_positive) * k_positive_y +
(c.z + k_positive) * k_positive_z +
c.x + k_positive
c.x + k_positive
end
if not superflat and not singlenode then
@ -117,11 +131,8 @@ elseif singlenode then
mcl_vars.mg_bedrock_is_rough = false
else
-- Classic superflat
local ground = minetest.get_mapgen_setting("mgflat_ground_level")
ground = tonumber(ground)
if not ground then
ground = 8
end
local ground = tonumber(minetest.get_mapgen_setting("mgflat_ground_level")) or 8
mcl_vars.mg_overworld_min = ground - 3
mcl_vars.mg_overworld_max_official = mcl_vars.mg_overworld_min + minecraft_height_limit
mcl_vars.mg_bedrock_overworld_min = mcl_vars.mg_overworld_min
@ -181,14 +192,16 @@ minetest.craftitemdef_default.stack_max = 64
math.randomseed(os.time())
local chunks = {} -- intervals of chunks generated
---@param pos Vector
function mcl_vars.add_chunk(pos)
local n = mcl_vars.get_chunk_number(pos) -- unsigned int
local prev
for i, d in pairs(chunks) do
if n <= d[2] then -- we've found it
if (n == d[2]) or (n >= d[1]) then return end -- already here
if n == d[1]-1 then -- right before:
if prev and (prev[2] == n-1) then
if n == d[1] - 1 then -- right before:
if prev and (prev[2] == n - 1) then
prev[2] = d[2]
table.remove(chunks, i)
return
@ -196,17 +209,20 @@ function mcl_vars.add_chunk(pos)
d[1] = n
return
end
if prev and (prev[2] == n-1) then --join to previous
if prev and (prev[2] == n - 1) then --join to previous
prev[2] = n
return
end
table.insert(chunks, i, {n, n}) -- insert new interval before i
table.insert(chunks, i, { n, n }) -- insert new interval before i
return
end
prev = d
end
chunks[#chunks+1] = {n, n}
chunks[#chunks + 1] = { n, n }
end
---@param pos Vector
---@return boolean
function mcl_vars.is_generated(pos)
local n = mcl_vars.get_chunk_number(pos) -- unsigned int
for i, d in pairs(chunks) do
@ -217,47 +233,46 @@ function mcl_vars.is_generated(pos)
return false
end
-- "Trivial" (actually NOT) function to just read the node and some stuff to not just return "ignore", like mt 5.4 does.
-- p: Position, if it's wrong, {name="error"} node will return.
-- force: optional (default: false) - Do the maximum to still read the node within us_timeout.
-- us_timeout: optional (default: 244 = 0.000244 s = 1/80/80/80), set it at least to 3000000 to let mapgen to finish its job.
--
-- returns node definition, eg. {name="air"}. Unfortunately still can return {name="ignore"}.
function mcl_vars.get_node(p, force, us_timeout)
---"Trivial" (actually NOT) function to just read the node and some stuff to not just return "ignore", like mt 5.4 does.
---@param pos Vector Position, if it's wrong, `{name="error"}` node will return.
---@param force? boolean Optional (default: `false`), Do the maximum to still read the node within us_timeout.
---@param us_timeout? number Optional (default: `244 = 0.000244 s = 1/80/80/80`), set it at least to `3000000` to let mapgen to finish its job
---@return node # Node definition, eg. `{name="air"}`. Unfortunately still can return `{name="ignore"}`.
---@nodiscard
function mcl_vars.get_node(pos, force, us_timeout)
-- check initial circumstances
if not p or not p.x or not p.y or not p.z then return {name="error"} end
if not pos or not pos.x or not pos.y or not pos.z then return { name = "error" } end
-- try common way
local node = minetest.get_node(p)
local node = minetest.get_node(pos)
if node.name ~= "ignore" then
return node
end
-- copy table to get sure it won't changed by other threads
local pos = {x=p.x,y=p.y,z=p.z}
-- copy vector to get sure it won't changed by other threads
local pos_copy = vector.copy(pos)
-- try LVM
minetest.get_voxel_manip():read_from_map(pos, pos)
node = minetest.get_node(pos)
minetest.get_voxel_manip():read_from_map(pos_copy, pos_copy)
node = minetest.get_node(pos_copy)
if node.name ~= "ignore" or not force then
return node
end
-- all ways failed - need to emerge (or forceload if generated)
local us_timeout = us_timeout or 244
if mcl_vars.is_generated(pos) then
if mcl_vars.is_generated(pos_copy) then
minetest.chat_send_all("IMPOSSIBLE! Please report this to MCL2 issue tracker!")
minetest.forceload_block(pos)
minetest.forceload_block(pos_copy)
else
minetest.emerge_area(pos, pos)
minetest.emerge_area(pos_copy, pos_copy)
end
local t = minetest.get_us_time()
node = minetest.get_node(pos)
node = minetest.get_node(pos_copy)
while (not node or node.name == "ignore") and (minetest.get_us_time() - t < us_timeout) do
node = minetest.get_node(pos)
while (not node or node.name == "ignore") and (minetest.get_us_time() - t < (us_timeout or 244)) do
node = minetest.get_node(pos_copy)
end
return node

View File

@ -11,42 +11,22 @@ Creative Commons Attribution 3.0 Unported (CC BY-SA 3.0)
http://creativecommons.org/licenses/by/3.0/
Glass breaking sounds (CC BY 3.0):
1: http://www.freesound.org/people/cmusounddesign/sounds/71947/
2: http://www.freesound.org/people/Tomlija/sounds/97669/
3: http://www.freesound.org/people/lsprice/sounds/88808/
1: http://www.freesound.org/people/cmusounddesign/sounds/71947/
2: http://www.freesound.org/people/Tomlija/sounds/97669/
3: http://www.freesound.org/people/lsprice/sounds/88808/
default_tool_breaks.ogg by EdgardEdition (CC BY 3.0), http://www.freesound.org/people/EdgardEdition
Mito551 (sounds) (CC BY-SA 3.0):
default_dig_choppy.ogg
default_dig_cracky.ogg
default_dig_crumbly.1.ogg
default_dig_crumbly.2.ogg
default_dig_crumbly.ogg
default_dig_oddly_breakable_by_hand.ogg
default_dug_node.1.ogg
default_dug_node.2.ogg
default_grass_footstep.1.ogg
default_grass_footstep.2.ogg
default_grass_footstep.3.ogg
default_gravel_footstep.1.ogg
default_gravel_footstep.2.ogg
default_gravel_footstep.3.ogg
default_gravel_footstep.4.ogg
default_grass_footstep.1.ogg
default_place_node.1.ogg
default_place_node.2.ogg
default_place_node.3.ogg
default_place_node_hard.1.ogg
default_place_node_hard.2.ogg
default_hard_footstep.1.ogg
default_hard_footstep.2.ogg
default_hard_footstep.3.ogg
default_sand_footstep.1.ogg
default_sand_footstep.2.ogg
default_wood_footstep.1.ogg
default_wood_footstep.2.ogg
default_dirt_footstep.1.ogg
default_dirt_footstep.2.ogg
default_dug_node.*.ogg
default_grass_footstep.*.ogg
default_gravel_footstep.*.ogg
default_place_node.*.ogg
default_place_node_hard.*.ogg
default_wood_footstep.*.ogg
default_dirt_footstep.*.ogg
default_glass_footstep.ogg
Metal sounds:
@ -54,35 +34,64 @@ Metal sounds:
- https://www.freesound.org/people/yadronoff/sounds/320397/
default_dug_metal.*.ogg - Iwan Gabovitch - qubodup - CC0
- http://opengameart.org/users/qubodup
default_metal_footstep.*.ogg - Ottomaani138 - CC0
- https://www.freesound.org/people/Ottomaani138/sounds/232692/
default_metal_footstep.*.ogg - (CC0 1.0) - CC0 1.0
- https://freesound.org/people/mypantsfelldown/sounds/398937/
default_place_node_metal.*.ogg - Ogrebane - CC0
- http://opengameart.org/content/wood-and-metal-sound-effects-volume-2
AGFX (CC BY 3.0)
AGFX (CC BY 3.0):
https://www.freesound.org/people/AGFX/packs/1253/
default_water_footstep.1.ogg
default_water_footstep.2.ogg
default_water_footstep.3.ogg
(default_water_footstep.4.ogg is silent)
default_water_footstep.*.ogg
blukotek (CC0 1.0)
blukotek (CC0 1.0):
https://www.freesound.org/people/blukotek/sounds/251660/
default_dig_snappy.ogg
sonictechtonic (CC BY 3.0)
sonictechtonic (CC BY 3.0):
https://www.freesound.org/people/sonictechtonic/sounds/241872/
player_damage.ogg
Voxelands project <http://www.voxelands.com/> (CC BY-SA 3.0)
Sheyvan (CC0 1.0):
https://freesound.org/people/Sheyvan/sounds/476113/
default_dig_choppy.*.ogg
lolamadeus (CC0 1.0):
https://freesound.org/people/lolamadeus/sounds/179341/
default_gravel_dig.*.ogg
default_gravel_dug.*.ogg
Benboncan (CC BY 3.0):
https://freesound.org/people/Benboncan/sounds/71823/
default_dig_cracky.*.ogg
Erdie (CC BY 3.0):
https://freesound.org/people/Erdie/sounds/41579/
default_hard_footstep.*.ogg
worthahep88 (CC0 1.0):
https://freesound.org/people/worthahep88/sounds/319224/
default_sand_footstep.*.ogg
dheming (CC BY 3.0):
https://freesound.org/people/dheming/sounds/268023/
default_ice_dig.*.ogg
InspectorJ (CC BY 3.0):
https://freesound.org/people/InspectorJ/sounds/416967/
default_ice_footstep.*.ogg
Angel_Perez_Grandi (CC BY 3.0):
https://freesound.org/people/Angel_Perez_Grandi/sounds/49190/
default_ice_dug.ogg
Voxelands project <http://www.voxelands.com/> (CC BY-SA 3.0):
mcl_sounds_place_node_water.ogg
mcl_sounds_dug_water.ogg
(Note: Artists from the Voxelands project include: sdzen, darkrose, sapier,
Tom Peter, Telaron, juskiddink)
Michel Baradari <https://opengameart.org/content/lava-splash> (CC BY 3.0)
Michel Baradari <https://opengameart.org/content/lava-splash> (CC BY 3.0):
default_place_node_lava.ogg
Adam_N (CC0 1.0):
@ -90,7 +99,7 @@ Adam_N (CC0 1.0):
Source: <https://www.freesound.org/people/Adam_N/sounds/346692/>
Alecia Shepherd (CC BY-SA 4.0):
mcl_sounds_cloth.ogg
mcl_sounds_cloth.*.ogg
Source: SnowSong sound and music pack <https://opengameart.org/content/snowsong-sound-and-music-pack>
Unknown authors (WTFPL):

View File

@ -11,7 +11,7 @@ function mcl_sounds.node_sound_defaults(table)
table.dug = table.dug or
{name="default_dug_node", gain=0.25}
table.dig = table.dig or
{name="default_dig_oddly_breakable_by_hand", gain=1.0}
{name="default_dig_oddly_breakable_by_hand", gain=0.5}
table.place = table.place or
{name="default_place_node_hard", gain=1.0}
return table
@ -20,11 +20,11 @@ end
function mcl_sounds.node_sound_stone_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_hard_footstep", gain=0.5}
{name="default_hard_footstep", gain=0.2}
table.dug = table.dug or
{name="default_hard_footstep", gain=1.0}
table.dig = table.dig or
{name="default_dig_cracky", gain=1.0}
{name="default_dig_cracky", gain=0.5}
mcl_sounds.node_sound_defaults(table)
return table
end
@ -32,13 +32,13 @@ end
function mcl_sounds.node_sound_metal_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_metal_footstep", gain=0.5}
{name="default_metal_footstep", gain=0.2}
table.dug = table.dug or
{name="default_dug_metal", gain=1.0}
{name="default_dug_metal", gain=0.5}
table.dig = table.dig or
{name="default_dig_metal", gain=1.0}
{name="default_dig_metal", gain=0.5}
table.place = table.place or
{name="default_place_node_metal", gain=1.0}
{name="default_place_node_metal", gain=0.5}
mcl_sounds.node_sound_defaults(table)
return table
end
@ -46,11 +46,11 @@ end
function mcl_sounds.node_sound_dirt_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_dirt_footstep", gain=1.0}
{name="default_dirt_footstep", gain=0.25}
table.dug = table.dug or
{name="default_dirt_footstep", gain=1.5}
{name="default_dirt_footstep", gain=1.0}
table.dig = table.dig or
{name="default_dig_crumbly", gain=1.0}
{name="default_dig_crumbly", gain=0.4}
table.place = table.place or
{name="default_place_node", gain=1.0}
mcl_sounds.node_sound_defaults(table)
@ -60,11 +60,25 @@ end
function mcl_sounds.node_sound_sand_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_sand_footstep", gain=0.5}
{name="default_sand_footstep", gain=0.05}
table.dug = table.dug or
{name="default_sand_footstep", gain=1.0}
{name="default_sand_footstep", gain=0.15}
table.dig = table.dig or
{name="default_dig_crumbly", gain=1.0}
{name="default_dig_crumbly", gain=0.4}
table.place = table.place or
{name="default_place_node", gain=1.0}
mcl_sounds.node_sound_defaults(table)
return table
end
function mcl_sounds.node_sound_gravel_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_gravel_footstep", gain=0.25}
table.dug = table.dug or
{name="default_gravel_dug", gain=1.0}
table.dig = table.dig or
{name="default_gravel_dig", gain=0.35}
table.place = table.place or
{name="default_place_node", gain=1.0}
mcl_sounds.node_sound_defaults(table)
@ -78,21 +92,33 @@ function mcl_sounds.node_sound_snow_defaults(table)
table.dug = table.dug or
{name="pedology_snow_soft_footstep", gain=1.0}
table.dig = table.dig or
{name="default_dig_crumbly", gain=1.0}
{name="pedology_snow_soft_footstep", gain=1.0}
table.place = table.place or
{name="default_place_node", gain=1.0}
mcl_sounds.node_sound_defaults(table)
return table
end
function mcl_sounds.node_sound_ice_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_ice_footstep", gain=0.15}
table.dug = table.dug or
{name="default_ice_dug", gain=0.5}
table.dig = table.dig or
{name="default_ice_dig", gain=0.5}
mcl_sounds.node_sound_defaults(table)
return table
end
function mcl_sounds.node_sound_wood_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_wood_footstep", gain=0.5}
{name="default_wood_footstep", gain=0.15}
table.dug = table.dug or
{name="default_wood_footstep", gain=1.0}
table.dig = table.dig or
{name="default_dig_choppy", gain=1.0}
{name="default_dig_choppy", gain=0.4}
mcl_sounds.node_sound_defaults(table)
return table
end
@ -128,11 +154,11 @@ end
function mcl_sounds.node_sound_glass_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_glass_footstep", gain=0.5}
{name="default_glass_footstep", gain=0.3}
table.dug = table.dug or
{name="default_break_glass", gain=1.0}
table.dig = table.dig or
{name="default_dig_cracky", gain=1.0}
{name="default_dig_cracky", gain=0.5}
mcl_sounds.node_sound_defaults(table)
return table
end

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

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
@ -643,78 +642,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 +729,285 @@ 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

View File

@ -0,0 +1,13 @@
# textdomain: mcl_boats
Acacia Boat=アカシアのボート
Birch Boat=シラカバのボート
Boat=ボート
Boats are used to travel on the surface of water.=ボートは、水面を移動するために使われます。
Dark Oak Boat=ダークオークのボート
Jungle Boat=ジャングルのボート
Oak Boat=オークのボート
Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Use [Sneak] to leave the boat, punch the boat to make it drop as an item.=水源を右クリックすると、ボートが配置されます。ボートを右クリックすると、乗り込みます。[左][右]で舵取り、[前]で加速、[後]で減速または後退します。[スニーク]でボートから離れ、ボートをパンチするとアイテムとしてドロップします。
Spruce Boat=トウヒのボート
Water vehicle=水上用の乗物
Sneak to dismount=スニークで降りる
Obsidian Boat=黒曜石のボート

View File

@ -7,31 +7,24 @@ local pool = {}
local tick = false
local LOGGING_ON = minetest.settings:get_bool("mcl_logging_item_entities",false)
local function mcl_log (message)
local LOGGING_ON = minetest.settings:get_bool("mcl_logging_item_entities", false)
local function mcl_log(message)
if LOGGING_ON then
mcl_util.mcl_log (message, "[Item Entities]", true)
mcl_util.mcl_log(message, "[Item Entities]", true)
end
end
minetest.register_on_joinplayer(function(player)
local name
name = player:get_player_name()
pool[name] = 0
pool[player:get_player_name()] = 0
end)
minetest.register_on_leaveplayer(function(player)
local name
name = player:get_player_name()
pool[name] = nil
pool[player:get_player_name()] = nil
end)
local has_awards = minetest.get_modpath("awards")
local mcl_item_entity = {}
mcl_item_entity = {}
--basic settings
local item_drop_settings = {} --settings table
@ -46,22 +39,29 @@ item_drop_settings.random_item_velocity = true --this sets random item velocity
item_drop_settings.drop_single_item = false --if true, the drop control drops 1 item instead of the entire stack, and sneak+drop drops the stack
-- drop_single_item is disabled by default because it is annoying to throw away items from the intentory screen
item_drop_settings.magnet_time = 0.75 -- how many seconds an item follows the player before giving up
item_drop_settings.magnet_time = 0.75 -- how many seconds an item follows the player before giving up
local function get_gravity()
return tonumber(minetest.settings:get("movement_gravity")) or 9.81
end
local registered_pickup_achievement = {}
mcl_item_entity.registered_pickup_achievement = {}
--TODO: remove limitation of 1 award per itemname
---Register an achievement that will be unlocked on pickup.
---
---TODO: remove limitation of 1 award per itemname
---@param itemname string
---@param award string
function mcl_item_entity.register_pickup_achievement(itemname, award)
if not has_awards then
minetest.log("warning", "[mcl_item_entity] Trying to register pickup achievement ["..award.."] for ["..itemname.."] while awards missing")
elseif registered_pickup_achievement[itemname] then
minetest.log("error", "[mcl_item_entity] Trying to register already existing pickup achievement ["..award.."] for ["..itemname.."]")
minetest.log("warning",
"[mcl_item_entity] Trying to register pickup achievement [" .. award .. "] for [" ..
itemname .. "] while awards missing")
elseif mcl_item_entity.registered_pickup_achievement[itemname] then
minetest.log("error",
"[mcl_item_entity] Trying to register already existing pickup achievement [" .. award .. "] for [" .. itemname .. "]")
else
registered_pickup_achievement[itemname] = award
mcl_item_entity.registered_pickup_achievement[itemname] = award
end
end
@ -74,11 +74,13 @@ mcl_item_entity.register_pickup_achievement("mcl_nether:ancient_debris", "mcl:hi
mcl_item_entity.register_pickup_achievement("mcl_end:dragon_egg", "mcl:PickUpDragonEgg")
mcl_item_entity.register_pickup_achievement("mcl_armor:elytra", "mcl:skysTheLimit")
---@param object ObjectRef
---@param player ObjectRef
local function check_pickup_achievements(object, player)
if has_awards then
local itemname = ItemStack(object:get_luaentity().itemstring):get_name()
local playername = player:get_player_name()
for name,award in pairs(registered_pickup_achievement) do
for name, award in pairs(mcl_item_entity.registered_pickup_achievement) do
if itemname == name or minetest.get_item_group(itemname, name) ~= 0 then
awards.unlock(playername, award)
end
@ -86,16 +88,23 @@ local function check_pickup_achievements(object, player)
end
end
---@param object ObjectRef
---@param luaentity Luaentity
---@param ignore_check? boolean
local function enable_physics(object, luaentity, ignore_check)
if luaentity.physical_state == false or ignore_check == true then
luaentity.physical_state = true
object:set_properties({
physical = true
})
object:set_acceleration({x=0,y=-get_gravity(),z=0})
object:set_acceleration(vector.new(0, -get_gravity(), 0))
end
end
---@param object ObjectRef
---@param luaentity Luaentity
---@param ignore_check? boolean
---@param reset_movement? boolean
local function disable_physics(object, luaentity, ignore_check, reset_movement)
if luaentity.physical_state == true or ignore_check == true then
luaentity.physical_state = false
@ -103,17 +112,16 @@ local function disable_physics(object, luaentity, ignore_check, reset_movement)
physical = false
})
if reset_movement ~= false then
object:set_velocity({x=0,y=0,z=0})
object:set_acceleration({x=0,y=0,z=0})
object:set_velocity(vector.zero())
object:set_acceleration(vector.zero())
end
end
end
minetest.register_globalstep(function(dtime)
minetest.register_globalstep(function(_)
tick = not tick
for _,player in pairs(minetest.get_connected_players()) do
for _, player in pairs(minetest.get_connected_players()) do
if player:get_hp() > 0 or not minetest.settings:get_bool("enable_damage") then
local name = player:get_player_name()
@ -125,7 +133,7 @@ minetest.register_globalstep(function(dtime)
pos = pos,
gain = 0.3,
max_hear_distance = 16,
pitch = math.random(70,110)/100
pitch = math.random(70, 110) / 100
})
if pool[name] > 6 then
pool[name] = 6
@ -135,15 +143,18 @@ minetest.register_globalstep(function(dtime)
end
local inv = player:get_inventory()
local checkpos = {x=pos.x,y=pos.y + item_drop_settings.player_collect_height,z=pos.z}
local checkpos = vector.offset(pos, 0, item_drop_settings.player_collect_height, 0)
--magnet and collection
for _,object in pairs(minetest.get_objects_inside_radius(checkpos, item_drop_settings.xp_radius_magnet)) do
if not object:is_player() and vector.distance(checkpos, object:get_pos()) < item_drop_settings.radius_magnet and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" and object:get_luaentity()._magnet_timer and (object:get_luaentity()._insta_collect or (object:get_luaentity().age > item_drop_settings.age)) then
for _, object in pairs(minetest.get_objects_inside_radius(checkpos, item_drop_settings.xp_radius_magnet)) do
if not object:is_player() and vector.distance(checkpos, object:get_pos()) < item_drop_settings.radius_magnet and
object:get_luaentity() and object:get_luaentity().name == "__builtin:item" and object:get_luaentity()._magnet_timer
and (object:get_luaentity()._insta_collect or (object:get_luaentity().age > item_drop_settings.age)) then
if object:get_luaentity()._magnet_timer >= 0 and object:get_luaentity()._magnet_timer < item_drop_settings.magnet_time and inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
if object:get_luaentity()._magnet_timer >= 0 and
object:get_luaentity()._magnet_timer < item_drop_settings.magnet_time and inv and
inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
-- Collection
if not object:get_luaentity()._removed then
@ -158,8 +169,8 @@ minetest.register_globalstep(function(dtime)
object:get_luaentity().target = checkpos
object:get_luaentity()._removed = true
object:set_velocity({x=0,y=0,z=0})
object:set_acceleration({x=0,y=0,z=0})
object:set_velocity(vector.zero())
object:set_acceleration(vector.zero())
object:move_to(checkpos)
@ -179,7 +190,6 @@ minetest.register_globalstep(function(dtime)
local entity = object:get_luaentity()
entity.collector = player:get_player_name()
entity.collected = true
end
end
@ -194,6 +204,11 @@ end)
local tmp_id = 0
---@param drop string|drop_definition
---@param toolname string
---@param param2 integer
---@param paramtype2 paramtype2
---@return string[]
local function get_drops(drop, toolname, param2, paramtype2)
tmp_id = tmp_id + 1
local tmp_node_name = "mcl_item_entity:" .. tmp_id
@ -202,7 +217,7 @@ local function get_drops(drop, toolname, param2, paramtype2)
drop = drop,
paramtype2 = paramtype2
}
local drops = minetest.get_node_drops({name = tmp_node_name, param2 = param2}, toolname)
local drops = minetest.get_node_drops({ name = tmp_node_name, param2 = param2 }, toolname)
minetest.registered_nodes[tmp_node_name] = nil
return drops
end
@ -265,7 +280,7 @@ function minetest.handle_node_drops(pos, drops, digger)
* table: Drop every itemstring in this table when dug by shears _mcl_silk_touch_drop
]]
local enchantments = tool and mcl_enchanting.get_enchantments(tool, "silk_touch")
local enchantments = tool and mcl_enchanting.get_enchantments(tool)
local silk_touch_drop = false
local nodedef = minetest.registered_nodes[dug_node.name]
@ -294,7 +309,8 @@ function minetest.handle_node_drops(pos, drops, digger)
local max_count = fortune_drop.max_count + fortune_level * (fortune_drop.factor or 1)
local chance = fortune_drop.chance or fortune_drop.get_chance and fortune_drop.get_chance(fortune_level)
if not chance or math.random() < chance then
drops = discrete_uniform_distribution(fortune_drop.multiply and drops or fortune_drop.items, min_count, max_count, fortune_drop.cap)
drops = discrete_uniform_distribution(fortune_drop.multiply and drops or fortune_drop.items, min_count, max_count,
fortune_drop.cap)
elseif fortune_drop.override then
drops = {}
end
@ -306,13 +322,13 @@ function minetest.handle_node_drops(pos, drops, digger)
end
if digger and mcl_experience.throw_xp and not silk_touch_drop then
local experience_amount = minetest.get_item_group(dug_node.name,"xp")
local experience_amount = minetest.get_item_group(dug_node.name, "xp")
if experience_amount > 0 then
mcl_experience.throw_xp(pos, experience_amount)
end
end
for _,item in ipairs(drops) do
for _, item in ipairs(drops) do
local count
if type(item) == "string" then
count = ItemStack(item):get_count()
@ -321,7 +337,7 @@ function minetest.handle_node_drops(pos, drops, digger)
end
local drop_item = ItemStack(item)
drop_item:set_count(1)
for i=1,count do
for i = 1, count do
local dpos = table.copy(pos)
-- Apply offset for plantlike_rooted nodes because of their special shape
if nodedef and nodedef.drawtype == "plantlike_rooted" and nodedef.walkable then
@ -348,7 +364,7 @@ end
function minetest.item_drop(itemstack, dropper, pos)
if dropper and dropper:is_player() then
local v = dropper:get_look_dir()
local p = {x=pos.x, y=pos.y+1.2, z=pos.z}
local p = vector.offset(pos, 0, 1.2, 0)
local cs = itemstack:get_count()
if dropper:get_player_control().sneak then
cs = 1
@ -356,9 +372,9 @@ function minetest.item_drop(itemstack, dropper, pos)
local item = itemstack:take_item(cs)
local obj = minetest.add_item(p, item)
if obj then
v.x = v.x*4
v.y = v.y*4 + 2
v.z = v.z*4
v.x = v.x * 4
v.y = v.y * 4 + 2
v.z = v.z * 4
obj:set_velocity(v)
-- Force collection delay
obj:get_luaentity()._insta_collect = false
@ -376,16 +392,16 @@ end
local function cxcz(o, cw, one, zero)
if cw < 0 then
table.insert(o, { [one]=1, y=0, [zero]=0 })
table.insert(o, { [one]=-1, y=0, [zero]=0 })
table.insert(o, { [one] = 1, y = 0, [zero] = 0 })
table.insert(o, { [one] = -1, y = 0, [zero] = 0 })
else
table.insert(o, { [one]=-1, y=0, [zero]=0 })
table.insert(o, { [one]=1, y=0, [zero]=0 })
table.insert(o, { [one] = -1, y = 0, [zero] = 0 })
table.insert(o, { [one] = 1, y = 0, [zero] = 0 })
end
return o
end
local function hopper_take_item (self, pos)
local function hopper_take_item(self, pos)
--mcl_log("self.itemstring: ".. self.itemstring)
--mcl_log("self.itemstring: ".. minetest.pos_to_string(pos))
@ -394,17 +410,17 @@ local function hopper_take_item (self, pos)
if objs and self.itemstring then
--mcl_log("there is an itemstring. Number of objs: ".. #objs)
for k,v in pairs(objs) do
for k, v in pairs(objs) do
local ent = v:get_luaentity()
-- Don't forget actual hoppers
if ent and ent.name == "mcl_minecarts:hopper_minecart" then
local taken_items = false
mcl_log("ent.name: ".. tostring(ent.name))
mcl_log("ent pos: ".. tostring(ent.object:get_pos()))
mcl_log("ent.name: " .. tostring(ent.name))
mcl_log("ent pos: " .. tostring(ent.object:get_pos()))
local inv = mcl_entity_invs.load_inv(ent,5)
local inv = mcl_entity_invs.load_inv(ent, 5)
if not inv then
mcl_log("No inv")
@ -428,7 +444,7 @@ local function hopper_take_item (self, pos)
local items_remaining = current_itemstack:get_count()
-- This will take part of a floating item stack if no slot can hold the full amount
for i = 1, ent._inv_size,1 do
for i = 1, ent._inv_size, 1 do
local stack = inv:get_stack("main", i)
mcl_log("i: " .. tostring(i))
@ -500,13 +516,13 @@ minetest.register_entity(":__builtin:item", {
hp_max = 1,
physical = true,
collide_with_objects = false,
collisionbox = {-0.3, -0.3, -0.3, 0.3, 0.3, 0.3},
collisionbox = { -0.3, -0.3, -0.3, 0.3, 0.3, 0.3 },
pointable = false,
visual = "wielditem",
visual_size = {x = 0.4, y = 0.4},
textures = {""},
spritediv = {x = 1, y = 1},
initial_sprite_basepos = {x = 0, y = 0},
visual_size = { x = 0.4, y = 0.4 },
textures = { "" },
spritediv = { x = 1, y = 1 },
initial_sprite_basepos = { x = 0, y = 0 },
is_visible = false,
infotext = "",
},
@ -544,11 +560,11 @@ minetest.register_entity(":__builtin:item", {
if vel and vel.x == 0 and vel.z == 0 and self.random_velocity > 0 then
local v = self.random_velocity
local x = math.random(5, 10) / 10 * v
if math.random(0,10) < 5 then x = -x end
if math.random(0, 10) < 5 then x = -x end
local z = math.random(5, 10) / 10 * v
if math.random(0,10) < 5 then z = -z end
local y = math.random(2,4)
self.object:set_velocity({x=x, y=y, z=z})
if math.random(0, 10) < 5 then z = -z end
local y = math.random(2, 4)
self.object:set_velocity(vector.new(x, y, z))
end
self.random_velocity = 0
end,
@ -576,7 +592,7 @@ minetest.register_entity(":__builtin:item", {
local max_count = stack:get_stack_max()
if count > max_count then
count = max_count
self.itemstring = stack:get_name().." "..max_count
self.itemstring = stack:get_name() .. " " .. max_count
end
local itemtable = stack:to_table()
local itemname = nil
@ -597,9 +613,9 @@ minetest.register_entity(":__builtin:item", {
local prop = {
is_visible = true,
visual = "wielditem",
textures = {itemname},
visual_size = {x = s, y = s},
collisionbox = {-c, -c, -c, c, c, c},
textures = { itemname },
visual_size = { x = s, y = s },
collisionbox = { -c, -c, -c, c, c, c },
automatic_rotate = math.pi * 0.5,
infotext = description,
glow = glow,
@ -695,9 +711,9 @@ minetest.register_entity(":__builtin:item", {
self._forcestart = nil
self._forcetimer = 0
self.object:set_armor_groups({immortal = 1})
-- self.object:set_velocity({x = 0, y = 2, z = 0})
self.object:set_acceleration({x = 0, y = -get_gravity(), z = 0})
self.object:set_armor_groups({ immortal = 1 })
-- self.object:set_velocity(vector.new(0, 2, 0))
self.object:set_acceleration(vector.new(0, -get_gravity(), 0))
self:set_item(self.itemstring)
end,
@ -710,9 +726,9 @@ minetest.register_entity(":__builtin:item", {
local stack = ItemStack(entity.itemstring)
local name = stack:get_name()
if own_stack:get_name() ~= name or
own_stack:get_meta() ~= stack:get_meta() or
own_stack:get_wear() ~= stack:get_wear() or
own_stack:get_free_space() == 0 then
own_stack:get_meta() ~= stack:get_meta() or
own_stack:get_wear() ~= stack:get_wear() or
own_stack:get_free_space() == 0 then
-- Can not merge different or full stack
return false
end
@ -745,8 +761,8 @@ minetest.register_entity(":__builtin:item", {
self.object:set_properties({
physical = false
})
self.object:set_velocity({x=0,y=0,z=0})
self.object:set_acceleration({x=0,y=0,z=0})
self.object:set_velocity(vector.zero())
self.object:set_acceleration(vector.zero())
return
end
self.age = self.age + dtime
@ -761,21 +777,22 @@ minetest.register_entity(":__builtin:item", {
-- Delete corrupted item entities. The itemstring MUST be non-empty on its first step,
-- otherwise there might have some data corruption.
if self.itemstring == "" then
minetest.log("warning", "Item entity with empty itemstring found at "..minetest.pos_to_string(self.object:get_pos()).. "! Deleting it now.")
minetest.log("warning",
"Item entity with empty itemstring found at " .. minetest.pos_to_string(self.object:get_pos()) ..
"! Deleting it now.")
self._removed = true
self.object:remove()
return
end
local p = self.object:get_pos()
-- If hopper has taken item, it has gone, and no operations should be conducted on this item
if hopper_take_item(self, p) then
return
end
local node = minetest.get_node_or_nil(p)
local in_unloaded = (node == nil)
local node = minetest.get_node(p)
local in_unloaded = node.name == "ignore"
if in_unloaded then
-- Don't infinetly fall into unloaded map
@ -785,27 +802,27 @@ minetest.register_entity(":__builtin:item", {
if self.is_clock then
self.object:set_properties({
textures = {"mcl_clock:clock_" .. (mcl_worlds.clock_works(p) and mcl_clock.old_time or mcl_clock.random_frame)}
textures = { "mcl_clock:clock_" .. (mcl_worlds.clock_works(p) and mcl_clock.old_time or mcl_clock.random_frame) }
})
end
local nn = node.name
local is_in_water = (minetest.get_item_group(nn, "liquid") ~= 0)
local nn_above = minetest.get_node({x=p.x, y=p.y+0.1, z=p.z}).name
local nn_above = minetest.get_node(vector.offset(p, 0, 0.1, 0)).name
-- make sure it's more or less stationary and is at water level
local sleep_threshold = 0.3
local is_floating = false
local is_stationary = math.abs(self.object:get_velocity().x) < sleep_threshold
and math.abs(self.object:get_velocity().y) < sleep_threshold
and math.abs(self.object:get_velocity().z) < sleep_threshold
and math.abs(self.object:get_velocity().y) < sleep_threshold
and math.abs(self.object:get_velocity().z) < sleep_threshold
if is_in_water and is_stationary then
is_floating = (is_in_water
and (minetest.get_item_group(nn_above, "liquid") == 0))
end
if is_floating and self.physical_state == true then
self.object:set_velocity({x = 0, y = 0, z = 0})
self.object:set_acceleration({x = 0, y = 0, z = 0})
self.object:set_velocity(vector.zero())
self.object:set_acceleration(vector.zero())
disable_physics(self.object, self)
end
-- If no collector was found for a long enough time, declare the magnet as disabled
@ -825,7 +842,7 @@ minetest.register_entity(":__builtin:item", {
--Wait 2 seconds to allow mob drops to be cooked, & picked up instead of instantly destroyed.
if self.age > 2 and minetest.get_item_group(self.itemstring, "fire_immune") == 0 then
if dg ~= 2 then
minetest.sound_play("builtin_item_lava", {pos = self.object:get_pos(), gain = 0.5})
minetest.sound_play("builtin_item_lava", { pos = self.object:get_pos(), gain = 0.5 })
end
self._removed = true
self.object:remove()
@ -865,7 +882,7 @@ minetest.register_entity(":__builtin:item", {
end
-- Check which one of the 4 sides is free
for o=1, #order do
for o = 1, #order do
local nn = minetest.get_node(vector.add(p, order[o])).name
local def = minetest.registered_nodes[nn]
if def and def.walkable == false and nn ~= "ignore" then
@ -875,7 +892,7 @@ minetest.register_entity(":__builtin:item", {
end
-- If none of the 4 sides is free, shoot upwards
if shootdir == nil then
shootdir = { x=0, y=1, z=0 }
shootdir = vector.new(0, 1, 0)
local nn = minetest.get_node(vector.add(p, shootdir)).name
if nn == "ignore" then
-- Do not push into ignore
@ -885,7 +902,7 @@ minetest.register_entity(":__builtin:item", {
-- Set new item moving speed accordingly
local newv = vector.multiply(shootdir, 3)
self.object:set_acceleration({x = 0, y = 0, z = 0})
self.object:set_acceleration(vector.zero())
self.object:set_velocity(newv)
disable_physics(self.object, self, false, false)
@ -907,10 +924,10 @@ minetest.register_entity(":__builtin:item", {
if self._forcetimer > 0 then
local cbox = self.object:get_properties().collisionbox
local ok = false
if self._force.x > 0 and (p.x > (self._forcestart.x + 0.5 + (cbox[4] - cbox[1])/2)) then ok = true
elseif self._force.x < 0 and (p.x < (self._forcestart.x + 0.5 - (cbox[4] - cbox[1])/2)) then ok = true
elseif self._force.z > 0 and (p.z > (self._forcestart.z + 0.5 + (cbox[6] - cbox[3])/2)) then ok = true
elseif self._force.z < 0 and (p.z < (self._forcestart.z + 0.5 - (cbox[6] - cbox[3])/2)) then ok = true end
if self._force.x > 0 and (p.x > (self._forcestart.x + 0.5 + (cbox[4] - cbox[1]) / 2)) then ok = true
elseif self._force.x < 0 and (p.x < (self._forcestart.x + 0.5 - (cbox[4] - cbox[1]) / 2)) then ok = true
elseif self._force.z > 0 and (p.z > (self._forcestart.z + 0.5 + (cbox[6] - cbox[3]) / 2)) then ok = true
elseif self._force.z < 0 and (p.z < (self._forcestart.z + 0.5 - (cbox[6] - cbox[3]) / 2)) then ok = true end
-- Item was successfully forced out. No more pushing
if ok then
self._forcetimer = -1
@ -941,7 +958,7 @@ minetest.register_entity(":__builtin:item", {
-- Set new item moving speed into the direciton of the liquid
local newv = vector.multiply(vec, f)
-- Swap to acceleration instead of a static speed to better mimic MC mechanics.
self.object:set_acceleration({x = newv.x, y = -0.22, z = newv.z})
self.object:set_acceleration(vector.new(newv.x, -0.22, newv.z))
self.physical_state = true
self._flowing = true
@ -954,9 +971,10 @@ minetest.register_entity(":__builtin:item", {
local cur_vec = self.object:get_velocity()
-- apply some acceleration in the opposite direction so it doesn't slide forever
local vec = {
x = 0 -cur_vec.x*0.9,
y = 3 -cur_vec.y*0.9,
z = 0 -cur_vec.z*0.9}
x = 0 - cur_vec.x * 0.9,
y = 3 - cur_vec.y * 0.9,
z = 0 - cur_vec.z * 0.9
}
self.object:set_acceleration(vec)
-- slow down the item in water
local vel = self.object:get_velocity()
@ -980,20 +998,20 @@ minetest.register_entity(":__builtin:item", {
end
-- If node is not registered or node is walkably solid and resting on nodebox
local nn = minetest.get_node({x=p.x, y=p.y-0.5, z=p.z}).name
local nn = minetest.get_node(vector.offset(p, 0, -0.5, 0)).name
local def = minetest.registered_nodes[nn]
local v = self.object:get_velocity()
local is_on_floor = def and (def.walkable
and not def.groups.slippery and v.y == 0)
if not minetest.registered_nodes[nn]
or is_floating or is_on_floor then
or is_floating or is_on_floor then
local own_stack = ItemStack(self.object:get_luaentity().itemstring)
-- Merge with close entities of the same item
for _, object in pairs(minetest.get_objects_inside_radius(p, 0.8)) do
local obj = object:get_luaentity()
if obj and obj.name == "__builtin:item"
and obj.physical_state == false then
and obj.physical_state == false then
if self:try_merge_with(own_stack, object, obj) then
return
end

View File

@ -0,0 +1,36 @@
# textdomain: mcl_minecarts
Minecart=トロッコ
Minecarts can be used for a quick transportion on rails.=トロッコは、レールを使った高速輸送を可能にします。
Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.=トロッコはレール上にしか乗らない為、常に線路に沿って走ります。直進できない丁字路では、取り敢えず左折します。速度はレールの種類によって異なります。
You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.=レールの上にトロッコを置けます。右クリックで乗り込みます。パンチすると動き出します。
To obtain the minecart, punch it while holding down the sneak key.=トロッコを入手するには、スニークキーを押しながらパンチします。
A minecart with TNT is an explosive vehicle that travels on rail.=TNT付きトロッコは、レール上を行きかう爆薬車両です。
Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.=レール上に配置。パンチで移動。TNTが着火するのは、火打石と打金を使った時か、稼動中のアクティベーターレール上にトロッコが乗った時です。
To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited.=トロッコとTNTを入手するには、スニークキーを押しながらパンチしてください。TNTに火が着いていた場合は、無理です。
A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel.=かまど付きトロッコは、レール上を走行する車両です。燃料で自走できます。
Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.=レールの上に置きます。石炭を与えると、かまどが長時間燃え続け、トロッコが自走可能になります。パンチすると動き出します。
To obtain the minecart and furnace, punch them while holding down the sneak key.=トロッコとかまどを入手するには、スニークキーを押しながらパンチします。
Minecart with Chest=チェスト付きトロッコ
Minecart with Furnace=かまど付きトロッコ
Minecart with Command Block=コマンドブロック付きトロッコ
Minecart with Hopper=ホッパー付きトロッコ
Minecart with TNT=TNT付きトロッコ
Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.=地面に置いて線路を作ると、レール同士が自動的につながり、必要に応じてカーブや丁字路、踏切、坂道などに変化します。
Rail=レール
Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.=レールを利用して、トロッコの輸送路が敷けます。普通のレールは、摩擦の関係でトロッコが少しずつ減速していきます。
Powered Rail=パワードレール
Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=レールを利用して、トロッコの輸送路が敷けます。パワードレールは、トロッコを加速させたり、ブレーキをかけたりできます。
Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=レッドストーン動力なしだと、このレールはトロッコにブレーキをかけます。このレールでトロッコを加速させるには、レッドストーン動力を供給してください。
Activator Rail=アクティベーターレール
Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=レールを利用して、トロッコの輸送路が敷けます。アクティベーターレールは、特殊なトロッコを作動させるために使われます。
To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=このレールでトロッコを作動させるには、レッドストーン動力を与えたレール上にトロッコを送り込みます。
Detector Rail=
Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.=レールを利用して、トロッコの輸送路が敷けます。ディテクターレールは、その上にあるトロッコを検知でき、その際レッドストーン機構の動力源となります。
To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=トロッコを検知してレッドストーン動力を供給するには、レッドストーン導線またはレッドストーン機構に接続し、任意のトロッコをレール上に送り込みます。
Track for minecarts=トロッコ用の線路
Speed up when powered, slow down when not powered=稼動中は加速、非稼動中は減速
Activates minecarts when powered=稼動中はトロッコを作動
Emits redstone power when a minecart is detected=トロッコを検知するとレッドストーン動力を放出
Vehicle for fast travel on rails=レール上を快速移動するための車両
Can be ignited by tools or powered activator rail=道具や稼動中のアクティベーターレールにより着火が可能
Sneak to dismount=スニークで降りる

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,349 @@
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
local mob_class = mcl_mobs.mob_class
local HORNY_TIME = 30*20
local HORNY_AGAIN_TIME = 30*20 -- was 300 or 15*20
local CHILD_GROW_TIME = 60*20
local LOGGING_ON = minetest.settings:get_bool("mcl_logging_mobs_villager",false)
local LOG_MODULE = "[mcl_mobs]"
local function mcl_log (message)
if LOGGING_ON and message then
minetest.log(LOG_MODULE .. " " .. message)
end
end
-- No-op in MCL2 (capturing mobs is not possible).
-- Provided for compability with Mobs Redo
function mcl_mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, force_take, replacewith)
return false
end
-- No-op in MCL2 (protecting mobs is not possible).
function mcl_mobs:protect(self, clicker)
return false
end
-- feeding, taming and breeding (thanks blert2112)
function mob_class:feed_tame(clicker, feed_count, breed, tame, notake)
if not self.follow then
return false
end
-- can eat/tame with item in hand
if self.nofollow or self:follow_holding(clicker) then
local consume_food = false
-- tame if not still a baby
if tame and not self.child then
if not self.owner or self.owner == "" then
self.tamed = true
self.owner = clicker:get_player_name()
consume_food = true
end
end
-- increase health
if self.health < self.hp_max and not consume_food then
consume_food = true
self.health = math.min(self.health + 4, self.hp_max)
if self.htimer < 1 then
self.htimer = 5
end
self.object:set_hp(self.health)
end
-- make children grow quicker
if not consume_food and self.child == true then
consume_food = true
-- deduct 10% of the time to adulthood
self.hornytimer = self.hornytimer + ((CHILD_GROW_TIME - self.hornytimer) * 0.1)
end
-- breed animals
if breed and not consume_food and self.hornytimer == 0 and not self.horny then
self.food = (self.food or 0) + 1
consume_food = true
if self.food >= feed_count then
self.food = 0
self.horny = true
end
end
self:update_tag()
-- play a sound if the animal used the item and take the item if not in creative
if consume_food then
-- don't consume food if clicker is in creative
if not minetest.is_creative_enabled(clicker:get_player_name()) and not notake then
local item = clicker:get_wielded_item()
item:take_item()
clicker:set_wielded_item(item)
end
-- always play the eat sound if food is used, even in creative
self:mob_sound("eat", nil, true)
else
-- make sound when the mob doesn't want food
self:mob_sound("random", true)
end
return true
end
return false
end
-- Spawn a child
function mcl_mobs.spawn_child(pos, mob_type)
local child = minetest.add_entity(pos, mob_type)
if not child then
return
end
local ent = child:get_luaentity()
mcl_mobs.effect(pos, 15, "mcl_particles_smoke.png", 1, 2, 2, 15, 5)
ent.child = true
local textures
-- using specific child texture (if found)
if ent.child_texture then
textures = ent.child_texture[1]
end
-- and resize to half height
child:set_properties({
textures = textures,
visual_size = {
x = ent.base_size.x * .5,
y = ent.base_size.y * .5,
},
collisionbox = {
ent.base_colbox[1] * .5,
ent.base_colbox[2] * .5,
ent.base_colbox[3] * .5,
ent.base_colbox[4] * .5,
ent.base_colbox[5] * .5,
ent.base_colbox[6] * .5,
},
selectionbox = {
ent.base_selbox[1] * .5,
ent.base_selbox[2] * .5,
ent.base_selbox[3] * .5,
ent.base_selbox[4] * .5,
ent.base_selbox[5] * .5,
ent.base_selbox[6] * .5,
},
})
ent.animation = ent._child_animations
ent._current_animation = nil
ent:set_animation("stand")
return child
end
-- find two animals of same type and breed if nearby and horny
function mob_class:check_breeding()
--mcl_log("In breed function")
-- child takes a long time before growing into adult
if self.child == true then
-- When a child, hornytimer is used to count age until adulthood
self.hornytimer = self.hornytimer + 1
if self.hornytimer >= CHILD_GROW_TIME then
self.child = false
self.hornytimer = 0
self.object:set_properties({
textures = self.base_texture,
mesh = self.base_mesh,
visual_size = self.base_size,
collisionbox = self.base_colbox,
selectionbox = self.base_selbox,
})
-- custom function when child grows up
if self.on_grown then
self.on_grown(self)
else
-- jump when fully grown so as not to fall into ground
self.object:set_velocity({
x = 0,
y = self.jump_height,
z = 0
})
end
self.animation = nil
local anim = self._current_animation
self._current_animation = nil -- Mobs Redo does nothing otherwise
self:set_animation(anim)
end
return
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
if self.hornytimer >= HORNY_TIME + HORNY_AGAIN_TIME then
self.hornytimer = 0
self.horny = false
end
end
end
-- find another same animal who is also horny and mate if nearby
if self.horny == true
and self.hornytimer <= HORNY_TIME then
mcl_log("In breed function. All good. Do the magic.")
local pos = self.object:get_pos()
mcl_mobs.effect({x = pos.x, y = pos.y + 1, z = pos.z}, 8, "heart.png", 3, 4, 1, 0.1)
local objs = minetest.get_objects_inside_radius(pos, 3)
local num = 0
local ent = nil
for n = 1, #objs do
ent = objs[n]:get_luaentity()
-- check for same animal with different colour
local canmate = false
if ent then
if ent.name == self.name then
canmate = true
else
local entname = string.split(ent.name,":")
local selfname = string.split(self.name,":")
if entname[1] == selfname[1] then
entname = string.split(entname[2],"_")
selfname = string.split(selfname[2],"_")
if entname[1] == selfname[1] then
canmate = true
end
end
end
end
if canmate then mcl_log("In breed function. Can mate.") end
if ent
and canmate == true
and ent.horny == true
and ent.hornytimer <= HORNY_TIME then
num = num + 1
end
-- found your mate? then have a baby
if num > 1 then
self.hornytimer = HORNY_TIME + 1
ent.hornytimer = HORNY_TIME + 1
-- spawn baby
minetest.after(5, function(parent1, parent2, pos)
if not parent1.object:get_luaentity() then
return
end
if not parent2.object:get_luaentity() then
return
end
mcl_experience.throw_xp(pos, math.random(1, 7))
-- custom breed function
if parent1.on_breed then
-- when false, skip going any further
if parent1.on_breed(parent1, parent2) == false then
return
end
end
local child = mcl_mobs.spawn_child(pos, parent1.name)
local ent_c = child:get_luaentity()
-- Use texture of one of the parents
local p = math.random(1, 2)
if p == 1 then
ent_c.base_texture = parent1.base_texture
else
ent_c.base_texture = parent2.base_texture
end
child:set_properties({
textures = ent_c.base_texture
})
-- tamed and owned by parents' owner
ent_c.tamed = true
ent_c.owner = parent1.owner
end, self, ent, pos)
num = 0
break
end
end
end
end
function mob_class:toggle_sit(clicker,p)
if not self.tamed or self.child or self.owner ~= clicker:get_player_name() then
return
end
local pos = self.object:get_pos()
local particle
if not self.order or self.order == "" or self.order == "sit" then
particle = "mobs_mc_wolf_icon_roam.png"
self.order = "roam"
self.state = "stand"
self.walk_chance = default_walk_chance
self.jump = true
self:set_animation("stand")
-- TODO: Add sitting model
else
particle = "mobs_mc_wolf_icon_sit.png"
self.order = "sit"
self.state = "stand"
self.walk_chance = 0
self.jump = false
if self.animation.sit_start then
self:set_animation("sit")
else
self:set_animation("stand")
end
end
local pp = vector.new(0,1.4,0)
if p then pp = vector.offset(pp,0,p,0) end
-- Display icon to show current order (sit or roam)
minetest.add_particle({
pos = vector.add(pos, pp),
velocity = {x=0,y=0.2,z=0},
expirationtime = 1,
size = 4,
texture = particle,
playername = self.owner,
glow = minetest.LIGHT_MAX,
})
end

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,32 @@
-- this is to make the register_mob and register egg functions commonly used by mods not break
-- when they use the weird old : notation AND self as first argument
local oldregmob = mcl_mobs.register_mob
function mcl_mobs.register_mob(self,name,def)
if type(self) == "string" then
def = name
name = self
end
return oldregmob(name,def)
end
local oldregegg = mcl_mobs.register_egg
function mcl_mobs.register_egg(self, mob, desc, background_color, overlay_color, addegg, no_creative)
if type(self) == "string" then
no_creative = addegg
addegg = overlay_color
overlay_color = background_color
background_color = desc
desc = mob
mob = self
end
return oldregegg(mob, desc, background_color, overlay_color, addegg, no_creative)
end
local oldregarrow = mcl_mobs.register_mob
function mcl_mobs.register_mob(self,name,def)
if type(self) == "string" then
def = name
name = self
end
return oldregarrow(name,def)
end

View File

@ -0,0 +1,411 @@
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
local mob_class = mcl_mobs.mob_class
local active_particlespawners = {}
local disable_blood = minetest.settings:get_bool("mobs_disable_blood")
local DEFAULT_FALL_SPEED = -9.81*1.5
local player_transfer_distance = tonumber(minetest.settings:get("player_transfer_distance")) or 128
if player_transfer_distance == 0 then player_transfer_distance = math.huge end
-- custom particle effects
function mcl_mobs.effect(pos, amount, texture, min_size, max_size, radius, gravity, glow, go_down)
radius = radius or 2
min_size = min_size or 0.5
max_size = max_size or 1
gravity = gravity or DEFAULT_FALL_SPEED
glow = glow or 0
go_down = go_down or false
local ym
if go_down then
ym = 0
else
ym = -radius
end
minetest.add_particlespawner({
amount = amount,
time = 0.25,
minpos = pos,
maxpos = pos,
minvel = {x = -radius, y = ym, z = -radius},
maxvel = {x = radius, y = radius, z = radius},
minacc = {x = 0, y = gravity, z = 0},
maxacc = {x = 0, y = gravity, z = 0},
minexptime = 0.1,
maxexptime = 1,
minsize = min_size,
maxsize = max_size,
texture = texture,
glow = glow,
})
end
function mcl_mobs.death_effect(pos, yaw, collisionbox, rotate)
local min, max
if collisionbox then
min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]}
max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]}
else
min = { x = -0.5, y = 0, z = -0.5 }
max = { x = 0.5, y = 0.5, z = 0.5 }
end
if rotate then
min = vector.rotate(min, {x=0, y=yaw, z=math.pi/2})
max = vector.rotate(max, {x=0, y=yaw, z=math.pi/2})
min, max = vector.sort(min, max)
min = vector.multiply(min, 0.5)
max = vector.multiply(max, 0.5)
end
minetest.add_particlespawner({
amount = 50,
time = 0.001,
minpos = vector.add(pos, min),
maxpos = vector.add(pos, max),
minvel = vector.new(-5,-5,-5),
maxvel = vector.new(5,5,5),
minexptime = 1.1,
maxexptime = 1.5,
minsize = 1,
maxsize = 2,
collisiondetection = false,
vertical = false,
texture = "mcl_particles_mob_death.png^[colorize:#000000:255",
})
minetest.sound_play("mcl_mobs_mob_poof", {
pos = pos,
gain = 1.0,
max_hear_distance = 8,
}, true)
end
-- play sound
function mob_class:mob_sound(soundname, is_opinion, fixed_pitch)
local soundinfo
if self.sounds_child and self.child then
soundinfo = self.sounds_child
elseif self.sounds then
soundinfo = self.sounds
end
if not soundinfo then
return
end
local sound = soundinfo[soundname]
if sound then
if is_opinion and self.opinion_sound_cooloff > 0 then
return
end
local pitch
if not fixed_pitch then
local base_pitch = soundinfo.base_pitch
if not base_pitch then
base_pitch = 1
end
if self.child and (not self.sounds_child) then
-- Children have higher pitch
pitch = base_pitch * 1.5
else
pitch = base_pitch
end
-- 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,
max_hear_distance = self.sounds.distance,
pitch = pitch,
}, true)
self.opinion_sound_cooloff = 1
end
end
function mob_class:add_texture_mod(mod)
local full_mod = ""
local already_added = false
for i=1, #self.texture_mods do
if mod == self.texture_mods[i] then
already_added = true
end
full_mod = full_mod .. self.texture_mods[i]
end
if not already_added then
full_mod = full_mod .. mod
table.insert(self.texture_mods, mod)
end
self.object:set_texture_mod(full_mod)
end
function mob_class:remove_texture_mod(mod)
local full_mod = ""
local remove = {}
for i=1, #self.texture_mods do
if self.texture_mods[i] ~= mod then
full_mod = full_mod .. self.texture_mods[i]
else
table.insert(remove, i)
end
end
for i=#remove, 1 do
table.remove(self.texture_mods, remove[i])
end
self.object:set_texture_mod(full_mod)
end
function mob_class:damage_effect(damage)
-- damage particles
if (not disable_blood) and damage > 0 then
local amount_large = math.floor(damage / 2)
local amount_small = damage % 2
local pos = self.object:get_pos()
pos.y = pos.y + (self.collisionbox[5] - self.collisionbox[2]) * .5
local texture = "mobs_blood.png"
-- full heart damage (one particle for each 2 HP damage)
if amount_large > 0 then
mcl_mobs.effect(pos, amount_large, texture, 2, 2, 1.75, 0, nil, true)
end
-- half heart damage (one additional particle if damage is an odd number)
if amount_small > 0 then
-- TODO: Use "half heart"
mcl_mobs.effect(pos, amount_small, texture, 1, 1, 1.75, 0, nil, true)
end
end
end
function mob_class:remove_particlespawners(pn)
if not active_particlespawners[pn] then return end
if not active_particlespawners[pn][self.object] then return end
for k,v in pairs(active_particlespawners[pn][self.object]) do
minetest.delete_particlespawner(v)
end
end
function mob_class:add_particlespawners(pn)
if not active_particlespawners[pn] then active_particlespawners[pn] = {} end
if not active_particlespawners[pn][self.object] then active_particlespawners[pn][self.object] = {} end
for _,ps in pairs(self.particlespawners) do
ps.attached = self.object
ps.playername = pn
table.insert(active_particlespawners[pn][self.object],minetest.add_particlespawner(ps))
end
end
function mob_class:check_particlespawners(dtime)
if not self.particlespawners then return end
--minetest.log(dump(active_particlespawners))
if self._particle_timer and self._particle_timer >= 1 then
self._particle_timer = 0
local players = {}
for _,player in pairs(minetest.get_connected_players()) do
local pn = player:get_player_name()
table.insert(players,pn)
if not active_particlespawners[pn] then
active_particlespawners[pn] = {} end
local dst = vector.distance(player:get_pos(),self.object:get_pos())
if dst < player_transfer_distance and not active_particlespawners[pn][self.object] then
self:add_particlespawners(pn)
elseif dst >= player_transfer_distance and active_particlespawners[pn][self.object] then
self:remove_particlespawners(pn)
end
end
elseif not self._particle_timer then
self._particle_timer = 0
end
self._particle_timer = self._particle_timer + dtime
end
-- set defined animation
function mob_class:set_animation(anim, fixed_frame)
if not self.animation or not anim then
return
end
if self.state == "die" and anim ~= "die" and anim ~= "stand" then
return
end
if self.jockey then
anim = "jockey"
end
if self:flight_check() and self.fly and anim == "walk" then anim = "fly" end
self._current_animation = self._current_animation or ""
if (anim == self._current_animation
or not self.animation[anim .. "_start"]
or not self.animation[anim .. "_end"]) and self.state ~= "die" then
return
end
self._current_animation = anim
local a_start = self.animation[anim .. "_start"]
local a_end
if fixed_frame then
a_end = a_start
else
a_end = self.animation[anim .. "_end"]
end
if a_start and a_end then
self.object:set_animation({
x = a_start,
y = a_end},
self.animation[anim .. "_speed"] or self.animation.speed_normal or 15,
0, self.animation[anim .. "_loop"] ~= false)
end
end
-- above function exported for mount.lua
function mcl_mobs:set_animation(self, anim)
self:set_animation(anim)
end
local function dir_to_pitch(dir)
--local dir2 = vector.normalize(dir)
local xz = math.abs(dir.x) + math.abs(dir.z)
return -math.atan2(-dir.y, xz)
end
local function who_are_you_looking_at (self)
local pos = self.object:get_pos()
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)
local look_at_player_chance = math.random(20/self.curiosity)
-- 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
if self._locked_object:get_luaentity() then
_locked_object_eye_height = self._locked_object:get_luaentity().head_eye_height
end
if self._locked_object:is_player() then
_locked_object_eye_height = self._locked_object:get_properties().eye_height
end
if _locked_object_eye_height then
local self_rot = self.object:get_rotation()
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)))
local mob_yaw = math.deg(-(-(self_rot.y)-(-minetest.dir_to_yaw(direction_player))))+self.head_yaw_offset
local mob_pitch = math.deg(-dir_to_pitch(direction_player))*self.head_pitch_multiplier
if (mob_yaw < -60 or mob_yaw > 60) and not (self.attack and self.state == "attack" and not self.runaway) then
final_rotation = vector.multiply(oldr, 0.9)
elseif self.attack and self.state == "attack" and not self.runaway then
if self.head_yaw == "y" then
final_rotation = vector.new(mob_pitch, mob_yaw, 0)
elseif self.head_yaw == "z" then
final_rotation = vector.new(mob_pitch, 0, -mob_yaw)
end
else
if self.head_yaw == "y" then
final_rotation = vector.new(((mob_pitch-oldr.x)*.3)+oldr.x, ((mob_yaw-oldr.y)*.3)+oldr.y, 0)
elseif self.head_yaw == "z" then
final_rotation = vector.new(((mob_pitch-oldr.x)*.3)+oldr.x, 0, -(((mob_yaw-oldr.y)*.3)+oldr.y)*3)
end
end
end
end
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)
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
if self.frame_speed_multiplier then
local v2 = math.abs(v.x)+math.abs(v.z)*.833
if not self.animation.walk_speed then
self.animation.walk_speed = 25
end
if math.abs(v.x)+math.abs(v.z) > 0.5 then
self.object:set_animation_frame_speed((v2/math.max(1,self.run_velocity))*self.animation.walk_speed*self.frame_speed_multiplier)
else
self.object:set_animation_frame_speed(25)
end
end
--set_speed
if self.acc then
self.object:add_velocity(self.acc)
end
end
end
minetest.register_on_leaveplayer(function(player)
local pn = player:get_player_name()
if not active_particlespawners[pn] then return end
for _,m in pairs(active_particlespawners[pn]) do
for k,v in pairs(m) do
minetest.delete_particlespawner(v)
end
end
active_particlespawners[pn] = nil
end)

View File

@ -1,14 +1,566 @@
local path = minetest.get_modpath(minetest.get_current_modname())
-- Mob API
mcl_mobs = {}
mcl_mobs.mob_class = {}
mcl_mobs.mob_class_meta = {__index = mcl_mobs.mob_class}
mcl_mobs.registered_mobs = {}
local modname = minetest.get_current_modname()
local path = minetest.get_modpath(modname)
local S = minetest.get_translator(modname)
mcl_mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "mcl_core:dirt"
--api and helpers
-- effects: sounds and particles mostly
dofile(path .. "/effects.lua")
-- physics: involuntary mob movement - particularly falling and death
dofile(path .. "/physics.lua")
-- movement: general voluntary mob movement, walking avoiding cliffs etc.
dofile(path .. "/movement.lua")
-- items: item management for mobs
dofile(path .. "/items.lua")
-- pathfinding: pathfinding to target positions
dofile(path .. "/pathfinding.lua")
-- combat: attack logic
dofile(path .. "/combat.lua")
-- the enity functions themselves
dofile(path .. "/api.lua")
-- Spawning Algorithm
--utility functions
dofile(path .. "/breeding.lua")
dofile(path .. "/spawning.lua")
-- Rideable Mobs
dofile(path .. "/mount.lua")
dofile(path .. "/crafts.lua")
dofile(path .. "/compat.lua")
-- Mob Items
dofile(path .. "/crafts.lua")
local DEFAULT_FALL_SPEED = -9.81*1.5
local MAX_MOB_NAME_LENGTH = 30
local old_spawn_icons = minetest.settings:get_bool("mcl_old_spawn_icons",false)
local extended_pet_control = minetest.settings:get_bool("mcl_extended_pet_control",true)
local difficulty = tonumber(minetest.settings:get("mob_difficulty")) or 1.0
-- get node but use fallback for nil or unknown
local node_ok = function(pos, fallback)
fallback = fallback or mcl_mobs.fallback_node
local node = minetest.get_node_or_nil(pos)
if node and minetest.registered_nodes[node.name] then
return node
end
return minetest.registered_nodes[fallback]
end
--#### REGISTER FUNCS
-- Code to execute before custom on_rightclick handling
local on_rightclick_prefix = function(self, clicker)
if not clicker:is_player() then return end
local item = clicker:get_wielded_item()
if extended_pet_control and self.tamed and self.owner == clicker:get_player_name() then
self:toggle_sit(clicker)
end
-- Name mob with nametag
if not self.ignores_nametag and item:get_name() == "mcl_mobs:nametag" then
local tag = item:get_meta():get_string("name")
if tag ~= "" then
if string.len(tag) > MAX_MOB_NAME_LENGTH then
tag = string.sub(tag, 1, MAX_MOB_NAME_LENGTH)
end
self.nametag = tag
self:update_tag()
if not minetest.is_creative_enabled(clicker:get_player_name()) then
item:take_item()
clicker:set_wielded_item(item)
end
return true
end
end
return false
end
local create_mob_on_rightclick = function(on_rightclick)
return function(self, clicker)
local stop = on_rightclick_prefix(self, clicker)
if (not stop) and (on_rightclick) then
on_rightclick(self, clicker)
end
end
end
-- check if within physical map limits (-30911 to 30927)
local function within_limits(pos, radius)
local wmin, wmax = -30912, 30928
if mcl_vars then
if mcl_vars.mapgen_edge_min and mcl_vars.mapgen_edge_max then
wmin, wmax = mcl_vars.mapgen_edge_min, mcl_vars.mapgen_edge_max
end
end
if radius then
wmin = wmin - radius
wmax = wmax + radius
end
for _,v in pairs(pos) do
if v < wmin or v > wmax then return false end
end
return true
end
mcl_mobs.spawning_mobs = {}
-- register mob entity
function mcl_mobs.register_mob(name, def)
mcl_mobs.spawning_mobs[name] = true
mcl_mobs.registered_mobs[name] = def
local can_despawn
if def.can_despawn ~= nil then
can_despawn = def.can_despawn
elseif def.spawn_class == "passive" then
can_despawn = false
else
can_despawn = true
end
local function scale_difficulty(value, default, min, special)
if (not value) or (value == default) or (value == special) then
return default
else
return math.max(min, value * difficulty)
end
end
local collisionbox = def.collisionbox or {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}
-- Workaround for <https://github.com/minetest/minetest/issues/5966>:
-- Increase upper Y limit to avoid mobs glitching through solid nodes.
-- FIXME: Remove workaround if it's no longer needed.
if collisionbox[5] < 0.79 then
collisionbox[5] = 0.79
end
local final_def = {
use_texture_alpha = def.use_texture_alpha,
head_swivel = def.head_swivel or nil, -- bool to activate this function
head_yaw_offset = def.head_yaw_offset or 0, -- for wonkey model bones
head_pitch_multiplier = def.head_pitch_multiplier or 1, --for inverted pitch
bone_eye_height = def.bone_eye_height or 1.4, -- head bone offset
head_eye_height = def.head_eye_height or def.bone_eye_height or 0, -- how hight aproximatly the mobs head is fromm the ground to tell the mob how high to look up at the player
curiosity = def.curiosity or 1, -- how often mob will look at player on idle
head_yaw = def.head_yaw or "y", -- axis to rotate head on
horrizonatal_head_height = def.horrizonatal_head_height or 0,
wears_armor = def.wears_armor, -- a number value used to index texture slot for armor
stepheight = def.stepheight or 0.6,
name = name,
description = def.description,
type = def.type,
attack_type = def.attack_type,
fly = def.fly or false,
fly_in = def.fly_in or {"air", "__airlike"},
owner = def.owner or "",
order = def.order or "",
on_die = def.on_die,
spawn_small_alternative = def.spawn_small_alternative,
do_custom = def.do_custom,
detach_child = def.detach_child,
jump_height = def.jump_height or 4, -- was 6
rotate = math.rad(def.rotate or 0), -- 0=front, 90=side, 180=back, 270=side2
lifetimer = def.lifetimer or 57.73,
hp_min = scale_difficulty(def.hp_min, 5, 1),
hp_max = scale_difficulty(def.hp_max, 10, 1),
xp_min = def.xp_min or 0,
xp_max = def.xp_max or 0,
xp_timestamp = 0,
breath_max = def.breath_max or 15,
breathes_in_water = def.breathes_in_water or false,
physical = true,
collisionbox = collisionbox,
selectionbox = def.selectionbox or def.collisionbox,
visual = def.visual,
visual_size = def.visual_size or {x = 1, y = 1},
mesh = def.mesh,
makes_footstep_sound = def.makes_footstep_sound or false,
view_range = def.view_range or 16,
walk_velocity = def.walk_velocity or 1,
run_velocity = def.run_velocity or 2,
damage = scale_difficulty(def.damage, 0, 0),
light_damage = def.light_damage or 0,
sunlight_damage = def.sunlight_damage or 0,
water_damage = def.water_damage or 0,
lava_damage = def.lava_damage or 8,
fire_damage = def.fire_damage or 1,
suffocation = def.suffocation or true,
fall_damage = def.fall_damage or 1,
fall_speed = def.fall_speed or DEFAULT_FALL_SPEED, -- must be lower than -2
drops = def.drops or {},
armor = def.armor or 100,
on_rightclick = create_mob_on_rightclick(def.on_rightclick),
arrow = def.arrow,
shoot_interval = def.shoot_interval,
sounds = def.sounds or {},
animation = def.animation or {},
follow = def.follow,
nofollow = def.nofollow,
can_open_doors = def.can_open_doors,
jump = def.jump ~= false,
automatic_face_movement_max_rotation_per_sec = 300,
walk_chance = def.walk_chance or 50,
attacks_monsters = def.attacks_monsters or false,
group_attack = def.group_attack or false,
passive = def.passive or false,
knock_back = def.knock_back ~= false,
shoot_offset = def.shoot_offset or 0,
floats = def.floats or 1, -- floats in water by default
floats_on_lava = def.floats_on_lava or 0,
replace_rate = def.replace_rate,
replace_what = def.replace_what,
replace_with = def.replace_with,
replace_offset = def.replace_offset or 0,
on_replace = def.on_replace,
timer = 0,
env_damage_timer = 0,
tamed = false,
pause_timer = 0,
horny = false,
hornytimer = 0,
gotten = false,
health = 0,
frame_speed_multiplier = 1,
reach = def.reach or 3,
htimer = 0,
texture_list = def.textures,
child_texture = def.child_texture,
docile_by_day = def.docile_by_day or false,
time_of_day = 0.5,
fear_height = def.fear_height or 0,
runaway = def.runaway,
runaway_timer = 0,
pathfinding = def.pathfinding,
immune_to = def.immune_to or {},
explosion_radius = def.explosion_radius, -- LEGACY
explosion_damage_radius = def.explosion_damage_radius, -- LEGACY
explosiontimer_reset_radius = def.explosiontimer_reset_radius,
explosion_timer = def.explosion_timer or 3,
allow_fuse_reset = def.allow_fuse_reset ~= false,
stop_to_explode = def.stop_to_explode ~= false,
custom_attack = def.custom_attack,
double_melee_attack = def.double_melee_attack,
dogshoot_switch = def.dogshoot_switch,
dogshoot_count = 0,
dogshoot_count_max = def.dogshoot_count_max or 5,
dogshoot_count2_max = def.dogshoot_count2_max or (def.dogshoot_count_max or 5),
attack_animals = def.attack_animals or false,
attack_npcs = def.attack_npcs or false,
specific_attack = def.specific_attack,
runaway_from = def.runaway_from,
owner_loyal = def.owner_loyal,
facing_fence = false,
is_mob = true,
pushable = def.pushable or true,
-- MCL2 extensions
shooter_avoid_enemy = def.shooter_avoid_enemy,
strafes = def.strafes,
avoid_distance = def.avoid_distance or 9,
do_teleport = def.do_teleport,
spawn_class = def.spawn_class,
can_spawn = def.can_spawn,
ignores_nametag = def.ignores_nametag or false,
rain_damage = def.rain_damage or 0,
glow = def.glow,
can_despawn = can_despawn,
child = def.child or false,
texture_mods = {},
shoot_arrow = def.shoot_arrow,
sounds_child = def.sounds_child,
_child_animations = def.child_animations,
pick_up = def.pick_up,
explosion_strength = def.explosion_strength,
suffocation_timer = 0,
follow_velocity = def.follow_velocity or 2.4,
instant_death = def.instant_death or false,
fire_resistant = def.fire_resistant or false,
fire_damage_resistant = def.fire_damage_resistant or false,
ignited_by_sunlight = def.ignited_by_sunlight or false,
spawn_in_group = def.spawn_in_group,
spawn_in_group_min = def.spawn_in_group_min,
noyaw = def.noyaw or false,
particlespawners = def.particlespawners,
-- End of MCL2 extensions
on_spawn = def.on_spawn,
on_blast = def.on_blast or function(self,damage)
self.object:punch(self.object, 1.0, {
full_punch_interval = 1.0,
damage_groups = {fleshy = damage},
}, nil)
return false, true, {}
end,
do_punch = def.do_punch,
on_breed = def.on_breed,
on_grown = def.on_grown,
on_pick_up = def.on_pick_up,
on_activate = function(self, staticdata, dtime)
--this is a temporary hack so mobs stop
--glitching and acting really weird with the
--default built in engine collision detection
self.is_mob = true
self.object:set_properties({
collide_with_objects = false,
})
return self:mob_activate(staticdata, def, dtime)
end,
harmed_by_heal = def.harmed_by_heal,
on_lightning_strike = def.on_lightning_strike
}
minetest.register_entity(name, setmetatable(final_def,mcl_mobs.mob_class_meta))
if minetest.get_modpath("doc_identifier") ~= nil then
doc.sub.identifier.register_object(name, "basics", "mobs")
end
end -- END mcl_mobs.register_mob function
-- register arrow for shoot attack
function mcl_mobs.register_arrow(name, def)
if not name or not def then return end -- errorcheck
minetest.register_entity(name, {
physical = false,
visual = def.visual,
visual_size = def.visual_size,
textures = def.textures,
velocity = def.velocity,
hit_player = def.hit_player,
hit_node = def.hit_node,
hit_mob = def.hit_mob,
hit_object = def.hit_object,
drop = def.drop or false, -- drops arrow as registered item when true
collisionbox = {0, 0, 0, 0, 0, 0}, -- remove box around arrows
timer = 0,
switch = 0,
owner_id = def.owner_id,
rotate = def.rotate,
on_punch = function(self)
local vel = self.object:get_velocity()
self.object:set_velocity({x=vel.x * -1, y=vel.y * -1, z=vel.z * -1})
end,
collisionbox = def.collisionbox or {0, 0, 0, 0, 0, 0},
automatic_face_movement_dir = def.rotate
and (def.rotate - (math.pi / 180)) or false,
on_activate = def.on_activate,
on_step = def.on_step or function(self, dtime)
self.timer = self.timer + 1
local pos = self.object:get_pos()
if self.switch == 0
or self.timer > 150
or not within_limits(pos, 0) then
mcl_burning.extinguish(self.object)
self.object:remove();
return
end
-- does arrow have a tail (fireball)
if def.tail
and def.tail == 1
and def.tail_texture then
minetest.add_particle({
pos = pos,
velocity = {x = 0, y = 0, z = 0},
acceleration = {x = 0, y = 0, z = 0},
expirationtime = def.expire or 0.25,
collisiondetection = false,
texture = def.tail_texture,
size = def.tail_size or 5,
glow = def.glow or 0,
})
end
if self.hit_node then
local node = node_ok(pos).name
if minetest.registered_nodes[node].walkable then
self.hit_node(self, pos, node)
if self.drop == true then
pos.y = pos.y + 1
self.lastpos = (self.lastpos or pos)
minetest.add_item(self.lastpos, self.object:get_luaentity().name)
end
self.object:remove();
return
end
end
if self.hit_player or self.hit_mob or self.hit_object then
for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do
if self.hit_player
and player:is_player() then
self.hit_player(self, player)
self.object:remove();
return
end
local entity = player:get_luaentity()
if entity
and self.hit_mob
and entity.is_mob == true
and tostring(player) ~= self.owner_id
and entity.name ~= self.object:get_luaentity().name then
self.hit_mob(self, player)
self.object:remove();
return
end
if entity
and self.hit_object
and (not entity.is_mob)
and tostring(player) ~= self.owner_id
and entity.name ~= self.object:get_luaentity().name then
self.hit_object(self, player)
self.object:remove();
return
end
end
end
self.lastpos = pos
end
})
end
-- Register spawn eggs
-- Note: This also introduces the “spawn_egg” group:
-- * spawn_egg=1: Spawn egg (generic mob, no metadata)
-- * spawn_egg=2: Spawn egg (captured/tamed mob, metadata)
function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addegg, no_creative)
local grp = {spawn_egg = 1}
-- do NOT add this egg to creative inventory (e.g. dungeon master)
if no_creative == true then
grp.not_in_creative_inventory = 1
end
local invimg = "(spawn_egg.png^[multiply:" .. background_color ..")^(spawn_egg_overlay.png^[multiply:" .. overlay_color .. ")"
if old_spawn_icons then
local mobname = mob:gsub("mobs_mc:","")
local fn = "mobs_mc_spawn_icon_"..mobname..".png"
if mcl_util.file_exists(minetest.get_modpath("mobs_mc").."/textures/"..fn) then
invimg = fn
end
end
if addegg == 1 then
invimg = "mobs_chicken_egg.png^(" .. invimg ..
"^[mask:mobs_chicken_egg_overlay.png)"
end
-- register old stackable mob egg
minetest.register_craftitem(mob, {
description = desc,
inventory_image = invimg,
groups = grp,
_doc_items_longdesc = S("This allows you to place a single mob."),
_doc_items_usagehelp = S("Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns."),
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]
if def and def.on_rightclick then
return def.on_rightclick(pointed_thing.under, under, placer, itemstack)
end
if pos
and within_limits(pos, 0)
and not minetest.is_protected(pos, placer:get_player_name()) then
local name = placer:get_player_name()
local privs = minetest.get_player_privs(name)
if under.name == "mcl_mobspawners:spawner" then
if minetest.is_protected(pointed_thing.under, name) then
minetest.record_protection_violation(pointed_thing.under, name)
return itemstack
end
if not privs.maphack then
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())
if not minetest.is_creative_enabled(name) then
itemstack:take_item()
end
return itemstack
end
if not minetest.registered_entities[mob] then
return itemstack
end
if minetest.settings:get_bool("only_peaceful_mobs", false)
and minetest.registered_entities[mob].type == "monster" then
minetest.chat_send_player(name, S("Only peaceful mobs allowed!"))
return itemstack
end
pos.y = pos.y - 0.5
local mob = minetest.add_entity(pos, mob)
local entityname = itemstack:get_name()
minetest.log("action", "Player " ..name.." spawned "..entityname.." at "..minetest.pos_to_string(pos))
local ent = mob:get_luaentity()
-- don't set owner if monster or sneak pressed
if ent.type ~= "monster"
and not placer:get_player_control().sneak then
ent.owner = placer:get_player_name()
ent.tamed = true
end
-- set nametag
local nametag = itemstack:get_meta():get_string("name")
if nametag ~= "" then
if string.len(nametag) > MAX_MOB_NAME_LENGTH then
nametag = string.sub(nametag, 1, MAX_MOB_NAME_LENGTH)
end
ent.nametag = nametag
update_tag(ent)
end
-- if not in creative then take item
if not minetest.is_creative_enabled(placer:get_player_name()) then
itemstack:take_item()
end
end
return itemstack
end,
})
end

View File

@ -0,0 +1,103 @@
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
local mob_class = mcl_mobs.mob_class
--- Item and armor management
local function player_near(pos)
for _,o in pairs(minetest.get_objects_inside_radius(pos,2)) do
if o:is_player() then return true end
end
end
local function get_armor_texture(armor_name)
if armor_name == "" then
return ""
end
if armor_name=="blank.png" then
return "blank.png"
end
local seperator = string.find(armor_name, ":")
return "mcl_armor_"..string.sub(armor_name, seperator+1, -1)..".png^"
end
function mob_class:set_armor_texture()
if self.armor_list then
local chestplate=minetest.registered_items[self.armor_list.chestplate] or {name=""}
local boots=minetest.registered_items[self.armor_list.boots] or {name=""}
local leggings=minetest.registered_items[self.armor_list.leggings] or {name=""}
local helmet=minetest.registered_items[self.armor_list.helmet] or {name=""}
if helmet.name=="" and chestplate.name=="" and leggings.name=="" and boots.name=="" then
helmet={name="blank.png"}
end
local texture = get_armor_texture(chestplate.name)..get_armor_texture(helmet.name)..get_armor_texture(boots.name)..get_armor_texture(leggings.name)
if string.sub(texture, -1,-1) == "^" then
texture=string.sub(texture,1,-2)
end
if self.textures[self.wears_armor] then
self.textures[self.wears_armor]=texture
end
self.object:set_properties({textures=self.textures})
local armor_
if type(self.armor) == "table" then
armor_ = table.copy(self.armor)
armor_.immortal = 1
else
armor_ = {immortal=1, fleshy = self.armor}
end
for _,item in pairs(self.armor_list) do
if not item then return end
if type(minetest.get_item_group(item, "mcl_armor_points")) == "number" then
armor_.fleshy=armor_.fleshy-(minetest.get_item_group(item, "mcl_armor_points")*3.5)
end
end
self.object:set_armor_groups(armor_)
end
end
function mob_class:check_item_pickup()
if self.pick_up and #self.pick_up > 0 or self.wears_armor then
local p = self.object:get_pos()
if not p then return end
for _,o in pairs(minetest.get_objects_inside_radius(p,2)) do
local l=o:get_luaentity()
if l and l.name == "__builtin:item" then
if not player_near(p) and l.itemstring:find("mcl_armor") and self.wears_armor then
local armor_type
if l.itemstring:find("chestplate") then
armor_type = "chestplate"
elseif l.itemstring:find("boots") then
armor_type = "boots"
elseif l.itemstring:find("leggings") then
armor_type = "leggings"
elseif l.itemstring:find("helmet") then
armor_type = "helmet"
end
if not armor_type then
return
end
if not self.armor_list then
self.armor_list={helmet="",chestplate="",boots="",leggings=""}
elseif self.armor_list[armor_type] and self.armor_list[armor_type] ~= "" then
return
end
self.armor_list[armor_type]=ItemStack(l.itemstring):get_name()
o:remove()
end
if self.pick_up then
for k,v in pairs(self.pick_up) do
if not player_near(p) and self.on_pick_up and l.itemstring:find(v) then
local r = self.on_pick_up(self,l)
if r and r.is_empty and not r:is_empty() then
l.itemstring = r:to_string()
elseif r and r.is_empty and r:is_empty() then
o:remove()
end
end
end
end
end
end
end
end

View File

@ -0,0 +1,11 @@
# textdomain: mcl_mobs
Peaceful mode active! No monsters will spawn.=ピースフルモード有効! モンスターは出現しません。
This allows you to place a single mob.=これにより、1体のMOBを配置できます。
Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=MOBを出現させたい場所に、置くだけです。スニークキーを押しながら配置しない限り、動物は飼いならされた状態でスポーンします。MOBスポナーに設置すると、スポーンするMOBが変わります。
You need the “maphack” privilege to change the mob spawner.=MOBスポナーを変更するには、"maphack"権限が必要です。
Name Tag=名札
A name tag is an item to name a mob.=名札は、MOBに名前をつけるためのアイテムです。
Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=名札を使用する前に、金床で名前の設定をする必要があります。その後、MOBに名前をつけるために名札が使えます。これで名札は使い切ります。
Only peaceful mobs allowed!=平和的なMOBのみ許可
Give names to mobs=MOBに名前を付与
Set name at anvil=金床で名前の設定

View File

@ -1,4 +1,5 @@
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
local mob_class = mcl_mobs.mob_class
-- lib_mount by Blert2112 (edited by TenPlus1)
local enable_crash = false
@ -385,7 +386,6 @@ function mcl_mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
entity.v2 = v
end
-- directional flying routine by D00Med (edited by TenPlus1)
function mcl_mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim)
@ -446,3 +446,18 @@ function mcl_mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_an
mcl_mobs:set_animation(entity, moving_anim)
end
end
mcl_mobs.mob_class.drive = mcl_mobs.drive
mcl_mobs.mob_class.fly = mcl_mobs.fly
mcl_mobs.mob_class.attach = mcl_mobs.attach
function mob_class:on_detach_child(child)
if self.detach_child then
if self.detach_child(self, child) then
return
end
end
if self.driver == child then
self.driver = nil
end
end

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,444 @@
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
local mob_class = mcl_mobs.mob_class
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 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)
end
end
function output_table (wp)
if not wp then return end
mcl_log("wp items: ".. tostring(#wp))
for a,b in pairs(wp) do
mcl_log(a.. ": ".. tostring(b))
end
end
function append_paths (wp1, wp2)
--mcl_log("Start append")
if not wp1 or not wp2 then
mcl_log("Cannot append wp's")
return
end
output_table(wp1)
output_table(wp2)
for _,a in pairs (wp2) do
table.insert(wp1, a)
end
--mcl_log("End append")
end
local function output_enriched (wp_out)
mcl_log("Output enriched path")
local i = 0
for _,outy in pairs (wp_out) do
i = i + 1
mcl_log("Pos ".. i ..":" .. minetest.pos_to_string(outy["pos"]))
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"])
end
end
-- This function will take a list of paths, and enrich it with:
-- a var for failed attempts
-- 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 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", 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 = "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)
else
cur_pos_to_add = cur_pos
--mcl_log ("Pos doesn't match")
end
wp_out[i] = {}
wp_out[i]["pos"] = cur_pos_to_add
wp_out[i]["failed_attempts"] = 0
wp_out[i]["action"] = action
--wp_out[i] = {"pos" = cur_pos, "failed_attempts" = 0, "action" = action}
--output_pos(cur_pos, i)
end
output_enriched(wp_out)
return wp_out
end
function mob_class:ready_to_path()
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
mcl_log("We are ready to pathfind, no previous fail or we are past threshold")
return true
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, 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 pos_closest_to_door = nil
local other_side_of_door = nil
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)
other_side_of_door = vector.add(cur_door_pos,-v)
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,150,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,150,1,4)
if wp_otherside_door_to_target and #wp_otherside_door_to_target > 0 then
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
else
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("Cannot path to this air block next to door.")
end
end
end
else
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
function mob_class:gopath(target,callback_arrived)
if self.state == PATHFINDING then mcl_log("Already pathfinding, don't set another until done.") return end
if not self:ready_to_path() then return end
self.order = nil
local p = self.object:get_pos()
local t = vector.offset(target,0,1,0)
--Check direct route
local wp = minetest.find_path(p,t,150,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()
-- If cannot path, don't immediately try again
end
if wp and #wp > 0 then
--output_table(wp)
self._target = t
self.callback_arrived = callback_arrived
local current_location = table.remove(wp,1)
if current_location and current_location["pos"] then
mcl_log("Removing first co-ord? " .. tostring(current_location["pos"]))
else
mcl_log("Nil pos")
end
self.current_target = current_location
self.waypoints = wp
self.state = PATHFINDING
return true
else
self.state = "walk"
self.waypoints = nil
self.current_target = nil
-- minetest.log("no path found")
end
end
function mob_class:interact_with_door(action, target)
local p = self.object:get_pos()
--local t = minetest.get_timeofday()
--local dd = minetest.find_nodes_in_area(vector.offset(p,-1,-1,-1),vector.offset(p,1,1,1),{"group:door"})
--for _,d in pairs(dd) do
if target then
mcl_log("Door target is: ".. minetest.pos_to_string(target))
local n = minetest.get_node(target)
if n.name:find("_b_") or n.name:find("_t_") then
mcl_log("Door")
local def = minetest.registered_nodes[n.name]
local closed = n.name:find("_b_1") or n.name:find("_t_1")
--if self.state == PATHFINDING then
if closed and action == "open" and def.on_rightclick then
mcl_log("Open door")
def.on_rightclick(target,n,self)
end
if not closed and action == "close" and def.on_rightclick then
mcl_log("Close door")
def.on_rightclick(target,n,self)
end
--else
else
mcl_log("Not door")
end
else
mcl_log("no target. cannot try and open or close door")
end
--end
end
function mob_class:do_pathfind_action(action)
if action then
mcl_log("Action present")
local type = action["type"]
local action_val = action["action"]
local target = action["target"]
if target then
mcl_log("Target: ".. minetest.pos_to_string(target))
end
if type and type == "door" then
mcl_log("Type is door")
self:interact_with_door(action_val, target)
end
end
end
function mob_class:check_gowp(dtime)
local p = self.object:get_pos()
-- no destination
if not p or not self._target then
mcl_log("p: ".. tostring(p))
mcl_log("self._target: ".. tostring(self._target))
return
end
-- 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 < 1.8 then
mcl_log("Arrived at _target")
self.waypoints = nil
self._target = nil
self.current_target = nil
self.state = "stand"
self.order = "stand"
self.object:set_velocity({x = 0, y = 0, z = 0})
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
local distance_to_current_target = 50
if self.current_target and self.current_target["pos"] then
distance_to_current_target = vector.distance(p,self.current_target["pos"])
end
-- 0.6 is working but too sensitive. sends villager back too frequently. 0.7 is quite good, but not with heights
-- 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 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"]
mcl_log("There after " .. failed_attempts .. " failed attempts. current target:".. minetest.pos_to_string(self.current_target["pos"]) .. ". Distance: " .. distance_to_current_target)
self.current_target = table.remove(self.waypoints, 1)
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 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 >= 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
self.waypoints = nil
self._target = nil
self._pf_last_failed = os.time()
self.object:set_velocity({x = 0, y = 0, z = 0})
self.object:set_acceleration({x = 0, y = 0, z = 0})
return
end
--mcl_log("Not at pos with failed attempts ".. failed_attempts ..": ".. minetest.pos_to_string(p) .. "self.current_target: ".. minetest.pos_to_string(self.current_target["pos"]) .. ". Distance: ".. distance_to_current_target)
self:go_to_pos(self.current_target["pos"])
-- Do i just delete current_target, and return so we can find final path.
else
-- Not at target, no current waypoints or current_target. Through the door and should be able to path to target.
-- 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")
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,150,1,4)
if final_wp then
mcl_log("We can get to target here.")
-- self.waypoints = final_wp
self:go_to_pos(self._target)
else
-- Abandon route?
mcl_log("Cannot plot final route to target")
end
end
-- I don't think we need the following anymore, but test first.
-- Maybe just need something to path to target if no waypoints left
if self.current_target and self.current_target["pos"] and (self.waypoints and #self.waypoints == 0) then
local updated_p = self.object:get_pos()
local distance_to_cur_targ = vector.distance(updated_p,self.current_target["pos"])
mcl_log("Distance to current target: ".. tostring(distance_to_cur_targ))
mcl_log("Current p: ".. minetest.pos_to_string(updated_p))
-- 1.6 is good. is 1.9 better? It could fail less, but will it path to door when it isn't after door
if distance_to_cur_targ > 1.9 then
mcl_log("not close to current target: ".. minetest.pos_to_string(self.current_target["pos"]))
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

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,7 @@
--lua locals
local minetest,vector,math,table = minetest,vector,math,table
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
local mob_class = mcl_mobs.mob_class
local get_node = minetest.get_node
local get_item_group = minetest.get_item_group
local get_node_light = minetest.get_node_light
@ -29,6 +31,7 @@ local dbg_spawn_succ = 0
local dbg_spawn_counts = {}
-- range for mob count
local aoc_range = 136
local remove_far = true
local mob_cap = {
monster = tonumber(minetest.settings:get("mcl_mob_cap_monster")) or 70,
@ -166,6 +169,8 @@ local list_of_all_biomes = {
"MushroomIslandShore",
"JungleM_shore",
"Jungle_shore",
"BambooJungleM_shore",
"BambooJungle_shore",
"MangroveSwamp_shore",
-- dimension biome:
@ -213,6 +218,10 @@ local list_of_all_biomes = {
"JungleEdge",
"SavannaM",
"MangroveSwamp",
"BambooJungle",
"BambooJungleEdge",
"BambooJungleEdgeM",
"BambooJungleM",
}
-- count how many mobs are in an area
@ -241,6 +250,24 @@ local function count_mobs_total(mob_type)
return num
end
local function count_mobs_all()
local mobs_found = {}
local num = 0
for _,entity in pairs(minetest.luaentities) do
if entity.is_mob then
local mob_type = entity.type -- animal / monster / npc
local mob_name = entity.name
if mobs_found[mob_name] then
mobs_found[mob_name] = mobs_found[mob_name] + 1
else
mobs_found[mob_name] = 1
end
num = num + 1
end
end
return mobs_found, num
end
local function count_mobs_total_cap(mob_type)
local num = 0
for _,l in pairs(minetest.luaentities) do
@ -399,11 +426,9 @@ local two_pi = 2 * math.pi
local function get_next_mob_spawn_pos(pos)
local distance = math_random(25, 32)
local angle = math_random() * two_pi
return {
x = math_round(pos.x + distance * math_cos(angle)),
y = pos.y,
z = math_round(pos.z + distance * math_sin(angle))
}
local xoff = math_round(distance * math_cos(angle))
local yoff = math_round(distance * math_sin(angle))
return vector.offset(pos, xoff, 0, yoff)
end
local function decypher_limits(posy)
@ -556,7 +581,7 @@ local S = minetest.get_translator("mcl_mobs")
minetest.register_chatcommand("spawn_mob",{
privs = { debug = true },
description=S("spawn_mob is a chatcommand that allows you to type in the name of a mob without 'typing mobs_mc:' all the time like so; 'spawn_mob spider'. however, there is more you can do with this special command, currently you can edit any number, boolian, and string variable you choose with this format: spawn_mob 'any_mob:var<mobs_variable=variable_value>:'. any_mob being your mob of choice, mobs_variable being the variable, and variable value being the value of the chosen variable. and example of this format: \n spawn_mob skeleton:var<passive=true>:\n this would spawn a skeleton that wouldn't attack you. REMEMBER-THIS> when changing a number value always prefix it with 'NUM', example: \n spawn_mob skeleton:var<jump_height=NUM10>:\n this setting the skelly's jump height to 10. if you want to make multiple changes to a mob, you can, example: \n spawn_mob skeleton:var<passive=true>::var<jump_height=NUM10>::var<fly_in=air>::var<fly=true>:\n etc."),
description=S("spawn_mob is a chatcommand that allows you to type in the name of a mob without 'typing mobs_mc:' all the time like so; 'spawn_mob spider'. however, there is more you can do with this special command, currently you can edit any number, boolean, and string variable you choose with this format: spawn_mob 'any_mob:var<mobs_variable=variable_value>:'. any_mob being your mob of choice, mobs_variable being the variable, and variable value being the value of the chosen variable. and example of this format: \n spawn_mob skeleton:var<passive=true>:\n this would spawn a skeleton that wouldn't attack you. REMEMBER-THIS> when changing a number value always prefix it with 'NUM', example: \n spawn_mob skeleton:var<jump_height=NUM10>:\n this setting the skelly's jump height to 10. if you want to make multiple changes to a mob, you can, example: \n spawn_mob skeleton:var<passive=true>::var<jump_height=NUM10>::var<fly_in=air>::var<fly=true>:\n etc."),
func = function(n,param)
local pos = minetest.get_player_by_name(n):get_pos()
@ -576,15 +601,14 @@ minetest.register_chatcommand("spawn_mob",{
local mob = mcl_mobs.spawn(pos,mobname)
for c=1, #modifiers do
modifs = modifiers[c]
if mob then
for c=1, #modifiers do
modifs = modifiers[c]
local mod1 = string.find(modifs, ":")
local mod_start = string.find(modifs, "<")
local mod_vals = string.find(modifs, "=")
local mod_end = string.find(modifs, ">")
local mod_end = string.find(modifs, ">")
if mob then
local mod1 = string.find(modifs, ":")
local mod_start = string.find(modifs, "<")
local mod_vals = string.find(modifs, "=")
local mod_end = string.find(modifs, ">")
local mob_entity = mob:get_luaentity()
if string.sub(modifs, mod1+1, mod1+3) == "var" then
if mod1 and mod_start and mod_vals and mod_end then
@ -615,14 +639,12 @@ minetest.register_chatcommand("spawn_mob",{
minetest.log("warning", n.." couldn't modify "..mobname.." at "..minetest.pos_to_string(pos).. ", missing modification type")
end
end
end
if mob then
return true, mobname.." spawned at "..minetest.pos_to_string(pos),
minetest.log("action", n.." spawned "..mobname.." at "..minetest.pos_to_string(pos))
return true, mobname.." spawned at "..minetest.pos_to_string(pos)
else
return false, "Couldn't spawn "..mobname
end
return false, "Couldn't spawn "..mobname
end
})
@ -630,6 +652,9 @@ if mobs_spawn then
local perlin_noise
-- Get pos to spawn, x and z are randomised, y is range
local function spawn_a_mob(pos, dimension, y_min, y_max)
--create a disconnected clone of the spawn dictionary
--prevents memory leak
@ -661,34 +686,36 @@ if mobs_spawn then
end
local mob_def = mob_library_worker_table[mob_index]
--minetest.log(mob_def.name.." "..step_chance.. " "..mob_chance)
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)))
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)))
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
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)
--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))
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
object = mcl_mobs.spawn(spawning_position, mob_def.name)
end
object = mcl_mobs.spawn(spawning_position, mob_def.name)
end
end
current_summary_chance = current_summary_chance - mob_chance
@ -722,6 +749,32 @@ if mobs_spawn then
end)
end
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
and ((not self.nametag) or (self.nametag == ""))
and self.state ~= "attack"
and self.following == nil then
if self.despawn_immediately or self.lifetimer <= 0 then
if logging then
minetest.log("action", "[mcl_mobs] Mob "..self.name.." despawns at "..minetest.pos_to_string(pos, 1) .. " lifetimer ran out")
end
mcl_burning.extinguish(self.object)
self.object:remove()
return true
elseif self.lifetimer <= 10 then
if math.random(10) < 4 then
self.despawn_immediately = true
else
self.lifetimer = 20
end
end
end
end
minetest.register_chatcommand("mobstats",{
privs = { debug = true },
func = function(n,param)
@ -731,5 +784,18 @@ minetest.register_chatcommand("mobstats",{
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)
local mob_counts, total_mobs = count_mobs_all()
if (total_mobs) then
minetest.log("action", "Total mobs found: " .. total_mobs)
end
if mob_counts then
for k, v1 in pairs(mob_counts) do
minetest.log("action", "k: " .. tostring(k))
minetest.log("action", "v1: " .. tostring(v1))
end
end
end
})

View File

@ -0,0 +1,2 @@
# textdomain:mcl_paintings
Painting=絵画

View File

@ -58,6 +58,7 @@ This mod adds mobs which closely resemble the mobs from the game Minecraft, vers
### Peaceful mobs
* Axolotl
* Chicken
* Cow
* Pig

View File

@ -0,0 +1,181 @@
local S = minetest.get_translator(minetest.get_current_modname())
local axolotl = {
type = "animal",
spawn_class = "water",
can_despawn = true,
passive = false,
hp_min = 14,
hp_max = 14,
xp_min = 1,
xp_max = 7,
head_swivel = "head.control",
bone_eye_height = -1,
head_eye_height = -0.5,
horrizonatal_head_height = 0,
curiosity = 10,
head_yaw="z",
armor = 100,
rotate = 180,
spawn_in_group_min = 1,
spawn_in_group = 4,
tilt_swim = true,
collisionbox = {-0.5, 0.0, -0.5, 0.5, 0.8, 0.5},
visual = "mesh",
mesh = "mobs_mc_axolotl.b3d",
textures = {
{"mobs_mc_axolotl_brown.png"},
{"mobs_mc_axolotl_yellow.png"},
{"mobs_mc_axolotl_green.png"},
{"mobs_mc_axolotl_pink.png"},
{"mobs_mc_axolotl_black.png"},
{"mobs_mc_axolotl_purple.png"},
{"mobs_mc_axolotl_white.png"}
},
sounds = {
random = "mobs_mc_axolotl",
damage = "mobs_mc_axolotl_hurt",
distance = 16,
},
animation = {-- Stand: 1-20; Walk: 20-60; Swim: 61-81
stand_start = 61, stand_end = 81, stand_speed = 15,
walk_start = 61, walk_end = 81, walk_speed = 15,
run_start = 61, run_end = 81, run_speed = 20,
},
follow = {
"mcl_fishing:clownfish_raw"
},
view_range = 16,
fear_height = 4,
on_rightclick = function(self, clicker)
local bn = clicker:get_wielded_item():get_name()
if bn == "mcl_buckets:bucket_water" or bn == "mcl_buckets:bucket_river_water" then
if clicker:set_wielded_item("mcl_buckets:bucket_axolotl") then
local it = clicker:get_wielded_item()
local m = it:get_meta()
m:set_string("properties",minetest.serialize(self.object:get_properties()))
clicker:set_wielded_item(it)
self.object:remove()
end
awards.unlock(clicker:get_player_name(), "mcl:cutestPredator")
return
end
if self:feed_tame(clicker, 1, true, false) then return end
end,
makes_footstep_sound = false,
fly = true,
fly_in = { "mcl_core:water_source", "mclx_core:river_water_source" },
breathes_in_water = true,
jump = true,
damage = 2,
reach = 2,
attack_type = "dogfight",
attack_animals = true,
specific_attack = {
"extra_mobs_cod",
"mobs_mc:sheep",
"extra_mobs_glow_squid",
"extra_mobs_salmon",
"extra_mobs_tropical_fish",
"mobs_mc_squid"
},
runaway = true,
}
mcl_mobs.register_mob("mobs_mc:axolotl", axolotl)
local water = 0
mcl_mobs:spawn_specific(
"mobs_mc:axolotl",
"overworld",
"water",
{
"Swampland",
"MushroomIsland",
"RoofedForest",
"FlowerForest_beach",
"Forest_beach",
"StoneBeach",
"Taiga_beach",
"Savanna_beach",
"Plains_beach",
"ExtremeHills_beach",
"Swampland_shore",
"MushroomIslandShore",
"JungleM_shore",
"Jungle_shore",
"RoofedForest_ocean",
"JungleEdgeM_ocean",
"BirchForestM_ocean",
"BirchForest_ocean",
"IcePlains_deep_ocean",
"Jungle_deep_ocean",
"Savanna_ocean",
"MesaPlateauF_ocean",
"SunflowerPlains_ocean",
"Swampland_ocean",
"ExtremeHillsM_ocean",
"Mesa_ocean",
"StoneBeach_ocean",
"Plains_ocean",
"MesaPlateauFM_ocean",
"MushroomIsland_ocean",
"MegaTaiga_ocean",
"StoneBeach_deep_ocean",
"SavannaM_ocean",
"ExtremeHills_ocean",
"Forest_ocean",
"JungleEdge_ocean",
"MesaBryce_ocean",
"MegaSpruceTaiga_ocean",
"ExtremeHills+_ocean",
"Jungle_ocean",
"FlowerForest_ocean",
"Desert_ocean",
"Taiga_ocean",
"JungleM_ocean",
"FlowerForest_underground",
"JungleEdge_underground",
"StoneBeach_underground",
"MesaBryce_underground",
"Mesa_underground",
"RoofedForest_underground",
"Jungle_underground",
"Swampland_underground",
"MushroomIsland_underground",
"BirchForest_underground",
"Plains_underground",
"MesaPlateauF_underground",
"ExtremeHills_underground",
"MegaSpruceTaiga_underground",
"BirchForestM_underground",
"SavannaM_underground",
"MesaPlateauFM_underground",
"Desert_underground",
"Savanna_underground",
"Forest_underground",
"SunflowerPlains_underground",
"MegaTaiga_underground",
"Taiga_underground",
"ExtremeHills+_underground",
"JungleM_underground",
"ExtremeHillsM_underground",
"JungleEdgeM_underground",
"LushCaves",
},
0,
minetest.LIGHT_MAX+1,
30,
4000,
3,
water-16,
water+1)
-- spawn eggs
mcl_mobs.register_egg("mobs_mc:axolotl", S("Axolotl"), "#e890bf", "#b83D7e", 0)

View File

@ -2,7 +2,7 @@
local S = minetest.get_translator("mobs_mc")
mcl_mobs:register_mob("mobs_mc:bat", {
mcl_mobs.register_mob("mobs_mc:bat", {
description = S("Bat"),
type = "animal",
spawn_class = "ambient",
@ -144,4 +144,4 @@ mobs_mc.water_level-1)
-- spawn eggs
mcl_mobs:register_egg("mobs_mc:bat", S("Bat"), "#4c3e30", "#0f0f0f", 0)
mcl_mobs.register_egg("mobs_mc:bat", S("Bat"), "#4c3e30", "#0f0f0f", 0)

View File

@ -12,7 +12,7 @@ local mod_target = minetest.get_modpath("mcl_target")
--###################
mcl_mobs:register_mob("mobs_mc:blaze", {
mcl_mobs.register_mob("mobs_mc:blaze", {
description = S("Blaze"),
type = "monster",
spawn_class = "hostile",
@ -153,7 +153,7 @@ mcl_vars.mg_nether_min,
mcl_vars.mg_nether_max)
-- Blaze fireball
mcl_mobs:register_arrow("mobs_mc:blaze_fireball", {
mcl_mobs.register_arrow("mobs_mc:blaze_fireball", {
visual = "sprite",
visual_size = {x = 0.3, y = 0.3},
textures = {"mcl_fire_fire_charge.png"},
@ -208,4 +208,4 @@ mcl_mobs:register_arrow("mobs_mc:blaze_fireball", {
})
-- spawn eggs
mcl_mobs:register_egg("mobs_mc:blaze", S("Blaze"), "#f6b201", "#fff87e", 0)
mcl_mobs.register_egg("mobs_mc:blaze", S("Blaze"), "#f6b201", "#fff87e", 0)

View File

@ -8,17 +8,17 @@ local S = minetest.get_translator("mobs_mc")
mcl_mobs:register_mob("mobs_mc:chicken", {
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,
@ -83,7 +83,7 @@ mcl_mobs:register_mob("mobs_mc:chicken", {
fear_height = 4,
on_rightclick = function(self, clicker)
if mcl_mobs:feed_tame(self, clicker, 1, true, false) then return end
if self:feed_tame(clicker, 1, true, false) then return end
if mcl_mobs:protect(self, clicker) then return end
if mcl_mobs:capture_mob(self, clicker, 0, 60, 5, false, nil) then return end
end,
@ -163,4 +163,4 @@ mobs_mc.water_level,
mcl_vars.mg_overworld_max)
-- spawn eggs
mcl_mobs:register_egg("mobs_mc:chicken", S("Chicken"), "#a1a1a1", "#ff0000", 0)
mcl_mobs.register_egg("mobs_mc:chicken", S("Chicken"), "#a1a1a1", "#ff0000", 0)

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