From e32f708c10709af59025f144859061ec74ffaae4 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 27 Jun 2021 17:39:50 +0200 Subject: [PATCH] update --- mods/3d_armor/3d_armor/api.lua | 9 + mods/3d_armor/wieldview/init.lua | 8 +- mods/ambience/README.md | 1 + mods/ambience/init.lua | 49 ++- mods/anvils/init.lua | 15 + mods/bonemeal/init.lua | 2 + mods/bows/lucky_block.lua | 14 +- mods/cottages/nodes_anvil.lua | 20 ++ mods/cottages/nodes_water.lua | 28 +- mods/farming/crops/corn.lua | 19 + mods/farming/license.txt | 3 + mods/farming/textures/farming_popcorn.png | Bin 0 -> 292 bytes mods/mobs_animal/locale/README.md | 10 + mods/mobs_animal/locale/mobs_animal.pt.tr | 46 +++ mods/mobs_animal/locale/mobs_animal.pt_BR.tr | 46 +++ mods/mobs_animal/locale/po2tr.lua | 116 ++++++ mods/mobs_animal/locale/pt.po | 199 +++++++++++ mods/mobs_animal/locale/pt.txt | 46 +++ mods/mobs_animal/locale/pt_BR.po | 199 +++++++++++ mods/mobs_animal/locale/pt_BR.txt | 46 +++ mods/mobs_monster/lava_flan.lua | 24 +- mods/mobs_redo/api.lua | 332 ++++++++---------- mods/pie/depends.txt | 3 +- mods/pie/init.lua | 56 ++- mods/pie/mod.conf | 2 +- mods/plantlife_modpack/bushes/init.lua | 8 +- mods/plantlife_modpack/cavestuff/nodes.lua | 8 +- mods/plantlife_modpack/trunks/generating.lua | 104 +++--- mods/plantlife_modpack/trunks/nodes.lua | 115 ++++-- mods/plantlife_modpack/youngtrees/init.lua | 8 +- mods/skinsdb/meta/character_2060.txt | 3 + mods/skinsdb/meta/character_2061.txt | 3 + mods/skinsdb/meta/character_2062.txt | 3 + mods/skinsdb/meta/character_2063.txt | 3 + mods/skinsdb/meta/character_2064.txt | 3 + mods/skinsdb/meta/character_2065.txt | 3 + mods/skinsdb/meta/character_2066.txt | 3 + mods/skinsdb/meta/character_2067.txt | 3 + mods/skinsdb/meta/character_2068.txt | 3 + mods/skinsdb/meta/character_2069.txt | 3 + mods/skinsdb/meta/character_2070.txt | 3 + mods/skinsdb/meta/character_2071.txt | 3 + mods/skinsdb/meta/character_2072.txt | 3 + mods/skinsdb/meta/character_2073.txt | 3 + mods/skinsdb/meta/character_2074.txt | 3 + mods/skinsdb/meta/character_2075.txt | 3 + mods/skinsdb/textures/character_2060.png | Bin 0 -> 1336 bytes mods/skinsdb/textures/character_2061.png | Bin 0 -> 993 bytes mods/skinsdb/textures/character_2062.png | Bin 0 -> 1523 bytes mods/skinsdb/textures/character_2063.png | Bin 0 -> 3929 bytes mods/skinsdb/textures/character_2064.png | Bin 0 -> 3224 bytes mods/skinsdb/textures/character_2065.png | Bin 0 -> 2860 bytes mods/skinsdb/textures/character_2066.png | Bin 0 -> 8935 bytes mods/skinsdb/textures/character_2067.png | Bin 0 -> 1617 bytes mods/skinsdb/textures/character_2068.png | Bin 0 -> 8476 bytes mods/skinsdb/textures/character_2069.png | Bin 0 -> 9577 bytes mods/skinsdb/textures/character_2070.png | Bin 0 -> 11290 bytes mods/skinsdb/textures/character_2071.png | Bin 0 -> 3265 bytes mods/skinsdb/textures/character_2072.png | Bin 0 -> 4156 bytes mods/skinsdb/textures/character_2073.png | Bin 0 -> 8318 bytes mods/skinsdb/textures/character_2074.png | Bin 0 -> 9240 bytes mods/skinsdb/textures/character_2075.png | Bin 0 -> 12322 bytes mods/stamina/init.lua | 48 ++- .../textures/stamina_poison_particle.png | Bin 0 -> 134 bytes mods/techpack/tubelib_addons2/colorlamp.lua | 1 + .../techpack/tubelib_addons2/colorlamp_ud.lua | 1 + 66 files changed, 1274 insertions(+), 360 deletions(-) create mode 100644 mods/farming/textures/farming_popcorn.png create mode 100644 mods/mobs_animal/locale/README.md create mode 100644 mods/mobs_animal/locale/mobs_animal.pt.tr create mode 100644 mods/mobs_animal/locale/mobs_animal.pt_BR.tr create mode 100644 mods/mobs_animal/locale/po2tr.lua create mode 100644 mods/mobs_animal/locale/pt.po create mode 100644 mods/mobs_animal/locale/pt.txt create mode 100644 mods/mobs_animal/locale/pt_BR.po create mode 100644 mods/mobs_animal/locale/pt_BR.txt create mode 100644 mods/skinsdb/meta/character_2060.txt create mode 100644 mods/skinsdb/meta/character_2061.txt create mode 100644 mods/skinsdb/meta/character_2062.txt create mode 100644 mods/skinsdb/meta/character_2063.txt create mode 100644 mods/skinsdb/meta/character_2064.txt create mode 100644 mods/skinsdb/meta/character_2065.txt create mode 100644 mods/skinsdb/meta/character_2066.txt create mode 100644 mods/skinsdb/meta/character_2067.txt create mode 100644 mods/skinsdb/meta/character_2068.txt create mode 100644 mods/skinsdb/meta/character_2069.txt create mode 100644 mods/skinsdb/meta/character_2070.txt create mode 100644 mods/skinsdb/meta/character_2071.txt create mode 100644 mods/skinsdb/meta/character_2072.txt create mode 100644 mods/skinsdb/meta/character_2073.txt create mode 100644 mods/skinsdb/meta/character_2074.txt create mode 100644 mods/skinsdb/meta/character_2075.txt create mode 100644 mods/skinsdb/textures/character_2060.png create mode 100644 mods/skinsdb/textures/character_2061.png create mode 100644 mods/skinsdb/textures/character_2062.png create mode 100644 mods/skinsdb/textures/character_2063.png create mode 100644 mods/skinsdb/textures/character_2064.png create mode 100644 mods/skinsdb/textures/character_2065.png create mode 100644 mods/skinsdb/textures/character_2066.png create mode 100644 mods/skinsdb/textures/character_2067.png create mode 100644 mods/skinsdb/textures/character_2068.png create mode 100644 mods/skinsdb/textures/character_2069.png create mode 100644 mods/skinsdb/textures/character_2070.png create mode 100644 mods/skinsdb/textures/character_2071.png create mode 100644 mods/skinsdb/textures/character_2072.png create mode 100644 mods/skinsdb/textures/character_2073.png create mode 100644 mods/skinsdb/textures/character_2074.png create mode 100644 mods/skinsdb/textures/character_2075.png create mode 100644 mods/stamina/textures/stamina_poison_particle.png 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 0000000000000000000000000000000000000000..6a534b94436970d84305fb1227608e0988c653fe GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw|3?!p1cPs@`asfUeu0T4Too5P<&^A7?+lRzo zUvvEMpz!Y9yYJt>|Ns9#?=0r`KoyK7L4Lsu4$p3+fjCLt?k)@+tg;?J&T>x|#}JO| zspky&4lD4m1}qN}Db2p3n9b_UH=$9EVNs8y!CS^lXEbC#_^?})F-~21|MX^^XtooP z3)!NtzFJh~y0%A4dGV6UvtFuYx6Z66+iA<-@mMYJ(YGxZT-Sb=E#zcS7gs)|%En!= zFX&a%?>m=1DeftL->G-f#7*yyi`i^p;d$cx^KQI|G+m#!$K$BR|H~I" "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 0000000000000000000000000000000000000000..97ce64ee9a4da6a98412fb1a8c0273d56e8dea3d GIT binary patch literal 1336 zcmV-81;_e{P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1kFiAK~!i%-Iz;k z6Gs@w$4(sb@B>gtoPZP(Ipk(uhhEy=Ko#eT9(&{f6$hv)6fQ`hs)7qD*TykhjkwD}jl3dad5X4^RK^$k<|CjmJvzwV+J6KBMpER1;@$BRO-*3K|bwq@4 z_(0Z1{q93fwC_k!pNdudC|i0)UJQrcVq=IaH$7E4Tx=PcE#FJ{qRI=8?wEppl>TsRRlD}n#d3p2+c1n z$fGjo+X^N`u+C#X^IM*pej~cmoz(V=ot&Jcx~HdyY85^o=L9X8xYtr~iOdAfH8*sh z;E4c;S8H{iLwx^0KNU8D!8r9CQ-VZ)sZPhEI=pZ%;*JSANoaz+1pgmMxURpXaX6)*`5XX zvp+F3AjI(H)q=JU^%^L;YqYgAi&QE_1?|m%yA1kK=eIp_UbehM_Fa@M{nE(GAz$C0 z^k9;6pAB6GbvLK)e}$?ZkpDkeFMmIK9(X_h^~1)8VN8PS<$q@d2r6N$tgL*Nfz?uT z1FXVaVA*Wc+<^4%E)h>A9I*vYLEpYipB!Z-8jV&I(z@@D^*~8bwu$#SOYBS~=myJ6 z%VKAdS3A`J zZJ62H+bes@AUd2xMh~qPmH<*#Kfwfrnw!L+ru zkwKYEhK?H=8mKnWnNG`A8IFKlVcspkE_w4LB7&nr_fmo&10eofX^_PKksYEM;=hdK z*Mtun6h@>WBBo~E(#H>&n-5QbFrho$LG6SiUiUUxD1agAF{n0bqJHrZ&9xlkA;14| zB*+Bh4@@7F?v7oucNP3*;?49l)g@(C!UTTnl>jp^b=bs8i2B8&(?8>2SBu?a*MxYl*umRw?rN3eKA15XPz+F&Atq7Tmi6VT>9PTW_!ZW@<1R**I%>q)z{e6s5JoJ2VKtRGiQ7j4zNMG`tJmZVv#@>wfJ2%U3K006eOwzajjtgNi4sHmoOZEbC9Yins~X=rF@ zV`F1tVq#xkUtV5bSy@?ES65S0Q&Lh=QBhG(PftxvO-xKoN=iyeNl8aXM@B|QL_|a< zCno>^09G>+X%je6Xkd>0=ya_0W{U1_mdmfy_xK(qP7o^ zCidhYq0xuf3Fk0|W#j?tGN2l6CwH!UH#xbFt==_Nc`!Afr+yNa!A|%85W(O_wZnNR zFHXR4F#z=ob@;71g!3V(}^@y?!7L9Wd|_E$IByWo+wl5N+lq{ z_d#}olMG_)TL9QySf=SB%Ce{>0CpWoi7j9NDp4-DK#vuULx^HQHP{N)B26=Ztk__! z#^6dIGlPDWWbT=cfF*9iBJRKf#EixjHH!rM5d%n)EFJ~G8aF?-K3K=lp$z4;?amh7 z36m{g6o8%>7M*b&ryXhPN!guEh*ORJ<#+|fnXK#Hd!0UbJ%Co2jRJlH%tWhbj{m9D P00000NkvXXu0mjfpSi!r literal 0 HcmV?d00001 diff --git a/mods/skinsdb/textures/character_2062.png b/mods/skinsdb/textures/character_2062.png new file mode 100644 index 0000000000000000000000000000000000000000..2c1d1f10584972f33e3b7fcee18d592f1667fd35 GIT binary patch literal 1523 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 KMNUMnLSTYu*hE?|FJAGx1Dpk7Lg;Y2r9V3J-x= zRaC0_p?pLAfKUYrG*loU0vXbx20~C3s03B16r@tB@&O8wK%$8n2?}ayoQ8xrwqtwj z*pt|vJMVjE?!D)+_u|8uu|2kD?pUcCSYOUPXP>?H{;&04|Gn-}bT`>kwrH(Dpp$t5 ztuRKh(#i;}#u`PEd92p76NlEIm13l?z`1&I&5#f4TzPti~a zG@(E#)D$C2v*S=+c;B)`*GS*l~J)2qH4&eI*9`1kvn>JF5=q+33 zRujDU{MF}wgMoq~xpab1E1Wj;^wd}_k6|jkeB@J~-2(h}CGh`(0h^|cqLnx*kzu9n zS-SELg}w^fL)6nlp%8JZzDCqppfkU;El9!2W-x9H%8%OgolfW}S~{sGcAj?PASh8! zG(97uEVdnI=Nbg-%M4T_D%J8W;BG93&0yU4`$uhe9Dq*h^NC8K6nLMo)?8;XD`Bcb zjEqmv=^f+0XXdcl09&d4!`=RSw>u8N`S}*LVnARNrO@)TkA9GQ_m1*zeTn*d!neNj zU$h$yv`@i?T$hmdjpaL(aI_eJpx}XP5u!+Wn&w zeZ*;pG*cL*s1yuw>KLqq%&sI{T#3oNkUF7Ya^iaw9VbLq(aD6>c82^PCMMGdUX(m*{{6M*<8nCw(Fi^5oLroB9Dv_ZUX#~YkIiRm-3ACcW z6x>Bt*iBNB*?<)_sh+wzuM}-L2YO%UF$G86R>!5{+p&o{-5ks|zz`}4}fqnf2 z`iqu8!)oklXF?-(yxYjzk7qyu}OKLkL#wZ?~sjuGzvNxt}} zPjPW!jaKX^N0xFFP_W>wX0RGkj0^(>Lp9Qr3kItpuqyu_VPW4u;qIc_h3)znod1Q3 z0IW6|eC?G_^Sy6=nRctq-~a7%EVoit+bIL(kdh5hS>7vn2hB`~Ga*hq2$ZeHdtogR zF3h*@4yrpaJyjaNE%k4F78N1@zWUi;;pCeqnO|;@BngE;v$Rm>`M>!~Qs-G}r7X46 zYxC~yizwK#8aght^qFeS)3U<;r___t5)d^mpe z1tl;4KsYj?cw$jo&8u#8c>A@XK7g zni2485FO1IiC+a>$uqC}z^`1t#(y2%0{TXa9*aSNbRd`jzY4)YNZ-mcpIy#<$vT+P zeB9m#ZWh81K>d?l7@&2Ppl|@CLMpuoB=xlSqplOKs>)uVjZac3?wUxIy(!u6-hCsMo>5eK3AdT;XigOE z#?(+cM7+bfRTK)X#{k8tvw|H5nawkhoB_KZmRpyYDvh)HdtnIhslY-*`43^ShznYv%`{omROtbC;-}0nw1o1`j2cd;E-TK*f_ZO_b#WvMk6FBT|gv3;RwRLId~tV zRERbe#CH&JC|yP?i`EsqZ*lsZ5Ig`}1v7lz@#erY?e@1Ff#MoS_4T7#$_#VhZg=kVAR)pC*X z5B=iK>1RU&Ku{{k8yx&KF;uz)I7BkQpp-$I3ZU|`5zpj7g>le#WNXcBW^Gz&>>**{ zIFye-pcKU;u>6ML4(3d#9tNuv#eYo!P5UZjhlS>Ocx{_+6r27lCZnTj=yE^S7%Iif zOn>~buE4JaVE^d1(OOffREVMoYb~8l2Wu@03kw86KomuUVTg#3Wm$eKT1%27ynapy zCV`C_yxC5~p6so>DPab}2L<;UpmPQ^z6{l0h2VhTPvmoS52WXFRlnJ8E{RehB=JIX z_9Vs8!~ERi&ushdZ39rPR#{(P2cX$(qP50a%gV|M&N-A)IOj0N5JeH~b{nM>X_{iK z1{O2Tq=kjBFGcXtCG;C}(CV+1;FB+bqM0000< KMNUMnLSTYxPiN== literal 0 HcmV?d00001 diff --git a/mods/skinsdb/textures/character_2066.png b/mods/skinsdb/textures/character_2066.png new file mode 100644 index 0000000000000000000000000000000000000000..2613c058b272b034bb2fcf3e8ad3f897b32d1cf5 GIT binary patch literal 8935 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 F{2vC87a0Hm literal 0 HcmV?d00001 diff --git a/mods/skinsdb/textures/character_2067.png b/mods/skinsdb/textures/character_2067.png new file mode 100644 index 0000000000000000000000000000000000000000..db113362e6e4109761fe5503656ffdb28e68d9a2 GIT binary patch literal 1617 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 T(u_PLCIJXFUDd)XR)PNm@7ruZ literal 0 HcmV?d00001 diff --git a/mods/skinsdb/textures/character_2069.png b/mods/skinsdb/textures/character_2069.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd720442482196c565a9221a1ce7069cbf30cda GIT binary patch literal 9577 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 NpwxBM3RSH9{|5qUAaDQx literal 0 HcmV?d00001 diff --git a/mods/skinsdb/textures/character_2074.png b/mods/skinsdb/textures/character_2074.png new file mode 100644 index 0000000000000000000000000000000000000000..c2ec2e46cc84b55619524c52d378dc57e3e7d18e GIT binary patch literal 9240 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 literal 0 HcmV?d00001 diff --git a/mods/skinsdb/textures/character_2075.png b/mods/skinsdb/textures/character_2075.png new file mode 100644 index 0000000000000000000000000000000000000000..56ae8b8e0280e74bdeb4b4610417016bfbb6d35f GIT binary patch literal 12322 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 sL^9UiT$6T>ThgTRSlnK1WC9)#cBi_@% literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d239e742b1a12700d9c8993c6a8e66b4eb9698d2 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=%3?!FCJ6-`&`~f~8u0UEgR8l8N!#2&zDc4?c z=DcE{5MxP@UoeBivm0qZj;g1NV+hCf