Compare commits

...

73 Commits

Author SHA1 Message Date
teknomunk 53c8b7dc9f Rename to vl_physics 2024-05-04 15:44:57 +00:00
teknomunk 6a15ebf749 Make friction not apply in air, change how the two node physics accumulate 2024-05-04 15:44:57 +00:00
teknomunk 2973a1d5a8 Apply entity physics to experience orbs, add node friction and make ice more slipery than other nodes, pass entity thru to effects 2024-05-04 15:44:57 +00:00
teknomunk a6ca6ef1a4 Fix typo 2024-05-04 15:44:57 +00:00
teknomunk 4dc9e9403f Remove hardcoded gravity from item entity, fix bouancy in environmental effects 2024-05-04 15:44:57 +00:00
teknomunk fc26f5961b Fix startup 2024-05-04 15:44:57 +00:00
teknomunk a45609f922 Implement mod for general purpose environmental physics effects 2024-05-04 15:44:57 +00:00
Mikita Wiśniewski 0ef81681ba Make item frames attached to the block they're placed on (fixes #3736) (#4279)
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4279
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: Mikita Wiśniewski <rudzik8@protonmail.com>
Co-committed-by: Mikita Wiśniewski <rudzik8@protonmail.com>
2024-05-04 11:43:54 +00:00
the-real-herowl efc6ab0bbf Merge pull request 'Hollow logs fixes' (#4268) from hollow_logs into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4268
2024-05-04 10:08:17 +00:00
Bram van den Heuvel 69acc5074b Fix dungeon margin bug (#4276)
Some mapgen settings used to crash the game.

Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4276
Reviewed-by: Mikita Wiśniewski <rudzik8@protonmail.com>
Co-authored-by: Bram van den Heuvel <bram.vdh1999@gmail.com>
Co-committed-by: Bram van den Heuvel <bram.vdh1999@gmail.com>
2024-05-03 14:05:51 +00:00
the-real-herowl 7d999535e7 Merge pull request 'Ghast fixes' (#4277) from ghast_fixes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4277
Reviewed-by: Mikita Wiśniewski <rudzik8@protonmail.com>
2024-05-03 12:57:32 +00:00
teknomunk 81ca224bb8 Add wear to shears used to harvest comb from a beehive (#4251)
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4251
Reviewed-by: Mikita Wiśniewski <rudzik8@protonmail.com>
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: teknomunk <teknomunk@protonmail.com>
Co-committed-by: teknomunk <teknomunk@protonmail.com>
2024-05-02 11:52:47 +00:00
nixnoxus 3975449ad2 fix mcl_beds: ignore players in other dimensions than overwold (#4257)
beds ignore players in other dimensions than "overworld" (because players can only sleep in the "overworld")

Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4257
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: nixnoxus <nixnoxus@web.de>
Co-committed-by: nixnoxus <nixnoxus@web.de>
2024-05-02 03:13:27 +00:00
teknomunk 6756658ee9 Fix server crash when server restarts after a player dies but they didn't respawn (#4246)
Ensuring that tables storing player data are initialized before being used.

Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4246
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: teknomunk <teknomunk@protonmail.com>
Co-committed-by: teknomunk <teknomunk@protonmail.com>
2024-05-02 03:01:43 +00:00
the-real-herowl 4dde321a04 Ghast fireball fixes 2024-05-02 00:18:43 +02:00
Araca cd0509c2e6 Fix crash with ghast achievement fireball_redir_serv (#4179)
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4179
Reviewed-by: Mikita Wiśniewski <rudzik8@protonmail.com>
Co-authored-by: Araca <araca.prod@gmail.com>
Co-committed-by: Araca <araca.prod@gmail.com>
2024-05-01 22:15:56 +00:00
the-real-herowl cc1e01ad78 Made API actually work for outside the mod 2024-05-01 21:59:10 +02:00
the-real-herowl b9428e3438 Definition validation improved 2024-05-01 21:50:05 +02:00
teknomunk 0c372f987d Stop villagers from eating shulker boxes (#4266)
This modifies the logic for mobs picking up items to only match against the item's name and ignore any text in an items metadata.

Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4266
Reviewed-by: Mikita Wiśniewski <rudzik8@protonmail.com>
Co-authored-by: teknomunk <teknomunk@protonmail.com>
Co-committed-by: teknomunk <teknomunk@protonmail.com>
2024-05-01 15:44:14 +00:00
Bakawun 22c4daab22 fix walking and running animation for horse donkey and mule (#4053)
no more gliding horses

Co-authored-by: bakawun <bakawun@getnada.com>
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4053
Reviewed-by: Mikita Wiśniewski <rudzik8@protonmail.com>
Co-authored-by: Bakawun <bakawun@noreply.git.minetest.land>
Co-committed-by: Bakawun <bakawun@noreply.git.minetest.land>
2024-05-01 15:40:57 +00:00
nixnoxus 760fe1aa68 more items usable to smelt (#4184)
- group:bee_nest
- group:beehive
- mcl_cartography_table:cartography_table
- mcl_core:deadbush
- mcl_fletching_table:fletching_table
- mcl_lectern:lectern
- mcl_loom:loom
- mcl_mangrove:mangrove_roots
- mcl_smithing_table:table

Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4184
Reviewed-by: Mikita Wiśniewski <rudzik8@protonmail.com>
Co-authored-by: nixnoxus <nixnoxus@web.de>
Co-committed-by: nixnoxus <nixnoxus@web.de>
2024-04-30 14:26:10 +00:00
Eliy21 f78ad93fd3 Make destroying boats with punch easier (#4159)
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4159
Reviewed-by: Mikita Wiśniewski <rudzik8@protonmail.com>
Co-authored-by: Eliy21 <eliy21@noreply.git.minetest.land>
Co-committed-by: Eliy21 <eliy21@noreply.git.minetest.land>
2024-04-30 14:24:24 +00:00
the-real-herowl d321b166ea Merge pull request 'trading gives the player experience' (#4210) from nixnoxus/MineClone2:add-trading-xp into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4210
Reviewed-by: Mikita Wiśniewski <rudzik8@protonmail.com>
2024-04-30 10:47:17 +00:00
JoseDouglas26 18342e44c8 Change lectern wdir check to allow placement on node sides (#4263)
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4263
Reviewed-by: Mikita Wiśniewski <rudzik8@protonmail.com>
Co-authored-by: JoseDouglas26 <josedouglas20002014@gmail.com>
Co-committed-by: JoseDouglas26 <josedouglas20002014@gmail.com>
2024-04-30 10:45:00 +00:00
JoseDouglas26 2430953a81 Set use_texture_alpha for some nodes (#4262)
* Tall flowers with mesh drawtype (sunflower)
* Clovers
* End rod and its colored variants

Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4262
Reviewed-by: Mikita Wiśniewski <rudzik8@protonmail.com>
Co-authored-by: JoseDouglas26 <josedouglas20002014@gmail.com>
Co-committed-by: JoseDouglas26 <josedouglas20002014@gmail.com>
2024-04-30 10:41:23 +00:00
the-real-herowl a25e2b8eb3 Spaces to tabs 2024-04-30 03:55:17 +02:00
the-real-herowl ee2998e21b Replaced early returns with error calls 2024-04-30 03:53:49 +02:00
the-real-herowl e0aadc7996 Updated the textures to the new UV map
Also added explicit use_texture_alpha = "clip"
2024-04-30 03:49:38 +02:00
the-real-herowl 9f65c5efb7 New hollow log model (optimized + UV map improved) 2024-04-30 02:56:13 +02:00
the-real-herowl 7ad4ca2dbe Spaces to tabs 2024-04-30 02:29:12 +02:00
JoseDouglas26 1161d5cd36 Hollow logs (#4267)
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4267
Co-authored-by: JoseDouglas26 <josedouglas20002014@gmail.com>
Co-committed-by: JoseDouglas26 <josedouglas20002014@gmail.com>
2024-04-30 00:24:12 +00:00
SmokeyDope 538c206985 Remove stray pixels in leather cap texture (#4256)
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4256
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: SmokeyDope <smokey@tilde.team>
Co-committed-by: SmokeyDope <smokey@tilde.team>
2024-04-29 16:14:46 +00:00
Doods 31facbd902 Texture converter add signs (#4238)
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4238
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: Doods <yusufalishabaka@tutanota.com>
Co-committed-by: Doods <yusufalishabaka@tutanota.com>
2024-04-29 15:50:32 +00:00
the-real-herowl 5f70189e08 Don't touch description if tt snippets did nothing (#4264)
This should prevent problems like the ones described in https://git.minetest.land/MineClone2/MineClone2/pulls/4196#issuecomment-77558 or https://git.minetest.land/MineClone2/MineClone2/pulls/4130#issuecomment-77571

Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4264
Co-authored-by: the-real-herowl <wiktor_t-i@proton.me>
Co-committed-by: the-real-herowl <wiktor_t-i@proton.me>
2024-04-28 15:04:39 +00:00
the-real-herowl 4e12c6747c Merge pull request 'Fix #4189 - Make hoppers move items if there is space for one item' (#4190) from teknomunk/MineClone2:hopper-changes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4190
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
2024-04-27 13:51:34 +00:00
the-real-herowl 1d8fc7abac Merge pull request 'Bed Fixes' (#4253) from teknomunk/MineClone2:bed-fixes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4253
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
2024-04-27 12:35:14 +00:00
teknomunk 09c595c363 Fix two hopper clocks 2024-04-27 08:41:09 +00:00
teknomunk 6fbe60f1ac Fix crash with undefined nodes 2024-04-27 08:41:09 +00:00
teknomunk 3705be24d7 Fix 'Undeclared global variable' warning 2024-04-27 08:41:09 +00:00
teknomunk 681075df5a Correct null -> nil 2024-04-27 08:41:09 +00:00
teknomunk 6ecb304946 make hoppers behave the same say regardless of the order the server processes the nodes by following a chain of hoppers to the end and processing back to the starting node and marking all those nodes as processed 2024-04-27 08:41:09 +00:00
teknomunk 034b0142c6 Make sure the inventory slot has at least the number of items requsted in it before selecting it 2024-04-27 08:41:09 +00:00
teknomunk e02d1c0e27 Update to comply with coding guidelines 2024-04-27 08:41:09 +00:00
teknomunk bdcd89e1bf Modify mcl_util.select_stack to allow specifying the number of items that will be moved, modify hopper on_try_push functions to specify only 1 item will be moved at a time, general cleanup of touched code (reduce indent - 1 place, break filter functions out of function call parameter - 4 places) 2024-04-27 08:41:09 +00:00
teknomunk 62ab68637a Stop beds from dropping as items when players in creative mode dig them 2024-04-27 07:17:24 +00:00
teknomunk 0839f35a12 Add additional bed placing attempts 2024-04-27 10:42:20 +00:00
teknomunk 84d6b593b2 Fix bed duplication bug when destroyed by TNT 2024-04-27 10:42:20 +00:00
the-real-herowl 3bcbb99878 Merge pull request 'The Pull Request that Fixed the Creative Inventory' (#4237) from creative_inv_fixes into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4237
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
2024-04-27 06:19:11 +00:00
the-real-herowl 9e8661ae95 Merge pull request 'Added eating animation' (#4169) from eating_animation into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4169
2024-04-22 01:18:11 +00:00
SOS-Games 4f37c1600f Able to see all mobs in the lookup help menu (#4186)
added a Mobs category that has pages for all mobs

Co-authored-by: SOS-Games <101518564+SOS-Games@users.noreply.github.com>
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4186
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: SOS-Games <gruberscomplete@gmail.com>
Co-committed-by: SOS-Games <gruberscomplete@gmail.com>
2024-04-21 08:16:15 +00:00
Doods bd4337a2dc Make Editorconfig compliant with the spec. (#4245)
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4245
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: Doods <yusufalishabaka@tutanota.com>
Co-committed-by: Doods <yusufalishabaka@tutanota.com>
2024-04-20 15:23:59 +00:00
MysticTempest 57409973b9 Fix creative inv tabs showing item tooltips. 2024-04-17 16:53:59 +07:00
Mikita Wiśniewski 312ad5b63b Fix creative inventory search not working on Android (fixes #3402) 2024-04-17 16:53:59 +07:00
Mikita Wiśniewski 46ed6a6dda Fix switching items in the creative inventory (fixes #3941) 2024-04-17 16:53:59 +07:00
the-real-herowl 0f20e18e53 Merge pull request 'fix_xp_reload_bug' (#4226) from teknomunk/MineClone2:fix_xp_reload_bug into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4226
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
2024-04-14 07:10:33 +00:00
the-real-herowl 69d3fa5f85 Merge pull request 'Added a check for the bone meal's applied position.' (#4201) from CyberMango/MineClone2:dev/mango/add_bone_meal_protection_check into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4201
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
2024-04-14 07:07:21 +00:00
the-real-herowl 5e673b8fee Merge pull request 'Add partial item stack pickup' (#4193) from teknomunk/MineClone2:grouped-item-pickup into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4193
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
2024-04-14 06:53:37 +00:00
Araca 596c56d31f Add possibility to edit a sign (#4188)
We can edit a sign by right-clicking in it. If in hand you have a color or a glow ink, the behaviour didn't change. Also some refactorization.

Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4188
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: Araca <araca.prod@gmail.com>
Co-committed-by: Araca <araca.prod@gmail.com>
2024-04-14 06:50:19 +00:00
the-real-herowl e582c3bb97 Improved look on the mobile device
Now the food doesn't cover the full screen on mobile devices...
...at the cost of stretching at ultrawide or portrait aspect ratios.
2024-04-14 08:34:41 +02:00
the-real-herowl b5b8d4f336 Merge pull request 'more piglin bartering items (and drop stack instead of single items)' (#4181) from nixnoxus/MineClone2:piglin-bartering into master
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4181
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
2024-04-14 00:01:13 +00:00
Doods c1971b662a Fireproof certain wood nodes & add planks crafting recipes (#4166)
* Make Crimson and Warped Planks, Double Slab Planks, Fences, Fence Gates, Doors, Trapdoors, Pressure Plates, Wood, Bark, Stripped Wood, Stripped Bark, and Stairs Immune to fire by removing them from the 'flammable', 'fire_encouragement', and 'fire_flammability' groups.
* Add crafting recipes which allow Cherry, Mangrove, Crimson, and Warped planks to be crafted from Wood, Bark, Stripped Wood, and Stripped Bark variants, to make them consistent with with all other planks.

Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4166
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: Doods <yusufalishabaka@tutanota.com>
Co-committed-by: Doods <yusufalishabaka@tutanota.com>
2024-04-13 23:52:46 +00:00
nixnoxus a86e8e2c8e fix strider breeding & increase riding speed (#4096)
- Striders follow `mcl_crimson:warped_fungus`
- Striders can be bred with `mcl_crimson:warped_fungus`
- Riding speed increased to 2 m/s
- Warning fixed

Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4096
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: nixnoxus <nixnoxus@web.de>
Co-committed-by: nixnoxus <nixnoxus@web.de>
2024-04-13 23:38:46 +00:00
Doods a3db7bd504 Fix texture converter for sandstone (#4233)
Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4233
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: Doods <yusufalishabaka@tutanota.com>
Co-committed-by: Doods <yusufalishabaka@tutanota.com>
2024-04-08 19:02:43 +00:00
teknomunk 13ce4f9092 Additional cleanup, impelemnt partial item stack pickup 2024-03-31 02:32:24 +00:00
teknomunk 0a294c55a1 Move object pickup code to try_object_pickup(...) and refactor to remove most indentation for readability 2024-03-31 02:32:24 +00:00
teknomunk 44bb07507d Cleanup comment, whitespace for readability 2024-03-31 02:28:46 +00:00
cora 3509b85a3e Fix possible crash due to engine bug reloading XP orbs 2024-03-31 02:28:46 +00:00
nixnoxus 9809c627dc trading gives the player experience 2024-03-09 15:06:38 +01:00
CyberMango 4a22287eb6 Added a check for the bone meal's applied position.
protection the position above as well to prevent growing high grass on
areas in which you are not allowed to place blocks. Because, if you cant
place a block there, why should you be able to grow grass/flowers there?
2024-02-29 13:36:02 +02:00
nixnoxus 497f1dcd80 drop stack instead of items 2024-02-05 00:24:27 +01:00
nixnoxus 01cace413f update bartering items 2024-02-05 00:11:22 +01:00
the-real-herowl 8d5c9996a2 Centered the eating animation 2024-02-02 04:28:20 +01:00
the-real-herowl 13825763b0 Added eating animation 2024-01-29 04:24:39 +01:00
96 changed files with 1547 additions and 685 deletions

View File

@ -4,7 +4,7 @@ root = true
end_of_line = lf
[*.lua]
charset = utf8
charset = utf-8
indent_style = tab
insert_final_newline = true
trim_trailing_whitespace = true

View File

@ -257,12 +257,21 @@ end
---@param dst_inventory InvRef Destination inventory to push to
---@param dst_list string Name of destination inventory list to push to
---@param condition? fun(stack: ItemStack) Condition which items are allowed to be transfered.
---@param count? integer Number of items to try to transfer at once
---@return integer Item stack number to be transfered
function mcl_util.select_stack(src_inventory, src_list, dst_inventory, dst_list, condition)
function mcl_util.select_stack(src_inventory, src_list, dst_inventory, dst_list, condition, count)
local src_size = src_inventory:get_size(src_list)
local stack
for i = 1, src_size do
stack = src_inventory:get_stack(src_list, i)
-- Allow for partial stack movement
if count and stack:get_count() >= count then
local new_stack = ItemStack(stack)
new_stack:set_count(count)
stack = new_stack
end
if not stack:is_empty() and dst_inventory:room_for_item(dst_list, stack) and ((condition == nil or condition(stack))) then
return i
end
@ -280,21 +289,22 @@ end
-- Returns true on success and false on failure
-- Possible failures: No item in source slot, destination inventory full
function mcl_util.move_item(source_inventory, source_list, source_stack_id, destination_inventory, destination_list)
if not source_inventory:is_empty(source_list) then
local stack = source_inventory:get_stack(source_list, source_stack_id)
if not stack:is_empty() then
local new_stack = ItemStack(stack)
new_stack:set_count(1)
if not destination_inventory:room_for_item(destination_list, new_stack) then
return false
end
stack:take_item()
source_inventory:set_stack(source_list, source_stack_id, stack)
destination_inventory:add_item(destination_list, new_stack)
return true
end
-- Can't move items we don't have
if source_inventory:is_empty(source_list) then return false end
-- Can't move from an empty stack
local stack = source_inventory:get_stack(source_list, source_stack_id)
if stack:is_empty() then return false end
local new_stack = ItemStack(stack)
new_stack:set_count(1)
if not destination_inventory:room_for_item(destination_list, new_stack) then
return false
end
return false
stack:take_item()
source_inventory:set_stack(source_list, source_stack_id, stack)
destination_inventory:add_item(destination_list, new_stack)
return true
end
--- Try pushing item from hopper inventory to destination inventory
@ -314,25 +324,23 @@ function mcl_util.hopper_push(pos, dst_pos)
local dst_list = 'main'
local dst_inv, stack_id
-- Find a inventory stack in the destination
if dst_def._mcl_hoppers_on_try_push then
dst_inv, dst_list, stack_id = dst_def._mcl_hoppers_on_try_push(dst_pos, pos, hop_inv, hop_list)
else
local dst_meta = minetest.get_meta(dst_pos)
dst_inv = dst_meta:get_inventory()
stack_id = mcl_util.select_stack(hop_inv, hop_list, dst_inv, dst_list)
stack_id = mcl_util.select_stack(hop_inv, hop_list, dst_inv, dst_list, nil, 1)
end
if not stack_id then return false end
-- Move the item
local ok = mcl_util.move_item(hop_inv, hop_list, stack_id, dst_inv, dst_list)
if dst_def._mcl_hoppers_on_after_push then
dst_def._mcl_hoppers_on_after_push(dst_pos)
end
if stack_id ~= nil then
local ok = mcl_util.move_item(hop_inv, hop_list, stack_id, dst_inv, dst_list)
if dst_def._mcl_hoppers_on_after_push then
dst_def._mcl_hoppers_on_after_push(dst_pos)
end
if ok then
return true
end
end
return false
return ok
end
-- Try pulling from source inventory to hopper inventory
@ -357,7 +365,7 @@ function mcl_util.hopper_pull(pos, src_pos)
else
local src_meta = minetest.get_meta(src_pos)
src_inv = src_meta:get_inventory()
stack_id = mcl_util.select_stack(src_inv, src_list, hop_inv, hop_list)
stack_id = mcl_util.select_stack(src_inv, src_list, hop_inv, hop_list, nil, 1)
end
if stack_id ~= nil then

View File

@ -168,7 +168,7 @@ end
function boat.on_activate(self, staticdata, dtime_s)
self.object:set_armor_groups({fleshy = 100})
self.object:set_armor_groups({fleshy = 125})
local data = minetest.deserialize(staticdata)
if type(data) == "table" then
self._v = data.v

View File

@ -6,9 +6,6 @@ local pool = {}
local tick = false
minetest.register_on_joinplayer(function(player)
pool[player:get_player_name()] = 0
end)
@ -92,7 +89,6 @@ local function enable_physics(object, luaentity, ignore_check)
object:set_properties({
physical = true
})
object:set_acceleration(vector.new(0, -get_gravity(), 0))
end
end
@ -113,6 +109,55 @@ local function disable_physics(object, luaentity, ignore_check, reset_movement)
end
end
local function try_object_pickup(player, inv, object, checkpos)
if not inv then return end
local le = object:get_luaentity()
-- Check magnet timer
if not (le._magnet_timer >= 0) then return end
if not (le._magnet_timer < item_drop_settings.magnet_time) then return end
-- Don't try to collect again
if le._removed then return end
-- Ignore if itemstring is not set yet
if le.itemstring == "" then return end
-- Add what we can to the inventory
local itemstack = ItemStack(le.itemstring)
local leftovers = inv:add_item("main", itemstack )
check_pickup_achievements(object, player)
if leftovers:is_empty() then
-- Destroy entity
-- This just prevents this section to be run again because object:remove() doesn't remove the item immediately.
le.target = checkpos
le._removed = true
-- Stop the object
object:set_velocity(vector.zero())
object:set_acceleration(vector.zero())
object:move_to(checkpos)
-- Update sound pool
local name = player:get_player_name()
pool[name] = ( pool[name] or 0 ) + 1
-- Make sure the object gets removed
minetest.after(0.25, function()
--safety check
if object and object:get_luaentity() then
object:remove()
end
end)
else
-- Update entity itemstring
le.itemstring = leftovers:to_string()
end
end
minetest.register_globalstep(function(_)
tick = not tick
@ -123,17 +168,17 @@ minetest.register_globalstep(function(_)
local pos = player:get_pos()
if tick == true and pool[name] > 0 then
if tick == true and (pool[name] or 0) > 0 then
minetest.sound_play("item_drop_pickup", {
pos = pos,
gain = 0.3,
max_hear_distance = 16,
pitch = math.random(70, 110) / 100
})
if pool[name] > 6 then
if (pool[name] or 0) > 6 then
pool[name] = 6
else
pool[name] = pool[name] - 1
pool[name] = (pool[name] or 1) - 1
end
end
@ -147,40 +192,7 @@ minetest.register_globalstep(function(_)
object:get_luaentity() and object:get_luaentity().name == "__builtin:item" and object:get_luaentity()._magnet_timer
and (object:get_luaentity()._insta_collect or (object:get_luaentity().age > item_drop_settings.age)) then
if object:get_luaentity()._magnet_timer >= 0 and
object:get_luaentity()._magnet_timer < item_drop_settings.magnet_time and inv and
inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
-- Collection
if not object:get_luaentity()._removed then
-- Ignore if itemstring is not set yet
if object:get_luaentity().itemstring ~= "" then
inv:add_item("main", ItemStack(object:get_luaentity().itemstring))
check_pickup_achievements(object, player)
-- Destroy entity
-- This just prevents this section to be run again because object:remove() doesn't remove the item immediately.
object:get_luaentity().target = checkpos
object:get_luaentity()._removed = true
object:set_velocity(vector.zero())
object:set_acceleration(vector.zero())
object:move_to(checkpos)
pool[name] = pool[name] + 1
minetest.after(0.25, function()
--safety check
if object and object:get_luaentity() then
object:remove()
end
end)
end
end
end
try_object_pickup( player, inv, object, checkpos )
elseif not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "mcl_experience:orb" then
local entity = object:get_luaentity()
entity.collector = player:get_player_name()
@ -634,62 +646,6 @@ local function push_out_item_stuck_in_solid(self, dtime, p, def, is_in_water)
end
end
local function move_items_in_water (self, p, def, node, is_floating, is_in_water)
-- Move item around on flowing liquids; add 'source' check to allow items to continue flowing a bit in the source block of flowing water.
if def and not is_floating and (def.liquidtype == "flowing" or def.liquidtype == "source") then
self._flowing = true
--[[ 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.2
-- Set new item moving speed into the direciton of the liquid
local newv = vector.multiply(vec, f)
-- Swap to acceleration instead of a static speed to better mimic MC mechanics.
self.object:set_acceleration(vector.new(newv.x, -0.22, newv.z))
self.physical_state = true
self._flowing = true
self.object:set_properties({
physical = true
})
return true
end
if is_in_water and def.liquidtype == "source" then
local cur_vec = self.object:get_velocity()
-- apply some acceleration in the opposite direction so it doesn't slide forever
local vec = {
x = 0 - cur_vec.x * 0.9,
y = 3 - cur_vec.y * 0.9,
z = 0 - cur_vec.z * 0.9
}
self.object:set_acceleration(vec)
-- slow down the item in water
local vel = self.object:get_velocity()
if vel.y < 0 then
vel.y = vel.y * 0.9
end
self.object:set_velocity(vel)
if self.physical_state ~= false or self._flowing ~= true then
self.physical_state = true
self._flowing = true
self.object:set_properties({
physical = true
})
end
end
elseif self._flowing == true and not is_in_water and not is_floating then
-- Disable flowing physics if not on/in flowing liquid
self._flowing = false
enable_physics(self.object, self, true)
return true
end
end
minetest.register_entity(":__builtin:item", {
initial_properties = {
hp_max = 1,
@ -896,7 +852,6 @@ minetest.register_entity(":__builtin:item", {
self.object:set_armor_groups({ immortal = 1 })
-- self.object:set_velocity(vector.new(0, 2, 0))
self.object:set_acceleration(vector.new(0, -get_gravity(), 0))
self:set_item(self.itemstring)
end,
@ -1029,7 +984,7 @@ minetest.register_entity(":__builtin:item", {
if push_out_item_stuck_in_solid(self, dtime, p, def, is_in_water) then return end
if move_items_in_water (self, p, def, node, is_floating, is_in_water) then return end
vl_physics.apply_entity_environmental_physics(self)
-- If node is not registered or node is walkably solid and resting on nodebox
local nn = minetest.get_node(vector.offset(p, 0, -0.5, 0)).name

View File

@ -1,4 +1,4 @@
name = mcl_item_entity
author = PilzAdam
description = Dropped items will be attracted to the player like a magnet.
depends = flowlib, mcl_enchanting
depends = vl_physics, mcl_enchanting

View File

@ -395,7 +395,8 @@ local function on_step_work (self, dtime)
local player_in_active_range = self:player_in_active_range()
self:check_suspend(player_in_active_range)
self:check_water_flow()
-- Handle environmental physics
vl_physics.apply_entity_environmental_physics(self)
if not self._jumping_cliff then
self._can_jump_cliff = self:can_jump_cliff()

View File

@ -322,7 +322,7 @@ function mob_class:toggle_sit(clicker,p)
particle = "mobs_mc_wolf_icon_roam.png"
self.order = "roam"
self.state = "stand"
self.walk_chance = default_walk_chance
self.walk_chance = 50
self.jump = true
self:set_animation("stand")
-- TODO: Add sitting model

View File

@ -325,12 +325,19 @@ function mcl_mobs.register_mob(name, def)
_spawner = def._spawner,
}
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")
if def.unused ~= true then
doc.add_entry("mobs", name, {
name = def.description or name,
data = final_def,
})
end
end
minetest.register_entity(name, setmetatable(final_def,mcl_mobs.mob_class_meta))
end -- END mcl_mobs.register_mob function
@ -367,7 +374,7 @@ function mcl_mobs.register_arrow(name, def)
rotate = def.rotate,
on_punch = def.on_punch or function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage)
local vel = self.object:get_velocity():length()
self.object:set_velocity({x=dir.x * vel, y=dir.y * vel, z=dir.z * vel})
self.object:set_velocity(dir * vel)
self._puncher = puncher
end,
collisionbox = def.collisionbox or {0, 0, 0, 0, 0, 0},

View File

@ -87,7 +87,8 @@ function mob_class:check_item_pickup()
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 itemstack = ItemStack(l.itemstring)
if not player_near(p) and self.on_pick_up and itemstack:get_name():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()

View File

@ -2,4 +2,4 @@ name = mcl_mobs
author = PilzAdam
description = Adds a mob API for mods to add animals or monsters, etc.
depends = mcl_particles
optional_depends = mcl_weather, mcl_explosions, mcl_hunger, mcl_worlds, invisibility, lucky_block, cmi, doc_identifier, mcl_armor, mcl_portals, mcl_experience, mcl_sculk
optional_depends = mcl_weather, mcl_explosions, mcl_hunger, mcl_worlds, invisibility, lucky_block, cmi, doc_identifier, mcl_armor, mcl_portals, mcl_experience, mcl_sculk, vl_physics

View File

@ -1026,43 +1026,7 @@ function mob_class:falling(pos)
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
-- Deprecated. Do nothing
end
function mob_class:check_dying()

View File

@ -1,6 +1,7 @@
local S = minetest.get_translator(minetest.get_current_modname())
local axolotl = {
description = S("Axolotl"),
type = "animal",
spawn_class = "axolotl",
can_despawn = true,

View File

@ -30,6 +30,7 @@ local S = minetest.get_translator(minetest.get_current_modname())
--###################
local cod = {
description = S("Cod"),
type = "animal",
spawn_class = "water_ambient",
can_despawn = true,

View File

@ -136,7 +136,7 @@ mcl_mobs.register_mob("mobs_mc:creeper", {
})
mcl_mobs.register_mob("mobs_mc:creeper_charged", {
description = S("Creeper"),
description = S("Charged Creeper"),
type = "monster",
spawn_class = "hostile",
hp_min = 20,

View File

@ -30,6 +30,7 @@ local S = minetest.get_translator(minetest.get_current_modname())
--###################
local dolphin = {
description = S("Dolphin"),
type = "animal",
spawn_class = "water",
can_despawn = true,

View File

@ -126,13 +126,14 @@ mcl_mobs.register_arrow("mobs_mc:fireball", {
end,
hit_mob = function(self, mob)
local name = mob:get_luaentity().name
mob:punch(self.object, 1.0, {
full_punch_interval = 1.0,
damage_groups = {fleshy = 6},
}, nil)
mcl_mobs.mob_class.boom(self,self.object:get_pos(), 1, true)
local ent = mob:get_luaentity()
if not ent or ent.health <= 0 then
if (not ent or ent.health <= 0) and self._puncher and name == "mobs_mc:ghast" then
awards.unlock(self._puncher:get_player_name(), "mcl:fireball_redir_serv")
end
end,

View File

@ -30,6 +30,7 @@ for i=1,4 do
end
mcl_mobs.register_mob("mobs_mc:glow_squid", {
description = S("Glow Squid"),
type = "animal",
spawn_class = "water_underground",
can_despawn = true,

View File

@ -122,10 +122,10 @@ local horse = {
stand_speed = 25,
stand_start = 0,
stand_end = 0,
walk_speed = 25,
walk_speed = 100,
walk_start = 0,
walk_end = 40,
run_speed = 60,
run_speed = 200,
run_start = 0,
run_end = 40,
},
@ -543,11 +543,6 @@ donkey.description = S("Donkey")
donkey.textures = {{"blank.png", "mobs_mc_donkey.png", "blank.png"}}
donkey.spawn_in_group = 3
donkey.spawn_in_group_min = 1
donkey.animation = {
speed_normal = 25,
stand_start = 0, stand_end = 0,
walk_start = 0, walk_end = 40,
}
donkey.sounds = {
random = "mobs_mc_donkey_random",
damage = "mobs_mc_donkey_hurt",

View File

@ -16,6 +16,13 @@ local trading_items = {
{ itemstring = "mcl_throwing:ender_pearl", amount_min = 2, amount_max = 6 },
{ itemstring = "mcl_potions:fire_resistance", amount_min = 1, amount_max = 1 },
{ itemstring = "mcl_potions:fire_resistance_splash", amount_min = 1, amount_max = 1 },
{ itemstring = "mcl_enchanting:book_enchanted", amount_min = 1, amount_max = 1 },
{ itemstring = "mcl_armor:boots_iron_enchanted", amount_min = 1, amount_max = 1 },
{ itemstring = "mcl_blackstone:blackstone", amount_min = 8, amount_max = 16 },
{ itemstring = "mcl_bows:arrow", amount_min = 6, amount_max = 12 },
{ itemstring = "mcl_core:crying_obsidian", amount_min = 1, amount_max = 1 },
{ itemstring = "mcl_fire:fire_charge", amount_min = 1, amount_max = 1 },
--{ itemstring = "FIXME:spectral_arrow", amount_min = 6, amount_max = 12 },
}
local S = minetest.get_translator("mobs_mc")
@ -142,14 +149,18 @@ local piglin = {
local c_pos = self.object:get_pos()
if c_pos then
self.what_traded = trading_items[math.random(#trading_items)]
for x = 1, math.random(self.what_traded.amount_min, self.what_traded.amount_max) do
local p = c_pos
local nn=minetest.find_nodes_in_area_under_air(vector.offset(c_pos,-1,-1,-1),vector.offset(c_pos,1,1,1),{"group:solid"})
if nn and #nn > 0 then
p = vector.offset(nn[math.random(#nn)],0,1,0)
end
minetest.add_item(p, self.what_traded.itemstring)
local stack = ItemStack(self.what_traded.itemstring)
stack:set_count(math.random(self.what_traded.amount_min, self.what_traded.amount_max))
if mcl_enchanting.is_enchanted(self.what_traded.itemstring) then
local enchantment = "soul_speed"
mcl_enchanting.enchant(stack, enchantment, mcl_enchanting.random(nil, 1, mcl_enchanting.enchantments[enchantment].max_level))
end
local p = c_pos
local nn=minetest.find_nodes_in_area_under_air(vector.offset(c_pos,-1,-1,-1),vector.offset(c_pos,1,1,1),{"group:solid"})
if nn and #nn > 0 then
p = vector.offset(nn[math.random(#nn)],0,1,0)
end
minetest.add_item(p, stack)
end
end)
end
@ -332,8 +343,13 @@ mcl_mobs.register_mob("mobs_mc:baby_zombified_piglin", baby_zombified_piglin)
-- Compatibility code. These were removed, and now are called zombie piglins. They don't spawn.
-- This is only to catch old cases. Maybe could be an alias?
mcl_mobs.register_mob("mobs_mc:pigman", zombified_piglin)
mcl_mobs.register_mob("mobs_mc:baby_pigman", baby_zombified_piglin)
local pigman_unused = table.copy(zombified_piglin)
pigman_unused.unused = true
local baby_pigman_unused = table.copy(baby_zombified_piglin)
baby_pigman_unused.unused = true
mcl_mobs.register_mob("mobs_mc:pigman", pigman_unused)
mcl_mobs.register_mob("mobs_mc:baby_pigman", baby_pigman_unused)
-- Piglin Brute --

View File

@ -10,6 +10,7 @@ local S = minetest.get_translator(minetest.get_current_modname())
--###################
local salmon = {
description = S("Salmon"),
type = "animal",
spawn_class = "water_ambient",
can_despawn = true,

View File

@ -176,7 +176,7 @@ end
-- Slime
local slime_big = {
description = S("Slime"),
description = S("Slime - big"),
type = "monster",
spawn_class = "hostile",
group_attack = { "mobs_mc:slime_big", "mobs_mc:slime_small", "mobs_mc:slime_tiny" },
@ -231,6 +231,7 @@ local slime_big = {
mcl_mobs.register_mob("mobs_mc:slime_big", slime_big)
local slime_small = table.copy(slime_big)
slime_small.description = S("Slime - small")
slime_small.sounds.base_pitch = 1.15
slime_small.hp_min = 4
slime_small.hp_max = 4
@ -248,6 +249,7 @@ slime_small.on_die = spawn_children_on_die("mobs_mc:slime_tiny", 0.6, 1.0)
mcl_mobs.register_mob("mobs_mc:slime_small", slime_small)
local slime_tiny = table.copy(slime_big)
slime_tiny.description = S("Slime - tiny")
slime_tiny.sounds.base_pitch = 1.3
slime_tiny.hp_min = 1
slime_tiny.hp_max = 1
@ -397,7 +399,7 @@ swamp_max)
-- Magma cube
local magma_cube_big = {
description = S("Magma Cube"),
description = S("Magma Cube - big"),
type = "monster",
spawn_class = "hostile",
hp_min = 16,
@ -458,6 +460,7 @@ local magma_cube_big = {
mcl_mobs.register_mob("mobs_mc:magma_cube_big", magma_cube_big)
local magma_cube_small = table.copy(magma_cube_big)
magma_cube_small.description = S("Magma Cube - small")
magma_cube_small.sounds.jump = "mobs_mc_magma_cube_small"
magma_cube_small.sounds.death = "mobs_mc_magma_cube_small"
magma_cube_small.hp_min = 4
@ -479,6 +482,7 @@ magma_cube_small.on_die = spawn_children_on_die("mobs_mc:magma_cube_tiny", 0.6,
mcl_mobs.register_mob("mobs_mc:magma_cube_small", magma_cube_small)
local magma_cube_tiny = table.copy(magma_cube_big)
magma_cube_tiny.description = S("Magma Cube - tiny")
magma_cube_tiny.sounds.jump = "mobs_mc_magma_cube_small"
magma_cube_tiny.sounds.death = "mobs_mc_magma_cube_small"
magma_cube_tiny.sounds.base_pitch = 1.25

View File

@ -11,6 +11,7 @@ local S = minetest.get_translator("mobs_mc")
local strider = {
description = S("Strider"),
type = "animal",
passive = true,
spawn_class = "passive",
@ -30,6 +31,8 @@ local strider = {
} },
visual_size = {x=3, y=3},
sounds = {
eat = "mobs_mc_animal_eat_generic",
distance = 16,
},
jump = true,
makes_footstep_sound = true,
@ -51,6 +54,7 @@ local strider = {
walk_start = 1,
walk_end = 20,
},
follow = { "mcl_crimson:warped_fungus" },
lava_damage = 0,
fire_damage = 0,
light_damage = 0,
@ -67,8 +71,13 @@ local strider = {
do_custom = function(self, dtime)
if minetest.find_node_near(self.object:get_pos(), 2, {"mcl_core:lava_source","mcl_core:lava_flowing","mcl_nether:nether_lava_source","mcl_nether:nether_lava_flowing"}) then
self.walk_velocity = 2
self.run_velocity = 4
if self.driver then
self.walk_velocity = 4
self.run_velocity = 8
else
self.walk_velocity = 2
self.run_velocity = 4
end
self.base_texture[1] = "extra_mobs_strider.png"
self.shaking = false
else
@ -122,7 +131,7 @@ local strider = {
local wielditem = clicker:get_wielded_item()
if wielditem:get_name() ~= "mcl_crimson:warped_fungus" then
if wielditem:get_name() == "mcl_crimson:warped_fungus" then
if self:feed_tame(clicker, 1, true, true) then return end
end
@ -197,6 +206,7 @@ mcl_mobs.register_mob("mobs_mc:strider", strider)
-- Baby strider.
local baby_strider = table.copy(strider)
baby_strider.description = S("Baby Strider")
baby_strider.collisionbox = {-.3, -0.01, -.3, .3, 0.94, .3}
baby_strider.xp_min = 13
baby_strider.xp_max = 13
@ -206,7 +216,7 @@ textures = { {
} }
baby_strider.walk_velocity = 1.2
baby_strider.run_velocity = 2.4
baby_strider.child = 1
baby_strider.child = true
mcl_mobs.register_mob("mobs_mc:baby_strider", baby_strider)

View File

@ -58,6 +58,7 @@ local function set_textures(self)
end
local tropical_fish = {
description = S("Tropical Fish"),
type = "animal",
spawn_class = "water_ambient",
can_despawn = true,

View File

@ -1989,6 +1989,17 @@ local trade_inventory = {
-- Otherwise, 20% chance to unlock if used freshly reset trade
unlock_stuff = true
end
-- calculate xp based on the price
local emeralds = 0
if wanted1:get_name() == "mcl_core:emerald" then
emeralds = wanted1:get_count()
elseif wanted2:get_name() == "mcl_core:emerald" then
emeralds = wanted2:get_count()
else
local offered = inv:get_stack("offered", 1)
emeralds = offered:get_name() == "mcl_core:emerald" and offered:get_count() or 0
end
local xp = 2 + math.ceil(emeralds / (64/4)) -- 1..64 emeralds = 3..6 xp
local update_formspec = false
if unlock_stuff then
-- First-time trade unlock all trades and unlock next trade tier
@ -2000,6 +2011,7 @@ local trade_inventory = {
set_textures(trader)
update_max_tradenum(trader)
update_formspec = true
xp = xp + 5
end
for t=1, #trades do
trades[t].locked = false
@ -2010,6 +2022,7 @@ local trade_inventory = {
-- TODO: Replace by Regeneration I
trader.health = math.min(trader.hp_max, trader.health + 4)
end
mcl_experience.add_xp(player, xp)
trade.trade_counter = trade.trade_counter + 1
mcl_log("Trade counter is: ".. trade.trade_counter)
-- Semi-randomly lock trade for repeated trade (not if there's only 1 trade)
@ -2047,6 +2060,7 @@ local trade_inventory = {
if update_formspec then
show_trade_formspec(name, trader, tradenum)
end
else
minetest.log("error", "[mobs_mc] Player took item from trader output but player_trading_with or player_tradenum is nil!")
end

View File

@ -135,6 +135,7 @@ end
-- Tamed wolf (aka “dog”)
local dog = table.copy(wolf)
dog.description = S("Dog")
dog.can_despawn = false
dog.passive = true
dog.hp_min = 20

View File

@ -0,0 +1,62 @@
local mod = vl_physics
local registered_environment_effects = {}
function mod.register_environment_effect(effect)
local list = registered_environment_effects
list[#list + 1] = effect
end
function mod.get_environment_effect(pos, vel, staticdata, mass, entity)
local v = vector.zero()
local a = vector.zero()
-- Accumulate all enviornmental effects
for _,effect in ipairs(registered_environment_effects) do
local dv,da = effect(pos, vel, staticdata, entity)
if dv then
v = v + dv
end
if da then
a = a + da
end
end
-- Disable small effects
if vector.length(v) < 0.01 then v = nil end
if vector.length(a) < 0.01 then a = nil end
return v,a
end
local DEFAULT_ENTITY_PHYSICS = {
mass = 1,
}
function mod.apply_entity_environmental_physics(self, data)
data = data or {}
local physics = self._vl_physics or DEFAULT_ENTITY_PHYSICS
local mass = physics.mass or DEFAULT_ENTITY_PHYSICS.mass
local pos = self.object:get_pos()
local vel = self.object:get_velocity()
local new_velocity,new_acceleration = vl_physics.get_environment_effect(pos, vel, data, mass, self)
--if new_velocity then print("new_velocity="..tostring(new_velocity)) end
--if new_acceleration then print("new_acceleration="..tostring(new_acceleration)) end
-- Update entity states
self._flowing = data.flowing
-- Apply environmental effects if there are any
if new_velocity or new_acceleration then
if new_acceleration then self.object:set_acceleration(new_acceleration) end
if new_velocity then self.object:set_velocity(new_velocity) end
self.physical_state = true
self._flowing = true
self.object:set_properties({
physical = true
})
end
end

View File

@ -0,0 +1,100 @@
local modname = minetest.get_current_modname()
local modpath = minetest.get_modpath(modname)
local mod = {}
vl_physics = mod
dofile(modpath.."/api.lua")
-- Flowing water
-- TODO: move to Flowlib
local FLOW_SPEED = 1.39
local BOUANCY = 3
mod.register_environment_effect(function(pos, vel, staticdata, entity)
-- Get the node and node definition
local node = minetest.get_node_or_nil(pos); if not node then return end
local nodedef = minetest.registered_nodes[node.name]; if not nodedef then return end
-- Make sure we are in a liquid before continuing
local is_flowing = (nodedef.liquidtype == "flowing")
staticdata.flowing = is_flowing
if not is_flowing then return end
-- Get liquid flow direction
local vec = vector.multiply(flowlib.quick_flow(pos, node), FLOW_SPEED)
return vector.new(vec.x, -0.22, vec.z),nil -- TODO: move bouancy velocity out of here
end)
-- Simple gravity and bouancy
mod.register_environment_effect(function(pos, vel, staticdata, entity)
-- Get the node and node definition
local node = minetest.get_node_or_nil(pos);
local nodedef = nil
if node then nodedef = minetest.registered_nodes[node.name] end
if nodedef and nodedef.liquidtype == "source" then -- TODO: make this apply to flowing liquids as well
-- TODO: make this not apply to fish
--print("entity="..dump(entity))
-- Apply decceleration and bouancy if the entity moved from flowing water to
-- stationary water
return nil,vector.new(
0 - vel.x * 0.9,
BOUANCY - vel.y * 0.9,
0 - vel.z * 0.9
)
else
local gravity = tonumber(minetest.settings:get("movement_gravity")) or 9.81
return nil,vector.new(0,-gravity,0)
end
end)
-- Node effects
local DEFAULT_NODE_PHYSICS = {
friction = 0.9
}
local function apply_node_physics(node, vel, staticdata, entity)
local node_def = minetest.registered_nodes[node.name] or {}
local node_physics = node_def._vl_physics or DEFAULT_NODE_PHYSICS
local node_physics_effect = node_physics.effect
if node_physics_effect then
return node_physics_effect(pos, vel, staticdata)
end
-- Default behavior
local accel = vector.zero()
-- Friction
if node.name ~= "air" then
local friction_scale = node_physics.friction
accel = accel + vel * -friction_scale
end
return vector.zero(), accel
end
mod.register_environment_effect(function(pos, vel, staticdata, entity)
local a = vector.zero()
local v = vector.zero()
-- Apply node physics for the node we are inside of
local pos1_r = vector.round(pos)
local node1 = minetest.get_node(pos1_r)
local v1,a1 = apply_node_physics(node1, vel, staticdata, entity)
v = v + v1
a = a + a1
-- TODO: only apply when touching under_node
local pos2_r = vector.offset(pos1_r,0,-1,0)
local node2 = minetest.get_node(pos2_r)
local v2,a2 = apply_node_physics(node2, vel, staticdata, entity)
v = v + v2
a = a + a2
-- Male speeds of less than 1/100 block/second count as zero
if vector.length(v) < 0.01 then
v = nil
end
return v,a
end)

View File

@ -0,0 +1,4 @@
name = vl_physics
author = teknomunk
description = Environmental physics
depends = flowlib

View File

@ -53,7 +53,7 @@ doc.data = {}
doc.data.categories = {}
doc.data.aliases = {}
-- Default order (includes categories of other mods from the Docuentation System modpack)
doc.data.category_order = {"basics", "nodes", "tools", "craftitems", "advanced"}
doc.data.category_order = {"basics", "nodes", "tools", "craftitems", "advanced", "mobs"}
doc.data.category_count = 0
doc.data.players = {}

View File

@ -116,7 +116,11 @@ function doc_identifier.identify(itemstack, user, pointed_thing)
end
-- A known registered object
elseif ro then
doc.show_entry(username, ro.category, ro.entry, true)
if doc.entry_exists("mobs", le.name) then
doc.show_entry(username, "mobs", le.name, true)
else
doc.show_entry(username, ro.category, ro.entry, true)
end
-- Undefined object (error)
elseif minetest.registered_entities[le.name] == nil then
show_message(username, "error_unknown", le.name)

View File

@ -1136,6 +1136,86 @@ doc.add_category("craftitems", {
end
})
doc.add_category("mobs", {
name = S("Mobs"),
description = S("different mobs"),
build_formspec = function(data, playername)
if data then
local datastring = ""
if data.description then
datastring = datastring .. S("Description: @1", data.description)
datastring = newline2(datastring)
end
if data.type then
datastring = datastring .. S("Type: @1", data.type)
datastring = newline2(datastring)
end
if data.spawn_class then
datastring = datastring .. S("spawn class: @1", data.spawn_class)
datastring = newline2(datastring)
end
if data.jump then
datastring = datastring .. S("Can Jump")
datastring = newline2(datastring)
end
if data.fly then
datastring = datastring .. S("Can Fly")
datastring = newline2(datastring)
end
if data.drops then
count = 0
for _,item in ipairs(data.drops) do
count = count + 1
end
if count > 0 then
datastring = datastring .. S("drops: ")
datastring = newline(datastring)
for _,item in ipairs(data.drops) do
local itemDescription = ItemStack(item.name):get_short_description()
datastring = datastring .. itemDescription
datastring = newline(datastring)
end
datastring = newline2(datastring)
end
end
if data.follow then
datastring = datastring .. S("follows player when these items are held:")
datastring = newline(datastring)
if type(data.follow) == "string" then
datastring = datastring .. data.follow
datastring = newline(datastring)
else
for i=1, #data.follow do
local itemstring = data.follow[i]
local itemDescription = ItemStack(itemstring):get_short_description()
datastring = datastring .. itemDescription
datastring = newline(datastring)
end
end
datastring = newline2(datastring)
end
local formstring = doc.widgets.text(datastring, nil, nil, doc.FORMSPEC.ENTRY_WIDTH - 1.2)
return formstring
else
return "label[0,1;NO DATA AVALIABLE!]"
end
end
})
-- Register group definition stuff
-- More (user-)friendly group names to replace the rather technical names
-- for better understanding

View File

@ -106,6 +106,31 @@ local item_lists = {
"craftpreview",
}
local function init_data(name)
player_data[name] = {
filter = "",
pagenum = 1,
iX = sfinv_only and 8 or DEFAULT_SIZE,
items = init_items,
items_raw = init_items,
lang_code = M.get_player_information(name).lang_code or 'en',
}
end
local function get_player_data(name)
-- If the data alrady exists, use it
local data = player_data[name]
if data then return data end
-- Initialize player data if it doesn't exist
init_data(name)
local player = minetest.get_player_by_name(name)
local meta = player:get_meta()
local data = player_data[name]
data.inv_items = deserialize(meta:get_string("inv_items")) or {}
return data
end
local function table_merge(t, t2)
t, t2 = t or {}, t2 or {}
local c = #t
@ -624,7 +649,7 @@ local function get_recipe_fs(data, iY)
end
local function make_formspec(name)
local data = player_data[name]
local data = get_player_data(name)
local iY = sfinv_only and 4 or data.iX - 5
local ipp = data.iX * iY
@ -831,17 +856,6 @@ local function get_inv_items(player)
return inv_items
end
local function init_data(name)
player_data[name] = {
filter = "",
pagenum = 1,
iX = sfinv_only and 8 or DEFAULT_SIZE,
items = init_items,
items_raw = init_items,
lang_code = M.get_player_information(name).lang_code or 'en',
}
end
local function reset_data(data)
data.filter = ""
data.pagenum = 1
@ -877,7 +891,7 @@ end
local function on_receive_fields(player, fields)
local name = player:get_player_name()
local data = player_data[name]
local data = get_player_data(name)
for elem_name, def in pairs(formspec_elements) do
if fields[elem_name] and def.action then
@ -981,7 +995,7 @@ if sfinv_only then
on_enter = function(self, player, context)
if next(recipe_filters) then
local name = player:get_player_name()
local data = player_data[name]
local data = get_player_data(name)
data.items_raw = get_filtered_items(player)
search(data)
@ -1005,7 +1019,7 @@ else
local name = user:get_player_name()
if next(recipe_filters) then
local data = player_data[name]
local data = get_player_data(name)
data.items_raw = get_filtered_items(user)
search(data)
end
@ -1051,7 +1065,7 @@ if progressive_mode then
local function progressive_filter(recipes, player)
local name = player:get_player_name()
local data = player_data[name]
local data = get_player_data(name)
if #data.inv_items == 0 then
return {}
@ -1076,7 +1090,7 @@ if progressive_mode then
for i = 1, #players do
local player = players[i]
local name = player:get_player_name()
local data = player_data[name]
local data = get_player_data(name)
local inv_items = get_inv_items(player)
local diff = table_diff(inv_items, data.inv_items)
@ -1095,12 +1109,7 @@ if progressive_mode then
mcl_craftguide.add_recipe_filter("Default progressive filter", progressive_filter)
M.register_on_joinplayer(function(player)
local name = player:get_player_name()
init_data(name)
local meta = player:get_meta()
local data = player_data[name]
data.inv_items = deserialize(meta:get_string("inv_items")) or {}
get_player_data(player:get_player_name())
end)
local function save_meta(player)
@ -1145,7 +1154,7 @@ end
function mcl_craftguide.show(name)
local player = get_player_by_name(name)
if next(recipe_filters) then
local data = player_data[name]
local data = get_player_data(name)
data.items_raw = get_filtered_items(player)
search(data)
end

View File

@ -76,6 +76,7 @@ function tt.reload_itemstack_description(itemstack)
orig_desc = minetest.colorize(tt.NAME_COLOR, meta:get_string("name"))
end
local desc = apply_snippets(orig_desc, itemstring, toolcaps or def.tool_capabilities, itemstack)
if desc == def.description and meta:get_string("description") == "" then return end
meta:set_string("description", desc)
end
end

View File

@ -109,42 +109,7 @@ local function xp_step(self, dtime)
end
-- Slide on slippery nodes
vel = self.object:get_velocity()
def = node and minetest.registered_nodes[node.name]
is_moving = (def and not def.walkable) or
vel.x ~= 0 or vel.y ~= 0 or vel.z ~= 0
is_slippery = false
if def and def.walkable then
slippery = minetest.get_item_group(node.name, "slippery")
is_slippery = slippery ~= 0
if is_slippery and (math.abs(vel.x) > 0.2 or math.abs(vel.z) > 0.2) then
-- Horizontal deceleration
slip_factor = 4.0 / (slippery + 4)
self.object:set_acceleration({
x = -vel.x * slip_factor,
y = 0,
z = -vel.z * slip_factor
})
elseif vel.y == 0 then
is_moving = false
end
end
if self.moving_state == is_moving and self.slippery_state == is_slippery then
-- Do not update anything until the moving state changes
return
end
self.moving_state = is_moving
self.slippery_state = is_slippery
if is_moving then
self.object:set_acceleration(gravity)
else
self.object:set_acceleration({x = 0, y = 0, z = 0})
self.object:set_velocity({x = 0, y = 0, z = 0})
end
vl_physics.apply_entity_environmental_physics(self)
end
minetest.register_entity("mcl_experience:orb", {
@ -177,7 +142,6 @@ minetest.register_entity("mcl_experience:orb", {
delete_timer = 0,
radius = 4,
on_activate = function(self, staticdata, dtime_s)
self.object:set_velocity(vector.new(
math.random(-2,2)*math.random(),
@ -187,10 +151,14 @@ minetest.register_entity("mcl_experience:orb", {
self.object:set_armor_groups({immortal = 1})
self.object:set_velocity({x = 0, y = 2, z = 0})
self.object:set_acceleration(gravity)
local xp = tonumber(staticdata)
-- Assign 0 xp in case the entity was persisted even though it should not have been (static_save = false)
-- This was a minetest bug for a while: https://github.com/minetest/minetest/issues/14420
local xp = tonumber(staticdata) or 0
self._xp = xp
size = xp_to_size(xp)
self.object:set_properties({
size = xp_to_size(xp)
self.object:set_properties({
visual_size = {x = size, y = size},
glow = 14,
})

View File

@ -204,7 +204,8 @@ local function init(player)
local playername = player:get_player_name()
minetest.create_detached_inventory("creative_" .. playername, {
allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
if minetest.is_creative_enabled(playername) then
if minetest.is_creative_enabled(playername) and
from_list ~= to_list then
return count
else
return 0
@ -541,7 +542,6 @@ function mcl_inventory.set_creative_formspec(player)
"style[" .. this_tab .. ";border=false;bgimg=;bgimg_pressed=;noclip=true]",
"image[" .. offset[this_tab] .. ";1.5,1.44;" .. bg_img .. "]",
"item_image_button[" .. boffset[this_tab] .. ";1,1;" .. tab_icon[this_tab] .. ";" .. this_tab .. ";]",
"tooltip[blocks;" .. F(filtername[this_tab]) .. "]"
})
end
@ -570,20 +570,33 @@ function mcl_inventory.set_creative_formspec(player)
listrings,
tab(name, "blocks"),
tab(name, "deco"),
tab(name, "redstone"),
tab(name, "rail"),
tab(name, "misc"),
tab(name, "nix"),
tab(name, "blocks") ..
"tooltip[blocks;"..F(filtername["blocks"]).."]"..
tab(name, "deco") ..
"tooltip[deco;"..F(filtername["deco"]).."]"..
tab(name, "redstone") ..
"tooltip[redstone;"..F(filtername["redstone"]).."]"..
tab(name, "rail") ..
"tooltip[rail;"..F(filtername["rail"]).."]"..
tab(name, "misc") ..
"tooltip[misc;"..F(filtername["misc"]).."]"..
tab(name, "nix") ..
"tooltip[nix;"..F(filtername["nix"]).."]"..
tab(name, "food"),
tab(name, "tools"),
tab(name, "combat"),
tab(name, "mobs"),
tab(name, "brew"),
tab(name, "matr"),
tab(name, "inv"),
tab(name, "food") ..
"tooltip[food;"..F(filtername["food"]).."]"..
tab(name, "tools") ..
"tooltip[tools;"..F(filtername["tools"]).."]"..
tab(name, "combat") ..
"tooltip[combat;"..F(filtername["combat"]).."]"..
tab(name, "mobs") ..
"tooltip[mobs;"..F(filtername["mobs"]).."]"..
tab(name, "brew") ..
"tooltip[brew;"..F(filtername["brew"]).."]"..
tab(name, "matr") ..
"tooltip[matr;"..F(filtername["matr"]).."]"..
tab(name, "inv") ..
"tooltip[inv;"..F(filtername["inv"]).."]"
})
if name == "nix" then
@ -594,6 +607,7 @@ function mcl_inventory.set_creative_formspec(player)
formspec = formspec .. table.concat({
"field[5.325,0.15;6.1,0.6;search;;" .. minetest.formspec_escape(filter) .. "]",
"field_close_on_enter[search;false]",
"field_enter_after_edit[search;true]",
"set_focus[search;true]",
})
end

View File

@ -36,9 +36,14 @@ function mcl_inventory.register_survival_inventory_tab(def)
end
local player_current_tab = {}
function get_player_tab(player)
local tab = player_current_tab[player] or "main"
player_current_tab[player] = tab
return tab
end
minetest.register_on_joinplayer(function(player, last_login)
player_current_tab[player] = "main"
get_player_tab(player)
end)
minetest.register_on_leaveplayer(function(player, timed_out)
@ -184,7 +189,7 @@ function mcl_inventory.build_survival_formspec(player)
inv:set_width("craft", 2)
inv:set_size("craft", 4)
local tab = player_current_tab[player]
local tab = get_player_tab(player)
local tab_def = nil
@ -213,7 +218,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end
for _, d in ipairs(mcl_inventory.registered_survival_inventory_tabs) do
if player_current_tab[player] == d.id and d.access(player) then
if get_player_tab(player) == d.id and d.access(player) then
d.handle(player, fields)
return
end

View File

@ -16,19 +16,31 @@ local function offhand_get_count(player)
return mcl_offhand.get_offhand(player):get_count()
end
minetest.register_on_joinplayer(function(player, last_login)
mcl_offhand[player] = {
local function get_offhand(player)
-- Get offhand data if it already exists
local offhand = mcl_offhand[player]
if offhand then return offhand end
-- Otherwise initialize it
offhand = {
hud = {},
last_wear = offhand_get_wear(player),
last_count = offhand_get_count(player),
}
mcl_offhand[player] = offhand
return offhand
end
minetest.register_on_joinplayer(function(player, last_login)
get_offhand(player)
end)
local function remove_hud(player, hud)
local offhand_hud = mcl_offhand[player].hud[hud]
local offhand = get_offhand(player)
local offhand_hud = offhand.hud[hud]
if offhand_hud then
player:hud_remove(offhand_hud)
mcl_offhand[player].hud[hud] = nil
offhand.hud[hud] = nil
end
end
@ -48,7 +60,8 @@ local function update_wear_bar(player, itemstack)
else
color = {255, 511 - wear_i, 0}
end
local wear_bar = mcl_offhand[player].hud.wear_bar
local offhand = get_offhand(player)
local wear_bar = offhand.hud.wear_bar
player:hud_change(wear_bar, "text", "mcl_wear_bar.png^[colorize:#" .. rgb_to_hex(color[1], color[2], color[3]))
player:hud_change(wear_bar, "scale", {x = 40 * wear_bar_percent, y = 3})
player:hud_change(wear_bar, "offset", {x = -320 - (20 - player:hud_get(wear_bar).scale.x / 2), y = -13})
@ -58,7 +71,8 @@ minetest.register_globalstep(function(dtime)
for _, player in pairs(minetest.get_connected_players()) do
local itemstack = mcl_offhand.get_offhand(player)
local offhand_item = itemstack:get_name()
local offhand_hud = mcl_offhand[player].hud
local offhand = get_offhand(player)
local offhand_hud = offhand.hud
local item = minetest.registered_items[offhand_item]
if offhand_item ~= "" and item then
local item_texture = item.inventory_image .. "^[resize:" .. max_offhand_px .. "x" .. max_offhand_px
@ -145,7 +159,8 @@ minetest.register_globalstep(function(dtime)
end
elseif offhand_hud.slot then
for index, _ in pairs(mcl_offhand[player].hud) do
local offhand = get_offhand(player)
for index, _ in pairs(offhand.hud) do
remove_hud(player, index)
end
end

View File

@ -77,16 +77,31 @@ local function rotate(pos, node, user, mode, new_param2)
end
local creative_dig = {}
local function destruct_bed(pos, oldnode)
local node = oldnode or minetest_get_node_or_nil(pos)
if not node then return end
local pos2, node2, bottom = get_bed_next_node(pos, oldnode)
-- Check creative dig flags and don't drop an item if the bed was dug by a player in
-- creative mode
local pos_hash = minetest.hash_node_position(pos)
local pos2_hash = minetest.hash_node_position(pos2)
local creative_mode = creative_dig[pos_hash] or creative_dig[pos2_hash]
if bottom then
if node2 and string.sub(node2.name, -4) == "_top" then
minetest_remove_node(pos2)
end
-- Drop the bed only when removing the top to prevent duplication and only if
-- it wasn't dug by a player in creative mode
local bed_node_def = minetest.registered_nodes[node.name]
if bed_node_def and bed_node_def._mcl_beds_drop and not creative_mode then
local stack = ItemStack(bed_node_def._mcl_beds_drop)
minetest.add_item(pos2, stack)
end
else
if node2 and string.sub(node2.name, -7) == "_bottom" then
minetest_remove_node(pos2)
@ -94,6 +109,29 @@ local function destruct_bed(pos, oldnode)
end
end
local function dig_bed(pos, node, digger)
local pos_hash = minetest.hash_node_position(pos)
if digger then
local name = digger:get_player_name()
if minetest.is_protected(pos, name) then
minetest.record_protection_violation(pos, name)
return
end
-- Set creative dig flags to stop dropping items
if minetest.is_creative_enabled(name) then
creative_dig[pos_hash] = true
end
end
-- Trigger the destruct_bed function
minetest.remove_node(pos)
-- Clean up creative dig flag
creative_dig[pos_hash] = nil
end
local function kick_player_after_destruct(destruct_pos)
for name, player_bed_pos in pairs(mcl_beds.bed_pos) do
if vector.distance(destruct_pos, player_bed_pos) < 0.1 then
@ -126,6 +164,26 @@ if minetest.get_modpath("mcl_sounds") then
})
end
local function place_bed(name, placer, pos, dir)
local botpos = vector_add(pos, minetest_facedir_to_dir(dir))
if minetest.is_protected(botpos, placer:get_player_name()) and
not minetest.check_player_privs(placer, "protection_bypass") then
minetest.record_protection_violation(botpos, placer:get_player_name())
return false
end
local botdef = minetest.registered_nodes[minetest_get_node(botpos).name]
if not botdef or not botdef.buildable_to then
return false
end
minetest.set_node(pos, {name = name .. "_bottom", param2 = dir})
minetest.set_node(botpos, {name = name .. "_top", param2 = dir})
return true
end
function mcl_beds.register_bed(name, def)
local common_box = {
type = "fixed",
@ -156,7 +214,8 @@ function mcl_beds.register_bed(name, def)
sounds = def.sounds or default_sounds,
selection_box = common_box,
collision_box = common_box,
drop = def.recipe and name or "",
_mcl_beds_drop = def.recipe and name or "",
drop = "",
node_placement_prediction = "",
on_place = function(itemstack, placer, pointed_thing)
@ -189,30 +248,23 @@ function mcl_beds.register_bed(name, def)
return itemstack
end
-- Try to place in three directions: inline with the view and rotated to
-- the right and left
local dir = minetest.dir_to_facedir(placer:get_look_dir())
local botpos = vector_add(pos, minetest_facedir_to_dir(dir))
if minetest.is_protected(botpos, placer:get_player_name()) and
not minetest.check_player_privs(placer, "protection_bypass") then
minetest.record_protection_violation(botpos, placer:get_player_name())
return itemstack
end
local botdef = minetest.registered_nodes[minetest_get_node(botpos).name]
if not botdef or not botdef.buildable_to then
return itemstack
end
minetest.set_node(pos, {name = name .. "_bottom", param2 = dir})
minetest.set_node(botpos, {name = name .. "_top", param2 = dir})
if not minetest.is_creative_enabled(placer:get_player_name()) then
itemstack:take_item()
if place_bed(name, placer, pos, dir) or
place_bed(name, placer, pos, (dir+1)%4) or
place_bed(name, placer, pos, (dir+3)%4) or
place_bed(name, placer, pos, (dir+2)%4) then
-- Bed was places
if not minetest.is_creative_enabled(placer:get_player_name()) then
itemstack:take_item()
end
end
return itemstack
end,
after_destruct = destruct_bed,
on_dig = dig_bed,
on_destruct = kick_player_after_destruct,
@ -239,7 +291,7 @@ function mcl_beds.register_bed(name, def)
_mcl_hardness = 0.2,
_mcl_blast_resistance = 1,
sounds = def.sounds or default_sounds,
drop = def.recipe and name or "",
drop = "",
selection_box = common_box,
collision_box = common_box,
@ -250,6 +302,7 @@ function mcl_beds.register_bed(name, def)
on_rotate = rotate,
after_destruct = destruct_bed,
on_dig = dig_bed,
})
minetest.register_alias(name, name .. "_bottom")

View File

@ -8,7 +8,7 @@ local is_sp = minetest.is_singleplayer()
local weather_mod = minetest.get_modpath("mcl_weather")
local explosions_mod = minetest.get_modpath("mcl_explosions")
local spawn_mod = minetest.get_modpath("mcl_spawn")
local worlds_mod = minetest.get_modpath("mcl_worlds")
local pos_to_dim = minetest.get_modpath("mcl_worlds") and mcl_worlds.pos_to_dimension or function(pos) return "overworld" end
local function mcl_log (message)
mcl_util.mcl_log (message, "[Beds]")
@ -38,6 +38,16 @@ local function is_night_skip_enabled()
return players_in_bed_setting() <= 100
end
local function players_in_overworld(players)
local count = 0
for _, player in pairs(players) do
if player and pos_to_dim(player:get_pos()) == "overworld" then
count = count +1
end
end
return count
end
local function check_in_beds(players)
if not players then
players = minetest.get_connected_players()
@ -45,7 +55,7 @@ local function check_in_beds(players)
if player_in_bed <= 0 then
return false
end
return players_in_bed_setting() <= (player_in_bed * 100) / #players
return players_in_bed_setting() <= (player_in_bed * 100) / players_in_overworld(players)
end
-- These monsters do not prevent sleep
@ -206,10 +216,10 @@ local function lay_down(player, pos, bed_pos, state, skip)
return true
end
local function update_formspecs(finished, ges)
local ges = ges or #minetest.get_connected_players()
local function update_formspecs(finished, players)
local ges = players_in_overworld(players or minetest.get_connected_players())
local form_n = "size[12,5;true]"
local all_in_bed = players_in_bed_setting() <= (player_in_bed * 100) / ges
local all_in_bed = ges and players_in_bed_setting() <= (player_in_bed * 100) / ges or 0
local night_skip = is_night_skip_enabled()
local button_leave = "button_exit[4,3;4,0.75;leave;"..F(S("Leave bed")).."]"
local button_abort = "button_exit[4,3;4,0.75;leave;"..F(S("Abort sleep")).."]"
@ -349,25 +359,36 @@ function mcl_beds.get_bed_bottom (pos)
return bed_bottom
end
local function recheck_in_beds()
if check_in_beds() then
update_formspecs(is_night_skip_enabled())
mcl_beds.sleep()
end
-- check again (a player can change the dimension)
if player_in_bed > 0 then
update_formspecs(false)
minetest.after(5, recheck_in_beds)
end
end
function mcl_beds.on_rightclick(pos, player, is_top)
-- Anti-Inception: Don't allow to sleep while you're sleeping
if player:get_meta():get_string("mcl_beds:sleeping") == "true" then
return
end
if worlds_mod then
local dim = mcl_worlds.pos_to_dimension(pos)
if dim == "nether" or dim == "end" then
-- Bed goes BOOM in the Nether or End.
local node = minetest.get_node(pos)
local dir = minetest.facedir_to_dir(node.param2)
local dim = pos_to_dim(pos)
if dim == "nether" or dim == "end" then
-- Bed goes BOOM in the Nether or End.
local node = minetest.get_node(pos)
local dir = minetest.facedir_to_dir(node.param2)
minetest.remove_node(pos)
minetest.remove_node(string.sub(node.name, -4) == "_top" and vector.subtract(pos, dir) or vector.add(pos, dir))
if explosions_mod then
mcl_explosions.explode(pos, 5, {drop_chance = 1.0, fire = true})
end
return
minetest.remove_node(pos)
minetest.remove_node(string.sub(node.name, -4) == "_top" and vector.subtract(pos, dir) or vector.add(pos, dir))
if explosions_mod then
mcl_explosions.explode(pos, 5, {drop_chance = 1.0, fire = true})
end
return
end
local name = player:get_player_name()
local ppos = player:get_pos()
@ -385,10 +406,13 @@ function mcl_beds.on_rightclick(pos, player, is_top)
mcl_title.set(player, "actionbar", {text=message, color="white", stay=60})
else -- someone just successfully entered a bed
local connected_players = minetest.get_connected_players()
local sleep_hud_message = S("@1/@2 players currently in bed.", player_in_bed, math.ceil(players_in_bed_setting() * #connected_players / 100))
local ges = players_in_overworld(connected_players)
local sleep_hud_message = S("@1/@2 players currently in bed.", player_in_bed, math.ceil(players_in_bed_setting() * ges / 100))
for _, player in pairs(connected_players) do
if not mcl_beds.player[player:get_player_name()] then -- only send message to players not sleeping.
if mcl_title.params_get(player) then mcl_title.clear(player) end -- clear, old message is still being displayed
-- only send message to players not sleeping and in the "overworld"
if not mcl_beds.player[player:get_player_name()] and pos_to_dim(player:get_pos()) == "overworld" then
-- clear, old message is still being displayed
if mcl_title.params_get(player) then mcl_title.clear(player) end
mcl_title.set(player, "actionbar", {text=sleep_hud_message, color="white", stay=60})
end
end
@ -400,13 +424,8 @@ function mcl_beds.on_rightclick(pos, player, is_top)
update_formspecs(false)
-- skip the night and let all players stand up
if check_in_beds() then
minetest.after(5, function()
if check_in_beds() then
update_formspecs(is_night_skip_enabled())
mcl_beds.sleep()
end
end)
if player_in_bed > 0 then
minetest.after(5, recheck_in_beds)
end
end
@ -433,15 +452,10 @@ minetest.register_on_leaveplayer(function(player)
break
end
end
if check_in_beds(players) then
minetest.after(5, function()
if check_in_beds() then
update_formspecs(is_night_skip_enabled())
mcl_beds.sleep()
end
end)
if player_in_bed > 0 then
minetest.after(5, recheck_in_beds)
end
update_formspecs(false, #players)
update_formspecs(false, players)
end)
local message_rate_limit = tonumber(minetest.settings:get("chat_message_limit_per_10sec")) or 8 --NEVER change this! if this was java, i would've declared it as final

View File

@ -8,36 +8,60 @@ local S = minetest.get_translator(minetest.get_current_modname())
-- Function to allow harvesting honey and honeycomb from the beehive and bee nest.
local honey_harvest = function(pos, node, player, itemstack, pointed_thing)
local inv = player:get_inventory()
local shears = minetest.get_item_group(player:get_wielded_item():get_name(), "shears") > 0
local bottle = player:get_wielded_item():get_name() == "mcl_potions:glass_bottle"
local beehive = "mcl_beehives:beehive"
local item = player:get_wielded_item()
local is_creative = minetest.is_creative_enabled(player:get_player_name())
-- Determine the node name to replace the beehive with if harvest is successful
local beehive = "mcl_beehives:beehive"
if node.name == "mcl_beehives:beehive_5" then
beehive = "mcl_beehives:beehive"
elseif node.name == "mcl_beehives:bee_nest_5" then
beehive = "mcl_beehives:bee_nest"
end
-- Check for a campfire within 5 blocks below the beehive
local campfire_area = vector.offset(pos, 0, -5, 0)
local campfire = minetest.find_nodes_in_area(pos, campfire_area, "group:lit_campfire")
if bottle then
-- Player used a bottle
if item:get_name() == "mcl_potions:glass_bottle" then
local honey = "mcl_honey:honey_bottle"
if inv:room_for_item("main", honey) then
-- Replace the beehive with the version without honey or comb
node.name = beehive
minetest.set_node(pos, node)
-- Give honey bottle and take the empty bottle if survival mode
inv:add_item("main", "mcl_honey:honey_bottle")
if not is_creative then
itemstack:take_item()
end
if not campfire[1] then mcl_util.deal_damage(player, 10) else awards.unlock(player:get_player_name(), "mcl:bee_our_guest") end
-- Hurt the player if there was no campfire, or give award if there was
if not campfire[1] then
mcl_util.deal_damage(player, 10)
else
awards.unlock(player:get_player_name(), "mcl:bee_our_guest")
end
end
elseif shears then
-- Player used shears
elseif minetest.get_item_group(item:get_name(), "shears") > 0 then
-- Give honeycomb
minetest.add_item(pos, "mcl_honey:honeycomb 3")
-- Replace the beehive with the version without honey or comb
node.name = beehive
minetest.set_node(pos, node)
-- Hurt the player if there was no campfire
if not campfire[1] then mcl_util.deal_damage(player, 10) end
-- Add wear to the shears
if not is_creative then
mcl_util.use_item_durability(item, 1)
return item
end
end
end
@ -191,6 +215,18 @@ minetest.register_craft({
},
})
minetest.register_craft({
type = "fuel",
recipe = "group:bee_nest",
burntime = 15,
})
minetest.register_craft({
type = "fuel",
recipe = "group:beehive",
burntime = 15,
})
-- Temporary ABM to update honey levels
minetest.register_abm({
label = "Update Beehive Honey Levels",

View File

@ -475,8 +475,11 @@ minetest.register_node("mcl_books:bookshelf", {
_mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return inv, "main", mcl_util.select_stack(hop_inv, hop_list, inv, "main",
function(stack) return minetest.get_item_group(stack:get_name(), "book") == 1 or stack:get_name() == "mcl_enchanting:book_enchanted" end)
local function filter(stack)
return minetest.get_item_group(stack:get_name(), "book") == 1 or
stack:get_name() == "mcl_enchanting:book_enchanted"
end
return inv, "main", mcl_util.select_stack(hop_inv, hop_list, inv, "main", filter, 1)
end,
})

View File

@ -379,16 +379,27 @@ end
local function hoppers_on_try_push(pos, hop_pos, hop_inv, hop_list)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if math.abs(pos.y - hop_pos.y) > math.abs(pos.x - hop_pos.x) and math.abs(pos.y - hop_pos.y) > math.abs(pos.z - hop_pos.z) then
return inv, "input", mcl_util.select_stack(hop_inv, hop_list, inv, "input",
function(stack) return minetest.get_item_group(stack:get_name(), "brewitem") == 1 and minetest.get_item_group(stack:get_name(), "bottle") == 0 end)
if math.abs(pos.y - hop_pos.y) > math.abs(pos.x - hop_pos.x) and math.abs(pos.y - hop_pos.y) > math.abs(pos.z - hop_pos.z)
then
local function filter(stack)
return minetest.get_item_group(stack:get_name(), "brewitem") == 1 and
minetest.get_item_group(stack:get_name(), "bottle") == 0
end
return inv, "input", mcl_util.select_stack(hop_inv, hop_list, inv, "input", filter, 1)
else
local stack = mcl_util.select_stack(hop_inv, hop_list, inv, "fuel", function(stack) return stack:get_name() == "mcl_mobitems:blaze_powder" end)
local filter = function(stack)
return stack:get_name() == "mcl_mobitems:blaze_powder"
end
local stack = mcl_util.select_stack(hop_inv, hop_list, inv, "fuel", filter, 1 )
if stack then
return inv, "fuel", stack
else
return inv, "stand", mcl_util.select_stack(hop_inv, hop_list, inv, "stand",
function(stack) return minetest.get_item_group(stack:get_name(), "bottle") == 1 end)
local function filter(stack)
return minetest.get_item_group(stack:get_name(), "bottle") == 1
end
return inv, "stand", mcl_util.select_stack(hop_inv, hop_list, inv, "stand", filter, 1)
end
end
end

View File

@ -26,3 +26,9 @@ minetest.register_craft({
{ "group:wood", "group:wood", "" },
}
})
minetest.register_craft({
type = "fuel",
recipe = "mcl_cartography_table:cartography_table",
burntime = 15,
})

View File

@ -2,6 +2,8 @@
local planks = "mcl_cherry_blossom:cherrywood"
local logs = "mcl_cherry_blossom:cherrytree"
local stripped_logs = "mcl_cherry_blossom:stripped_cherrytree"
local wood = "mcl_cherry_blossom:cherrytree_bark"
local stripped_wood = "mcl_cherry_blossom:stripped_cherrytree_bark"
minetest.register_craft({
output = "mcl_cherry_blossom:cherrytree_bark 3",
@ -26,6 +28,27 @@ minetest.register_craft({
}
})
minetest.register_craft({
output = "mcl_cherry_blossom:cherrywood 4",
recipe = {
{ wood },
}
})
minetest.register_craft({
output = "mcl_cherry_blossom:cherrywood 4",
recipe = {
{ stripped_logs },
}
})
minetest.register_craft({
output = "mcl_cherry_blossom:cherrywood 4",
recipe = {
{ stripped_wood },
}
})
minetest.register_craft({
output = "mcl_cherry_blossom:cherry_door 3",
recipe = {

View File

@ -760,7 +760,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile
_mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local stack_id = mcl_util.select_stack(hop_inv, hop_list, inv, "main")
local stack_id = mcl_util.select_stack(hop_inv, hop_list, inv, "main", nil, 1)
if stack_id ~= nil then
return inv, "main", stack_id
end
@ -768,7 +768,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left")
local meta_other = minetest.get_meta(pos_other)
local inv_other = meta_other:get_inventory()
stack_id = mcl_util.select_stack(hop_inv, hop_list, inv_other, "main")
stack_id = mcl_util.select_stack(hop_inv, hop_list, inv_other, "main", nil, 1)
return inv_other, "main", stack_id
end,
})
@ -955,13 +955,13 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right")
local meta_other = minetest.get_meta(pos_other)
local inv_other = meta_other:get_inventory()
local stack_id = mcl_util.select_stack(hop_inv, hop_list, inv_other, "main")
local stack_id = mcl_util.select_stack(hop_inv, hop_list, inv_other, "main", nil, 1)
if stack_id ~= nil then
return inv_other, "main", stack_id
end
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
stack_id = mcl_util.select_stack(hop_inv, hop_list, inv, "main")
stack_id = mcl_util.select_stack(hop_inv, hop_list, inv, "main", nil, 1)
return inv, "main", stack_id
end,
})
@ -1522,7 +1522,7 @@ for color, desc in pairs(boxtypes) do
_mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return inv, "main", mcl_util.select_stack(hop_inv, hop_list, inv, "main", mcl_chests.is_not_shulker_box)
return inv, "main", mcl_util.select_stack(hop_inv, hop_list, inv, "main", mcl_chests.is_not_shulker_box, 1)
end,
})

View File

@ -238,7 +238,7 @@ minetest.register_node("mcl_composters:composter", {
_mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src", hopper_push_condition)
return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src", hopper_push_condition, 1)
end,
_mcl_hoppers_on_after_push = function(pos)
local meta = minetest.get_meta(pos)
@ -293,7 +293,7 @@ local function register_filled_composter(level)
_mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src", hopper_push_condition)
return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src", hopper_push_condition, 1)
end,
_mcl_hoppers_on_after_push = function(pos)
local meta = minetest.get_meta(pos)

View File

@ -907,6 +907,9 @@ minetest.register_node("mcl_core:ice", {
_mcl_blast_resistance = 0.5,
_mcl_hardness = 0.5,
_mcl_silk_touch_drop = true,
_vl_physics = {
friction = 0.4,
},
})
minetest.register_node("mcl_core:packed_ice", {
@ -921,6 +924,9 @@ minetest.register_node("mcl_core:packed_ice", {
_mcl_blast_resistance = 0.5,
_mcl_hardness = 0.5,
_mcl_silk_touch_drop = true,
_vl_physics = {
friction = 0.15,
},
})
-- Frosted Ice (4 nodes)

View File

@ -164,6 +164,12 @@ minetest.register_node("mcl_core:deadbush", {
_mcl_hardness = 0,
})
minetest.register_craft({
type = "fuel",
recipe = "mcl_core:deadbush",
burntime = 5,
})
minetest.register_node("mcl_core:barrier", {
description = S("Barrier"),
_doc_items_longdesc = S("Barriers are invisible walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block."),

View File

@ -5,8 +5,8 @@ local modpath = minetest.get_modpath(modname)
-- by debiankaios
-- adapted for mcl2 by cora
local wood_slab_groups = {handy = 1, axey = 1, flammable = 3, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, wood_slab = 1}
local wood_stair_groups = {handy = 1, axey = 1, flammable = 3, material_wood = 1, fire_encouragement = 5, fire_flammability = 20, wood_stairs = 1}
local wood_slab_groups = {handy = 1, axey = 1, material_wood = 1, wood_slab = 1}
local wood_stair_groups = {handy = 1, axey = 1, material_wood = 1, wood_stairs = 1}
local function generate_warped_tree(pos)
minetest.place_schematic(pos,modpath.."/schematics/warped_fungus_1.mts","random",nil,false,"place_center_x,place_center_z")
@ -463,7 +463,7 @@ minetest.register_craft({
minetest.register_node("mcl_crimson:warped_hyphae_wood", {
description = S("Warped Hyphae Wood"),
tiles = {"mcl_crimson_warped_hyphae_wood.png"},
groups = {handy = 5,axey = 1, flammable = 3, wood=1,building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20},
groups = {handy = 5,axey = 1, wood=1,building_block = 1, material_wood = 1},
sounds = mcl_sounds.node_sound_wood_defaults(),
_mcl_hardness = 2,
})
@ -478,6 +478,27 @@ minetest.register_craft({
},
})
minetest.register_craft({
output = "mcl_crimson:warped_hyphae_wood 4",
recipe = {
{"mcl_crimson:warped_hyphae_bark"},
},
})
minetest.register_craft({
output = "mcl_crimson:warped_hyphae_wood 4",
recipe = {
{"mcl_crimson:stripped_warped_hyphae"},
},
})
minetest.register_craft({
output = "mcl_crimson:warped_hyphae_wood 4",
recipe = {
{"mcl_crimson:stripped_warped_hyphae_bark"},
},
})
minetest.register_craft({
output = "mcl_crimson:warped_nylium 2",
recipe = {
@ -670,6 +691,27 @@ minetest.register_craft({
},
})
minetest.register_craft({
output = "mcl_crimson:crimson_hyphae_wood 4",
recipe = {
{"mcl_crimson:crimson_hyphae_bark"},
},
})
minetest.register_craft({
output = "mcl_crimson:crimson_hyphae_wood 4",
recipe = {
{"mcl_crimson:stripped_crimson_hyphae"},
},
})
minetest.register_craft({
output = "mcl_crimson:crimson_hyphae_wood 4",
recipe = {
{"mcl_crimson:stripped_crimson_hyphae_bark"},
},
})
minetest.register_craft({
output = "mcl_crimson:crimson_nylium 2",
recipe = {
@ -715,7 +757,7 @@ mcl_doors:register_door("mcl_crimson:crimson_door", {
_doc_items_longdesc = S("Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal."),
_doc_items_usagehelp = S("To open or close a wooden door, rightclick it or supply its lower half with a redstone signal."),
inventory_image = "mcl_crimson_crimson_door.png",
groups = {handy=1,axey=1, material_wood=1, flammable=-1},
groups = {handy=1,axey=1, material_wood=1},
_mcl_hardness = 3,
_mcl_blast_resistance = 3,
tiles_bottom = "mcl_crimson_crimson_door_bottom.png",
@ -730,7 +772,7 @@ mcl_doors:register_trapdoor("mcl_crimson:crimson_trapdoor", {
tile_front = "mcl_crimson_crimson_trapdoor.png",
tile_side = "mcl_crimson_crimson_trapdoor_side.png",
wield_image = "mcl_crimson_crimson_trapdoor.png",
groups = {handy=1,axey=1, mesecon_effector_on=1, material_wood=1, flammable=-1},
groups = {handy=1,axey=1, mesecon_effector_on=1, material_wood=1},
_mcl_hardness = 3,
_mcl_blast_resistance = 3,
sounds = mcl_sounds.node_sound_wood_defaults(),
@ -741,7 +783,7 @@ mcl_fences.register_fence_and_fence_gate(
S("Crimson Fence"),
S("Crimson Fence Gate"),
"mcl_crimson_crimson_fence.png",
{handy=1,axey=1, flammable=2,fence_wood=1, fire_encouragement=5, fire_flammability=20},
{handy=1,axey=1,fence_wood=1},
minetest.registered_nodes["mcl_crimson:crimson_hyphae"]._mcl_hardness,
minetest.registered_nodes["mcl_crimson:crimson_hyphae"]._mcl_blast_resistance,
{"group:fence_wood"},
@ -753,7 +795,7 @@ mcl_doors:register_door("mcl_crimson:warped_door", {
_doc_items_longdesc = S("Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal."),
_doc_items_usagehelp = S("To open or close a wooden door, rightclick it or supply its lower half with a redstone signal."),
inventory_image = "mcl_crimson_warped_door.png",
groups = {handy=1,axey=1, material_wood=1, flammable=-1},
groups = {handy=1,axey=1, material_wood=1},
_mcl_hardness = 3,
_mcl_blast_resistance = 3,
tiles_bottom = "mcl_crimson_warped_door_bottom.png",
@ -768,7 +810,7 @@ mcl_doors:register_trapdoor("mcl_crimson:warped_trapdoor", {
tile_front = "mcl_crimson_warped_trapdoor.png",
tile_side = "mcl_crimson_warped_trapdoor_side.png",
wield_image = "mcl_crimson_warped_trapdoor.png",
groups = {handy=1,axey=1, mesecon_effector_on=1, material_wood=1, flammable=-1},
groups = {handy=1,axey=1, mesecon_effector_on=1, material_wood=1},
_mcl_hardness = 3,
_mcl_blast_resistance = 3,
sounds = mcl_sounds.node_sound_wood_defaults(),
@ -779,7 +821,7 @@ mcl_fences.register_fence_and_fence_gate(
S("Warped Fence"),
S("Warped Fence Gate"),
"mcl_crimson_warped_fence.png",
{handy=1,axey=1, flammable=2,fence_wood=1, fire_encouragement=5, fire_flammability=20},
{handy=1,axey=1,fence_wood=1},
minetest.registered_nodes["mcl_crimson:warped_hyphae"]._mcl_hardness,
minetest.registered_nodes["mcl_crimson:warped_hyphae"]._mcl_blast_resistance,
{"group:fence_wood"},

View File

@ -182,6 +182,10 @@ local function apply_bone_meal(pointed_thing, user)
local n = minetest.get_node(pos)
if n.name == "" then return false end
if mcl_util.check_area_protection(pos, pointed_thing.above, user) then
return false
end
for _, func in pairs(mcl_dye.bone_meal_callbacks) do
if func(pointed_thing, user) then
return true

View File

@ -74,6 +74,7 @@ local end_rod_def = {
light_source = minetest.LIGHT_MAX,
sunlight_propagates = true,
groups = { dig_immediate=3, deco_block=1, destroy_by_lava_flow=1, end_rod=1 },
use_texture_alpha = "clip",
selection_box = {
type = "fixed",
fixed = {
@ -153,6 +154,7 @@ for num, row in ipairs(colored_end_rods) do
def.description = desc
def._doc_items_longdesc = nil
def._doc_items_create_entry = false
def.use_texture_alpha = "clip"
local side_tex
if name == "pink" then
def.tiles[1] = def.tiles[1] .. "^(" .. def.tiles[1] .. end_rod_mask .. "^[multiply:" .. name .. "^[hsl:0:300)"

View File

@ -23,4 +23,10 @@ minetest.register_craft({
{ "group:wood", "group:wood", "" },
{ "group:wood", "group:wood", "" },
}
})
})
minetest.register_craft({
type = "fuel",
recipe = "mcl_fletching_table:fletching_table",
burntime = 15,
})

View File

@ -195,6 +195,7 @@ def_clover.tiles = { "mcl_flowers_clover.png" }
def_clover.inventory_image = "mcl_flowers_clover_inv.png"
def_clover.wield_image = "mcl_flowers_clover_inv.png"
def_clover.drop = nil
def_clover.use_texture_alpha = "clip"
def_clover.selection_box = {
type = "fixed",
fixed = { -4/16, -0.5, -4/16, 4/16, 0, 4/16 },
@ -210,6 +211,7 @@ def_4l_clover.mesh = "mcl_clover_4leaf.obj"
def_4l_clover.tiles = { "mcl_flowers_fourleaf_clover.png" }
def_4l_clover.inventory_image = "mcl_flowers_fourleaf_clover_inv.png"
def_4l_clover.wield_image = "mcl_flowers_fourleaf_clover_inv.png"
def_4l_clover.use_texture_alpha = "clip"
minetest.register_node("mcl_flowers:fourleaf_clover", def_4l_clover)
@ -268,6 +270,7 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im
end
-- Sunflower mesh and tiles
local top_drawtype, bottom_drawtype
local alpha = nil
local bottom_tiles = {}
if not mesh then
top_drawtype = "plantlike"
@ -277,6 +280,7 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im
top_drawtype = "airlike"
bottom_drawtype = "mesh"
bottom_tiles = bottom_img
alpha = "clip"
end
-- Bottom
minetest.register_node("mcl_flowers:"..name, {
@ -298,6 +302,7 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im
_mcl_shears_drop = shears_drop,
_mcl_fortune_drop = fortune_drop,
node_placement_prediction = "",
use_texture_alpha = alpha,
selection_box = {
type = "fixed",
fixed = { -selbox_radius, -0.5, -selbox_radius, selbox_radius, 0.5, selbox_radius },
@ -397,6 +402,7 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im
palette = palette,
walkable = false,
buildable_to = false,
use_texture_alpha = alpha,
selection_box = {
type = "fixed",
fixed = { -selbox_radius, -0.5, -selbox_radius, selbox_radius, selbox_top_height, selbox_radius },

View File

@ -466,9 +466,9 @@ function mcl_furnaces.hoppers_on_try_push(pos, hop_pos, hop_inv, hop_list)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if math.abs(pos.y - hop_pos.y) > math.abs(pos.x - hop_pos.x) and math.abs(pos.y - hop_pos.y) > math.abs(pos.z - hop_pos.z) then
return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src")
return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src", nil, 1)
else
return inv, "fuel", mcl_util.select_stack(hop_inv, hop_list, inv, "fuel", mcl_util.is_fuel)
return inv, "fuel", mcl_util.select_stack(hop_inv, hop_list, inv, "fuel", mcl_util.is_fuel, 1)
end
end

View File

@ -32,6 +32,68 @@ local mcl_hoppers_formspec = table.concat({
"listring[current_player;main]",
})
local function straight_hopper_act(pos, node, active_object_count, active_count_wider)
local timer = minetest.get_node_timer(pos)
if timer:is_started() then
--Pause if already recived item this tick
return
end
timer:start(1.0)
-- Move from internal inventory to dst first
local dst_pos = vector.offset(pos, 0, -1, 0)
local dst_node = minetest.get_node(dst_pos)
local dst_name = dst_node.name
local dst_def = minetest.registered_nodes[dst_name]
if dst_def and dst_def._mcl_hopper_act then
dst_def._mcl_hopper_act( dst_pos, dst_node, active_object_count, active_count_wider )
end
mcl_util.hopper_push(pos, dst_pos)
local src_pos = vector.offset(pos, 0, 1, 0)
mcl_util.hopper_pull(pos, src_pos)
end
local function bent_hopper_act(pos, node, active_object_count, active_object_count_wider)
local timer = minetest.get_node_timer(pos)
if timer:is_started() then
--Pause if already recived item this tick
return
end
timer:start(1.0)
-- Check if we are empty
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local empty = inv:is_empty("main")
-- Determine to which side the hopper is facing, get nodes
local face = minetest.get_node(pos).param2
local dst_pos = {}
if face == 0 then
dst_pos = vector.offset(pos, -1, 0, 0)
elseif face == 1 then
dst_pos = vector.offset(pos, 0, 0, 1)
elseif face == 2 then
dst_pos = vector.offset(pos, 1, 0, 0)
elseif face == 3 then
dst_pos = vector.offset(pos, 0, 0, -1)
end
local dst_node = minetest.get_node(dst_pos)
local dst_name = dst_node.name
local dst_def = minetest.registered_nodes[dst_name]
if dst_def and dst_def._mcl_hopper_act then
dst_def._mcl_hopper_act( dst_pos, dst_node, active_object_count, active_object_count_wider )
end
if not empty then
mcl_util.hopper_push(pos, dst_pos)
end
local src_pos = vector.offset(pos, 0, 1, 0)
mcl_util.hopper_pull(pos, src_pos)
end
-- Downwards hopper (base definition)
---@type node_definition
@ -206,6 +268,7 @@ def_hopper_enabled.mesecons = {
end,
},
}
def_hopper_enabled._mcl_hopper_act = straight_hopper_act
minetest.register_node("mcl_hoppers:hopper", def_hopper_enabled)
@ -355,6 +418,7 @@ def_hopper_side_enabled.mesecons = {
end,
},
}
def_hopper_side_enabled._mcl_hopper_act = bent_hopper_act
minetest.register_node("mcl_hoppers:hopper_side", def_hopper_side_enabled)
---@type node_definition
@ -559,24 +623,7 @@ minetest.register_abm({
neighbors = { "group:container" },
interval = 1.0,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
if minetest.get_node_timer(pos):is_started() then
return
end
-- Move from internal inventory to dst first
local dst_pos = vector.offset(pos, 0, -1, 0)
local pushed = mcl_util.hopper_push(pos, dst_pos)
local src_pos = vector.offset(pos, 0, 1, 0)
mcl_util.hopper_pull(pos, src_pos)
local dst_node = minetest.get_node(dst_pos)
if pushed and (dst_node.name == "mcl_hoppers:hopper" or dst_node.name == "mcl_hoppers:hopper_side") then
--Pause destination hopper
minetest.get_node_timer(dst_pos):start(1.0)
end
end,
action = straight_hopper_act,
})
-- Register push/pull for "bent" hopper
@ -586,35 +633,7 @@ minetest.register_abm({
neighbors = { "group:container" },
interval = 1.0,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
if minetest.get_node_timer(pos):is_started() then
--Pause if already recived item this tick
return
end
-- Determine to which side the hopper is facing, get nodes
local face = minetest.get_node(pos).param2
local dst_pos = {}
if face == 0 then
dst_pos = vector.offset(pos, -1, 0, 0)
elseif face == 1 then
dst_pos = vector.offset(pos, 0, 0, 1)
elseif face == 2 then
dst_pos = vector.offset(pos, 1, 0, 0)
elseif face == 3 then
dst_pos = vector.offset(pos, 0, 0, -1)
end
local pushed = mcl_util.hopper_push(pos, dst_pos)
local src_pos = vector.offset(pos, 0, 1, 0)
mcl_util.hopper_pull(pos, src_pos)
local dst_node = minetest.get_node(dst_pos)
if pushed and (dst_node.name == "mcl_hoppers:hopper" or dst_node.name == "mcl_hoppers:hopper_side") then
--Pause destination hopper
minetest.get_node_timer(dst_pos):start(1.0)
end
end,
action = bent_hopper_act,
})
minetest.register_craft({

View File

@ -638,7 +638,7 @@ function mcl_itemframes.create_base_definitions()
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
groups = { dig_immediate = 3, deco_block = 1, dig_by_piston = 1, container = 1, }, -- attached_node_facedir = 1 }, -- allows for more placement options.
groups = { dig_immediate = 3, deco_block = 1, dig_by_piston = 1, container = 1, attached_node_facedir = 1 },
sounds = mcl_sounds.node_sound_defaults(),
node_placement_prediction = "",

View File

@ -76,8 +76,7 @@ local lectern_def = {
if wdir == 0 then
return itemstack
-- IE., no Hanging Lecterns for you!
end
if wdir == 1 then
else
-- (only make standing nodes...)
-- Determine the rotation based on player's yaw
local yaw = pi * 2 - placer:get_look_horizontal()
@ -136,5 +135,11 @@ minetest.register_craft({
}
})
minetest.register_craft({
type = "fuel",
recipe = "mcl_lectern:lectern",
burntime = 15,
})
-- Base Aliases.
minetest.register_alias("lectern", "mcl_lectern:lectern")

View File

@ -26,3 +26,9 @@ minetest.register_craft({
{ "group:wood", "group:wood", "" },
}
})
minetest.register_craft({
type = "fuel",
recipe = "mcl_loom:loom",
burntime = 15,
})

View File

@ -399,12 +399,39 @@ minetest.register_craft({
}
})
minetest.register_craft({
output = "mcl_mangrove:mangrove_wood 4",
recipe = {
{"mcl_mangrove:mangrove_tree_bark"},
}
})
minetest.register_craft({
output = "mcl_mangrove:mangrove_wood 4",
recipe = {
{"mcl_mangrove:mangrove_stripped"},
}
})
minetest.register_craft({
output = "mcl_mangrove:mangrove_wood 4",
recipe = {
{"mcl_mangrove:mangrove_stripped_bark"},
}
})
minetest.register_craft({
type = "fuel",
recipe = "group:fence_wood",
burntime = 15,
})
minetest.register_craft({
type = "fuel",
recipe = "mcl_mangrove:mangrove_roots",
burntime = 15,
})
local adjacents = {
vector.new(1,0,0),
vector.new(-1,0,0),

View File

@ -4,10 +4,7 @@
--- DateTime: 10/14/22 4:05 PM
---
--local logging = minetest.settings:get_bool("mcl_logging_mcl_signs",true)
local DEBUG = minetest.settings:get_bool("mcl_logging_mcl_signs", false) -- special debug setting.
if DEBUG then
minetest.log("action", "[mcl_signs] Signs API Loading")
end
@ -115,9 +112,6 @@ mcl_signs.registered_signs = {}
mcl_signs.registered_signs.wall_signs = {}
mcl_signs.registered_signs.standing_signs = {}
mcl_signs.registered_signs.hanging_signs = {} -- unused. prepping for future use.
-- DEFINE SIGN BASE TYPES
mcl_signs.wall_standard = {} -- initialize
mcl_signs.standing_standard = {} -- initialize
function mcl_signs.build_signs_info()
local n = 23 / 56 - 1 / 128 -- some required magic number from the original code.
@ -141,37 +135,110 @@ function mcl_signs.build_signs_info()
end
-- wall signs' & hanging signs' base (definition)
mcl_signs.wall_standard = {
description = S("Sign"),
_tt_help = S("Can be written"),
_doc_items_longdesc = S("Signs can be written and come in two variants: Wall sign and sign on a sign post. Signs can be placed on the top and the sides of other blocks, but not below them."),
_doc_items_usagehelp = S("After placing the sign, you can write something on it. You have 4 lines of text with up to 15 characters for each line; anything beyond these limits is lost. Not all characters are supported. The text can not be changed once it has been written; you have to break and place the sign again. Can be colored and made to glow."),
inventory_image = "mcl_signs_default_sign.png",
walkable = false,
is_ground_content = false,
wield_image = "mcl_signs_default_sign.png",
node_placement_prediction = "",
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "wallmounted",
drawtype = "mesh",
mesh = "mcl_signs_signonwallmount.obj",
selection_box = { type = "wallmounted", wall_side = { -0.5, -7 / 28, -0.5, -23 / 56, 7 / 28, 0.5 } },
tiles = { "mcl_signs_sign.png" },
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false,
groups = mcl_signs.sign_groups,
-- DEFINE SIGN BASE TYPES
local common_definition = {
_mcl_hardness = 1,
_mcl_blast_resistance = 1,
stack_max = 16,
sounds = node_sounds,
groups = mcl_signs.sign_groups,
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false,
drawtype = "mesh",
paramtype = "light",
tiles = { "mcl_signs_sign.png" },
sunlight_propagates = true,
walkable = false,
is_ground_content = false,
on_timer = function(pos)
on_rightclick = function (pos, node, clicker, itemstack, pointed_thing)
if DEBUG then
minetest.log("verbose", "[mcl_signs] Sign Right Click event.")
end
-- make sure player is clicking
if not clicker or not clicker:is_player() then
return
end
local item = clicker:get_wielded_item()
local iname = item:get_name()
local protected = mcl_util.check_position_protection(pos, clicker)
if node and not protected then
if DEBUG then
minetest.log("verbose", "[mcl_signs] Sign Right Click event on valid node.")
end
-- handle glow from glow_ink_sac *first*
if (iname == "mcl_mobitems:glow_ink_sac") then
clicker:set_wielded_item(item)
local success = mcl_signs:glow_sign(pos)
if success then
if DEBUG then
minetest.log("verbose", "[mcl_signs] Sign Glow Success.")
end
itemstack:take_item()
end
return
end
-- check the wielded item to make sure that it is a dye.
local txt_color = mcl_signs:get_color_for_sign(iname)
if txt_color ~= "false" then
clicker:set_wielded_item(item)
local success = mcl_signs:color_sign(pos, txt_color)
-- "mcl_dye:black" is a special case: it makes the sign's lettering black AND removes glow.
if (iname == "mcl_dye:black") then
success = mcl_signs:glow_sign(pos, true)
if success and DEBUG then
minetest.log("verbose", "[mcl_signs] Sign Glow removal Success.")
end
end
if success then
if DEBUG then
minetest.log("verbose", "[mcl_signs] Sign Color Success.")
end
itemstack:take_item()
end
return
end
-- No modifier item in hand, open the sign for edition
local old_text = minetest.get_meta(pos):get_string("text")
mcl_signs:show_formspec(clicker, pos, old_text)
end
end,
on_destruct = function(pos)
mcl_signs:destruct_sign(pos)
end,
-- Not Useless Code. this force updates the sign.
on_punch = function(pos, node, puncher)
mcl_signs:update_sign(pos)
end,
}
-- wall signs' & hanging signs' base (definition)
mcl_signs.wall_standard = table.copy(common_definition)
mcl_signs.wall_standard.description = S("Sign")
mcl_signs.wall_standard._tt_help = S("Can be written")
mcl_signs.wall_standard._doc_items_longdesc = S("Signs can be written and come in two variants: Wall sign and sign on a sign post. Signs can be placed on the top and the sides of other blocks, but not below them.")
mcl_signs.wall_standard._doc_items_usagehelp = S("After placing the sign, you can write something on it. You have 4 lines of text with up to 15 characters for each line; anything beyond these limits is lost. Not all characters are supported. The text can not be changed once it has been written; you have to break and place the sign again. Can be colored and made to glow.")
mcl_signs.wall_standard.inventory_image = "mcl_signs_default_sign.png"
mcl_signs.wall_standard.wield_image = "mcl_signs_default_sign.png"
mcl_signs.wall_standard.node_placement_prediction = ""
mcl_signs.wall_standard.paramtype2 = "wallmounted"
mcl_signs.wall_standard.mesh = "mcl_signs_signonwallmount.obj"
mcl_signs.wall_standard.selection_box = { type = "wallmounted", wall_side = { -0.5, -7 / 28, -0.5, -23 / 56, 7 / 28, 0.5 } }
mcl_signs.wall_standard.on_timer = function(pos)
-- fix for /ClearObjects
mcl_signs:update_sign(pos)
-- note: update_sign decides to keep the timer running based on if there is text.
-- This prevents every sign from having a timer, when not needed.
end,
on_place = function(itemstack, placer, pointed_thing)
end
mcl_signs.wall_standard.on_place = function(itemstack, placer, pointed_thing)
local above = pointed_thing.above
local under = pointed_thing.under
@ -192,9 +259,6 @@ mcl_signs.wall_standard = {
end
local wdir = minetest.dir_to_wallmounted(dir)
--local placer_pos = placer:get_pos()
local fdir = minetest.dir_to_facedir(dir)
local sign_info
@ -272,18 +336,10 @@ mcl_signs.wall_standard = {
minetest.sound_play({ name = "default_place_node_hard", gain = 1.0 }, { pos = place_pos }, true)
mcl_signs:show_formspec(placer, place_pos)
mcl_signs:show_formspec(placer, place_pos, "")
return itemstack
end,
on_destruct = function(pos)
mcl_signs:destruct_sign(pos)
end,
-- Not Useless Code. force updates the sign.
on_punch = function(pos, node, puncher)
mcl_signs:update_sign(pos)
end,
on_rotate = function(pos, node, user, mode)
end
mcl_signs.wall_standard.on_rotate = function(pos, node, user, mode)
if mode == screwdriver.ROTATE_FACE then
local r = screwdriver.rotate.wallmounted(pos, node, mode)
node.param2 = r
@ -293,105 +349,21 @@ mcl_signs.wall_standard = {
else
return false
end
end,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
if DEBUG then
minetest.log("verbose", "[mcl_signs] Wall_Sign Right Click event.")
end
end
-- make sure player is clicking
if not clicker or not clicker:is_player() then
return
end
local item = clicker:get_wielded_item()
local iname = item:get_name()
local protected = mcl_util.check_position_protection(pos, clicker)
if node and not protected then
if DEBUG then
minetest.log("verbose", "[mcl_signs] Wall_Sign Right Click event on valid node.")
end
-- handle glow from glow_ink_sac *first*
if (iname == "mcl_mobitems:glow_ink_sac") then
clicker:set_wielded_item(item)
local success = mcl_signs:glow_sign(pos)
if success then
if DEBUG then
minetest.log("verbose", "[mcl_signs] Sign Glow Success.")
end
itemstack:take_item()
end
return
end
-- "mcl_dye:black" is a special case: it makes the sign's lettering black AND removes glow.
if (iname == "mcl_dye:black") then
clicker:set_wielded_item(item)
local success = mcl_signs:glow_sign(pos, true)
mcl_signs:color_sign(pos, mcl_colors.BLACK)
if success then
if DEBUG then
minetest.log("verbose", "[mcl_signs] Sign Glow removal Success.")
end
itemstack:take_item()
end
return
end
-- check the wielded item to make sure that it is a dye.
local txt_color = mcl_signs:get_color_for_sign(iname)
if txt_color ~= "false" then
clicker:set_wielded_item(item)
local success = mcl_signs:color_sign(pos, txt_color)
if success then
if DEBUG then
minetest.log("verbose", "[mcl_signs] Sign Color Success.")
end
itemstack:take_item()
end
end
end
end,
_mcl_hardness = 1,
_mcl_blast_resistance = 1,
}
-- standing sign base (definition)
mcl_signs.standing_standard = {
paramtype = "light",
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false,
sunlight_propagates = true,
walkable = false,
is_ground_content = false,
paramtype2 = "facedir",
drawtype = "mesh",
mesh = "mcl_signs_sign.obj",
selection_box = { type = "fixed", fixed = { -0.2, -0.5, -0.2, 0.2, 0.5, 0.2 } },
tiles = { "mcl_signs_sign.png" },
groups = mcl_signs.sign_groups,
drop = "mcl_signs:wall_sign",
stack_max = 16,
sounds = node_sounds,
on_destruct = function(pos)
mcl_signs:destruct_sign(pos)
end,
on_timer = function(pos)
mcl_signs.standing_standard = table.copy(common_definition)
mcl_signs.standing_standard.paramtype2 = "facedir"
mcl_signs.standing_standard.mesh = "mcl_signs_sign.obj"
mcl_signs.standing_standard.selection_box = { type = "fixed", fixed = { -0.2, -0.5, -0.2, 0.2, 0.5, 0.2 } }
mcl_signs.standing_standard.drop = "mcl_signs:wall_sign"
mcl_signs.standing_standard.on_timer = function(pos)
-- fix for /ClearObjects
mcl_signs:update_sign(pos)
minetest.get_node_timer(pos):start(40.0)
end,
-- Not Useless Code. this force updates the sign.
on_punch = function(pos, node, puncher)
mcl_signs:update_sign(pos)
end,
on_rotate = function(pos, node, user, mode)
end
mcl_signs.standing_standard.on_rotate = function(pos, node, user, mode)
if mode == screwdriver.ROTATE_FACE then
node.name = "mcl_signs:standing_sign22_5"
minetest.swap_node(pos, node)
@ -400,60 +372,7 @@ mcl_signs.standing_standard = {
end
mcl_signs:update_sign(pos, nil, nil, true)
return true
end,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
if DEBUG then
minetest.log("verbose", "[mcl_signs] Standing_Sign Right Click event.")
end
-- make sure player is clicking
if not clicker or not clicker:is_player() then
return
end
local item = clicker:get_wielded_item()
local iname = item:get_name()
local protected = mcl_util.check_position_protection(pos, clicker)
if node and not protected then
-- handle glow from glow_ink_sac *first*
if DEBUG then
minetest.log("verbose", "[mcl_signs] Standing_Sign Right Click event on valid node.")
end
if (iname == "mcl_mobitems:glow_ink_sac") then
clicker:set_wielded_item(item)
local success = mcl_signs:glow_sign(pos)
if success then
if DEBUG then
minetest.log("verbose", "[mcl_signs] Sign Glow Success.")
end
itemstack:take_item()
end
return
end
-- check the wielded item to make sure that it is a dye.
local txt_color = mcl_signs:get_color_for_sign(iname)
if txt_color ~= "false" then
clicker:set_wielded_item(item)
local success = mcl_signs:color_sign(pos, txt_color)
if success then
if DEBUG then
minetest.log("verbose", "[mcl_signs] Sign Color Success.")
end
itemstack:take_item()
end
end
end
end,
_mcl_hardness = 1,
_mcl_blast_resistance = 1,
}
end
-- HELPER FUNCTIONS' VARIABLES
local sign_glow = 6
@ -663,7 +582,7 @@ function mcl_signs.register_sign (modname, color, _name, ttsign)
minetest.sound_play({ name = "default_place_node_hard", gain = 1.0 }, { pos = place_pos }, true)
mcl_signs:show_formspec(placer, place_pos)
mcl_signs:show_formspec(placer, place_pos, "")
return itemstack
end
@ -916,7 +835,7 @@ function mcl_signs.register_sign_custom (modname, _name, tiles, color, inventory
minetest.sound_play({ name = "default_place_node_hard", gain = 1.0 }, { pos = place_pos }, true)
mcl_signs:show_formspec(placer, place_pos)
mcl_signs:show_formspec(placer, place_pos, "")
return itemstack
end
minetest.register_node(":mcl_signs:wall_sign" .. _name, new_sign)
@ -1152,7 +1071,7 @@ function mcl_signs.reregister_sign (modname, color, _name, ttsign)
minetest.sound_play({ name = "default_place_node_hard", gain = 1.0 }, { pos = place_pos }, true)
mcl_signs:show_formspec(placer, place_pos)
mcl_signs:show_formspec(placer, place_pos, "")
return itemstack
end
@ -1401,7 +1320,7 @@ function mcl_signs.reregister_sign_custom (modname, _name, tiles, color, invento
minetest.sound_play({ name = "default_place_node_hard", gain = 1.0 }, { pos = place_pos }, true)
mcl_signs:show_formspec(placer, place_pos)
mcl_signs:show_formspec(placer, place_pos, "")
return itemstack
end
minetest.override_item("mcl_signs:wall_sign" .. _name, new_sign)
@ -1883,7 +1802,7 @@ function mcl_signs:update_sign(pos, fields, sender, force_remove, text_color)
return false
end
local text = meta:get_string("text", "")
if fields and (text == "" and fields.text) then
if fields and fields.text then
meta:set_string("text", fields.text)
text = fields.text
end
@ -2040,11 +1959,13 @@ function mcl_signs:update_sign(pos, fields, sender, force_remove, text_color)
end
function mcl_signs:show_formspec(player, pos)
function mcl_signs:show_formspec(player, pos, old_text)
minetest.show_formspec(
player:get_player_name(),
"mcl_signs:set_text_" .. pos.x .. "_" .. pos.y .. "_" .. pos.z,
"size[6,3]textarea[0.25,0.25;6,1.5;text;" .. F(S("Enter sign text:")) .. ";]label[0,1.5;" .. F(S("Maximum line length: 15")) .. "\n" .. F(S("Maximum lines: 4")) .. "]button_exit[0,2.5;6,1;submit;" .. F(S("Done")) .. "]"
"size[6,3]textarea[0.25,0.25;6,1.5;text;" .. F(S("Enter sign text:")) .. ";".. F(old_text) .. "]" ..
"label[0,1.5;" .. F(S("Maximum line length: 15")) ..
"\n" .. F(S("Maximum lines: 4")) .. "]button_exit[0,2.5;6,1;submit;" .. F(S("Done")) .. "]"
)
end

View File

@ -257,6 +257,12 @@ minetest.register_craft({
},
})
minetest.register_craft({
type = "fuel",
recipe = "mcl_smithing_table:table",
burntime = 15,
})
-- this is the exact same as mcl_smithing_table.upgrade_item_netherite , in case something relies on the old function
function mcl_smithing_table.upgrade_item(itemstack)
return mcl_smithing_table.upgrade_item_netherite(itemstack)

View File

@ -0,0 +1,28 @@
# ```vl_hollow_logs```
This mod registers hollow logs derived from normal logs.
Hollow logs mostly have a decorative function, but some of them can be used in recipes. Changes may appear soon.
## Functions:
### ```vl_hollow_logs.register_hollow_log(defs)```
This is the function that registers the hollow trunk.
For a hollow log to be registered, the <span style="color:firebrick"> defs </span> parameter must be a table that contains up to 5 values, which are, in this order, the <span style="color:firebrick"> itemstring </span> of the hollow log, the <span style="color:firebrick"> itemstring </span> of the stripped hollow log, the <span style="color:firebrick"> description </span> of the hollow log, the <span style="color:firebrick"> description </span> of the stripped hollow log and, optionally, a <span style="color:turquoise"> boolean </span> to inform whether this trunk is NOT flammable. If the hollow log is defined as flammable, it becomes part of the <span style="color:springgreen"> hollow_log_flammable </span> group, which allows the log to be used as fuel for furnaces and also allows it to be an ingredient for chacoal.
Examples:
```lua
-- Flammable
{"tree", "stripped_oak", "Hollow Oak Log", "Stripped Hollow Oak Log"}
-- Not flammable
{"crimson_hyphae", "stripped_crimson_hyphae", "Hollow Crimson Stem", "Stripped Hollow Crimson Stem", true}
```
### ```vl_hollow_logs.register_craft(material, result)```
This function records the crafting recipe for a hollow log based on its non-hollow variant.
This function also defines a recipe for the stonecutter. The <span style="color:firebrick"> material </span> and <span style="color:firebrick"> result </span> parameters must be, respectively, the <span style="color:firebrick"> complete itemstring </span> of the source material and the (partial) <span style="color:firebrick"> itemstring </span> of the result. See the following examples:
```lua
vl_hollow_logs.register_craft("mcl_core:tree", "tree")
vl_hollow_logs.register_craft("mcl_crimson:stripped_crimson_hyphae", "stripped_crimson_hyphae")
```

View File

@ -0,0 +1,112 @@
local modpath = minetest.get_modpath(minetest.get_current_modname())
local S = minetest.get_translator(minetest.get_current_modname())
vl_hollow_logs = {}
--- Function to register a hollow log. See API.md to learn how to use this function.
---@param defs table {name:string, stripped_name>string, desc:string, stripped_desc:string, not_flammable:boolean|nil}
function vl_hollow_logs.register_hollow_log(defs)
if not defs or #defs < 4 then
error("Incomplete definition provided")
end
for i = 1, 4 do
if type(defs[i]) ~= "string" then
error("defs["..i.."] must be a string")
end
end
if defs[5] and type(defs[5]) ~= "boolean" then
error("defs[5] must be a boolean if present")
end
local modname = minetest.get_current_modname()
if #defs > 5 then
minetest.log("warning", "[vl_hollow_logs] unused vars passed, dumping the table")
minetest.log("warning", "from mod " .. modname .. ": " .. dump(defs))
end
local name = defs[1]
local stripped_name = defs[2]
local desc = defs[3]
local stripped_desc = defs[4]
local collisionbox = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, -0.375},
{-0.5, -0.5, -0.5, -0.375, 0.5, 0.5},
{0.375, -0.5, -0.5, 0.5, 0.5, 0.5},
{-0.5, -0.5, 0.375, 0.5, 0.5, 0.5},
}
}
local groups = {axey = 1, building_block = 1, handy = 1, hollow_log = 1}
if not defs[5] then
groups = table.insert(groups, {fire_encouragement = 5, fire_flammability = 5, flammable = 2, hollow_log_burnable = 1})
end
minetest.register_node(modname .. ":"..name.."_hollow", {
collision_box = collisionbox,
description = S(desc),
drawtype = "mesh",
groups = groups,
mesh = "vl_hollow_logs_log.obj",
on_place = mcl_util.rotate_axis,
paramtype = "light",
paramtype2 = "facedir",
use_texture_alpha = "clip",
sounds = mcl_sounds.node_sound_wood_defaults(),
sunlight_propagates = true,
tiles = {modname .. "_"..name..".png"},
_mcl_blast_resistance = 2,
_mcl_hardness = 2,
_mcl_stripped_variant = modname .. ":stripped_"..name.."_hollow"
})
minetest.register_node(modname .. ":"..stripped_name.."_hollow", {
collision_box = collisionbox,
description = S(stripped_desc),
drawtype = "mesh",
groups = groups,
mesh = "vl_hollow_logs_log.obj",
on_place = mcl_util.rotate_axis,
paramtype = "light",
paramtype2 = "facedir",
use_texture_alpha = "clip",
sounds = mcl_sounds.node_sound_wood_defaults(),
sunlight_propagates = true,
tiles = {modname .. "_stripped_"..name..".png"},
_mcl_blast_resistance = 2,
_mcl_hardness = 2
})
end
vl_hollow_logs.logs = {
{"acaciatree", "stripped_acacia", "Hollow Acacia Log", "Stripped Hollow Acacia Log"},
{"birchtree", "stripped_birch", "Hollow Birch Log", "Stripped Hollow Birch Log"},
{"darktree", "stripped_dark_oak", "Hollow Dark Oak Log", "Stripped Hollow Dark Oak Log"},
{"jungletree", "stripped_jungle", "Hollow Jungle Log", "Stripped Hollow Jungle Log"},
{"sprucetree", "stripped_spruce", "Hollow Spruce Log", "Stripped Hollow Spruce Log"},
{"tree", "stripped_oak", "Hollow Oak Log", "Stripped Hollow Oak Log"}
}
if minetest.get_modpath("mcl_cherry_blossom") then
table.insert(vl_hollow_logs.logs, {"cherrytree", "stripped_cherrytree", "Hollow Cherry Log", "Stripped Hollow Cherry Log"})
end
if minetest.get_modpath("mcl_mangrove") then
table.insert(vl_hollow_logs.logs, {"mangrove_tree", "mangrove_stripped", "Hollow Mangrove Log", "Stripped Hollow Mangrove Log"})
end
if minetest.get_modpath("mcl_crimson") then
table.insert(vl_hollow_logs.logs, {"crimson_hyphae", "stripped_crimson_hyphae", "Hollow Crimson Stem", "Stripped Hollow Crimson Stem", true})
table.insert(vl_hollow_logs.logs, {"warped_hyphae", "stripped_warped_hyphae", "Hollow Warped Stem", "Stripped Hollow Warped Stem", true})
end
for _, defs in pairs(vl_hollow_logs.logs) do
vl_hollow_logs.register_hollow_log(defs)
end
dofile(modpath.."/recipes.lua")

View File

@ -0,0 +1,21 @@
# textdomain: mcl_hollow_logs
Hollow Acacia Log=
Hollow Birch Log=
Hollow Cherry Log=
Hollow Dark Oak Log=
Hollow Jungle Log=
Hollow Mangrove Log=
Hollow Oak Log=
Hollow Spruce Log=
Hollow Crimson Stem=
Hollow Warped Stem=
Stripped Hollow Acacia Log=
Stripped Hollow Birch Log=
Stripped Hollow Cherry Log=
Stripped Hollow Dark Oak Log=
Stripped Hollow Jungle Log=
Stripped Hollow Mangrove Log=
Stripped Hollow Oak Log=
Stripped Hollow Spruce Log=
Stripped Hollow Crimson Stem=
Stripped Hollow Warped Stem=

View File

@ -0,0 +1,21 @@
# textdomain: mcl_hollow_logs
Hollow Acacia Log=Tronco Oco de Acácia
Hollow Birch Log=Tronco Oco de Bétula
Hollow Cherry Log=Tronco Oco de Cerejeira
Hollow Dark Oak Log=Tronco Oco de Carvalho Escuro
Hollow Jungle Log=Tronco Oco da Selva
Hollow Mangrove Log=Tronco Oco de Mangue
Hollow Oak Log=Tronco Oco de Carvalho
Hollow Spruce Log=Tronco Oco de Pinheiro
Hollow Crimson Stem=Caule Oco Carmesim
Hollow Warped Stem=Caule Oco Distorcido
Stripped Hollow Acacia Log=Tronco Oco Descascado de Acácia
Stripped Hollow Birch Log=Tronco Oco Descascado de Bétula
Stripped Hollow Cherry Log=Tronco Oco Descascado de Cerejeira
Stripped Hollow Dark Oak Log=Tronco Oco Descascado de Carvalho Escuro
Stripped Hollow Jungle Log=Tronco Oco Descascado da Selva
Stripped Hollow Mangrove Log=Tronco Oco Descascado de Mangue
Stripped Hollow Oak Log=Tronco Oco Descascado de Carvalho
Stripped Hollow Spruce Log=Tronco Oco Descascado de Pinheiro
Stripped Hollow Crimson Stem=Caule Oco Descascado Carmesim
Stripped Hollow Warped Stem=Caule Oco Descascado Distorcido

View File

@ -0,0 +1,4 @@
name = vl_hollow_logs
depends = mcl_core, mcl_sounds, mcl_util
optional_depends = mcl_cherry_blossom, mcl_crimson, mcl_mangrove
author = JoseDouglas26

View File

@ -0,0 +1,54 @@
# Blender 3.6.7
# www.blender.org
o hollow_log
v -0.312500 -0.500000 0.312500
v -0.312500 0.500000 0.312500
v -0.312500 -0.500000 -0.312500
v -0.312500 0.500000 -0.312500
v 0.312500 -0.500000 0.312500
v 0.312500 0.500000 0.312500
v 0.312500 -0.500000 -0.312500
v 0.312500 0.500000 -0.312500
v -0.500000 -0.500000 -0.500000
v -0.500000 -0.500000 0.500000
v -0.500000 0.500000 0.500000
v -0.500000 0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
v 0.500000 0.500000 -0.500000
v 0.500000 -0.500000 0.500000
v 0.500000 0.500000 0.500000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vn -0.0000 -1.0000 -0.0000
vn -0.0000 1.0000 -0.0000
vt 0.380952 0.000000
vt 0.380952 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 0.619048 0.000000
vt 0.619048 1.000000
vt 0.928571 0.187500
vt 0.928571 0.812500
vt 1.000000 1.000000
vt 1.000000 -0.000000
vt 0.690476 0.187500
vt 0.690476 0.812500
s 0
f 10/1/1 11/2/1 12/3/1 9/4/1
f 9/1/2 12/2/2 14/3/2 13/4/2
f 13/1/3 14/2/3 16/3/3 15/4/3
f 15/1/4 16/2/4 11/3/4 10/4/4
f 7/5/4 8/6/4 4/2/4 3/1/4
f 5/5/1 6/6/1 8/2/1 7/1/1
f 3/7/5 1/8/5 10/9/5 9/10/5
f 2/8/6 4/7/6 12/10/6 11/9/6
f 7/11/5 3/7/5 9/10/5 13/5/5
f 4/7/6 8/11/6 14/5/6 12/10/6
f 5/12/5 7/11/5 13/5/5 15/6/5
f 8/11/6 6/12/6 16/6/6 14/5/6
f 1/8/5 5/12/5 15/6/5 10/9/5
f 6/12/6 2/8/6 11/9/6 16/6/6
f 3/5/3 4/6/3 2/2/3 1/1/3
f 1/5/2 2/6/2 6/2/2 5/1/2

View File

@ -0,0 +1,48 @@
function vl_hollow_logs.register_craft(material, result)
minetest.register_craft({
output = "vl_hollow_logs:"..result.."_hollow 4",
recipe = {
{"", material, ""},
{material, "", material},
{"", material, ""}
},
type = "shaped"
})
mcl_stonecutter.register_recipe(material, "vl_hollow_logs:"..result.."_hollow", 1)
end
for _, defs in pairs(vl_hollow_logs.logs) do
local mod, material, stripped_material
local name = defs[1]
local stripped_name = defs[2]
if name:find("cherry") then
mod = "mcl_cherry_blossom:"
elseif name:find("mangrove") then
mod = "mcl_mangrove:"
elseif name:find("hyphae") then
mod = "mcl_crimson:"
else
mod = "mcl_core:"
end
material = mod..name
stripped_material = mod..stripped_name
vl_hollow_logs.register_craft(material, name)
vl_hollow_logs.register_craft(stripped_material, stripped_name)
end
minetest.register_craft({
burntime = 10,
recipe = "group:hollow_log_burnable",
type = "fuel",
})
minetest.register_craft({
cooktime = 5,
output = "mcl_core:charcoal_lump",
recipe = "group:hollow_log_burnable",
type = "cooking"
})

View File

@ -406,13 +406,16 @@ local function dungeons_nodes(minp, maxp, blockseed)
local pr = PseudoRandom(blockseed)
for a=1, attempts do
local dim = dungeonsizes[pr:next(1, #dungeonsizes)]
local x = pr:next(minp.x, maxp.x-dim.x-1)
local y = pr:next(ymin , ymax -dim.y-1)
local z = pr:next(minp.z, maxp.z-dim.z-1)
local p1 = {x=x,y=y,z=z}
local p2 = {x = x+dim.x+1, y = y+dim.y+1, z = z+dim.z+1}
minetest.log("verbose","[mcl_dungeons] size=" ..minetest.pos_to_string(dim) .. ", emerge from "..minetest.pos_to_string(p1) .. " to " .. minetest.pos_to_string(p2))
emerge_area(p1, p2, ecb_spawn_dungeon, {p1=p1, p2=p2, dim=dim, pr=pr})
if ymin <= ymax - dim.y - 1 then
local x = pr:next(minp.x, maxp.x-dim.x-1)
local y = pr:next(ymin , ymax -dim.y-1)
local z = pr:next(minp.z, maxp.z-dim.z-1)
local p1 = {x=x,y=y,z=z}
local p2 = {x = x+dim.x+1, y = y+dim.y+1, z = z+dim.z+1}
minetest.log("verbose","[mcl_dungeons] size=" ..minetest.pos_to_string(dim) .. ", emerge from "..minetest.pos_to_string(p1) .. " to " .. minetest.pos_to_string(p2))
emerge_area(p1, p2, ecb_spawn_dungeon, {p1=p1, p2=p2, dim=dim, pr=pr})
end
end
end

View File

@ -57,6 +57,7 @@ end
-- Variables for each player, to handle delayed eating
mcl_hunger.eat_internal = {}
mcl_hunger.eat_anim_hud = {}
-- Set per player internal variables for delayed eating
minetest.register_on_joinplayer(function(player)
@ -81,6 +82,7 @@ minetest.register_on_joinplayer(function(player)
_custom_do_delayed = false, -- If true, then will execute only _custom_wrapper after holding RMB or LMB within a delay specified by mcl_hunger.EATING_DELAY (Use to bypass minetest.do_item_eat entirely)
}
playerphysics.remove_physics_factor(player, "speed", "mcl_hunger:eating_speed")
player:hud_set_flags({wielditem = true})
end)
-- Clear when player leaves
@ -88,6 +90,7 @@ minetest.register_on_leaveplayer(function(player)
local name = player:get_player_name()
mcl_hunger.eat_internal[name] = nil
mcl_hunger.eat_anim_hud[name] = nil
end)
dofile(modpath.."/api.lua")
@ -120,11 +123,21 @@ mcl_hunger.poison_hunger = {} -- food poisoning, increasing hunger
-- HUD
local function init_hud(player)
local name = player:get_player_name()
hb.init_hudbar(player, "hunger", mcl_hunger.get_hunger(player))
if mcl_hunger.debug then
hb.init_hudbar(player, "saturation", mcl_hunger.get_saturation(player), mcl_hunger.get_hunger(player))
hb.init_hudbar(player, "exhaustion", mcl_hunger.get_exhaustion(player))
end
mcl_hunger.eat_anim_hud[name] = player:hud_add({
hud_elem_type = "image",
text = "blank.png",
position = {x = 0.5, y = 1},
scale = {x = -25, y = -45},
alignment = {x = 0, y = -1},
offset = {x = 0, y = -30},
z_index = -200,
})
end
-- HUD updating functions for Debug Mode. No-op if not in Debug Mode
@ -195,6 +208,8 @@ local eat_effects_cooldown = {}
local function clear_eat_internal_and_timers(player, player_name)
playerphysics.remove_physics_factor(player, "speed", "mcl_hunger:eating_speed")
player:hud_set_flags({wielditem = true})
player:hud_change(mcl_hunger.eat_anim_hud[player_name], "text", "blank.png")
mcl_hunger.eat_internal[player_name] = {
is_eating = false,
is_eating_no_padding = false,
@ -299,13 +314,20 @@ minetest.register_globalstep(function(dtime)
playerphysics.add_physics_factor(player, "speed", "mcl_hunger:eating_speed", mcl_hunger.EATING_WALK_SPEED)
player:hud_set_flags({wielditem = false})
local itemstackdef = current_itemstack:get_definition()
local wield_image = itemstackdef.wield_image
if not wield_image or wield_image == "" then wield_image = itemstackdef.inventory_image end
player:hud_change(mcl_hunger.eat_anim_hud[player_name], "text", wield_image)
player:hud_change(mcl_hunger.eat_anim_hud[player_name], "offset", {x = 0, y = 50*math.sin(10*eat_tick_timers[player]+math.random())-50})
if eat_effects_cooldown[player] > 0.2 then
eat_effects_cooldown[player] = 0
if not mcl_hunger.eat_internal[player_name].user then
mcl_hunger.eat_internal[player_name].user = player
end
if not mcl_hunger.eat_internal[player_name].itemname then
mcl_hunger.eat_internal[player_name].itemname = current_itemstack:get_name()
end
@ -357,6 +379,8 @@ minetest.register_globalstep(function(dtime)
elseif eat_start_timers[player] and eat_start_timers[player] > 0.2 then
playerphysics.remove_physics_factor(player, "speed", "mcl_hunger:eating_speed")
player:hud_set_flags({wielditem = true})
player:hud_change(mcl_hunger.eat_anim_hud[player_name], "text", "blank.png")
mcl_hunger.eat_internal[player_name].is_eating_no_padding = false
elseif eat_start_timers[player] and eat_start_timers[player] > mcl_hunger.EATING_TOUCHSCREEN_DELAY_PADDING then

View File

@ -38,9 +38,19 @@ local player_sneak = {}
local player_visible = {}
mcl_player.player_attached = {}
local function get_player_textures(name)
local textures = player_textures[name]
if textures then return textures end
local textures = { "character.png", "blank.png", "blank.png" }
player_textures[name] = textures
return textures
end
function mcl_player.player_get_animation(player)
local name = player:get_player_name()
local textures = player_textures[name]
local textures = get_player_textures(name)
if not player_visible[name] then
textures = table.copy(textures)
@ -63,7 +73,7 @@ end
local function update_player_textures(player)
local name = player:get_player_name()
local textures = player_textures[name]
local textures = get_player_textures(name)
if not player_visible[name] then
textures = table.copy(textures)
@ -125,18 +135,21 @@ end
function mcl_player.player_set_skin(player, texture)
local name = player:get_player_name()
player_textures[name][1] = texture
local textures = get_player_textures(name)
textures[1] = texture
update_player_textures(player)
end
function mcl_player.player_get_skin(player)
local name = player:get_player_name()
return player_textures[name][1]
local textures = get_player_textures(name)
return textures[1]
end
function mcl_player.player_set_armor(player, texture)
local name = player:get_player_name()
player_textures[name][2] = texture
local textures = get_player_textures(name)
textures[2] = texture
update_player_textures(player)
end
@ -151,7 +164,7 @@ function mcl_player.get_player_formspec_model(player, x, y, w, h, fsname)
local name = player:get_player_name()
local model = player_model[name]
local anim = models[model].animations[player_anim[name]]
local textures = player_textures[name]
local textures = get_player_textures(name)
if not player_visible[name] then
textures = table.copy(textures)
textures[1] = "blank.png"
@ -179,7 +192,7 @@ minetest.register_on_joinplayer(function(player)
local name = player:get_player_name()
mcl_player.player_attached[name] = false
player_visible[name] = true
player_textures[name] = { "character.png", "blank.png", "blank.png" }
get_player_textures(name)
--player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30)
-- player:set_fov(86.1) -- see <https://minecraft.gamepedia.com/Options#Video_settings>>>>

View File

@ -59,6 +59,50 @@ mcl_skins = {
player_formspecs = {},
}
local player_skins = mcl_skins.player_skins
local function get_player_skins(player)
local player_skins = player_skins[player]
if player_skins then return player_skins end
local skin = player:get_meta():get_string("mcl_skins:skin")
if skin then
skin = minetest.deserialize(skin)
end
if skin then
if not mcl_skins.texture_to_simple_skin[skin.simple_skins_id] then
skin.simple_skins_id = nil
end
mcl_skins.player_skins[player] = skin
else
if math.random() > 0.5 then
skin = table.copy(mcl_skins.template1)
else
skin = table.copy(mcl_skins.template2)
end
mcl_skins.player_skins[player] = skin
end
mcl_skins.player_formspecs[player] = {
active_tab = "skin",
page_num = 1
}
if #mcl_skins.simple_skins > 0 then
local skin_id = tonumber(player:get_meta():get_string("mcl_skins:skin_id"))
if skin_id and mcl_skins.simple_skins[skin_id] then
local texture = mcl_skins.simple_skins[skin_id].texture
local player_skins = get_player_skins(player)
player_skins.simple_skins_id = texture
end
end
mcl_skins.save(player)
mcl_skins.update_player_skin(player)
return mcl_skins.player_skins[player]
end
function mcl_skins.register_item(item)
assert(mcl_skins[item.type], "Skin item type " .. item.type .. " does not exist.")
@ -160,7 +204,7 @@ function mcl_skins.update_player_skin(player)
return
end
local skin = mcl_skins.player_skins[player]
local skin = get_player_skins(player)
local skinval = mcl_skins.compile_skin(skin)
if not skin.cape then skin.cape = "blank.png" end
@ -186,39 +230,7 @@ end
-- Load player skin on join
minetest.register_on_joinplayer(function(player)
local skin = player:get_meta():get_string("mcl_skins:skin")
if skin then
skin = minetest.deserialize(skin)
end
if skin then
if not mcl_skins.texture_to_simple_skin[skin.simple_skins_id] then
skin.simple_skins_id = nil
end
mcl_skins.player_skins[player] = skin
else
if math.random() > 0.5 then
skin = table.copy(mcl_skins.template1)
else
skin = table.copy(mcl_skins.template2)
end
mcl_skins.player_skins[player] = skin
end
mcl_skins.player_formspecs[player] = {
active_tab = "skin",
page_num = 1
}
if #mcl_skins.simple_skins > 0 then
local skin_id = tonumber(player:get_meta():get_string("mcl_skins:skin_id"))
if skin_id and mcl_skins.simple_skins[skin_id] then
local texture = mcl_skins.simple_skins[skin_id].texture
mcl_skins.player_skins[player].simple_skins_id = texture
end
end
mcl_skins.save(player)
mcl_skins.update_player_skin(player)
get_player_skins(player)
end)
minetest.register_on_leaveplayer(function(player)
@ -245,7 +257,7 @@ end
function mcl_skins.show_formspec(player, active_tab, page_num)
local formspec_data = mcl_skins.player_formspecs[player]
local skin = mcl_skins.player_skins[player]
local skin = get_player_skins(player)
formspec_data.active_tab = active_tab
local page_count = calculate_page_count(active_tab, player)
@ -555,7 +567,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
mcl_skins.show_formspec(player, active_tab, page_num)
return true
elseif fields.nocape then
mcl_skins.player_skins[player].cape = "blank.png"
local player_skins = get_player_skins(player)
player_skins.cape = "blank.png"
mcl_skins.update_player_skin(player)
mcl_armor.update(player) --update elytra cape
mcl_skins.show_formspec(player, active_tab, page_num)
@ -564,7 +577,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
for cape_index = ((page_num - 1) * 5) + 1, math.min(#mcl_skins.cape, page_num * 5) do
local cape = mcl_skins.cape[cape_index]
if fields[cape.name] then
mcl_skins.player_skins[player].cape = cape.mask -- the actual overlay image
local player_skins = get_player_skins(player)
player_skins.cape = cape.mask -- the actual overlay image
mcl_skins.update_player_skin(player)
mcl_armor.update(player) --update elytra cape
mcl_skins.show_formspec(player, active_tab, page_num)
@ -580,7 +594,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end
end
local skin = mcl_skins.player_skins[player]
local skin = get_player_skins(player)
if not skin then return true end
if fields.next_page then

Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 B

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 830 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 723 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 745 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 848 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 543 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 874 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 910 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 979 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 797 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 916 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1018 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 983 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 997 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 790 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 635 B

View File

@ -338,17 +338,17 @@ Source path,Source file,Target file,xs,ys,xl,yl,xt,yt,Blacklisted?
/assets/minecraft/textures/block,mycelium_top.png,mcl_core_mycelium_top.png,,,,,,,
/assets/minecraft/textures/block,red_sand.png,mcl_core_red_sand.png,,,,,,,
/assets/minecraft/textures/block,red_sandstone_bottom.png,mcl_core_red_sandstone_bottom.png,,,,,,,
/assets/minecraft/textures/block,cut_red_sandstone.png,mcl_core_red_sandstone_carved.png,,,,,,,
/assets/minecraft/textures/block,cut_red_sandstone.png,mcl_core_red_sandstone_smooth.png,,,,,,,
/assets/minecraft/textures/block,red_sandstone.png,mcl_core_red_sandstone_normal.png,,,,,,,
/assets/minecraft/textures/block,chiseled_red_sandstone.png,mcl_core_red_sandstone_smooth.png,,,,,,,
/assets/minecraft/textures/block,chiseled_red_sandstone.png,mcl_core_red_sandstone_carved.png,,,,,,,
/assets/minecraft/textures/block,red_sandstone_top.png,mcl_core_red_sandstone_top.png,,,,,,,
/assets/minecraft/textures/block,redstone_ore.png,mcl_core_redstone_ore.png,,,,,,,
/assets/minecraft/textures/item,sugar_cane.png,mcl_core_reeds.png,,,,,,,
/assets/minecraft/textures/block,sandstone_bottom.png,mcl_core_sandstone_bottom.png,,,,,,,
/assets/minecraft/textures/block,cut_sandstone.png,mcl_core_sandstone_carved.png,,,,,,,
/assets/minecraft/textures/block,chiseled_sandstone.png,mcl_core_sandstone_normal.png,,,,,,,
/assets/minecraft/textures/block,cut_sandstone.png,mcl_core_sandstone_smooth.png,,,,,,,
/assets/minecraft/textures/block,sandstone.png,mcl_core_sandstone_top.png,,,,,,,
/assets/minecraft/textures/block,chiseled_sandstone.png,mcl_core_sandstone_carved.png,,,,,,,
/assets/minecraft/textures/block,sandstone.png,mcl_core_sandstone_normal.png,,,,,,,
/assets/minecraft/textures/block,sandstone_top.png,mcl_core_sandstone_top.png,,,,,,,
/assets/minecraft/textures/block,slime_block.png,mcl_core_slime.png,,,,,,,
/assets/minecraft/textures/block,smooth_stone.png,mcl_core_stonebrick_carved.png,,,,,,,
/assets/minecraft/textures/block,cracked_stone_bricks.png,mcl_core_stonebrick_cracked.png,,,,,,,
@ -1151,15 +1151,28 @@ Source path,Source file,Target file,xs,ys,xl,yl,xt,yt,Blacklisted?
/assets/minecraft/textures/block,redstone_dust_line1.png,redstone_redstone_dust_line1.png,,,,,,,
/assets/minecraft/textures/block,attached_melon_stem.png,mcl_farming_melon_stem_connected.png,,,,,,,
/assets/minecraft/textures/block,melon_stem.png,mcl_farming_melon_stem_disconnected.png,,,,,,,
/assets/minecraft/textures/entity/signs,acacia.png,mcl_signs_sign_acacia.png,,,,,,,
/assets/minecraft/textures/entity/signs,acacia.png,mcl_signs_acacia_sign.png,,,,,,,
/assets/minecraft/textures/entity/signs,bamboo.png,mcl_bamboo_bamboo_sign.png,,,,,,,
/assets/minecraft/textures/entity/signs,birch.png,mcl_signs_birch_sign.png,,,,,,,
/assets/minecraft/textures/entity/signs,cherry.png,mcl_cherry_blossom_sign.png,,,,,,,
/assets/minecraft/textures/entity/signs,crimson.png,mcl_signs_crimson_sign.png,,,,,,,
/assets/minecraft/textures/entity/signs,dark_oak.png,mcl_signs_sign_dark.png,,,,,,,
/assets/minecraft/textures/entity/signs,jungle.png,mcl_signs_jungle_sign.png,,,,,,,
/assets/minecraft/textures/entity/signs,mangrove.png,mcl_signs_mangrove_sign.png,,,,,,,
/assets/minecraft/textures/entity/signs,oak.png,mcl_signs_sign.png,,,,,,,
/assets/minecraft/textures/entity/signs,spruce.png,mcl_signs_spruce_sign.png,,,,,,,
/assets/minecraft/textures/entity/signs,warped.png,mcl_signs_warped_sign.png,,,,,,,
/assets/minecraft/textures/item,acacia_sign.png,mcl_signs_acacia_sign_inv.png,,,,,,,
/assets/minecraft/textures/item,bamboo_sign.png,mcl_bamboo_bamboo_sign_wield.png,,,,,,,
/assets/minecraft/textures/item,cherry_sign.png,mcl_cherry_blossom_sign_inv.png,,,,,,,
/assets/minecraft/textures/item,dark_oak_sign.png,mcl_signs_default_sign_dark.png,,,,,,,
/assets/minecraft/textures/item,birch_sign.png,mcl_signs_birch_sign_inv.png,,,,,,,
/assets/minecraft/textures/item,cherry_sign.png,mcl_cherry_blossom_inv.png,,,,,,,
/assets/minecraft/textures/item,crimson_sign.png,mcl_signs_crimson_sign_inv.png,,,,,,,
/assets/minecraft/textures/item,dark_oak_sign.png,mcl_signs_default_dark.png,,,,,,,
/assets/minecraft/textures/item,jungle_sign.png,mcl_signs_jungle_sign_inv.png,,,,,,,
/assets/minecraft/textures/item,mangrove_sign.png,mcl_signs_mangrove_sign_inv.png,,,,,,,
/assets/minecraft/textures/item,oak_sign.png,mcl_signs_default_sign.png,,,,,,,
/assets/minecraft/textures/item,spruce_sign.png,mcl_signs_spruce_sign_inv.png,,,,,,,
/assets/minecraft/textures/item,warped_sign.png,mcl_signs_warped_sign_inv.png,,,,,,,
/assets/minecraft/textures/entity,banner_base.png,mcl_banners_banner_base.png,,,,,,,
/assets/minecraft/textures/entity/banner,base.png,mcl_banners_base.png,,,,,,,
/assets/minecraft/textures/block,nether_portal.png,mcl_portals_portal.png,,,,,,,

1 Source path Source file Target file xs ys xl yl xt yt Blacklisted?
338 /assets/minecraft/textures/block mycelium_top.png mcl_core_mycelium_top.png
339 /assets/minecraft/textures/block red_sand.png mcl_core_red_sand.png
340 /assets/minecraft/textures/block red_sandstone_bottom.png mcl_core_red_sandstone_bottom.png
341 /assets/minecraft/textures/block cut_red_sandstone.png mcl_core_red_sandstone_carved.png mcl_core_red_sandstone_smooth.png
342 /assets/minecraft/textures/block red_sandstone.png mcl_core_red_sandstone_normal.png
343 /assets/minecraft/textures/block chiseled_red_sandstone.png mcl_core_red_sandstone_smooth.png mcl_core_red_sandstone_carved.png
344 /assets/minecraft/textures/block red_sandstone_top.png mcl_core_red_sandstone_top.png
345 /assets/minecraft/textures/block redstone_ore.png mcl_core_redstone_ore.png
346 /assets/minecraft/textures/item sugar_cane.png mcl_core_reeds.png
347 /assets/minecraft/textures/block sandstone_bottom.png mcl_core_sandstone_bottom.png
/assets/minecraft/textures/block cut_sandstone.png mcl_core_sandstone_carved.png
/assets/minecraft/textures/block chiseled_sandstone.png mcl_core_sandstone_normal.png
348 /assets/minecraft/textures/block cut_sandstone.png mcl_core_sandstone_smooth.png
349 /assets/minecraft/textures/block sandstone.png chiseled_sandstone.png mcl_core_sandstone_top.png mcl_core_sandstone_carved.png
350 /assets/minecraft/textures/block sandstone.png mcl_core_sandstone_normal.png
351 /assets/minecraft/textures/block sandstone_top.png mcl_core_sandstone_top.png
352 /assets/minecraft/textures/block slime_block.png mcl_core_slime.png
353 /assets/minecraft/textures/block smooth_stone.png mcl_core_stonebrick_carved.png
354 /assets/minecraft/textures/block cracked_stone_bricks.png mcl_core_stonebrick_cracked.png
1151 /assets/minecraft/textures/block redstone_dust_line1.png redstone_redstone_dust_line1.png
1152 /assets/minecraft/textures/block attached_melon_stem.png mcl_farming_melon_stem_connected.png
1153 /assets/minecraft/textures/block melon_stem.png mcl_farming_melon_stem_disconnected.png
1154 /assets/minecraft/textures/entity/signs acacia.png mcl_signs_sign_acacia.png mcl_signs_acacia_sign.png
1155 /assets/minecraft/textures/entity/signs bamboo.png mcl_bamboo_bamboo_sign.png
1156 /assets/minecraft/textures/entity/signs birch.png mcl_signs_birch_sign.png
1157 /assets/minecraft/textures/entity/signs cherry.png mcl_cherry_blossom_sign.png
1158 /assets/minecraft/textures/entity/signs crimson.png mcl_signs_crimson_sign.png
1159 /assets/minecraft/textures/entity/signs dark_oak.png mcl_signs_sign_dark.png
1160 /assets/minecraft/textures/entity/signs jungle.png mcl_signs_jungle_sign.png
1161 /assets/minecraft/textures/entity/signs mangrove.png mcl_signs_mangrove_sign.png
1162 /assets/minecraft/textures/entity/signs oak.png mcl_signs_sign.png
1163 /assets/minecraft/textures/entity/signs spruce.png mcl_signs_spruce_sign.png
1164 /assets/minecraft/textures/entity/signs warped.png mcl_signs_warped_sign.png
1165 /assets/minecraft/textures/item acacia_sign.png mcl_signs_acacia_sign_inv.png
1166 /assets/minecraft/textures/item bamboo_sign.png mcl_bamboo_bamboo_sign_wield.png
1167 /assets/minecraft/textures/item cherry_sign.png birch_sign.png mcl_cherry_blossom_sign_inv.png mcl_signs_birch_sign_inv.png
1168 /assets/minecraft/textures/item dark_oak_sign.png cherry_sign.png mcl_signs_default_sign_dark.png mcl_cherry_blossom_inv.png
1169 /assets/minecraft/textures/item crimson_sign.png mcl_signs_crimson_sign_inv.png
1170 /assets/minecraft/textures/item dark_oak_sign.png mcl_signs_default_dark.png
1171 /assets/minecraft/textures/item jungle_sign.png mcl_signs_jungle_sign_inv.png
1172 /assets/minecraft/textures/item mangrove_sign.png mcl_signs_mangrove_sign_inv.png
1173 /assets/minecraft/textures/item oak_sign.png mcl_signs_default_sign.png
1174 /assets/minecraft/textures/item spruce_sign.png mcl_signs_spruce_sign_inv.png
1175 /assets/minecraft/textures/item warped_sign.png mcl_signs_warped_sign_inv.png
1176 /assets/minecraft/textures/entity banner_base.png mcl_banners_banner_base.png
1177 /assets/minecraft/textures/entity/banner base.png mcl_banners_base.png
1178 /assets/minecraft/textures/block nether_portal.png mcl_portals_portal.png

View File

@ -122,6 +122,9 @@ def convert_textures(make_texture_pack, dry_run, verbose, base_dir, tex_dir, tem
description_file.write(description)
description_file.close()
# Create override file
shutil.copyfile("override.txt", target_dir("/", make_texture_pack, output_dir, output_dir_name, mineclone2_path) + "/override.txt")
# Create preview image (screenshot.png)
os.system("convert -size 300x200 canvas:transparent "+target_dir("/", make_texture_pack, output_dir, output_dir_name, mineclone2_path) + "/screenshot.png")
os.system("composite "+base_dir+"/pack.png "+target_dir("/", make_texture_pack, output_dir, output_dir_name, mineclone2_path) + "/screenshot.png -gravity center "+target_dir("/", make_texture_pack, output_dir, output_dir_name, mineclone2_path) + "/screenshot.png")

57
tools/override.txt Normal file
View File

@ -0,0 +1,57 @@
Signs:
mcl_signs:wall_sign_warped_hyphae_wood inventory mcl_signs_warped_sign_inv.png
mcl_signs:wall_sign_warped_hyphae_wood wield mcl_signs_warped_sign_inv.png
mcl_signs:wall_sign_warped_hyphae_wood all mcl_signs_warped_sign.png
mcl_signs:standing_sign_warped_hyphae_wood all mcl_signs_warped_sign.png
mcl_signs:standing_sign22_5_warped_hyphae_wood all mcl_signs_warped_sign.png
mcl_signs:standing_sign45_warped_hyphae_wood all mcl_signs_warped_sign.png
mcl_signs:standing_sign67_5_warped_hyphae_wood all mcl_signs_warped_sign.png
mcl_signs:wall_sign_c rimson_hyphae_wood inventory mcl_signs_crimson_sign_inv.png
mcl_signs:wall_sign_crimson_hyphae_wood wield mcl_signs_crimson_sign_inv.png
mcl_signs:wall_sign_crimson_hyphae_wood all mcl_signs_crimson_sign.png
mcl_signs:standing_sign_crimson_hyphae_wood all mcl_signs_crimson_sign.png
mcl_signs:standing_sign22_5_crimson_hyphae_wood all mcl_signs_crimson_sign.png
mcl_signs:standing_sign45_crimson_hyphae_wood all mcl_signs_crimson_sign.png
mcl_signs:standing_sign67_5_crimson_hyphae_wood all mcl_signs_crimson_sign.png
mcl_signs:wall_sign_acaciawood inventory mcl_signs_acacia_sign_inv.png
mcl_signs:wall_sign_acaciawood wield mcl_signs_acacia_sign_inv.png
mcl_signs:wall_sign_acaciawood all mcl_signs_acacia_sign.png
mcl_signs:standing_sign_acaciawood all mcl_signs_acacia_sign.png
mcl_signs:standing_sign22_5_acaciawood all mcl_signs_acacia_sign.png
mcl_signs:standing_sign45_acaciawood all mcl_signs_acacia_sign.png
mcl_signs:standing_sign67_5_acaciawood all mcl_signs_acacia_sign.png
mcl_signs:wall_sign_birchwood inventory mcl_signs_birch_sign_inv.png
mcl_signs:wall_sign_birchwood wield mcl_signs_birch_sign_inv.png
mcl_signs:wall_sign_birchwood all mcl_signs_birch_sign.png
mcl_signs:standing_sign_birchwood all mcl_signs_birch_sign.png
mcl_signs:standing_sign22_5_birchwood all mcl_signs_birch_sign.png
mcl_signs:standing_sign45_birchwood all mcl_signs_birch_sign.png
mcl_signs:standing_sign67_5_birchwood all mcl_signs_birch_sign.png
mcl_signs:wall_sign_junglewood inventory mcl_signs_jungle_sign_inv.png
mcl_signs:wall_sign_junglewood wield mcl_signs_jungle_sign_inv.png
mcl_signs:wall_sign_junglewood all mcl_signs_jungle_sign.png
mcl_signs:standing_sign_junglewood all mcl_signs_jungle_sign.png
mcl_signs:standing_sign22_5_junglewood all mcl_signs_jungle_sign.png
mcl_signs:standing_sign45_junglewood all mcl_signs_jungle_sign.png
mcl_signs:standing_sign67_5_junglewood all mcl_signs_jungle_sign.png
mcl_signs:wall_sign_mangrove_wood inventory mcl_signs_mangrove_sign_inv.png
mcl_signs:wall_sign_mangrove_wood wield mcl_signs_mangrove_sign_inv.png
mcl_signs:wall_sign_mangrove_wood all mcl_signs_mangrove_sign.png
mcl_signs:standing_sign_mangrove_wood all mcl_signs_mangrove_sign.png
mcl_signs:standing_sign22_5_mangrove_wood all mcl_signs_mangrove_sign.png
mcl_signs:standing_sign45_mangrove_wood all mcl_signs_mangrove_sign.png
mcl_signs:standing_sign67_5_mangrove_wood all mcl_signs_mangrove_sign.png
mcl_signs:wall_sign_sprucewood inventory mcl_signs_spruce_sign_inv.png
mcl_signs:wall_sign_sprucewood wield mcl_signs_spruce_sign_inv.png
mcl_signs:wall_sign_sprucewood all mcl_signs_spruce_sign.png
mcl_signs:standing_sign_sprucewood all mcl_signs_spruce_sign.png
mcl_signs:standing_sign22_5_sprucewood all mcl_signs_spruce_sign.png
mcl_signs:standing_sign45_sprucewood all mcl_signs_spruce_sign.png
mcl_signs:standing_sign67_5_sprucewood all mcl_signs_spruce_sign.png