Compare commits

...

972 Commits

Author SHA1 Message Date
df6cd27cce Merge branch 'master' into kulmapaikka 2022-12-07 19:35:39 +02:00
AFCMS
2b46dd60c5 Merge pull request 'Fix right click on copper crash' (#3076) from bugfix/fix_copper_right_click into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/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: https://git.minetest.land/MineClone2/MineClone2/pulls/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: https://git.minetest.land/MineClone2/MineClone2/pulls/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: https://git.minetest.land/MineClone2/MineClone2/pulls/3033
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
2022-12-06 13:48:26 +00:00
Johannes Fritz
7c87ed2d6c Add rightclick support to pplates 2022-12-05 14:25:11 -06:00
Johannes Fritz
d8c16b1f31 Add 1 sec deactivation delay to pplates 2022-12-05 14:25:10 -06:00
Johannes Fritz
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: https://git.minetest.land/MineClone2/MineClone2/pulls/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: https://git.minetest.land/MineClone2/MineClone2/pulls/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: https://git.minetest.land/MineClone2/MineClone2/pulls/3042
Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
2022-12-04 17:20:29 +00:00
AFCMS
18cfb88ae5 Replace lighting rod nodebox by 3d model 2022-12-04 11:13:36 -06:00
chmodsayshello
826b9fcc45 Merge pull request 'Add Recovery Compasses' (#3049) from recovery_compass into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3049
Reviewed-by: AFCMS <afcm.contact@gmail.com>
2022-12-02 20:57:15 +00:00
chmodsayshello
7dacfe2cba make recovery compass spin randomly in other dimensions 2022-12-02 18:52:31 +01:00
chmodsayshello
7d57e73ae4 fix recovery compass overwriting every other item 2022-12-02 15:43:08 +01:00
chmodsayshello
7f59611914 add crafting recipie 2022-12-02 15:40:18 +01:00
chmodsayshello
927fd60786 translation stuff 2022-12-01 21:20:39 +01:00
chmodsayshello
ab031daa5a recovery compass 2022-12-01 21:13:41 +01:00
cora
588425df73 Merge pull request 'Fix twisted vines breaking block when growing' (#3037) from fix_tvines_breaking into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3037
2022-11-29 11:23:21 +00:00
cora
25d0f2b0c4 Fix twisted vines breaking block when growing 2022-11-29 12:21:33 +01:00
cora
85e7de6c14 Merge pull request 'Sweetberry, nethervines: Fix placing in protected area' (#3038) from fix_sweet_berry_protection into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3038
2022-11-29 11:21:14 +00:00
cora
d395c82183 Fix bonemeal creative for sweet berries and nether vines 2022-11-29 12:20:39 +01:00
cora
34a558ced9 Sweetberry, nethervines: Fix placing in protected area 2022-11-29 12:20:39 +01:00
cora
17f789550d Merge pull request 'Fix creeper crash (wrong self ref)' (#3044) from fix_creeper_crash into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3044
2022-11-29 02:42:12 +00:00
cora
9508cd4c25 Fix creeper crash 2022-11-29 03:28:19 +01:00
cora
c4808beef4 Merge pull request 'Mobs fixes' (#3032) from mobs_cleanup into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3032
2022-11-28 03:26:53 +00:00
cora
69c64a2c24 Fix wrong self ref with mcl_mobs.spawn_child 2022-11-28 03:26:51 +01:00
cora
318da7e3c9 Fix local go_to_pos call 2022-11-28 03:26:51 +01:00
cora
5e022ef083 Merge pull request 'Epic hamburger fight PR' (#2959) from mcl_hamburger into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2959
2022-11-28 02:06:48 +00:00
Michieal
c45e4d292a Added in Author Info to the conf file. 2022-11-28 03:03:42 +01:00
Michieal
a542503b72 Delete '.idea/vcs.xml' 2022-11-28 03:03:42 +01:00
Michieal
4b570b1aa9 Delete '.idea/modules.xml' 2022-11-28 03:03:42 +01:00
Michieal
cc190eeb62 Delete '.idea/misc.xml' 2022-11-28 03:03:42 +01:00
Michieal
7e31ece325 Delete '.idea/MineClone2-mcl_hamburger.iml'
.
2022-11-28 03:03:42 +01:00
Michieal
b783e616df Delete '.idea/.gitignore'
.
2022-11-28 03:03:42 +01:00
Michieal
f1ae86ede5 Add in the Translation files for the base languages. 2022-11-28 03:03:42 +01:00
Michieal
c63533c753 Updated the readme.txt to reflect the changes. 2022-11-28 03:03:42 +01:00
Michieal
81fa7cf74c Removed outdated translate files.
made new translation template.
Changed _alt image.
Updated the readme.txt to reflect the changes.

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

Added comments.
2022-11-28 03:03:42 +01:00
cora
ce95f034b4 Add setting to turn hamburgers on and off 2022-11-28 03:03:39 +01:00
Michieal
2b3ec8d944 remove .idea files 2022-11-28 03:02:51 +01:00
Michieal
972e9ea0f8 Fix initial commit. 2022-11-28 03:02:51 +01:00
Michieal
df62a3aac1 Initial code comit 2022-11-28 03:02:51 +01:00
cora
7cc25c4670 Merge pull request 'grand mcl_mobs cleanup part 1' (#2925) from mobs_cleanup into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2925
2022-11-27 13:57:35 +00:00
cora
ebf214c043 Check if spawndef exists when spawning 2022-11-27 14:53:17 +01:00
cora
7bd0b5a9b1 Some more missing arg fixes 2022-11-27 14:53:16 +01:00
cora
bc496a8682 Finally indent register_mob and make registered mobs global 2022-11-27 14:53:16 +01:00
cora
a3415647d4 Fix do_jump call in combat.lua 2022-11-27 14:53:16 +01:00
cora
4909ef6ff7 Restructure on_step a bit 2022-11-27 14:53:16 +01:00
cora
3c6d79ecb3 Add entity name to debug box 2022-11-27 14:53:16 +01:00
cora
6948b77226 move debug/nametag code back to api.lua 2022-11-27 14:53:16 +01:00
cora
90321ee578 Fix leftover local do_attack call 2022-11-27 14:53:16 +01:00
cora
2b691dea07 Fix some more global var warnings 2022-11-27 14:53:16 +01:00
cora
c25287e493 Some cleanup 2022-11-27 14:53:16 +01:00
epCode
762f64a4d1 Fix mob rotation glitching out near 0/360 in degrees
The problem mainly was that the set_yaw function was not allowing for negitive values.
2022-11-27 14:53:16 +01:00
cora
db63f1c453 fix leftover pi shortcut 2022-11-27 14:53:16 +01:00
cora
faa38ffab8 Fix some warnings 2022-11-27 14:53:16 +01:00
cora
19d6d43b39 move on_blast default to mob default def 2022-11-27 14:53:16 +01:00
cora
28b6fcf289 Move detach_child to mount.lua 2022-11-27 14:53:16 +01:00
cora
80490b4c11 Move smooth rotation to separate function 2022-11-27 14:53:16 +01:00
cora
5e177c61f6 Move on_step despawning to separate function 2022-11-27 14:53:16 +01:00
cora
c9c2b874be move relative animation speed to separate function 2022-11-27 14:53:16 +01:00
cora
18c415f6a0 put head swivel in separate function 2022-11-27 14:53:16 +01:00
cora
49670d1d28 put water flow code in separate function 2022-11-27 14:53:16 +01:00
cora
a25cd921f2 move do_states to movement.lua 2022-11-27 14:53:16 +01:00
cora
91b5b6266c move stray particle spawner func to effects 2022-11-27 14:53:16 +01:00
cora
148b30694f Fix monster_attack and some other settings issues 2022-11-27 14:53:16 +01:00
cora
f4374d9efd Fix item drops 2022-11-27 14:53:16 +01:00
cora
b41d6a1cae Fix mob_punch 2022-11-27 14:53:16 +01:00
cora
6548b7fe47 move stray pathfinding funcs to pathfinding file 2022-11-27 14:53:16 +01:00
cora
c7681af53e Move registration functions to init.lua 2022-11-27 14:53:16 +01:00
cora
cc77e109f5 Split off general movement functions 2022-11-27 14:53:16 +01:00
cora
e7d9ded9ab Split off combat funcs 2022-11-27 14:53:16 +01:00
cora
96d697c5cd Split off pathfinding, use metatables 2022-11-27 14:53:16 +01:00
cora
01abfea16d Split off item management 2022-11-27 14:53:16 +01:00
cora
bbba7cee41 Add compat for old "wrong" : notation 2022-11-27 14:53:16 +01:00
cora
e82c318f0c Split off breeding 2022-11-27 14:53:16 +01:00
cora
70834d0f5d make register functions use the . notation 2022-11-27 14:53:16 +01:00
cora
d62dbcb852 effects -> separate file + metatable 2022-11-27 14:53:16 +01:00
cora
67fd8c8b40 split off physics functions into separate file + use metatable 2022-11-27 14:53:16 +01:00
cora
90639ef99d remove unused functions 2022-11-27 14:53:16 +01:00
cora
31ef791cfd Add proper metatable to mobs 2022-11-27 14:53:16 +01:00
cora
4d5104ff8f Merge pull request 'Add disallowed mapgen setting for v6' (#3021) from disable_v6_mapgen into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3021
2022-11-27 13:52:45 +00:00
cora
b7962b067f Add disallowed mapgen setting for v6 2022-11-27 14:50:58 +01:00
cora
19dc86c951 Merge pull request 'Cocoa Pods Cleanup' (#2974) from FossFanatic/MineClone2:cocoa_pod_fixes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2974
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-27 13:49:24 +00:00
cora
e3ee224532 Merge pull request 'version -> 0.82.0 (indev)' (#3030) from release_0.81.0 into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3030
2022-11-27 13:36:22 +00:00
cora
c209bff157 version -> 0.82.0 (indev) 2022-11-27 14:35:54 +01:00
cora
59a7608dfc Merge pull request 'Release 0.81.0' (#2952) from release_0.81.0 into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2952
2022-11-27 12:59:28 +00:00
cora
8b08707e3f Add Faerraven to texture credits 2022-11-27 04:54:30 +01:00
cora
dd8f64e039 Add Ranko Saotome to credits 2022-11-27 04:40:14 +01:00
cora
56519c881e Set version to 0.81 2022-11-27 04:40:14 +01:00
cora
944d53111a Update credits 2022-11-27 04:40:14 +01:00
PrairieWind
33c3007709 Merge pull request 'Final fixes for 0.81' (#3027) from final_fixes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3027
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-11-27 03:38:14 +00:00
PrairieWind
8d5aea9743 Fix New Button Names 2022-11-27 03:36:38 +00:00
cora
fa2a2bb8ac Remove mcl_copper screenshot 2022-11-27 03:36:38 +00:00
cora
ee808e8f84 optimize excessively large mcl_shield_hud.png texture 2022-11-27 03:36:38 +00:00
cora
53d11ec71b Add new wood types buttons 2022-11-27 03:36:38 +00:00
cora
f1aca79f9c Merge pull request 'Player location using mcl_info' (#3022) from mcl_info_player_coords into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3022
2022-11-27 03:33:48 +00:00
cora
fb8b3d5f55 Cleanup mcl_info clutter and messy var localization 2022-11-27 04:31:24 +01:00
Michieal
8184d4938c Modify init.lua to allow normal player usage.
Changes made:
* Put in new chatcommand /whereami to allow normal players to turn on / off player location coords without needing special privs.
* Made Debug Coords level 2, Player Location level 1, and Off level 0. (Allows turning the location off.)
* Put in nil value check into get_text, to prevent errors caused by definitions accidentally not returning a value.
* Cached pairs, ipairs, and table because the code is called every 0.63 seconds, and it made sense to do so. (Hopefully, will help
  to mitigate the added load on framerate.)
2022-11-27 04:31:24 +01:00
Michieal
da64a10403 mcl_info: Add player coords field to debug hud 2022-11-27 04:31:24 +01:00
cora
2a54ea6e74 mcl_info: Allow debug field that's visible for everyone 2022-11-27 04:31:24 +01:00
PrairieWind
8b7b2f02e9 Merge pull request 'Fish buckets save and restore object properties in item entity' (#3013) from fish_bucket_save into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3013
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-11-27 03:10:11 +00:00
cora
927eff691c Fix node on_rightclick with fishbucket 2022-11-27 04:02:34 +01:00
cora
efdd22d69f Fix fishbuckets placing water in the nether 2022-11-27 00:17:13 +01:00
cora
f14bfdc0cd Clear item meta when turning fishbucket to empty bucket
before it simply set a different itemstring, now it creates a
whole new itemstack
2022-11-26 22:18:46 +01:00
cora
66322a873b Fix infinite fishbucket placement in survival/creative 2022-11-26 22:18:46 +01:00
cora
e134cc5e65 make it possible to place fishbucket in flowing riverwater 2022-11-26 22:18:46 +01:00
cora
1fcedd1375 Fix fishbucket _on_dispense 2022-11-26 22:18:46 +01:00
cora
bb73e5f1cd Make it possible to pick up fish with river water bucket 2022-11-26 22:18:46 +01:00
cora
d4c2501d62 Axolotl cleanup, remove clutter 2022-11-26 22:18:46 +01:00
cora
708fcfb368 Axolotl: remove cod-inherited swarming code 2022-11-26 22:18:46 +01:00
cora
ebf4678e54 mcl_buckets whitespace fixes 2022-11-26 22:18:46 +01:00
cora
b4971b298d Move fish bucket code to separate file 2022-11-26 22:18:46 +01:00
cora
d3349396b4 Save tropical fish properties in item meta on bucket pickup 2022-11-26 22:18:46 +01:00
cora
665e8a06a2 Save axolotl properties in item meta on bucket pickup 2022-11-26 22:18:46 +01:00
cora
67e8f13a96 Axolotl whitespace fixes 2022-11-26 22:18:46 +01:00
cora
99db678a44 Fish buckets set properties from bucket item meta 2022-11-26 22:18:46 +01:00
cora
dd58bed5d1 refactor fish bucket code to not use bucket api
it was clearly not made for this
2022-11-26 22:18:46 +01:00
cora
9cf910c47f Merge pull request 'Event api, Raids, Zombie sieges' (#2833) from events into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2833
Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
2022-11-26 21:12:46 +00:00
cora
69f5bad0bb Document mcl_events 2022-11-26 17:06:04 +01:00
cora
ac7038e7a5 Raids/raidcaptain: Nil check cmi_cause
apparently is nil sometimes
2022-11-26 17:06:04 +01:00
cora
3b368fdd5a Fix wrong var name for mob table 2022-11-26 17:06:04 +01:00
cora
624092ddd3 Search the area before giving up when no mobs in table left
otherwise it will advance stages prematurely
2022-11-26 17:06:04 +01:00
cora
dabc09adb2 Lower and unify distance check 2022-11-26 17:06:04 +01:00
cora
d0ea7c4059 Set events metatable correctly 2022-11-26 17:06:04 +01:00
cora
87d5cdc439 Make raid end firework last a bit longer 2022-11-26 17:06:04 +01:00
cora
c6fc388597 Add _harmless option for rocket arrows
so event fireworks dont grief things
2022-11-26 17:06:04 +01:00
cora
93e5034317 Add fireworks when raid complete 2022-11-26 17:06:04 +01:00
cora
8564a12398 Nerf vex summoning so evoker doesnt spawn infinite vexes 2022-11-26 17:06:04 +01:00
cora
e5515ed119 Add debug field: active event counter
to verify it doesn't memleak
2022-11-26 17:06:04 +01:00
cora
94057aa7e5 Code cleanup 2022-11-26 17:06:04 +01:00
cora
db4f9ec5a3 Fix raid instawin when no spawnable blocks found 2022-11-26 17:06:04 +01:00
cora
057a78ed30 Fix raid registering as completed when unloading the area 2022-11-26 17:06:04 +01:00
cora
22fa5096c9 Add debug command status feedback 2022-11-26 17:06:04 +01:00
cora
2147790b44 Add setting to disable events 2022-11-26 17:06:04 +01:00
PrairieWind
a1e21b44c8 Add code to unlock Voluntary Exile advancement 2022-11-26 17:06:04 +01:00
cora
358250012f Remove banner when not attached 2022-11-26 17:06:04 +01:00
cora
608da950e4 Abort events when no player is near 2022-11-26 17:06:04 +01:00
cora
c3455de604 Clear bad omen when raid complete 2022-11-26 17:06:04 +01:00
cora
6251c623dd Give player bad omen effect when killing captain 2022-11-26 17:06:04 +01:00
cora
62fe08de59 Make illagers pick up ominous banners and promote themselves to captain 2022-11-26 17:06:04 +01:00
cora
af0c718538 Add natural raidcaptain spawning 2022-11-26 17:06:04 +01:00
cora
3600bc8066 Spawn raidcaptain in raids 2022-11-26 17:06:04 +01:00
cora
d1788b5643 Add actual banner pattern, drop banner on death 2022-11-26 17:06:04 +01:00
cora
c7cc9ccb3e Add raid captain spawn func with banner attach 2022-11-26 17:06:04 +01:00
cora
097ee8b4d4 Z sieges happen in 10% of the nights 2022-11-26 17:06:04 +01:00
cora
59d384020e Finx spawn positions in 16-radius 2022-11-26 17:06:04 +01:00
cora
1d18482103 Comment out excessive logging 2022-11-26 17:06:04 +01:00
cora
b82912f30d Add zombie sieges 2022-11-26 17:06:04 +01:00
PrairieWind
48a8511052 Make bossbars enablable/disablable per event type. Update some capitalization. 2022-11-26 17:06:04 +01:00
PrairieWind
160d7ca6fa Add Voluntary Exile Advancement 2022-11-26 17:06:04 +01:00
cora
ae90cbe3ef Set raiders on path to village after spawn 2022-11-26 17:06:04 +01:00
cora
9893dee1aa Add debug chatcommand to start events 2022-11-26 17:06:04 +01:00
cora
232f57c247 Add hero of the village achievement 2022-11-26 17:06:04 +01:00
cora
dc017864fd raids: properly integrate potions api
supports "level" now, bad omen > 1 means extra wave additionally
the playername is saved in the event object now for later access
and events can be made exclusive to a certain radius now.
2022-11-26 17:06:04 +01:00
cora
2159edba05 Remove dependency on mcl_potions 2022-11-26 17:06:04 +01:00
cora
37144f8787 Check for actual raid conditions and positions 2022-11-26 17:06:04 +01:00
cora
7ab2c5fecd Make debug output an opt-in setting 2022-11-26 17:06:04 +01:00
cora
99fce095ef fix closure style function declarations
its BANNED in CONTRIB.md
2022-11-26 17:06:04 +01:00
cora
390aec5d7a Integrate raids with mcl_events 2022-11-26 17:06:04 +01:00
cora
052e76bfcc start at effective stage 1 2022-11-26 17:06:04 +01:00
cora
f17a9220bb Add bossbar support 2022-11-26 17:06:04 +01:00
cora
627ce0dc3b Finish at max_stage not max_stage + 1 2022-11-26 17:06:04 +01:00
cora
f06d5a1ee3 Add event api
prototype state, test with chatcommand /infest (debug priv)
2022-11-26 17:06:03 +01:00
PrairieWind
5dc1a3d456 Village Finder Tweaks 2022-11-26 17:06:03 +01:00
PrairieWind
1b6d778dd1 Add Village Checks 2022-11-26 17:06:03 +01:00
PrairieWind
96ac31bec3 Add Bad Omen Effect 2022-11-26 17:06:03 +01:00
PrairieAstronomer
8b6409b7f1 Add mcl_raids 2022-11-26 17:06:03 +01:00
cora
6e6f163b71 Merge pull request 'Fix pressure plates getting pressed by new chest size' (#3019) from pressureplates_chest_fix into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3019
2022-11-26 16:03:53 +00:00
cora
ba7da6a885 Fix pressure plates being pressed by new chest size
this fixes the problem for chests, with paintings it would need to
go down considerably ( .65 was the value i determined)
2022-11-26 16:52:19 +01:00
cora
3066d966a1 Add the missing wood types pressure plates 2022-11-26 16:52:19 +01:00
cora
626f61c2c1 Merge pull request 'Nether Plank Fixes' (#3023) from FossFanatic/MineClone2:nether_plank_fixes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3023
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-26 12:58:21 +00:00
FossFanatic
f71759f184 Fix crimson & warped planks 2022-11-26 11:54:34 +00:00
cora
0942949c5d Merge pull request 'Fix axolotl breeding' (#3007) from Axolotl into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3007
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-25 02:48:55 +00:00
cora
b255c8c23e Merge pull request 'Fix Baby Striders being extra small' (#3010) from baby_strider_size_fix into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3010
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-24 22:31:14 +00:00
PrairieWind
e1ba319616 Fix Baby Striders being extra small 2022-11-24 14:46:54 -07:00
Johannes Fritz
88897566d9 Fix axolotl breeding 2022-11-24 09:10:17 -06:00
PrairieWind
4cc0a5b0f1 Merge pull request 'Remove tools/remove_end.py' (#3000) from remove_remove_end into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3000
Reviewed-by: AFCMS <afcm.contact@gmail.com>
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-11-23 17:08:18 +00:00
cora
ab0f88ad37 Remove remove_end.py 2022-11-23 09:49:32 +01:00
cora
53c1ed9fbf Merge pull request 'Axolotl' (#2870) from TheOnlyJoeEnderman/MineClone2:Axolotl into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2870
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-23 03:18:36 +00:00
cora
a3fbb2e0c9 Merge pull request 'Grass Block Underside Fix' (#2987) from FossFanatic/MineClone2:grass_block_underside_fix into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2987
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-21 10:34:12 +00:00
cora
22063a64db Merge pull request 'update .gitignore' (#2994) from gitignore_update into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2994
2022-11-21 02:29:56 +00:00
Michieal
9fc27da873 update .gitignore
Preventing .idea directories from being uploaded to the branches. 
Makes it easier for devs that use IntelliJ's IDEA. (at least 2 developers here currently use it)
2022-11-21 02:05:27 +00:00
PrairieWind
556316ae34 Merge pull request 'Make waterlogged roots more water looking' (#2992) from waterlogged_roots_visual_update into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2992
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-11-20 19:28:28 +00:00
Michieal
9ffdd13fa5 Make waterlogged roots more water looking
A quick change to the setting within the wlroots definition that makes the water translucent.
It's not perfect, but I think it looks better blended than opaque.
2022-11-20 19:16:39 +00:00
PrairieWind
9cfbbef41d Merge pull request 'Fix lightning boat crash' (#2990) from fix_lightning_boat_crash into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2990
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-11-20 19:12:38 +00:00
cora
adfbf4bc64 Fix lightning boat crash 2022-11-20 02:54:42 +01:00
FossFanatic
1a5aed704c Fix underside of grass block 2022-11-19 11:28:31 +00:00
cora
d738eb0554 Merge pull request 'Updated colors.txt' (#2986) from Ranko_Saotome/MineClone2:master into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2986
2022-11-19 01:24:55 +00:00
Ranko_Saotome
0fb6d20bc7 Updated colors.txt 2022-11-19 01:11:40 +00:00
cora
94e7520b08 Merge pull request 'mcl_tnt fixes' (#2937) from mcl-tnt-fixes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2937
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-19 00:28:04 +00:00
AFCMS
029769f48f Fixes to mcl_tnt
- reorder code
- fix potential crashes with not handeled nil values
- use new vectors
2022-11-19 01:27:32 +01:00
cora
0fb040476b Merge pull request 'mcl_enchanting: Add missing dependency on mcl_experience.' (#2984) from missing-dep-ench-xp into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2984
2022-11-18 20:35:51 +00:00
Daniel Cassidy
79192d51ed mcl_enchanting: Add missing dependency on mcl_experience. 2022-11-18 21:30:50 +01:00
cora
6051731645 Merge pull request 'Respawn Anchor Top Animation' (#2981) from FossFanatic/MineClone2:respawn_anchor_animation into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2981
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-18 13:47:53 +00:00
FossFanatic
dec2c2bade Merge branch 'master' into cocoa_pod_fixes 2022-11-18 08:27:19 +00:00
FossFanatic
e25415e047 Merge branch 'master' into respawn_anchor_animation 2022-11-18 08:24:57 +00:00
FossFanatic
f93af56bf6 Remove MineCraft derivative texture 2022-11-18 08:16:53 +00:00
FossFanatic
f8b98d784b Add animated top texture 2022-11-18 08:12:16 +00:00
FossFanatic
e898b72f3d Add animated top texture 2022-11-18 08:11:39 +00:00
cora
90bd0ee315 Merge pull request 'signs_crafting_fix' (#2980) from signs_crafting_fix into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2980
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-17 23:52:44 +00:00
cora
7d63b07e09 Fix mangrove sign registrations 2022-11-18 00:51:45 +01:00
Michieal
197e807684 Fix the crafting recipes for the signs.
Placed in the proper place. Ugh.
2022-11-18 00:51:45 +01:00
Michieal
467700591b revert 62fb34a029a78e74a4b768a30827961329719551
revert Fix the crafting recipes for the signs.
2022-11-18 00:51:45 +01:00
Michieal
a7e643818f Fix the crafting recipes for the signs. 2022-11-18 00:51:45 +01:00
cora
cf282a5154 Merge pull request 'Make Raw Copper (Block) smeltable in the blast furnace' (#2978) from blast_f_smelt_copper into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2978
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-17 23:39:35 +00:00
PrairieWind
1877f7261e Make Raw Copper (Block) smeltable in the blast furnace 2022-11-18 00:33:17 +01:00
cora
adeb6c42e5 Merge pull request 'Make kelp cookable in the smoker' (#2979) from anarquimico/MineClone2:kelp_smoker into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2979
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-17 23:30:21 +00:00
anarquimico
e658e29179 Make kelp cookable by smoker. 2022-11-17 20:16:58 -03:00
PrairieWind
7e3cb59863 Merge pull request 'Base mcl_skins templates off old PP skins' (#2977) from old_pp_skins into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2977
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-11-17 21:53:45 +00:00
Johannes Fritz
a6db44b71f Base mcl_skins templates off old PP skins 2022-11-17 21:52:35 +00:00
PrairieWind
eaccd71558 Merge pull request 'Sweet berries: Add rightclick harvesting' (#2971) from sweet_berries into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2971
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-11-17 19:48:30 +00:00
cora
142f3d6d5a Handle bonemealing in the sweetberry on_rightclick 2022-11-17 19:42:02 +00:00
cora
328a377940 export apply_bone_meal function in mcl_dye
this is essentially just a hack to not put any more sweetberry code
in mcl_dye because the architecture makes it necessary for mcl_dye
to depend on mcl_farming, not the other way around - hence all the
plant bonemealing is done in mcl_dye...
2022-11-17 19:42:02 +00:00
cora
c5ec3c770c Sweet berries: Add rightclick harvesting 2022-11-17 19:42:02 +00:00
cora
5a9d428151 Merge pull request 'Hoppers pulling from chest minecart' (#2954) from anarquimico/MineClone2:hoppers_mc_chest into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2954
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-17 05:38:39 +00:00
cora
883ca05c3a Merge pull request 'Add missing EndBarrens biome definition' (#2970) from endbarrens into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2970
2022-11-17 05:33:44 +00:00
cora
dea647129e Add missing EndBarrens biome definition 2022-11-17 06:32:38 +01:00
cora
35e30df552 Merge pull request 'Make Steve hair unlike MC' (#2963) from steve_hair into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2963
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-17 05:31:40 +00:00
Johannes Fritz
d764c3eac3 Make Steve hair unlike MC 2022-11-17 05:30:55 +00:00
cora
f397ff83ff Merge pull request 'Honey and Beehives' (#2911) from honey into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2911
Reviewed-by: MysticTempest <mystictempest@noreply.git.minetest.land>
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-17 02:28:11 +00:00
PrairieWind
89a342a34f Add Bee Nest Tree Schematics and generation 2022-11-17 03:16:45 +01:00
PrairieWind
b17dcf26da Make beehives transparent and not launch entities, thanks MysticTempest! 2022-11-17 03:16:45 +01:00
PrairieWind
c767c617f8 Add waxing copper blocks 2022-11-17 03:16:45 +01:00
PrairieWind
fb651a4922 Wax On and Wax Off Advancements 2022-11-17 03:16:45 +01:00
PrairieWind
16f878d3dc Make Honey Blocks Sticky
Uses slime block stickiness code.
2022-11-17 03:16:45 +01:00
PrairieWind
bbb908239b Total Beelocation Advancement 2022-11-17 03:16:45 +01:00
PrairieWind
0aaaa05164 Bee Our Guest Advancement 2022-11-17 03:16:45 +01:00
PrairieWind
8a3c1eaa6e Add harvest and digging damage, and campfire usage
Damage is temporary until bees are implemented
2022-11-17 03:16:45 +01:00
PrairieWind
a79692a68b Add harvesting functionality to bee nests
Still has temporary abm updating
2022-11-17 03:16:45 +01:00
PrairieWind
cb60338f10 Add basic functionality to beehives
Uses a temporary ABM to progress through honey levels
2022-11-17 03:16:45 +01:00
PrairieWind
89b02c126a Add basic beehives and bee nests
Still need to add functionality
2022-11-17 03:16:45 +01:00
PrairieWind
db0b44326b Add crafting recipe item replacements 2022-11-17 03:16:45 +01:00
PrairieWind
4bb824cd38 Add mcl_honey mod.conf file along with translation templates 2022-11-17 03:16:45 +01:00
PrairieWind
daf5bf90a4 Add Honey, Honeycomb, and respective blocks 2022-11-17 03:16:45 +01:00
cora
d5b5d80a1a Merge pull request 'fix frames and signs to reset after /clearobjects' (#2919) from fix_clearobjs_signs_frames into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2919
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-17 02:09:00 +00:00
Michieal
9dc27e535b revert 020a9510cbd7adf7419c166af5c2baba7c96cf45
revert "This has the achievement in there."

The only difference is the placement of a single comment, not worth a full on commit.
2022-11-17 02:55:14 +01:00
Michieal
439ac600fd This has the achievement in there. 2022-11-17 02:55:14 +01:00
Michieal
bee40c55ec Fix KillAura bug destroying the Displayed Item. 2022-11-17 02:55:14 +01:00
Michieal
2577a70a65 Made displayed entities immortal
Added in extended placement. 
Registered the Achievement "Glow and Behold!"
2022-11-17 02:55:14 +01:00
Michieal
e2e86ae9a8 Final commit
Add in the ability to place frames on surfaces. Has minor visual bugs. Should be modified to disallow placing on top of items to prevent visual bugging.

Signed-off-by: Michieal <michieal@noreply.git.minetest.land>
2022-11-17 02:55:14 +01:00
Michieal
577f9f7785 Change Frames to only use the timer if it's displaying an object. 2022-11-17 02:55:14 +01:00
Michieal
67296c7a37 Update Signs API to only use timer functions when there is text to display. 2022-11-17 02:55:14 +01:00
Michieal
4a1e37d9c6 fix typo that somehow propagated. 2022-11-17 02:55:14 +01:00
Michieal
e67c6e1ada fix signs to reset after /clearobjects
Additionally, added in the register_hanging_sing_craft() for future use.
2022-11-17 02:55:14 +01:00
Michieal
10a3a022b6 fix frames to reset after /clearobjects 2022-11-17 02:55:14 +01:00
Michieal
b2660e8c63 fix signs to reset after /clearobjects
Also, added in register_hanging_sign_craft() for future use.
2022-11-17 02:55:14 +01:00
Michieal
c93f66295b fix frames to reset after /clearobjects 2022-11-17 02:55:14 +01:00
cora
4dba6a62cf Merge pull request 'Allow villagers to resettle and not run back to job and and old bed' (#2967) from feature/villager_pt_6 into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2967
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-17 01:52:52 +00:00
cora
a28f667b20 Villagers only summon golems when monsters are near 2022-11-17 02:26:51 +01:00
ancientmarinerdev
1a670bc41b Allow villagers to resettle and not run back to job and and old bed 2022-11-17 02:26:51 +01:00
cora
cdf28ec684 Merge pull request 'Fix the Pumpkin/Melon grass position.' (#2973) from gourd_fix into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2973
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-17 01:24:36 +00:00
Michieal
99a7df7ce6 Fix the Pumpkin/Melon grass position.
Also, updated the license.
2022-11-17 02:16:59 +01:00
𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟
7630b1ca00 Merge pull request 'Fix crash when trying to place meshhand' (#2934) from fix_meshnode_crash into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2934
Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
2022-11-16 18:33:24 +00:00
cora
eeecc52ff8 Fix crash when trying to place meshhand 2022-11-16 12:23:39 -06:00
cora
661424ad23 Merge pull request 'better water visuals' (#2960) from better_visuals_water into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2960
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-16 16:14:38 +00:00
FossFanatic
9b392fcefc Upload files to 'mods/ITEMS/mcl_cocoas/models' 2022-11-16 13:44:35 +00:00
FossFanatic
d091d634bb Delete 'mods/ITEMS/mcl_cocoas/models/emptyfile' 2022-11-16 13:44:23 +00:00
FossFanatic
16746f962f Upload files to 'mods/ITEMS/mcl_cocoas/models' 2022-11-16 13:44:15 +00:00
FossFanatic
00c596c126 Add 'mods/ITEMS/mcl_cocoas/models/emptyfile' 2022-11-16 13:43:40 +00:00
FossFanatic
993d7b6873 Delete 'mods/ITEMS/mcl_cocoas/models' 2022-11-16 13:43:23 +00:00
FossFanatic
ceff91e2c3 Add 'mods/ITEMS/mcl_cocoas/models/' 2022-11-16 13:43:11 +00:00
FossFanatic
6bfcd9b1ea Delete 'mods/ITEMS/mcl_cocoas/models/emptyfile' 2022-11-16 13:42:49 +00:00
FossFanatic
6b826b45e1 Add 'mods/ITEMS/mcl_cocoas/models/emptyfile' 2022-11-16 13:42:36 +00:00
FossFanatic
3de1f9e4d6 Delete 'mods/ITEMS/mcl_cocoas/mcl_cocoas_cocoa_stage_2.obj' 2022-11-16 13:39:41 +00:00
FossFanatic
348434adf1 Delete 'mods/ITEMS/mcl_cocoas/mcl_cocoas_cocoa_stage_1.obj' 2022-11-16 13:39:36 +00:00
FossFanatic
6946573e65 Delete 'mods/ITEMS/mcl_cocoas/mcl_cocoas_cocoa_stage_0.obj' 2022-11-16 13:39:32 +00:00
FossFanatic
862d6a9e3e Upload files to 'mods/ITEMS/mcl_cocoas' 2022-11-16 13:39:19 +00:00
FossFanatic
78d45d23c2 change the code 2022-11-16 13:38:44 +00:00
FossFanatic
b11d65cc82 Update cocoa textures 2022-11-16 13:35:01 +00:00
FossFanatic
f4f57a9fe6 Delete 'mods/ITEMS/mcl_cocoas/textures/mcl_cocoas_cocoa_top_stage_2.png' 2022-11-16 13:33:42 +00:00
TheOnlyJoeEnderman
9e73c2cd46 Remove spaces on line 70 (71)
Actually delete the spaces this time.
2022-11-16 08:00:35 +00:00
TheOnlyJoeEnderman
50e6dd94b2 Code cleaning
Remove outdated comment. Fix spaces on lines 40, 67, 70.
2022-11-16 07:58:07 +00:00
epCode
7ed8370eb0 localize var/fix weather not changing brightness while underwater. 2022-11-15 22:36:06 +00:00
epCode
3f8f6f8e44 deeper-darker image 2022-11-15 22:36:05 +00:00
epCode
a5eb1d240e add deeper = darker 2022-11-15 22:36:05 +00:00
epCode
ce724ee926 make sky color change when submerged 2022-11-15 22:36:05 +00:00
PrairieWind
e0419f3568 Merge pull request 'Turn villagers to zombie villagers when killed by zombies half the time' (#2962) from villagers_to_zs into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2962
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-11-15 22:30:41 +00:00
cora
f66a241188 turn villagers to z villagers not normal zs 2022-11-15 22:20:04 +00:00
cora
80fb648447 Turn villagers to zombies half the time when killed by zombies 2022-11-15 22:20:04 +00:00
PrairieWind
4255143087 Merge pull request 'Add colors.txt file to tools/' (#2953) from add_colors_txt into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2953
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-11-15 22:16:52 +00:00
RankoSaotome
51d4f075b2 Add credits to colors.txt file 2022-11-15 22:12:27 +00:00
RankoSaotome
a607444e60 Add colors.txt for minetestmapper 2022-11-15 22:12:27 +00:00
PrairieWind
ebd38fd44e Merge pull request 'Fix crash when new player rightclicks a bed' (#2958) from fix_bed_meta_crash into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2958
Reviewed-by: ancientmarinerdev <ancientmariner_dev@proton.me>
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-11-15 22:08:42 +00:00
cora
dbef60c558 Fix crash when new player rightclicks a bed 2022-11-15 22:02:37 +00:00
PrairieWind
4e9190bbcf Merge pull request 'Fix crash when rightclicking parrot' (#2965) from fix_parrot_rightclick_crash into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2965
Reviewed-by: AFCMS <afcm.contact@gmail.com>
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-11-15 21:50:17 +00:00
cora
033b051689 Fix crash when rightclicking parrot 2022-11-15 21:16:48 +01:00
cora
589bf75e6a Merge pull request 'Fix creative mode inventory search crash' (#2956) from fix_creative_inv_search into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2956
Reviewed-by: MysticTempest <mystictempest@noreply.git.minetest.land>
2022-11-15 14:53:15 +00:00
erlehmann
94960b64d4 Fix creative mode inventory search crash
Before this patch it was possible for any user to to crash Minetest in
creative mode. This was possible because queries in the search field
were interpreted as search patterns for string.find().

A search for a single square bracket would reliably crash the server.
Also, a search for 6000 times the string “a?” would hang the server.

The solution to both bugs is to not interpret the query as a pattern.
2022-11-15 04:41:01 +01:00
anarquimico
507f14c317 Modified function and ABM 2022-11-15 00:01:28 -03:00
cora
12a31ee5ba Merge pull request 'Add ocean temple' (#2907) from ocean_temple into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2907
2022-11-15 00:35:27 +00:00
cora
63225c20e5 change schematics for gold and sponges instead of chests 2022-11-15 01:28:51 +01:00
PrairieWind
54d4a97a27 Add Ocean Temple Loot 2022-11-15 01:28:51 +01:00
cora
61b5783e73 Make temple rarer 2022-11-15 01:28:51 +01:00
cora
04cb919f2b structure-spawning: make water spawns possible 2022-11-15 01:28:51 +01:00
cora
4ceecffc8b Add ocean temple 2022-11-15 01:28:51 +01:00
cora
3c287d84d2 Merge pull request 'Fix a couple issues in mcl_structures' (#2940) from fix_struct_construct_nodes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2940
2022-11-15 00:27:35 +00:00
cora
00541cbfb8 Fix end spike wrong vector.add usage 2022-11-15 01:26:06 +01:00
cora
36a6a353a3 Fix local construct_nodes 2022-11-15 01:26:06 +01:00
cora
8fa0371c63 Merge pull request 'Fix undeclared global variable in mcl_playerplus' (#2950) from playerplus into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2950
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-15 00:22:38 +00:00
Johannes Fritz
3d6ff573e7 Fix undeclared global variable in mcl_playerplus 2022-11-14 12:40:45 -06:00
cora
b7f766e7cc Merge pull request 'Who doesn't love hopper minecarts?' (#2941) from feature/hopper_minecarts into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2941
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-14 03:25:47 +00:00
cora
489ef43458 Don't transfer whole stacks 2022-11-14 04:07:41 +01:00
ancientmarinerdev
e6d778b214 Remove WIP flag for hopper minecart 2022-11-14 04:07:41 +01:00
ancientmarinerdev
70a7fb9387 Hoppers now take from hopper minecarts 2022-11-14 04:07:41 +01:00
ancientmarinerdev
a2732b655f Code cleanup 2022-11-14 04:07:41 +01:00
ancientmarinerdev
9065170b1c Clean up hopper minecart 2022-11-14 04:07:41 +01:00
ancientmarinerdev
ce457eb351 Who doesn't love hopper minecarts? 2022-11-14 04:07:41 +01:00
cora
c21527d207 Merge pull request 'add mycelium townaura particles' (#2946) from mycelium_aura_particle into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2946
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-14 01:48:08 +00:00
epCode
c288b6ab93 make townaura more preformant 2022-11-14 02:38:02 +01:00
epCode
28f952309e add mycelium townaura particles 2022-11-14 02:38:02 +01:00
cora
55375a7476 Merge pull request 'fix all chests size with selectionbox/collisionbox' (#2944) from fix_chests into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2944
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-13 22:20:30 +00:00
epCode
080182ab15 Fix ender and shulker nodeboxes 2022-11-13 22:18:00 +00:00
epCode
6c6e21b63e fix chests 2022-11-13 22:18:00 +00:00
cora
b36b2058ab Merge pull request 'Pot nether roots and fungi' (#2945) from 3raven/MineClone2-pot:master into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2945
Reviewed-by: MysticTempest <mystictempest@noreply.git.minetest.land>
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-13 22:00:01 +00:00
3raven
d01aa36d09 Pot nether roots and fungi
Pot nether roots and fungi
2022-11-13 17:44:21 +00:00
cora
daa455c41b Merge pull request 'Integrate hoppers with composter' (#2917) from anarquimico/MineClone2:hoppers_w_composter into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2917
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-12 12:28:50 +00:00
cora
b625fba4f2 Merge branch 'master' into hoppers_w_composter 2022-11-12 12:27:49 +00:00
anarquimico
3ef8838a11 Fixed indentation. 2022-11-12 06:28:36 -03:00
cora
99b26f5e3f Merge pull request 'Villagers will now claim more than red beds. Villagers don't steal players beds.' (#2924) from feature/villagers_pt5 into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2924
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-12 01:43:55 +00:00
ancientmarinerdev
59808c5190 Fix race condition where many villagers are fighting for same job 2022-11-12 02:35:00 +01:00
ancientmarinerdev
3000a378f3 Villagers can claim any bed. Player can steal villager bed. Villager won't take player bed 2022-11-12 02:35:00 +01:00
ancientmarinerdev
3e1a475442 Logging improvements 2022-11-12 02:35:00 +01:00
ancientmarinerdev
e5c639c779 Logging improvements 2022-11-12 02:35:00 +01:00
ancientmarinerdev
ff0fea8978 Add default logger to make logging easier 2022-11-12 02:35:00 +01:00
ancientmarinerdev
814ad39c09 Villagers can now claim any type of bed. 2022-11-12 02:35:00 +01:00
cora
1dfc71c76c Merge pull request 'mcl_playerplus fixes' (#2906) from playerplus into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2906
Reviewed-by: epCode <epcode@noreply.git.minetest.land>
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-11 17:58:55 +00:00
Johannes Fritz
8ff4a94889 mcl_playerplus: Fix bows 2022-11-11 17:53:13 +00:00
Johannes Fritz
c66e184373 mcl_playerplus fixes 2022-11-11 17:53:13 +00:00
cora
8ad79fbeed Merge pull request 'Check object on mob (lightning) tranformation' (#2918) from fix_lightning_crash into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2918
2022-11-11 15:44:54 +00:00
cora
41055d5abe Check object on mob tranformation 2022-11-11 16:43:45 +01:00
cora
468b46a920 Merge pull request 'Lightning Rod Fixes' (#2838) from lightning-rod-fixes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2838
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-11 15:42:52 +00:00
AFCMS
7dbe6489be Change lighting rod activation time to 0.4 2022-11-11 16:39:19 +01:00
AFCMS
5f626cf1b0 Make lightning rods send redstone signal when struck by lighting (0.5s) 2022-11-11 16:39:19 +01:00
AFCMS
47e46efa6f Add french translation 2022-11-11 16:39:19 +01:00
AFCMS
a11948c5f3 Add new texture 2022-11-11 16:39:19 +01:00
AFCMS
cb7d5e3790 Make lightning rod texture look better 2022-11-11 16:39:19 +01:00
AFCMS
2c5d3861f6 Add locale template to mcl_lightning_rods 2022-11-11 16:39:19 +01:00
AFCMS
e56fa0d809 Lightning Rod Fixes
- give node a proper nodebox
- add better texture compatible with MC texture packs
- set use_texture_alpha = "opaque"
- fix invalid translator
- disable node placement prediction
- simplificate placement code
2022-11-11 16:39:19 +01:00
TheOnlyJoeEnderman
6a9387b752 Reverse axolotl model to fix the head look direction 2022-11-11 03:50:39 +00:00
TheOnlyJoeEnderman
cbb7a8edb0 Reverse axolotl model to fix the head look direction 2022-11-11 03:50:04 +00:00
anarquimico
cb721f37ce Fixed minor bug and removed TODO commentary 2022-11-10 21:11:32 -03:00
cora
7e1c9a86e4 Merge pull request 'Fix random-interval crash when not using luajit' (#2928) from fix_non_luajit_crash into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2928
2022-11-10 20:44:16 +00:00
cora
c44b29925a Fix random-interval crash when not using luajit 2022-11-10 01:45:42 +01:00
cora
470d7dbe39 Merge pull request 'Fix insta-digging crash when punching stairs.' (#2926) from stairs_dig_fix into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2926
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-09 13:55:15 +00:00
MysticTempest
6a0bcf9881 Fix insta-digging crash when punching stairs. 2022-11-09 04:26:41 -06:00
anarquimico
3072d44b66 Bugs fixed. 2022-11-08 19:18:35 -03:00
anarquimico
f61b072d39 Fixed compostable item comsumption. 2022-11-07 22:10:35 -03:00
cora
bbd2ac904d Merge pull request 'Better fix for creative digging drops, and fix the itemframes LBM.' (#2915) from fix_itemdrops_and_itemframes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2915
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-07 16:32:15 +00:00
TheOnlyJoeEnderman
012fe4b37e Move axolotl_bucket to buckets mod 2022-11-07 08:20:13 +00:00
TheOnlyJoeEnderman
3110f97868 Move axolotl_bucket to buckets mod 2022-11-07 08:19:44 +00:00
TheOnlyJoeEnderman
dff028595c Remove old axolotl spawn icon 2022-11-07 08:13:26 +00:00
Michieal
dd869afea0 fixed typo error
had a list inside of an extra set of {}'s
2022-11-07 01:20:03 +00:00
Michieal
c277229c1b Changed the Item Frames' LBM method.
Moved the custom lbm function call out of create_custom_frame() into init.
Changed how the custom lbm handles frames lbm regeneration.
2022-11-06 21:00:14 +00:00
anarquimico
91ef21c55b Integrate hoppers with composter 2022-11-06 17:49:32 -03:00
MysticTempest
2be75c9628 Better fix for creative digging drops, and fix the itemframes LBM. 2022-11-06 07:08:49 -06:00
TheOnlyJoeEnderman
6e328153d4 axolotls are no longer mislabelled as passive 2022-11-06 02:18:47 +00:00
TheOnlyJoeEnderman
4695707188 Fix damage value for axolotls 2022-11-06 02:14:58 +00:00
TheOnlyJoeEnderman
432e196794 code cleaning
fixed some messy tabs/spaces, removed old comments.
2022-11-06 02:05:14 +00:00
TheOnlyJoeEnderman
a592d69990 add all current underwater creatures to list of mob to kill 2022-11-06 02:00:28 +00:00
TheOnlyJoeEnderman
310237be33 Fix axolotl hitbox, clean up some comments 2022-11-06 01:47:31 +00:00
TheOnlyJoeEnderman
cf6d04c716 fix flipped UVs on gill.right
That simple
2022-11-05 22:05:31 +00:00
TheOnlyJoeEnderman
c22997db09 Add persistence, attempt to fix breeding, add random look at player event
They look away from the player randomly for some reason. I think the rotation needs to be mirrored, but I am unsure how one would do that.
2022-11-05 21:44:51 +00:00
cora
4c94bee22f Merge pull request 'Add mason profession for villagers' (#2910) from add_villager_mason into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2910
2022-11-05 02:26:10 +00:00
anarquimico
f977b1a253 Fix mason texture 2022-11-05 03:21:36 +01:00
anarquimico
ff3438f729 Add villager mason profession 2022-11-05 03:20:58 +01:00
cora
f7ac679c0f Merge pull request 'Add Missing Crafting Recipes to Warped and Crimson Doors' (#2908) from warped_crimson_doors into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2908
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-05 01:28:35 +00:00
PrairieWind
6f8d854f8a Fix texture issue and capitalization in Stripped Warped Hyphae Bark 2022-11-04 19:17:39 -06:00
PrairieWind
92723cab9f Add Crafting Recipes for the crimson and warped (trap)doors, fences, and gates 2022-11-04 19:17:39 -06:00
cora
8db3071c2d Merge pull request 'Add crimson and warped doors, trapdoors and fences' (#2901) from warped_crimson_doors into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2901
2022-11-05 00:50:24 +00:00
Nicu
8162a4af2d Add custom door and trapdoor textures for mcl_crimson 2022-11-05 01:47:35 +01:00
Nicu
30d2022b4a Optimize textures in mcl_crimson 2022-11-05 01:47:35 +01:00
cora
df216cb847 Add crimson fence and gate 2022-11-05 01:47:35 +01:00
cora
4dec3e1382 Add warped fence and gate 2022-11-05 01:47:35 +01:00
cora
43425279a3 Add crimson and warped doors and trapdoors 2022-11-05 01:47:35 +01:00
cora
faf75a3ce5 Merge pull request 'mcl_itemframes_rewrite' (#2897) from mcl_itemframes_rewrite into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2897
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-05 00:28:45 +00:00
Michieal
b62f61db10 Added in the API Doc file, and adjusted the created items' names.
Added the ":" to the front of the item creation so that it can be called from an external mod.
Put in an optional inventory and wield image parameter to add in colorized inventory / wield images.
2022-11-05 01:26:15 +01:00
Michieal
c4981d894c Removed the local cached copy of the built in TGA encoder. 2022-11-05 01:26:15 +01:00
Michieal
93913ed780 Fix accidental conversion of tabs to spaces. 2022-11-05 01:26:15 +01:00
Michieal
3409c5a220 Prereview code, but with the spaces converted to tabs.
* Cleaned up all of the code, checked to make sure that there were no erraneous debug logging.
* To enable debugging, turn it on in the api by changing the following line in item_frames_api.lua:
mcl_itemframes.DEBUG = false -- set to true to see debug output.
* Made the standard Item Frame and the new Glow Frame use the frames API. 
Added in backwards compatibility mode.
* Made frames pop out items into the world on the old frames' entities when they are a hidden / broken entity. (Part of the backwards compatibility.)

* Tested locally.

* *Converted the spaces to tabs!*

Should be fully functional and ready for review.
2022-11-05 01:26:15 +01:00
Michieal
76991fcba9 Pre-review Item frames code
* Cleaned up all of the code, checked to make sure that there were no erraneous debug logging.
* To enable debugging, turn it on in the api by changing the following line in item_frames_api.lua:
mcl_itemframes.DEBUG = false -- set to true to see debug output.
* Made the standard Item Frame and the new Glow Frame use the frames API. 
Added in backwards compatibility mode.
* Made frames pop out items into the world on the old frames' entities when they are a hidden / broken entity. (Part of the backwards compatibility.)

* Tested locally.

Should be fully functional and ready for review.
2022-11-05 01:26:14 +01:00
Michieal
61df48e46e Translations for the Item Frames. 2022-11-05 01:26:14 +01:00
Michieal
18e83e5763 Added in display item rotation
Updated the Readme. Added in the ability to rotate the displayed item with a screwdriver. Made the Screwdriver mod required, due to rotating the item being fundamental behavoir.

Finalized a few bug fixes... still have to remove the all of the forced debug code, and move the item frames and glow frames over to the new api, and do a final test.
2022-11-05 01:26:14 +01:00
Michieal
8a21b9e99c Changed detection code custom frames.
todo: figure out why the standard item frame is using the wrong item entities.
todo: fix screwdriver rotating the item displayed.
2022-11-05 01:26:14 +01:00
Michieal
6d1b1b3c74 Added a return code to load_maps
Added a return code to load_maps to check for if dynamic_add_media registers a fail.
Used by mcl_itemframes when reloading a map placed into an itemframe.
2022-11-05 01:26:14 +01:00
Michieal
1f5b92f7bf code clean up. testing & debugging custom frames.
cleaned up a LOT of duplicate code. Added in the custom frames, and a couple of calls in init.lua to begin testing custom frames out.

to do: fix the freaking maps. (It looks like it's client side that is failing, to be honest.)
2022-11-05 01:26:14 +01:00
Michieal
4d74e4d9c1 update the translation template 2022-11-05 01:26:14 +01:00
Michieal
ef504e90c1 glowframe model commit 2022-11-05 01:26:14 +01:00
Michieal
09d452667b glowframe textures commit 2022-11-05 01:26:14 +01:00
Michieal
9b37ca460e Initial code comit 2022-11-05 01:26:14 +01:00
cora
ffc5fe06ed Merge pull request 'Add second pillager outpost schematic' (#2905) from 2nd_pillager_outpost_schem into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2905
Reviewed-by: epCode <epcode@noreply.git.minetest.land>
2022-11-05 00:23:48 +00:00
cora
e146b173b3 Replace "oning" with cages 2022-11-05 01:18:03 +01:00
cora
51d34c9f3d Add second pillager outpost schematic 2022-11-05 01:18:03 +01:00
cora
0d19a66bdd Merge pull request 'Mob lightning transformation / fix on_lightning_strike api' (#2904) from mob_lighting_transforms_2 into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2904
Reviewed-by: MysticTempest <mystictempest@noreply.git.minetest.land>
2022-11-05 00:17:26 +00:00
MysticTempest
15542d4878 Fix player not getting damage from lightning 2022-11-05 01:16:27 +01:00
cora
fcba67b7e7 Make on_lightning_strike available to non-mob entities 2022-11-05 01:16:27 +01:00
cora
2c4a768685 Transform villager with on_lightning_strike 2022-11-05 01:16:27 +01:00
cora
95db6104e9 Transform pig with on_lightning_strike 2022-11-05 01:16:27 +01:00
cora
5cf2f488a8 Transform creeper with on_lightning_strike 2022-11-05 01:16:27 +01:00
cora
97468cde0c Add mcl_util to mobs_mc depends 2022-11-05 01:16:27 +01:00
cora
220b542cbf Mooshroom color change with on_lightning_strike 2022-11-05 01:16:27 +01:00
cora
21f3782439 Fix lightning on_strike api + rename to on_lightning_strike 2022-11-05 01:16:27 +01:00
cora
d18f55aa48 Merge pull request 'Villager tries to get closest bed and jobsite. Villager will wait if failed to path recently' (#2898) from feature/villagers_pt4 into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2898
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-05 00:15:46 +00:00
cora
32e4a122a1 Comment out stray debug lines 2022-11-05 01:14:54 +01:00
TheOnlyJoeEnderman
8e74209c9b add axolotl to translation template 2022-11-04 02:32:59 +00:00
TheOnlyJoeEnderman
faa7ca1f68 Change axolotl spawn egg to palette instead of texture 2022-11-04 02:21:58 +00:00
TheOnlyJoeEnderman
7e3d5f3553 add axolotl to bucket translation template 2022-11-04 01:58:04 +00:00
ancientmarinerdev
8b0c4c17ad Slightly more frequent failed pathing attempts for villagers 2022-11-03 21:34:15 +00:00
ancientmarinerdev
2d0ea5e205 Enable concurrent pathing so pathing orders aren't queued 2022-11-03 21:34:14 +00:00
ancientmarinerdev
ad137304bc Fix bug where if it finds wrong door and can't plot route it hogs the pathing 2022-11-03 21:34:14 +00:00
ancientmarinerdev
ac45dec544 Villager should find the closest bed to claim 2022-11-03 21:34:14 +00:00
ancientmarinerdev
ea9c9e74b0 Failed check should come before last pathed check to avoid a failed check taking up a good opportunity to path 2022-11-03 21:34:14 +00:00
ancientmarinerdev
5866983bf5 Villager will try to take the job block closest to them 2022-11-03 21:34:14 +00:00
ancientmarinerdev
17e3e83f43 Villagers should not try and path if they have failed recently 2022-11-03 21:34:14 +00:00
cora
06d4845955 Merge pull request 'Add setting for mob-movement stop range' (#2896) from mob_move_setting into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2896
2022-11-03 13:34:31 +00:00
cora
da9f253117 Add setting for mob-movement stop range 2022-11-03 14:32:50 +01:00
cora
b144a93fd8 Merge pull request 'Add a setting to disable hunger' (#2895) from hunger_setting into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2895
2022-11-03 13:32:17 +00:00
cora
3a37b1c8cc Add a setting to disable hunger 2022-11-03 14:31:08 +01:00
cora
f1cdb24545 Merge pull request 'Fix frequent ABM warning when lots of lava is in active block range' (#2894) from fix_lava_abms into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2894
2022-11-03 13:14:31 +00:00
cora
48d6a2fd72 Add some ABM limits for lava ABMs 2022-11-03 14:11:03 +01:00
cora
e9e76d2c1e Optimize snow pile-up ABM 2022-11-03 14:11:03 +01:00
cora
cdd8ea1dbc Optimize dripping ABMs 2022-11-03 14:11:03 +01:00
cora
5355234af1 Merge pull request 'Signs fixes' (#2899) from mcl_signs_rewrite_tranlsations into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2899
2022-11-03 12:12:13 +00:00
Michieal
fb10320550 Quickfix: changed standing sign rotate replacement node.
Replaced the standing sign (90 degrees) starting replacement node for on_rotate().
Tested on all signs, testing all degrees of rotation (all 16 of them).

fixes newly found bug: non-oak standing sign becomes oak standing sign when initially rotated with a screwdriver.
2022-11-03 13:10:50 +01:00
Michieal
5a68c876fb new translations for the additional signs. 2022-11-03 13:10:50 +01:00
Michieal
dd1e4ca927 Added in Crimson Hyphae and Warped Hyphae Signs
Added in Crimson Hyphae and Warped Hyphae Signs.

Didn't do the the translations for them.
2022-11-03 13:10:50 +01:00
Michieal
162bd36101 Translations for the signs 2022-11-03 13:10:50 +01:00
Michieal
d48100c427 Translations for the signs 2022-11-03 13:10:50 +01:00
TheOnlyJoeEnderman
126de74904 add axolotl to language template 2022-11-02 22:54:21 +00:00
TheOnlyJoeEnderman
fbc57192a0 Merge pull request 'Fix axolotl model' (#1) from MrRar/MineClone2:Axolotl into Axolotl
Reviewed-on: https://git.minetest.land/TheOnlyJoeEnderman/MineClone2/pulls/1
2022-11-02 22:08:31 +00:00
cora
ab00297077 Merge pull request 'Villagers gather at lunch time, reset trade when they get to work.' (#2873) from feature/villagers_pt3 into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2873
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-02 21:15:00 +00:00
ancientmarinerdev
2f4622909e Right click shouldn't stop work and allow a reset of trades 2022-11-02 22:09:35 +01:00
ancientmarinerdev
5ff4ce7116 Less verbose logging 2022-11-02 22:09:35 +01:00
ancientmarinerdev
c606092066 Pathfinding fix for villagers 2022-11-02 22:09:35 +01:00
ancientmarinerdev
5d5babdb20 Tweak distance to current_target check 2022-11-02 22:09:35 +01:00
ancientmarinerdev
7f33287e18 Reset trade counter when unlocking trades 2022-11-02 22:09:35 +01:00
ancientmarinerdev
1d667c26b5 Villagers will open and close doors when pathing through. Any failing steps now have a threshold to abandon failed pathing. 2022-11-02 22:09:35 +01:00
ancientmarinerdev
a01c3d1342 Pumkin price unreasonable and fix logging. 2022-11-02 22:09:35 +01:00
ancientmarinerdev
f9ec402b29 Only to door if we can get from door to target 2022-11-02 22:09:35 +01:00
ancientmarinerdev
cabe299456 Villager fixes 2022-11-02 22:09:35 +01:00
ancientmarinerdev
bf491c35a1 Fix bug 2022-11-02 22:09:35 +01:00
ancientmarinerdev
04cac7156e Villagers gather at lunch time, reset trade when they get to work. 2022-11-02 22:09:35 +01:00
Johannes Fritz
963547a0ca Fix axolotl model 2022-11-02 12:45:12 -05:00
cora
6851a53c6c Merge pull request 'Playable nether' (#2836) from nether_mg_settings into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2836
2022-11-02 04:32:01 +00:00
TheOnlyJoeEnderman
d5ca4fca9b fix constant need to run for the hills, restore ability to jump
previous commit just added comments.
2022-11-02 04:30:09 +00:00
TheOnlyJoeEnderman
3bdd1ea160 Update 'mods/ENTITIES/mobs_mc/axolotl.lua' 2022-11-02 04:15:40 +00:00
TheOnlyJoeEnderman
5cc835df93 fix indentation ln 53, 72, 73; change list on ln 50 to seperate lines 2022-11-02 03:25:10 +00:00
cora
646a341f52 Fix mob api can_spawn callback 2022-11-02 03:47:23 +01:00
cora
ae9173f7ec Grow legs under outpost with bridges 2022-11-02 00:13:29 +01:00
cora
b4cb06b5ed Tweak basalt delta floors 2022-11-01 04:52:17 +01:00
cora
009ca7535c Add nether outpost with bridges
just via spawnstruct for now
2022-11-01 04:52:17 +01:00
cora
3629f88dc0 Make strider usable 2022-11-01 04:52:17 +01:00
cora
21f5586669 Fix strider spawning 2022-11-01 04:52:17 +01:00
cora
d393e6a181 fix single mob spawning and poutpost walls 2022-11-01 04:52:17 +01:00
cora
f324e150ea Don't generate glowstone in the ceiling 2022-11-01 04:52:17 +01:00
cora
aa2661341b less lava springs, no ceiling lava springs 2022-11-01 04:52:17 +01:00
cora
72224a392a Add more nether bulwark variations 2022-11-01 04:52:17 +01:00
cora
376aeda495 change bulwark to use soulless fire for piggy comfort 2022-11-01 04:52:17 +01:00
cora
fb67bc74ba Fix strider riding 2022-11-01 04:52:17 +01:00
cora
6485545269 Add warped fungus on a stick item 2022-11-01 04:52:17 +01:00
cora
fb1c1a483e Add strider 2022-11-01 04:52:17 +01:00
cora
fe68e1eaac Generate netherrack and ores under the lava
another hack using minetest.generate_ores this time
2022-11-01 04:52:17 +01:00
cora
0f01a28c93 Add structure spawning to other structures 2022-11-01 04:52:17 +01:00
cora
27a434641d Make structure spawning respect caps 2022-11-01 04:52:17 +01:00
cora
77bdce5cea Add structure mob respawning mechanic
this sets a metadata field "spawnblock" in the nodes mobs spawn on
and registers an abm to respan them
2022-11-01 04:52:17 +01:00
cora
1f58cfb240 Fix merge conflict 2022-11-01 04:52:17 +01:00
cora
d1f0ade2e8 Grow wither rose when wither kills mob 2022-11-01 04:52:17 +01:00
cora
dec207368c Add wither rose 2022-11-01 04:52:17 +01:00
cora
eef4b52ce4 Remove "wild" nether wart, remove natural wither skelly spawning
wither skellys spawn on bridges now, enough wart in outposts
and bulwarks
2022-11-01 04:52:17 +01:00
cora
6b8236e8f3 Fix crash in villagegen 2022-11-01 04:52:17 +01:00
cora
5d26595f4a enforce cavern setting for nether generation
people unticking the "caverns" box probably do not expect that this
only applies to nether "terrain"
2022-11-01 04:52:17 +01:00
cora
1c6d1c958a Add more nether bridge variants 2022-11-01 04:52:17 +01:00
Michieal
c3433bd003 Warped Fungus redo.
Changed the colors and added in the old drips because they look pretty cool on it.
Wanted it to match the surrounding color scheme more than the green and orange one.

texture license: full usage under the standard MineClone2 texture license.

Created by Michieal, based off of the Minecraft Warped Fungus.
2022-11-01 04:52:17 +01:00
cora
8aedd6a761 add nether bridge fragment 2022-11-01 04:52:17 +01:00
cora
6bc12ec5ec mcl_structures Check if file exists before placing schematics 2022-11-01 04:52:17 +01:00
cora
62f353d54f Spawn hoglins in stable bullwarks 2022-11-01 04:52:17 +01:00
cora
4ad1abde14 Fix basalt pillar artifacts above the nether roof 2022-11-01 04:52:17 +01:00
cora
768345a91c Fix top node and magma patches in nether wastes 2022-11-01 04:52:17 +01:00
cora
98dad0b191 Generate netherrack under the bedrock ceiling
this is a somewhat ugly hack that uses minetest.generate_decorations
which generates decorations regardless of biome so additional steps
had to be taken to ensure no other decorations "spill over" due to
this.
2022-11-01 04:52:17 +01:00
cora
302b18833a Add variable interior for nether bulwark 2022-11-01 04:52:17 +01:00
cora
f76e0628e4 initial daughter structure support 2022-11-01 04:52:17 +01:00
cora
24476caf7e Add nether bulwark 2022-11-01 04:52:17 +01:00
cora
68039e0fb6 Fix nether outpost schematic voids (air inside now) 2022-11-01 04:52:17 +01:00
cora
d866b61d1c Add lower cavern threshhold for all mgs that support it 2022-11-01 04:52:17 +01:00
cora
a91586b2b5 Fix a few nether biomes settings 2022-11-01 04:52:17 +01:00
cora
a03973a80b tweak v7 cavern threshhold for larger nether caves 2022-11-01 04:52:17 +01:00
cora
9ea286428c Merge pull request 'Fix buckets on Android and open gate with bucket' (#2882) from buckets into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2882
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-01 03:49:53 +00:00
Johannes Fritz
8faa6aa9eb Fix buckets on Android 2022-11-01 03:46:45 +00:00
cora
56cbe50a02 Merge pull request 'Fix mobs flopping for the first second when in thier own element' (#2889) from mob_fly_check_fix into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2889
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-11-01 03:41:42 +00:00
epCode
4575fd0d81 Fix prexisting villagers getting rid of job clothes 2022-11-01 04:40:51 +01:00
epCode
8a2962cd46 Fix all mobs being givin armor list (Fix Villager loosing jobs) 2022-11-01 04:40:51 +01:00
epCode
9099f3ac7a Fix mobs flopping for the first second when in thier own element 2022-11-01 04:40:51 +01:00
epCode
1d3f52004f Merge pull request 'Uncommenting yaw change on go to pos. Breaks pathfinding.' (#2888) from bugfix/fix_pathfinding into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2888
Reviewed-by: epCode <epcode@noreply.git.minetest.land>
2022-10-31 23:25:17 +00:00
ancientmarinerdev
532fc22f62 Uncommenting yaw change on go to pos. Breaks pathfinding. 2022-10-31 23:19:04 +00:00
cora
fb29abcd50 Merge pull request 'Fix crash related to awards' (#2884) from awards_crashfix into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2884
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-31 22:55:05 +00:00
chmodsayshello
e9703c409e correct if/else in line 42 2022-10-31 21:53:51 +00:00
chmodsayshello
c572c27326 implement suggestions by cora (https://is.gd/jJRf3y) 2022-10-31 21:40:38 +00:00
TheOnlyJoeEnderman
88d02da047 Update 'mods/ENTITIES/mobs_mc/init.lua' 2022-10-31 18:17:14 +00:00
chmodsayshello
c1af4935a1 improve my poor (old) fix 2022-10-31 16:22:28 +01:00
chmodsayshello
910b3d57ac fix crash iteself 2022-10-31 16:19:38 +01:00
TheOnlyJoeEnderman
7aafb67923 fix flipped UVs 2022-10-31 00:07:30 +00:00
TheOnlyJoeEnderman
e7bcc89e65 Merge branch 'master' into Axolotl 2022-10-30 21:14:49 +00:00
TheOnlyJoeEnderman
1e003a2571 Remove cold and non-water biomes from spawn list, add "LushCaves" to biome list
I will change it to only Lush Caves if/when they are added.
2022-10-29 22:29:09 +00:00
TheOnlyJoeEnderman
3001832b8f Update 'mods/ENTITIES/mobs_mc/init.lua' 2022-10-29 21:44:39 +00:00
cora
a1637486bb Merge pull request 'Fix warning in mcl_dye' (#2881) from fix_dye_warning into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2881
2022-10-29 10:27:40 +00:00
cora
dc84b28d54 Fix warning in mcl_dye 2022-10-29 12:26:11 +02:00
cora
138c0e8668 Merge pull request 'dogshoot_enhancments/mob_fire_mechs' (#2872) from dogshoot_enhancments/mob_fire_mechs into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2872
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-29 10:22:31 +00:00
epCode
2b2c2cf9cc remove debug and remove resetting value 20 times per second 2022-10-29 12:08:06 +02:00
epCode
5378d8eba7 add random horse speed per mc wiki 2022-10-29 12:08:06 +02:00
epCode
4fa1c445cc add customizable speed to mounts, not set value. 2022-10-29 12:08:06 +02:00
epCode
83d92e08ca add an adjustable variable for avoid distance 2022-10-29 12:08:06 +02:00
epCode
eed5ec6f63 return pathfinding changes 2022-10-29 12:08:06 +02:00
epCode
702ba25283 Fix dogshooter animation when moving back 2022-10-29 12:08:06 +02:00
epCode
de73129c2b Make skeleton strafe and avoid enemies 2022-10-29 12:08:06 +02:00
epCode
d1d9f76c5d Mobs set players on fire if they are/dogshoot strafing and enemy avoidance 2022-10-29 12:08:06 +02:00
cora
e34e2ba03f Merge pull request 'Don't spawn multiple mobs at the same position' (#2867) from fix_multispawn into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2867
2022-10-29 10:07:15 +00:00
cora
672e44bbb1 Don't spawn multiple mobs at the same position
this was originally intended to simulate group spawning i think
2022-10-29 11:50:45 +02:00
TheOnlyJoeEnderman
e2107601f4 move axolotl from MCL to voxelgoodenough 2022-10-29 05:40:13 +00:00
TheOnlyJoeEnderman
0624d9d169 Change spaces to tabs on line 127 2022-10-29 04:29:13 +00:00
TheOnlyJoeEnderman
2d7d577f31 Add Cutest Predator advancement 2022-10-29 04:20:13 +00:00
TheOnlyJoeEnderman
0fc09c6e89 revert 0ab82b5317
revert add cutest predator advancement, Fix accidental deletions.
2022-10-29 04:05:26 +00:00
TheOnlyJoeEnderman
35ac5c75f5 Update 'mods/ENTITIES/mobs_mc/init.lua' 2022-10-29 03:52:38 +00:00
cora
b3553fe3b8 Merge pull request 'Grand mapgen cleanup 3 - end portal to structure api' (#2849) from mapgen_cleanup_3 into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2849
Reviewed-by: NO11 <no11@noreply.git.minetest.land>
2022-10-28 19:32:15 +00:00
cora
c850c0dfbb move remaining api code to mcl_structures/api.lua 2022-10-28 21:25:43 +02:00
cora
9aaa13408a Remove get_structure_data_construct
the positions are available from the registered structure
2022-10-28 21:25:43 +02:00
cora
c30e2c33b9 Move end portal shrine generation to structure api 2022-10-28 21:25:43 +02:00
cora
146e2de1a5 Structure-api: add initial rotation support 2022-10-28 21:25:43 +02:00
TheOnlyJoeEnderman
b1355513dd Merge branch 'master' into Axolotl 2022-10-28 07:18:37 +00:00
TheOnlyJoeEnderman
77bf8e0fb0 add axolotl 2022-10-28 07:15:49 +00:00
cora
c1174360d1 Merge pull request 'Remove potentially copyrighted music track and replace by cc music' (#2874) from fix_copyrighted_music into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2874
2022-10-28 03:07:07 +00:00
cora
11cc8745a2 Remove potentially copyrighted music track and replace by cc music
Soaring over the sea by mactonite (cc-by)
http://ccmixter.org/files/mactonite/65379
2022-10-28 05:00:17 +02:00
TheOnlyJoeEnderman
92d4e4f1e1 add axolotl to mob list 2022-10-27 04:39:22 +00:00
TheOnlyJoeEnderman
ca0786f549 add animations to axolotl
they do not appear in-game. If you can fix it, please do.
2022-10-27 04:33:38 +00:00
TheOnlyJoeEnderman
7f291aa109 add animations to axolotl
They should appear in game, but they don't.
2022-10-27 04:32:17 +00:00
TheOnlyJoeEnderman
4683384da1 add animations to axolotl
They don't appear in game for some reason. I did everything correctly to my knowledge.
2022-10-27 04:31:00 +00:00
cora
4f191754b8 Merge pull request 'Mob animation/head/jumping improvments/fixes' (#2865) from mob_head_code_improvments into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2865
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-27 02:19:18 +00:00
epCode
ef923deff1 Merge branch 'master' into mob_head_code_improvments 2022-10-27 01:34:39 +00:00
epCode
ee9301467c give zombie's the ability to wear armor. 2022-10-27 01:32:40 +00:00
epCode
239eca8988 make mob's not switch armor lying on the ground if they are already equiped. 2022-10-27 01:14:04 +00:00
epCode
86eef8827a Add working mob armor api
TODO: make mobs only put on a piece if they don't already have it.
2022-10-27 01:08:36 +00:00
cora
e6b3458018 Merge pull request 'Add sweet berries from mcl5' (#2842) from sweet_berries into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2842
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-10-26 22:50:22 +00:00
cora
9e3163ec42 Drop sweet berry item when bone mealing mature bush 2022-10-27 00:19:38 +02:00
TheOnlyJoeEnderman
d34710be85 add axolotl blender file so others can edit 2022-10-26 21:45:40 +00:00
TheOnlyJoeEnderman
d324197609 Fix duplicate/unnecessary "fish" in several names 2022-10-26 21:43:41 +00:00
cora
ba9d10055e always advance growth stage by 1 on bonemeal 2022-10-26 23:40:06 +02:00
TheOnlyJoeEnderman
e01f103723 add axolotl sounds 2022-10-26 21:37:11 +00:00
TheOnlyJoeEnderman
109d162bca add temporary axolotl model witn no animations 2022-10-26 21:15:19 +00:00
TheOnlyJoeEnderman
d89c1c0e5e change axolotl texture name 2022-10-26 21:09:57 +00:00
TheOnlyJoeEnderman
1efacd5a1b change axolotl texture name 2022-10-26 21:09:17 +00:00
TheOnlyJoeEnderman
5abf7d187c Delete 'mods/ENTITIES/mobs_mc/textures/extra_mobs_spawn_icon_axolotl.png' 2022-10-26 21:06:19 +00:00
TheOnlyJoeEnderman
2f975f2155 Delete 'mods/ENTITIES/mobs_mc/textures/extra_mobs_axolotl_white.png' 2022-10-26 21:06:02 +00:00
TheOnlyJoeEnderman
fbb1aaf29f Delete 'mods/ENTITIES/mobs_mc/textures/extra_mobs_axolotl_purple.png' 2022-10-26 21:05:49 +00:00
TheOnlyJoeEnderman
4bee5268cd Delete 'mods/ENTITIES/mobs_mc/textures/extra_mobs_axolotl_pink.png' 2022-10-26 21:05:36 +00:00
TheOnlyJoeEnderman
d575e8394d Delete 'mods/ENTITIES/mobs_mc/textures/extra_mobs_axolotl_green.png' 2022-10-26 21:05:22 +00:00
TheOnlyJoeEnderman
a8250e2544 Delete 'mods/ENTITIES/mobs_mc/textures/extra_mobs_axolotl_brown.png' 2022-10-26 21:05:08 +00:00
TheOnlyJoeEnderman
7e54597a25 Delete 'mods/ENTITIES/mobs_mc/textures/extra_mobs_axolotl_yellow.png' 2022-10-26 21:04:46 +00:00
TheOnlyJoeEnderman
a47df3dcdc Delete 'mods/ENTITIES/mobs_mc/textures/extra_mobs_axolotl_black.png' 2022-10-26 21:04:20 +00:00
TheOnlyJoeEnderman
0ab82b5317 add cutest predator advancement 2022-10-26 20:33:41 +00:00
TheOnlyJoeEnderman
eaa397a7da add new advancement, remove ability to jump 2022-10-26 20:27:14 +00:00
TheOnlyJoeEnderman
e4995524de change axolotl model, texture, sound names 2022-10-26 20:24:48 +00:00
epCode
6c0e29891d Fix a problem with smooth turning 2022-10-26 19:03:33 +00:00
PrairieWind
e8b983bcc5 Place sweet berries on wet farmland and bonemeal the sweet berries to progress growth 2022-10-26 15:57:17 +00:00
cora
ae91640234 Add missing biomes, correct saturation 2022-10-26 15:57:17 +00:00
cora
d6c0561d5a Only do damage from stage 1 and up 2022-10-26 15:57:17 +00:00
cora
2664fb871b sweet berries plantable not only on farming soil 2022-10-26 15:57:17 +00:00
cora
2b08f9ac53 Slow down player movement while inside sweet berry 2022-10-26 15:57:17 +00:00
cora
8d456d8ff9 implement sweet berry damage
0.5 per second while moving inside it
2022-10-26 15:57:17 +00:00
cora
b00f2784ff Sweet berry bushes are flammable 2022-10-26 15:57:17 +00:00
cora
280bcddcb2 Move sweet berry decoration to mcl_biomes 2022-10-26 15:57:17 +00:00
balazsszalab
495378b85e Register sweet berry bush by add_plant function to enable plant growth
Without calling the add_plant function, sweet berry bushes will not go through growth stages and it is impossible to farm them. Sweet berry bush and beetroot have the same number of growth stages, so I used beetroot's interval and chance values here. If somebody has a better approximation of these values, feel free to change them.
2022-10-26 15:57:16 +00:00
cora
5f4d7774ae Add sweet berry compostability 2022-10-26 15:57:16 +00:00
kay27
a7c3878cae [mineclone5] Tune sweet berries a bit 2022-10-26 15:57:16 +00:00
kay27
eb313f9482 [mineclone5] Move sweet berries into farming as a quick fix 2022-10-26 15:57:16 +00:00
cora
63a360674d Merge pull request 'Villagers will now path through doors. Villagers don't stand around whne not working.' (#2864) from feature/villagers_pt2 into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2864
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-26 09:32:39 +00:00
epCode
306db6b609 make shooting mobs calculate raycast bool for shooting with shoot_offset
Basically makes skeletons accurately when to shoot and when not to.
2022-10-25 23:52:16 +00:00
ancientmarinerdev
f8ee473383 Fix villager work times 2022-10-26 00:17:29 +01:00
ancientmarinerdev
eebea4a7a9 Clean up and add pathfinding constant 2022-10-26 00:11:55 +01:00
ancientmarinerdev
37e4dd5556 Villagers will now path through doors. Villagers don't stand around whne not working. 2022-10-26 00:11:55 +01:00
epCode
65289de86e Mobs jump over 1-2 block pits 2022-10-25 23:00:03 +00:00
epCode
6fa85a3a0c fix passive mobs twisting their heads unnaturally 2022-10-25 19:18:08 +00:00
epCode
de4c40f60a When mobs stop, don't stop animations easier
fixes mob punch animation.
2022-10-25 18:57:58 +00:00
epCode
636e5545a7 Attacking mobs don't care if they cant make a jump.
they try anyway
2022-10-25 18:54:57 +00:00
epCode
70beaf6b3d Give mobs more room to judge a jump 2022-10-25 18:52:51 +00:00
epCode
b89a9375da Some performance improvements
also add a bit to make mobs look at any player getting too close
2022-10-25 18:51:40 +00:00
cora
6a512139c9 Merge pull request 'Make mcl_dripping API public + fix code style' (#2861) from mcl-dripping-api-public into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2861
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-25 10:05:24 +00:00
AFCMS
4d6e79b07f Rewrite mcl_dripping README to Markdown, add API exemple and update infos 2022-10-25 12:00:03 +02:00
AFCMS
3432734c37 Refactor mcl_dripping 2022-10-25 12:00:03 +02:00
cora
8b566cddf3 Merge pull request 'make mob constant for velocity rotate with mob.' (#2855) from fix_runaway_mobs_sliding into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2855
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-25 09:57:18 +00:00
epCode
970011e02b make mob constant for velocity rotate with mob.
this simply makes the constant value for continually adding velocity to a mob rotate when the mob rotates. this is because the constant velocity value was not called often enough.
2022-10-25 00:15:13 +00:00
cora
8778ee6e9e Merge pull request 'fix cave spiders not the correct size/eyes being damagable' (#2856) from cave_spider_scale into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2856
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-24 20:39:57 +00:00
epCode
97c062a1ef fix cave spiders not the correct size/eyes being damageable 2022-10-24 20:14:37 +00:00
cora
cb0b618d39 Merge pull request 'Set signs debug output to default to false' (#2848) from signs_debug_default into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2848
2022-10-24 00:51:59 +00:00
cora
58a4a9d048 Set signs debug output to default to false 2022-10-24 02:47:56 +02:00
cora
ae0b5381e4 Merge pull request 'Villagers - Work, sleep and wander. Check and claim beds etc.' (#2816) from ancientmarinerdev/MineClone2:feature/villager_improvement_rb into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2816
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-23 23:36:49 +00:00
cora
426ee6e167 Merge pull request 'undelcared global yaw in mob api fix' (#2840) from epcode-patch-1 into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2840
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-23 22:13:38 +00:00
epCode
063325082d undelcared global yaw in mob api fix
Fixes #2839
2022-10-23 21:23:50 +00:00
ancientmarinerdev
b9d58c2f79 Cows and villagers can go into attack state and become non-functional 2022-10-23 22:16:35 +01:00
cora
2d1125c04e Merge pull request 'MineClone2 Signs Rewrite - move from GitHub to MeseHub' (#2822) from Michieal/MineClone2:mcl_signs_rewrite into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2822
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-23 16:57:09 +00:00
cora
3de3a58828 Merge pull request 'Add missing texture for zombie horse' (#2829) from add_z_horse_texture into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2829
2022-10-23 16:47:30 +00:00
cora
ddb64421d0 Add missing texture for zombie horse
the one in pixelperfection seems to be the mc one - this one is
made from horse_grey and horse_skeleton by me, cora, cc0
2022-10-23 18:46:02 +02:00
cora
7e60207603 Merge pull request 'mcl_attached fixes' (#2831) from mcl-attached-fixes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2831
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-23 16:45:03 +00:00
AFCMS
9f16bfe6c5 mcl_attached fixes
- deprecated usage of vector.new()
- use new vectors everywhere
- use `minetest` instead of `core`
- make some more functions local
2022-10-23 18:39:08 +02:00
cora
bbe4224b79 Merge pull request 'mcl_explosions fixes' (#2830) from mcl-explosions-fixes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2830
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-23 16:37:01 +00:00
AFCMS
8da8040324 mcl_explosions_fixes
- use new vectors
- remove deprecated use of vector.new()
- add some type annotations
2022-10-23 18:35:22 +02:00
cora
0a68562301 Merge pull request 'Remove unnecessary media files from mcl_chests' (#2813) from chests into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2813
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-23 16:24:54 +00:00
Johannes Fritz
7579e430c8 Remove unnecessary media files from mcl_chests 2022-10-23 18:23:45 +02:00
cora
9b1d0233d5 Merge pull request 'version -> 0.81 indev' (#2837) from release_0.80 into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2837
2022-10-23 16:04:40 +00:00
cora
6032cfb744 version -> 0.81 indev 2022-10-23 18:03:46 +02:00
cora
e126a5f96d Merge pull request 'Release 0.80' (#2757) from release_0.80 into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2757
2022-10-23 15:48:32 +00:00
cora
3d5c653263 Set version to 0.80 2022-10-23 15:59:24 +02:00
cora
05bd2b0e83 Update end credits again 2022-10-23 15:59:24 +02:00
cora
6325b892f1 Change to the correct gustavo in mcl5 credits 2022-10-23 15:59:24 +02:00
cora
1ba57b5c6e Add Fearraven alt "Michieal" to credits 2022-10-23 15:59:24 +02:00
cora
1ffcc98ba8 Update end credits 2022-10-23 15:59:23 +02:00
cora
ace47f8bf5 Add talamh to devs 2022-10-23 15:59:23 +02:00
cora
2b769ad2ff Add GuyLiner to credits 2022-10-23 15:59:23 +02:00
cora
730debb0a6 Add Herbert West to contributors 2022-10-23 15:59:23 +02:00
cora
f5e8f8716c Add Faerraven and FossFanatic to credits 2022-10-23 15:59:23 +02:00
cora
bffa214c77 Merge pull request 'Protect on_pick_up against unsafe usage' (#2835) from fix_unsafe_on_pick_up into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2835
2022-10-23 13:58:21 +00:00
cora
34dcba0b70 Protect on_pick_up against unsafe usage 2022-10-23 13:46:27 +02:00
Michieal
d4b9918ed4 Added in Documentation, changed the inventory image to be more minecraft-like (hand made), changed some licensing, and tracked down an out of place debug log line. 2022-10-23 03:20:34 -04:00
ancientmarinerdev
ccf7b54481 Fix work times 2022-10-23 01:17:51 +01:00
ancientmarinerdev
e1b685429d Texture now changes when villager loses job. 2022-10-23 01:12:19 +01:00
cora
d00f5a695f Merge pull request 'Fix possible crash in v6 and singlenode mapgens' (#2826) from fix_v6_singlenode_crash into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2826
2022-10-22 10:16:48 +00:00
cora
a8a55f9d6e don't run block fixes at all in singlenode 2022-10-22 12:10:29 +02:00
cora
2a10be4174 Fix possible crash in v6 / singlenode mapgen 2022-10-22 12:10:29 +02:00
cora
dc039e31b6 Merge pull request 'Fix redstone ore not calling on_punchnode callbacks' (#2827) from fix_redstone_punchnode into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2827
2022-10-22 10:09:55 +00:00
Michieal
7095876af1 Forgot to add in the greysacle images. 2022-10-21 22:55:26 -04:00
Michieal
9bbb065967 Complete signs acess using new API.
Has compatibility layer for signs_dark, the original signs, etc.

Has added greyscale sign for making your own signs. :)

TODO: add in translations, tweak the sign colors.
2022-10-21 22:50:39 -04:00
ancientmarinerdev
a8b336381d Villagers - On die, clear job and bed. Get same job if already traded. Thunderstorms go to bed 2022-10-22 01:28:45 +01:00
Michieal
c0e4c96d87 set up for new api.
Setting up for the NEW inclusive API. (prelude to).
2022-10-21 23:54:26 +00:00
Michieal
23654916cf Update DEBUG to use the global variable.
Added in a debug variable entry into settings. This commit uses that variable for all of the Signs API's debugging needs.
2022-10-21 23:31:00 +00:00
Michieal
78c7ec6121 Added in MCL_SIGNS' debug setting. 2022-10-21 19:22:33 -04:00
cora
724105bb61 Fix redstone ore not calling on_punchnode callbacks 2022-10-22 01:05:53 +02:00
TheOnlyJoeEnderman
0589816c75 fix missing parts of textures 2022-10-21 01:10:55 +00:00
TheOnlyJoeEnderman
162fe3bc1c fix missing parts of textures 2022-10-21 01:10:35 +00:00
TheOnlyJoeEnderman
f352e99eb6 add axolotl to list of bucketable fish 2022-10-21 00:44:18 +00:00
TheOnlyJoeEnderman
05329c908f add axolotl spawn icon 2022-10-21 00:41:27 +00:00
TheOnlyJoeEnderman
f8fe943fa6 add axolotl skin 2022-10-21 00:40:34 +00:00
TheOnlyJoeEnderman
6ee8e98ae3 add axolotl skin 2022-10-21 00:40:12 +00:00
TheOnlyJoeEnderman
65c7b741bb Add axolotl bucket texture 2022-10-21 00:39:15 +00:00
TheOnlyJoeEnderman
8001a1ea07 add axolotl lua file 2022-10-21 00:38:24 +00:00
cora
d4b1e30b61 Merge pull request 'Fix crash when golem tries to pickup item' (#2820) from fix_golem_pickup_crash into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2820
2022-10-20 23:42:38 +00:00
cora
9245c85296 Fix crash when golem tries to pickup item 2022-10-21 01:40:37 +02:00
cora
ec4d431835 Merge pull request 'Make mob walk velocity be more normal' (#2821) from epcode-patch-1 into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2821
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-20 03:45:15 +00:00
epCode
3ae3bc7f4e fix non-moving entities having no animations 2022-10-20 03:35:16 +00:00
epCode
14e7fea6c2 Make mob walk velocity be more normal
fixes: #2819
2022-10-20 03:35:16 +00:00
cora
3e56ca1843 Merge pull request 'fix zpigmen textures' (#2817) from fix_zpigmen into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2817
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-20 03:25:23 +00:00
Michieal
9f32a4c692 MineClone2 Signs Rewrite - move from GitHub to MeseHub
GitHub link: https://github.com/michieal/Mineclone2-Signs
2022-10-19 18:55:07 -04:00
epCode
18283fb593 fix zpigmen textures 2022-10-19 11:02:20 -07:00
cora
e56167136b Merge pull request 'Fix chest boats' (#2810) from chest_boats into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2810
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-19 10:58:13 +00:00
ancientmarinerdev
d148e6d4ba Villagers - Work, sleep and wander. Check and claim beds etc. 2022-10-19 01:10:16 +01:00
Johannes Fritz
cb2c01b1e2 Fix chest boat model 2022-10-18 08:14:20 -05:00
cora
53dd88eaea Merge pull request 'Adjust hand range to mc's 4.5, make hand ranges configurable' (#2792) from hand_range into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2792
2022-10-18 09:49:37 +00:00
cora
47efde7f2e Make hand range configurable 2022-10-18 11:45:56 +02:00
Guy Liner
22f6c38c1a Changed hand_range to reflect that of Minecraft Java Edition in both creative and survival 2022-10-18 11:45:56 +02:00
cora
dda85ea141 Merge pull request 'Use dig_node instead of remove in creative dig' (#2807) from fix_creative_dig into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2807
2022-10-18 09:44:49 +00:00
cora
e6aeb9ffba Use dig_node instead of remove in creative dig 2022-10-18 11:42:56 +02:00
cora
9eb1e8373e Merge pull request 'Add piglins and hoglins from mcl5/extra_mobs' (#2714) from piglins into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2714
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-10-17 21:59:21 +00:00
cora
663900bee3 Add hoglin to piglin attack list
doesn't appear to work though
2022-10-17 13:57:42 -06:00
cora
88de3656b1 Fix possible crash when spawning piglin 2022-10-17 13:57:42 -06:00
cora
d13d50333f Don't drop trades inside nodes 2022-10-17 13:57:42 -06:00
cora
bb640b4f1c make villager item pickup use new api feature 2022-10-17 13:57:42 -06:00
cora
1ac0da335a on_pick_up api: remove empty stack entities 2022-10-17 13:57:41 -06:00
cora
efb3072458 Add spawn egg colors, fix translator 2022-10-17 13:57:41 -06:00
cora
0b9fcae8ea document api addition 2022-10-17 13:57:41 -06:00
cora
4570226536 De-spaghettify piglin code a bit 2022-10-17 13:57:41 -06:00
cora
71ad3b91db Add hoglin and zoglin 2022-10-17 13:57:41 -06:00
cora
f7703c2889 Fix piglins taking whole stacks 2022-10-17 13:57:41 -06:00
cora
8cb73ee509 Fix on_pick_up api
accepts a returned itemstring from the callback now
2022-10-17 13:57:41 -06:00
cora
79265a596b enable zombie piglin transformation 2022-10-17 13:57:41 -06:00
cora
eed7c67f60 Fix piglin arrows 2022-10-17 13:57:41 -06:00
cora
f8777220a3 trade on item pickup instead of on_rightclick 2022-10-17 13:57:41 -06:00
cora
5b3480860a Add piglin from mcl5 2022-10-17 13:57:41 -06:00
PrairieWind
6b146bd6fb Merge pull request 'fix punching ghast not getting velocity' (#2811) from fix_crash_when_punching_ghast into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2811
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-10-17 19:56:47 +00:00
epCode
4834b01091 fix punching ghast not getting velocity 2022-10-17 12:38:51 -07:00
cora
4e4bd8f978 Merge pull request 'elytra_animation_fix' (#2805) from elytra_animation_fix into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2805
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-17 10:02:08 +00:00
epCode
8abdd852fc fix player head rotation 2022-10-17 12:00:55 +02:00
epCode
d466693f27 make player not walk while using elytra 2022-10-17 12:00:55 +02:00
cora
b4374fe961 Merge pull request 'Some mob-fix fixes' (#2798) from mobs_falling into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2798
2022-10-17 09:56:29 +00:00
cora
7c15b929fa Fix possible crash 2022-10-17 11:42:27 +02:00
cora
2e01180fc8 Fix "hibernating" mobs flying upwards 2022-10-17 11:42:27 +02:00
cora
6f6dac02e8 don't damage falling mobs landing on air or ignore 2022-10-17 11:42:27 +02:00
cora
a745075143 Allow mobs to still fall when out of range 2022-10-17 11:42:27 +02:00
cora
88aa59670a Merge pull request 'fix mob death animation' (#2803) from mob_fix_death_anim into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2803
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-17 09:41:57 +00:00
epCode
74ba2a105c fix mob death animation 2022-10-17 11:41:17 +02:00
epCode
38ff7af9fe Merge pull request 'Fix crash throwing snowball at (runaway=true) mobs' (#2802) from fix_snowball_crash into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2802
Reviewed-by: epCode <epcode@noreply.git.minetest.land>
2022-10-17 01:13:58 +00:00
cora
f61efce434 Fix crash throwing snowball at (runaway=true) mobs 2022-10-16 22:20:06 +02:00
cora
efcd0c8dcc Merge pull request 'Fix boss bars scaling issue with non 16x texture packs' (#2767) from talamh/MineClone2:bossbars_fix into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2767
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-15 23:04:53 +00:00
cora
d4c248548a Merge pull request 'Don't grow nether fungi automatically.' (#2789) from fix_fungus_growth into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2789
2022-10-15 23:01:21 +00:00
cora
6f0de8a82c Fix crimson fungus decoration & weeping vines on roof 2022-10-16 00:58:29 +02:00
cora
cf9cfea108 Don't automatically grow nether fungus 2022-10-16 00:58:29 +02:00
cora
cdca04ed5c Merge pull request 'Add brewing stand and furnace to igloo schematics' (#2776) from igloo_changes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2776
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-15 22:56:32 +00:00
cora
4a9a7b8fef Fix igloo chest loot 2022-10-16 00:52:47 +02:00
cora
dd163f4850 initialize special nodes on igloo placement 2022-10-16 00:52:47 +02:00
cora
7fee2cd55a struct-api: export construct_nodes function 2022-10-16 00:52:47 +02:00
PrairieWind
7f2ecb6ed0 Add brewing stand and furnace to igloo schematics 2022-10-16 00:52:47 +02:00
cora
678bf661d2 Merge pull request 'Various mob improvments' (#2791) from various_mob_improvments into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2791
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-15 22:52:10 +00:00
epCode
677fcb48c9 fix mob floping 2022-10-15 12:09:25 -07:00
epCode
8e28c296ca fix mobs flying out of thier element, and increase mob gravity closer to MC 2022-10-15 11:57:53 -07:00
epCode
22e6731261 various mob improvments 2022-10-15 11:25:26 -07:00
cora
210496b615 Merge pull request 'Fix crash when getting attacked by mob while in boat' (#2778) from fix_boat_mob_crash into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2778
2022-10-14 23:59:00 +00:00
cora
a6a98fb7ae Fix crash when getting attacked by mob while in boat 2022-10-15 01:58:19 +02:00
epCode
5eca209d95 Merge pull request 'smoother mob velocity+other mob improvments' (#2783) from fluid_mob_velocity into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2783
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-14 23:53:55 +00:00
epCode
f242655b13 make mobs predict jumps before even getting too close to a bock. 2022-10-15 01:47:43 +02:00
epCode
44ba08cb8b make die animation more smooth for all mobs 2022-10-15 01:47:43 +02:00
epCode
ba127ecb12 fine-tune mob velocity 2022-10-15 01:47:43 +02:00
epCode
82153c2af9 make mob movment more fluid 2022-10-15 01:47:43 +02:00
epCode
cdbcae4b59 Merge pull request 'Some entity inv / boat fixes' (#2788) from entinv_fixes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2788
Reviewed-by: epCode <epcode@noreply.git.minetest.land>
2022-10-14 23:05:04 +00:00
cora
224bbff56b Open minecart inv with regular rightclick 2022-10-15 00:40:03 +02:00
cora
0c993294fb Make choat collisionbox a bit taller 2022-10-14 21:52:57 +00:00
cora
1b57650317 fix boat collisonbox to fit the model better
it says in a comment to not *lower* it - i made it higher. All
seems to work - boat does not fall through the world.
2022-10-14 21:52:57 +00:00
cora
e245ff02c2 Place player in front of choat, disallow passenger 2022-10-14 21:52:57 +00:00
cora
0ec4cb5502 Open inv on shift+rightclick 2022-10-14 21:52:57 +00:00
cora
cb7df652f7 Fix title double display in boats and minecarts 2022-10-14 21:52:57 +00:00
PrairieWind
05232e99cd Merge pull request 'Add lightning rods' (#2772) from lightning_rod into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2772
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-10-14 21:17:39 +00:00
cora
96b7b9eab3 Add crafting recipe 2022-10-14 17:32:31 +00:00
cora
e80e44612c Add lightning rod 2022-10-14 17:32:31 +00:00
cora
7b1d5501c1 lightning: allow change of strike position in callback 2022-10-14 17:32:31 +00:00
cora
1efaec526c Merge pull request 'Fix a few on start warnings in torches' (#2775) from fix_torch_texture_warnings into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2775
2022-10-14 10:12:19 +00:00
cora
a7e12e268c fix warning / wrong usage of on_construct in torches 2022-10-14 12:11:18 +02:00
cora
40fb4a1299 Fix texture warnings in torches 2022-10-14 12:11:18 +02:00
cora
10a857bb3f Merge pull request 'Some structure- and general mob fixes' (#2746) from fix_structmob_despawn into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2746
2022-10-14 10:10:27 +00:00
cora
d90b3c046a give mobs a slightly heigher jump height
so they don't need 2 tries to jump on a node
2022-10-14 02:44:23 +02:00
cora
c855f51829 fix mobs not jumping anymore 2022-10-14 02:40:25 +02:00
cora
c044cf8e74 Fix debug line 2022-10-14 02:31:23 +02:00
cora
93f8f2aa3b only count despawnable mobs for global caps 2022-10-14 02:31:23 +02:00
cora
976b9da7d7 Despawn out of range mobs when immobile 2022-10-14 02:31:23 +02:00
cora
c146124a2c spawning: check for room accrd. to collisionbox 2022-10-14 02:31:23 +02:00
cora
ea48be3f4c Add global and per-player mob caps 2022-10-14 02:31:23 +02:00
cora
cd862888d1 Fix indentation 2022-10-14 02:31:23 +02:00
cora
ba25e57eac don't run on_spawn twice 2022-10-14 02:31:23 +02:00
cora
546b9ade6f Make mobs outside of player radius stop moving 2022-10-14 02:31:23 +02:00
cora
5db7680cd1 mitigate high cpu usage due to excessive mob counting
This was caused by the mob caps being checked too frequently
2022-10-14 02:31:23 +02:00
cora
effac327f5 Fix baby Z-pigman visual size 2022-10-14 02:31:23 +02:00
cora
97f9614818 Log the node a mob spawns on 2022-10-14 02:31:23 +02:00
cora
cba176be4a make horny mobs move towards each other 2022-10-14 02:31:23 +02:00
cora
39a0353a49 Add spawn counts per mob to /mobstats 2022-10-14 02:31:23 +02:00
cora
1a380da960 Don't spawn pilalgers *in* the ground 2022-10-14 02:31:23 +02:00
cora
83f17fd9a7 Cats keep their color 2022-10-14 02:31:23 +02:00
cora
976b1eb153 don't despawn pillager, evoker and witch 2022-10-14 02:31:23 +02:00
cora
102469f7ab Merge pull request 'mob_attack_better_strat' (#2774) from mob_attack_better_strat into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2774
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-14 00:30:42 +00:00
epCode
27ac333878 fix syntax crash 2022-10-13 16:59:32 -07:00
epCode
b27c81cea4 make mobs coordinate attacks with all other similar alliances. 2022-10-13 16:53:01 -07:00
epCode
12e9c2c6d0 make all hostile mobs attack a little more strategically. 2022-10-13 16:41:45 -07:00
cora
5b74a2e70c Merge pull request 'Add glow squids and particlespawner api for mobs' (#2741) from glow_squids into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2741
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
2022-10-13 22:45:40 +00:00
cora
80ff5f1207 Fix enderpos global warning 2022-10-14 00:24:44 +02:00
cora
3e312af3b9 fix warning / wrong var 2022-10-14 00:09:32 +02:00
cora
b770ce42e3 Fix particlespawners not showing on player_transfer_distance == 0 2022-10-13 21:48:05 +00:00
cora
fb07fee7f0 Glow squid spawn egg colors 2022-10-13 21:48:05 +00:00
cora
01791cf550 fix crash when player_transfer_distance is not set 2022-10-13 21:48:05 +00:00
cora
11742b61b2 Make Endermen also use the api instead of the old method 2022-10-13 21:48:05 +00:00
cora
063102cc1e Make glow squids use the particlespawner api 2022-10-13 21:48:05 +00:00
cora
ef4b243a30 Add coord safe infinite particlespawners api for mobs 2022-10-13 21:48:05 +00:00
cora
dc873f4de2 Fix crash when deleting particlespawners 2022-10-13 21:48:05 +00:00
cora
438d22e52e Fix glow inksac itemstring 2022-10-13 21:48:05 +00:00
cora
26ba771a02 Fix translator to use mobs_mc instead of extra_mobs 2022-10-13 21:48:05 +00:00
cora
ddd39b553d Fix indentation 2022-10-13 21:48:05 +00:00
cora
af8b1baba5 Do not spam the network with individual particles 2022-10-13 21:48:05 +00:00
cora
1daed62d12 Fix glow squid rotation / swimming direction 2022-10-13 21:48:05 +00:00
cora
a599f66360 move ink sac to mcl_mobitems 2022-10-13 21:48:05 +00:00
Faerraven
e2fd8b804c Add glow squids from mcl5 2022-10-13 21:48:05 +00:00
talamh
07e419905b Fixed typo in image resizing in bossbars 2022-10-13 20:02:28 +01:00
cora
2b5c409b12 Merge pull request 'Fix mobs not following player wielding the follow item' (#2768) from fix_mob_itemfollow into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2768
2022-10-13 13:05:37 +00:00
cora
a4a5b72380 Fix mobs not following player wielding the follow item 2022-10-13 15:03:24 +02:00
cora
b838646efb Merge pull request 'Fixed issue #2769: Cartographer villager offering to trade one glass pane for an emerald' (#2770) from herbert-west2/MineClone2:master into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2770
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-13 04:32:05 +00:00
Herbert West
25d6375f66 Fixed issue #2769: Cartographer villager offering to trade one glass pane for an emerald 2022-10-12 23:46:34 -04:00
cora
7eed73a543 Merge pull request 'Optionally bring back the old spawn icons' (#2705) from spawn_icons_setting into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2705
2022-10-13 00:15:58 +00:00
cora
d297f4af8c Add some missing spawn icons 2022-10-13 02:13:02 +02:00
cora
0048a3edb2 Display egg if icon not available 2022-10-13 02:13:02 +02:00
cora
f47674b9a7 Add mcl_util.file_exists() function 2022-10-13 02:13:02 +02:00
cora
57b5d13edf Add setting to optionally bring back spawn icons 2022-10-13 02:13:02 +02:00
cora
559136622e re-add old spawn icons 2022-10-13 02:13:02 +02:00
cora
bf8d340da0 Merge pull request 'make spawn_mob able to change variables in a mob' (#2759) from spawn_mob_super into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2759
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-13 00:01:22 +00:00
epCode
93e2f1997a allow a spider/skeleton jockey to be spawnable with spawn_mob command 2022-10-13 01:54:38 +02:00
epCode
22a5856b46 make spawn_mob able to change values in a mob 2022-10-13 01:54:38 +02:00
cora
cd907f080c Merge pull request 'fix enderman eye scale #2762' (#2766) from epcode-patch-1 into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2766
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-12 23:50:54 +00:00
epCode
dc4c5a07a4 fix enderman eye scale #2762
#2762
2022-10-12 18:41:33 +00:00
talamh
f1ebe802c6 Fix boss bars scaling issue with non 16x texture packs 2022-10-12 19:37:56 +01:00
cora
96a6cd1b9b Merge pull request 'Fix exp bar scaling issue with non 16x textures' (#2755) from talamh/MineClone2:expbar_fix into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2755
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-12 01:41:23 +00:00
cora
f8377c77cb Merge pull request 'Fix status effects scaling issue with non 16x texture packs' (#2758) from talamh/MineClone2:status_effects_fix into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2758
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-12 01:38:19 +00:00
cora
d7ca90f7fe Merge pull request 'fix zombie pig wielditem' (#2753) from mob_wield_model_fixes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2753
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-12 01:28:55 +00:00
talamh
695fab5f06 Fix status effects scaling issue with non 16x texture packs 2022-10-11 21:53:48 +01:00
talamh
7cf287a504 Fix exp bar scaling issue with non 16x textures 2022-10-11 19:52:30 +01:00
epCode
ecaf2d5ed7 fix pigman wield size 2022-10-11 18:28:58 +00:00
epCode
0deb288de9 fix zombie pig wielditem 2022-10-11 18:28:58 +00:00
cora
e80ce4b758 Merge pull request 'Fix mirrored doors placement rotation' (#2736) from fix_doors_direction into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2736
2022-10-11 09:47:31 +00:00
cora
51e43f7efc Fix mirrored doors rotation 2022-10-11 11:46:08 +02:00
cora
dc0ca59534 Merge pull request 'Add new breaking animation by FossFanatic' (#2744) from fossfan_breaking_anim into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2744
Reviewed-by: Nicu <kneekoo@noreply.git.minetest.land>
2022-10-11 09:40:51 +00:00
FossFanatic
e35e949833 Add breaking animation by FossFanatic 2022-10-11 11:40:15 +02:00
cora
0b0a48fd10 Merge pull request 'Change torch model, add soul fire flame particle texture' (#2750) from talamh/MineClone2:torch_remodel into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2750
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-11 09:36:49 +00:00
cora
1b6df20c0c Merge pull request 'Adds some mob jockey support' (#2752) from mob_jockey into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2752
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-11 09:30:29 +00:00
epCode
8930f9da45 fix skeleton wielditem 2022-10-10 13:54:51 -07:00
epCode
aa2693795d Add Spider Jockey 2022-10-10 13:42:01 -07:00
talamh
23ec60fff0 Change torch model, add soul fire flame particle texture 2022-10-10 20:50:11 +01:00
cora
fec0dae4ca Merge pull request 'Make mobs have smooth turning' (#2743) from smooth_mob_turn into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2743
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-10 02:10:53 +00:00
epCode
8cd093afa9 adjust values 2022-10-09 18:43:41 -07:00
epCode
9cf5b2a9f6 make mobs rotate when punched 2022-10-09 18:40:41 -07:00
epCode
8a63e90e4a remove debug message 2022-10-09 18:26:20 -07:00
epCode
a16e8f0403 remove all glitchy shaking 2022-10-09 17:41:50 -07:00
epCode
090c5b086a fix mobs shaking a lot 2022-10-09 17:29:28 -07:00
epCode
c500dc98f9 fix only hostile mobs using smooth turning 2022-10-09 17:23:14 -07:00
epCode
4a086db4c5 get rid of unecessary "if true" statement 2022-10-10 00:09:06 +00:00
epCode
ef980f2ea0 Make mobs have smooth turning 2022-10-10 00:09:06 +00:00
cora
0c21abf28a Merge pull request 'Change Achievements to Advancements, Part 1' (#2681) from advancement_mod_fixes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2681
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-09 23:27:38 +00:00
PrairieWind
78f1a81d1f Add Advancement Groups (Overworld, Nether, End, Adventure, Husbandry) 2022-10-10 01:10:49 +02:00
PrairieWind
0a33c5b5df Added Types of Advancements (Advancements, Goals, and Challenges) 2022-10-10 01:10:49 +02:00
PrairieWind
f9f74d2af7 Changed Achievements to Advancements in player visible text. 2022-10-10 01:10:49 +02:00
cora
d43494e3b7 Merge pull request 'Fix dumb mistake in creative crash fix' (#2742) from fix_creative_crash_5.6 into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2742
2022-10-09 23:09:58 +00:00
cora
2a9d704293 Fix dumb mistake in creative crash fix 2022-10-10 01:07:11 +02:00
cora
e294466029 Merge pull request 'Fix crash in 5.6 gm-creative digging' (#2734) from fix_creative_crash_5.6 into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2734
2022-10-09 22:53:59 +00:00
cora
a1919b572a Fix crash in 5.6 gm-creative digging 2022-10-10 00:52:55 +02:00
cora
24c03c2d32 Merge pull request 'Fix baby zombies being 1/4 vis_size' (#2737) from fix_baby_z_visszie into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2737
2022-10-09 22:50:23 +00:00
cora
2fa2f7cbf9 Fix baby zombies being 1/4 vis_size 2022-10-10 00:49:01 +02:00
cora
aea899a569 Merge pull request 'Check enable damage instead of creative mode when appropriate' (#2726) from enable_damage into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2726
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-09 19:51:00 +00:00
Johannes Fritz
36427d5aef Check enable damage instead of creative mode in some cases 2022-10-09 21:45:05 +02:00
cora
3e9cb597e6 Merge pull request 'mcl_title API: enable styling' (#2730) from title-API-fixes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2730
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-09 19:35:48 +00:00
cora
ba6dfc7368 Merge pull request 'Enable mcl_title debug code, debug priv to chatcmds' (#2735) from title-API-fixes_enable-debug into title-API-fixes
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2735
2022-10-09 19:33:36 +00:00
cora
52ac8ffd43 clarify debug nature of chatcommands 2022-10-09 21:31:23 +02:00
cora
3686d9a79d Enable mcl_title debug code, debug priv to chatcmds 2022-10-08 22:56:40 +02:00
AFCMS
d71d1c4b82 mcl_title API: enable styling 2022-10-08 22:46:32 +02:00
cora
0c4edbc4ac Merge pull request 'Flower pot fixes' (#2731) from flowerpot-fixes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2731
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-08 20:43:19 +00:00
AFCMS
5719637ee7
Flower pot fixes
- More accurate selection and collision box
-  Remove check for `minetest.features.use_texture_alpha_string_modes`
- Use new vectors
- Add some basic type annotations to API functions
2022-10-08 18:31:07 +02:00
cora
3aaf0f3e29 Merge pull request 'Add api and following mobs as starers: cow, chicken, creeper, pig, sheep, skellys. spider, villager, villager_zombie, wolf' (#2716) from new_mobs_look_at_players into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2716
Reviewed-by: cora <cora@noreply.git.minetest.land>
Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
2022-10-07 16:45:44 +00:00
epCode
3a34773671 (+)polar_bear_head_rotation 2022-10-07 02:45:02 +00:00
epCode
5a14f385a0 (+)zombie_pigman_head_rotation 2022-10-07 02:45:02 +00:00
epCode
029638029d (+)witherskeleton_head_rotation 2022-10-07 02:45:02 +00:00
epCode
1d06ac5774 (+)parrot_head_rotation 2022-10-07 02:45:02 +00:00
epCode
9a338a0eea (+)iron_golem_head_rotation 2022-10-07 02:45:02 +00:00
epCode
30c77a3517 (+)illager_head_rotation 2022-10-07 02:45:02 +00:00
epCode
25cceb58a9 (+)blaze_head_rotation 2022-10-07 02:45:02 +00:00
epCode
8b3087c1d3 (+)rabbit_head_rotation 2022-10-07 02:45:02 +00:00
epCode
690d97bc63 (+)zombie_head_rotation 2022-10-07 02:45:02 +00:00
epCode
683d973d9f (+)Llama_head_rotation 2022-10-07 02:45:02 +00:00
epCode
99350d4dc8 (+)ocelots_head_rotation 2022-10-07 02:45:02 +00:00
epCode
bc0d5de1e2 make dogs not so curious 2022-10-07 02:45:02 +00:00
epCode
5f46f9649a Make mobs not always look at you+looks at own kind 2022-10-07 02:45:01 +00:00
epCode
c72b1fb9db revert to Mr. Rar's models for fertile mobs. 2022-10-07 02:45:01 +00:00
cora
609f90dd0a Use conditional set_bone_position for mob head swivel 2022-10-07 02:45:01 +00:00
cora
68d04bc4e8 move set_conditionals from mcl_playerplus to mcl_util 2022-10-07 02:45:01 +00:00
epCode
1a6698abda Add api and following mobs as starers: cow, chicken, creeper, pig, sheep, skellys. spider, villager, villager_zombie, wolf 2022-10-07 02:45:01 +00:00
cora
8893241ae9 Merge pull request 'Pull sus_stews update' (#2709) from sus_stew_allium into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2709
2022-10-07 00:22:54 +00:00
MysticTempest
3eb2125538 Add alliums with fire_resistance, and fix eating issue. 2022-10-07 02:20:26 +02:00
chmodsayshello
a1bb8812b1 add cora to authors 2022-10-07 02:20:26 +02:00
cora
3b92a5b0d2 Merge pull request 'Fix offhand hud slot incorrect scaling with non 16x texture packs' (#2725) from talamh/MineClone2:offhand_hud into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2725
2022-10-07 00:17:18 +00:00
talamh
ecd1162c2d Fix offhand hud slot incorrect scaling with non 16x texture packs 2022-10-06 21:15:15 +01:00
cora
5b3b686452 Merge pull request 'Add donkey and mule inv' (#2691) from donkey_chest into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2691
Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
2022-10-06 19:44:35 +00:00
cora
b3c34bd081 unset item list when dropping inv 2022-10-06 21:43:30 +02:00
cora
d202db00b7 Fix llama and donkey/mule drops 2022-10-06 21:43:30 +02:00
cora
8d8d49c87d Add mule, document api additions 2022-10-06 21:43:30 +02:00
cora
7cabdb1707 fix donkey chest texture 2022-10-06 21:43:30 +02:00
cora
9602b564c4 Add donkey inv 2022-10-06 21:43:30 +02:00
cora
8fbb545a70 Merge pull request 'Replace bed nodeboxes with meshes' (#2722) from talamh/MineClone2:bed_mesh into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2722
2022-10-06 19:42:36 +00:00
cora
bf74e75ee5 Merge pull request 'Fix mangrove leaves dropping themselves' (#2711) from mangrove_leaves into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2711
Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
2022-10-06 18:42:35 +00:00
cora
5a977b5b76 Fix mangrove leaves dropping themselves 2022-10-06 20:40:16 +02:00
epCode
5507f62142 Merge pull request 'fix_spider_eyes_memory_fault+die' (#2721) from fix_spider_eyes_memory_fault+die into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2721
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-06 17:45:29 +00:00
epCode
99cc6cf307 Remove Unecessary code in spider for eye removal. 2022-10-06 19:42:29 +02:00
epCode
ba383091ad fix eyes staying when mob was killed 2022-10-06 19:42:29 +02:00
epCode
b4f2cb61d3 Fix Spider Segmentation fault 2022-10-06 19:42:29 +02:00
cora
9107bfa62d Merge pull request 'Fix double despawn in staticdata/activate (and resulting segfault)' (#2723) from fix_double_despawn into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2723
2022-10-06 17:38:40 +00:00
cora
d570a2dda6 Fix double despawn in staticdata/activate 2022-10-06 19:15:14 +02:00
talamh
b4859b8e7c Replace bed nodeboxes with meshes 2022-10-06 17:36:51 +01:00
cora
8f5bca7506 Merge pull request 'Add basic sculk' (#2668) from sculk into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2668
Reviewed-by: Johannes Fritz <mrrar@noreply.git.minetest.land>
2022-10-05 22:32:34 +00:00
cora
a9be0f1f9d dig sculk veins by water 2022-10-06 00:31:00 +02:00
cora
751b92c3d6 Update spread_to nodes for sculk 2022-10-06 00:31:00 +02:00
cora
6ecd7cfe4c comment out sensor/shrieker code
doesn't work well enough yet
2022-10-06 00:31:00 +02:00
cora
5f559867da Add sculk sounds by thunder1035 2022-10-06 00:31:00 +02:00
cora
7b1de473c3 Clean up mcl_sculk 2022-10-06 00:31:00 +02:00
cora
256d6bded7 Add sculk veins, generate shriekers and sensors 2022-10-06 00:31:00 +02:00
cora
6da1491f14 make xp.throw_xp return the orb objects 2022-10-06 00:31:00 +02:00
cora
a6021e7601 Add sculk 2022-10-06 00:31:00 +02:00
cora
a2ce3e8a49 Merge pull request 'Make enderman and spider's eyes glow' (#2712) from spider_ender_eyes_glow into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2712
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-05 22:29:36 +00:00
epCode
fb878f6814 make enderman's eyes Glow 2022-10-06 00:27:31 +02:00
epCode
fcd9854e7c make spider eyes Glow 2022-10-06 00:27:31 +02:00
cora
cab4915056 Merge pull request 'Optimize mobs textures and villagers badges messing up non-64px textures (clean version of #2703)' (#2713) from talamh_texture_fixes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2713
2022-10-05 22:23:27 +00:00
talamh
fb5fd6b2e9 Fix villager badges messing up non-64px textures 2022-10-06 00:20:20 +02:00
talamh
ad307aa445 Optimize mobs textures with trimage 2022-10-06 00:19:53 +02:00
cora
ae61c7835d Merge pull request 'Give the arrows a far less laggy look with an attached particle spawner with critical shot.' (#2710) from Arrow_visual_preformance into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2710
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-05 00:07:12 +00:00
epCode
7e03f86b84 Give the arrows a far less laggy look with an attached particle spawner with critical shot. 2022-10-04 16:46:47 -07:00
cora
60cfbe4bfe Merge pull request 'Mob Spawn Egg Texture Updates' (#2702) from spawn_egg_texture_updates into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2702
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-04 09:39:58 +00:00
PrairieWind
361edc5728 Update forgotten blaze egg texture definition
Sorry, forgot to do this in the main commit, I was wondering why it was throwing errors
2022-10-03 12:01:04 -06:00
PrairieWind
d8e2255d76 Added egg textures to register_egg function/api 2022-10-03 11:52:22 -06:00
PrairieWind
f0d5080df7 Fixed Free the End advancement icon 2022-10-03 10:31:10 -06:00
PrairieWind
aeaaa45026 Merge pull request 'Remove all spawn icons and replace with 2 greyscale images' (#2698) from talamh/MineClone2:master into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2698
Reviewed-by: PrairieWind <prairie.astronomer1@gmail.com>
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-02 23:18:17 +00:00
talamh
147b81bb4f Remove all spawn icons and replace with 2 greyscale images 2022-10-02 16:50:43 +01:00
cora
4080c4ada4 Merge pull request 'Revert llama chest model' (#2695) from llama_model into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2695
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-10-01 21:50:29 +00:00
Johannes Fritz
ac62124708 Revert llama chest model 2022-10-01 11:24:02 -05:00
cora
3b873a89eb Merge pull request 'A couple llama fixes' (#2688) from fix_llama_player_inv into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2688
2022-10-01 01:21:51 +00:00
cora
2b9fb5679e Merge pull request 'Fix possible crash on llama death' (#2690) from fix_llama_crash into fix_llama_player_inv
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2690
2022-09-30 22:37:26 +00:00
cora
0fd1d34aa5 Fix possible crash on llama death 2022-09-30 22:36:57 +00:00
cora
0e364fc22c Fix llama inv only being accessible by owner 2022-09-30 14:12:20 +02:00
cora
d666493e59 Merge pull request 'Add big head support to all babies' (#2686) from big_heads into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2686
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-09-29 21:26:30 +00:00
Johannes Fritz
9a9bb7f889 Fix the evoker 2022-09-29 14:40:01 -05:00
Johannes Fritz
19c0851003 Add big head support to all babies 2022-09-29 12:03:50 -05:00
cora
fe075df0c3 Merge pull request 'Add llama inventories' (#2682) from llama_inv into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2682
Reviewed-by: Johannes Fritz <mrrar@noreply.git.minetest.land>
2022-09-29 00:15:06 +00:00
cora
5765bd633b Fix mobs not dropping the entity-inv on death
on_death is not called when a mob dies for some reason
2022-09-29 02:03:46 +02:00
Johannes Fritz
d209b4429b Fix my oopsie 2022-09-28 12:09:13 -05:00
cora
e0ae8272b1 fix chest tex to work with carpet, add chest drop 2022-09-28 15:57:34 +00:00
cora
ae71b19ede Set llama chest texture when equipping chest 2022-09-28 15:57:34 +00:00
Johannes Fritz
673f970fb3 Add chest support to llama model 2022-09-28 15:57:34 +00:00
cora
5236edbedb Fix inv-entity old on_activate arguments 2022-09-28 15:57:34 +00:00
cora
5d60bfe973 Add Llama inventories 2022-09-28 15:57:34 +00:00
cora
cc4587e49c Merge pull request 'Fixed llamas spawning in the Jungle' (#2673) from llama_biomes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2673
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-09-27 09:50:58 +00:00
PrairieWind
8d939de25e Fixed llamas spawning in the Jungle
Llamas no longer spawn in the jungle
2022-09-27 11:47:53 +02:00
cora
7393c1144a Merge pull request 'Fix netherite block fortune dupe' (#2680) from fix_netherite_fortune into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2680
2022-09-27 09:46:59 +00:00
cora
3ba5df8013 Fix netherite block fortune dupe 2022-09-27 11:45:32 +02:00
cora
5887067cb9 Merge pull request 'Fix nether and blackstone gold ore drops' (#2677) from fix_nether_gold_drops into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2677
Reviewed-by: Johannes Fritz <mrrar@noreply.git.minetest.land>
2022-09-27 09:44:26 +00:00
cora
11f9e84622 Fix nether and blackstone gold ore drops
it needs a "fallback" drop with rarity = 1 otherwise there is a
fair chance it will drop nothing
2022-09-27 11:43:08 +02:00
cora
edb41538dc Merge pull request 'Add entity inventory api (chest minecarts, chest boats)' (#2674) from entity_invs into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2674
Reviewed-by: Johannes Fritz <mrrar@noreply.git.minetest.land>
2022-09-27 04:03:39 +00:00
cora
29d46d44af Make it possible for mods to handle inv access
i.e. ability to turn off the on_rightclick provided and call the
show_formspec function themselves
2022-09-27 05:55:18 +02:00
cora
a3466a1796 Create inv only when actually used (and remove after) 2022-09-25 22:20:05 +02:00
cora
e56c589a14 Add mangrove boat 2022-09-24 14:15:48 +02:00
cora
eef47e508b Fix chest boat crafting recipe 2022-09-24 05:34:06 +02:00
cora
6b77163162 Make shown formspec inv size variable 2022-09-24 00:05:37 +02:00
cora
e4a62fc07d Drop inv on entity death, remove on_deactivate 2022-09-23 18:17:03 +02:00
cora
4fa2d1d396 Add chest boat. Model by thunder1035 2022-09-23 17:12:10 +02:00
cora
d9f820cb67 Enable chest minecarts 2022-09-23 05:43:31 +02:00
cora
c4bad91b8c Add entity inventories 2022-09-23 05:42:56 +02:00
cora
85cf7fa36e Merge pull request 'Make nylium spread to netherrack using bonemeal' (#2653) from nylium_bonemeal into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2653
2022-09-19 12:22:40 +00:00
cora
05e6afb93a Fix bonemealing of large fungi 2022-09-19 14:19:49 +02:00
cora
f9372b02f6 Better bone mealing behavior 2022-09-19 14:08:54 +02:00
cora
70294d9e34 Add weeping vines 2022-09-19 14:03:32 +02:00
cora
3fc12ed946 Add plants on bonemealed nylium 2022-09-19 14:03:32 +02:00
cora
f8501192e2 Make nylium spread to netherrack using bonemeal 2022-09-19 14:03:32 +02:00
cora
c0a4796c0f Merge pull request 'Make the game respect mt "enable_damage" setting' (#2667) from damage_setting into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2667
2022-09-19 12:02:50 +00:00
cora
2efcb168b2 Make the game respect mt "enable_damage" setting 2022-09-19 13:59:24 +02:00
cora
86f9d17dfb Merge pull request 'Remove 5.3 check for get_natural_light function' (#2669) from mobs_remove_5.3_light into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2669
2022-09-19 11:58:42 +00:00
cora
9a95557ec8 Simplify within_limits function
so you don't need a cs degree to read it ^^
2022-09-19 13:56:39 +02:00
cora
df8c234def Check map limits before get_natural_light 2022-09-19 13:56:39 +02:00
cora
467ecc7c58 Remove 5.3 check for get_natural_light function
as 5.3 isn't supported anymore
2022-09-19 13:56:39 +02:00
cora
8320f1f756 Merge pull request 'Enable furnace minecart crafting and creative entry.' (#2671) from furnace_minecart into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2671
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-09-19 11:55:06 +00:00
PrairieWind
7451e4734f Enabled furnace minecart crafting and creative entry. 2022-09-18 13:32:45 -06:00
cora
f3bee72796 Merge pull request 'Move zombie visual size update to mcl_mobs' (#2664) from mobs_visual_size into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2664
2022-09-16 16:23:58 +00:00
cora
7f4443b76f Don't reset size for children 2022-09-16 18:22:09 +02:00
cora
ed8dc1d137 Move zombie visual size update to mcl_mobs 2022-09-16 18:22:09 +02:00
cora
5a5b83399c Merge pull request 'Fix displaying model element on MT 5.4' (#2662) from skins into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2662
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-09-16 16:09:38 +00:00
Johannes Fritz
f5cd23908f Fix displaying model element on MT 5.4 2022-09-16 18:09:15 +02:00
cora
28f5469989 Merge pull request 'Fix a variable typo causing problems with protection mods' (#2666) from fix_protection_mobs into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2666
2022-09-16 13:13:25 +00:00
cora
611d8808ac Fix a variable typo causing crashes with prot. mod 2022-09-16 15:11:52 +02:00
cora
015e755401 Merge pull request 'Fix issue with wrong lighting in caves' (#2657) from fix_cave_lighting into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2657
2022-09-16 13:10:40 +00:00
cora
642559c758 Fix issue with wrong lighting in caves 2022-09-16 15:09:32 +02:00
cora
103cde2db4 Merge pull request 'Fix invisibility potion when changing skin' (#2661) from potions into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2661
Reviewed-by: cora <cora@noreply.git.minetest.land>
2022-09-15 19:50:33 +00:00
Johannes Fritz
18f8768909 Fix invisibility potion when changing skin 2022-09-15 12:04:20 -05:00
cora
d91d01a67d Merge pull request 'Set version to 0.80 indev' (#2655) from 0.80-dev into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2655
2022-09-15 01:27:39 +00:00
PrairieWind
45c7b45df9 Set version to 0.80 indev 2022-09-14 15:53:00 -06:00
979 changed files with 21044 additions and 7924 deletions

1
.gitignore vendored
View File

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

View File

@ -33,6 +33,9 @@
* RandomLegoBrick * RandomLegoBrick
* SumianVoice * SumianVoice
* MrRar * MrRar
* talamh
* Faerraven
* AncientMariner
## Contributors ## Contributors
* Laurent Rocher * Laurent Rocher
@ -66,7 +69,6 @@
* Benjamin Schötz * Benjamin Schötz
* Doloment * Doloment
* Sydney Gems * Sydney Gems
* talamh
* Emily2255 * Emily2255
* Emojigit * Emojigit
* FinishedFragment * FinishedFragment
@ -85,6 +87,14 @@
* opfromthestart * opfromthestart
* snowyu * snowyu
* FaceDeer * FaceDeer
* Faerraven / Michieal
* FossFanatic
* Herbert West
* GuyLiner
* 3raven
* anarquimico
* TheOnlyJoeEnderman
* Ranko Saotome
## MineClone5 ## MineClone5
* kay27 * kay27
@ -95,7 +105,7 @@
* chmodsayshello * chmodsayshello
* 3raven * 3raven
* PrairieWind * PrairieWind
* Gustavo1 * Gustavo6046 / wallabra
* CableGuy67 * CableGuy67
* MrRar * MrRar
@ -154,6 +164,7 @@
* MysticTempest * MysticTempest
* RandomLegoBrick * RandomLegoBrick
* cora * cora
* Faerraven / Michieal
## Translations ## Translations
* Wuzzy * Wuzzy

View File

@ -2,7 +2,7 @@
An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils. An unofficial Minecraft-like game for Minetest. Forked from MineClone by davedevils.
Developed by many people. Not developed or endorsed by Mojang AB. Developed by many people. Not developed or endorsed by Mojang AB.
Version: 0.79 Version: 0.82 (in development)
### Gameplay ### Gameplay
You start in a randomly-generated world made entirely of cubes. You can explore You start in a randomly-generated world made entirely of cubes. You can explore

View File

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

View File

@ -5,6 +5,8 @@
-- Nodes in group "supported_node" can be placed on any node that does not -- Nodes in group "supported_node" can be placed on any node that does not
-- have the "airlike" drawtype. Carpets are an example of this type. -- have the "airlike" drawtype. Carpets are an example of this type.
local pairs = pairs
local math = math
local vector = vector local vector = vector
local facedir_to_dir = minetest.facedir_to_dir local facedir_to_dir = minetest.facedir_to_dir
@ -22,14 +24,16 @@ local add_item = minetest.add_item
-- We need this to do the exact same dropping node handling in our override -- We need this to do the exact same dropping node handling in our override
-- minetest.check_single_for_falling() function as in the builtin function. -- minetest.check_single_for_falling() function as in the builtin function.
-- --
---@param p Vector
local function drop_attached_node(p) local function drop_attached_node(p)
local n = get_node(p) local n = get_node(p)
local drops = get_node_drops(n, "") local drops = get_node_drops(n, "")
local def = registered_nodes[n.name] local def = registered_nodes[n.name]
if def and def.preserve_metadata then if def and def.preserve_metadata then
local oldmeta = get_meta(p):to_table().fields local oldmeta = get_meta(p):to_table().fields
-- Copy pos and node because the callback can modify them. -- Copy pos and node because the callback can modify them.
local pos_copy = vector.new(p) local pos_copy = vector.copy(p)
local node_copy = { name = n.name, param1 = n.param1, param2 = n.param2 } local node_copy = { name = n.name, param1 = n.param1, param2 = n.param2 }
local drop_stacks = {} local drop_stacks = {}
for k, v in pairs(drops) do for k, v in pairs(drops) do
@ -38,16 +42,18 @@ local function drop_attached_node(p)
drops = drop_stacks drops = drop_stacks
def.preserve_metadata(pos_copy, node_copy, oldmeta, drops) def.preserve_metadata(pos_copy, node_copy, oldmeta, drops)
end end
if def and def.sounds and def.sounds.fall then if def and def.sounds and def.sounds.fall then
core.sound_play(def.sounds.fall, {pos = p}, true) minetest.sound_play(def.sounds.fall, { pos = p }, true)
end end
remove_node(p) remove_node(p)
for _, item in pairs(drops) do for _, item in pairs(drops) do
local pos = { local pos = vector.offset(p,
x = p.x + math.random()/2 - 0.25, math.random() / 2 - 0.25,
y = p.y + math.random()/2 - 0.25, math.random() / 2 - 0.25,
z = p.z + math.random()/2 - 0.25, math.random() / 2 - 0.25
} )
add_item(pos, item) add_item(pos, item)
end end
end end
@ -90,4 +96,3 @@ function minetest.check_single_for_falling(pos)
return false return false
end end

View File

@ -12,6 +12,7 @@ mcl_damage = {
drown = {bypasses_armor = true}, drown = {bypasses_armor = true},
starve = {bypasses_armor = true, bypasses_magic = true}, starve = {bypasses_armor = true, bypasses_magic = true},
cactus = {}, cactus = {},
sweet_berry = {},
fall = {bypasses_armor = true}, fall = {bypasses_armor = true},
fly_into_wall = {bypasses_armor = true}, -- unused fly_into_wall = {bypasses_armor = true}, -- unused
out_of_world = {bypasses_armor = true, bypasses_magic = true, bypasses_invulnerability = true, bypasses_totem = true}, out_of_world = {bypasses_armor = true, bypasses_magic = true, bypasses_invulnerability = true, bypasses_totem = true},
@ -33,6 +34,8 @@ mcl_damage = {
} }
} }
local damage_enabled = minetest.settings:get_bool("enabled_damage",true)
function mcl_damage.register_modifier(func, priority) function mcl_damage.register_modifier(func, priority)
table.insert(mcl_damage.modifiers, {func = func, priority = priority or 0}) table.insert(mcl_damage.modifiers, {func = func, priority = priority or 0})
end end
@ -139,6 +142,7 @@ function mcl_damage.register_type(name, def)
end end
minetest.register_on_player_hpchange(function(player, hp_change, mt_reason) minetest.register_on_player_hpchange(function(player, hp_change, mt_reason)
if not damage_enabled then return 0 end
if hp_change < 0 then if hp_change < 0 then
if player:get_hp() <= 0 then if player:get_hp() <= 0 then
return 0 return 0
@ -149,6 +153,7 @@ minetest.register_on_player_hpchange(function(player, hp_change, mt_reason)
end, true) end, true)
minetest.register_on_player_hpchange(function(player, hp_change, mt_reason) 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 if player:get_hp() > 0 then
mt_reason.approved = true mt_reason.approved = true
if hp_change < 0 then if hp_change < 0 then

View File

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

View File

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

View File

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

View File

@ -130,10 +130,10 @@ local function add_particles(pos, radius)
time = 0.125, time = 0.125,
minpos = pos, minpos = pos,
maxpos = pos, maxpos = pos,
minvel = {x = -radius, y = -radius, z = -radius}, minvel = vector.new(-radius, -radius, -radius),
maxvel = {x = radius, y = radius, z = radius}, maxvel = vector.new(radius, radius, radius),
minacc = vector.new(), minacc = vector.zero(),
maxacc = vector.new(), maxacc = vector.zero(),
minexptime = 0.5, minexptime = 0.5,
maxexptime = 1.0, maxexptime = 1.0,
minsize = radius * 0.5, minsize = radius * 0.5,
@ -333,7 +333,8 @@ local function trace_explode(pos, strength, raydirs, radius, info, direct, sourc
end end
if sleep_formspec_doesnt_close_mt53 then if sleep_formspec_doesnt_close_mt53 then
minetest.after(0.3, function() -- 0.2 is minimum delay for closing old formspec and open died formspec -- TODO: REMOVE THIS IN THE FUTURE minetest.after(0.3,
function() -- 0.2 is minimum delay for closing old formspec and open died formspec -- TODO: REMOVE THIS IN THE FUTURE
if not obj:is_player() then if not obj:is_player() then
return return
end end
@ -396,15 +397,16 @@ local function trace_explode(pos, strength, raydirs, radius, info, direct, sourc
-- Update falling nodes -- Update falling nodes
for a = 1, #airs do for a = 1, #airs do
local p = airs[a] local p = airs[a]
check_for_falling({x=p.x, y=p.y+1, z=p.z}) check_for_falling(vector.offset(p, 0, 1, 0))
end end
for f = 1, #fires do for f = 1, #fires do
local p = fires[f] local p = fires[f]
check_for_falling({x=p.x, y=p.y+1, z=p.z}) check_for_falling(vector.offset(p, 0, 1, 0))
end end
-- Log explosion -- Log explosion
minetest.log("action", "Explosion at "..pos_to_string(pos).." with strength "..strength.." and radius "..radius) minetest.log("action", "Explosion at " .. pos_to_string(pos) .. " with strength " .. strength .. " and radius " ..
radius)
end end
-- Create an explosion with strength at pos. -- Create an explosion with strength at pos.
@ -428,6 +430,11 @@ end
-- griefing - If true, the explosion will destroy nodes (default: true) -- griefing - If true, the explosion will destroy nodes (default: true)
-- grief_protected - If true, the explosion will also destroy nodes which have -- grief_protected - If true, the explosion will also destroy nodes which have
-- been protected (default: false) -- been protected (default: false)
---@param pos Vector
---@param strength number
---@param info {drop_chance: number, max_blast_resistance: number, sound: boolean, particles: boolean, fire: boolean, griefing: boolean, grief_protected: boolean}
---@param direct? ObjectRef
---@param source? ObjectRef
function mcl_explosions.explode(pos, strength, info, direct, source) function mcl_explosions.explode(pos, strength, info, direct, source)
if info == nil then if info == nil then
info = {} info = {}

View File

@ -138,6 +138,7 @@ mcl_vars.mg_nether_min = -29067 -- Carefully chosen to be at a mapchunk border
mcl_vars.mg_nether_max = mcl_vars.mg_nether_min + 128 mcl_vars.mg_nether_max = mcl_vars.mg_nether_min + 128
mcl_vars.mg_bedrock_nether_bottom_min = mcl_vars.mg_nether_min mcl_vars.mg_bedrock_nether_bottom_min = mcl_vars.mg_nether_min
mcl_vars.mg_bedrock_nether_top_max = mcl_vars.mg_nether_max mcl_vars.mg_bedrock_nether_top_max = mcl_vars.mg_nether_max
mcl_vars.mg_nether_deco_max = mcl_vars.mg_nether_max -11 -- this is so ceiling decorations don't spill into other biomes as bedrock generation calls minetest.generate_decorations to put netherrack under the bedrock
if not superflat then if not superflat then
mcl_vars.mg_bedrock_nether_bottom_max = mcl_vars.mg_bedrock_nether_bottom_min + 4 mcl_vars.mg_bedrock_nether_bottom_max = mcl_vars.mg_bedrock_nether_bottom_min + 4
mcl_vars.mg_bedrock_nether_top_min = mcl_vars.mg_bedrock_nether_top_max - 4 mcl_vars.mg_bedrock_nether_top_min = mcl_vars.mg_bedrock_nether_top_max - 4

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 B

View File

@ -22,6 +22,29 @@ function table.update_nil(t, ...)
return t return t
end end
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)
local selected_module = LOG_MODULE
if module then
selected_module = module
end
if (bypass_default_logger or LOGGING_ON) and message then
minetest.log(selected_module .. " " .. message)
end
end
function mcl_util.file_exists(name)
if type(name) ~= "string" then return end
local f = io.open(name)
if not f then
return false
end
f:close()
return true
end
-- Based on minetest.rotate_and_place -- Based on minetest.rotate_and_place
--[[ --[[
@ -590,10 +613,12 @@ function mcl_util.get_object_name(object)
end end
function mcl_util.replace_mob(obj, mob) function mcl_util.replace_mob(obj, mob)
if not obj then return end
local rot = obj:get_yaw() local rot = obj:get_yaw()
local pos = obj:get_pos() local pos = obj:get_pos()
obj:remove() obj:remove()
obj = minetest.add_entity(pos, mob) obj = minetest.add_entity(pos, mob)
if not obj then return end
obj:set_yaw(rot) obj:set_yaw(rot)
return obj return obj
end end
@ -610,3 +635,96 @@ function mcl_util.get_pointed_thing(player, liquid)
end end
end end
end end
-- This following part is 2 wrapper functions + helpers for
-- object:set_bones
-- and player:set_properties preventing them from being resent on
-- every globalstep when they have not changed.
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
end
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
break
end
end
else
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
end
end
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
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_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 }
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_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())
if changed then
obj:set_properties(p)
end
end
function mcl_util.set_bone_position(obj, bone, pos, rot)
local current_pos, current_rot = obj:get_bone_position(bone)
local pos_equal = not pos or vector.equals(vector.round(current_pos), vector.round(pos))
local rot_equal = not rot or vector.equals(vector.round(current_rot), vector.round(rot))
if not pos_equal or not rot_equal then
obj:set_bone_position(bone, pos or current_pos, rot or current_rot)
end
end

View File

@ -56,7 +56,7 @@ end
local function set_attach(boat) local function set_attach(boat)
boat._driver:set_attach(boat.object, "", boat._driver:set_attach(boat.object, "",
{x = 0, y = 0.42, z = -1}, {x = 0, y = 0, z = 0}) {x = 0, y = 1.5, z = 1}, {x = 0, y = 0, z = 0})
end end
local function set_double_attach(boat) local function set_double_attach(boat)
@ -65,9 +65,13 @@ local function set_double_attach(boat)
boat._passenger:set_attach(boat.object, "", boat._passenger:set_attach(boat.object, "",
{x = 0, y = 0.42, z = -2.2}, {x = 0, y = 0, z = 0}) {x = 0, y = 0.42, z = -2.2}, {x = 0, y = 0, z = 0})
end end
local function set_choat_attach(boat)
boat._driver:set_attach(boat.object, "",
{x = 0, y = 1.5, z = 1}, {x = 0, y = 0, z = 0})
end
local function attach_object(self, obj) local function attach_object(self, obj)
if self._driver then if self._driver and not self._inv_id then
if self._driver:is_player() then if self._driver:is_player() then
self._passenger = obj self._passenger = obj
else else
@ -77,8 +81,12 @@ local function attach_object(self, obj)
set_double_attach(self) set_double_attach(self)
else else
self._driver = obj self._driver = obj
if self._inv_id then
set_choat_attach(self)
else
set_attach(self) set_attach(self)
end end
end
local visual_size = get_visual_size(obj) local visual_size = get_visual_size(obj)
local yaw = self.object:get_yaw() local yaw = self.object:get_yaw()
@ -101,6 +109,7 @@ local function attach_object(self, obj)
end end
local function detach_object(obj, change_pos) local function detach_object(obj, change_pos)
if not obj or not obj:get_pos() then return end
obj:set_detach() obj:set_detach()
obj:set_properties({visual_size = get_visual_size(obj)}) obj:set_properties({visual_size = get_visual_size(obj)})
if obj:is_player() then if obj:is_player() then
@ -123,11 +132,11 @@ local boat = {
pointable = true, pointable = true,
-- Warning: Do not change the position of the collisionbox top surface, -- Warning: Do not change the position of the collisionbox top surface,
-- lowering it causes the boat to fall through the world if underwater -- lowering it causes the boat to fall through the world if underwater
collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5}, collisionbox = {-0.5, -0.15, -0.5, 0.5, 0.55, 0.5},
selectionbox = {-0.7, -0.35, -0.7, 0.7, 0.3, 0.7}, selectionbox = {-0.7, -0.15, -0.7, 0.7, 0.55, 0.7},
visual = "mesh", visual = "mesh",
mesh = "mcl_boats_boat.b3d", mesh = "mcl_boats_boat.b3d",
textures = {"mcl_boats_texture_oak_boat.png", "mcl_boats_texture_oak_boat.png", "mcl_boats_texture_oak_boat.png", "mcl_boats_texture_oak_boat.png", "mcl_boats_texture_oak_boat.png"}, textures = { "mcl_boats_texture_oak_boat.png", "blank.png" },
visual_size = boat_visual_size, visual_size = boat_visual_size,
hp_max = boat_max_hp, hp_max = boat_max_hp,
damage_texture_modifier = "^[colorize:white:0", damage_texture_modifier = "^[colorize:white:0",
@ -138,7 +147,7 @@ local boat = {
_last_v = 0, -- Temporary speed variable _last_v = 0, -- Temporary speed variable
_removed = false, -- If true, boat entity is considered removed (e.g. after punch) and should be ignored _removed = false, -- If true, boat entity is considered removed (e.g. after punch) and should be ignored
_itemstring = "mcl_boats:boat", -- Itemstring of the boat item (implies boat type) _itemstring = "mcl_boats:boat", -- Itemstring of the boat item (implies boat type)
_animation = 0, -- 0: not animated; 1: paddling forwards; -1: paddling forwards _animation = 0, -- 0: not animated; 1: paddling forwards; -1: paddling backwards
_regen_timer = 0, _regen_timer = 0,
_damage_anim = 0, _damage_anim = 0,
} }
@ -161,8 +170,14 @@ function boat.on_activate(self, staticdata, dtime_s)
self._last_v = self._v self._last_v = self._v
self._itemstring = data.itemstring self._itemstring = data.itemstring
while #data.textures < 5 do -- Update the texutes for existing old boat entity instances.
table.insert(data.textures, data.textures[1]) -- Maybe remove this in the future.
if #data.textures ~= 2 then
local has_chest = self._itemstring:find("chest")
data.textures = {
data.textures[1]:gsub("_chest", ""),
has_chest and "mcl_chests_normal.png" or "blank.png"
}
end end
self.object:set_properties({textures = data.textures}) self.object:set_properties({textures = data.textures})
@ -413,13 +428,18 @@ end
-- Register one entity for all boat types -- Register one entity for all boat types
minetest.register_entity("mcl_boats:boat", boat) minetest.register_entity("mcl_boats:boat", boat)
local boat_ids = { "boat", "boat_spruce", "boat_birch", "boat_jungle", "boat_acacia", "boat_dark_oak", "boat_obsidian" } local cboat = table.copy(boat)
local names = { S("Oak Boat"), S("Spruce Boat"), S("Birch Boat"), S("Jungle Boat"), S("Acacia Boat"), S("Dark Oak Boat"), S("Obsidian Boat") } cboat.textures = { "mcl_boats_texture_oak_chest_boat.png", "mcl_chests_normal.png" }
local craftstuffs = {} cboat._itemstring = "mcl_boats:chest_boat"
if minetest.get_modpath("mcl_core") then cboat.collisionbox = {-0.5, -0.15, -0.5, 0.5, 0.75, 0.5}
craftstuffs = { "mcl_core:wood", "mcl_core:sprucewood", "mcl_core:birchwood", "mcl_core:junglewood", "mcl_core:acaciawood", "mcl_core:darkwood", "mcl_core:obsidian" } cboat.selectionbox = {-0.7, -0.15, -0.7, 0.7, 0.75, 0.7}
end
local images = { "oak", "spruce", "birch", "jungle", "acacia", "dark_oak", "obsidian" } minetest.register_entity("mcl_boats:chest_boat", cboat)
mcl_entity_invs.register_inv("mcl_boats:chest_boat","Boat",27)
local boat_ids = { "boat", "boat_spruce", "boat_birch", "boat_jungle", "boat_acacia", "boat_dark_oak", "boat_obsidian", "boat_mangrove", "chest_boat", "chest_boat_spruce", "chest_boat_birch", "chest_boat_jungle", "chest_boat_acacia", "chest_boat_dark_oak", "chest_boat_mangrove" }
local names = { S("Oak Boat"), S("Spruce Boat"), S("Birch Boat"), S("Jungle Boat"), S("Acacia Boat"), S("Dark Oak Boat"), S("Obsidian Boat"), S("Mangrove Boat"), S("Oak Chest Boat"), S("Spruce Chest Boat"), S("Birch Chest Boat"), S("Jungle Chest Boat"), S("Acacia Chest Boat"), S("Dark Oak Chest Boat"), S("Mangrove Chest Boat") }
local craftstuffs = { "mcl_core:wood", "mcl_core:sprucewood", "mcl_core:birchwood", "mcl_core:junglewood", "mcl_core:acaciawood", "mcl_core:darkwood", "mcl_core:obsidian", "mcl_mangrove:mangrove_wood" }
for b=1, #boat_ids do for b=1, #boat_ids do
local itemstring = "mcl_boats:"..boat_ids[b] local itemstring = "mcl_boats:"..boat_ids[b]
@ -435,6 +455,21 @@ for b=1, #boat_ids do
end end
tt_help = S("Water vehicle") tt_help = S("Water vehicle")
local inventory_image
local texture
local id = boat_ids[b]
if id:find("chest") then
if id == "chest_boat" then id = "oak" end
local id = id:gsub("chest_boat_", "")
inventory_image = "mcl_boats_" .. id .. "_chest_boat.png"
texture = "mcl_boats_texture_" .. id .. "_boat.png"
else
if id == "boat" then id = "oak" end
local id = id:gsub("boat_", "")
inventory_image = "mcl_boats_" .. id .. "_boat.png"
texture = "mcl_boats_texture_" .. id .. "_boat.png"
end
minetest.register_craftitem(itemstring, { minetest.register_craftitem(itemstring, {
description = names[b], description = names[b],
_tt_help = tt_help, _tt_help = tt_help,
@ -442,7 +477,7 @@ for b=1, #boat_ids do
_doc_items_entry_name = helpname, _doc_items_entry_name = helpname,
_doc_items_longdesc = longdesc, _doc_items_longdesc = longdesc,
_doc_items_usagehelp = usagehelp, _doc_items_usagehelp = usagehelp,
inventory_image = "mcl_boats_"..images[b].."_boat.png", inventory_image = inventory_image,
liquids_pointable = true, liquids_pointable = true,
groups = { boat = 1, transport = 1}, groups = { boat = 1, transport = 1},
stack_max = 1, stack_max = 1,
@ -469,10 +504,15 @@ for b=1, #boat_ids do
else else
pos = vector.add(pos, vector.multiply(dir, boat_y_offset_ground)) pos = vector.add(pos, vector.multiply(dir, boat_y_offset_ground))
end end
local boat = minetest.add_entity(pos, "mcl_boats:boat") local boat_ent = "mcl_boats:boat"
local texture = "mcl_boats_texture_"..images[b].."_boat.png" local chest_tex = "blank.png"
if itemstring:find("chest") then
boat_ent = "mcl_boats:chest_boat"
chest_tex = "mcl_chests_normal.png"
end
local boat = minetest.add_entity(pos, boat_ent)
boat:get_luaentity()._itemstring = itemstring boat:get_luaentity()._itemstring = itemstring
boat:set_properties({textures = { texture, texture, texture, texture, texture }}) boat:set_properties({ textures = { texture, chest_tex } })
boat:set_yaw(placer:get_look_horizontal()) boat:set_yaw(placer:get_look_horizontal())
if not minetest.is_creative_enabled(placer:get_player_name()) then if not minetest.is_creative_enabled(placer:get_player_name()) then
itemstack:take_item() itemstack:take_item()
@ -492,6 +532,14 @@ for b=1, #boat_ids do
}) })
local c = craftstuffs[b] local c = craftstuffs[b]
if not itemstring:find("chest") then
minetest.register_craft({
output = itemstring:gsub(":boat",":chest_boat"),
recipe = {
{"mcl_chests:chest"},
{itemstring},
},
})
minetest.register_craft({ minetest.register_craft({
output = itemstring, output = itemstring,
recipe = { recipe = {
@ -500,6 +548,7 @@ for b=1, #boat_ids do
}, },
}) })
end end
end
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",

View File

@ -1,7 +1,5 @@
name = mcl_boats name = mcl_boats
author = PilzAdam author = PilzAdam
description = Adds drivable boats. description = Adds drivable boats.
depends = mcl_player, flowlib, mcl_title depends = mcl_player, flowlib, mcl_title, mcl_entity_invs
optional_depends = mcl_core, doc_identifier optional_depends = mcl_core, doc_identifier

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -1,3 +1,5 @@
local enable_damage = minetest.settings:get_bool("enable_damage")
function mcl_burning.get_storage(obj) function mcl_burning.get_storage(obj)
return obj:is_player() and mcl_burning.storage[obj] or obj:get_luaentity() return obj:is_player() and mcl_burning.storage[obj] or obj:get_luaentity()
end end
@ -77,7 +79,7 @@ end
-- The effective burn duration is modified by obj's armor protection. -- The effective burn duration is modified by obj's armor protection.
-- If obj was already burning, its burn duration is updated if the current -- If obj was already burning, its burn duration is updated if the current
-- duration is less than burn_time. -- duration is less than burn_time.
-- If obj is dead, fireproof or a creative player, this function does nothing. -- If obj is dead, fireproof or enable_damage is disabled, this function does nothing.
-- --
function mcl_burning.set_on_fire(obj, burn_time) function mcl_burning.set_on_fire(obj, burn_time)
if obj:get_hp() < 0 then if obj:get_hp() < 0 then
@ -89,8 +91,9 @@ function mcl_burning.set_on_fire(obj, burn_time)
return return
end end
if obj:is_player() and minetest.is_creative_enabled(obj:get_player_name()) then if obj:is_player() and not enable_damage then
burn_time = 0 burn_time = 0
return
else else
local max_fire_prot_lvl = 0 local max_fire_prot_lvl = 0
local inv = mcl_util.get_inventory(obj) local inv = mcl_util.get_inventory(obj)

View File

@ -0,0 +1,36 @@
# mcl_dripping
Dripping Mod by kddekadenz, modified for MineClone 2 by Wuzzy, NO11 and AFCM
## Manual
- drops are generated rarely under solid nodes
- they will stay some time at the generated block and than they fall down
- when they collide with the ground, a sound is played and they are destroyed
Water and Lava have builtin drops registered.
## License
code & sounds: CC0
## API
```lua
mcl_dripping.register_drop({
-- The group the liquid's nodes belong to
liquid = "water",
-- The texture used (particles will take a random 2x2 area of it)
texture = "default_water_source_animated.png",
-- Define particle glow, ranges from `0` to `minetest.LIGHT_MAX`
light = 1,
-- The nodes (or node group) the particles will spawn under
nodes = { "group:opaque", "group:leaves" },
-- The sound that will be played then the particle detaches from the roof, see SimpleSoundSpec in lua_api.txt
sound = "drippingwater_drip",
-- The interval for the ABM to run
interval = 60,
-- The chance of the ABM
chance = 10,
})
```

View File

@ -3,53 +3,99 @@
-- License of code, textures & sounds: CC0 -- License of code, textures & sounds: CC0
local math = math local math = math
local function make_drop(pos,liquid,sound,interval)
mcl_dripping = {}
---@param pos Vector
---@param liquid string
---@param sound SimpleSoundSpec
---@param interval integer
---@param texture string
local function make_drop(pos, liquid, sound, interval, texture)
local pt = { local pt = {
velocity = vector.new(0,0,0), velocity = vector.zero(),
collision_removal = false, collision_removal = false,
} }
local t = math.random() + math.random(1, interval) local t = math.random() + math.random(1, interval)
minetest.after(t, function() minetest.after(t, function()
local x, z = math.random(-45, 45) / 100, math.random(-45, 45) / 100 local x, z = math.random(-45, 45) / 100, math.random(-45, 45) / 100
pt.pos = vector.offset(pos, x, -0.52, z) pt.pos = vector.offset(pos, x, -0.52, z)
pt.acceleration = vector.new(0,0,0) pt.acceleration = vector.zero()
pt.collisiondetection = false pt.collisiondetection = false
pt.expirationtime = t pt.expirationtime = t
pt.texture="[combine:2x2:" .. -math.random(1, 16) .. "," .. -math.random(1, 16) .. "=default_" .. liquid .. "_source_animated.png" pt.texture = "[combine:2x2:" ..
-math.random(1, 16) .. "," .. -math.random(1, 16) .. "=" .. texture
minetest.add_particle(pt) minetest.add_particle(pt)
minetest.after(t, function() minetest.after(t, function()
pt.acceleration = vector.new(0, -5, 0) pt.acceleration = vector.new(0, -5, 0)
pt.collisiondetection = true pt.collisiondetection = true
pt.expirationtime = math.random() + math.random(1, interval / 2) pt.expirationtime = math.random() + math.random(1, interval / 2)
minetest.add_particle(pt) minetest.add_particle(pt)
minetest.sound_play({name = "drippingwater_" .. sound .. "drip"}, {pos = pos, gain = 0.5, max_hear_distance = 8}, true)
minetest.sound_play(sound, { pos = pos, gain = 0.5, max_hear_distance = 8 },
true)
end) end)
end) end)
end end
local function register_drop(liquid, glow, sound, nodes, interval, chance) ---@class mcl_dripping_drop_definition
---@field liquid string The group the liquid's nodes belong to
---@field texture string The texture used (particles will take a random 2x2 area of it)
---@field light integer Define particle glow, ranges from `0` to `minetest.LIGHT_MAX`
---@field nodes string[] The nodes (or node group) the particles will spawn under
---@field interval integer The interval for the ABM to run
---@field chance integer The chance of the ABM
---@field sound SimpleSoundSpec The sound that will be played then the particle detaches from the roof
---@param def mcl_dripping_drop_definition
function mcl_dripping.register_drop(def)
minetest.register_abm({ minetest.register_abm({
label = "Create drops", label = "Create drops",
nodenames = nodes, nodenames = def.nodes,
neighbors = {"group:" .. liquid}, neighbors = { "group:" .. def.liquid },
interval = interval, interval = def.interval,
chance = chance, chance = def.chance,
action = function(pos) action = function(pos)
local r = math.ceil(interval / 20) local below = minetest.get_node(vector.offset(pos,0,-1,0)).name
local nn=minetest.find_nodes_in_area(vector.offset(pos,-r,0,-r),vector.offset(pos,r,0,r),nodes) if below ~= "air" then return end
local r = math.ceil(def.interval / 20)
local nn = minetest.find_nodes_in_area(vector.offset(pos, -r, 0, -r), vector.offset(pos, r, 0, r), def.nodes)
--start a bunch of particle cycles to be able to get away --start a bunch of particle cycles to be able to get away
--with longer abm cycles --with longer abm cycles
table.shuffle(nn) table.shuffle(nn)
for i = 1, math.random(#nn) do for i = 1, math.random(#nn) do
if minetest.get_item_group(minetest.get_node(vector.offset(nn[i], 0, 1, 0)).name, liquid) ~= 0 if minetest.get_item_group(minetest.get_node(vector.offset(nn[i], 0, 1, 0)).name, def.liquid) ~= 0 then
and minetest.get_node(vector.offset(nn[i], 0, -1, 0)).name == "air" then make_drop(nn[i], def.liquid, def.sound, def.interval, def.texture)
make_drop(nn[i],liquid,sound,interval)
end end
end end
end, end,
}) })
end end
register_drop("water", 1, "", {"group:opaque", "group:leaves"},60,10) mcl_dripping.register_drop({
register_drop("lava", math.max(7, minetest.registered_nodes["mcl_core:lava_source"].light_source - 3), "lava", {"group:opaque"},60,10) liquid = "water",
texture = "default_water_source_animated.png",
light = 1,
nodes = { "group:opaque", "group:leaves" },
sound = "drippingwater_drip",
interval = 60.3,
chance = 10,
})
mcl_dripping.register_drop({
liquid = "lava",
texture = "default_lava_source_animated.png",
light = math.max(7, minetest.registered_nodes["mcl_core:lava_source"].light_source - 3),
nodes = { "group:opaque" },
sound = "drippingwater_lavadrip",
interval = 110.1,
chance = 10,
})

View File

@ -1,29 +0,0 @@
Dripping Mod
by kddekadenz
modified for MineClone 2 by Wuzzy and NO11
Installing instructions:
1. Copy the mcl_dripping mod folder into games/gamemode/mods
2. Start game and enjoy :)
Manual:
-> drops are generated rarely under solid nodes
-> they will stay some time at the generated block and than they fall down
-> when they collide with the ground, a sound is played and they are destroyed
License:
code & sounds: CC0
Changelog:
16.04.2012 - first release
28.04.2012 - drops are now 3D; added lava drops; fixed generating of drops (not at edges now)

View File

@ -0,0 +1,13 @@
mcl_entity_invs
===============
Inventories for your entities. It's simple. Depend on mcl_entity_invs and register your entity like so:
* mcl_entity_invs.register_inv("entity:name","Title shown in formspec",inventory_size,disable_on_righclick)
*If disable_on_righclick is true other mods can handle when to show the inventory themselves
* The inventory size can be set dynamically by initializing it with an explicit nil
* mcl_entity_invs.show_inv_form(entity,clicker,[formspec text])
* formspec_text is an additional text that is put after the title
It works by setting up a detached inventory per entity which is accessed by an id/hash generated from the entities position at creation, the progressed gametime at creation and a random salt.

View File

@ -0,0 +1,210 @@
mcl_entity_invs = {}
local open_invs = {}
local function mcl_log (message)
mcl_util.mcl_log (message, "[Entity Invs]")
end
local function check_distance(inv,player,count)
for _,o in pairs(minetest.get_objects_inside_radius(player:get_pos(),5)) do
local l = o:get_luaentity()
if l and l._inv_id and inv:get_location().name == l._inv_id then return count end
end
return 0
end
local inv_callbacks = {
allow_take = function(inv, listname, index, stack, player)
return check_distance(inv,player,stack:get_count())
end,
allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
return check_distance(inv,player,count)
end,
allow_put = function(inv, listname, index, stack, player)
return check_distance(inv,player,stack:get_count())
end,
}
function mcl_entity_invs.load_inv(ent,size)
mcl_log("load_inv")
if not ent._inv_id then return end
mcl_log("load_inv 2")
local inv = minetest.get_inventory({type="detached", name=ent._inv_id})
if not inv then
mcl_log("load_inv 3")
inv = minetest.create_detached_inventory(ent._inv_id, inv_callbacks)
inv:set_size("main", size)
if ent._items then
inv:set_list("main",ent._items)
end
else
mcl_log("load_inv 4")
end
return inv
end
function mcl_entity_invs.save_inv(ent)
if ent._inv then
ent._items = {}
for i,it in ipairs(ent._inv:get_list("main")) do
ent._items[i] = it:to_string()
end
minetest.remove_detached_inventory(ent._inv_id)
ent._inv = nil
end
end
local function load_default_formspec (ent, text)
text = text or ""
local invent_size = ent._inv_size
local div_by_two = invent_size % 2 == 0
local div_by_three = invent_size % 3 == 0
--mcl_log("Div by 3: ".. tostring(div_by_three))
--mcl_log("Div by 2: ".. tostring(div_by_two))
--mcl_log("invent_size: ".. tostring(invent_size))
local rows = 3
if invent_size > 18 or (div_by_three == true and invent_size > 8) then
--mcl_log("Div by 3")
rows = 3
elseif (div_by_two == true and invent_size > 3) or invent_size > 9 then
--mcl_log("Div by 2")
rows = 2
else
--mcl_log("Not div by 2 or 3")
rows = 1
end
--local rows = 3
local cols = (math.ceil(ent._inv_size/rows))
local spacing = (9 - cols) / 2
local formspec = "size[9,8.75]"
.. "label[0,0;" .. minetest.formspec_escape(
minetest.colorize("#313131", ent._inv_title .. " ".. text)) .. "]"
.. "list[detached:"..ent._inv_id..";main;"..spacing..",0.5;"..cols..","..rows..";]"
.. mcl_formspec.get_itemslot_bg(spacing,0.5,cols,rows)
.. "label[0,4.0;" .. minetest.formspec_escape(
minetest.colorize("#313131", "Inventory")) .. "]"
.. "list[current_player;main;0,4.5;9,3;9]"
.. mcl_formspec.get_itemslot_bg(0,4.5,9,3)
.. "list[current_player;main;0,7.74;9,1;]"
.. mcl_formspec.get_itemslot_bg(0,7.74,9,1)
.. "listring[detached:"..ent._inv_id..";main]"
.. "listring[current_player;main]"
return formspec
end
function mcl_entity_invs.show_inv_form(ent,player,text)
if not ent._inv_id then return end
if not open_invs[ent] then
open_invs[ent] = 0
end
ent._inv = mcl_entity_invs.load_inv(ent,ent._inv_size)
open_invs[ent] = open_invs[ent] + 1
local playername = player:get_player_name()
minetest.show_formspec(playername, ent._inv_id, load_default_formspec (ent, text))
end
local function drop_inv(ent)
if not ent._items then return end
local pos = ent.object:get_pos()
for i,it in pairs(ent._items) do
local p = vector.add(pos,vector.new(math.random() - 0.5, math.random()-0.5, math.random()-0.5))
minetest.add_item(p,it)
end
ent._items = nil
end
local function on_remove(self,killer,oldf)
mcl_entity_invs.save_inv(self)
drop_inv(self)
if oldf then return oldf(self,killer) end
end
minetest.register_on_player_receive_fields(function(player, formname, fields)
for k,v in pairs(open_invs) do
if formname == k._inv_id then
open_invs[k] = open_invs[k] - 1
if open_invs[k] < 1 then
mcl_entity_invs.save_inv(k)
open_invs[k] = nil
end
end
end
end)
function mcl_entity_invs.register_inv(entity_name,show_name,size,no_on_righclick,no_sneak)
assert(minetest.registered_entities[entity_name],"mcl_entity_invs.register_inv called with invalid entity: "..tostring(entity_name))
minetest.registered_entities[entity_name]._inv_size = size
minetest.registered_entities[entity_name]._inv_title = show_name
local old_oa = minetest.registered_entities[entity_name].on_activate
minetest.registered_entities[entity_name].on_activate = function(self,staticdata,dtime_s)
local r
if old_oa then r=old_oa(self,staticdata,dtime_s) end
local d = minetest.deserialize(staticdata)
if type(d) == "table" and d._inv_id then
self._inv_id = d._inv_id
self._items = d._items
self._inv_size = d._inv_size
else
self._inv_id="entity_inv_"..minetest.sha1(minetest.get_gametime()..minetest.pos_to_string(self.object:get_pos())..tostring(math.random()))
--gametime and position for collision safety and math.random salt to protect against position brute-force
end
return r
end
if not no_on_righclick then
local old_rc = minetest.registered_entities[entity_name].on_rightclick
minetest.registered_entities[entity_name].on_rightclick = function(self,clicker)
if no_sneak or clicker:get_player_control().sneak then
mcl_entity_invs.show_inv_form(self,clicker,"")
if not no_sneak then return end
end
if old_rc then return old_rc(self,clicker) end
end
end
local old_gsd = minetest.registered_entities[entity_name].get_staticdata
minetest.registered_entities[entity_name].get_staticdata = function(self)
local old_sd = old_gsd(self)
local d = minetest.deserialize(old_sd)
assert(type(d) == "table","mcl_entity_invs currently only works with entities that return a (serialized) table in get_staticdata. "..tostring(self.name).." returned: "..tostring(old_sd))
d._inv_id = self._inv_id
d._inv_size = self._inv_size
d._items = {}
if self._items then
for i,it in ipairs(self._items) do
d._items[i] = it
end
end
return minetest.serialize(d)
end
local old_ode = minetest.registered_entities[entity_name].on_deactivate
minetest.registered_entities[entity_name].on_deactivate = function(self,removal)
mcl_entity_invs.save_inv(self)
if removal then
on_remove(self)
end
if old_ode then return old_ode(self,removal) end
end
local old_od = minetest.registered_entities[entity_name].on_death
minetest.registered_entities[entity_name].on_death = function(self,killer)
if not self.is_mob then
on_remove(self,killer,old_od)
end
end
local old_odi = minetest.registered_entities[entity_name].on_die
minetest.registered_entities[entity_name].on_die = function(self,killer)
if self.is_mob then
on_remove(self,killer,old_od)
end
end
end

View File

@ -0,0 +1,3 @@
name = mcl_entity_invs
author = cora
depends = mcl_formspec

View File

@ -26,3 +26,9 @@ http://minetest.net/
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO. 0. You just DO WHAT THE FUCK YOU WANT TO.
---------
Alterations and contributions are released under GNU GPLv3 after 11/11/2022 and for contributors:
AncientMariner/ancientmarinerdev

View File

@ -6,6 +6,16 @@ local pool = {}
local tick = false local tick = false
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)
end
end
minetest.register_on_joinplayer(function(player) minetest.register_on_joinplayer(function(player)
local name local name
name = player:get_player_name() name = player:get_player_name()
@ -375,6 +385,116 @@ local function cxcz(o, cw, one, zero)
return o return o
end end
local function hopper_take_item (self, pos)
--mcl_log("self.itemstring: ".. self.itemstring)
--mcl_log("self.itemstring: ".. minetest.pos_to_string(pos))
local objs = minetest.get_objects_inside_radius(pos, 2)
if objs and self.itemstring then
--mcl_log("there is an itemstring. Number of objs: ".. #objs)
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()))
local inv = mcl_entity_invs.load_inv(ent,5)
if not inv then
mcl_log("No inv")
return false
end
local current_itemstack = ItemStack(self.itemstring)
mcl_log("inv. size: " .. ent._inv_size)
if inv:room_for_item("main", current_itemstack) then
mcl_log("Room")
inv:add_item("main", current_itemstack)
self.object:get_luaentity().itemstring = ""
self.object:remove()
taken_items = true
else
mcl_log("no Room")
end
if not taken_items then
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
local stack = inv:get_stack("main", i)
mcl_log("i: " .. tostring(i))
mcl_log("Items remaining: " .. items_remaining)
mcl_log("Name: " .. tostring(stack:get_name()))
if current_itemstack:get_name() == stack:get_name() then
mcl_log("We have a match. Name: " .. tostring(stack:get_name()))
local room_for = stack:get_stack_max() - stack:get_count()
mcl_log("Room for: " .. tostring(room_for))
if room_for == 0 then
-- Do nothing
mcl_log("No room")
elseif room_for < items_remaining then
mcl_log("We have more items remaining than space")
items_remaining = items_remaining - room_for
stack:set_count(stack:get_stack_max())
inv:set_stack("main", i, stack)
taken_items = true
else
local new_stack_size = stack:get_count() + items_remaining
stack:set_count(new_stack_size)
mcl_log("We have more than enough space. Now holds: " .. new_stack_size)
inv:set_stack("main", i, stack)
items_remaining = 0
self.object:get_luaentity().itemstring = ""
self.object:remove()
taken_items = true
break
end
mcl_log("Count: " .. tostring(stack:get_count()))
mcl_log("stack max: " .. tostring(stack:get_stack_max()))
--mcl_log("Is it empty: " .. stack:to_string())
end
if i == ent._inv_size and taken_items then
mcl_log("We are on last item and still have items left. Set final stack size: " .. items_remaining)
current_itemstack:set_count(items_remaining)
--mcl_log("Itemstack2: " .. current_itemstack:to_string())
self.itemstring = current_itemstack:to_string()
end
end
end
--Add in, and delete
if taken_items then
mcl_log("Saving")
mcl_entity_invs.save_inv(ent)
return taken_items
else
mcl_log("No need to save")
end
end
end
end
return false
end
minetest.register_entity(":__builtin:item", { minetest.register_entity(":__builtin:item", {
initial_properties = { initial_properties = {
hp_max = 1, hp_max = 1,
@ -648,6 +768,12 @@ minetest.register_entity(":__builtin:item", {
end end
local p = self.object:get_pos() 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 node = minetest.get_node_or_nil(p)
local in_unloaded = (node == nil) local in_unloaded = (node == nil)

View File

@ -677,7 +677,8 @@ register_minecart(
{ "mcl_chests_normal.png", "mcl_minecarts_minecart.png" }, { "mcl_chests_normal.png", "mcl_minecarts_minecart.png" },
"mcl_minecarts_minecart_chest.png", "mcl_minecarts_minecart_chest.png",
{"mcl_minecarts:minecart", "mcl_chests:chest"}, {"mcl_minecarts:minecart", "mcl_chests:chest"},
nil, nil, false) nil, nil, true)
mcl_entity_invs.register_inv("mcl_minecarts:chest_minecart","Minecart",27,false,true)
-- Minecart with Furnace -- Minecart with Furnace
register_minecart( register_minecart(
@ -730,7 +731,7 @@ register_minecart(
"mcl_minecarts_minecart.png", "mcl_minecarts_minecart.png",
}}) }})
end end
end, nil, false end, nil, true
) )
-- Minecart with Command Block -- Minecart with Command Block
@ -769,8 +770,9 @@ register_minecart(
}, },
"mcl_minecarts_minecart_hopper.png", "mcl_minecarts_minecart_hopper.png",
{"mcl_minecarts:minecart", "mcl_hoppers:hopper"}, {"mcl_minecarts:minecart", "mcl_hoppers:hopper"},
nil, nil, false nil, nil, true
) )
mcl_entity_invs.register_inv("mcl_minecarts:hopper_minecart", "Hopper Minecart", 5, false, true)
-- Minecart with TNT -- Minecart with TNT
register_minecart( register_minecart(
@ -830,8 +832,7 @@ minetest.register_craft({
}, },
}) })
-- TODO: Re-enable crafting of special minecarts when they have been implemented minetest.register_craft({
--[[minetest.register_craft({
output = "mcl_minecarts:furnace_minecart", output = "mcl_minecarts:furnace_minecart",
recipe = { recipe = {
{"mcl_furnaces:furnace"}, {"mcl_furnaces:furnace"},
@ -847,18 +848,18 @@ minetest.register_craft({
}, },
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_minecarts:chest_minecart", output = "mcl_minecarts:chest_minecart",
recipe = { recipe = {
{"mcl_chests:chest"}, {"mcl_chests:chest"},
{"mcl_minecarts:minecart"}, {"mcl_minecarts:minecart"},
}, },
})]] })
if has_mcl_wip then if has_mcl_wip then
mcl_wip.register_wip_item("mcl_minecarts:chest_minecart") mcl_wip.register_wip_item("mcl_minecarts:chest_minecart")
mcl_wip.register_wip_item("mcl_minecarts:furnace_minecart") mcl_wip.register_wip_item("mcl_minecarts:furnace_minecart")
mcl_wip.register_wip_item("mcl_minecarts:command_block_minecart") mcl_wip.register_wip_item("mcl_minecarts:command_block_minecart")
mcl_wip.register_wip_item("mcl_minecarts:hopper_minecart")
end end

View File

@ -1,6 +1,5 @@
name = mcl_minecarts name = mcl_minecarts
author = Krock author = Krock
description = Minecarts are vehicles to move players quickly on rails. description = Minecarts are vehicles to move players quickly on rails.
depends = mcl_title, mcl_explosions, mcl_core, mcl_sounds, mcl_player, mcl_achievements, mcl_chests, mcl_furnaces, mesecons_commandblock, mcl_hoppers, mcl_tnt, mesecons depends = mcl_title, mcl_explosions, mcl_core, mcl_sounds, mcl_player, mcl_achievements, mcl_chests, mcl_furnaces, mesecons_commandblock, mcl_hoppers, mcl_tnt, mesecons, mcl_entity_invs
optional_depends = doc_identifier, mcl_wip optional_depends = doc_identifier, mcl_wip

File diff suppressed because it is too large Load Diff

View File

@ -258,7 +258,10 @@ functions needed for the mob to work properly which contains the following:
'nofollow' Do not follow players when they wield the "follow" item. For mobs (like villagers) 'nofollow' Do not follow players when they wield the "follow" item. For mobs (like villagers)
that are bred in a different way. that are bred in a different way.
'pick_up' table of itemstrings the mob will pick up (e.g. for breeding) 'pick_up' table of itemstrings the mob will pick up (e.g. for breeding)
'on_pick_up' function that will be called on item pickup - return true to not pickup the item 'on_pick_up' function that will be called on item pickup - arguments are self and the itementity return a (modified) itemstack
'custom_visual_size' will not reset visual_size from the base class on reload
'noyaw' If true this mob will not automatically change yaw
'particlespawners' Table of particlespawners attached to the mob. This is implemented in a coord safe manner i.e. spawners are only sent to players within the player_transfer_distance (and automatically removed). This enables infinitely lived particlespawners.
mobs:gopath(self,target,callback_arrived) pathfind a way to target and run callback on arrival mobs:gopath(self,target,callback_arrived) pathfind a way to target and run callback on arrival
@ -433,7 +436,7 @@ true the mob will not spawn.
MineClone 2 extensions MineClone 2 extensions
---------------------- ----------------------
mobs:spawn_child(pos, mob_type) mcl_mobs:spawn_child(pos, mob_type)
This function spawns a mob as a child. The parameter mob_type is the This function spawns a mob as a child. The parameter mob_type is the
entitystring of the new mob. entitystring of the new mob.
@ -443,6 +446,7 @@ mobs:death_effect(pos, collisionbox)
Create death particles at pos with the given collisionbox. Create death particles at pos with the given collisionbox.
mcl_mobs.spawn(pos,name/entity name)
Making Arrows Making Arrows
------------- -------------
@ -484,13 +488,13 @@ This function registers a arrow for mobs with the attack type shoot.
Spawn Eggs Spawn Eggs
---------- ----------
mobs:register_egg(name, description, background, addegg, no_creative) mobs:register_egg(name, description, background_color, overlay_color, addegg, no_creative)
This function registers a spawn egg which can be used by admin to properly spawn in a mob. This function registers a spawn egg which can be used by admin to properly spawn in a mob.
'name' this is the name of your new mob to spawn e.g. "mob:sheep" 'name' this is the name of your new mob to spawn e.g. "mob:sheep"
'description' the name of the new egg you are creating e.g. "Spawn Sheep" 'description' the name of the new egg you are creating e.g. "Spawn Sheep"
'background'the texture displayed for the egg in inventory 'background_color' and 'overlay_color' define the colors for the texture displayed for the egg in inventory
'addegg' would you like an egg image in front of your texture (1 = yes, 'addegg' would you like an egg image in front of your texture (1 = yes,
0 = no) 0 = no)
'no_creative' when set to true this stops spawn egg appearing in creative 'no_creative' when set to true this stops spawn egg appearing in creative

View File

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

View File

@ -0,0 +1,796 @@
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
local mob_class = mcl_mobs.mob_class
local damage_enabled = minetest.settings:get_bool("enable_damage")
local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false
-- pathfinding settings
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
-- check if daytime and also if mob is docile during daylight hours
function mob_class:day_docile()
if self.docile_by_day == false then
return false
elseif self.docile_by_day == true
and self.time_of_day > 0.2
and self.time_of_day < 0.8 then
return true
end
end
-- attack player/mob
function mob_class:do_attack(player)
if self.state == "attack" or self.state == "die" then
return
end
self.attack = player
self.state = "attack"
-- TODO: Implement war_cry sound without being annoying
--if random(0, 100) < 90 then
--self:mob_sound("war_cry", true)
--end
end
-- blast damage to entities nearby
local function entity_physics(pos,radius)
radius = radius * 2
local objs = minetest.get_objects_inside_radius(pos, radius)
local obj_pos, dist
for n = 1, #objs do
obj_pos = objs[n]:get_pos()
dist = vector.distance(pos, obj_pos)
if dist < 1 then dist = 1 end
local damage = math.floor((4 / dist) * radius)
local ent = objs[n]:get_luaentity()
-- punches work on entities AND players
objs[n]:punch(objs[n], 1.0, {
full_punch_interval = 1.0,
damage_groups = {fleshy = damage},
}, pos)
end
end
function mob_class:entity_physics(pos,radius) return entity_physics(pos,radius) end
local los_switcher = false
local height_switcher = false
-- path finding and smart mob routine by rnd, line_of_sight and other edits by Elkien3
function mob_class:smart_mobs(s, p, dist, dtime)
local s1 = self.path.lastpos
local target_pos = self.attack:get_pos()
-- is it becoming stuck?
if math.abs(s1.x - s.x) + math.abs(s1.z - s.z) < .5 then
self.path.stuck_timer = self.path.stuck_timer + dtime
else
self.path.stuck_timer = 0
end
self.path.lastpos = {x = s.x, y = s.y, z = s.z}
local use_pathfind = false
local has_lineofsight = minetest.line_of_sight(
{x = s.x, y = (s.y) + .5, z = s.z},
{x = target_pos.x, y = (target_pos.y) + 1.5, z = target_pos.z}, .2)
-- im stuck, search for path
if not has_lineofsight then
if los_switcher == true then
use_pathfind = true
los_switcher = false
end -- cannot see target!
else
if los_switcher == false then
los_switcher = true
use_pathfind = false
minetest.after(1, function(self)
if not self.object:get_luaentity() then
return
end
if has_lineofsight then self.path.following = false end
end, self)
end -- can see target!
end
if (self.path.stuck_timer > stuck_timeout and not self.path.following) then
use_pathfind = true
self.path.stuck_timer = 0
minetest.after(1, function(self)
if not self.object:get_luaentity() then
return
end
if has_lineofsight then self.path.following = false end
end, self)
end
if (self.path.stuck_timer > stuck_path_timeout and self.path.following) then
use_pathfind = true
self.path.stuck_timer = 0
minetest.after(1, function(self)
if not self.object:get_luaentity() then
return
end
if has_lineofsight then self.path.following = false end
end, self)
end
if math.abs(vector.subtract(s,target_pos).y) > self.stepheight then
if height_switcher then
use_pathfind = true
height_switcher = false
end
else
if not height_switcher then
use_pathfind = false
height_switcher = true
end
end
if use_pathfind then
-- lets try find a path, first take care of positions
-- since pathfinder is very sensitive
local sheight = self.collisionbox[5] - self.collisionbox[2]
-- round position to center of node to avoid stuck in walls
-- also adjust height for player models!
s.x = math.floor(s.x + 0.5)
s.z = math.floor(s.z + 0.5)
local ssight, sground = minetest.line_of_sight(s, {
x = s.x, y = s.y - 4, z = s.z}, 1)
-- determine node above ground
if not ssight then
s.y = sground.y + 1
end
local p1 = self.attack:get_pos()
p1.x = math.floor(p1.x + 0.5)
p1.y = math.floor(p1.y + 0.5)
p1.z = math.floor(p1.z + 0.5)
local dropheight = 12
if self.fear_height ~= 0 then dropheight = self.fear_height end
local jumpheight = 0
if self.jump and self.jump_height >= 4 then
jumpheight = math.min(math.ceil(self.jump_height / 4), 4)
elseif self.stepheight > 0.5 then
jumpheight = 1
end
self.path.way = minetest.find_path(s, p1, 16, jumpheight, dropheight, "A*_noprefetch")
self.state = ""
self:do_attack(self.attack)
-- no path found, try something else
if not self.path.way then
self.path.following = false
-- lets make way by digging/building if not accessible
if self.pathfinding == 2 and mobs_griefing then
-- is player higher than mob?
if s.y < p1.y then
-- build upwards
if not minetest.is_protected(s, "") then
local ndef1 = minetest.registered_nodes[self.standing_in]
if ndef1 and (ndef1.buildable_to or ndef1.groups.liquid) then
minetest.set_node(s, {name = mcl_mobs.fallback_node})
end
end
local sheight = math.ceil(self.collisionbox[5]) + 1
-- assume mob is 2 blocks high so it digs above its head
s.y = s.y + sheight
-- remove one block above to make room to jump
if not minetest.is_protected(s, "") then
local node1 = node_ok(s, "air").name
local ndef1 = minetest.registered_nodes[node1]
if node1 ~= "air"
and node1 ~= "ignore"
and ndef1
and not ndef1.groups.level
and not ndef1.groups.unbreakable
and not ndef1.groups.liquid then
minetest.set_node(s, {name = "air"})
minetest.add_item(s, ItemStack(node1))
end
end
s.y = s.y - sheight
self.object:set_pos({x = s.x, y = s.y + 2, z = s.z})
else -- dig 2 blocks to make door toward player direction
local yaw1 = self.object:get_yaw() + math.pi / 2
local p1 = {
x = s.x + math.cos(yaw1),
y = s.y,
z = s.z + math.sin(yaw1)
}
if not minetest.is_protected(p1, "") then
local node1 = node_ok(p1, "air").name
local ndef1 = minetest.registered_nodes[node1]
if node1 ~= "air"
and node1 ~= "ignore"
and ndef1
and not ndef1.groups.level
and not ndef1.groups.unbreakable
and not ndef1.groups.liquid then
minetest.add_item(p1, ItemStack(node1))
minetest.set_node(p1, {name = "air"})
end
p1.y = p1.y + 1
node1 = node_ok(p1, "air").name
ndef1 = minetest.registered_nodes[node1]
if node1 ~= "air"
and node1 ~= "ignore"
and ndef1
and not ndef1.groups.level
and not ndef1.groups.unbreakable
and not ndef1.groups.liquid then
minetest.add_item(p1, ItemStack(node1))
minetest.set_node(p1, {name = "air"})
end
end
end
end
-- will try again in 2 seconds
self.path.stuck_timer = stuck_timeout - 2
elseif s.y < p1.y and (not self.fly) then
self:do_jump() --add jump to pathfinding
self.path.following = true
-- Yay, I found path!
-- TODO: Implement war_cry sound without being annoying
--self:mob_sound("war_cry", true)
else
self:set_velocity(self.walk_velocity)
-- follow path now that it has it
self.path.following = true
end
end
end
-- specific attacks
local specific_attack = function(list, what)
-- no list so attack default (player, animals etc.)
if list == nil then
return true
end
-- found entity on list to attack?
for no = 1, #list do
if list[no] == what then
return true
end
end
return false
end
-- find someone to attack
function mob_class:monster_attack()
if not damage_enabled
or self.passive ~= false
or self.state == "attack"
or self:day_docile() then
return
end
local s = self.object:get_pos()
local p, sp, dist
local player, obj, min_player
local type, name = "", ""
local min_dist = self.view_range + 1
local objs = minetest.get_objects_inside_radius(s, self.view_range)
local blacklist_attack = {}
for n = 1, #objs do
if not objs[n]:is_player() then
obj = objs[n]:get_luaentity()
if obj then
player = obj.object
name = obj.name or ""
end
if obj and obj.type == self.type and obj.passive == false and obj.state == "attack" and obj.attack then
table.insert(blacklist_attack, obj.attack)
end
end
end
for n = 1, #objs do
if objs[n]:is_player() then
if mcl_mobs.invis[ objs[n]:get_player_name() ] or (not self:object_in_range(objs[n])) then
type = ""
elseif (self.type == "monster" or self._aggro) then
player = objs[n]
type = "player"
name = "player"
end
else
obj = objs[n]:get_luaentity()
if obj then
player = obj.object
type = obj.type
name = obj.name or ""
end
end
-- find specific mob to attack, failing that attack player/npc/animal
if specific_attack(self.specific_attack, name)
and (type == "player" or ( type == "npc" and self.attack_npcs )
or (type == "animal" and self.attack_animals == true)) then
p = player:get_pos()
sp = s
dist = vector.distance(p, s)
-- aim higher to make looking up hills more realistic
p.y = p.y + 1
sp.y = sp.y + 1
local attacked_p = false
for c=1, #blacklist_attack do
if blacklist_attack[c] == player then
attacked_p = true
end
end
-- choose closest player to attack
if dist < min_dist
and not attacked_p
and self:line_of_sight( sp, p, 2) == true then
min_dist = dist
min_player = player
end
end
end
if not min_player and #blacklist_attack > 0 then
min_player=blacklist_attack[math.random(#blacklist_attack)]
end
-- attack player
if min_player then
self:do_attack(min_player)
end
end
-- npc, find closest monster to attack
function mob_class:npc_attack()
if self.type ~= "npc"
or not self.attacks_monsters
or self.state == "attack" then
return
end
local p, sp, obj, min_player
local s = self.object:get_pos()
local min_dist = self.view_range + 1
local objs = minetest.get_objects_inside_radius(s, self.view_range)
for n = 1, #objs do
obj = objs[n]:get_luaentity()
if obj and obj.type == "monster" then
p = obj.object:get_pos()
sp = s
local dist = vector.distance(p, s)
-- aim higher to make looking up hills more realistic
p.y = p.y + 1
sp.y = sp.y + 1
if dist < min_dist
and self:line_of_sight( sp, p, 2) == true then
min_dist = dist
min_player = obj.object
end
end
end
if min_player then
self:do_attack(min_player)
end
end
-- dogshoot attack switch and counter function
function mob_class:dogswitch(dtime)
-- switch mode not activated
if not self.dogshoot_switch
or not dtime then
return 0
end
self.dogshoot_count = self.dogshoot_count + dtime
if (self.dogshoot_switch == 1
and self.dogshoot_count > self.dogshoot_count_max)
or (self.dogshoot_switch == 2
and self.dogshoot_count > self.dogshoot_count2_max) then
self.dogshoot_count = 0
if self.dogshoot_switch == 1 then
self.dogshoot_switch = 2
else
self.dogshoot_switch = 1
end
end
return self.dogshoot_switch
end
-- no damage to nodes explosion
function mob_class:safe_boom(pos, strength)
minetest.sound_play(self.sounds and self.sounds.explode or "tnt_explode", {
pos = pos,
gain = 1.0,
max_hear_distance = self.sounds and self.sounds.distance or 32
}, true)
local radius = strength
entity_physics(pos, radius)
mcl_mobs.effect(pos, 32, "mcl_particles_smoke.png", radius * 3, radius * 5, radius, 1, 0)
end
-- make explosion with protection and tnt mod check
function mob_class:boom(pos, strength, fire)
if mobs_griefing and not minetest.is_protected(pos, "") then
mcl_explosions.explode(pos, strength, { drop_chance = 1.0, fire = fire }, self.object)
else
mcl_mobs.mob_class.safe_boom(self, pos, strength) --need to call it this way bc self is the "arrow" object here
end
-- delete the object after it punched the player to avoid nil entities in e.g. mcl_shields!!
self.object:remove()
end
-- deal damage and effects when mob punched
function mob_class:on_punch(hitter, tflp, tool_capabilities, dir)
-- custom punch function
if self.do_punch then
-- when false skip going any further
if self.do_punch(self, hitter, tflp, tool_capabilities, dir) == false then
return
end
end
-- error checking when mod profiling is enabled
if not tool_capabilities then
minetest.log("warning", "[mobs] Mod profiling enabled, damage not enabled")
return
end
local is_player = hitter:is_player()
if is_player then
-- is mob protected?
if self.protected and minetest.is_protected(self.object:get_pos(), hitter:get_player_name()) then
return
end
if minetest.is_creative_enabled(hitter:get_player_name()) then
self.health = 0
end
-- set/update 'drop xp' timestamp if hitted by player
self.xp_timestamp = minetest.get_us_time()
end
-- punch interval
local weapon = hitter:get_wielded_item()
local punch_interval = 1.4
-- exhaust attacker
if is_player then
mcl_hunger.exhaust(hitter:get_player_name(), mcl_hunger.EXHAUST_ATTACK)
end
-- calculate mob damage
local damage = 0
local armor = self.object:get_armor_groups() or {}
local tmp
-- quick error check incase it ends up 0 (serialize.h check test)
if tflp == 0 then
tflp = 0.2
end
for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do
tmp = tflp / (tool_capabilities.full_punch_interval or 1.4)
if tmp < 0 then
tmp = 0.0
elseif tmp > 1 then
tmp = 1.0
end
damage = damage + (tool_capabilities.damage_groups[group] or 0)
* tmp * ((armor[group] or 0) / 100.0)
end
if weapon then
local fire_aspect_level = mcl_enchanting.get_enchantment(weapon, "fire_aspect")
if fire_aspect_level > 0 then
mcl_burning.set_on_fire(self.object, fire_aspect_level * 4)
end
end
-- check for tool immunity or special damage
for n = 1, #self.immune_to do
if self.immune_to[n][1] == weapon:get_name() then
damage = self.immune_to[n][2] or 0
break
end
end
-- healing
if damage <= -1 then
self.health = self.health - math.floor(damage)
return
end
if tool_capabilities then
punch_interval = tool_capabilities.full_punch_interval or 1.4
end
-- add weapon wear manually
-- Required because we have custom health handling ("health" property)
if minetest.is_creative_enabled("") ~= true
and tool_capabilities then
if tool_capabilities.punch_attack_uses then
-- Without this delay, the wear does not work. Quite hacky ...
minetest.after(0, function(name)
local player = minetest.get_player_by_name(name)
if not player then return end
local weapon = hitter:get_wielded_item(player)
local def = weapon:get_definition()
if def.tool_capabilities and def.tool_capabilities.punch_attack_uses then
local wear = math.floor(65535/tool_capabilities.punch_attack_uses)
weapon:add_wear(wear)
hitter:set_wielded_item(weapon)
end
end, hitter:get_player_name())
end
end
local die = false
if damage >= 0 then
-- only play hit sound and show blood effects if damage is 1 or over; lower to 0.1 to ensure armor works appropriately.
if damage >= 0.1 then
-- weapon sounds
if weapon:get_definition().sounds ~= nil then
local s = math.random(0, #weapon:get_definition().sounds)
minetest.sound_play(weapon:get_definition().sounds[s], {
object = self.object, --hitter,
max_hear_distance = 8
}, true)
else
minetest.sound_play("default_punch", {
object = self.object,
max_hear_distance = 5
}, true)
end
self:damage_effect(damage)
-- do damage
self.health = self.health - damage
-- skip future functions if dead, except alerting others
if self:check_for_death( "hit", {type = "punch", puncher = hitter}) then
die = true
end
end
-- knock back effect (only on full punch)
if self.knock_back
and tflp >= punch_interval then
-- direction error check
dir = dir or {x = 0, y = 0, z = 0}
local v = self.object:get_velocity()
if not v then return end
local r = 1.4 - math.min(punch_interval, 1.4)
local kb = r * (math.abs(v.x)+math.abs(v.z))
local up = 2
if die==true then
kb=kb*2
end
-- if already in air then dont go up anymore when hit
if math.abs(v.y) > 0.1
or self.fly then
up = 0
end
-- check if tool already has specific knockback value
if tool_capabilities.damage_groups["knockback"] then
kb = tool_capabilities.damage_groups["knockback"]
else
kb = kb * 1.5
end
local luaentity
if hitter then
luaentity = hitter:get_luaentity()
end
if hitter and is_player then
local wielditem = hitter:get_wielded_item()
kb = kb + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback")
elseif luaentity and luaentity._knockback then
kb = kb + luaentity._knockback
end
self._kb_turn = true
self._turn_to=self.object:get_yaw()-1.57
self.frame_speed_multiplier=2.3
if self.animation.run_end then
self:set_animation( "run")
elseif self.animation.walk_end then
self:set_animation( "walk")
end
minetest.after(0.2, function()
if self and self.object then
self.frame_speed_multiplier=1
self._kb_turn = false
end
end)
self.object:add_velocity({
x = dir.x * kb,
y = up*2,
z = dir.z * kb
})
self.pause_timer = 0.25
end
end -- END if damage
-- if skittish then run away
if hitter and is_player and hitter:get_pos() and not die and self.runaway == true and self.state ~= "flop" then
local yaw = self:set_yaw( minetest.dir_to_yaw(vector.direction(hitter:get_pos(), self.object:get_pos())))
minetest.after(0.2,function()
if self and self.object and self.object:get_pos() and hitter and is_player and hitter:get_pos() then
yaw = self:set_yaw( minetest.dir_to_yaw(vector.direction(hitter:get_pos(), self.object:get_pos())))
self:set_velocity( self.run_velocity)
end
end)
self.state = "runaway"
self.runaway_timer = 0
self.following = nil
end
local name = hitter:get_player_name() or ""
-- attack puncher and call other mobs for help
if self.passive == false
and self.state ~= "flop"
and (self.child == false or self.type == "monster")
and hitter:get_player_name() ~= self.owner
and not mcl_mobs.invis[ name ] then
if not die then
-- attack whoever punched mob
self.state = ""
self:do_attack(hitter)
self._aggro= true
end
-- alert others to the attack
local objs = minetest.get_objects_inside_radius(hitter:get_pos(), self.view_range)
local obj = nil
for n = 1, #objs do
obj = objs[n]:get_luaentity()
if obj then
-- only alert members of same mob or friends
if obj.group_attack
and obj.state ~= "attack"
and obj.owner ~= name then
if obj.name == self.name then
obj:do_attack(hitter)
elseif type(obj.group_attack) == "table" then
for i=1, #obj.group_attack do
if obj.name == obj.group_attack[i] then
obj._aggro = true
obj:do_attack(hitter)
break
end
end
end
end
-- have owned mobs attack player threat
if obj.owner == name and obj.owner_loyal then
obj:do_attack(self.object)
end
end
end
end
end
function mob_class:check_aggro(dtime)
if not self._aggro or not self.attack then return end
if not self._check_aggro_timer or self._check_aggro_timer > 5 then
self._check_aggro_timer = 0
if not self.attack:get_pos() or vector.distance(self.attack:get_pos(),self.object:get_pos()) > 128 then
self._aggro = nil
self.attack = nil
self.state = "stand"
end
end
self._check_aggro_timer = self._check_aggro_timer + dtime
end

View File

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

View File

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

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,382 @@
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 LOG_MODULE = "[Mobs]"
local function mcl_log (message)
if LOGGING_ON and message then
minetest.log(LOG_MODULE .. " " .. message)
end
end
function output_table (wp)
if not wp then return end
mcl_log("wp items: ".. tostring(#wp))
for a,b in pairs(wp) do
mcl_log(a.. ": ".. tostring(b))
end
end
function append_paths (wp1, wp2)
mcl_log("Start append")
if not wp1 or not wp2 then
mcl_log("Cannot append wp's")
return
end
output_table(wp1)
output_table(wp2)
for _,a in pairs (wp2) do
table.insert(wp1, a)
end
mcl_log("End append")
end
local function output_enriched (wp_out)
mcl_log("Output enriched path")
local i = 0
for _,outy in pairs (wp_out) do
i = i + 1
mcl_log("Pos ".. i ..":" .. minetest.pos_to_string(outy["pos"]))
local action = outy["action"]
if action then
mcl_log("type: " .. action["type"])
mcl_log("action: " .. action["action"])
mcl_log("target: " .. minetest.pos_to_string(action["target"]))
end
mcl_log("failed attempts: " .. outy["failed_attempts"])
end
end
-- This function will take a list of paths, and enrich it with:
-- a var for failed attempts
-- an action, such as to open or close a door where we know that pos requires that action
local function generate_enriched_path(wp_in, door_open_pos, door_close_pos, cur_door_pos)
local wp_out = {}
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
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
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")
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")
end
wp_out[i] = {}
wp_out[i]["pos"] = cur_pos_to_add
wp_out[i]["failed_attempts"] = 0
wp_out[i]["action"] = action
--wp_out[i] = {"pos" = cur_pos, "failed_attempts" = 0, "action" = action}
--output_pos(cur_pos, i)
end
output_enriched(wp_out)
return wp_out
end
local plane_adjacents = {
vector.new(1,0,0),
vector.new(-1,0,0),
vector.new(0,0,1),
vector.new(0,0,-1),
}
-- 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 enriched_path = nil
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")
-- 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)
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 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)
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.")
end
else
mcl_log("Block is not air, it is: ".. n.name)
end
end
else
mcl_log("No door found")
end
else
mcl_log("We have a direct route")
end
if wp and not enriched_path then
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()
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)
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.
end
--output_table(wp)
if wp and #wp > 0 then
self._target = t
self.callback_arrived = callback_arrived
local current_location = table.remove(wp,1)
if current_location and current_location["pos"] then
mcl_log("Removing first co-ord? " .. tostring(current_location["pos"]))
else
mcl_log("Nil pos")
end
self.current_target = current_location
self.waypoints = wp
self.state = PATHFINDING
return true
else
self.state = "walk"
self.waypoints = nil
self.current_target = nil
-- minetest.log("no path found")
end
end
function mob_class:interact_with_door(action, target)
local p = self.object:get_pos()
--local t = minetest.get_timeofday()
--local dd = minetest.find_nodes_in_area(vector.offset(p,-1,-1,-1),vector.offset(p,1,1,1),{"group:door"})
--for _,d in pairs(dd) do
if target then
mcl_log("Door target is: ".. minetest.pos_to_string(target))
local n = minetest.get_node(target)
if n.name:find("_b_") or n.name:find("_t_") then
mcl_log("Door")
local def = minetest.registered_nodes[n.name]
local closed = n.name:find("_b_1") or n.name:find("_t_1")
--if self.state == PATHFINDING then
if closed and action == "open" and def.on_rightclick then
mcl_log("Open door")
def.on_rightclick(target,n,self)
end
if not closed and action == "close" and def.on_rightclick then
mcl_log("Close door")
def.on_rightclick(target,n,self)
end
--else
else
mcl_log("Not door")
end
else
mcl_log("no target. cannot try and open or close door")
end
--end
end
function mob_class:do_pathfind_action(action)
if action then
mcl_log("Action present")
local type = action["type"]
local action_val = action["action"]
local target = action["target"]
if target then
mcl_log("Target: ".. minetest.pos_to_string(target))
end
if type and type == "door" then
mcl_log("Type is door")
self:interact_with_door(action_val, target)
end
end
end
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
if not p or not self._target then
mcl_log("p: ".. tostring(p))
mcl_log("self._target: ".. tostring(self._target))
return
end
-- arrived at location, finish gowp
local distance_to_targ = vector.distance(p,self._target)
--mcl_log("Distance to targ: ".. tostring(distance_to_targ))
if distance_to_targ < 2 then
mcl_log("Arrived at _target")
self.waypoints = nil
self._target = nil
self.current_target = nil
self.state = "stand"
self.order = "stand"
self.object:set_velocity({x = 0, y = 0, z = 0})
self.object:set_acceleration({x = 0, y = 0, z = 0})
if self.callback_arrived then return self.callback_arrived(self) end
return true
end
-- More pathing to be done
local distance_to_current_target = 50
if self.current_target and self.current_target["pos"] then
distance_to_current_target = vector.distance(p,self.current_target["pos"])
end
-- 0.6 is working but too sensitive. sends villager back too frequently. 0.7 is quite good, but not with heights
-- 0.8 is optimal for 0.025 frequency checks and also 1... Actually. 0.8 is winning
-- 0.9 and 1.0 is also good. Stick with unless door open or closing issues
if self.waypoints and #self.waypoints > 0 and ( not self.current_target or not self.current_target["pos"] or distance_to_current_target < 0.9 ) then
-- We have waypoints, and no current target, or we're at it. We need a new current_target.
self:do_pathfind_action (self.current_target["action"])
local failed_attempts = self.current_target["failed_attempts"]
mcl_log("There after " .. failed_attempts .. " failed attempts. current target:".. minetest.pos_to_string(self.current_target["pos"]) .. ". Distance: " .. distance_to_current_target)
self.current_target = table.remove(self.waypoints, 1)
self:go_to_pos(self.current_target["pos"])
return
elseif self.current_target and self.current_target["pos"] then
-- No waypoints left, but have current target. 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
mcl_log("Failed to reach position (" .. minetest.pos_to_string(self.current_target["pos"]) .. ") too many times. Abandon route. Times tried: " .. failed_attempts)
self.state = "stand"
self.current_target = nil
self.waypoints = nil
self._target = nil
self._pf_last_failed = os.time()
self.object:set_velocity({x = 0, y = 0, z = 0})
self.object:set_acceleration({x = 0, y = 0, z = 0})
return
end
--mcl_log("Not at pos with failed attempts ".. failed_attempts ..": ".. minetest.pos_to_string(p) .. "self.current_target: ".. minetest.pos_to_string(self.current_target["pos"]) .. ". Distance: ".. distance_to_current_target)
self:go_to_pos(self.current_target["pos"])
-- Do i just delete current_target, and return so we can find final path.
else
-- Not at target, no current waypoints or current_target. Through the door and should be able to path to target.
-- Is a little sensitive and could take 1 - 7 times. A 10 fail count might be a good exit condition.
mcl_log("We don't have waypoints or a current target. Let's try to path to target")
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.")
-- self.waypoints = final_wp
self:go_to_pos(self._target)
else
-- Abandon route?
mcl_log("Cannot plot final route to target")
end
end
-- I don't think we need the following anymore, but test first.
-- Maybe just need something to path to target if no waypoints left
if self.current_target and self.current_target["pos"] and (self.waypoints and #self.waypoints == 0) then
local updated_p = self.object:get_pos()
local distance_to_cur_targ = vector.distance(updated_p,self.current_target["pos"])
mcl_log("Distance to current target: ".. tostring(distance_to_cur_targ))
mcl_log("Current p: ".. minetest.pos_to_string(updated_p))
-- 1.6 is good. is 1.9 better? It could fail less, but will it path to door when it isn't after door
if distance_to_cur_targ > 1.9 then
mcl_log("not close to current target: ".. minetest.pos_to_string(self.current_target["pos"]))
self:go_to_pos(self._current_target)
else
mcl_log("close to current target: ".. minetest.pos_to_string(self.current_target["pos"]))
self.current_target = nil
end
return
end
end

View File

@ -0,0 +1,976 @@
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
local mob_class = mcl_mobs.mob_class
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
local mob_active_range = tonumber(minetest.settings:get("mcl_mob_active_range")) or 48
local show_health = false
-- get node but use fallback for nil or unknown
local node_ok = function(pos, fallback)
fallback = fallback or mcl_mobs.fallback_node
local node = minetest.get_node_or_nil(pos)
if node and minetest.registered_nodes[node.name] then
return node
end
return minetest.registered_nodes[fallback]
end
-- check if within physical map limits (-30911 to 30927)
local function within_limits(pos, radius)
local wmin, wmax = -30912, 30928
if mcl_vars then
if mcl_vars.mapgen_edge_min and mcl_vars.mapgen_edge_max then
wmin, wmax = mcl_vars.mapgen_edge_min, mcl_vars.mapgen_edge_max
end
end
if radius then
wmin = wmin - radius
wmax = wmax + radius
end
if not pos then return true end
for _,v in pairs(pos) do
if v < wmin or v > wmax then return false end
end
return true
end
function mob_class:player_in_active_range()
for _,p in pairs(minetest.get_connected_players()) do
if vector.distance(self.object:get_pos(),p:get_pos()) <= mob_active_range then return true end
-- slightly larger than the mc 32 since mobs spawn on that circle and easily stand still immediately right after spawning.
end
end
-- Return true if object is in view_range
function mob_class:object_in_range(object)
if not object then
return false
end
local factor
-- Apply view range reduction for special player armor
if object:is_player() then
local factors = mcl_armor.player_view_range_factors[object]
factor = factors and factors[self.name]
end
-- Distance check
local dist
if factor and factor == 0 then
return false
elseif factor then
dist = self.view_range * factor
else
dist = self.view_range
end
local p1, p2 = self.object:get_pos(), object:get_pos()
return p1 and p2 and (vector.distance(p1, p2) <= dist)
end
function mob_class:item_drop(cooked, looting_level)
if not mobs_drop_items then return end
looting_level = looting_level or 0
if (self.child and self.type ~= "monster") then
return
end
local obj, item, num
local pos = self.object:get_pos()
self.drops = self.drops or {}
for n = 1, #self.drops do
local dropdef = self.drops[n]
local chance = 1 / dropdef.chance
local looting_type = dropdef.looting
if looting_level > 0 then
local chance_function = dropdef.looting_chance_function
if chance_function then
chance = chance_function(looting_level)
elseif looting_type == "rare" then
chance = chance + (dropdef.looting_factor or 0.01) * looting_level
end
end
local num = 0
local do_common_looting = (looting_level > 0 and looting_type == "common")
if math.random() < chance then
num = math.random(dropdef.min or 1, dropdef.max or 1)
elseif not dropdef.looting_ignore_chance then
do_common_looting = false
end
if do_common_looting then
num = num + math.floor(math.random(0, looting_level) + 0.5)
end
if num > 0 then
item = dropdef.name
if cooked then
local output = minetest.get_craft_result({
method = "cooking", width = 1, items = {item}})
if output and output.item and not output.item:is_empty() then
item = output.item:get_name()
end
end
for x = 1, num do
obj = minetest.add_item(pos, ItemStack(item .. " " .. 1))
end
if obj and obj:get_luaentity() then
obj:set_velocity({
x = math.random(-10, 10) / 9,
y = 6,
z = math.random(-10, 10) / 9,
})
elseif obj then
obj:remove() -- item does not exist
end
end
end
self.drops = {}
end
-- collision function borrowed amended from jordan4ibanez open_ai mod
function mob_class:collision()
local pos = self.object:get_pos()
if not pos then return {0,0} end
local vel = self.object:get_velocity()
local x = 0
local z = 0
local width = -self.collisionbox[1] + self.collisionbox[4] + 0.5
for _,object in pairs(minetest.get_objects_inside_radius(pos, width)) do
local ent = object:get_luaentity()
if object:is_player() or (ent and ent.is_mob and object ~= self.object) then
if object:is_player() and mcl_burning.is_burning(self.object) then
mcl_burning.set_on_fire(object, 4)
end
local pos2 = object:get_pos()
local vec = {x = pos.x - pos2.x, z = pos.z - pos2.z}
local force = (width + 0.5) - vector.distance(
{x = pos.x, y = 0, z = pos.z},
{x = pos2.x, y = 0, z = pos2.z})
x = x + (vec.x * force)
z = z + (vec.z * force)
end
end
return({x,z})
end
-- move mob in facing direction
function mob_class:set_velocity(v)
local c_x, c_y = 0, 0
-- can mob be pushed, if so calculate direction
if self.pushable then
c_x, c_y = unpack(self:collision())
end
-- halt mob if it has been ordered to stay
if self.order == "stand" or self.order == "sit" then
self.acc=vector.new(0,0,0)
return
end
local yaw = (self.object:get_yaw() or 0) + self.rotate
local vv = self.object:get_velocity()
if vv then
self.acc={
x = ((math.sin(yaw) * -v) + c_x)*.27,
y = 0,
z = ((math.cos(yaw) * v) + c_y)*.27,
}
end
end
-- calculate mob velocity
function mob_class:get_velocity()
local v = self.object:get_velocity()
if v then
return (v.x * v.x + v.z * v.z) ^ 0.5
end
return 0
end
function mob_class:update_roll()
local is_Fleckenstein = self.nametag == "Fleckenstein"
local was_Fleckenstein = false
local rot = self.object:get_rotation()
rot.z = is_Fleckenstein and pi or 0
self.object:set_rotation(rot)
local cbox = table.copy(self.collisionbox)
local acbox = self.object:get_properties().collisionbox
if math.abs(cbox[2] - acbox[2]) > 0.1 then
was_Fleckenstein = true
end
if is_Fleckenstein ~= was_Fleckenstein then
local pos = self.object:get_pos()
pos.y = pos.y + (acbox[2] + acbox[5])
self.object:set_pos(pos)
end
if is_Fleckenstein then
cbox[2], cbox[5] = -cbox[5], -cbox[2]
self.object:set_properties({collisionbox = cbox})
-- This leads to child mobs having the wrong collisionbox
-- and seeing as it seems to be nothing but an easter egg
-- i've put it inside the if. Which just makes it be upside
-- down lol.
end
end
local function shortest_term_of_yaw_rotation(self, rot_origin, rot_target, nums)
if not rot_origin or not rot_target then
return
end
rot_origin = math.deg(rot_origin)
rot_target = math.deg(rot_target)
if rot_origin < rot_target then
if math.abs(rot_origin-rot_target)<180 then
if nums then
return rot_target-rot_origin
else
return 1
end
else
if nums then
return -(rot_origin-(rot_target-360))
else
return -1
end
end
else
if math.abs(rot_origin-rot_target)<180 then
if nums then
return rot_target-rot_origin
else
return -1
end
else
if nums then
return (rot_target-(rot_origin-360))
else
return 1
end
end
end
end
-- set and return valid yaw
function mob_class:set_yaw(yaw, delay, dtime)
if self.noyaw then return end
if self.state ~= PATHFINDING then
self._turn_to = yaw
end
--mcl_log("Yaw is: \t\t" .. tostring(math.deg(yaw)))
--mcl_log("self.object:get_yaw() is: \t" .. tostring(math.deg(self.object:get_yaw())))
--clamp our yaw to a 360 range
if math.deg(self.object:get_yaw()) > 360 then
self.object:set_yaw(math.rad(0))
elseif math.deg(self.object:get_yaw()) < 0 then
self.object:set_yaw(math.rad(360))
end
if math.deg(yaw) > 360 then
yaw=yaw%360
elseif math.deg(yaw) < 0 then
yaw=((360*5)-yaw)%360
end
--calculate the shortest way to turn to find our target
local target_shortest_path = shortest_term_of_yaw_rotation(self, self.object:get_yaw(), yaw, false)
local target_shortest_path_nums = shortest_term_of_yaw_rotation(self, self.object:get_yaw(), yaw, true)
--turn in the shortest path possible toward our target. if we are attacking, don't dance.
if (math.abs(target_shortest_path) > 50 and not self._kb_turn) and (self.attack and self.attack:get_pos() or self.following and self.following:get_pos()) then
if self.following then
target_shortest_path = shortest_term_of_yaw_rotation(self, self.object:get_yaw(), minetest.dir_to_yaw(vector.direction(self.object:get_pos(), self.following:get_pos())), true)
target_shortest_path_nums = shortest_term_of_yaw_rotation(self, self.object:get_yaw(), minetest.dir_to_yaw(vector.direction(self.object:get_pos(), self.following:get_pos())), false)
else
target_shortest_path = shortest_term_of_yaw_rotation(self, self.object:get_yaw(), minetest.dir_to_yaw(vector.direction(self.object:get_pos(), self.attack:get_pos())), true)
target_shortest_path_nums = shortest_term_of_yaw_rotation(self, self.object:get_yaw(), minetest.dir_to_yaw(vector.direction(self.object:get_pos(), self.attack:get_pos())), false)
end
end
local ddtime = 0.05 --set_tick_rate
if dtime then
ddtime = dtime
end
if math.abs(target_shortest_path_nums) > 5 then
self.object:set_yaw(self.object:get_yaw()+(target_shortest_path*(3.6*ddtime)))
if self.acc then
self.acc=vector.rotate_around_axis(self.acc,vector.new(0,1,0), target_shortest_path*(3.6*ddtime))
end
end
delay = delay or 0
yaw = self.object:get_yaw()
if delay == 0 then
if self.shaking and dtime then
yaw = yaw + (math.random() * 2 - 1) * 5 * dtime
end
self:update_roll()
return yaw
end
self.target_yaw = yaw
self.delay = delay
return self.target_yaw
end
-- global function to set mob yaw
function mcl_mobs.yaw(self, yaw, delay, dtime)
return mob_class.set_yaw(self, yaw, delay, dtime)
end
-- are we flying in what we are suppose to? (taikedz)
function mob_class:flight_check()
local nod = self.standing_in
local def = minetest.registered_nodes[nod]
if not def then return false end -- nil check
local fly_in
if type(self.fly_in) == "string" then
fly_in = { self.fly_in }
elseif type(self.fly_in) == "table" then
fly_in = self.fly_in
else
return false
end
for _,checknode in pairs(fly_in) do
if nod == checknode or nod == "ignore" then
return true
end
end
return false
end
-- check if mob is dead or only hurt
function mob_class:check_for_death(cause, cmi_cause)
if self.state == "die" then
return true
end
-- has health actually changed?
if self.health == self.old_health and self.health > 0 then
return false
end
local damaged = self.health < self.old_health
self.old_health = self.health
-- still got some health?
if self.health > 0 then
-- make sure health isn't higher than max
if self.health > self.hp_max then
self.health = self.hp_max
end
-- play damage sound if health was reduced and make mob flash red.
if damaged then
self:add_texture_mod("^[colorize:#d42222:175")
minetest.after(1, function(self)
if self and self.object then
self:remove_texture_mod("^[colorize:#d42222:175")
end
end, self)
self:mob_sound("damage")
end
-- backup nametag so we can show health stats
if not self.nametag2 then
self.nametag2 = self.nametag or ""
end
if show_health
and (cmi_cause and cmi_cause.type == "punch") then
self.htimer = 2
self.nametag = "" .. self.health .. " / " .. self.hp_max
self:update_tag()
end
return false
end
self:mob_sound("death")
local function death_handle(self)
-- dropped cooked item if mob died in fire or lava
if cause == "lava" or cause == "fire" then
self:item_drop(true, 0)
else
local wielditem = ItemStack()
if cause == "hit" then
local puncher = cmi_cause.puncher
if puncher then
wielditem = puncher:get_wielded_item()
end
end
local cooked = mcl_burning.is_burning(self.object) or mcl_enchanting.has_enchantment(wielditem, "fire_aspect")
local looting = mcl_enchanting.get_enchantment(wielditem, "looting")
self:item_drop(cooked, looting)
if ((not self.child) or self.type ~= "animal") and (minetest.get_us_time() - self.xp_timestamp <= math.huge) then
mcl_experience.throw_xp(self.object:get_pos(), math.random(self.xp_min, self.xp_max))
end
end
end
-- execute custom death function
if self.on_die then
local pos = self.object:get_pos()
local on_die_exit = self.on_die(self, pos, cmi_cause)
if on_die_exit ~= true then
death_handle(self)
end
if on_die_exit == true then
self.state = "die"
mcl_burning.extinguish(self.object)
self.object:remove()
return true
end
end
local collisionbox
if self.collisionbox then
collisionbox = table.copy(self.collisionbox)
end
self.state = "die"
self.attack = nil
self.v_start = false
self.fall_speed = DEFAULT_FALL_SPEED
self.timer = 0
self.blinktimer = 0
self:remove_texture_mod("^[colorize:#FF000040")
self:remove_texture_mod("^[brighten")
self.passive = true
self.object:set_properties({
pointable = false,
collide_with_objects = false,
})
self:set_velocity(0)
local acc = self.object:get_acceleration()
acc.x, acc.y, acc.z = 0, DEFAULT_FALL_SPEED, 0
self.object:set_acceleration(acc)
local length
-- default death function and die animation (if defined)
if self.instant_death then
length = 0
elseif self.animation
and self.animation.die_start
and self.animation.die_end then
local frames = self.animation.die_end - self.animation.die_start
local speed = self.animation.die_speed or 15
length = math.max(frames / speed, 0) + DEATH_DELAY
self:set_animation( "die")
else
length = 1 + DEATH_DELAY
self:set_animation( "stand", true)
end
-- Remove body after a few seconds and drop stuff
local kill = function(self)
if not self.object:get_luaentity() then
return
end
death_handle(self)
local dpos = self.object:get_pos()
local cbox = self.collisionbox
local yaw = self.object:get_rotation().y
mcl_burning.extinguish(self.object)
self.object:remove()
mcl_mobs.death_effect(dpos, yaw, cbox, not self.instant_death)
end
if length <= 0 then
kill(self)
else
minetest.after(length, kill, self)
end
return true
end
-- Deal light damage to mob, returns true if mob died
function mob_class:deal_light_damage(pos, damage)
if not ((mcl_weather.rain.raining or mcl_weather.state == "snow") and mcl_weather.is_outdoor(pos)) then
self.health = self.health - damage
mcl_mobs.effect(pos, 5, "mcl_particles_smoke.png")
if self:check_for_death("light", {type = "light"}) then
return true
end
end
end
-- environmental damage (water, lava, fire, light etc.)
function mob_class:do_env_damage()
-- feed/tame text timer (so mob 'full' messages dont spam chat)
if self.htimer > 0 then
self.htimer = self.htimer - 1
end
-- reset nametag after showing health stats
if self.htimer < 1 and self.nametag2 then
self.nametag = self.nametag2
self.nametag2 = nil
self:update_tag()
end
local pos = self.object:get_pos()
if not pos then return end
self.time_of_day = minetest.get_timeofday()
-- remove mob if beyond map limits
if not within_limits(pos, 0) then
mcl_burning.extinguish(self.object)
self.object:remove()
return true
end
local sunlight = minetest.get_natural_light(pos, self.time_of_day)
-- bright light harms mob
if self.light_damage ~= 0 and (sunlight or 0) > 12 then
if self:deal_light_damage(pos, self.light_damage) then
return true
end
end
local _, dim = mcl_worlds.y_to_layer(pos.y)
if (self.sunlight_damage ~= 0 or self.ignited_by_sunlight) and (sunlight or 0) >= minetest.LIGHT_MAX and dim == "overworld" then
if self.armor_list and not self.armor_list.helmet or not self.armor_list or self.armor_list and self.armor_list.helmet and self.armor_list.helmet == "" then
if self.ignited_by_sunlight then
mcl_burning.set_on_fire(self.object, 10)
else
self:deal_light_damage(pos, self.sunlight_damage)
return true
end
end
end
local y_level = self.collisionbox[2]
if self.child then
y_level = self.collisionbox[2] * 0.5
end
-- what is mob standing in?
pos.y = pos.y + y_level + 0.25 -- foot level
local pos2 = {x=pos.x, y=pos.y-1, z=pos.z}
self.standing_in = node_ok(pos, "air").name
self.standing_on = node_ok(pos2, "air").name
-- don't fall when on ignore, just stand still
if self.standing_in == "ignore" then
self.object:set_velocity({x = 0, y = 0, z = 0})
end
local nodef = minetest.registered_nodes[self.standing_in]
-- rain
if self.rain_damage > 0 then
if mcl_weather.rain.raining and mcl_weather.is_outdoor(pos) then
self.health = self.health - self.rain_damage
if self:check_for_death("rain", {type = "environment",
pos = pos, node = self.standing_in}) then
return true
end
end
end
pos.y = pos.y + 1 -- for particle effect position
-- water damage
if self.water_damage > 0
and nodef.groups.water then
if self.water_damage ~= 0 then
self.health = self.health - self.water_damage
mcl_mobs.effect(pos, 5, "mcl_particles_smoke.png", nil, nil, 1, nil)
if self:check_for_death("water", {type = "environment",
pos = pos, node = self.standing_in}) then
return true
end
end
-- lava damage
elseif self.lava_damage > 0
and (nodef.groups.lava) then
if self.lava_damage ~= 0 then
self.health = self.health - self.lava_damage
mcl_mobs.effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil)
mcl_burning.set_on_fire(self.object, 10)
if self:check_for_death("lava", {type = "environment",
pos = pos, node = self.standing_in}) then
return true
end
end
-- fire damage
elseif self.fire_damage > 0
and (nodef.groups.fire) then
if self.fire_damage ~= 0 then
self.health = self.health - self.fire_damage
mcl_mobs.effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil)
mcl_burning.set_on_fire(self.object, 5)
if self:check_for_death("fire", {type = "environment",
pos = pos, node = self.standing_in}) then
return true
end
end
-- damage_per_second node check
elseif nodef.damage_per_second ~= 0 and not nodef.groups.lava and not nodef.groups.fire then
self.health = self.health - nodef.damage_per_second
mcl_mobs.effect(pos, 5, "mcl_particles_smoke.png")
if self:check_for_death("dps", {type = "environment",
pos = pos, node = self.standing_in}) then
return true
end
end
-- Drowning damage
if self.breath_max ~= -1 then
local drowning = false
if self.breathes_in_water then
if minetest.get_item_group(self.standing_in, "water") == 0 then
drowning = true
end
elseif nodef.drowning > 0 then
drowning = true
end
if drowning then
self.breath = math.max(0, self.breath - 1)
mcl_mobs.effect(pos, 2, "bubble.png", nil, nil, 1, nil)
if self.breath <= 0 then
local dmg
if nodef.drowning > 0 then
dmg = nodef.drowning
else
dmg = 4
end
self:damage_effect(dmg)
self.health = self.health - dmg
end
if self:check_for_death("drowning", {type = "environment",
pos = pos, node = self.standing_in}) then
return true
end
else
self.breath = math.min(self.breath_max, self.breath + 1)
end
end
--- suffocation inside solid node
-- FIXME: Redundant with mcl_playerplus
if (self.suffocation == true)
and (nodef.walkable == nil or nodef.walkable == true)
and (nodef.collision_box == nil or nodef.collision_box.type == "regular")
and (nodef.node_box == nil or nodef.node_box.type == "regular")
and (nodef.groups.disable_suffocation ~= 1)
and (nodef.groups.opaque == 1) then
-- Short grace period before starting to take suffocation damage.
-- This is different from players, who take damage instantly.
-- This has been done because mobs might briefly be inside solid nodes
-- when e.g. climbing up stairs.
-- This is a bit hacky because it assumes that do_env_damage
-- is called roughly every second only.
self.suffocation_timer = self.suffocation_timer + 1
if self.suffocation_timer >= 3 then
-- 2 damage per second
-- TODO: Deal this damage once every 1/2 second
self.health = self.health - 2
if self:check_for_death("suffocation", {type = "environment",
pos = pos, node = self.standing_in}) then
return true
end
end
else
self.suffocation_timer = 0
end
return self:check_for_death("", {type = "unknown"})
end
function mob_class:damage_mob(reason,damage)
if not self.health then return end
damage = math.floor(damage)
if damage > 0 then
self.health = self.health - damage
mcl_mobs.effect(self.object:get_pos(), 5, "mcl_particles_smoke.png", 1, 2, 2, nil)
if self:check_for_death(reason, {type = reason}) then
return true
end
end
end
function mob_class:check_entity_cramming()
local p = self.object:get_pos()
if not p then return end
local oo = minetest.get_objects_inside_radius(p,1)
local mobs = {}
for _,o in pairs(oo) do
local l = o:get_luaentity()
if l and l.is_mob and l.health > 0 then table.insert(mobs,l) end
end
local clear = #mobs < ENTITY_CRAMMING_MAX
local ncram = {}
for _,l in pairs(mobs) do
if l then
if clear then
l.cram = nil
elseif l.cram == nil and not self.child then
table.insert(ncram,l)
elseif l.cram then
l:damage_mob("cramming",CRAMMING_DAMAGE)
end
end
end
for i,l in pairs(ncram) do
if i > ENTITY_CRAMMING_MAX then
l.cram = true
else
l.cram = nil
end
end
end
-- falling and fall damage
-- returns true if mob died
function mob_class:falling(pos)
if self.fly and self.state ~= "die" then
return
end
if not self.fall_speed then self.fall_speed = DEFAULT_FALL_SPEED end
if mcl_portals ~= nil then
if mcl_portals.nether_portal_cooloff(self.object) then
return false -- mob has teleported through Nether portal - it's 99% not falling
end
end
-- floating in water (or falling)
local v = self.object:get_velocity()
if v.y > 0 then
-- apply gravity when moving up
self.object:set_acceleration({
x = 0,
y = DEFAULT_FALL_SPEED,
z = 0
})
elseif v.y <= 0 and v.y > self.fall_speed then
-- fall downwards at set speed
self.object:set_acceleration({
x = 0,
y = self.fall_speed,
z = 0
})
else
-- stop accelerating once max fall speed hit
self.object:set_acceleration({x = 0, y = 0, z = 0})
end
if minetest.registered_nodes[node_ok(pos).name].groups.lava then
if self.floats_on_lava == 1 then
self.object:set_acceleration({
x = 0,
y = -self.fall_speed / (math.max(1, v.y) ^ 2),
z = 0
})
end
end
-- in water then float up
if minetest.registered_nodes[node_ok(pos).name].groups.water then
if self.floats == 1 then
self.object:set_acceleration({
x = 0,
y = -self.fall_speed / (math.max(1, v.y) ^ 2),
z = 0
})
end
else
-- fall damage onto solid ground
if self.fall_damage == 1
and self.object:get_velocity().y == 0 then
local n = node_ok(vector.offset(pos,0,-1,0)).name
local d = (self.old_y or 0) - self.object:get_pos().y
if d > 5 and n ~= "air" and n ~= "ignore" then
local add = minetest.get_item_group(self.standing_on, "fall_damage_add_percent")
local damage = d - 5
if add ~= 0 then
damage = damage + damage * (add/100)
end
self:damage_mob("fall",damage)
end
self.old_y = self.object:get_pos().y
end
end
end
function mob_class:check_water_flow()
-- Add water flowing for mobs from mcl_item_entity
local p, node, nn, def
p = self.object:get_pos()
node = minetest.get_node_or_nil(p)
if node then
nn = node.name
def = minetest.registered_nodes[nn]
end
-- Move item around on flowing liquids
if def and def.liquidtype == "flowing" then
--[[ Get flowing direction (function call from flowlib), if there's a liquid.
NOTE: According to Qwertymine, flowlib.quickflow is only reliable for liquids with a flowing distance of 7.
Luckily, this is exactly what we need if we only care about water, which has this flowing distance. ]]
local vec = flowlib.quick_flow(p, node)
-- Just to make sure we don't manipulate the speed for no reason
if vec.x ~= 0 or vec.y ~= 0 or vec.z ~= 0 then
-- Minecraft Wiki: Flowing speed is "about 1.39 meters per second"
local f = 1.39
-- Set new item moving speed into the direciton of the liquid
local newv = vector.multiply(vec, f)
self.object:set_acceleration({x = 0, y = 0, z = 0})
self.object:set_velocity({x = newv.x, y = -0.22, z = newv.z})
self.physical_state = true
self._flowing = true
self.object:set_properties({
physical = true
})
return
end
elseif self._flowing == true then
-- Disable flowing physics if not on/in flowing liquid
self._flowing = false
return
end
end
function mob_class:check_dying()
if ((self.state and self.state=="die") or self:check_for_death()) and not self.animation.die_end then
local rot = self.object:get_rotation()
rot.z = ((math.pi/2-rot.z)*.2)+rot.z
self.object:set_rotation(rot)
return true
end
end
function mob_class:check_suspend()
if not self:player_in_active_range() then
local pos = self.object:get_pos()
local node_under = node_ok(vector.offset(pos,0,-1,0)).name
local acc = self.object:get_acceleration()
self:set_animation( "stand", true)
if acc.y > 0 or node_under ~= "air" then
self.object:set_acceleration(vector.new(0,0,0))
self.object:set_velocity(vector.new(0,0,0))
end
if acc.y == 0 and node_under == "air" then
self:falling(pos)
end
return true
end
end

View File

@ -1,4 +1,7 @@
--lua locals --lua locals
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
local mob_class = mcl_mobs.mob_class
local get_node = minetest.get_node local get_node = minetest.get_node
local get_item_group = minetest.get_item_group local get_item_group = minetest.get_item_group
local get_node_light = minetest.get_node_light local get_node_light = minetest.get_node_light
@ -25,15 +28,19 @@ local table_remove = table.remove
local pairs = pairs local pairs = pairs
local dbg_spawn_attempts = 0 local dbg_spawn_attempts = 0
local dbg_spawn_succ = 0 local dbg_spawn_succ = 0
local dbg_spawn_counts = {}
-- range for mob count -- range for mob count
local aoc_range = 136 local aoc_range = 136
local remove_far = true
local mob_cap = { local mob_cap = {
monster = minetest.settings:get_bool("mcl_mob_cap_monster") or 70, monster = tonumber(minetest.settings:get("mcl_mob_cap_monster")) or 70,
animal = minetest.settings:get_bool("mcl_mob_cap_animal") or 10, animal = tonumber(minetest.settings:get("mcl_mob_cap_animal")) or 10,
ambient = minetest.settings:get_bool("mcl_mob_cap_ambient") or 15, ambient = tonumber(minetest.settings:get("mcl_mob_cap_ambient")) or 15,
water = minetest.settings:get_bool("mcl_mob_cap_water") or 5, --currently unused water = tonumber(minetest.settings:get("mcl_mob_cap_water")) or 5, --currently unused
water_ambient = minetest.settings:get_bool("mcl_mob_cap_water_ambient") or 20, --currently unused water_ambient = tonumber(minetest.settings:get("mcl_mob_cap_water_ambient")) or 20, --currently unused
player = tonumber(minetest.settings:get("mcl_mob_cap_player")) or 75,
total = tonumber(minetest.settings:get("mcl_mob_cap_total")) or 500,
} }
--do mobs spawn? --do mobs spawn?
@ -237,6 +244,17 @@ local function count_mobs_total(mob_type)
return num return num
end end
local function count_mobs_total_cap(mob_type)
local num = 0
for _,l in pairs(minetest.luaentities) do
if l.is_mob then
if ( mob_type == nil or l.type == mob_type ) and l.can_despawn and not l.nametag then
num = num + 1
end
end
end
return num
end
-- global functions -- global functions
@ -418,11 +436,38 @@ local function get_water_spawn(p)
end end
end end
local function spawn_check(pos,spawn_def) local function has_room(self,pos)
local cb = self.collisionbox
local nodes = {}
if self.fly_in then
local t = type(self.fly_in)
if t == "table" then
nodes = table.copy(self.fly_in)
elseif t == "string" then
table.insert(nodes,self.fly_in)
end
end
table.insert(nodes,"air")
local x = cb[4] - cb[1]
local y = cb[5] - cb[2]
local z = cb[6] - cb[3]
local r = math.ceil(x * y * z)
local p1 = vector.offset(pos,cb[1],cb[2],cb[3])
local p2 = vector.offset(pos,cb[4],cb[5],cb[6])
local n = #minetest.find_nodes_in_area(p1,p2,nodes) or 0
if r > n then
minetest.log("warning","[mcl_mobs] No room for mob "..self.name.." at "..minetest.pos_to_string(vector.round(pos)))
return false
end
return true
end
local function spawn_check(pos,spawn_def,ignore_caps)
if not spawn_def then return end if not spawn_def then return end
dbg_spawn_attempts = dbg_spawn_attempts + 1 dbg_spawn_attempts = dbg_spawn_attempts + 1
local dimension = mcl_worlds.pos_to_dimension(pos) local dimension = mcl_worlds.pos_to_dimension(pos)
local mob_type = minetest.registered_entities[spawn_def.name].type local mob_def = minetest.registered_entities[spawn_def.name]
local mob_type = mob_def.type
local gotten_node = get_node(pos).name local gotten_node = get_node(pos).name
local gotten_biome = minetest.get_biome_data(pos) local gotten_biome = minetest.get_biome_data(pos)
if not gotten_node or not gotten_biome then return end if not gotten_node or not gotten_biome then return end
@ -435,29 +480,33 @@ local function spawn_check(pos,spawn_def)
is_ground = minetest.get_item_group(gotten_node,"solid") ~= 0 is_ground = minetest.get_item_group(gotten_node,"solid") ~= 0
end end
pos.y = pos.y + 1 pos.y = pos.y + 1
local has_room = #minetest.find_nodes_in_area(pos,vector.offset(pos,0,1,0),{"air"}) or 0 >= 2
local is_water = get_item_group(gotten_node, "water") ~= 0 local is_water = get_item_group(gotten_node, "water") ~= 0
local is_lava = get_item_group(gotten_node, "lava") ~= 0 local is_lava = get_item_group(gotten_node, "lava") ~= 0
local is_leaf = get_item_group(gotten_node, "leaves") ~= 0 local is_leaf = get_item_group(gotten_node, "leaves") ~= 0
local is_bedrock = gotten_node == "mcl_core:bedrock" local is_bedrock = gotten_node == "mcl_core:bedrock"
local is_grass = minetest.get_item_group(gotten_node,"grass_block") ~= 0 local is_grass = minetest.get_item_group(gotten_node,"grass_block") ~= 0
local mob_count_wide = count_mobs(pos,aoc_range,mob_type) local mob_count_wide = 0
local mob_count = count_mobs(pos,32,mob_type)
local mob_count = 0
if not ignore_caps then
mob_count = count_mobs(pos,32,mob_type)
mob_count_wide = count_mobs(pos,aoc_range,mob_type)
end
if pos and spawn_def if pos and spawn_def
and mob_count_wide < (mob_cap[mob_type] or 15) and ( mob_count_wide < (mob_cap[mob_type] or 15) )
and mob_count < 5 and ( mob_count < 5 )
and pos.y >= spawn_def.min_height and pos.y >= spawn_def.min_height
and pos.y <= spawn_def.max_height and pos.y <= spawn_def.max_height
and spawn_def.dimension == dimension and spawn_def.dimension == dimension
and biome_check(spawn_def.biomes, gotten_biome) and biome_check(spawn_def.biomes, gotten_biome)
and (is_ground or spawn_def.type_of_spawning ~= "ground") and (is_ground or spawn_def.type_of_spawning ~= "ground")
and (spawn_def.type_of_spawning ~= "ground" or not is_leaf) and (spawn_def.type_of_spawning ~= "ground" or not is_leaf)
and (spawn_def.type_of_spawning ~= "ground" or has_room) and has_room(mob_def,pos)
and (spawn_def.check_position and spawn_def.check_position(pos) or true) and (spawn_def.check_position and spawn_def.check_position(pos) or true)
and (not is_farm_animal(spawn_def.name) or is_grass) and (not is_farm_animal(spawn_def.name) or is_grass)
and (spawn_def.type_of_spawning ~= "water" or is_water) and (spawn_def.type_of_spawning ~= "water" or is_water)
and ( not spawn_protected or not minetest.is_protected(s, "") ) and ( not spawn_protected or not minetest.is_protected(pos, "") )
and not is_bedrock then and not is_bedrock then
--only need to poll for node light if everything else worked --only need to poll for node light if everything else worked
local gotten_light = get_node_light(pos) local gotten_light = get_node_light(pos)
@ -473,6 +522,11 @@ function mcl_mobs.spawn(pos,id)
if not def or (def.can_spawn and not def.can_spawn(pos)) or not def.is_mob then if not def or (def.can_spawn and not def.can_spawn(pos)) or not def.is_mob then
return false return false
end end
if not dbg_spawn_counts[def.name] then
dbg_spawn_counts[def.name] = 1
else
dbg_spawn_counts[def.name] = dbg_spawn_counts[def.name] + 1
end
return minetest.add_entity(pos, def.name) return minetest.add_entity(pos, def.name)
end end
@ -488,7 +542,7 @@ local function spawn_group(p,mob,spawn_on,group_max,group_min)
end end
for i = 1, math.random(group_min,group_max) do for i = 1, math.random(group_min,group_max) do
local sp = vector.offset(nn[math.random(#nn)],0,1,0) local sp = vector.offset(nn[math.random(#nn)],0,1,0)
if spawn_check(nn[math.random(#nn)],mob) then if spawn_check(nn[math.random(#nn)],mob,true) then
if mob.type_of_spawning == "water" then if mob.type_of_spawning == "water" then
sp = get_water_spawn(sp) sp = get_water_spawn(sp)
end end
@ -501,15 +555,77 @@ end
mcl_mobs.spawn_group = spawn_group mcl_mobs.spawn_group = spawn_group
local S = minetest.get_translator("mcl_mobs")
minetest.register_chatcommand("spawn_mob",{ minetest.register_chatcommand("spawn_mob",{
privs = { debug = true }, 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."),
func = function(n,param) func = function(n,param)
local pos = minetest.get_player_by_name(n):get_pos() local pos = minetest.get_player_by_name(n):get_pos()
if mcl_mobs.spawn(pos,param) then
return true, param.." spawned at "..minetest.pos_to_string(pos), local modifiers = {}
minetest.log("action", n.." spawned "..param.." at "..minetest.pos_to_string(pos)) for capture in string.gmatch(param, "%:(.-)%:") do
table.insert(modifiers, ":"..capture)
end end
return false, "Couldn't spawn "..param
local mod1 = string.find(param, ":")
local mobname = param
if mod1 then
mobname = string.sub(param, 1, mod1-1)
end
local mob = mcl_mobs.spawn(pos,mobname)
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 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
local variable = string.sub(modifs, mod_start+1, mod_vals-1)
local value = string.sub(modifs, mod_vals+1, mod_end-1)
number_tag = string.find(value, "NUM")
if number_tag then
value = tonumber(string.sub(value, 4, -1))
end
if value == "true" then
value = true
elseif value == "false" then
value = false
end
if not mob_entity[variable] then
minetest.log("warning", n.." mob variable "..variable.." previously unset")
end
mob_entity[variable] = value
else
minetest.log("warning", n.." couldn't modify "..mobname.." at "..minetest.pos_to_string(pos).. ", missing paramaters")
end
else
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))
end
return false, "Couldn't spawn "..mobname
end end
}) })
@ -547,6 +663,8 @@ if mobs_spawn then
step_chance = step_chance + mob_chance step_chance = step_chance + mob_chance
end end
local mob_def = mob_library_worker_table[mob_index] local mob_def = mob_library_worker_table[mob_index]
--minetest.log(mob_def.name.." "..step_chance.. " "..mob_chance)
if mob_def and mob_def.name and minetest.registered_entities[mob_def.name] then
local spawn_in_group = minetest.registered_entities[mob_def.name].spawn_in_group or 4 local spawn_in_group = minetest.registered_entities[mob_def.name].spawn_in_group or 4
local spawn_in_group_min = minetest.registered_entities[mob_def.name].spawn_in_group_min or 1 local spawn_in_group_min = minetest.registered_entities[mob_def.name].spawn_in_group_min or 1
local mob_type = minetest.registered_entities[mob_def.name].type local mob_type = minetest.registered_entities[mob_def.name].type
@ -554,30 +672,28 @@ if mobs_spawn then
if mob_def.type_of_spawning == "water" then if mob_def.type_of_spawning == "water" then
spawning_position = get_water_spawn(spawning_position) spawning_position = get_water_spawn(spawning_position)
if not spawning_position then if not spawning_position then
minetest.log("warning","[mcl_mobs] no water spawn for mob "..mob_def.name.." found at "..minetest.pos_to_string(vector.round(pos)))
return return
end end
end end
if minetest.registered_entities[mob_def.name].can_spawn and not minetest.registered_entities[mob_def.name].can_spawn(pos) then if minetest.registered_entities[mob_def.name].can_spawn and not minetest.registered_entities[mob_def.name].can_spawn(spawning_position) then
minetest.log("warning","[mcl_mobs] mob "..mob_def.name.." refused to spawn at "..minetest.pos_to_string(vector.round(spawning_position)))
return return
end end
--everything is correct, spawn mob --everything is correct, spawn mob
local object local object
if spawn_in_group and ( mob_type ~= "monster" or math.random(5) == 1 ) then if spawn_in_group and ( mob_type ~= "monster" or math.random(5) == 1 ) then
if logging then if logging then
minetest.log("action", "[mcl_mobs] A group of mob " .. mob_def.name .. " spawns at " .. minetest.pos_to_string(spawning_position, 1)) minetest.log("action", "[mcl_mobs] A group of mob " .. mob_def.name .. " spawns on " ..minetest.get_node(vector.offset(spawning_position,0,-1,0)).name .." at " .. minetest.pos_to_string(spawning_position, 1))
end end
object = spawn_group(spawning_position,mob_def,{minetest.get_node(vector.offset(spawning_position,0,-1,0)).name},spawn_in_group,spawn_in_group_min) object = spawn_group(spawning_position,mob_def,{minetest.get_node(vector.offset(spawning_position,0,-1,0)).name},spawn_in_group,spawn_in_group_min)
else else
if logging then if logging then
minetest.log("action", "[mcl_mobs] Mob " .. mob_def.name .. " spawns at " .. minetest.pos_to_string(spawning_position, 1)) minetest.log("action", "[mcl_mobs] Mob " .. mob_def.name .. " spawns on " ..minetest.get_node(vector.offset(spawning_position,0,-1,0)).name .." at ".. minetest.pos_to_string(spawning_position, 1))
end end
object = mcl_mobs.spawn(spawning_position, mob_def.name) object = mcl_mobs.spawn(spawning_position, mob_def.name)
end end
if object then
return mob_def.on_spawn and mob_def.on_spawn(object, spawning_position)
end end
end end
current_summary_chance = current_summary_chance - mob_chance current_summary_chance = current_summary_chance - mob_chance
@ -593,23 +709,52 @@ if mobs_spawn then
timer = timer + dtime timer = timer + dtime
if timer < 10 then return end if timer < 10 then return end
timer = 0 timer = 0
for _, player in pairs(get_connected_players()) do local players = get_connected_players()
local total_mobs = count_mobs_total_cap()
if total_mobs > mob_cap.total or total_mobs > #players * mob_cap.player then
minetest.log("action","[mcl_mobs] global mob cap reached. no cycle spawning.")
return
end --mob cap per player
for _, player in pairs(players) do
local pos = player:get_pos() local pos = player:get_pos()
local dimension = mcl_worlds.pos_to_dimension(pos) local dimension = mcl_worlds.pos_to_dimension(pos)
-- ignore void and unloaded area -- ignore void and unloaded area
if dimension ~= "void" and dimension ~= "default" then if dimension ~= "void" and dimension ~= "default" then
local y_min, y_max = decypher_limits(pos.y) local y_min, y_max = decypher_limits(pos.y)
for i = 1, math_random(1, 4) do
spawn_a_mob(pos, dimension, y_min, y_max) spawn_a_mob(pos, dimension, y_min, y_max)
end end
end end
end
end) end)
end end
function mob_class:check_despawn(pos)
-- Despawning: when lifetimer expires, remove mob
if remove_far
and self.can_despawn == true
and ((not self.nametag) or (self.nametag == ""))
and self.state ~= "attack"
and self.following == nil then
if self.despawn_immediately or self.lifetimer <= 0 then
if logging then
minetest.log("action", "[mcl_mobs] Mob "..self.name.." despawns at "..minetest.pos_to_string(pos, 1) .. " lifetimer ran out")
end
mcl_burning.extinguish(self.object)
self.object:remove()
return true
elseif self.lifetimer <= 10 then
if math.random(10) < 4 then
self.despawn_immediately = true
else
self.lifetimer = 20
end
end
end
end
minetest.register_chatcommand("mobstats",{ minetest.register_chatcommand("mobstats",{
privs = { debug = true }, privs = { debug = true },
func = function(n,param) func = function(n,param)
minetest.chat_send_player(n,dump(dbg_spawn_counts))
local pos = minetest.get_player_by_name(n):get_pos() local pos = minetest.get_player_by_name(n):get_pos()
minetest.chat_send_player(n,"mobs within 32 radius of player:"..count_mobs(pos,32)) minetest.chat_send_player(n,"mobs within 32 radius of player:"..count_mobs(pos,32))
minetest.chat_send_player(n,"total mobs:"..count_mobs_total()) minetest.chat_send_player(n,"total mobs:"..count_mobs_total())

View File

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

View File

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

View File

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

View File

@ -12,7 +12,7 @@ local mod_target = minetest.get_modpath("mcl_target")
--################### --###################
mcl_mobs:register_mob("mobs_mc:blaze", { mcl_mobs.register_mob("mobs_mc:blaze", {
description = S("Blaze"), description = S("Blaze"),
type = "monster", type = "monster",
spawn_class = "hostile", spawn_class = "hostile",
@ -26,6 +26,12 @@ mcl_mobs:register_mob("mobs_mc:blaze", {
rotate = -180, rotate = -180,
visual = "mesh", visual = "mesh",
mesh = "mobs_mc_blaze.b3d", mesh = "mobs_mc_blaze.b3d",
head_swivel = "head.control",
bone_eye_height = 4,
head_eye_height = 3.5,
curiosity = 10,
head_yaw_offset = 180,
head_pitch_multiplier=-1,
textures = { textures = {
{"mobs_mc_blaze.png"}, {"mobs_mc_blaze.png"},
}, },
@ -147,7 +153,7 @@ mcl_vars.mg_nether_min,
mcl_vars.mg_nether_max) mcl_vars.mg_nether_max)
-- Blaze fireball -- Blaze fireball
mcl_mobs:register_arrow("mobs_mc:blaze_fireball", { mcl_mobs.register_arrow("mobs_mc:blaze_fireball", {
visual = "sprite", visual = "sprite",
visual_size = {x = 0.3, y = 0.3}, visual_size = {x = 0.3, y = 0.3},
textures = {"mcl_fire_fire_charge.png"}, textures = {"mcl_fire_fire_charge.png"},
@ -202,4 +208,4 @@ mcl_mobs:register_arrow("mobs_mc:blaze_fireball", {
}) })
-- spawn eggs -- spawn eggs
mcl_mobs:register_egg("mobs_mc:blaze", S("Blaze"), "mobs_mc_spawn_icon_blaze.png", 0) mcl_mobs.register_egg("mobs_mc:blaze", S("Blaze"), "#f6b201", "#fff87e", 0)

View File

@ -8,7 +8,7 @@ local S = minetest.get_translator("mobs_mc")
mcl_mobs:register_mob("mobs_mc:chicken", { mcl_mobs.register_mob("mobs_mc:chicken", {
description = S("Chicken"), description = S("Chicken"),
type = "animal", type = "animal",
spawn_class = "passive", spawn_class = "passive",
@ -20,12 +20,18 @@ mcl_mobs:register_mob("mobs_mc:chicken", {
collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.69, 0.2}, collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.69, 0.2},
runaway = true, runaway = true,
floats = 1, floats = 1,
head_swivel = "head.control",
bone_eye_height = 4,
head_eye_height = 1.5,
horrizonatal_head_height = -.3,
curiosity = 10,
head_yaw="z",
visual_size = {x=1,y=1},
visual = "mesh", visual = "mesh",
mesh = "mobs_mc_chicken.b3d", mesh = "mobs_mc_chicken.b3d",
textures = { textures = {
{"mobs_mc_chicken.png"}, {"mobs_mc_chicken.png"},
}, },
visual_size = {x=2.2, y=2.2},
makes_footstep_sound = true, makes_footstep_sound = true,
walk_velocity = 1, walk_velocity = 1,
@ -58,12 +64,15 @@ mcl_mobs:register_mob("mobs_mc:chicken", {
distance = 16, distance = 16,
}, },
animation = { animation = {
stand_speed = 25, walk_speed = 25, run_speed = 50,
stand_start = 0, stand_end = 0, stand_start = 0, stand_end = 0,
walk_start = 0, walk_end = 40, walk_start = 0, walk_end = 20, walk_speed = 25,
run_start = 0, run_end = 40, run_start = 0, run_end = 20, run_speed = 50,
},
child_animations = {
stand_start = 31, stand_end = 31,
walk_start = 31, walk_end = 51, walk_speed = 37,
run_start = 31, run_end = 51, run_speed = 75,
}, },
follow = { follow = {
"mcl_farming:wheat_seeds", "mcl_farming:wheat_seeds",
"mcl_farming:melon_seeds", "mcl_farming:melon_seeds",
@ -74,7 +83,7 @@ mcl_mobs:register_mob("mobs_mc:chicken", {
fear_height = 4, fear_height = 4,
on_rightclick = function(self, clicker) on_rightclick = function(self, clicker)
if mcl_mobs:feed_tame(self, clicker, 1, true, false) then return end if self:feed_tame(clicker, 1, true, false) then return end
if mcl_mobs:protect(self, clicker) then return end if mcl_mobs:protect(self, clicker) then return end
if mcl_mobs:capture_mob(self, clicker, 0, 60, 5, false, nil) then return end if mcl_mobs:capture_mob(self, clicker, 0, 60, 5, false, nil) then return end
end, end,
@ -154,4 +163,4 @@ mobs_mc.water_level,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)
-- spawn eggs -- spawn eggs
mcl_mobs:register_egg("mobs_mc:chicken", S("Chicken"), "mobs_mc_spawn_icon_chicken.png", 0) mcl_mobs.register_egg("mobs_mc:chicken", S("Chicken"), "#a1a1a1", "#ff0000", 0)

View File

@ -102,7 +102,8 @@ local cod = {
end end
end, end,
on_rightclick = function(self, clicker) on_rightclick = function(self, clicker)
if clicker:get_wielded_item():get_name() == "mcl_buckets:bucket_water" then local bn = clicker:get_wielded_item():get_name()
if bn == "mcl_buckets:bucket_water" or bn == "mcl_buckets:bucket_river_water" then
self.object:remove() self.object:remove()
clicker:set_wielded_item("mcl_buckets:bucket_cod") clicker:set_wielded_item("mcl_buckets:bucket_cod")
awards.unlock(clicker:get_player_name(), "mcl:tacticalFishing") awards.unlock(clicker:get_player_name(), "mcl:tacticalFishing")
@ -110,7 +111,7 @@ local cod = {
end end
} }
mcl_mobs:register_mob("mobs_mc:cod", cod) mcl_mobs.register_mob("mobs_mc:cod", cod)
--spawning TODO: in schools --spawning TODO: in schools
@ -271,4 +272,4 @@ water-16,
water+1) water+1)
--spawn egg --spawn egg
mcl_mobs:register_egg("mobs_mc:cod", S("Cod"), "extra_mobs_spawn_icon_cod.png", 0) mcl_mobs.register_egg("mobs_mc:cod", S("Cod"), "#c1a76a", "#e5c48b", 0)

View File

@ -6,18 +6,26 @@ local cow_def = {
description = S("Cow"), description = S("Cow"),
type = "animal", type = "animal",
spawn_class = "passive", spawn_class = "passive",
passive = true,
hp_min = 10, hp_min = 10,
hp_max = 10, hp_max = 10,
xp_min = 1, xp_min = 1,
xp_max = 3, xp_max = 3,
collisionbox = {-0.45, -0.01, -0.45, 0.45, 1.39, 0.45}, collisionbox = {-0.45, -0.01, -0.45, 0.45, 1.39, 0.45},
spawn_in_group = 8,
spawn_in_group_min = 3,
visual = "mesh", visual = "mesh",
mesh = "mobs_mc_cow.b3d", mesh = "mobs_mc_cow.b3d",
textures = { { textures = { {
"mobs_mc_cow.png", "mobs_mc_cow.png",
"blank.png", "blank.png",
}, }, }, },
visual_size = {x=2.8, y=2.8}, head_swivel = "head.control",
bone_eye_height = 10,
head_eye_height = 1.1,
horrizonatal_head_height=-1.8,
curiosity = 2,
head_yaw="z",
makes_footstep_sound = true, makes_footstep_sound = true,
walk_velocity = 1, walk_velocity = 1,
drops = { drops = {
@ -41,14 +49,17 @@ local cow_def = {
distance = 16, distance = 16,
}, },
animation = { animation = {
stand_speed = 25, walk_speed = 40, stand_start = 0, stand_end = 0,
run_speed = 60, stand_start = 0, walk_start = 0, walk_end = 40, walk_speed = 30,
stand_end = 0, walk_start = 0, run_start = 0, run_end = 40, run_speed = 40,
walk_end = 40, run_start = 0, },
run_end = 40, child_animations = {
stand_start = 41, stand_end = 41,
walk_start = 41, walk_end = 81, walk_speed = 45,
run_start = 41, run_end = 81, run_speed = 60,
}, },
on_rightclick = function(self, clicker) on_rightclick = function(self, clicker)
if mcl_mobs:feed_tame(self, clicker, 1, true, false) then return end if self:feed_tame(clicker, 1, true, false) then return end
if mcl_mobs:protect(self, clicker) then return end if mcl_mobs:protect(self, clicker) then return end
if self.child then if self.child then
@ -77,17 +88,16 @@ local cow_def = {
fear_height = 4, fear_height = 4,
} }
mcl_mobs:register_mob("mobs_mc:cow", cow_def) mcl_mobs.register_mob("mobs_mc:cow", cow_def)
-- Mooshroom -- Mooshroom
local mooshroom_def = table.copy(cow_def) local mooshroom_def = table.copy(cow_def)
mooshroom_def.description = S("Mooshroom") mooshroom_def.description = S("Mooshroom")
mooshroom_def.mesh = "mobs_mc_cow.b3d"
mooshroom_def.spawn_in_group_min = 4 mooshroom_def.spawn_in_group_min = 4
mooshroom_def.spawn_in_group = 8 mooshroom_def.spawn_in_group = 8
mooshroom_def.textures = { {"mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png"}, {"mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } } mooshroom_def.textures = { {"mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png"}, {"mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } }
mooshroom_def.on_rightclick = function(self, clicker) mooshroom_def.on_rightclick = function(self, clicker)
if mcl_mobs:feed_tame(self, clicker, 1, true, false) then return end if self:feed_tame(clicker, 1, true, false) then return end
if mcl_mobs:protect(self, clicker) then return end if mcl_mobs:protect(self, clicker) then return end
if self.child then if self.child then
@ -143,7 +153,17 @@ mooshroom_def.on_rightclick = function(self, clicker)
end end
mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil)
end end
mcl_mobs:register_mob("mobs_mc:mooshroom", mooshroom_def)
mooshroom_def.on_lightning_strike = function(self, pos, pos2, objects)
if self.base_texture[1] == "mobs_mc_mooshroom_brown.png" then
self.base_texture = { "mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png" }
else
self.base_texture = { "mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" }
end
self.object:set_properties({ textures = self.base_texture })
return true
end
mcl_mobs.register_mob("mobs_mc:mooshroom", mooshroom_def)
-- Spawning -- Spawning
@ -211,5 +231,5 @@ mcl_vars.mg_overworld_min,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)
-- spawn egg -- spawn egg
mcl_mobs:register_egg("mobs_mc:cow", S("Cow"), "mobs_mc_spawn_icon_cow.png", 0) mcl_mobs.register_egg("mobs_mc:cow", S("Cow"), "#443626", "#a1a1a1", 0)
mcl_mobs:register_egg("mobs_mc:mooshroom", S("Mooshroom"), "mobs_mc_spawn_icon_mooshroom.png", 0) mcl_mobs.register_egg("mobs_mc:mooshroom", S("Mooshroom"), "#a00f10", "#b7b7b7", 0)

View File

@ -9,7 +9,7 @@ local S = minetest.get_translator("mobs_mc")
mcl_mobs:register_mob("mobs_mc:creeper", { mcl_mobs.register_mob("mobs_mc:creeper", {
type = "monster", type = "monster",
spawn_class = "hostile", spawn_class = "hostile",
spawn_in_group = 1, spawn_in_group = 1,
@ -21,6 +21,9 @@ mcl_mobs:register_mob("mobs_mc:creeper", {
pathfinding = 1, pathfinding = 1,
visual = "mesh", visual = "mesh",
mesh = "mobs_mc_creeper.b3d", mesh = "mobs_mc_creeper.b3d",
head_swivel = "Head_Control",
bone_eye_height = 2.35,
curiosity = 2,
textures = { textures = {
{"mobs_mc_creeper.png", {"mobs_mc_creeper.png",
"mobs_mc_empty.png"}, "mobs_mc_empty.png"},
@ -78,7 +81,7 @@ mcl_mobs:register_mob("mobs_mc:creeper", {
if self._forced_explosion_countdown_timer ~= nil then if self._forced_explosion_countdown_timer ~= nil then
self._forced_explosion_countdown_timer = self._forced_explosion_countdown_timer - dtime self._forced_explosion_countdown_timer = self._forced_explosion_countdown_timer - dtime
if self._forced_explosion_countdown_timer <= 0 then if self._forced_explosion_countdown_timer <= 0 then
mcl_mobs:boom(self, mcl_util.get_object_center(self.object), self.explosion_strength) self:boom(mcl_util.get_object_center(self.object), self.explosion_strength)
end end
end end
end, end,
@ -130,7 +133,7 @@ mcl_mobs:register_mob("mobs_mc:creeper", {
view_range = 16, view_range = 16,
}) })
mcl_mobs:register_mob("mobs_mc:creeper_charged", { mcl_mobs.register_mob("mobs_mc:creeper_charged", {
description = S("Creeper"), description = S("Creeper"),
type = "monster", type = "monster",
spawn_class = "hostile", spawn_class = "hostile",
@ -200,7 +203,7 @@ mcl_mobs:register_mob("mobs_mc:creeper_charged", {
if self._forced_explosion_countdown_timer ~= nil then if self._forced_explosion_countdown_timer ~= nil then
self._forced_explosion_countdown_timer = self._forced_explosion_countdown_timer - dtime self._forced_explosion_countdown_timer = self._forced_explosion_countdown_timer - dtime
if self._forced_explosion_countdown_timer <= 0 then if self._forced_explosion_countdown_timer <= 0 then
mcl_mobs:boom(self, mcl_util.get_object_center(self.object), self.explosion_strength) self:boom(mcl_util.get_object_center(self.object), self.explosion_strength)
end end
end end
end, end,
@ -216,6 +219,10 @@ mcl_mobs:register_mob("mobs_mc:creeper_charged", {
end end
end end
end, end,
on_lightning_strike = function(self, pos, pos2, objects)
mcl_util.replace_mob(self.object, "mobs_mc:creeper_charged")
return true
end,
maxdrops = 2, maxdrops = 2,
drops = { drops = {
{name = "mcl_mobitems:gunpowder", {name = "mcl_mobitems:gunpowder",
@ -404,4 +411,4 @@ mcl_vars.mg_overworld_min,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)
-- spawn eggs -- spawn eggs
mcl_mobs:register_egg("mobs_mc:creeper", S("Creeper"), "mobs_mc_spawn_icon_creeper.png", 0) mcl_mobs.register_egg("mobs_mc:creeper", S("Creeper"), "#0da70a", "#000000", 0)

View File

@ -1 +0,0 @@
mcl_mobs

View File

@ -92,7 +92,7 @@ local dolphin = {
end, end,
} }
mcl_mobs:register_mob("mobs_mc:dolphin", dolphin) mcl_mobs.register_mob("mobs_mc:dolphin", dolphin)
--spawning TO DO: in schools --spawning TO DO: in schools
@ -250,4 +250,4 @@ water-16,
water+1) water+1)
--spawn egg --spawn egg
mcl_mobs:register_egg("mobs_mc:dolphin", S("Dolphin"), "extra_mobs_spawn_icon_dolphin.png", 0) mcl_mobs.register_egg("mobs_mc:dolphin", S("Dolphin"), "#223b4d", "#f9f9f9", 0)

View File

@ -48,7 +48,7 @@ local function check_pos(self)
end end
end end
mcl_mobs:register_mob("mobs_mc:enderdragon", { mcl_mobs.register_mob("mobs_mc:enderdragon", {
description = S("Ender Dragon"), description = S("Ender Dragon"),
type = "monster", type = "monster",
spawn_class = "hostile", spawn_class = "hostile",
@ -142,7 +142,7 @@ mcl_mobs:register_mob("mobs_mc:enderdragon", {
local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false
-- dragon fireball (projectile) -- dragon fireball (projectile)
mcl_mobs:register_arrow("mobs_mc:dragon_fireball", { mcl_mobs.register_arrow("mobs_mc:dragon_fireball", {
visual = "sprite", visual = "sprite",
visual_size = {x = 1.25, y = 1.25}, visual_size = {x = 1.25, y = 1.25},
textures = {"mobs_mc_dragon_fireball.png"}, textures = {"mobs_mc_dragon_fireball.png"},
@ -166,10 +166,11 @@ mcl_mobs:register_arrow("mobs_mc:dragon_fireball", {
-- node hit, explode -- node hit, explode
hit_node = function(self, pos, node) hit_node = function(self, pos, node)
mcl_mobs:boom(self, pos, 2) mcl_mobs.mob_class.boom(self,pos, 2)
end end
}) })
mcl_mobs:register_egg("mobs_mc:enderdragon", S("Ender Dragon"), "mobs_mc_spawn_icon_dragon.png", 0, true) mcl_mobs.register_egg("mobs_mc:enderdragon", S("Ender Dragon"), "#252525", "#b313c9", 0, true)
mcl_wip.register_wip_item("mobs_mc:enderdragon") mcl_wip.register_wip_item("mobs_mc:enderdragon")

View File

@ -24,7 +24,25 @@
-- added rain damage. -- added rain damage.
-- fixed the grass_with_dirt issue. -- fixed the grass_with_dirt issue.
minetest.register_entity("mobs_mc:ender_eyes", {
visual = "mesh",
mesh = "mobs_mc_spider.b3d",
visual_size = {x=1.01/3, y=1.01/3},
textures = {
"mobs_mc_enderman_eyes.png",
},
on_step = function(self)
if self and self.object then
if not self.object:get_attach() then
self.object:remove()
end
end
end,
glow = 50,
})
local S = minetest.get_translator("mobs_mc") local S = minetest.get_translator("mobs_mc")
local enable_damage = minetest.settings:get_bool("enable_damage")
local telesound = function(pos, is_source) local telesound = function(pos, is_source)
local snd local snd
@ -219,58 +237,7 @@ local select_enderman_animation = function(animation_type)
end end
local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false
local spawners = {} local psdefs = {{
mcl_mobs:register_mob("mobs_mc:enderman", {
description = S("Enderman"),
type = "monster",
spawn_class = "passive",
passive = true,
pathfinding = 1,
hp_min = 40,
hp_max = 40,
xp_min = 5,
xp_max = 5,
collisionbox = {-0.3, -0.01, -0.3, 0.3, 2.89, 0.3},
visual = "mesh",
mesh = "mobs_mc_enderman.b3d",
textures = create_enderman_textures(),
visual_size = {x=3, y=3},
makes_footstep_sound = true,
sounds = {
-- TODO: Custom war cry sound
war_cry = "mobs_sandmonster",
death = {name="mobs_mc_enderman_death", gain=0.7},
damage = {name="mobs_mc_enderman_hurt", gain=0.5},
random = {name="mobs_mc_enderman_random", gain=0.5},
distance = 16,
},
walk_velocity = 0.2,
run_velocity = 3.4,
damage = 7,
reach = 2,
drops = {
{name = "mcl_throwing:ender_pearl",
chance = 1,
min = 0,
max = 1,
looting = "common"},
},
animation = select_enderman_animation("normal"),
_taken_node = "",
can_spawn = function(pos)
return #minetest.find_nodes_in_area(vector.offset(pos,0,1,0),vector.offset(pos,0,3,0),{"air"}) > 2
end,
do_custom = function(self, dtime)
-- PARTICLE BEHAVIOUR HERE.
local enderpos = self.object:get_pos()
if self._particle_timer and self._particle_timer >= 1 then
for _,player in pairs(minetest.get_connected_players()) do
if not spawners[player] then spawners[player] = {} end
local dst = vector.distance(player:get_pos(),enderpos)
if dst < 128 and not spawners[player][self.object] then
self._particle_timer = 0
spawners[player][self.object] = minetest.add_particlespawner({
amount = 5, amount = 5,
minpos = vector.new(-0.6,0,-0.6), minpos = vector.new(-0.6,0,-0.6),
maxpos = vector.new(0.6,3,0.6), maxpos = vector.new(0.6,3,0.6),
@ -286,20 +253,65 @@ mcl_mobs:register_mob("mobs_mc:enderman", {
vertical = false, vertical = false,
time = 0, time = 0,
texture = "mcl_portals_particle"..math.random(1, 5)..".png", texture = "mcl_portals_particle"..math.random(1, 5)..".png",
attached = self.object, }}
playername = player:get_player_name(),
}) mcl_mobs.register_mob("mobs_mc:enderman", {
elseif dst > 128 and spawners[player][self.object] then description = S("Enderman"),
minetest.delete_particlespawner(spawners[player][self.object]) type = "monster",
spawners[player][self.object] = nil spawn_class = "passive",
passive = true,
pathfinding = 1,
hp_min = 40,
hp_max = 40,
xp_min = 5,
xp_max = 5,
collisionbox = {-0.3, -0.01, -0.3, 0.3, 2.89, 0.3},
visual = "mesh",
mesh = "mobs_mc_enderman.b3d",
textures = create_enderman_textures(),
visual_size = {x=3, y=3},
makes_footstep_sound = true,
on_spawn = function(self)
local spider_eyes=false
for n = 1, #self.object:get_children() do
local obj = self.object:get_children()[n]
if obj:get_luaentity() and self.object:get_luaentity().name == "mobs_mc:ender_eyes" then
spider_eyes = true
end end
end end
elseif not self._particle_timer then if not spider_eyes then
self._particle_timer = 0 minetest.add_entity(self.object:get_pos(), "mobs_mc:ender_eyes"):set_attach(self.object, "head.top", vector.new(0,2.54,-1.99), vector.new(90,0,180))
minetest.add_entity(self.object:get_pos(), "mobs_mc:ender_eyes"):set_attach(self.object, "head.top", vector.new(1,2.54,-1.99), vector.new(90,0,180))
end end
self._particle_timer = self._particle_timer + dtime end,
sounds = {
-- TODO: Custom war cry sound
war_cry = "mobs_sandmonster",
death = {name="mobs_mc_enderman_death", gain=0.7},
damage = {name="mobs_mc_enderman_hurt", gain=0.5},
random = {name="mobs_mc_enderman_random", gain=0.5},
distance = 16,
},
walk_velocity = 0.2,
run_velocity = 3.4,
damage = 7,
reach = 2,
particlespawners = psdefs,
drops = {
{name = "mcl_throwing:ender_pearl",
chance = 1,
min = 0,
max = 1,
looting = "common"},
},
animation = select_enderman_animation("normal"),
_taken_node = "",
can_spawn = function(pos)
return #minetest.find_nodes_in_area(vector.offset(pos,0,1,0),vector.offset(pos,0,3,0),{"air"}) > 2
end,
do_custom = function(self, dtime)
-- RAIN DAMAGE / EVASIVE WARP BEHAVIOUR HERE. -- RAIN DAMAGE / EVASIVE WARP BEHAVIOUR HERE.
enderpos = self.object:get_pos() local enderpos = self.object:get_pos()
local dim = mcl_worlds.pos_to_dimension(enderpos) local dim = mcl_worlds.pos_to_dimension(enderpos)
if dim == "overworld" then if dim == "overworld" then
if mcl_weather.state == "rain" or mcl_weather.state == "lightning" then if mcl_weather.state == "rain" or mcl_weather.state == "lightning" then
@ -382,7 +394,7 @@ mcl_mobs:register_mob("mobs_mc:enderman", {
-- self:teleport(nil) -- self:teleport(nil)
-- self.state = "" -- self.state = ""
--else --else
if self.attack ~= nil and not minetest.settings:get_bool("creative_mode") then if self.attack ~= nil and enable_damage then
self.state = 'attack' self.state = 'attack'
end end
--end --end
@ -485,7 +497,7 @@ mcl_mobs:register_mob("mobs_mc:enderman", {
self.base_texture = create_enderman_textures(block_type, self._taken_node) self.base_texture = create_enderman_textures(block_type, self._taken_node)
self.object:set_properties({ textures = self.base_texture }) self.object:set_properties({ textures = self.base_texture })
self.animation = select_enderman_animation("block") self.animation = select_enderman_animation("block")
mcl_mobs:set_animation(self, self.animation.current) self:set_animation(self.animation.current)
if def.sounds and def.sounds.dug then if def.sounds and def.sounds.dug then
minetest.sound_play(def.sounds.dug, {pos = take_pos, max_hear_distance = 16}, true) minetest.sound_play(def.sounds.dug, {pos = take_pos, max_hear_distance = 16}, true)
end end
@ -508,7 +520,7 @@ mcl_mobs:register_mob("mobs_mc:enderman", {
local def = minetest.registered_nodes[self._taken_node] local def = minetest.registered_nodes[self._taken_node]
-- Update animation accordingly (removes visible block) -- Update animation accordingly (removes visible block)
self.animation = select_enderman_animation("normal") self.animation = select_enderman_animation("normal")
mcl_mobs:set_animation(self, self.animation.current) self:set_animation(self.animation.current)
if def.sounds and def.sounds.place then if def.sounds and def.sounds.place then
minetest.sound_play(def.sounds.place, {pos = place_pos, max_hear_distance = 16}, true) minetest.sound_play(def.sounds.place, {pos = place_pos, max_hear_distance = 16}, true)
end end
@ -617,15 +629,6 @@ mcl_mobs:register_mob("mobs_mc:enderman", {
attack_type = "dogfight", attack_type = "dogfight",
}) })
minetest.register_on_leaveplayer(function(player)
if not spawners[player] then return end
for _,s in pairs(spawners[player]) do
minetest.delete_particlespawner(s)
end
spawners[player] = nil
end)
-- End spawn -- End spawn
mcl_mobs:spawn_specific( mcl_mobs:spawn_specific(
"mobs_mc:enderman", "mobs_mc:enderman",
@ -829,4 +832,4 @@ mcl_vars.mg_nether_min,
mcl_vars.mg_nether_max) mcl_vars.mg_nether_max)
-- spawn eggs -- spawn eggs
mcl_mobs:register_egg("mobs_mc:enderman", S("Enderman"), "mobs_mc_spawn_icon_enderman.png", 0) mcl_mobs.register_egg("mobs_mc:enderman", S("Enderman"), "#252525", "#151515", 0)

View File

@ -4,7 +4,7 @@
local S = minetest.get_translator("mobs_mc") local S = minetest.get_translator("mobs_mc")
mcl_mobs:register_mob("mobs_mc:endermite", { mcl_mobs.register_mob("mobs_mc:endermite", {
description = S("Endermite"), description = S("Endermite"),
type = "monster", type = "monster",
spawn_class = "hostile", spawn_class = "hostile",
@ -38,4 +38,4 @@ mcl_mobs:register_mob("mobs_mc:endermite", {
reach = 1, reach = 1,
}) })
mcl_mobs:register_egg("mobs_mc:endermite", S("Endermite"), "mobs_mc_spawn_icon_endermite.png", 0) mcl_mobs.register_egg("mobs_mc:endermite", S("Endermite"), "#161616", "#6d6d6d", 0)

View File

@ -10,7 +10,7 @@ local S = minetest.get_translator("mobs_mc")
--################### --###################
mcl_mobs:register_mob("mobs_mc:ghast", { mcl_mobs.register_mob("mobs_mc:ghast", {
description = S("Ghast"), description = S("Ghast"),
type = "monster", type = "monster",
spawn_class = "hostile", spawn_class = "hostile",
@ -103,7 +103,7 @@ mcl_vars.mg_nether_min,
mcl_vars.mg_nether_max) mcl_vars.mg_nether_max)
-- fireball (projectile) -- fireball (projectile)
mcl_mobs:register_arrow("mobs_mc:fireball", { mcl_mobs.register_arrow("mobs_mc:fireball", {
visual = "sprite", visual = "sprite",
visual_size = {x = 1, y = 1}, visual_size = {x = 1, y = 1},
textures = {"mcl_fire_fire_charge.png"}, textures = {"mcl_fire_fire_charge.png"},
@ -118,9 +118,9 @@ mcl_mobs:register_arrow("mobs_mc:fireball", {
}, nil) }, nil)
local p = self.object:get_pos() local p = self.object:get_pos()
if p then if p then
mcl_mobs:boom(self, p, 1, true) mcl_mobs.mob_class.boom(self,p, 1, true)
else else
mcl_mobs:boom(self, player:get_pos(), 1, true) mcl_mobs.mob_class.boom(self,player:get_pos(), 1, true)
end end
end, end,
@ -129,11 +129,11 @@ mcl_mobs:register_arrow("mobs_mc:fireball", {
full_punch_interval = 1.0, full_punch_interval = 1.0,
damage_groups = {fleshy = 6}, damage_groups = {fleshy = 6},
}, nil) }, nil)
mcl_mobs:boom(self, self.object:get_pos(), 1, true) mcl_mobs.mob_class.boom(self,self.object:get_pos(), 1, true)
end, end,
hit_node = function(self, pos, node) hit_node = function(self, pos, node)
mcl_mobs:boom(self, pos, 1, true) mcl_mobs.mob_class.boom(self,pos, 1, true)
end end
}) })
@ -141,4 +141,4 @@ mcl_mobs:register_arrow("mobs_mc:fireball", {
-- spawn eggs -- spawn eggs
mcl_mobs:register_egg("mobs_mc:ghast", S("Ghast"), "mobs_mc_spawn_icon_ghast.png", 0) mcl_mobs.register_egg("mobs_mc:ghast", S("Ghast"), "#f9f9f9", "#bcbcbc", 0)

View File

@ -0,0 +1,246 @@
--MCmobs v0.4
--maikerumine
--made for MC like Survival game
--License for code WTFPL and otherwise stated in readmes
local S = minetest.get_translator("mobs_mc")
local base_psdef = {
amount = 8,
time=0,
minpos = vector.new(-1,-1,-1),
maxpos = vector.new(1,1,1),
minvel = vector.new(-0.25,-0.25,-0.25),
maxvel = vector.new(0.25,0.25,0.25),
minacc = vector.new(-0.5,-0.5,-0.5),
maxacc = vector.new(0.5,0.5,0.5),
minexptime = 1,
maxexptime = 2,
minsize = 0.8,
maxsize= 1.5,
glow = 5,
collisiondetection = true,
collision_removal = true,
}
local psdefs = {}
for i=1,4 do
local p = table.copy(base_psdef)
p.texture = "extra_mobs_glow_squid_glint"..i..".png"
table.insert(psdefs,p)
end
mcl_mobs.register_mob("mobs_mc:glow_squid", {
type = "animal",
spawn_class = "water",
can_despawn = true,
passive = true,
hp_min = 10,
hp_max = 10,
xp_min = 1,
xp_max = 3,
armor = 100,
rotate = 0,
-- tilt_swim breaks the animations.
--tilt_swim = true,
-- FIXME: If the qlow squid is near the floor, it turns black
collisionbox = { -0.4, 0.0, -0.4, 0.4, 0.9, 0.4 },
visual = "mesh",
mesh = "extra_mobs_glow_squid.b3d",
textures = {
{ "extra_mobs_glow_squid.png" }
},
sounds = {
damage = { name = "mobs_mc_squid_hurt", gain = 0.3 },
death = { name = "mobs_mc_squid_death", gain = 0.4 },
flop = "mobs_mc_squid_flop",
distance = 16,
},
animation = {
stand_start = 1,
stand_end = 60,
walk_start = 1,
walk_end = 60,
run_start = 1,
run_end = 60,
},
drops = {
{ name = "mcl_mobitems:glow_ink_sac",
chance = 1,
min = 1,
max = 3,
looting = "common", },
},
visual_size = { x = 3, y = 3 },
makes_footstep_sound = false,
swim = true,
breathes_in_water = true,
jump = false,
view_range = 16,
runaway = true,
fear_height = 4,
fly = true,
fly_in = { "mcl_core:water_source", "mclx_core:river_water_source" },
-- don't add "mcl_core:water_flowing", or it won't move vertically.
glow = minetest.LIGHT_MAX,
particlespawners = psdefs,
})
-- spawning
local water = mobs_mc.water_level - 1
-- local water = mobs_mc.spawn_height.water + 1
mcl_mobs:spawn_specific(
"mobs_mc:glow_squid",
"overworld",
"water",
{
"Mesa",
"FlowerForest",
"Swampland",
"Taiga",
"ExtremeHills",
"Jungle",
"Savanna",
"BirchForest",
"MegaSpruceTaiga",
"MegaTaiga",
"ExtremeHills+",
"Forest",
"Plains",
"Desert",
"ColdTaiga",
"MushroomIsland",
"IcePlainsSpikes",
"SunflowerPlains",
"IcePlains",
"RoofedForest",
"ExtremeHills+_snowtop",
"MesaPlateauFM_grasstop",
"JungleEdgeM",
"ExtremeHillsM",
"JungleM",
"BirchForestM",
"MesaPlateauF",
"MesaPlateauFM",
"MesaPlateauF_grasstop",
"MesaBryce",
"JungleEdge",
"SavannaM",
"FlowerForest_beach",
"Forest_beach",
"StoneBeach",
"ColdTaiga_beach_water",
"Taiga_beach",
"Savanna_beach",
"Plains_beach",
"ExtremeHills_beach",
"ColdTaiga_beach",
"Swampland_shore",
"MushroomIslandShore",
"JungleM_shore",
"Jungle_shore",
"MesaPlateauFM_sandlevel",
"MesaPlateauF_sandlevel",
"MesaBryce_sandlevel",
"Mesa_sandlevel",
"RoofedForest_ocean",
"JungleEdgeM_ocean",
"BirchForestM_ocean",
"BirchForest_ocean",
"IcePlains_deep_ocean",
"Jungle_deep_ocean",
"Savanna_ocean",
"MesaPlateauF_ocean",
"ExtremeHillsM_deep_ocean",
"Savanna_deep_ocean",
"SunflowerPlains_ocean",
"Swampland_deep_ocean",
"Swampland_ocean",
"MegaSpruceTaiga_deep_ocean",
"ExtremeHillsM_ocean",
"JungleEdgeM_deep_ocean",
"SunflowerPlains_deep_ocean",
"BirchForest_deep_ocean",
"IcePlainsSpikes_ocean",
"Mesa_ocean",
"StoneBeach_ocean",
"Plains_deep_ocean",
"JungleEdge_deep_ocean",
"SavannaM_deep_ocean",
"Desert_deep_ocean",
"Mesa_deep_ocean",
"ColdTaiga_deep_ocean",
"Plains_ocean",
"MesaPlateauFM_ocean",
"Forest_deep_ocean",
"JungleM_deep_ocean",
"FlowerForest_deep_ocean",
"MushroomIsland_ocean",
"MegaTaiga_ocean",
"StoneBeach_deep_ocean",
"IcePlainsSpikes_deep_ocean",
"ColdTaiga_ocean",
"SavannaM_ocean",
"MesaPlateauF_deep_ocean",
"MesaBryce_deep_ocean",
"ExtremeHills+_deep_ocean",
"ExtremeHills_ocean",
"MushroomIsland_deep_ocean",
"Forest_ocean",
"MegaTaiga_deep_ocean",
"JungleEdge_ocean",
"MesaBryce_ocean",
"MegaSpruceTaiga_ocean",
"ExtremeHills+_ocean",
"Jungle_ocean",
"RoofedForest_deep_ocean",
"IcePlains_ocean",
"FlowerForest_ocean",
"ExtremeHills_deep_ocean",
"MesaPlateauFM_deep_ocean",
"Desert_ocean",
"Taiga_ocean",
"BirchForestM_deep_ocean",
"Taiga_deep_ocean",
"JungleM_ocean",
"FlowerForest_underground",
"JungleEdge_underground",
"StoneBeach_underground",
"MesaBryce_underground",
"Mesa_underground",
"RoofedForest_underground",
"Jungle_underground",
"Swampland_underground",
"MushroomIsland_underground",
"BirchForest_underground",
"Plains_underground",
"MesaPlateauF_underground",
"ExtremeHills_underground",
"MegaSpruceTaiga_underground",
"BirchForestM_underground",
"SavannaM_underground",
"MesaPlateauFM_underground",
"Desert_underground",
"Savanna_underground",
"Forest_underground",
"SunflowerPlains_underground",
"ColdTaiga_underground",
"IcePlains_underground",
"IcePlainsSpikes_underground",
"MegaTaiga_underground",
"Taiga_underground",
"ExtremeHills+_underground",
"JungleM_underground",
"ExtremeHillsM_underground",
"JungleEdgeM_underground",
},
0,
minetest.LIGHT_MAX + 1,
30,
10000,
3,
water - 16,
water)
-- spawn egg
mcl_mobs.register_egg("mobs_mc:glow_squid", S("Glow Squid"), "#095757", "#87f6c0", 0)

View File

@ -4,7 +4,7 @@
local S = minetest.get_translator("mobs_mc") local S = minetest.get_translator("mobs_mc")
mcl_mobs:register_mob("mobs_mc:guardian", { mcl_mobs.register_mob("mobs_mc:guardian", {
description = S("Guardian"), description = S("Guardian"),
type = "monster", type = "monster",
spawn_class = "hostile", spawn_class = "hostile",
@ -104,4 +104,4 @@ mcl_mobs:register_mob("mobs_mc:guardian", {
--mcl_mobs:spawn_specific("mobs_mc:guardian", { "mcl_core:water_source", "mclx_core:river_water_source" }, { "mcl_core:water_source", "mclx_core:river_water_source" }, 0, minetest.LIGHT_MAX+1, 30, 25000, 2, mcl_vars.mg_overworld_min, mobs_mc.water_level - 10) --mcl_mobs:spawn_specific("mobs_mc:guardian", { "mcl_core:water_source", "mclx_core:river_water_source" }, { "mcl_core:water_source", "mclx_core:river_water_source" }, 0, minetest.LIGHT_MAX+1, 30, 25000, 2, mcl_vars.mg_overworld_min, mobs_mc.water_level - 10)
-- spawn eggs -- spawn eggs
mcl_mobs:register_egg("mobs_mc:guardian", S("Guardian"), "mobs_mc_spawn_icon_guardian.png", 0) mcl_mobs.register_egg("mobs_mc:guardian", S("Guardian"), "#5a8272", "#f17d31", 0)

View File

@ -6,7 +6,7 @@
local S = minetest.get_translator("mobs_mc") local S = minetest.get_translator("mobs_mc")
mcl_mobs:register_mob("mobs_mc:guardian_elder", { mcl_mobs.register_mob("mobs_mc:guardian_elder", {
description = S("Elder Guardian"), description = S("Elder Guardian"),
type = "monster", type = "monster",
spawn_class = "hostile", spawn_class = "hostile",
@ -112,5 +112,6 @@ mcl_mobs:register_mob("mobs_mc:guardian_elder", {
-- mcl_mobs:spawn_specific("mobs_mc:guardian_elder", { "mcl_core:water_source", "mclx_core:river_water_source" }, { "mcl_core:water_source", "mclx_core:river_water_source" }, 0, minetest.LIGHT_MAX+1, 30, 40000, 2, mcl_vars.mg_overworld_min, mobs_mc.water_level-18) -- mcl_mobs:spawn_specific("mobs_mc:guardian_elder", { "mcl_core:water_source", "mclx_core:river_water_source" }, { "mcl_core:water_source", "mclx_core:river_water_source" }, 0, minetest.LIGHT_MAX+1, 30, 40000, 2, mcl_vars.mg_overworld_min, mobs_mc.water_level-18)
-- spawn eggs -- spawn eggs
mcl_mobs:register_egg("mobs_mc:guardian_elder", S("Elder Guardian"), "mobs_mc_spawn_icon_guardian_elder.png", 0) mcl_mobs.register_egg("mobs_mc:guardian_elder", S("Elder Guardian"), "#ceccba", "#747693", 0)

View File

@ -0,0 +1,135 @@
--MCmobs v0.4
--maikerumine
--made for MC like Survival game
--License for code WTFPL and otherwise stated in readmes
local S = minetest.get_translator("mobs_mc")
--###################
--################### hoglin
--###################
local hoglin = {
type = "monster",
passive = false,
spawn_class = "hostile",
hp_min = 40,
hp_max = 40,
xp_min = 9,
xp_max = 9,
armor = {fleshy = 90},
attack_type = "dogfight",
damage = 4,
reach = 3,
collisionbox = {-.6, -0.01, -.6, .6, 1.4, .6},
visual = "mesh",
mesh = "extra_mobs_hoglin.b3d",
textures = { {
"extra_mobs_hoglin.png",
} },
visual_size = {x=3, y=3},
sounds = {
random = "extra_mobs_hoglin",
damage = "extra_mobs_hoglin_hurt",
distance = 16,
},
jump = true,
makes_footstep_sound = true,
walk_velocity = 1,
run_velocity = 4,
drops = {
{name = "mobs_mcitems:leather",
chance = 1,
min = 0,
max = 1,},
},
drops = {
{name = "mcl_mobitems:porkchop",
chance = 1,
min = 2,
max = 4,},
},
animation = {
stand_speed = 7,
walk_speed = 7,
run_speed = 15,
stand_start = 24,
stand_end = 24,
walk_start = 11,
walk_end = 21,
run_start = 1,
run_end = 10,
punch_start = 22,
punch_end = 32,
},
fear_height = 4,
view_range = 32,
floats = 0,
custom_attack = function(self)
if self.state == "attack" and self.reach > vector.distance(self.object:get_pos(), self.attack:get_pos()) then
self.attack:add_velocity({x=0,y=13,z=0})
self.attack:punch(self.object, 1.0, {
full_punch_interval = 1.0,
damage_groups = {fleshy = self.damage}
}, nil)
end
end,
do_custom = function(self)
if self.object:get_pos().y > -100 then
local zog = minetest.add_entity(self.object:get_pos(), "mobs_mc:zoglin")
zog:set_rotation(self.object:get_rotation())
self.object:remove()
end
end,
attack_animals = true,
}
mcl_mobs.register_mob("mobs_mc:hoglin", hoglin)
local zoglin = table.copy(hoglin)
zoglin.fire_resistant = 1
zoglin.textures = {"extra_mobs_zoglin.png"}
zoglin.do_custom = function()
return
end
zoglin.attacks_monsters = true
zoglin.lava_damage = 0
zoglin.fire_damage = 0
mcl_mobs.register_mob("mobs_mc:zoglin", zoglin)
-- Baby hoglin.
local baby_hoglin = table.copy(hoglin)
baby_hoglin.collisionbox = {-.3, -0.01, -.3, .3, 0.94, .3}
baby_hoglin.xp_min = 20
baby_hoglin.xp_max = 20
baby_hoglin.visual_size = {x=hoglin.visual_size.x/2, y=hoglin.visual_size.y/2}
textures = { {
"extra_mobs_hoglin.png",
"extra_mobs_trans.png",
} }
baby_hoglin.walk_velocity = 1.2
baby_hoglin.run_velocity = 2.4
baby_hoglin.child = 1
mcl_mobs.register_mob("mobs_mc:baby_hoglin", baby_hoglin)
-- Regular spawning in the Nether
mcl_mobs:spawn_specific(
"mobs_mc:hoglin",
"nether",
"ground",
{
"Nether",
"CrimsonForest"
},
0,
minetest.LIGHT_MAX+1,
30,
6000,
3,
mcl_vars.mg_nether_min,
mcl_vars.mg_nether_max)
-- spawn eggs
mcl_mobs.register_egg("mobs_mc:hoglin", S("Hoglin"), "#85682e", "#2b2140", 0)

View File

@ -34,6 +34,30 @@ local horse_extra_texture = function(horse)
return textures return textures
end end
local function get_drops(self)
self.drops = {}
table.insert(self.drops,
{name = "mcl_mobitems:leather",
chance = 1,
min = 0,
max = 2,
looting = "common",
})
if self._saddle then
table.insert(self.drops,{name = "mcl_mobitems:saddle",
chance = 1,
min = 1,
max = 1,})
end
if self._chest then
table.insert(self.drops,{name = "mcl_chests:chest",
chance = 1,
min = 1,
max = 1,})
end
end
-- Helper functions to determine equipment rules -- Helper functions to determine equipment rules
local can_equip_horse_armor = function(entity_id) local can_equip_horse_armor = function(entity_id)
return entity_id == "mobs_mc:horse" or entity_id == "mobs_mc:skeleton_horse" or entity_id == "mobs_mc:zombie_horse" return entity_id == "mobs_mc:horse" or entity_id == "mobs_mc:skeleton_horse" or entity_id == "mobs_mc:zombie_horse"
@ -157,6 +181,12 @@ local horse = {
on_spawn = update_textures, on_spawn = update_textures,
do_custom = function(self, dtime) do_custom = function(self, dtime)
if not self._horse_speed then
self._horse_speed = math.random(486, 1457)/100
elseif self.run_velocity ~= self._horse_speed then
self.run_velocity = self._horse_speed
end
-- set needed values if not already present -- set needed values if not already present
if not self._regentimer then if not self._regentimer then
self._regentimer = 0 self._regentimer = 0
@ -237,6 +267,27 @@ local horse = {
local iname = item:get_name() local iname = item:get_name()
local heal = 0 local heal = 0
if self._inv_id then
if not self._chest and item:get_name() == "mcl_chests:chest" then
item:take_item()
clicker:set_wielded_item(item)
self._chest = true
-- Update texture
if not self._naked_texture then
-- Base horse texture without chest or saddle
self._naked_texture = self.base_texture[2]
end
local tex = horse_extra_texture(self)
self.base_texture = tex
self.object:set_properties({textures = self.base_texture})
get_drops(self)
return
elseif self._chest and clicker:get_player_control().sneak then
mcl_entity_invs.show_inv_form(self,clicker)
return
end
end
-- Taming -- Taming
self.temper = self.temper or (math.random(1,100)) self.temper = self.temper or (math.random(1,100))
@ -286,7 +337,7 @@ local horse = {
elseif (iname == "mcl_farming:carrot_item_gold") then elseif (iname == "mcl_farming:carrot_item_gold") then
heal = 4 heal = 4
end end
if heal > 0 and mcl_mobs:feed_tame(self, clicker, heal, true, false) then if heal > 0 and self:feed_tame(clicker, heal, true, false) then
return return
end end
end end
@ -301,7 +352,7 @@ local horse = {
elseif (iname == "mcl_farming:hay_block") then elseif (iname == "mcl_farming:hay_block") then
heal = 20 heal = 20
end end
if heal > 0 and mcl_mobs:feed_tame(self, clicker, heal, false, false) then if heal > 0 and self:feed_tame(clicker, heal, false, false) then
return return
end end
@ -340,6 +391,7 @@ local horse = {
self.base_texture = tex self.base_texture = tex
self.object:set_properties({textures = self.base_texture}) self.object:set_properties({textures = self.base_texture})
minetest.sound_play({name = "mcl_armor_equip_leather"}, {gain=0.5, max_hear_distance=12, pos=self.object:get_pos()}, true) minetest.sound_play({name = "mcl_armor_equip_leather"}, {gain=0.5, max_hear_distance=12, pos=self.object:get_pos()}, true)
get_drops(self)
-- Put on horse armor if tamed -- Put on horse armor if tamed
elseif can_equip_horse_armor(self.name) and not self.driver and not self._horse_armor elseif can_equip_horse_armor(self.name) and not self.driver and not self._horse_armor
@ -389,7 +441,7 @@ local horse = {
on_breed = function(parent1, parent2) on_breed = function(parent1, parent2)
local pos = parent1.object:get_pos() local pos = parent1.object:get_pos()
local child = mcl_mobs:spawn_child(pos, parent1.name) local child = mcl_mobs.spawn_child(pos, parent1.name)
if child then if child then
local ent_c = child:get_luaentity() local ent_c = child:get_luaentity()
local p = math.random(1, 2) local p = math.random(1, 2)
@ -438,7 +490,7 @@ local horse = {
end, end,
} }
mcl_mobs:register_mob("mobs_mc:horse", horse) mcl_mobs.register_mob("mobs_mc:horse", horse)
-- Skeleton horse -- Skeleton horse
local skeleton_horse = table.copy(horse) local skeleton_horse = table.copy(horse)
@ -461,7 +513,7 @@ skeleton_horse.sounds = {
distance = 16, distance = 16,
} }
skeleton_horse.harmed_by_heal = true skeleton_horse.harmed_by_heal = true
mcl_mobs:register_mob("mobs_mc:skeleton_horse", skeleton_horse) mcl_mobs.register_mob("mobs_mc:skeleton_horse", skeleton_horse)
-- Zombie horse -- Zombie horse
local zombie_horse = table.copy(horse) local zombie_horse = table.copy(horse)
@ -485,7 +537,7 @@ zombie_horse.sounds = {
distance = 16, distance = 16,
} }
zombie_horse.harmed_by_heal = true zombie_horse.harmed_by_heal = true
mcl_mobs:register_mob("mobs_mc:zombie_horse", zombie_horse) mcl_mobs.register_mob("mobs_mc:zombie_horse", zombie_horse)
-- Donkey -- Donkey
local d = 0.86 -- donkey scale local d = 0.86 -- donkey scale
@ -518,8 +570,9 @@ donkey.collisionbox = {
donkey.jump = true donkey.jump = true
donkey.jump_height = 3.75 -- can clear 1 block height donkey.jump_height = 3.75 -- can clear 1 block height
mcl_mobs:register_mob("mobs_mc:donkey", donkey)
mcl_mobs.register_mob("mobs_mc:donkey", donkey)
mcl_entity_invs.register_inv("mobs_mc:donkey","Donkey",15,true)
-- Mule -- Mule
local m = 0.94 local m = 0.94
local mule = table.copy(donkey) local mule = table.copy(donkey)
@ -536,7 +589,8 @@ mule.collisionbox = {
horse.collisionbox[5] * m, horse.collisionbox[5] * m,
horse.collisionbox[6] * m, horse.collisionbox[6] * m,
} }
mcl_mobs:register_mob("mobs_mc:mule", mule) mcl_mobs.register_mob("mobs_mc:mule", mule)
mcl_entity_invs.register_inv("mobs_mc:mule","Mule",15,true)
--=========================== --===========================
--Spawn Function --Spawn Function
@ -587,8 +641,8 @@ mobs_mc.water_level+3,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)
-- spawn eggs -- spawn eggs
mcl_mobs:register_egg("mobs_mc:horse", S("Horse"), "mobs_mc_spawn_icon_horse.png", 0) mcl_mobs.register_egg("mobs_mc:horse", S("Horse"), "#c09e7d", "#eee500", 0)
mcl_mobs:register_egg("mobs_mc:skeleton_horse", S("Skeleton Horse"), "mobs_mc_spawn_icon_horse_skeleton.png", 0) mcl_mobs.register_egg("mobs_mc:skeleton_horse", S("Skeleton Horse"), "#68684f", "#e5e5d8", 0)
--mobs:register_egg("mobs_mc:zombie_horse", S("Zombie Horse"), "mobs_mc_spawn_icon_horse_zombie.png", 0) --mobs:register_egg("mobs_mc:zombie_horse", S("Zombie Horse"), "#2a5a37", "#84d080", 0)
mcl_mobs:register_egg("mobs_mc:donkey", S("Donkey"), "mobs_mc_spawn_icon_donkey.png", 0) mcl_mobs.register_egg("mobs_mc:donkey", S("Donkey"), "#534539", "#867566", 0)
mcl_mobs:register_egg("mobs_mc:mule", S("Mule"), "mobs_mc_spawn_icon_mule.png", 0) mcl_mobs.register_egg("mobs_mc:mule", S("Mule"), "#1b0200", "#51331d", 0)

View File

@ -96,6 +96,7 @@ mobs_mc.water_level = tonumber(minetest.settings:get("water_level")) or 0
-- Animals -- Animals
local path = minetest.get_modpath("mobs_mc") local path = minetest.get_modpath("mobs_mc")
dofile(path .. "/axolotl.lua") -- Mesh and animation by JoeEnderman, Textures by Nova Wustra, modified by JoeEnderman
dofile(path .. "/bat.lua") -- Mesh and animation by toby109tt / https://github.com/22i dofile(path .. "/bat.lua") -- Mesh and animation by toby109tt / https://github.com/22i
dofile(path .. "/rabbit.lua") -- Mesh and animation byExeterDad dofile(path .. "/rabbit.lua") -- Mesh and animation byExeterDad
dofile(path .. "/chicken.lua") -- Mesh and animation by Pavel_S dofile(path .. "/chicken.lua") -- Mesh and animation by Pavel_S
@ -148,3 +149,11 @@ dofile(path .. "/cod.lua")
dofile(path .. "/salmon.lua") dofile(path .. "/salmon.lua")
dofile(path .. "/tropical_fish.lua") dofile(path .. "/tropical_fish.lua")
dofile(path .. "/dolphin.lua") dofile(path .. "/dolphin.lua")
dofile(path .. "/glow_squid.lua")
dofile(path .. "/piglin.lua")
dofile(path .. "/hoglin+zoglin.lua")
dofile(path .. "/strider.lua")

View File

@ -11,7 +11,7 @@ local S = minetest.get_translator("mobs_mc")
local etime = 0 local etime = 0
mcl_mobs:register_mob("mobs_mc:iron_golem", { mcl_mobs.register_mob("mobs_mc:iron_golem", {
description = S("Iron Golem"), description = S("Iron Golem"),
type = "npc", type = "npc",
spawn_class = "passive", spawn_class = "passive",
@ -22,6 +22,9 @@ mcl_mobs:register_mob("mobs_mc:iron_golem", {
collisionbox = {-0.7, -0.01, -0.7, 0.7, 2.69, 0.7}, collisionbox = {-0.7, -0.01, -0.7, 0.7, 2.69, 0.7},
visual = "mesh", visual = "mesh",
mesh = "mobs_mc_iron_golem.b3d", mesh = "mobs_mc_iron_golem.b3d",
head_swivel = "head.control",
bone_eye_height = 3.38,
curiosity = 10,
textures = { textures = {
{"mobs_mc_iron_golem.png"}, {"mobs_mc_iron_golem.png"},
}, },
@ -45,13 +48,14 @@ mcl_mobs:register_mob("mobs_mc:iron_golem", {
_got_poppy = false, _got_poppy = false,
pick_up = {"mcl_flowers:poppy"}, pick_up = {"mcl_flowers:poppy"},
on_pick_up = function(self,n) on_pick_up = function(self,n)
if n.itemstring:find("mcl_flowers:poppy") then local it = ItemStack(n.itemstring)
if it:get_name() == "mcl_flowers:poppy" then
if not self._got_poppy then if not self._got_poppy then
self._got_poppy=true self._got_poppy=true
return it:take_item(1)
end end
return true
end end
return it
end, end,
replace_what = {"mcl_flowers:poppy"}, replace_what = {"mcl_flowers:poppy"},
replace_with = {"air"}, replace_with = {"air"},
@ -85,7 +89,7 @@ mcl_mobs:register_mob("mobs_mc:iron_golem", {
etime = etime + dtime etime = etime + dtime
if etime > 10 then if etime > 10 then
if self._home and vector.distance(self._home,self.object:get_pos()) > 50 then if self._home and vector.distance(self._home,self.object:get_pos()) > 50 then
mcl_mobs:gopath(self,self._home) self:gopath(self._home)
end end
end end
end, end,
@ -93,8 +97,7 @@ mcl_mobs:register_mob("mobs_mc:iron_golem", {
-- spawn eggs -- spawn eggs
mcl_mobs:register_egg("mobs_mc:iron_golem", S("Iron Golem"), "mobs_mc_spawn_icon_iron_golem.png", 0) mcl_mobs.register_egg("mobs_mc:iron_golem", S("Iron Golem"), "#3b3b3b", "#f57223", 0)
--[[ This is to be called when a pumpkin or jack'o lantern has been placed. Recommended: In the on_construct function of the node. --[[ This is to be called when a pumpkin or jack'o lantern has been placed. Recommended: In the on_construct function of the node.
This summons an iron golen if placing the pumpkin created an iron golem summon pattern: This summons an iron golen if placing the pumpkin created an iron golem summon pattern:

View File

@ -24,7 +24,30 @@ local carpets = {
unicolor_light_blue = { "mcl_wool:light_blue_carpet", "light_blue" }, unicolor_light_blue = { "mcl_wool:light_blue_carpet", "light_blue" },
} }
mcl_mobs:register_mob("mobs_mc:llama", { local function get_drops(self)
self.drops = {}
table.insert(self.drops,
{name = "mcl_mobitems:leather",
chance = 1,
min = 0,
max = 2,
looting = "common",
})
if self.carpet then
table.insert(self.drops,{name = self.carpet,
chance = 1,
min = 1,
max = 1,})
end
if self._has_chest then
table.insert(self.drops,{name = "mcl_chests:chest",
chance = 1,
min = 1,
max = 1,})
end
end
mcl_mobs.register_mob("mobs_mc:llama", {
description = S("Llama"), description = S("Llama"),
type = "animal", type = "animal",
spawn_class = "passive", spawn_class = "passive",
@ -35,6 +58,14 @@ mcl_mobs:register_mob("mobs_mc:llama", {
shoot_offset = 1, --3.5 *would* be a good value visually but it somehow messes with the projectiles trajectory shoot_offset = 1, --3.5 *would* be a good value visually but it somehow messes with the projectiles trajectory
spawn_in_group_min = 4, spawn_in_group_min = 4,
spawn_in_group = 6, spawn_in_group = 6,
head_swivel = "head.control",
bone_eye_height = 11,
head_eye_height = 3,
horrizonatal_head_height=0,
curiosity = 60,
head_yaw = "z",
hp_min = 15, hp_min = 15,
hp_max = 30, hp_max = 30,
xp_min = 1, xp_min = 1,
@ -49,7 +80,6 @@ mcl_mobs:register_mob("mobs_mc:llama", {
{"blank.png", "blank.png", "mobs_mc_llama_white.png"}, {"blank.png", "blank.png", "mobs_mc_llama_white.png"},
{"blank.png", "blank.png", "mobs_mc_llama.png"}, {"blank.png", "blank.png", "mobs_mc_llama.png"},
}, },
visual_size = {x=3, y=3},
makes_footstep_sound = true, makes_footstep_sound = true,
runaway = false, runaway = false,
walk_velocity = 1, walk_velocity = 1,
@ -71,36 +101,28 @@ mcl_mobs:register_mob("mobs_mc:llama", {
distance = 16, distance = 16,
}, },
animation = { animation = {
speed_normal = 24, stand_start = 0, stand_end = 0,
run_speed = 60, walk_start = 0, walk_end = 40, walk_speed = 35,
run_start = 0, run_start = 0, run_end = 40, run_speed = 50,
run_end = 40, },
stand_start = 0, child_animations = {
stand_end = 0, stand_start = 41, stand_end = 41,
walk_start = 0, walk_start = 41, walk_end = 81, walk_speed = 50,
walk_end = 40, run_start = 41, run_end = 81, run_speed = 75,
hurt_start = 118,
hurt_end = 154,
death_start = 154,
death_end = 179,
eat_start = 49,
eat_end = 78,
look_start = 78,
look_end = 108,
}, },
follow = { "mcl_farming:wheat_item", "mcl_farming:hay_block" }, follow = { "mcl_farming:wheat_item", "mcl_farming:hay_block" },
view_range = 16, view_range = 16,
do_custom = function(self, dtime) do_custom = function(self, dtime)
-- set needed values if not already present -- set needed values if not already present
if not self.v2 then if not self.v3 then
self.v2 = 0 self.v3 = 0
self.max_speed_forward = 4 self.max_speed_forward = 4
self.max_speed_reverse = 2 self.max_speed_reverse = 2
self.accel = 4 self.accel = 4
self.terrain_type = 3 self.terrain_type = 3
self.driver_attach_at = {x = 0, y = 4.17, z = -1.5} self.driver_attach_at = {x = 0, y = 12.7, z = -5}
self.driver_eye_offset = {x = 0, y = 3, z = 0} self.driver_eye_offset = {x = 0, y = 6, z = 0}
self.driver_scale = {x = 1/self.visual_size.x, y = 1/self.visual_size.y} self.driver_scale = {x = 1/self.visual_size.x, y = 1/self.visual_size.y}
end end
@ -134,16 +156,29 @@ mcl_mobs:register_mob("mobs_mc:llama", {
local item = clicker:get_wielded_item() local item = clicker:get_wielded_item()
if item:get_name() == "mcl_farming:hay_block" then if item:get_name() == "mcl_farming:hay_block" then
-- Breed with hay bale -- Breed with hay bale
if mcl_mobs:feed_tame(self, clicker, 1, true, false) then return end if self:feed_tame(clicker, 1, true, false) then return end
elseif not self._has_chest and item:get_name() == "mcl_chests:chest" then
item:take_item()
clicker:set_wielded_item(item)
self._has_chest = true
self.base_texture = table.copy(self.base_texture)
self.base_texture[1] = self.base_texture[3]
self.object:set_properties({
textures = self.base_texture,
})
get_drops(self)
return
elseif self._has_chest and clicker:get_player_control().sneak then
mcl_entity_invs.show_inv_form(self,clicker," - Strength "..math.floor(self._inv_size / 3))
return
else else
-- Feed with anything else -- Feed with anything else
if mcl_mobs:feed_tame(self, clicker, 1, false, true) then return end if self:feed_tame(clicker, 1, false, true) then return end
end end
if mcl_mobs:protect(self, clicker) then return end if mcl_mobs:protect(self, clicker) then return end
-- Make sure tamed llama is mature and being clicked by owner only -- Make sure tamed llama is mature and being clicked by owner only
if self.tamed and not self.child and self.owner == clicker:get_player_name() then if self.tamed and not self.child and self.owner == clicker:get_player_name() then
-- Place carpet -- Place carpet
if minetest.get_item_group(item:get_name(), "carpet") == 1 and not self.carpet then if minetest.get_item_group(item:get_name(), "carpet") == 1 and not self.carpet then
for group, carpetdata in pairs(carpets) do for group, carpetdata in pairs(carpets) do
@ -160,16 +195,7 @@ mcl_mobs:register_mob("mobs_mc:llama", {
textures = self.base_texture, textures = self.base_texture,
}) })
self.carpet = item:get_name() self.carpet = item:get_name()
self.drops = { get_drops(self)
{name = "mcl_mobitems:leather",
chance = 1,
min = 0,
max = 2,},
{name = item:get_name(),
chance = 1,
min = 1,
max = 1,},
}
return return
end end
end end
@ -177,19 +203,12 @@ mcl_mobs:register_mob("mobs_mc:llama", {
-- detatch player already riding llama -- detatch player already riding llama
if self.driver and clicker == self.driver then if self.driver and clicker == self.driver then
mcl_mobs.detach(clicker, {x = 1, y = 0, z = 1}) mcl_mobs.detach(clicker, {x = 1, y = 0, z = 1})
-- attach player to llama -- attach player to llama
elseif not self.driver then elseif not self.driver then
self.object:set_properties({stepheight = 1.1}) self.object:set_properties({stepheight = 1.1})
mcl_mobs.attach(self, clicker) mcl_mobs.attach(self, clicker)
end end
-- Used to capture llama
elseif not self.driver and clicker:get_wielded_item():get_name() ~= "" then
mcl_mobs:capture_mob(self, clicker, 0, 5, 60, false, nil)
end end
end, end,
@ -202,7 +221,7 @@ mcl_mobs:register_mob("mobs_mc:llama", {
else else
parent = parent2 parent = parent2
end end
child = mcl_mobs:spawn_child(pos, parent.name) child = mcl_mobs.spawn_child(pos, parent.name)
if child then if child then
local ent_c = child:get_luaentity() local ent_c = child:get_luaentity()
ent_c.base_texture = table.copy(ent_c.base_texture) ent_c.base_texture = table.copy(ent_c.base_texture)
@ -214,11 +233,28 @@ mcl_mobs:register_mob("mobs_mc:llama", {
return false return false
end end
end, end,
on_spawn = function(self)
if not self._inv_size then
local r = math.random(1000)
if r < 80 then
self._inv_size = 15
elseif r < 160 then
self._inv_size = 12
elseif r < 488 then
self._inv_size = 9
elseif r < 816 then
self._inv_size = 6
else
self._inv_size = 3
end
end
end,
}) })
mcl_entity_invs.register_inv("mobs_mc:llama","Llama",nil,true)
-- spit arrow (weapon) -- spit arrow (weapon)
mcl_mobs:register_arrow("mobs_mc:llamaspit", { mcl_mobs.register_arrow("mobs_mc:llamaspit", {
visual = "sprite", visual = "sprite",
visual_size = {x = 0.10, y = 0.10}, visual_size = {x = 0.10, y = 0.10},
textures = {"mobs_mc_llama_spit.png"}, textures = {"mobs_mc_llama_spit.png"},
@ -248,12 +284,10 @@ mcl_mobs:spawn_specific(
"SavannaM_beach", "SavannaM_beach",
"Savanna_beach", "Savanna_beach",
"Savanna_ocean", "Savanna_ocean",
"JungleEdge",
"JungleEdgeM",
"ExtremeHills", "ExtremeHills",
"ExtremeHills_beach", "ExtremeHills_beach",
"ExtremeHillsM", "ExtremeHillsM",
}, }, --FIXME: Needs Windswept Forest when that is added.
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
@ -263,4 +297,4 @@ mobs_mc.water_level+15,
mcl_vars.mg_overworld_max) mcl_vars.mg_overworld_max)
-- spawn eggs -- spawn eggs
mcl_mobs:register_egg("mobs_mc:llama", S("Llama"), "mobs_mc_spawn_icon_llama.png", 0) mcl_mobs.register_egg("mobs_mc:llama", S("Llama"), "#c09e7d", "#995f40", 0)

View File

@ -1,5 +1,6 @@
# textdomain: mobs_mc # textdomain: mobs_mc
Agent= Agent=
Axolotl=
Bat= Bat=
Blaze= Blaze=
Chicken= Chicken=

View File

@ -1,6 +1,5 @@
name = mobs_mc name = mobs_mc
author = maikerumine author = maikerumine
description = Adds Minecraft-like monsters and animals. description = Adds Minecraft-like monsters and animals.
depends = mcl_init, mcl_particles, mcl_mobs, mcl_wip, mcl_core 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, mobs_mc_gameconfig, doc_items

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

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