Compare commits

...

449 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
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
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
505 changed files with 11081 additions and 2904 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,8 +35,8 @@
* SumianVoice
* MrRar
* talamh
* Faerraven
* AncientMariner
* Faerraven / Michieal
* FossFanatic
## Contributors
* Laurent Rocher
@ -95,6 +96,9 @@
* anarquimico
* TheOnlyJoeEnderman
* Ranko Saotome
* Gregor Parzefall
* Wbjitscool
* b3nderman
## MineClone5
* kay27
@ -146,11 +150,13 @@
* jordan4ibanez
* paramat
* cora
* Faerraven / Michieal
## 3D Models
* 22i
* tobyplowy
* epCode
* Faerraven / Michieal
## Textures
* XSSheep
@ -165,6 +171,7 @@
* RandomLegoBrick
* cora
* Faerraven / Michieal
* Nicu
## Translations
* Wuzzy
@ -178,9 +185,12 @@
* Emojigit
* snowyu
* 3raven
* SakuraRiu
## Funders
* 40W
* bauknecht
* Cora
## Special thanks
* celeron55 for creating Minetest
@ -188,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.82 (in development)
### Gameplay
You start in a randomly-generated world made entirely of cubes. You can explore
the world and dig and build almost every block in the world to create new
@ -158,7 +156,7 @@ The following features are incomplete:
* Some monsters and animals
* Redstone-related things
* Special minecarts
* Some special minecarts (hopper and chest minecarts work)
* A couple of non-trivial blocks and items
Bonus features (not found in Minecraft):

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,3 +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

@ -102,6 +102,7 @@ function check_events(dtime)
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
@ -110,11 +111,14 @@ function check_events(dtime)
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

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=スニークで降りる

View File

