diff --git a/mods/3d_armor/3d_armor/api.lua b/mods/3d_armor/3d_armor/api.lua index 8e07c648..2051c28f 100644 --- a/mods/3d_armor/3d_armor/api.lua +++ b/mods/3d_armor/3d_armor/api.lua @@ -55,12 +55,14 @@ armor = { crystal = "ethereal:crystal_ingot", }, fire_nodes = { + {"nether:lava_source", 5, 8}, {"default:lava_source", 5, 8}, {"default:lava_flowing", 5, 8}, {"fire:basic_flame", 3, 4}, {"fire:permanent_flame", 3, 4}, {"ethereal:crystal_spike", 2, 1}, {"ethereal:fire_flower", 2, 1}, + {"nether:lava_crust", 2, 1}, {"default:torch", 1, 1}, {"default:torch_ceiling", 1, 1}, {"default:torch_wall", 1, 1}, @@ -671,3 +673,10 @@ armor.drop_armor = function(pos, stack) end end end + +--- Allows skin mod to be set manually. +-- +-- Useful for skin mod forks that do not use the same name. +armor.set_skin_mod = function(mod) + armor.skin_mod = mod +end diff --git a/mods/3d_armor/wieldview/init.lua b/mods/3d_armor/wieldview/init.lua index f0edeacb..6397d049 100644 --- a/mods/3d_armor/wieldview/init.lua +++ b/mods/3d_armor/wieldview/init.lua @@ -69,12 +69,12 @@ end minetest.register_on_joinplayer(function(player) local name = player:get_player_name() wieldview.wielded_item[name] = "" - minetest.after(0, function() - local pplayer = minetest.get_player_by_name(name) - if player then + minetest.after(0, function(pname) + local pplayer = minetest.get_player_by_name(pname) + if pplayer then wieldview:update_wielded_item(pplayer) end - end) + end, name) end) minetest.register_globalstep(function(dtime) diff --git a/mods/ambience/README.md b/mods/ambience/README.md index d12ae5b0..689ca017 100644 --- a/mods/ambience/README.md +++ b/mods/ambience/README.md @@ -19,5 +19,6 @@ Based on Immersive Sounds .36 mod by Neuromancer and optimized to run on servers - 1.4 - Re-ordered water sets to come before fire and lava, day/night sounds play when leaves around and above ground - 1.5 - Added 'flame_sound' and fire redo check, code tidy and tweak, added ephemeral flag for background sounds. - 1.6 - Finding env_sounds disables water and lava sets, added 'ambience_water_move' flag to override water walking sounds, use eye level for head node. +- 1.7 - Music will play every 20-30 minutes if found, use '/mvol 0' to stop playing music or disable in-game. Code license: MIT diff --git a/mods/ambience/init.lua b/mods/ambience/init.lua index 00f3a7f0..43f7be00 100644 --- a/mods/ambience/init.lua +++ b/mods/ambience/init.lua @@ -3,7 +3,7 @@ ambience = {} -- settings local SOUNDVOLUME = 1.0 -local MUSICVOLUME = 1.0 +local MUSICVOLUME = 0.6 local play_music = minetest.settings:get_bool("ambience_music") ~= false local pplus = minetest.get_modpath("playerplus") local radius = 6 @@ -91,7 +91,7 @@ end -- setup table when player joins minetest.register_on_joinplayer(function(player) - playing[player:get_player_name()] = {} + playing[player:get_player_name()] = {music = -1} end) -- remove table when player leaves @@ -103,24 +103,31 @@ end) -- plays music and selects sound set local get_ambience = function(player, tod, name) - -- play server or local music if available - if play_music then + -- play server or local music if music enabled and music not already playing + if play_music and MUSICVOLUME > 0 and playing[name].music < 0 then - -- play at midnight - if tod >= 0.0 and tod <= 0.01 then + -- count backwards + playing[name].music = playing[name].music -1 - if not playing[name].music then + -- play music every 20 minutes + if playing[name].music < -(60 * 20) then - playing[name].music = minetest.sound_play("ambience_music", { - to_player = name, - gain = MUSICVOLUME - }) - end + playing[name].music = minetest.sound_play("ambience_music", { + to_player = name, + gain = MUSICVOLUME + }) - elseif tod > 0.1 and playing[name].music then + -- reset music timer after 10 minutes + minetest.after(60 * 10, function(name) - playing[name].music = nil + if playing[name] then + playing[name].music = -1 + end + end, name) end + +--print("-- music count", playing[name].music) + end -- get foot and head level nodes at player position @@ -198,7 +205,7 @@ minetest.register_globalstep(function(dtime) --print(string.format("elapsed time: %.4f\n", os.clock() - t1)) - ok = playing[player_name] -- everything starts off ok if player around + ok = playing[player_name] -- everything starts off ok if player found -- are we playing something already? if ok and playing[player_name].handler then @@ -295,19 +302,23 @@ minetest.register_chatcommand("svol", { -- music volume command (0 stops music) minetest.register_chatcommand("mvol", { params = "", - description = "set music volume (0.1 to 1.0)", + description = "set music volume (0.1 to 1.0, 0 to stop music)", privs = {server = true}, func = function(name, param) MUSICVOLUME = tonumber(param) or MUSICVOLUME - -- ability to stop music just as it begins - if MUSICVOLUME == 0 and playing[name].music then + -- ability to stop music by setting volume to 0 + if MUSICVOLUME == 0 and playing[name].music + and playing[name].music >= 0 then + minetest.sound_stop(playing[name].music) + + playing[name].music = -1 end - if MUSICVOLUME < 0.1 then MUSICVOLUME = 0.1 end + if MUSICVOLUME < 0 then MUSICVOLUME = 0 end if MUSICVOLUME > 1.0 then MUSICVOLUME = 1.0 end return true, "Music volume set to " .. MUSICVOLUME diff --git a/mods/anvils/init.lua b/mods/anvils/init.lua index 3aaf626f..7586d901 100644 --- a/mods/anvils/init.lua +++ b/mods/anvils/init.lua @@ -220,6 +220,21 @@ local anvildef = { sounds = default.node_sound_metal_defaults(), +---------------- added + can_dig = function(pos, player) + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + if inv:is_empty("input") and inv:is_empty("output") then + + if not minetest.is_protected(pos, player:get_player_name()) then + return true + end + end + end, +----------------- + after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) diff --git a/mods/bonemeal/init.lua b/mods/bonemeal/init.lua index 139fef52..ef32e610 100644 --- a/mods/bonemeal/init.lua +++ b/mods/bonemeal/init.lua @@ -95,6 +95,8 @@ end) -- default biomes deco local deco = { + {"default:dry_dirt", dry_grass, {}}, + {"default:dry_dirt_with_dry_grass", dry_grass, {}}, {"default:dirt_with_dry_grass", dry_grass, flowers}, {"default:sand", {}, {"default:dry_shrub", "", "", ""} }, {"default:desert_sand", {}, {"default:dry_shrub", "", "", ""} }, diff --git a/mods/bows/lucky_block.lua b/mods/bows/lucky_block.lua index f6d0e826..58d61ed0 100644 --- a/mods/bows/lucky_block.lua +++ b/mods/bows/lucky_block.lua @@ -11,13 +11,13 @@ if minetest.get_modpath("lucky_block") then {"dro", {"bows:arrow_diamond"}, 5}, {"nod", "default:chest", 0, { {name = "default:stick", max = 5}, - {name = "default:flint", max = 3}, - {name = "default:steel_ingot", max = 3}, - {name = "default:bronze_ingot", max = 3}, - {name = "default:mese_crystal_fragment", max = 3}, + {name = "default:flint", max = 5}, + {name = "default:steel_ingot", max = 5}, + {name = "default:bronze_ingot", max = 5}, + {name = "default:mese_crystal_fragment", max = 5}, {name = "farming:string", max = 5}, - {name = bows.feather, max = 4}, - {name = "bows:bow_bowie", max = 1} + {name = bows.feather, max = 5}, + {name = "bows:bow_bowie", max = 1, chance = 4} }}, }) -end \ No newline at end of file +end diff --git a/mods/cottages/nodes_anvil.lua b/mods/cottages/nodes_anvil.lua index cfe04c3a..0b7149ca 100644 --- a/mods/cottages/nodes_anvil.lua +++ b/mods/cottages/nodes_anvil.lua @@ -9,6 +9,12 @@ local S = cottages.S +-- disable repair with anvil by setting a message for the item in question +cottages.forbid_repair = {} +-- example for hammer no longer beeing able to repair the hammer +--cottages.forbid_repair["cottages:hammer"] = 'The hammer is too complex for repairing.' + + -- the hammer for the anvil minetest.register_tool("cottages:hammer", { description = S("Steel hammer for repairing tools on the anvil"), @@ -138,6 +144,12 @@ minetest.register_node("cottages:anvil", { S('The workpiece slot is for damaged tools only.')); return 0; end + if( listname=='input' + and cottages.forbid_repair[ stack:get_name() ]) then + minetest.chat_send_player( player:get_player_name(), + S(cottages.forbid_repair[ stack:get_name() ])); + return 0; + end return stack:get_count() end, @@ -181,6 +193,14 @@ minetest.register_node("cottages:anvil", { -- 65535 is max damage local damage_state = 40-math.floor(input:get_wear()/1638); + -- just to make sure that it really can't get repaired if it should not + -- (if the check of placing the item in the input slot failed somehow) + if( puncher and name and cottages.forbid_repair[ input:get_name() ]) then + minetest.chat_send_player( name, + S(cottages.forbid_repair[ input:get_name() ])); + return; + end + local tool_name = input:get_name(); local hud_image = ""; if( tool_name diff --git a/mods/cottages/nodes_water.lua b/mods/cottages/nodes_water.lua index 44e41192..19847798 100644 --- a/mods/cottages/nodes_water.lua +++ b/mods/cottages/nodes_water.lua @@ -117,7 +117,7 @@ minetest.register_node("cottages:water_gen", { paramtype = "light", paramtype2 = "facedir", is_ground_content = false, - groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + groups = {tree = 1, choppy = 2, cracky = 1, flammable = 2}, sounds = cottages.sounds.wood, node_box = { type = "fixed", @@ -178,8 +178,14 @@ minetest.register_node("cottages:water_gen", { can_dig = function(pos,player) local meta = minetest.get_meta(pos); local inv = meta:get_inventory() - return inv:is_empty("main") and - default.can_interact_with_node(player, pos) + local bucket = meta:get_string("bucket") + local start = meta:get_string("fillstarttime") + return inv:is_empty("main") + and default.can_interact_with_node(player, pos) + and (not(bucket) or bucket == "") + and ((not(start) or start == "" or + (minetest.get_us_time()/1000000) - tonumber(start) + >= cottages.water_fill_time -2)) end, -- no inventory move allowed allow_metadata_inventory_move = function(pos, from_list, from_index, @@ -213,7 +219,7 @@ minetest.register_node("cottages:water_gen", { cottages.switch_public(pos, formname, fields, sender, 'tree trunk well') end, -- punch to place and retrieve bucket - on_punch = function(pos, node, puncher) + on_punch = function(pos, node, puncher, pointed_thing) if( not( pos ) or not( node ) or not( puncher )) then return end @@ -223,7 +229,8 @@ minetest.register_node("cottages:water_gen", { local owner = meta:get_string("owner") local public = meta:get_string("public") if( name ~= owner and public~="public") then - minetest.chat_send_player( name, S("This tree trunk well is owned by %s. You can't use it."):format(name)) + minetest.chat_send_player( name, + S("This tree trunk well is owned by %s. You can't use it."):format(owner)) return end @@ -233,13 +240,18 @@ minetest.register_node("cottages:water_gen", { -- is the well working on something? (either empty or full bucket) local bucket = meta:get_string("bucket") -- there is a bucket loaded - either empty or full - if( bucket and bucket~="") then + if( bucket and bucket~="" and bucket ~= "bucket:bucket_empty") then if( not(pinv:room_for_item("main", bucket))) then minetest.chat_send_player( puncher:get_player_name(), S("Sorry. You have no room for the bucket. Please free some ".. "space in your inventory first!")) return end + elseif( bucket and bucket == "bucket:bucket_empty") then + minetest.chat_send_player( puncher:get_player_name(), + S("Please wait until your bucket has been filled.")) + -- do not give the empty bucket back immediately + return end -- remove the old entity (either a bucket will be placed now or a bucket taken) @@ -267,8 +279,6 @@ minetest.register_node("cottages:water_gen", { if( wielded and wielded:get_name() and wielded:get_name() == "bucket:bucket_empty") then - -- remove the bucket from the players inventory - pinv:remove_item( "main", "bucket:bucket_empty") -- remember that we got a bucket loaded meta:set_string("bucket", "bucket:bucket_empty") -- create the entity @@ -280,6 +290,8 @@ minetest.register_node("cottages:water_gen", { minetest.after(cottages.water_fill_time, cottages.water_gen_fill_bucket, pos) -- the bucket will only be filled if the water ran long enough meta:set_string("fillstarttime", tostring(minetest.get_us_time()/1000000)) + -- remove the bucket from the players inventory + pinv:remove_item( "main", "bucket:bucket_empty") return; end -- buckets can also be emptied here diff --git a/mods/farming/crops/corn.lua b/mods/farming/crops/corn.lua index e03c8ba1..fe890794 100644 --- a/mods/farming/crops/corn.lua +++ b/mods/farming/crops/corn.lua @@ -32,6 +32,25 @@ minetest.register_craft({ recipe = "group:food_corn" }) +-- popcorn +minetest.register_craftitem("farming:popcorn", { + description = S("Popcorn"), + inventory_image = "farming_popcorn.png", + groups = {food_popcorn = 1, flammable = 2}, + on_use = minetest.item_eat(4) +}) + +minetest.register_craft({ + output = "farming:popcorn", + recipe = { + {"group:food_pot", "group:food_oil", "group:food_corn"} + }, + replacements = { + {"group:food_pot", "farming:pot"}, + {"group:food_oil", "vessels:glass_bottle"} + } +}) + -- cornstarch minetest.register_craftitem("farming:cornstarch", { description = S("Cornstarch"), diff --git a/mods/farming/license.txt b/mods/farming/license.txt index c929fcc6..d05b1bd5 100644 --- a/mods/farming/license.txt +++ b/mods/farming/license.txt @@ -173,3 +173,6 @@ Created by gorlock (CC0) Created by sirrobzeroone (CC0) farming_gyoza.png farming_pineapple_ring.png + +Created by TechM8 (https://www.deviantart.com/techm8) + farming_popcorn.png diff --git a/mods/farming/textures/farming_popcorn.png b/mods/farming/textures/farming_popcorn.png new file mode 100644 index 00000000..6a534b94 Binary files /dev/null and b/mods/farming/textures/farming_popcorn.png differ diff --git a/mods/mobs_animal/locale/README.md b/mods/mobs_animal/locale/README.md new file mode 100644 index 00000000..4887b9e0 --- /dev/null +++ b/mods/mobs_animal/locale/README.md @@ -0,0 +1,10 @@ +# Convert '.po' file to '.txt' file. + +### COMMAND SAMPLE +'''' +$ lua po2tr.lua "Your Name (Your Site) " "pt_BR.po" +rm "pt_BR.tr" "mobs_animal.pt_BR.tr" +$ cat mobs_animal.pt_BR.tr | less +'''' + +Source Code: https://gitlab.com/4w/xtend/-/blob/master/xtend_default/tools/convert_po_file_to_tr_file/convert_po_file_to_tr_file.lua diff --git a/mods/mobs_animal/locale/mobs_animal.pt.tr b/mods/mobs_animal/locale/mobs_animal.pt.tr new file mode 100644 index 00000000..60d9f5c1 --- /dev/null +++ b/mods/mobs_animal/locale/mobs_animal.pt.tr @@ -0,0 +1,46 @@ +# textdomain: Lunovox Heavenfinder (https://libreplanet.org/wiki/User:Lunovox) +Bee=Abelha +Honey=Mel +Beehive=Colméia +Honey Block=Bloco de Mel +Bunny=Coelho +Raw Rabbit=Carne de Coelho (Cru) +Cooked Rabbit=Coelho (Assado) +Rabbit Hide=Pele de Coelho +Chicken=Galinha +Chicken Egg=Ovo de Galinha +Fried Egg=Ovo Frito +Raw Chicken=Carne de Galinha (Crua) +Cooked Chicken=Galinha Assada +Feather=Pluma +Cow already milked!=Vaca já ordenhada! +Cow=Vaca +Bucket of Milk=Balde de leite +Cheese=Queijo +Cheese Block=Bloco de Queijo +[MOD] Mobs Redo 'Animals' loaded=[MOBS_ANIMAL] Mod carregado completamente +Kitten=Gato +Penguin=Pinguim +Rat=Rato +Cooked Rat=Rato (Assado) +Black=Preto +Blue=Azul +Brown=Marrom +Cyan=Ciano +Dark Green=Verde Escuro +Dark Grey=Cinza Escuro +Green=Verde +Grey=Cinza +Magenta=Rosa Magenta +Orange=Laranja +Pink=Rosa +Red=Vermelho +Violet=Violeta +White=Branco +Yellow=Amarelo +@1 Sheep=Ovelha @1 +Raw Mutton=Carneiro (Cru) +Cooked Mutton=Carneiro (Assado) +Warthog=Javali +Raw Porkchop=Costeleta de Javali (Crua) +Cooked Porkchop=Costeleta de Javali Assada diff --git a/mods/mobs_animal/locale/mobs_animal.pt_BR.tr b/mods/mobs_animal/locale/mobs_animal.pt_BR.tr new file mode 100644 index 00000000..60d9f5c1 --- /dev/null +++ b/mods/mobs_animal/locale/mobs_animal.pt_BR.tr @@ -0,0 +1,46 @@ +# textdomain: Lunovox Heavenfinder (https://libreplanet.org/wiki/User:Lunovox) +Bee=Abelha +Honey=Mel +Beehive=Colméia +Honey Block=Bloco de Mel +Bunny=Coelho +Raw Rabbit=Carne de Coelho (Cru) +Cooked Rabbit=Coelho (Assado) +Rabbit Hide=Pele de Coelho +Chicken=Galinha +Chicken Egg=Ovo de Galinha +Fried Egg=Ovo Frito +Raw Chicken=Carne de Galinha (Crua) +Cooked Chicken=Galinha Assada +Feather=Pluma +Cow already milked!=Vaca já ordenhada! +Cow=Vaca +Bucket of Milk=Balde de leite +Cheese=Queijo +Cheese Block=Bloco de Queijo +[MOD] Mobs Redo 'Animals' loaded=[MOBS_ANIMAL] Mod carregado completamente +Kitten=Gato +Penguin=Pinguim +Rat=Rato +Cooked Rat=Rato (Assado) +Black=Preto +Blue=Azul +Brown=Marrom +Cyan=Ciano +Dark Green=Verde Escuro +Dark Grey=Cinza Escuro +Green=Verde +Grey=Cinza +Magenta=Rosa Magenta +Orange=Laranja +Pink=Rosa +Red=Vermelho +Violet=Violeta +White=Branco +Yellow=Amarelo +@1 Sheep=Ovelha @1 +Raw Mutton=Carneiro (Cru) +Cooked Mutton=Carneiro (Assado) +Warthog=Javali +Raw Porkchop=Costeleta de Javali (Crua) +Cooked Porkchop=Costeleta de Javali Assada diff --git a/mods/mobs_animal/locale/po2tr.lua b/mods/mobs_animal/locale/po2tr.lua new file mode 100644 index 00000000..b48ea071 --- /dev/null +++ b/mods/mobs_animal/locale/po2tr.lua @@ -0,0 +1,116 @@ +#!/usr/bin/env luajit + +-- Convert regular Gettext PO files to Minetest-specific TR files. If there is +-- already a TR file with the same name of the PO file except the file suffix +-- bneing .tr (or .TR) instead of .po (or .PO) then THIS FILE WILL BE +-- OVERWRITTEN WITHOUT INFORMATION OR A WAY TO RECOVER THE PREVIOUS FILE! +-- +-- +-- ▄██▄ +-- ▀███ +-- █ +-- ▄▄▄▄▄ █ +-- ▀▄ ▀▄ █ BACKUP +-- ▄▀▀▀▄ █▄▄▄▄█▄▄ ▄▀▀▀▄ █ +-- █ ▄ █ █ ▄ █ █ +-- ▀▄ ▄▀ ▀▄ ▄▀ █ +-- █▀▀▀ ▀▀▀ █ █ +-- █ █ █ ALL +-- ▄▀▄▄▀▄ █ ▄█▀█▀█▀█▀█▀█▄ █ █ +-- █▒▒▒▒█ █ █████████████▄ █ █ +-- █▒▒▒▒█ █ ██████████████▄ █ █ +-- █▒▒▒▒█ █ ██████████████▄ █ █ +-- █▒▒▒▒█ █ ██████████████ █ █ +-- █▒▒▒▒█ █ ██████████████▀ █ █ THE +-- █▒▒▒▒█ ██ ██████████████ █ █ +-- ▀████▀ ██▀█ █████████████▀ █▄█ +-- ██ ██ ▀█ █▄█▄█▄█▄█▄█▀ ▄█▀ +-- ██ ██ ▀█ ▄▀▓█ +-- ██ ██ ▀█▀▄▄▄▄▄▄▄▄▄▀▀▓▓▓█ +-- ████ █▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█ +-- ███ █▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█ THINGS +-- ██ █▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█ +-- ██ █▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█ +-- ██ ▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█ +-- ██ ▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█ +-- ██ ▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▌ !!! +-- ██ ▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▌ +-- ██ ▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▌ +-- ██ ▐█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▌ +-- +-- +-- The syntax of TR files according to the introducing forum post is: +-- +-- # textdomain: namespace +-- original 1 = translation 1 +-- original 2 = translation 2 +-- original 3 = tralslation 3 +-- original N = translation N +-- +-- Where namespace should be the name of the mod. Following strings have to be +-- escaped using @. +-- +-- String | Escape +-- -------+-------- +-- `@` |`@@` +-- `=` |`@=` +-- `\n` |`@\n` +-- +-- See https://forum.minetest.net/viewtopic.php?t=18349 for details. + + +-- Preparation +if arg[1] == nil or arg[2] == nil then + print('Provide the namesspace as first parameter') + print('Provide the path to the source PO file as second parameter') + print('Example: '..arg[0]..' mymod path/to/my/source.po') + return +end +local SEP = package.path:match('(%p)%?%.') or '/' -- wonky but hey ... :) + + +-- Assign parameters to local variables +local namespace = arg[1] +local po_file = arg[2] +local tr_file = arg[2]:gsub('po$', 'tr'):gsub('PO$', 'TR') + + +-- Get the translations through crude plaintext file parsing +local file_contents = {} +local translations = {} + +local po_file_handle = io.open(po_file, 'rb') +if po_file_handle == nil then print('No base file found') return end + +for line in po_file_handle:lines() do + if line:match('^msgid') or line:match('^msgstr') then + table.insert(file_contents, line) + end +end + +local escape_string = function (s) + s = s:gsub('@([^%d])', '@@%1') -- All @ not followed by a number become @@ + s = s:gsub('([^@]@)$', '%1@') -- An @ at the end of the string become @@ + s = s:gsub('=', '@=') -- All = become @= + return s +end + +for number,line_content in pairs(file_contents) do + if line_content:match('^msgid') then + local o = line_content:gsub('^msgid "(.+)"$', '%1') + local t = file_contents[number + 1]:gsub('^msgstr "(.+)"$', '%1') + if o ~= 'msgid = ""' and t ~= 'msgstr ""' then + table.insert(translations, escape_string(o)..'='..escape_string(t)) + end + end +end +print(number) +po_file_handle:close() + + +-- Write translation to file +local tr_file_handle = io.open(tr_file, 'w+') +if tr_file_handle == nil then print('Could not open target file') return end +tr_file_handle:write('# textdomain: '..namespace, "\n") +for _,line in pairs(translations) do tr_file_handle:write(line, "\n") end +tr_file_handle:close() diff --git a/mods/mobs_animal/locale/pt.po b/mods/mobs_animal/locale/pt.po new file mode 100644 index 00000000..20f09d68 --- /dev/null +++ b/mods/mobs_animal/locale/pt.po @@ -0,0 +1,199 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-31 11:28+0200\n" +"PO-Revision-Date: 2021-06-20 18:51-0300\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.6\n" +"Last-Translator: Lunovox Heavenfinder \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Language: pt_BR\n" + +#: bee.lua +msgid "Bee" +msgstr "Abelha" + +#: bee.lua +msgid "Honey" +msgstr "Mel" + +#: bee.lua +msgid "Beehive" +msgstr "Colméia" + +#: bee.lua +msgid "Honey Block" +msgstr "Bloco de Mel" + +#: bunny.lua +msgid "Bunny" +msgstr "Coelho" + +#: bunny.lua +msgid "Raw Rabbit" +msgstr "Carne de Coelho (Cru)" + +#: bunny.lua +msgid "Cooked Rabbit" +msgstr "Coelho (Assado)" + +#: bunny.lua +msgid "Rabbit Hide" +msgstr "Pele de Coelho" + +#: chicken.lua +msgid "Chicken" +msgstr "Galinha" + +#: chicken.lua +msgid "Chicken Egg" +msgstr "Ovo de Galinha" + +#: chicken.lua +msgid "Fried Egg" +msgstr "Ovo Frito" + +#: chicken.lua +msgid "Raw Chicken" +msgstr "Carne de Galinha (Crua)" + +#: chicken.lua +msgid "Cooked Chicken" +msgstr "Galinha Assada" + +#: chicken.lua +msgid "Feather" +msgstr "Pluma" + +#: cow.lua +msgid "Cow already milked!" +msgstr "Vaca já ordenhada!" + +#: cow.lua +msgid "Cow" +msgstr "Vaca" + +#: cow.lua +msgid "Bucket of Milk" +msgstr "Balde de leite" + +#: cow.lua +msgid "Cheese" +msgstr "Queijo" + +#: cow.lua +msgid "Cheese Block" +msgstr "Bloco de Queijo" + +#: init.lua +msgid "[MOD] Mobs Redo 'Animals' loaded" +msgstr "[MOBS_ANIMAL] Mod carregado completamente" + +#: kitten.lua +msgid "Kitten" +msgstr "Gato" + +#: penguin.lua +msgid "Penguin" +msgstr "Pinguim" + +#: rat.lua +msgid "Rat" +msgstr "Rato" + +#: rat.lua +msgid "Cooked Rat" +msgstr "Rato (Assado)" + +#: sheep.lua +msgid "Black" +msgstr "Preto" + +#: sheep.lua +msgid "Blue" +msgstr "Azul" + +#: sheep.lua +msgid "Brown" +msgstr "Marrom" + +#: sheep.lua +msgid "Cyan" +msgstr "Ciano" + +#: sheep.lua +msgid "Dark Green" +msgstr "Verde Escuro" + +#: sheep.lua +msgid "Dark Grey" +msgstr "Cinza Escuro" + +#: sheep.lua +msgid "Green" +msgstr "Verde" + +#: sheep.lua +msgid "Grey" +msgstr "Cinza" + +#: sheep.lua +msgid "Magenta" +msgstr "Rosa Magenta" + +#: sheep.lua +msgid "Orange" +msgstr "Laranja" + +#: sheep.lua +msgid "Pink" +msgstr "Rosa" + +#: sheep.lua +msgid "Red" +msgstr "Vermelho" + +#: sheep.lua +msgid "Violet" +msgstr "Violeta" + +#: sheep.lua +msgid "White" +msgstr "Branco" + +#: sheep.lua +msgid "Yellow" +msgstr "Amarelo" + +#: sheep.lua +msgid "@1 Sheep" +msgstr "Ovelha @1 " + +#: sheep.lua +msgid "Raw Mutton" +msgstr "Carneiro (Cru)" + +#: sheep.lua +msgid "Cooked Mutton" +msgstr "Carneiro (Assado)" + +#: warthog.lua +msgid "Warthog" +msgstr "Javali" + +#: warthog.lua +msgid "Raw Porkchop" +msgstr "Costeleta de Javali (Crua)" + +#: warthog.lua +msgid "Cooked Porkchop" +msgstr "Costeleta de Javali Assada" diff --git a/mods/mobs_animal/locale/pt.txt b/mods/mobs_animal/locale/pt.txt new file mode 100644 index 00000000..60d9f5c1 --- /dev/null +++ b/mods/mobs_animal/locale/pt.txt @@ -0,0 +1,46 @@ +# textdomain: Lunovox Heavenfinder (https://libreplanet.org/wiki/User:Lunovox) +Bee=Abelha +Honey=Mel +Beehive=Colméia +Honey Block=Bloco de Mel +Bunny=Coelho +Raw Rabbit=Carne de Coelho (Cru) +Cooked Rabbit=Coelho (Assado) +Rabbit Hide=Pele de Coelho +Chicken=Galinha +Chicken Egg=Ovo de Galinha +Fried Egg=Ovo Frito +Raw Chicken=Carne de Galinha (Crua) +Cooked Chicken=Galinha Assada +Feather=Pluma +Cow already milked!=Vaca já ordenhada! +Cow=Vaca +Bucket of Milk=Balde de leite +Cheese=Queijo +Cheese Block=Bloco de Queijo +[MOD] Mobs Redo 'Animals' loaded=[MOBS_ANIMAL] Mod carregado completamente +Kitten=Gato +Penguin=Pinguim +Rat=Rato +Cooked Rat=Rato (Assado) +Black=Preto +Blue=Azul +Brown=Marrom +Cyan=Ciano +Dark Green=Verde Escuro +Dark Grey=Cinza Escuro +Green=Verde +Grey=Cinza +Magenta=Rosa Magenta +Orange=Laranja +Pink=Rosa +Red=Vermelho +Violet=Violeta +White=Branco +Yellow=Amarelo +@1 Sheep=Ovelha @1 +Raw Mutton=Carneiro (Cru) +Cooked Mutton=Carneiro (Assado) +Warthog=Javali +Raw Porkchop=Costeleta de Javali (Crua) +Cooked Porkchop=Costeleta de Javali Assada diff --git a/mods/mobs_animal/locale/pt_BR.po b/mods/mobs_animal/locale/pt_BR.po new file mode 100644 index 00000000..20f09d68 --- /dev/null +++ b/mods/mobs_animal/locale/pt_BR.po @@ -0,0 +1,199 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-07-31 11:28+0200\n" +"PO-Revision-Date: 2021-06-20 18:51-0300\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.6\n" +"Last-Translator: Lunovox Heavenfinder \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Language: pt_BR\n" + +#: bee.lua +msgid "Bee" +msgstr "Abelha" + +#: bee.lua +msgid "Honey" +msgstr "Mel" + +#: bee.lua +msgid "Beehive" +msgstr "Colméia" + +#: bee.lua +msgid "Honey Block" +msgstr "Bloco de Mel" + +#: bunny.lua +msgid "Bunny" +msgstr "Coelho" + +#: bunny.lua +msgid "Raw Rabbit" +msgstr "Carne de Coelho (Cru)" + +#: bunny.lua +msgid "Cooked Rabbit" +msgstr "Coelho (Assado)" + +#: bunny.lua +msgid "Rabbit Hide" +msgstr "Pele de Coelho" + +#: chicken.lua +msgid "Chicken" +msgstr "Galinha" + +#: chicken.lua +msgid "Chicken Egg" +msgstr "Ovo de Galinha" + +#: chicken.lua +msgid "Fried Egg" +msgstr "Ovo Frito" + +#: chicken.lua +msgid "Raw Chicken" +msgstr "Carne de Galinha (Crua)" + +#: chicken.lua +msgid "Cooked Chicken" +msgstr "Galinha Assada" + +#: chicken.lua +msgid "Feather" +msgstr "Pluma" + +#: cow.lua +msgid "Cow already milked!" +msgstr "Vaca já ordenhada!" + +#: cow.lua +msgid "Cow" +msgstr "Vaca" + +#: cow.lua +msgid "Bucket of Milk" +msgstr "Balde de leite" + +#: cow.lua +msgid "Cheese" +msgstr "Queijo" + +#: cow.lua +msgid "Cheese Block" +msgstr "Bloco de Queijo" + +#: init.lua +msgid "[MOD] Mobs Redo 'Animals' loaded" +msgstr "[MOBS_ANIMAL] Mod carregado completamente" + +#: kitten.lua +msgid "Kitten" +msgstr "Gato" + +#: penguin.lua +msgid "Penguin" +msgstr "Pinguim" + +#: rat.lua +msgid "Rat" +msgstr "Rato" + +#: rat.lua +msgid "Cooked Rat" +msgstr "Rato (Assado)" + +#: sheep.lua +msgid "Black" +msgstr "Preto" + +#: sheep.lua +msgid "Blue" +msgstr "Azul" + +#: sheep.lua +msgid "Brown" +msgstr "Marrom" + +#: sheep.lua +msgid "Cyan" +msgstr "Ciano" + +#: sheep.lua +msgid "Dark Green" +msgstr "Verde Escuro" + +#: sheep.lua +msgid "Dark Grey" +msgstr "Cinza Escuro" + +#: sheep.lua +msgid "Green" +msgstr "Verde" + +#: sheep.lua +msgid "Grey" +msgstr "Cinza" + +#: sheep.lua +msgid "Magenta" +msgstr "Rosa Magenta" + +#: sheep.lua +msgid "Orange" +msgstr "Laranja" + +#: sheep.lua +msgid "Pink" +msgstr "Rosa" + +#: sheep.lua +msgid "Red" +msgstr "Vermelho" + +#: sheep.lua +msgid "Violet" +msgstr "Violeta" + +#: sheep.lua +msgid "White" +msgstr "Branco" + +#: sheep.lua +msgid "Yellow" +msgstr "Amarelo" + +#: sheep.lua +msgid "@1 Sheep" +msgstr "Ovelha @1 " + +#: sheep.lua +msgid "Raw Mutton" +msgstr "Carneiro (Cru)" + +#: sheep.lua +msgid "Cooked Mutton" +msgstr "Carneiro (Assado)" + +#: warthog.lua +msgid "Warthog" +msgstr "Javali" + +#: warthog.lua +msgid "Raw Porkchop" +msgstr "Costeleta de Javali (Crua)" + +#: warthog.lua +msgid "Cooked Porkchop" +msgstr "Costeleta de Javali Assada" diff --git a/mods/mobs_animal/locale/pt_BR.txt b/mods/mobs_animal/locale/pt_BR.txt new file mode 100644 index 00000000..60d9f5c1 --- /dev/null +++ b/mods/mobs_animal/locale/pt_BR.txt @@ -0,0 +1,46 @@ +# textdomain: Lunovox Heavenfinder (https://libreplanet.org/wiki/User:Lunovox) +Bee=Abelha +Honey=Mel +Beehive=Colméia +Honey Block=Bloco de Mel +Bunny=Coelho +Raw Rabbit=Carne de Coelho (Cru) +Cooked Rabbit=Coelho (Assado) +Rabbit Hide=Pele de Coelho +Chicken=Galinha +Chicken Egg=Ovo de Galinha +Fried Egg=Ovo Frito +Raw Chicken=Carne de Galinha (Crua) +Cooked Chicken=Galinha Assada +Feather=Pluma +Cow already milked!=Vaca já ordenhada! +Cow=Vaca +Bucket of Milk=Balde de leite +Cheese=Queijo +Cheese Block=Bloco de Queijo +[MOD] Mobs Redo 'Animals' loaded=[MOBS_ANIMAL] Mod carregado completamente +Kitten=Gato +Penguin=Pinguim +Rat=Rato +Cooked Rat=Rato (Assado) +Black=Preto +Blue=Azul +Brown=Marrom +Cyan=Ciano +Dark Green=Verde Escuro +Dark Grey=Cinza Escuro +Green=Verde +Grey=Cinza +Magenta=Rosa Magenta +Orange=Laranja +Pink=Rosa +Red=Vermelho +Violet=Violeta +White=Branco +Yellow=Amarelo +@1 Sheep=Ovelha @1 +Raw Mutton=Carneiro (Cru) +Cooked Mutton=Carneiro (Assado) +Warthog=Javali +Raw Porkchop=Costeleta de Javali (Crua) +Cooked Porkchop=Costeleta de Javali Assada diff --git a/mods/mobs_monster/lava_flan.lua b/mods/mobs_monster/lava_flan.lua index 6e355fe2..1e957e36 100644 --- a/mods/mobs_monster/lava_flan.lua +++ b/mods/mobs_monster/lava_flan.lua @@ -36,7 +36,7 @@ mobs:register_mob("mobs_monster:lava_flan", { {name = "mobs:lava_orb", chance = 15, min = 1, max = 1}, }, water_damage = 8, - lava_damage = 0, + lava_damage = -1, fire_damage = 0, light_damage = 0, immune_to = { @@ -53,7 +53,7 @@ mobs:register_mob("mobs_monster:lava_flan", { run_start = 20, run_end = 28, punch_start = 20, - punch_end = 28, + punch_end = 28 }, on_die = function(self, pos) @@ -174,9 +174,13 @@ minetest.register_tool(":mobs:pick_lava", { inventory_image = "mobs_pick_lava.png", tool_capabilities = { full_punch_interval = 0.4, - max_drop_level=3, - groupcaps={ - cracky = {times={[1]=1.80, [2]=0.80, [3]=0.40}, uses=40, maxlevel=3}, + max_drop_level = 3, + groupcaps = { + cracky = { + times = {[1] = 1.80, [2] = 0.80, [3] = 0.40}, + uses = 40, + maxlevel = 3 + } }, damage_groups = {fleshy = 6, fire = 1}, }, @@ -189,7 +193,7 @@ minetest.register_craft({ recipe = { {"mobs:lava_orb", "mobs:lava_orb", "mobs:lava_orb"}, {"", "default:obsidian_shard", ""}, - {"", "default:obsidian_shard", ""}, + {"", "default:obsidian_shard", ""} } }) @@ -253,7 +257,7 @@ mobs:register_mob("mobs_monster:obsidian_flan", { run_start = 20, run_end = 28, punch_start = 20, - punch_end = 28, + punch_end = 28 } }) @@ -296,9 +300,11 @@ mobs:register_arrow("mobs_monster:obsidian_arrow", { local radius = 1 local def = minetest.registered_nodes[node] + if def then - node = { name = node } + node = {name = node} end + if def and def.tiles and def.tiles[1] then texture = def.tiles[1] end @@ -325,7 +331,7 @@ mobs:register_arrow("mobs_monster:obsidian_arrow", { texture = texture, -- ^ only as fallback for clients without support for `node` parameter node = node, - collisiondetection = true, + collisiondetection = true }) minetest.set_node(pos, {name = "air"}) diff --git a/mods/mobs_redo/api.lua b/mods/mobs_redo/api.lua index 172e317d..0e2c62d7 100644 --- a/mods/mobs_redo/api.lua +++ b/mods/mobs_redo/api.lua @@ -8,7 +8,7 @@ local use_cmi = minetest.global_exists("cmi") mobs = { mod = "redo", - version = "20210610", + version = "20210614", intllib = S, invis = minetest.global_exists("invisibility") and invisibility or {} } @@ -28,8 +28,7 @@ local rad = math.rad local atann = math.atan local atan = function(x) if not x or x ~= x then - --error("atan bassed NaN") - return 0 + return 0 -- NaN else return atann(x) end @@ -225,9 +224,6 @@ function mob_class:collision() for _,object in ipairs(minetest.get_objects_inside_radius(pos, width)) do if object:is_player() then --- or (object:get_luaentity() --- and object:get_luaentity()._cmi_is_mob == true --- and object ~= self.object) then local pos2 = object:get_pos() local vec = {x = pos.x - pos2.x, z = pos.z - pos2.z} @@ -406,7 +402,6 @@ function mob_class:set_animation(anim, force) 0, self.animation[anim .. "_loop"] ~= false) end --- above function exported for mount.lua function mobs:set_animation(entity, anim) entity.set_animation(entity, anim) end @@ -593,7 +588,7 @@ function mob_class:attempt_flight_correction(override) local escape_direction = vdirection(pos, escape_target) self.object:set_velocity( - vmultiply(escape_direction, 1)) --self.run_velocity)) + vmultiply(escape_direction, 1)) return true end @@ -645,7 +640,7 @@ function mobs:yaw_to_pos(self, target, rot) end --- if stay near set then check periodically for nodes and turn towards them +-- if stay near set then periodically check for nodes and turn towards them function mob_class:do_stay_near() if not self.stay_near then return false end @@ -742,9 +737,15 @@ function mob_class:update_tag() col = "#FF0000" end + -- build infotext + self.infotext = "Health: " .. self.health .. " / " .. self.hp_max + .. "\n" .. "Owner: " .. self.owner + + -- set changes self.object:set_properties({ nametag = self.nametag, - nametag_color = col + nametag_color = col, + infotext = self.infotext }) end @@ -792,10 +793,7 @@ function mob_class:item_drop() end -- only drop rare items (drops.min = 0) if killed by player - if death_by_player then - obj = minetest.add_item(pos, ItemStack(item .. " " .. num)) - - elseif self.drops[n].min ~= 0 then + if death_by_player or self.drops[n].min ~= 0 then obj = minetest.add_item(pos, ItemStack(item .. " " .. num)) end @@ -870,18 +868,17 @@ function mob_class:check_for_death(cmi_cause) end -- backup nametag so we can show health stats - if not self.nametag2 then - self.nametag2 = self.nametag or "" - end +-- if not self.nametag2 then +-- self.nametag2 = self.nametag or "" +-- end - if show_health - and (cmi_cause and cmi_cause.type == "punch") then - - self.htimer = 2 - self.nametag = "♥ " .. self.health .. " / " .. self.hp_max +-- if show_health +-- and (cmi_cause and cmi_cause.type == "punch") then +-- self.htimer = 2 +-- self.nametag = "♥ " .. self.health .. " / " .. self.hp_max self:update_tag() - end +-- end return false end @@ -1051,13 +1048,13 @@ function mob_class:do_env_damage() end -- reset nametag after showing health stats - if self.htimer < 1 and self.nametag2 then +-- if self.htimer < 1 and self.nametag2 then - self.nametag = self.nametag2 - self.nametag2 = nil +-- self.nametag = self.nametag2 +-- self.nametag2 = nil self:update_tag() - end +-- end local pos = self.object:get_pos() ; if not pos then return end @@ -1081,8 +1078,7 @@ function mob_class:do_env_damage() local nodef = minetest.registered_nodes[self.standing_in] -- water - if self.water_damage ~= 0 - and nodef.groups.water then + if self.water_damage ~= 0 and nodef.groups.water then self.health = self.health - self.water_damage @@ -1094,8 +1090,7 @@ function mob_class:do_env_damage() end -- lava damage - elseif self.lava_damage ~= 0 - and nodef.groups.lava then + elseif self.lava_damage ~= 0 and nodef.groups.lava then self.health = self.health - self.lava_damage @@ -1107,8 +1102,7 @@ function mob_class:do_env_damage() end -- fire damage - elseif self.fire_damage ~= 0 - and nodef.groups.fire then + elseif self.fire_damage ~= 0 and nodef.groups.fire then self.health = self.health - self.fire_damage @@ -1241,58 +1235,58 @@ function mob_class:do_jump() local blocked = minetest.registered_nodes[nodt.name].walkable ---print("standing on:", self.standing_on, pos.y - 0.25) ---print("in front:", nod.name, pos.y + 0.5) ---print("in front above:", nodt.name, pos.y + 1.5) + -- are we facing a fence or wall + if nod.name:find("fence") or nod.name:find("gate") or nod.name:find("wall") then + self.facing_fence = true + end +--[[ +print("on: " .. self.standing_on + .. ", front: " .. nod.name + .. ", front above: " .. nodt.name + .. ", blocked: " .. (blocked and "yes" or "no") + .. ", fence: " .. (self.facing_fence and "yes" or "no") +) +]] + -- jump if standing on solid node (not snow) and not blocked + if (self.walk_chance == 0 or minetest.registered_items[nod.name].walkable) + and not blocked and not self.facing_fence and nod.name ~= node_snow then - -- jump if standing on solid node (not snow) and not blocked above - if (self.walk_chance == 0 - or minetest.registered_items[nod.name].walkable) - and not blocked - and nod.name ~= node_snow then + local v = self.object:get_velocity() - if not nod.name:find("fence") - and not nod.name:find("gate") - and not nod.name:find("wall") then + v.y = self.jump_height - local v = self.object:get_velocity() + self:set_animation("jump") -- only when defined - v.y = self.jump_height + self.object:set_velocity(v) - self:set_animation("jump") -- only when defined + -- when in air move forward + minetest.after(0.3, function(self, v) - self.object:set_velocity(v) + if self.object:get_luaentity() then - -- when in air move forward - minetest.after(0.3, function(self, v) - - if self.object:get_luaentity() then - - self.object:set_acceleration({ - x = v.x * 2, - y = 0, - z = v.z * 2 - }) - end - end, self, v) - - if self:get_velocity() > 0 then - self:mob_sound(self.sounds.jump) + self.object:set_acceleration({ + x = v.x * 2, + y = 0, + z = v.z * 2 + }) end + end, self, v) - return true - else - self.facing_fence = true + if self:get_velocity() > 0 then + self:mob_sound(self.sounds.jump) end + + self.jump_count = 0 + + return true end - -- if blocked against a block/wall for 5 counts then turn - if not self.following - and (self.facing_fence or blocked) then + -- if blocked for 3 counts then turn + if not self.following and (self.facing_fence or blocked) then self.jump_count = (self.jump_count or 0) + 1 - if self.jump_count > 4 then + if self.jump_count > 2 then local yaw = self.object:get_yaw() or 0 local turn = random(0, 2) + 1.35 @@ -1363,7 +1357,7 @@ end -- Thanks Wuzzy for the following editable settings local HORNY_TIME = 30 -local HORNY_AGAIN_TIME = 300 +local HORNY_AGAIN_TIME = 60 * 5 -- 5 minutes local CHILD_GROW_TIME = 60 * 20 -- 20 minutes -- find two animals of same type and breed if nearby and horny @@ -1391,16 +1385,15 @@ function mob_class:breed() if self.on_grown then self.on_grown(self) else - -- jump when fully grown so as not to fall into ground --- self.object:set_velocity({ --- x = 0, --- y = self.jump_height, --- z = 0 --- }) local pos = self.object:get_pos() ; if not pos then return end local ent = self.object:get_luaentity() + pos.y = pos.y + (ent.collisionbox[2] * -1) - 0.4 + self.object:set_pos(pos) + + -- jump slightly when fully grown so as not to fall into ground + self.object:set_velocity({x = 0, y = 0.5, z = 0 }) end end @@ -1623,6 +1616,40 @@ end local los_switcher = false local height_switcher = false +local can_dig_drop = function(pos) + + if minetest.is_protected(pos, "") then + return false + end + + local node = node_ok(pos, "air").name + local ndef = minetest.registered_nodes[node] + + if node ~= "ignore" + and ndef + and ndef.drawtype ~= "airlike" + and not ndef.groups.level + and not ndef.groups.unbreakable + and not ndef.groups.liquid then + + local drops = minetest.get_node_drops(node) + + for _, item in ipairs(drops) do + + minetest.add_item({ + x = pos.x - 0.5 + random(), + y = pos.y - 0.5 + random(), + z = pos.z - 0.5 + random() + }, item) + end + + minetest.remove_node(pos) + + return true + end + + return false +end -- path finding and smart mob routine by rnd, -- line_of_sight and other edits by Elkien3 @@ -1788,8 +1815,8 @@ function mob_class:smart_mobs(s, p, dist, dtime) -- lets make way by digging/building if not accessible if self.pathfinding == 2 and mobs_griefing then - -- is player higher than mob? - if s.y < p1.y then + -- is player more than 1 block higher than mob? + if p1.y > (s.y + 1) then -- build upwards if not minetest.is_protected(s, "") then @@ -1797,8 +1824,7 @@ function mob_class:smart_mobs(s, p, dist, dtime) local ndef1 = minetest.registered_nodes[self.standing_in] if ndef1 and (ndef1.buildable_to or ndef1.groups.liquid) then - - minetest.set_node(s, {name = mobs.fallback_node}) + minetest.set_node(s, {name = mobs.fallback_node}) end end @@ -1808,27 +1834,19 @@ function mob_class:smart_mobs(s, p, dist, dtime) s.y = s.y + sheight -- remove one block above to make room to jump - if not minetest.is_protected(s, "") then - - local node1 = node_ok(s, "air").name - local ndef1 = minetest.registered_nodes[node1] - - if node1 ~= "air" - and node1 ~= "ignore" - and ndef1 - and not ndef1.groups.level - and not ndef1.groups.unbreakable - and not ndef1.groups.liquid then - - minetest.set_node(s, {name = "air"}) - minetest.add_item(s, ItemStack(node1)) - - end - end + can_dig_drop(s) s.y = s.y - sheight self.object:set_pos({x = s.x, y = s.y + 2, z = s.z}) + -- is player more than 1 block lower than mob + elseif p1.y < (s.y - 1) then + + -- dig down + s.y = s.y - self.collisionbox[4] - 0.2 + + can_dig_drop(s) + else -- dig 2 blocks to make door toward player direction local yaw1 = self.object:get_yaw() + pi / 2 @@ -1838,37 +1856,12 @@ function mob_class:smart_mobs(s, p, dist, dtime) z = s.z + sin(yaw1) } - if not minetest.is_protected(p1, "") then + -- dig bottom node first incase of door + can_dig_drop(p1) - local node1 = node_ok(p1, "air").name - local ndef1 = minetest.registered_nodes[node1] + p1.y = p1.y + 1 - if node1 ~= "air" - and node1 ~= "ignore" - and ndef1 - and not ndef1.groups.level - and not ndef1.groups.unbreakable - and not ndef1.groups.liquid then - - minetest.add_item(p1, ItemStack(node1)) - minetest.set_node(p1, {name = "air"}) - end - - p1.y = p1.y + 1 - node1 = node_ok(p1, "air").name - ndef1 = minetest.registered_nodes[node1] - - if node1 ~= "air" - and node1 ~= "ignore" - and ndef1 - and not ndef1.groups.level - and not ndef1.groups.unbreakable - and not ndef1.groups.liquid then - - minetest.add_item(p1, ItemStack(node1)) - minetest.set_node(p1, {name = "air"}) - end - end + can_dig_drop(p1) end end @@ -2600,7 +2593,10 @@ function mob_class:do_states(dtime) self:smart_mobs(s, p, dist, dtime) end - if self.at_cliff then + -- distance padding to stop spinning mob + local pad = abs(p.x - s.x) + abs(p.z - s.z) + + if self.at_cliff or pad < 0.2 then self:set_velocity(0) self:set_animation("stand") @@ -2618,7 +2614,6 @@ function mob_class:do_states(dtime) self:set_animation("walk") end end - else -- rnd: if inside reach range self.path.stuck = false @@ -2765,11 +2760,7 @@ function mob_class:falling(pos) end -- fall at set speed - self.object:set_acceleration({ - x = 0, - y = fall_speed, - z = 0 - }) + self.object:set_acceleration({x = 0, y = fall_speed, z = 0}) end @@ -2792,8 +2783,9 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) -- error checking when mod profiling is enabled if not tool_capabilities then - minetest.log("warning", - "[mobs] Mod profiling enabled, damage not enabled") + + minetest.log("warning", "[mobs] Mod profiling enabled, damage not enabled") + return true end @@ -2869,6 +2861,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) if self.immune_to[n][1] == weapon_def.name then damage = self.immune_to[n][2] or 0 + break -- if "all" then no tools deal damage unless it's specified in list @@ -2881,13 +2874,14 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) -- healing if damage <= -1 then + self.health = self.health - floor(damage) + return true end if use_cmi - and cmi.notify_punch( - self.object, hitter, tflp, tool_capabilities, dir, damage) then + and cmi.notify_punch(self.object, hitter, tflp, tool_capabilities, dir, damage) then return true end @@ -2906,10 +2900,8 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) end end - if tr then - if weapon_def.original_description then - toolranks.new_afteruse(weapon, hitter, nil, {wear = wear}) - end + if tr and weapon_def.original_description then + toolranks.new_afteruse(weapon, hitter, nil, {wear = wear}) else weapon:add_wear(wear) end @@ -2957,20 +2949,6 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) if self:check_for_death({type = "punch", puncher = hitter, hot = hot}) then return true end - - --[[ add healthy afterglow when hit (causes lag with large textures) - minetest.after(0.1, function() - - if not self.object:get_luaentity() then return end - - self.object:set_texture_mod("^[colorize:#c9900070") - - minetest.after(0.3, function() - if not self.object:get_luaentity() then return end - self.object:set_texture_mod(self.texture_mods) - end) - end) ]] - end -- END if damage -- knock back effect (only on full punch) @@ -2996,11 +2974,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage) -- use tool knockback value or default kb = tool_capabilities.damage_groups["knockback"] or kb - self.object:set_velocity({ - x = dir.x * kb, - y = up, - z = dir.z * kb - }) + self.object:set_velocity({x = dir.x * kb, y = up, z = dir.z * kb}) self.pause_timer = 0.25 end @@ -3247,10 +3221,8 @@ function mob_class:mob_activate(staticdata, def, dtime) local armor if type(self.armor) == "table" then armor = table_copy(self.armor) --- armor.immortal = 1 else --- armor = {immortal = 1, fleshy = self.armor} - armor = {fleshy = self.armor} + armor = {fleshy = self.armor} -- immortal = 1 end self.object:set_armor_groups(armor) @@ -3348,23 +3320,7 @@ end -- main mob function function mob_class:on_step(dtime, moveresult) - --[[ moveresult contains this for physical mobs - { - touching_ground = boolean, - collides = boolean, - standing_on_object = boolean, - collisions = { - { - type = string, -- "node" or "object", - axis = string, -- "x", "y" or "z" - node_pos = vector, -- if type is "node" - object = ObjectRef, -- if type is "object" - old_velocity = vector, - new_velocity = vector, - }} - }]] - -if self.state == "die" then return end ---------------- + if self.state == "die" then return end if use_cmi then cmi.notify_step(self.object, dtime) @@ -3890,11 +3846,13 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, inter local numbers = settings:get(name) if numbers then + numbers = numbers:split(",") chance = tonumber(numbers[1]) or chance aoc = tonumber(numbers[2]) or aoc if chance == 0 then + minetest.log("warning", string.format("[mobs] %s has spawning disabled", name)) return @@ -4678,14 +4636,14 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) self.health = self.hp_max - if self.htimer < 1 then +-- if self.htimer < 1 then - minetest.chat_send_player(clicker:get_player_name(), - S("@1 at full health (@2)", - self.name:split(":")[2], tostring(self.health))) +-- minetest.chat_send_player(clicker:get_player_name(), +-- S("@1 at full health (@2)", +-- self.name:split(":")[2], tostring(self.health))) - self.htimer = 5 - end +-- self.htimer = 5 +-- end end self.object:set_hp(self.health) diff --git a/mods/pie/depends.txt b/mods/pie/depends.txt index c347c947..db708947 100644 --- a/mods/pie/depends.txt +++ b/mods/pie/depends.txt @@ -2,4 +2,5 @@ default hunger? hbhunger? stamina? -lucky_block? \ No newline at end of file +lucky_block? +screwdriver? diff --git a/mods/pie/init.lua b/mods/pie/init.lua index 139f38e1..2fd99ee9 100644 --- a/mods/pie/init.lua +++ b/mods/pie/init.lua @@ -4,8 +4,10 @@ local hmod = minetest.global_exists("hunger") local hbmod = minetest.global_exists("hbhunger") local stmod = minetest.global_exists("stamina") +local screwdriver_exists = minetest.global_exists("screwdriver") + -- eat pie slice function -local replace_pie = function(node, puncher, pos) +local function replace_pie(node, puncher, pos) -- is this my pie? if minetest.is_protected(pos, puncher:get_player_name()) then @@ -41,7 +43,11 @@ local replace_pie = function(node, puncher, pos) node.name = pie .. "_" .. (num + 1) end - minetest.swap_node(pos, {name = node.name}) + minetest.swap_node(pos, node) + + if num == 3 then + minetest.check_for_falling(pos) + end -- Blockmen's hud_hunger mod if hmod then @@ -91,12 +97,13 @@ end -- register pie bits -local register_pie = function(pie, desc) +local function register_pie(pie, desc) -- full pie minetest.register_node("pie:" .. pie .. "_0", { description = desc, paramtype = "light", + paramtype2 = "facedir", use_texture_alpha = "clip", sunlight_propagates = false, tiles = { @@ -108,9 +115,11 @@ local register_pie = function(pie, desc) drawtype = "nodebox", node_box = { type = "fixed", - fixed = {{-0.45, -0.5, -0.45, 0.45, 0, 0.45}} + fixed = {-0.45, -0.5, -0.45, 0.45, 0, 0.45} }, + on_rotate = screwdriver_exists and screwdriver.rotate_simple, + on_punch = function(pos, node, puncher, pointed_thing) replace_pie(node, puncher, pos) end @@ -118,8 +127,9 @@ local register_pie = function(pie, desc) -- 3/4 pie minetest.register_node("pie:" .. pie .. "_1", { - description = "3/4" .. desc, + description = "3/4 " .. desc, paramtype = "light", + paramtype2 = "facedir", use_texture_alpha = "clip", sunlight_propagates = true, tiles = { @@ -131,9 +141,11 @@ local register_pie = function(pie, desc) drawtype = "nodebox", node_box = { type = "fixed", - fixed = {{-0.45, -0.5, -0.25, 0.45, 0, 0.45}} + fixed = {-0.45, -0.5, -0.25, 0.45, 0, 0.45} }, + on_rotate = screwdriver_exists and screwdriver.rotate_simple, + on_punch = function(pos, node, puncher, pointed_thing) replace_pie(node, puncher, pos) end @@ -143,6 +155,7 @@ local register_pie = function(pie, desc) minetest.register_node("pie:" .. pie .. "_2", { description = "Half " .. desc, paramtype = "light", + paramtype2 = "facedir", use_texture_alpha = "clip", sunlight_propagates = true, tiles = { @@ -154,9 +167,11 @@ local register_pie = function(pie, desc) drawtype = "nodebox", node_box = { type = "fixed", - fixed = {{-0.45, -0.5, 0.0, 0.45, 0, 0.45}} + fixed = {-0.45, -0.5, 0.0, 0.45, 0, 0.45} }, + on_rotate = screwdriver_exists and screwdriver.rotate_simple, + on_punch = function(pos, node, puncher, pointed_thing) replace_pie(node, puncher, pos) end @@ -166,6 +181,7 @@ local register_pie = function(pie, desc) minetest.register_node("pie:" .. pie .. "_3", { description = "Piece of " .. desc, paramtype = "light", + paramtype2 = "facedir", use_texture_alpha = "clip", sunlight_propagates = true, tiles = { @@ -177,9 +193,11 @@ local register_pie = function(pie, desc) drawtype = "nodebox", node_box = { type = "fixed", - fixed = {{-0.45, -0.5, 0.25, 0.45, 0, 0.45}} + fixed = {-0.45, -0.5, 0.25, 0.45, 0, 0.45} }, + on_rotate = screwdriver_exists and screwdriver.rotate_simple, + on_punch = function(pos, node, puncher, pointed_thing) replace_pie(node, puncher, pos) end @@ -197,7 +215,7 @@ minetest.register_craft({ {"group:food_sugar", "group:food_egg", "group:food_sugar"}, {"group:food_wheat", "group:food_flour", "group:food_wheat"} }, - replacements = {{ "mobs:bucket_milk", "bucket:bucket_empty"}} + replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} }) @@ -211,7 +229,7 @@ minetest.register_craft({ {"group:food_sugar", "group:food_egg", "group:food_sugar"}, {"group:food_wheat", "group:food_flour", "group:food_wheat"} }, - replacements = {{ "mobs:bucket_milk", "bucket:bucket_empty"}} + replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} }) @@ -225,7 +243,7 @@ minetest.register_craft({ {"group:food_sugar", "group:food_egg", "group:food_sugar"}, {"group:food_wheat", "group:food_flour", "group:food_wheat"} }, - replacements = {{ "mobs:bucket_milk", "bucket:bucket_empty"}} + replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} }) @@ -239,7 +257,7 @@ minetest.register_craft({ {"group:food_sugar", "group:food_egg", "group:food_sugar"}, {"group:food_wheat", "group:food_flour", "group:food_wheat"} }, - replacements = {{ "mobs:bucket_milk", "bucket:bucket_empty"}} + replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} }) @@ -253,7 +271,7 @@ minetest.register_craft({ {"group:food_sugar", "group:food_egg", "group:food_sugar"}, {"group:food_flour", "group:food_cheese", "group:food_flour"} }, - replacements = {{ "mobs:bucket_milk", "bucket:bucket_empty"}} + replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} }) @@ -279,12 +297,12 @@ minetest.register_craft({ {"group:food_sugar", "group:food_egg", "group:food_sugar"}, {"group:food_wheat", "group:food_flour", "group:food_wheat"} }, - replacements = {{ "mobs:bucket_milk", "bucket:bucket_empty"}} + replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} }) -- bread pudding -register_pie("brpd","Bread Pudding") +register_pie("brpd", "Bread Pudding") minetest.register_craft({ output = "pie:brpd_0", @@ -293,12 +311,12 @@ minetest.register_craft({ {"group:food_sugar", "group:food_egg", "group:food_sugar"}, {"group:food_wheat", "group:food_flour", "group:food_wheat"} }, - replacements = {{ "mobs:bucket_milk", "bucket:bucket_empty"}} + replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} }) -- orange pie -register_pie("orange","Orange Pie") +register_pie("orange", "Orange Pie") minetest.register_craft({ output = "pie:orange_0", @@ -307,7 +325,7 @@ minetest.register_craft({ {"group:food_sugar", "group:food_egg", "group:food_sugar"}, {"group:food_wheat", "group:food_flour", "group:food_wheat"} }, - replacements = {{ "mobs:bucket_milk", "bucket:bucket_empty"}} + replacements = {{"mobs:bucket_milk", "bucket:bucket_empty"}} }) @@ -343,4 +361,4 @@ minetest.register_alias("pie:sugar", "farming:sugar") minetest.register_alias("pie:knife", "default:sword_steel") -print ("[MOD] Pie loaded") +print("[MOD] Pie loaded") diff --git a/mods/pie/mod.conf b/mods/pie/mod.conf index 716dd5ea..d1efb598 100644 --- a/mods/pie/mod.conf +++ b/mods/pie/mod.conf @@ -1,4 +1,4 @@ name = pie depends = default -optional_depends = hunger, hbhunger, stamina, lucky_block +optional_depends = hunger, hbhunger, stamina, lucky_block, screwdriver description = Add a selection of tasty Pie/Cakes to eat. diff --git a/mods/plantlife_modpack/bushes/init.lua b/mods/plantlife_modpack/bushes/init.lua index 4be5a61e..64a9adf0 100644 --- a/mods/plantlife_modpack/bushes/init.lua +++ b/mods/plantlife_modpack/bushes/init.lua @@ -26,7 +26,7 @@ node_box = { {-0.0612,-0.500000,-0.500000,0.0612,0.500000,-0.375000}, --NodeBox 1 } }, - groups = {snappy=3,flammable=2}, + groups = {snappy=3,flammable=2,attached_node=1}, sounds = default.node_sound_leaves_defaults(), drop = 'default:stick' }) @@ -61,7 +61,8 @@ for i in pairs(BushBranchCenter) do -- tree=1, -- MM: disabled because some recipes use group:tree for trunks snappy=3, flammable=2, - leaves=1 + leaves=1, + attached_node=1 }, sounds = default.node_sound_leaves_defaults(), drop = 'default:stick 4' @@ -104,7 +105,8 @@ for i in pairs(BushBranchSide) do -- tree=1, -- MM: disabled because some recipes use group:tree for trunks snappy=3, flammable=2, - leaves=1 + leaves=1, + attached_node=1 }, sounds = default.node_sound_leaves_defaults(), drop = 'default:stick 3' diff --git a/mods/plantlife_modpack/cavestuff/nodes.lua b/mods/plantlife_modpack/cavestuff/nodes.lua index 654ceeb8..7dcf6b75 100644 --- a/mods/plantlife_modpack/cavestuff/nodes.lua +++ b/mods/plantlife_modpack/cavestuff/nodes.lua @@ -15,7 +15,7 @@ minetest.register_node("cavestuff:pebble_1",{ tiles = {"undergrowth_pebble.png"}, paramtype = "light", paramtype2 = "facedir", - groups = {cracky=3, stone=1}, + groups = {cracky=3, stone=1, attached_node=1}, selection_box = cbox, collision_box = cbox, on_place = function(itemstack, placer, pointed_thing) @@ -35,7 +35,7 @@ minetest.register_node("cavestuff:pebble_2",{ tiles = {"undergrowth_pebble.png"}, paramtype = "light", paramtype2 = "facedir", - groups = {cracky=3, stone=1, not_in_creative_inventory=1}, + groups = {cracky=3, stone=1, attached_node=1, not_in_creative_inventory=1}, selection_box = cbox, collision_box = cbox, sounds = default.node_sound_stone_defaults(), @@ -48,7 +48,7 @@ minetest.register_node("cavestuff:desert_pebble_1",{ tiles = {"default_desert_stone.png"}, paramtype = "light", paramtype2 = "facedir", - groups = {cracky=3, stone=1}, + groups = {cracky=3, stone=1, attached_node=1}, selection_box = cbox, collision_box = cbox, on_place = function(itemstack, placer, pointed_thing) @@ -67,7 +67,7 @@ minetest.register_node("cavestuff:desert_pebble_2",{ tiles = {"default_desert_stone.png"}, paramtype = "light", paramtype2 = "facedir", - groups = {cracky=3, stone=1, not_in_creative_inventory=1}, + groups = {cracky=3, stone=1, attached_node=1, not_in_creative_inventory=1}, selection_box = cbox, collision_box = cbox, sounds = default.node_sound_stone_defaults(), diff --git a/mods/plantlife_modpack/trunks/generating.lua b/mods/plantlife_modpack/trunks/generating.lua index 699baf97..f693df6c 100644 --- a/mods/plantlife_modpack/trunks/generating.lua +++ b/mods/plantlife_modpack/trunks/generating.lua @@ -4,28 +4,44 @@ -- TWiGS ----------------------------------------------------------------------------------------------- +local fakenode = { + name = "default:stone", -- could be anything that's guaranteed to exist at mapgen time, and isn't buildable_to + param1 = 0, + param2 = 0 +} + abstract_trunks.place_twig = function(pos) - local twig_size = math.random(1,27) + local twig_size = math.random(1,27) - local right_here = {x=pos.x , y=pos.y+1, z=pos.z } - local north = {x=pos.x , y=pos.y+1, z=pos.z+1} - local north_east = {x=pos.x+1, y=pos.y+1, z=pos.z+1} - local east = {x=pos.x+1, y=pos.y+1, z=pos.z } - local south_east = {x=pos.x+1, y=pos.y+1, z=pos.z-1} - local south = {x=pos.x , y=pos.y+1, z=pos.z-1} - local south_west = {x=pos.x-1, y=pos.y+1, z=pos.z-1} - local west = {x=pos.x-1, y=pos.y+1, z=pos.z } - local north_west = {x=pos.x-1, y=pos.y+1, z=pos.z+1} + local right_here = {x=pos.x , y=pos.y+1, z=pos.z } + local north = {x=pos.x , y=pos.y+1, z=pos.z+1} + local north_east = {x=pos.x+1, y=pos.y+1, z=pos.z+1} + local east = {x=pos.x+1, y=pos.y+1, z=pos.z } + local south_east = {x=pos.x+1, y=pos.y+1, z=pos.z-1} + local south = {x=pos.x , y=pos.y+1, z=pos.z-1} + local south_west = {x=pos.x-1, y=pos.y+1, z=pos.z-1} + local west = {x=pos.x-1, y=pos.y+1, z=pos.z } + local north_west = {x=pos.x-1, y=pos.y+1, z=pos.z+1} + + local node_here = minetest.get_node(right_here) + local node_north = minetest.get_node(north) + local node_n_e = minetest.get_node(north_east) + local node_east = minetest.get_node(east) + local node_s_e = minetest.get_node(south_east) + local node_south = minetest.get_node(south) + local node_s_w = minetest.get_node(south_west) + local node_west = minetest.get_node(west) + local node_n_w = minetest.get_node(north_west) + + node_north = minetest.registered_nodes[node_north.name] and node_north or fakenode + node_n_e = minetest.registered_nodes[node_n_e.name] and node_n_e or fakenode + node_east = minetest.registered_nodes[node_east.name] and node_east or fakenode + node_s_e = minetest.registered_nodes[node_s_e.name] and node_s_e or fakenode + node_south = minetest.registered_nodes[node_south.name] and node_south or fakenode + node_s_w = minetest.registered_nodes[node_s_w.name] and node_s_w or fakenode + node_west = minetest.registered_nodes[node_west.name] and node_west or fakenode + node_n_w = minetest.registered_nodes[node_n_w.name] and node_n_w or fakenode - local node_here = minetest.get_node(right_here) - local node_north = minetest.get_node(north) - local node_n_e = minetest.get_node(north_east) - local node_east = minetest.get_node(east) - local node_s_e = minetest.get_node(south_east) - local node_south = minetest.get_node(south) - local node_s_w = minetest.get_node(south_west) - local node_west = minetest.get_node(west) - local node_n_w = minetest.get_node(north_west) -- small twigs if twig_size <= 16 then minetest.swap_node(right_here, {name="trunks:twig_"..math.random(1,4), param2=math.random(0,3)}) @@ -356,11 +372,12 @@ if Moss_on_ground == true then abstract_trunks.grow_moss_on_ground = function(pos) local on_ground = {x=pos.x, y=pos.y+1, z=pos.z} local moss_type = math.random(1,21) + local rot = math.random(0,3) if moss_type == 1 then - minetest.swap_node(on_ground, {name="trunks:moss_fungus", param2=math.random(0,3)}) + minetest.swap_node(on_ground, {name="trunks:moss_with_fungus_"..rot, param2=1}) else - minetest.swap_node(on_ground, {name="trunks:moss", param2=math.random(0,3)}) + minetest.swap_node(on_ground, {name="trunks:moss_plain_"..rot, param2=1}) end end @@ -406,44 +423,49 @@ abstract_trunks.grow_moss_on_trunk = function(pos) local node_under = minetest.get_node(undrneath) --if minetest.get_item_group(node_under.name, "tree") < 1 then - local moss_type = math.random(1,41) - if minetest.registered_nodes[node_here.name].buildable_to then -- instead of check_air = true, + if minetest.registered_nodes[node_here.name].buildable_to then + local moss_type = math.random(1,41) + local rot = math.random(0,3) if moss_type == 1 then - minetest.swap_node(on_ground, {name="trunks:moss_fungus", param2=math.random(0,3) --[[1]]}) + minetest.swap_node(on_ground, {name="trunks:moss_with_fungus_"..rot, param2=1}) elseif moss_type < 22 then - minetest.swap_node(on_ground, {name="trunks:moss", param2=math.random(0,3) --[[1]]}) + minetest.swap_node(on_ground, {name="trunks:moss_plain_"..rot, param2=1}) end end - local moss_type = math.random(1,31) -- cliche of more moss at north - if minetest.registered_nodes[node_north.name].buildable_to then -- instead of check_air = true, + if minetest.registered_nodes[node_north.name].buildable_to then + local moss_type = math.random(1,31) -- cliche of more moss at north + local rot = math.random(0,3) if moss_type == 1 then - minetest.swap_node(at_side_n, {name="trunks:moss_fungus", param2=math.random(4,7)}) -- 5,4,6,7 + minetest.swap_node(at_side_n, {name="trunks:moss_with_fungus_"..rot, param2=5}) elseif moss_type < 22 then - minetest.swap_node(at_side_n, {name="trunks:moss", param2=math.random(4,7)}) + minetest.swap_node(at_side_n, {name="trunks:moss_plain_"..rot, param2=5}) end end - local moss_type = math.random(1,41) - if minetest.registered_nodes[node_east.name].buildable_to then -- instead of check_air = true, + if minetest.registered_nodes[node_east.name].buildable_to then + local moss_type = math.random(1,41) + local rot = math.random(0,3) if moss_type == 1 then - minetest.swap_node(at_side_e, {name="trunks:moss_fungus", param2=math.random(12,15)}) + minetest.swap_node(at_side_e, {name="trunks:moss_with_fungus_"..rot, param2=3}) elseif moss_type < 22 then - minetest.swap_node(at_side_e, {name="trunks:moss", param2=math.random(12,15)}) + minetest.swap_node(at_side_e, {name="trunks:moss_plain_"..rot, param2=3}) end end - local moss_type = math.random(1,41) - if minetest.registered_nodes[node_south.name].buildable_to then -- instead of check_air = true, + if minetest.registered_nodes[node_south.name].buildable_to then + local moss_type = math.random(1,41) + local rot = math.random(0,3) if moss_type == 1 then - minetest.swap_node(at_side_s, {name="trunks:moss_fungus", param2=math.random(8,11)}) + minetest.swap_node(at_side_s, {name="trunks:moss_with_fungus_"..rot, param2=4}) elseif moss_type < 22 then - minetest.swap_node(at_side_s, {name="trunks:moss", param2=math.random(8,11)}) + minetest.swap_node(at_side_s, {name="trunks:moss_plain_"..rot, param2=4}) end end - local moss_type = math.random(1,41) - if minetest.registered_nodes[node_west.name].buildable_to then -- instead of check_air = true, + if minetest.registered_nodes[node_west.name].buildable_to then + local moss_type = math.random(1,41) + local rot = math.random(0,3) if moss_type == 1 then - minetest.swap_node(at_side_w, {name="trunks:moss_fungus", param2=math.random(16,19)}) + minetest.swap_node(at_side_w, {name="trunks:moss_with_fungus_"..rot, param2=2}) elseif moss_type < 22 then - minetest.swap_node(at_side_w, {name="trunks:moss", param2=math.random(16,19)}) + minetest.swap_node(at_side_w, {name="trunks:moss_plain_"..rot, param2=2}) end end --end diff --git a/mods/plantlife_modpack/trunks/nodes.lua b/mods/plantlife_modpack/trunks/nodes.lua index f60281bd..04d124fc 100644 --- a/mods/plantlife_modpack/trunks/nodes.lua +++ b/mods/plantlife_modpack/trunks/nodes.lua @@ -65,42 +65,63 @@ end ----------------------------------------------------------------------------------------------- -- MoSS ----------------------------------------------------------------------------------------------- -local flat_moss = {-1/2, -1/2, -1/2, 1/2, -15/32--[[<-flickers if smaller]], 1/2} -minetest.register_node("trunks:moss", { - description = S("Moss"), - drawtype = "nodebox",--"signlike", - tiles = {"trunks_moss.png"}, - inventory_image = "trunks_moss.png", - wield_image = "trunks_moss.png", - paramtype = "light", - paramtype2 = "facedir",--"wallmounted", - sunlight_propagates = true, - walkable = false, - node_box = {type = "fixed", fixed = flat_moss}, - selection_box = {type = "fixed", fixed = flat_stick},--{type = "wallmounted"}, - groups = {snappy = 3, flammable = 3 }, - sounds = default.node_sound_leaves_defaults(), -}) +-- wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, +-- wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, +-- wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}, ------------------------------------------------------------------------------------------------ --- MoSS & FuNGuS ------------------------------------------------------------------------------------------------ -minetest.register_node("trunks:moss_fungus", { - description = S("Moss with Fungus"), - drawtype = "nodebox",--"signlike", - tiles = {"trunks_moss_fungus.png"}, - inventory_image = "trunks_moss_fungus.png", - wield_image = "trunks_moss_fungus.png", - paramtype = "light", - paramtype2 = "facedir",--"wallmounted", - sunlight_propagates = true, - walkable = false, - node_box = {type = "fixed", fixed = flat_moss}, - selection_box = {type = "fixed", fixed = flat_stick},--{type = "wallmounted"}, - groups = {snappy = 3, flammable = 3 }, - sounds = default.node_sound_leaves_defaults(), -}) +-- was local flat_moss = {-1/2, -1/2, -1/2, 1/2, -15/32, 1/2} + + +local cbox = { + type = "wallmounted", + wall_top = {-1/2, 1/2, -1/2, 1/2, 15/32, 1/2}, + wall_bottom = {-1/2, -1/2, -1/2, 1/2, -15/32, 1/2}, + wall_side = {-1/2, -1/2, -1/2, -15/32, 1/2, 1/2} +} + +for r = 0, 3 do + local xform = "" + if r > 0 then xform = "^[transformR"..r*90 end + + minetest.register_node("trunks:moss_plain_"..r, { + description = S("Moss"), + drawtype = "nodebox", + tiles = {"trunks_moss.png"..xform}, + inventory_image = "trunks_moss.png", + wield_image = "trunks_moss.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + node_box = cbox, + groups = {snappy = 3, flammable = 3, attached_node=1, not_in_creative_inventory = r}, + sounds = default.node_sound_leaves_defaults(), + drop = "trunks:moss_plain_0", + }) + + ----------------------------------------------------------------------------------------------- + -- MoSS & FuNGuS + ----------------------------------------------------------------------------------------------- + minetest.register_node("trunks:moss_with_fungus_"..r, { + description = S("Moss with Fungus"), + drawtype = "nodebox", + tiles = {"trunks_moss_fungus.png"..xform}, + inventory_image = "trunks_moss_fungus.png", + wield_image = "trunks_moss_fungus.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + node_box = cbox, + groups = {snappy = 3, flammable = 3, attached_node=1, not_in_creative_inventory = r}, + sounds = default.node_sound_leaves_defaults(), + drop = "trunks:moss_with_fungus_0", + }) +end + +minetest.register_alias("trunks:moss_plain", "trunks:moss_plain_0") +minetest.register_alias("trunks:moss_with_fungus", "trunks:moss_with_fungus_0") ----------------------------------------------------------------------------------------------- -- TWiGS BLoCK @@ -361,7 +382,8 @@ for i in pairs(TRuNKS) do snappy=1, choppy=2, oddly_breakable_by_hand=1, - flammable=2--, + flammable=2, + attached_node = 1 --not_in_creative_inventory=1 -- atm in inv for testing }, --drop = "trunks:twig_1", -- not sure about this yet @@ -376,3 +398,26 @@ end end minetest.register_alias("trunks:pine_trunkroot", "trunks:pine_treeroot") + +-- convert moss to wallmounted mode so that attached_node works properly. + +local fdirtowall = { + [0] = 1, + [1] = 5, + [2] = 4, + [3] = 3, + [4] = 2, +} + +minetest.register_lbm({ + name = "trunks:convert_moss_wallmounted", + label = "Convert moss to wallmounted mode", + run_at_every_load = true, + nodenames = {"trunks:moss", "trunks:moss_fungus"}, + action = function(pos, node) + local basedir = math.floor(node.param2 / 4) + local rot = node.param2 % 4 + local newname = node.name == "trunks:moss_fungus" and "trunks:moss_with_fungus" or "trunks:moss_plain" + minetest.set_node(pos, {name = newname.."_"..rot, param2 = fdirtowall[basedir] }) + end +}) diff --git a/mods/plantlife_modpack/youngtrees/init.lua b/mods/plantlife_modpack/youngtrees/init.lua index 50d11ff1..ca74de17 100644 --- a/mods/plantlife_modpack/youngtrees/init.lua +++ b/mods/plantlife_modpack/youngtrees/init.lua @@ -40,7 +40,7 @@ minetest.register_node("youngtrees:youngtree2_middle",{ {-0.500000,0.125000,-0.500000,0.500000,0.500000,0.500000}, --NodeBox 3 } }, - groups = {snappy=3,flammable=2}, + groups = {snappy=3,flammable=2,attached_node=1}, sounds = default.node_sound_leaves_defaults(), drop = 'trunks:twig_1' }) @@ -58,7 +58,7 @@ minetest.register_node("youngtrees:youngtree_top", { type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} }, - groups = {snappy=3,flammable=2}, + groups = {snappy=3,flammable=2,attached_node=1}, sounds = default.node_sound_leaves_defaults(), drop = 'trunks:twig_1' }) @@ -77,7 +77,7 @@ minetest.register_node("youngtrees:youngtree_middle", { type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} }, - groups = {snappy=3,flammable=2}, + groups = {snappy=3,flammable=2,attached_node=1}, sounds = default.node_sound_leaves_defaults(), drop = 'trunks:twig_1' }) @@ -97,7 +97,7 @@ minetest.register_node("youngtrees:youngtree_bottom", { type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} }, - groups = {snappy=3,flammable=2}, + groups = {snappy=3,flammable=2,attached_node=1}, sounds = default.node_sound_leaves_defaults(), drop = 'trunks:twig_1' }) diff --git a/mods/skinsdb/meta/character_2060.txt b/mods/skinsdb/meta/character_2060.txt new file mode 100644 index 00000000..befaf946 --- /dev/null +++ b/mods/skinsdb/meta/character_2060.txt @@ -0,0 +1,3 @@ +rainbow gohst +Phill +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_2061.txt b/mods/skinsdb/meta/character_2061.txt new file mode 100644 index 00000000..71ba4b3d --- /dev/null +++ b/mods/skinsdb/meta/character_2061.txt @@ -0,0 +1,3 @@ +Danger +Phill +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_2062.txt b/mods/skinsdb/meta/character_2062.txt new file mode 100644 index 00000000..f2af952f --- /dev/null +++ b/mods/skinsdb/meta/character_2062.txt @@ -0,0 +1,3 @@ +Monster Boy +Phill +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_2063.txt b/mods/skinsdb/meta/character_2063.txt new file mode 100644 index 00000000..27a9af6f --- /dev/null +++ b/mods/skinsdb/meta/character_2063.txt @@ -0,0 +1,3 @@ +Gohst sam +Phill +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_2064.txt b/mods/skinsdb/meta/character_2064.txt new file mode 100644 index 00000000..18dc16c1 --- /dev/null +++ b/mods/skinsdb/meta/character_2064.txt @@ -0,0 +1,3 @@ +FBI +Phill +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_2065.txt b/mods/skinsdb/meta/character_2065.txt new file mode 100644 index 00000000..59f927ea --- /dev/null +++ b/mods/skinsdb/meta/character_2065.txt @@ -0,0 +1,3 @@ +Endersam +Phill +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_2066.txt b/mods/skinsdb/meta/character_2066.txt new file mode 100644 index 00000000..6b158200 --- /dev/null +++ b/mods/skinsdb/meta/character_2066.txt @@ -0,0 +1,3 @@ +Flaming +Flaming Strike +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_2067.txt b/mods/skinsdb/meta/character_2067.txt new file mode 100644 index 00000000..45c02713 --- /dev/null +++ b/mods/skinsdb/meta/character_2067.txt @@ -0,0 +1,3 @@ +FBI Ninja +Phill +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_2068.txt b/mods/skinsdb/meta/character_2068.txt new file mode 100644 index 00000000..a447720c --- /dev/null +++ b/mods/skinsdb/meta/character_2068.txt @@ -0,0 +1,3 @@ +euro 2021 -FR10- minetest footmod? free NC share modify ok +DcyD3 +CC BY-NC-SA 4.0 diff --git a/mods/skinsdb/meta/character_2069.txt b/mods/skinsdb/meta/character_2069.txt new file mode 100644 index 00000000..359ccf8f --- /dev/null +++ b/mods/skinsdb/meta/character_2069.txt @@ -0,0 +1,3 @@ +spider-man +DcyD3 +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/meta/character_2070.txt b/mods/skinsdb/meta/character_2070.txt new file mode 100644 index 00000000..30e0d3d6 --- /dev/null +++ b/mods/skinsdb/meta/character_2070.txt @@ -0,0 +1,3 @@ +eye you ! +DcyD3 +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/meta/character_2071.txt b/mods/skinsdb/meta/character_2071.txt new file mode 100644 index 00000000..82393490 --- /dev/null +++ b/mods/skinsdb/meta/character_2071.txt @@ -0,0 +1,3 @@ +Xbox 360 Skin Pack 1 +angel +CC BY 3.0 diff --git a/mods/skinsdb/meta/character_2072.txt b/mods/skinsdb/meta/character_2072.txt new file mode 100644 index 00000000..92146099 --- /dev/null +++ b/mods/skinsdb/meta/character_2072.txt @@ -0,0 +1,3 @@ +Irrlicht +Phill +CC BY-SA 3.0 diff --git a/mods/skinsdb/meta/character_2073.txt b/mods/skinsdb/meta/character_2073.txt new file mode 100644 index 00000000..45a7198e --- /dev/null +++ b/mods/skinsdb/meta/character_2073.txt @@ -0,0 +1,3 @@ +kinie? 4minetest +DcyD3 +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/meta/character_2074.txt b/mods/skinsdb/meta/character_2074.txt new file mode 100644 index 00000000..c795c7c7 --- /dev/null +++ b/mods/skinsdb/meta/character_2074.txt @@ -0,0 +1,3 @@ +barca 4fans ! thx +DcyD3 +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/meta/character_2075.txt b/mods/skinsdb/meta/character_2075.txt new file mode 100644 index 00000000..66115b2c --- /dev/null +++ b/mods/skinsdb/meta/character_2075.txt @@ -0,0 +1,3 @@ +oh no no not me ! lool +DcyD3 +CC BY-NC-SA 3.0 diff --git a/mods/skinsdb/textures/character_2060.png b/mods/skinsdb/textures/character_2060.png new file mode 100644 index 00000000..97ce64ee Binary files /dev/null and b/mods/skinsdb/textures/character_2060.png differ diff --git a/mods/skinsdb/textures/character_2061.png b/mods/skinsdb/textures/character_2061.png new file mode 100644 index 00000000..5a968950 Binary files /dev/null and b/mods/skinsdb/textures/character_2061.png differ diff --git a/mods/skinsdb/textures/character_2062.png b/mods/skinsdb/textures/character_2062.png new file mode 100644 index 00000000..2c1d1f10 Binary files /dev/null and b/mods/skinsdb/textures/character_2062.png differ diff --git a/mods/skinsdb/textures/character_2063.png b/mods/skinsdb/textures/character_2063.png new file mode 100644 index 00000000..c380e8a3 Binary files /dev/null and b/mods/skinsdb/textures/character_2063.png differ diff --git a/mods/skinsdb/textures/character_2064.png b/mods/skinsdb/textures/character_2064.png new file mode 100644 index 00000000..c08d695d Binary files /dev/null and b/mods/skinsdb/textures/character_2064.png differ diff --git a/mods/skinsdb/textures/character_2065.png b/mods/skinsdb/textures/character_2065.png new file mode 100644 index 00000000..157d2fd6 Binary files /dev/null and b/mods/skinsdb/textures/character_2065.png differ diff --git a/mods/skinsdb/textures/character_2066.png b/mods/skinsdb/textures/character_2066.png new file mode 100644 index 00000000..2613c058 Binary files /dev/null and b/mods/skinsdb/textures/character_2066.png differ diff --git a/mods/skinsdb/textures/character_2067.png b/mods/skinsdb/textures/character_2067.png new file mode 100644 index 00000000..db113362 Binary files /dev/null and b/mods/skinsdb/textures/character_2067.png differ diff --git a/mods/skinsdb/textures/character_2068.png b/mods/skinsdb/textures/character_2068.png new file mode 100644 index 00000000..02088f5a Binary files /dev/null and b/mods/skinsdb/textures/character_2068.png differ diff --git a/mods/skinsdb/textures/character_2069.png b/mods/skinsdb/textures/character_2069.png new file mode 100644 index 00000000..4cd72044 Binary files /dev/null and b/mods/skinsdb/textures/character_2069.png differ diff --git a/mods/skinsdb/textures/character_2070.png b/mods/skinsdb/textures/character_2070.png new file mode 100644 index 00000000..daa47ae4 Binary files /dev/null and b/mods/skinsdb/textures/character_2070.png differ diff --git a/mods/skinsdb/textures/character_2071.png b/mods/skinsdb/textures/character_2071.png new file mode 100644 index 00000000..1b47e2da Binary files /dev/null and b/mods/skinsdb/textures/character_2071.png differ diff --git a/mods/skinsdb/textures/character_2072.png b/mods/skinsdb/textures/character_2072.png new file mode 100644 index 00000000..974f0b2a Binary files /dev/null and b/mods/skinsdb/textures/character_2072.png differ diff --git a/mods/skinsdb/textures/character_2073.png b/mods/skinsdb/textures/character_2073.png new file mode 100644 index 00000000..5089eabc Binary files /dev/null and b/mods/skinsdb/textures/character_2073.png differ diff --git a/mods/skinsdb/textures/character_2074.png b/mods/skinsdb/textures/character_2074.png new file mode 100644 index 00000000..c2ec2e46 Binary files /dev/null and b/mods/skinsdb/textures/character_2074.png differ diff --git a/mods/skinsdb/textures/character_2075.png b/mods/skinsdb/textures/character_2075.png new file mode 100644 index 00000000..56ae8b8e Binary files /dev/null and b/mods/skinsdb/textures/character_2075.png differ diff --git a/mods/stamina/init.lua b/mods/stamina/init.lua index f582e2aa..40e9680c 100644 --- a/mods/stamina/init.lua +++ b/mods/stamina/init.lua @@ -204,6 +204,30 @@ local function set_sprinting(name, sprinting) end +local function head_particle(player, texture) + + local prop = player:get_properties() + local pos = player:get_pos() ; pos.y = pos.y + prop.eye_height -- mouth level + local dir = player:get_look_dir() + + + minetest.add_particlespawner({ + amount = 5, + time = 0.1, + minpos = pos, + maxpos = pos, + minvel = {x = dir.x - 1, y = dir.y, z = dir.z - 1}, + maxvel = {x = dir.x + 1, y = dir.y, z = dir.z + 1}, + minacc = {x = 0, y = -5, z = 0}, + maxacc = {x = 0, y = -9, z = 0}, + minexptime = 1, + maxexptime = 1, + minsize = 1, + maxsize = 2, + texture = texture + }) +end + local function drunk_tick() for _,player in ipairs(minetest.get_connected_players()) do @@ -218,6 +242,9 @@ local function drunk_tick() local num = stamina.players[name].drunk if num and num > 0 and math.floor(num / 20) == num / 20 then + + head_particle(player, "bubble.png") + minetest.sound_play("stamina_burp", {to_player = name, gain = 0.7}, true) end @@ -381,6 +408,8 @@ local function poison_tick() local hp = player:get_hp() - 1 + head_particle(player, "stamina_poison_particle.png") + if hp > 0 then player:set_hp(hp, {poison = true}) end @@ -517,26 +546,9 @@ function stamina.eat(hp_change, replace_with_item, itemstack, user, pointed_thin minetest.sound_play(snd, {to_player = name, gain = 0.7}, true) -- particle effect when eating - local prop = user:get_properties() - local pos = user:get_pos() ; pos.y = pos.y + prop.eye_height -- mouth level local texture = minetest.registered_items[itemname].inventory_image - local dir = user:get_look_dir() - minetest.add_particlespawner({ - amount = 5, - time = 0.1, - minpos = pos, - maxpos = pos, - minvel = {x = dir.x - 1, y = dir.y, z = dir.z - 1}, - maxvel = {x = dir.x + 1, y = dir.y, z = dir.z + 1}, - minacc = {x = 0, y = -5, z = 0}, - maxacc = {x = 0, y = -9, z = 0}, - minexptime = 1, - maxexptime = 1, - minsize = 1, - maxsize = 2, - texture = texture - }) + head_particle(user, texture) -- if player drinks milk then stop poison and being drunk local item_name = itemstack:get_name() or "" diff --git a/mods/stamina/textures/stamina_poison_particle.png b/mods/stamina/textures/stamina_poison_particle.png new file mode 100644 index 00000000..d239e742 Binary files /dev/null and b/mods/stamina/textures/stamina_poison_particle.png differ diff --git a/mods/techpack/tubelib_addons2/colorlamp.lua b/mods/techpack/tubelib_addons2/colorlamp.lua index fc2fa34f..8d594f16 100644 --- a/mods/techpack/tubelib_addons2/colorlamp.lua +++ b/mods/techpack/tubelib_addons2/colorlamp.lua @@ -124,6 +124,7 @@ for idx,color in ipairs(tColors) do paramtype = 'light', light_source = minetest.LIGHT_MAX, + sounds = default.node_sound_stone_defaults(), groups = {choppy=2, cracky=1, not_in_creative_inventory=1}, is_ground_content = false, drop = "tubelib_addons2:lamp" diff --git a/mods/techpack/tubelib_addons2/colorlamp_ud.lua b/mods/techpack/tubelib_addons2/colorlamp_ud.lua index 34bcdabd..0d2cc35a 100644 --- a/mods/techpack/tubelib_addons2/colorlamp_ud.lua +++ b/mods/techpack/tubelib_addons2/colorlamp_ud.lua @@ -71,6 +71,7 @@ minetest.register_node("tubelib_addons2:lamp_on", { paramtype = "light", paramtype2 = "color", palette = "unifieddyes_palette_extended.png", + sounds = default.node_sound_stone_defaults(), groups = {choppy=2, cracky=1, not_in_creative_inventory=1, ud_param2_colorable = 1}, on_construct = unifieddyes.on_construct,