@ -2,8 +2,6 @@ local mob_class = mcl_mobs.mob_class
local mob_class_meta = {__index = mcl_mobs.mob_class}
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
-- API for Mobs Redo: MineClone 2 Edition (MRM)
local MAX_MOB_NAME_LENGTH = 30
local DEFAULT_FALL_SPEED = -9.81*1.5
local PATHFINDING = "gowp"
@ -17,21 +15,9 @@ local function mcl_log (message)
end
end
-- Invisibility mod check
mcl_mobs.invis = {}
-- localize math functions
local atann = math.atan
local function atan(x)
if not x or x ~= x then
return 0
else
return atann(x)
end
end
local remove_far = true
local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false
local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false
@ -297,51 +283,65 @@ function mob_class:mob_activate(staticdata, def, dtime)
end
end
-- execute current state (stand, walk, run, attacks)
-- returns true if mob has died
function mob_class:do_states(dtime)
--if self.can_open_doors then check_doors(self) end
if self.state == "stand" then
self:do_states_stand()
elseif self.state == PATHFINDING then
self:check_gowp(dtime)
elseif self.state == "walk" then
self:do_states_walk()
elseif self.state == "runaway" then
-- runaway when punched
self:do_states_runaway()
elseif self.state == "attack" then
-- attack routines (explode, dogfight, shoot, dogshoot)
if self:do_states_attack(dtime) then
return true
end
end
end
local function update_timers (self, dtime)
-- knockback timer. set in on_punch
if self.pause_timer > 0 then
self.pause_timer = self.pause_timer - dtime
return true
end
-- attack timer
self.timer = self.timer + dtime
if self.state ~= "attack" and self.state ~= PATHFINDING then
if self.timer < 1 then
return true
end
self.timer = 0
end
-- never go over 100
if self.timer > 100 then
self.timer = 1
end
end
-- main mob function
function mob_class:on_step(dtime)
self.lifetimer = self.lifetimer - dtime
local pos = self.object:get_pos()
if not pos then return end
if self:check_despawn(pos) then return true end
local d = 0.85
if self:check_dying() then d = 0.92 end
local v = self.object:get_velocity()
if v then
--diffuse object velocity
self.object:set_velocity({x = v.x*d, y = v.y, z = v.z*d})
end
if self:check_despawn(pos, dtime) then return true end
self:slow_mob()
if self:falling(pos) then return end
self:check_suspend()
self:check_water_flow()
local yaw = 0
if self:is_at_water_danger() and self.state ~= "attack" then
if math.random(1, 10) <= 6 then
self:set_velocity(0)
self.state = "stand"
self:set_animation( "stand")
yaw = yaw + math.random(-0.5, 0.5)
yaw = self:set_yaw( yaw, 8)
end
else
if self.move_in_group ~= false then
self:check_herd(dtime)
end
end
if self:is_at_cliff_or_danger() then
self:set_velocity(0)
self.state = "stand"
self:set_animation( "stand")
local yaw = self.object:get_yaw() or 0
yaw = self:set_yaw( yaw + 0.78, 8)
end
self:env_danger_movement_checks (dtime)
if not self.fire_resistant then
mcl_burning.tick(self.object, dtime, self)
@ -353,21 +353,17 @@ function mob_class:on_step(dtime)
if self.state == "die" then return end
if self.jump_sound_cooloff > 0 then
self.jump_sound_cooloff = self.jump_sound_cooloff - dtime
end
if self.opinion_sound_cooloff > 0 then
self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime
end
self:follow_flop() -- Mob following code.
--Mob following code.
self:follow_flop()
--set animation speed relitive to velocity
self:set_animation_speed()
self:set_animation_speed() -- set animation speed relitive to velocity
self:check_smooth_rotation(dtime)
self:check_head_swivel(dtime)
if self.jump_sound_cooloff > 0 then
self.jump_sound_cooloff = self.jump_sound_cooloff - dtime
end
self:do_jump()
self:set_armor_texture()
self:check_runaway_from()
@ -378,63 +374,26 @@ function mob_class:on_step(dtime)
-- run custom function (defined in mob lua file)
if self.do_custom then
-- when false skip going any further
if self.do_custom(self, dtime) == false then
return
end
end
-- knockback timer
if self.pause_timer > 0 then
if update_timers(self, dtime) then return end
self.pause_timer = self.pause_timer - dtime
return
end
-- attack timer
self.timer = self.timer + dtime
if self.state ~= "attack" and self.state ~= PATHFINDING then
if self.timer < 1 then
return
end
self.timer = 0
end
self:check_particlespawners(dtime)
self:check_item_pickup()
-- never go over 100
if self.timer > 100 then
self.timer = 1
if self.opinion_sound_cooloff > 0 then
self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime
end
-- mob plays random sound at times
-- mob plays random sound at times. Should be 120. Zombie and mob farms are ridiculous
if math.random(1, 70) == 1 then
self:mob_sound("random", true)
end
-- environmental damage timer (every 1 second)
self.env_damage_timer = self.env_damage_timer + dtime
if (self.state == "attack" and self.env_damage_timer > 1)
or self.state ~= "attack" then
self:check_entity_cramming()
self.env_damage_timer = 0
-- check for environmental damage (water, fire, lava etc.)
if self:do_env_damage() then
return
end
-- node replace check (cow eats grass etc.)
self:replace(pos)
end
if self:do_states(dtime) then
return
end
if self:env_damage (dtime, pos) then return end
if self:do_states(dtime) then return end
if not self.object:get_luaentity() then
return false

View File

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

View File

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

View File

@ -116,6 +116,7 @@ function mob_class:mob_sound(soundname, is_opinion, fixed_pitch)
-- randomize the pitch a bit
pitch = pitch + math.random(-10, 10) * 0.005
end
-- Should be 0.1 to 0.2 for mobs. Cow and zombie farms loud. At least have cool down.
minetest.sound_play(sound, {
object = self.object,
gain = 1.0,
@ -279,30 +280,55 @@ local function dir_to_pitch(dir)
return -math.atan2(-dir.y, xz)
end
function mob_class:check_head_swivel(dtime)
if not self.head_swivel or type(self.head_swivel) ~= "string" then return end
local final_rotation = vector.new(0,0,0)
local oldp,oldr = self.object:get_bone_position(self.head_swivel)
local function who_are_you_looking_at (self)
local pos = self.object:get_pos()
for _, obj in pairs(minetest.get_objects_inside_radius(pos, 10)) do
if obj:is_player() and not self.attack or obj:get_luaentity() and obj:get_luaentity().name == self.name and self ~= obj:get_luaentity() then
if not self._locked_object then
if math.random(5000/self.curiosity) == 1 or vector.distance(pos,obj:get_pos())<4 and obj:is_player() then
self._locked_object = obj
end
else
if math.random(10000/self.curiosity) == 1 then
self._locked_object = nil
end
end
end
end
local stop_look_at_player_chance = math.random(833/self.curiosity)
-- was 10000 - div by 12 for avg entities as outside loop
local stop_look_at_player = stop_look_at_player_chance == 1
if self.attack or self.following then
self._locked_object = self.attack or self.following
elseif self._locked_object then
if stop_look_at_player then
--minetest.log("Stop look: ".. self.name)
self._locked_object = nil
end
elseif not self._locked_object then
if math.random(1, 30) then
--minetest.log("Change look check: ".. self.name)
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
@ -317,6 +343,7 @@ function mob_class:check_head_swivel(dtime)
if self.object:get_attach() then
self_rot = self.object:get_attach():get_rotation()
end
if self.rot then
local player_pos = self._locked_object:get_pos()
local direction_player = vector.direction(vector.add(self.object:get_pos(), vector.new(0, self.head_eye_height*.7, 0)), vector.add(player_pos, vector.new(0, _locked_object_eye_height, 0)))
@ -345,7 +372,7 @@ function mob_class:check_head_swivel(dtime)
elseif not self._locked_object and math.abs(oldr.y) > 3 and math.abs(oldr.x) < 3 then
final_rotation = vector.multiply(oldr, 0.9)
else
final_rotation = vector.new(0,0,0)
--final_rotation = vector.new(0,0,0)
end
mcl_util.set_bone_position(self.object,self.head_swivel, vector.new(0,self.bone_eye_height,self.horrizonatal_head_height), final_rotation)

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

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

View File

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

View File

@ -5,8 +5,7 @@ local ENTITY_CRAMMING_MAX = 24
local CRAMMING_DAMAGE = 3
local DEATH_DELAY = 0.5
local DEFAULT_FALL_SPEED = -9.81*1.5
local FLOP_HEIGHT = 6
local FLOP_HOR_SPEED = 1.5
local PATHFINDING = "gowp"
local mobs_debug = minetest.settings:get_bool("mobs_debug", false)
local mobs_drop_items = minetest.settings:get_bool("mobs_drop_items") ~= false
@ -183,6 +182,17 @@ function mob_class:collision()
return({x,z})
end
function mob_class:slow_mob()
local d = 0.85
if self:check_dying() then d = 0.92 end
local v = self.object:get_velocity()
if v then
--diffuse object velocity
self.object:set_velocity({x = v.x*d, y = v.y, z = v.z*d})
end
end
-- move mob in facing direction
function mob_class:set_velocity(v)
local c_x, c_y = 0, 0
@ -354,7 +364,7 @@ function mob_class:set_yaw(yaw, delay, dtime)
if self.shaking and dtime then
yaw = yaw + (math.random() * 2 - 1) * 5 * dtime
end
self:update_roll()
--self:update_roll()
return yaw
end
@ -778,6 +788,25 @@ function mob_class:do_env_damage()
return self:check_for_death("", {type = "unknown"})
end
function mob_class:env_damage (dtime, pos)
-- environmental damage timer (every 1 second)
self.env_damage_timer = self.env_damage_timer + dtime
if (self.state == "attack" and self.env_damage_timer > 1)
or self.state ~= "attack" then
self:check_entity_cramming()
self.env_damage_timer = 0
-- check for environmental damage (water, fire, lava etc.)
if self:do_env_damage() then
return true
end
-- node replace check (cow eats grass etc.)
self:replace(pos)
end
end
function mob_class:damage_mob(reason,damage)
if not self.health then return end
damage = math.floor(damage)

View File

@ -169,6 +169,8 @@ local list_of_all_biomes = {
"MushroomIslandShore",
"JungleM_shore",
"Jungle_shore",
"BambooJungleM_shore",
"BambooJungle_shore",
"MangroveSwamp_shore",
-- dimension biome:
@ -216,6 +218,10 @@ local list_of_all_biomes = {
"JungleEdge",
"SavannaM",
"MangroveSwamp",
"BambooJungle",
"BambooJungleEdge",
"BambooJungleEdgeM",
"BambooJungleM",
}
-- count how many mobs are in an area
@ -244,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
@ -402,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)
@ -559,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()
@ -579,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
@ -618,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
})
@ -633,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
@ -727,7 +749,9 @@ if mobs_spawn then
end)
end
function mob_class:check_despawn(pos)
function mob_class:check_despawn(pos, dtime)
self.lifetimer = self.lifetimer - dtime
-- Despawning: when lifetimer expires, remove mob
if remove_far
and self.can_despawn == true
@ -760,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

@ -65,7 +65,7 @@ local axolotl = {
awards.unlock(clicker:get_player_name(), "mcl:cutestPredator")
return
end
if mcl_mobs:feed_tame(self, clicker, 1, true, false) then return end
if self:feed_tame(clicker, 1, true, false) then return end
end,
makes_footstep_sound = false,
fly = true,

View File

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

View File

@ -64,7 +64,7 @@ local cod = {
chance = 1,
min = 1,
max = 1,},
{name = "mcl_dye:white",
{name = "mcl_bone_meal:bone_meal",
chance = 20,
min = 1,
max = 1,},

View File

@ -7,12 +7,13 @@ local cow_def = {
type = "animal",
spawn_class = "passive",
passive = true,
runaway = true,
hp_min = 10,
hp_max = 10,
xp_min = 1,
xp_max = 3,
collisionbox = {-0.45, -0.01, -0.45, 0.45, 1.39, 0.45},
spawn_in_group = 8,
spawn_in_group = 4,
spawn_in_group_min = 3,
visual = "mesh",
mesh = "mobs_mc_cow.b3d",
@ -40,7 +41,6 @@ local cow_def = {
max = 2,
looting = "common",},
},
runaway = true,
sounds = {
random = "mobs_mc_cow",
damage = "mobs_mc_cow_hurt",

View File

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

View File

@ -0,0 +1,70 @@
# textdomain: mobs_mc
Agent=エージェント
Axolotl=ウーパールーパー
Bat=コウモリ
Blaze=ブレイズ
Chicken=ニワトリ
Cow=ウシ
Mooshroom=ムーシュルーム
Creeper=クリーパー
Ender Dragon=エンダードラゴン
Enderman=エンダーマン
Endermite=エンダーマイト
Ghast=ガスト
Elder Guardian=エルダーガーディアン
Guardian=ガーディアン
Horse=ウマ
Skeleton Horse=スケルトンホース
Zombie Horse=ゾンビホース
Donkey=ロバ
Mule=ラバ
Iron Golem=アイアンゴーレム
Llama=ラマ
Ocelot=ヤマネコ
Parrot=オウム
Pig=ブタ
Polar Bear=シロクマ
Rabbit=ウサギ
Killer Bunny=殺人ウサギ
Sheep=ヒツジ
Shulker=シュルカー
Silverfish=シルバーフィッシュ
Skeleton=スケルトン
Stray=ストレイ
Wither Skeleton=ウィザースケルトン
Magma Cube=マグマキューブ
Slime=スライム
Snow Golem=スノーゴーレム
Spider=クモ
Cave Spider=洞窟グモ
Squid=イカ
Vex=ヴェックス
Evoker=エヴォーカー
Illusioner=イリュージョナー
Villager=村人
Vindicator=ヴィンディケーター
Zombie Villager=村人ゾンビ
Witch=魔女
Wither=ウィザー
Wolf=オオカミ
Husk=ハスク
Zombie=ゾンビ
Zombie Pigman=ゾンビピッグマン
Farmer=農民
Fisherman=漁師
Fletcher=矢師
Shepherd=羊飼い
Librarian=司書
Cartographer=製図家
Armorer=防具鍛冶
Leatherworker=革職人
Butcher=肉屋
Weapon Smith=武器鍛冶
Tool Smith=道具鍛冶
Cleric=聖職者
Nitwit=求職者
Cod=タラ
Salmon=サケ
Dolphin=イルカ
Pillager=ピリジャー
Tropical fish=クマノミ

View File

@ -2,4 +2,4 @@ name = mobs_mc
author = maikerumine
description = Adds Minecraft-like monsters and animals.
depends = mcl_init, mcl_particles, mcl_mobs, mcl_wip, mcl_core, mcl_util
optional_depends = default, mcl_tnt, mcl_bows, mcl_throwing, mcl_fishing, bones, mesecons_materials, mobs_mc_gameconfig, doc_items
optional_depends = default, mcl_tnt, mcl_bows, mcl_throwing, mcl_fishing, bones, mesecons_materials, doc_items

View File

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

View File

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

View File

@ -42,7 +42,7 @@ local salmon = {
chance = 1,
min = 1,
max = 1,},
{name = "mcl_dye:white",
{name = "mcl_bone_meal:bone_meal",
chance = 20,
min = 1,
max = 1,},

View File

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

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