From a9bf923df9cf228d5bce4a9d7027de7d4e9d8fed Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 19 May 2021 11:14:18 +0200 Subject: [PATCH 001/103] improve mcl_bucket API (on_take callback) --- mods/ITEMS/mcl_buckets/init.lua | 14 +++++++------- mods/ITEMS/mcl_buckets/register.lua | 6 ++++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_buckets/init.lua b/mods/ITEMS/mcl_buckets/init.lua index 0ba68b723..7e67eee8e 100644 --- a/mods/ITEMS/mcl_buckets/init.lua +++ b/mods/ITEMS/mcl_buckets/init.lua @@ -1,8 +1,7 @@ -local S = minetest.get_translator("mcl_buckets") -local modpath = minetest.get_modpath(minetest.get_current_modname()) - --- Minetest 0.4 mod: bucket -- See README.txt for licensing and other information. +local modname = minetest.get_current_modname() +local S = minetest.get_translator(modname) +local modpath = minetest.get_modpath(modname) minetest.register_alias("bucket:bucket_empty", "mcl_buckets:bucket_empty") minetest.register_alias("bucket:bucket_water", "mcl_buckets:bucket_water") @@ -51,6 +50,7 @@ function mcl_buckets.register_liquid(def) mcl_buckets.liquids[def.source_take[i]] = { source_place = def.source_place, source_take = def.source_take[i], + on_take = def.on_take, itemname = def.itemname, } if type(def.source_place) == "string" then @@ -207,9 +207,9 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", { -- Fill bucket, but not in Creative Mode if not minetest.is_creative_enabled(user:get_player_name()) then new_bucket = ItemStack({name = liquiddef.itemname}) - if liquiddef.itemname == "mcl_buckets:bucket_lava" and awards and awards.unlock and user and user:is_player() then - awards.unlock(user:get_player_name(), "mcl:hotStuff") - end + if liquiddef.on_take then + liquiddef.on_take(user) + end end minetest.add_node(pointed_thing.under, {name="air"}) diff --git a/mods/ITEMS/mcl_buckets/register.lua b/mods/ITEMS/mcl_buckets/register.lua index b5d86ac0e..43156716c 100644 --- a/mods/ITEMS/mcl_buckets/register.lua +++ b/mods/ITEMS/mcl_buckets/register.lua @@ -1,6 +1,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) local mod_mcl_core = minetest.get_modpath("mcl_core") local mod_mclx_core = minetest.get_modpath("mclx_core") +local has_awards = minetest.get_modpath("awards") local sound_place = function(itemname, pos) local def = minetest.registered_nodes[itemname] @@ -28,6 +29,11 @@ if mod_mcl_core then end end, source_take = {"mcl_core:lava_source", "mcl_nether:nether_lava_source"}, + on_take = function(user) + if has_awards and user and user:is_player() then + awards.unlock(user:get_player_name(), "mcl:hotStuff") + end + end, itemname = "mcl_buckets:bucket_lava", inventory_image = "bucket_lava.png", name = S("Lava Bucket"), From fb60bd0253a22a7e5575d26ebc758b1ec2fdf357 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Fri, 21 May 2021 20:45:53 +0200 Subject: [PATCH 002/103] Disable backface culling of fire entity --- mods/ENTITIES/mcl_burning/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ENTITIES/mcl_burning/init.lua b/mods/ENTITIES/mcl_burning/init.lua index e223b3566..e1943e1bc 100644 --- a/mods/ENTITIES/mcl_burning/init.lua +++ b/mods/ENTITIES/mcl_burning/init.lua @@ -68,6 +68,7 @@ minetest.register_entity("mcl_burning:fire", { visual = "cube", pointable = false, glow = -1, + backface_culling = false, }, animation_frame = 0, From 84a800f22bb0cff6986fc7d9766129858b058bb9 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 22 May 2021 19:58:09 +0200 Subject: [PATCH 003/103] fix many warnings --- mods/PLAYER/mcl_hunger/hunger.lua | 2 +- mods/PLAYER/mcl_playerplus/init.lua | 2 -- mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.de.tr | 3 --- mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.es.tr | 3 --- mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.fr.tr | 3 --- mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.ru.tr | 3 --- mods/PLAYER/mcl_playerplus/locale/template.txt | 3 --- mods/PLAYER/mcl_skins/init.lua | 4 ++-- 8 files changed, 3 insertions(+), 20 deletions(-) delete mode 100644 mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.de.tr delete mode 100644 mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.es.tr delete mode 100644 mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.fr.tr delete mode 100644 mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.ru.tr delete mode 100644 mods/PLAYER/mcl_playerplus/locale/template.txt diff --git a/mods/PLAYER/mcl_hunger/hunger.lua b/mods/PLAYER/mcl_hunger/hunger.lua index 51d7fdaeb..cf422dbf0 100644 --- a/mods/PLAYER/mcl_hunger/hunger.lua +++ b/mods/PLAYER/mcl_hunger/hunger.lua @@ -1,4 +1,4 @@ -local S = minetest.get_translator("mcl_hunger") +--local S = minetest.get_translator("mcl_hunger") -- wrapper for minetest.item_eat (this way we make sure other mods can't break this one) minetest.do_item_eat = function(hp_change, replace_with_item, itemstack, user, pointed_thing) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 7b7920ee0..3ad6ba6e8 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -1,5 +1,3 @@ -local S = minetest.get_translator("mcl_playerplus") - mcl_playerplus = { elytra = {}, } diff --git a/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.de.tr b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.de.tr deleted file mode 100644 index 44d486d08..000000000 --- a/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.de.tr +++ /dev/null @@ -1,3 +0,0 @@ -# textdomain: mcl_playerplus -@1 suffocated to death.=@1 erstickte zu Tode. -@1 was prickled to death by a cactus.=@1 wurde von einem Kaktus zu Tode gepiekst. diff --git a/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.es.tr b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.es.tr deleted file mode 100644 index ef7705bce..000000000 --- a/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.es.tr +++ /dev/null @@ -1,3 +0,0 @@ -# textdomain: mcl_playerplus -@1 suffocated to death.=@1 ahogado hasta la muerte. -@1 was prickled to death by a cactus.=@1 fue herido de muerte por un cactus. diff --git a/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.fr.tr b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.fr.tr deleted file mode 100644 index 6482bd736..000000000 --- a/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.fr.tr +++ /dev/null @@ -1,3 +0,0 @@ -# textdomain: mcl_playerplus -@1 suffocated to death.=@1 étouffé à mort. -@1 was prickled to death by a cactus.=@1 a été piqué à mort par un cactus. diff --git a/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.ru.tr b/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.ru.tr deleted file mode 100644 index a75bd4bd6..000000000 --- a/mods/PLAYER/mcl_playerplus/locale/mcl_playerplus.ru.tr +++ /dev/null @@ -1,3 +0,0 @@ -# textdomain: mcl_playerplus -@1 suffocated to death.=@1 задохнулся(ась). -@1 was prickled to death by a cactus.=@1 был(а) до смерти заколот(а) кактусом. diff --git a/mods/PLAYER/mcl_playerplus/locale/template.txt b/mods/PLAYER/mcl_playerplus/locale/template.txt deleted file mode 100644 index 49b1f96ac..000000000 --- a/mods/PLAYER/mcl_playerplus/locale/template.txt +++ /dev/null @@ -1,3 +0,0 @@ -# textdomain: mcl_playerplus -@1 suffocated to death.= -@1 was prickled to death by a cactus.= diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index 84f147da6..0f23519ab 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -87,7 +87,7 @@ mcl_skins.set_player_skin = function(player, skin_id) return false end local playername = player:get_player_name() - local skin, skin_file, preview + local skin, preview if skin_id == nil or type(skin_id) ~= "number" or skin_id < 0 or skin_id > mcl_skins.skin_count then return false elseif skin_id == 0 then @@ -109,7 +109,7 @@ mcl_skins.set_player_skin = function(player, skin_id) preview = "mcl_skins_player_dummy" end end - skin_file = skin .. ".png" + --local skin_file = skin .. ".png" mcl_skins.skins[playername] = skin mcl_skins.previews[playername] = preview player:get_meta():set_string("mcl_skins:skin_id", tostring(skin_id)) From 1b3763654e5801b33842e2d8441a33744f94a697 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 22 May 2021 20:00:59 +0200 Subject: [PATCH 004/103] comment unused local function --- mods/ITEMS/mcl_tnt/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_tnt/init.lua b/mods/ITEMS/mcl_tnt/init.lua index 19bd04a18..40455f8d0 100644 --- a/mods/ITEMS/mcl_tnt/init.lua +++ b/mods/ITEMS/mcl_tnt/init.lua @@ -114,7 +114,7 @@ function TNT:on_activate(staticdata) self.object:set_texture_mod("^mcl_tnt_blink.png") end -local function add_effects(pos, radius, drops) +--[[local function add_effects(pos, radius, drops) minetest.add_particlespawner({ amount = 64, time = 0.5, @@ -161,7 +161,7 @@ local function add_effects(pos, radius, drops) texture = texture, collisiondetection = true, }) -end +end]] function TNT:on_step(dtime) local pos = self.object:get_pos() From 1870a89af08f40a8dfd041108a3801e90571e3fe Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 22 May 2021 20:01:59 +0200 Subject: [PATCH 005/103] remove unused var --- mods/MAPGEN/mcl_mapgen_core/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index bdcdb1b4d..285da25c2 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -1904,7 +1904,7 @@ function mcl_mapgen_core.unregister_generator(id) if rec.vf then lvm = lvm - 1 end if rec.nf then nodes = nodes - 1 end if rec.needs_param2 then param2 = param2 - 1 end - if rec.needs_level0 then level0 = level0 - 1 end + --if rec.needs_level0 then level0 = level0 - 1 end end -- Generate basic layer-based nodes: void, bedrock, realm barrier, lava seas, etc. From a71a0e91611a758e5be4a7cd658792d9bd471304 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 22 May 2021 23:04:18 +0200 Subject: [PATCH 006/103] fix even more warnings (nether portals and potions) --- mods/ITEMS/mcl_portals/portal_nether.lua | 18 +++++++++++++++--- mods/ITEMS/mcl_potions/functions.lua | 16 ++++++++-------- mods/MAPGEN/mcl_biomes/init.lua | 7 ++++--- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index a121f719c..ec8e40d22 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -137,8 +137,20 @@ local function find_exit(p, dx, dy, dz) if not p or not p.y or not p.z or not p.x then return end local dx, dy, dz = dx or DISTANCE_MAX, dy or DISTANCE_MAX, dz or DISTANCE_MAX if dx < 1 or dy < 1 or dz < 1 then return false end - local x, y, z = floor(p.x), floor(p.y), floor(p.z) - local x1, y1, z1, x2, y2, z2 = x-dx+1, y-dy+1, z-dz+1, x+dx-1, y+dy-1, z+dz-1 + + --y values aren't used + local x = floor(p.x) + --local y = floor(p.y) + local z = floor(p.z) + + local x1 = x-dx+1 + --local y1 = y-dy+1 + local z1 = z-dz+1 + + local x2 = x+dx-1 + --local y2 = y+dy-1 + local z2 = z+dz-1 + local k1x, k2x = floor(x1/256), floor(x2/256) local k1z, k2z = floor(z1/256), floor(z2/256) @@ -371,7 +383,7 @@ local function finalize_teleport(obj, exit) if is_player then name = obj:get_player_name() end - local y, dim = mcl_worlds.y_to_layer(exit.y) + local _, dim = mcl_worlds.y_to_layer(exit.y) -- If player stands, player is at ca. something+0.5 which might cause precision problems, so we used ceil for objpos.y diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua index b4e1d9448..09b95115a 100644 --- a/mods/ITEMS/mcl_potions/functions.lua +++ b/mods/ITEMS/mcl_potions/functions.lua @@ -558,8 +558,8 @@ function mcl_potions.make_invisible(player, toggle) local is_player = player:is_player() local entity = player:get_luaentity() - local playername = player:get_player_name() - local skin_file = "" + --local playername = player:get_player_name() + local skin_file if toggle then -- hide player @@ -567,22 +567,22 @@ function mcl_potions.make_invisible(player, toggle) if entity then EF.invisible[player].old_size = entity.visual_size - elseif not player:is_player() then -- if not a player or entity, do nothing + elseif not is_player then -- if not a player or entity, do nothing return end - if player:is_player() then - mcl_player.player_set_skin(player, "mobs_mc_empty.png") - elseif not player:is_player() then + if is_player then + mcl_player.player_set_skin(player, skin_file) + elseif not is_player then player:set_properties({visual_size = {x = 0, y = 0}}) end player:set_nametag_attributes({color = {a = 0}}) elseif EF.invisible[player] then -- show player - if player:is_player() then + if is_player then mcl_skins.update_player_skin(player) - elseif not player:is_player() then + elseif not is_player then player:set_properties({visual_size = EF.invisible[player].old_size}) end player:set_nametag_attributes({color = {r = 255, g = 255, b = 255, a = 255}}) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index d4ebe00d3..4e01df5f2 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -3580,7 +3580,8 @@ local function register_decorations() local fern_minimal = { "Jungle", "JungleM", "JungleEdge", "JungleEdgeM", "Taiga", "MegaTaiga", "MegaSpruceTaiga", "ColdTaiga" } local fern_low = { "Jungle", "JungleM", "JungleEdge", "JungleEdgeM", "Taiga", "MegaTaiga", "MegaSpruceTaiga" } local fern_Jungle = { "Jungle", "JungleM", "JungleEdge", "JungleEdgeM" } - local fern_JungleM = { "JungleM" }, + --local fern_JungleM = { "JungleM" }, + register_grass_decoration("fern", -0.03, 0.09, fern_minimal) register_grass_decoration("fern", -0.015, 0.075, fern_minimal) register_grass_decoration("fern", 0, 0.06, fern_minimal) @@ -3591,7 +3592,7 @@ local function register_decorations() register_grass_decoration("fern", 0.05, 0.01, fern_Jungle) register_grass_decoration("fern", 0.07, -0.01, fern_Jungle) register_grass_decoration("fern", 0.09, -0.03, fern_Jungle) - register_grass_decoration("fern", 0.12, -0.03, fern_JungleM) + register_grass_decoration("fern", 0.12, -0.03, {"JungleM"}) local b_seagrass = {"ColdTaiga_ocean","ExtremeHills_ocean","ExtremeHillsM_ocean","ExtremeHills+_ocean","Taiga_ocean","MegaTaiga_ocean","MegaSpruceTaiga_ocean","StoneBeach_ocean","Plains_ocean","SunflowerPlains_ocean","Forest_ocean","FlowerForest_ocean","BirchForest_ocean","BirchForestM_ocean","RoofedForest_ocean","Swampland_ocean","Jungle_ocean","JungleM_ocean","JungleEdge_ocean","JungleEdgeM_ocean","MushroomIsland_ocean","Desert_ocean","Savanna_ocean","SavannaM_ocean","Mesa_ocean","MesaBryce_ocean","MesaPlateauF_ocean","MesaPlateauFM_ocean", "ColdTaiga_deep_ocean","ExtremeHills_deep_ocean","ExtremeHillsM_deep_ocean","ExtremeHills+_deep_ocean","Taiga_deep_ocean","MegaTaiga_deep_ocean","MegaSpruceTaiga_deep_ocean","StoneBeach_deep_ocean","Plains_deep_ocean","SunflowerPlains_deep_ocean","Forest_deep_ocean","FlowerForest_deep_ocean","BirchForest_deep_ocean","BirchForestM_deep_ocean","RoofedForest_deep_ocean","Swampland_deep_ocean","Jungle_deep_ocean","JungleM_deep_ocean","JungleEdge_deep_ocean","JungleEdgeM_deep_ocean","MushroomIsland_deep_ocean","Desert_deep_ocean","Savanna_deep_ocean","SavannaM_deep_ocean","Mesa_deep_ocean","MesaBryce_deep_ocean","MesaPlateauF_deep_ocean","MesaPlateauFM_deep_ocean", @@ -3974,7 +3975,7 @@ if mg_name ~= "singlenode" then mcl_mapgen_core.register_generator("chorus_grow", nil, function(minp, maxp, blockseed) local gennotify = minetest.get_mapgen_object("gennotify") --local poslist = {} - pr = PseudoRandom(blockseed + 14) + local pr = PseudoRandom(blockseed + 14) for _, pos in ipairs(gennotify["decoration#"..deco_id_chorus_plant] or {}) do local x, y, z = pos.x, pos.y, pos.z if x < -2 or x > 2 or z < -2 or z > 2 then From c1a717238b06bc345c67aaf0197e70d428ba6f2e Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 22 May 2021 23:07:56 +0200 Subject: [PATCH 007/103] [mcl_portals] fix warnings --- mods/ITEMS/mcl_portals/portal_end.lua | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_portals/portal_end.lua b/mods/ITEMS/mcl_portals/portal_end.lua index 192f5001c..5b402bdc0 100644 --- a/mods/ITEMS/mcl_portals/portal_end.lua +++ b/mods/ITEMS/mcl_portals/portal_end.lua @@ -1,10 +1,14 @@ local S = minetest.get_translator("mcl_portals") --- Parameters -local SPAWN_MIN = mcl_vars.mg_end_min+70 -local SPAWN_MAX = mcl_vars.mg_end_min+98 +local table = table +local vector = vector +local math = math -local mg_name = minetest.get_mapgen_setting("mg_name") +-- Parameters +--local SPAWN_MIN = mcl_vars.mg_end_min+70 +--local SPAWN_MAX = mcl_vars.mg_end_min+98 + +--local mg_name = minetest.get_mapgen_setting("mg_name") local destroy_portal = function(pos) local neighbors = { @@ -196,7 +200,6 @@ function mcl_portals.end_teleport(obj, pos) end end - local platform build_end_portal_destination(platform_pos) check_and_build_end_portal_destination(platform_pos) From e91ee174a47c4aa162ad4811795d68d8a34501bc Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 22 May 2021 23:12:33 +0200 Subject: [PATCH 008/103] [mcl_ocean] fix warnings --- mods/ITEMS/mcl_ocean/kelp.lua | 5 ++--- mods/ITEMS/mcl_ocean/sea_pickle.lua | 2 +- mods/ITEMS/mcl_ocean/seagrass.lua | 4 ++-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_ocean/kelp.lua b/mods/ITEMS/mcl_ocean/kelp.lua index 326b08a81..fb6045e78 100644 --- a/mods/ITEMS/mcl_ocean/kelp.lua +++ b/mods/ITEMS/mcl_ocean/kelp.lua @@ -38,7 +38,7 @@ local mt_is_creative_enabled = minetest.is_creative_enabled local mt_sound_play = minetest.sound_play local math = math -local string = string +--local string = string local table = table -- DEBUG: functions @@ -422,7 +422,7 @@ end function kelp.surface_after_dig_node(pos, node) - return mt_set_node(pos, {name=registred_nodes[node.name].node_dig_prediction}) + return mt_set_node(pos, {name=minetest.registered_nodes[node.name].node_dig_prediction}) end @@ -759,7 +759,6 @@ minetest.register_craftitem("mcl_ocean:dried_kelp", { groups = { food = 2, eatable = 1 }, on_place = minetest.item_eat(1), on_secondary_use = minetest.item_eat(1), - groups = { food = 2, eatable = 1 }, _mcl_saturation = 0.6, }) diff --git a/mods/ITEMS/mcl_ocean/sea_pickle.lua b/mods/ITEMS/mcl_ocean/sea_pickle.lua index 45b934a92..067bb39a3 100644 --- a/mods/ITEMS/mcl_ocean/sea_pickle.lua +++ b/mods/ITEMS/mcl_ocean/sea_pickle.lua @@ -12,7 +12,7 @@ local function sea_pickle_on_place(itemstack, placer, pointed_thing) local node_under = minetest.get_node(pos_under) local node_above = minetest.get_node(pos_above) local def_under = minetest.registered_nodes[node_under.name] - local def_above = minetest.registered_nodes[node_above.name] + --local def_above = minetest.registered_nodes[node_above.name] if def_under and def_under.on_rightclick and not placer:get_player_control().sneak then return def_under.on_rightclick(pos_under, node_under, diff --git a/mods/ITEMS/mcl_ocean/seagrass.lua b/mods/ITEMS/mcl_ocean/seagrass.lua index 492205138..bd6400a32 100644 --- a/mods/ITEMS/mcl_ocean/seagrass.lua +++ b/mods/ITEMS/mcl_ocean/seagrass.lua @@ -105,7 +105,7 @@ for s=1, #surfaces do doc_longdesc = S("Seagrass grows inside water on top of dirt, sand or gravel.") desc = S("Seagrass") doc_create = true - doc_img = "mcl_ocean_seagrass.png" + doc_img = "mcl_ocean_seagrass.png^[verticalframe:12:0" else doc_create = false end @@ -113,7 +113,7 @@ for s=1, #surfaces do _doc_items_entry_name = desc, _doc_items_longdesc = doc_longdesc, _doc_items_create_entry = doc_create, - _doc_items_image = "mcl_ocean_seagrass.png^[verticalframe:12:0", + _doc_items_image = doc_img, drawtype = "plantlike_rooted", paramtype = "light", paramtype2 = "meshoptions", From 0113d290b79cbeea4153635b06d53d07d5363743 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 22 May 2021 23:19:31 +0200 Subject: [PATCH 009/103] [mcl_mobspawners] fix warnings --- mods/ITEMS/mcl_mobspawners/init.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index fe01f4c52..bd9d0c53a 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -1,11 +1,14 @@ local S = minetest.get_translator("mcl_mobspawners") +local math = math +local table = table + mcl_mobspawners = {} local default_mob = "mobs_mc:pig" -- Mob spawner -local spawner_default = default_mob.." 0 15 4 15" +--local spawner_default = default_mob.." 0 15 4 15" local function get_mob_textures(mob) local list = minetest.registered_entities[mob].texture_list @@ -160,7 +163,7 @@ local spawn_mobs = function(pos, elapsed) -- check objects inside 8×8 area around spawner local objs = minetest.get_objects_inside_radius(pos, 8) local count = 0 - local ent = nil + local ent local timer = minetest.get_node_timer(pos) From 9edcc60ba243750bed8994b3896cb48b6a9206c6 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 22 May 2021 23:21:32 +0200 Subject: [PATCH 010/103] [mcl_maps] fix warnings --- mods/ITEMS/mcl_maps/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_maps/init.lua b/mods/ITEMS/mcl_maps/init.lua index b2c03b354..ccdaf6dfd 100644 --- a/mods/ITEMS/mcl_maps/init.lua +++ b/mods/ITEMS/mcl_maps/init.lua @@ -5,7 +5,7 @@ local storage = minetest.get_mod_storage() local modpath = minetest.get_modpath("mcl_maps") local worldpath = minetest.get_worldpath() local map_textures_path = worldpath .. "/mcl_maps/" -local last_finished_id = storage:get_int("next_id") - 1 +--local last_finished_id = storage:get_int("next_id") - 1 minetest.mkdir(map_textures_path) From 0cac8f3f4411a316d235f93fffa87372ef6c92fc Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 22 May 2021 23:22:09 +0200 Subject: [PATCH 011/103] [mcl_jukebox] fix warnings --- mods/ITEMS/mcl_jukebox/init.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/ITEMS/mcl_jukebox/init.lua b/mods/ITEMS/mcl_jukebox/init.lua index 067848f50..249603b58 100644 --- a/mods/ITEMS/mcl_jukebox/init.lua +++ b/mods/ITEMS/mcl_jukebox/init.lua @@ -72,7 +72,6 @@ local function now_playing(player, name) active_huds[playername] = nil end end, {playername, id, hud_sequence_numbers[playername]}) - end minetest.register_on_leaveplayer(function(player) From a200252ab883aef1f79c3107e6ffc2a63403d7a9 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 22 May 2021 23:23:25 +0200 Subject: [PATCH 012/103] [mcl_itemframes] fix warnings --- mods/ITEMS/mcl_itemframes/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_itemframes/init.lua b/mods/ITEMS/mcl_itemframes/init.lua index e0f9f9043..fbd4d545a 100644 --- a/mods/ITEMS/mcl_itemframes/init.lua +++ b/mods/ITEMS/mcl_itemframes/init.lua @@ -276,12 +276,12 @@ minetest.register_node("mcl_itemframes:item_frame",{ on_rotate = function(pos, node, user, mode, param2) if mode == screwdriver.ROTATE_FACE then -- Rotate face - local meta = minetest.get_meta(pos) + --local meta = minetest.get_meta(pos) local node = minetest.get_node(pos) local objs = nil if node.name == "mcl_itemframes:item_frame" then - objs = minetest.get_objects_inside_radius(pos, .5) + objs = minetest.get_objects_inside_radius(pos, 0.5) end if objs then for _, obj in ipairs(objs) do From b58e61b98825132a898dc9bc0fb08c60e2420bdf Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 22 May 2021 23:25:28 +0200 Subject: [PATCH 013/103] [mcl_heads] fix warnings --- mods/ITEMS/mcl_heads/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_heads/init.lua b/mods/ITEMS/mcl_heads/init.lua index 0f41adb89..4bcee2279 100644 --- a/mods/ITEMS/mcl_heads/init.lua +++ b/mods/ITEMS/mcl_heads/init.lua @@ -91,7 +91,7 @@ local function addhead(name, texture, desc, longdesc, rangemob, rangefactor) local itemstring = itemstack:get_name() local fakestack = ItemStack(itemstack) - local idef = fakestack:get_definition() + --local idef = fakestack:get_definition() local retval if wdir == 0 or wdir == 1 then return minetest.item_place(itemstack, placer, pointed_thing) @@ -101,7 +101,7 @@ local function addhead(name, texture, desc, longdesc, rangemob, rangefactor) if not retval then return itemstack end - itemstack,_ = minetest.item_place(fakestack, placer, pointed_thing, wdir) + itemstack = minetest.item_place(fakestack, placer, pointed_thing, wdir) itemstack:set_name(itemstring) return itemstack end, From 45ab5c8e25a901e3c103df5f7f6c080b30de6f91 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 22 May 2021 23:29:51 +0200 Subject: [PATCH 014/103] [mcl_flowers] fix warnings --- mods/ITEMS/mcl_flowers/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index 7a2501f25..d07a125cb 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -180,12 +180,12 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im if not inv_img then inv_img = top_img end - local noncreative, create_entry, paramtype2, palette + local create_entry, paramtype2, palette if is_flower == nil then is_flower = true end - local bottom_groups = {flammable=2,fire_encouragement=60,fire_flammability=100, non_mycelium_plant=1,attached_node=1, dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1, plant=1,double_plant=1,deco_block=1,not_in_creative_inventory=noncreative} + local bottom_groups = {flammable=2, fire_encouragement=60, fire_flammability=100, non_mycelium_plant=1, attached_node=1, dig_by_water=1, destroy_by_lava_flow=1, dig_by_piston=1, plant=1, double_plant=1, deco_block=1} if is_flower then bottom_groups.flower = 1 bottom_groups.place_flowerlike = 1 @@ -200,7 +200,7 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im palette = "mcl_core_palette_grass.png" end if longdesc == nil then - noncreative = 1 + bottom_groups.not_in_creative_inventory = 1 create_entry = false end -- Drop itself by default From 82396bd994382fd4bd98bde770430c18ada01471 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 22 May 2021 23:31:16 +0200 Subject: [PATCH 015/103] [mcl_fireworks] fix warnings (1000 remainings) --- mods/ITEMS/mcl_fireworks/register.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/mods/ITEMS/mcl_fireworks/register.lua b/mods/ITEMS/mcl_fireworks/register.lua index 6ab55442c..c441254cb 100644 --- a/mods/ITEMS/mcl_fireworks/register.lua +++ b/mods/ITEMS/mcl_fireworks/register.lua @@ -1,7 +1,5 @@ local S = minetest.get_translator("mcl_fireworks") -local player_rocketing = {} - local tt_help = S("Flight Duration:") local description = S("Firework Rocket") From a1acf6d3c18c5e88a0e391447280a79bdc4c8565 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 22 May 2021 23:49:03 +0200 Subject: [PATCH 016/103] [mcl_fishing] fix warnings --- mods/ITEMS/mcl_fishing/init.lua | 281 +++++++++++++++----------------- 1 file changed, 133 insertions(+), 148 deletions(-) diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index 76526ee72..cc7c5cca5 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -2,6 +2,8 @@ local S = minetest.get_translator("mcl_fishing") +local math = math + local bobber_ENTITY={ physical = false, timer=0, @@ -31,143 +33,141 @@ local fish = function(itemstack, player, pointed_thing) end end - local pos = player:get_pos() + local pos = player:get_pos() - local objs = minetest.get_objects_inside_radius(pos, 125) - local num = 0 - local ent = nil - local noent = true - - local durability = 65 - local unbreaking = mcl_enchanting.get_enchantment(itemstack, "unbreaking") - if unbreaking > 0 then - durability = durability * (unbreaking + 1) - end + local objs = minetest.get_objects_inside_radius(pos, 125) + local ent + local noent = false - --Check for bobber if so handle. - for n = 1, #objs do - ent = objs[n]:get_luaentity() - if ent then - if ent.player and ent.objtype=="fishing" then - if (player:get_player_name() == ent.player) then - noent = false - if ent._dive == true then - local itemname - local items - local itemcount = 1 - local pr = PseudoRandom(os.time() * math.random(1, 100)) - local r = pr:next(1, 100) - local fish_values = {85, 84.8, 84.7, 84.5} - local junk_values = {10, 8.1, 6.1, 4.2} - local luck_of_the_sea = math.min(mcl_enchanting.get_enchantment(itemstack, "luck_of_the_sea"), 3) - local index = luck_of_the_sea + 1 - local fish_value = fish_values[index] - local junk_value = junk_values[index] + fish_value - if r <= fish_value then - -- Fish - items = mcl_loot.get_loot({ - items = { - { itemstring = "mcl_fishing:fish_raw", weight = 60 }, - { itemstring = "mcl_fishing:salmon_raw", weight = 25 }, - { itemstring = "mcl_fishing:clownfish_raw", weight = 2 }, - { itemstring = "mcl_fishing:pufferfish_raw", weight = 13 }, - } - }, pr) - elseif r <= junk_value then - -- Junk - items = mcl_loot.get_loot({ - items = { - { itemstring = "mcl_core:bowl", weight = 10 }, - { itemstring = "mcl_fishing:fishing_rod", weight = 2, wear_min = 6554, wear_max = 65535 }, -- 10%-100% damage - { itemstring = "mcl_mobitems:leather", weight = 10 }, - { itemstring = "mcl_armor:boots_leather", weight = 10, wear_min = 6554, wear_max = 65535 }, -- 10%-100% damage - { itemstring = "mcl_mobitems:rotten_flesh", weight = 10 }, - { itemstring = "mcl_core:stick", weight = 5 }, - { itemstring = "mcl_mobitems:string", weight = 5 }, - { itemstring = "mcl_potions:water", weight = 10 }, - { itemstring = "mcl_mobitems:bone", weight = 10 }, - { itemstring = "mcl_dye:black", weight = 1, amount_min = 10, amount_max = 10 }, - { itemstring = "mcl_mobitems:string", weight = 10 }, -- TODO: Tripwire Hook - } - }, pr) - else - -- Treasure - items = mcl_loot.get_loot({ - items = { - -- TODO: Enchanted Bow - { itemstring = "mcl_bows:bow", wear_min = 49144, wear_max = 65535 }, -- 75%-100% damage - { itemstack = mcl_enchanting.get_randomly_enchanted_book(30, true, true)}, - -- TODO: Enchanted Fishing Rod - { itemstring = "mcl_fishing:fishing_rod", wear_min = 49144, wear_max = 65535 }, -- 75%-100% damage - { itemstring = "mcl_mobs:nametag", }, - { itemstring = "mcl_mobitems:saddle", }, - { itemstring = "mcl_flowers:waterlily", }, - } - }, pr) - end - local item - if #items >= 1 then - item = ItemStack(items[1]) - else - item = ItemStack() - end - local inv = player:get_inventory() - if inv:room_for_item("main", item) then - inv:add_item("main", item) - else - minetest.add_item(pos, item) - end - if mcl_experience.throw_experience then - mcl_experience.throw_experience(pos, math.random(1,6)) - end + local durability = 65 + local unbreaking = mcl_enchanting.get_enchantment(itemstack, "unbreaking") + if unbreaking > 0 then + durability = durability * (unbreaking + 1) + end - if not minetest.is_creative_enabled(player:get_player_name()) then - local idef = itemstack:get_definition() - itemstack:add_wear(65535/durability) -- 65 uses - if itemstack:get_count() == 0 and idef.sound and idef.sound.breaks then - minetest.sound_play(idef.sound.breaks, {pos=player:get_pos(), gain=0.5}, true) - end + --Check for bobber if so handle. + for n = 1, #objs do + ent = objs[n]:get_luaentity() + if ent then + if ent.player and ent.objtype=="fishing" then + if (player:get_player_name() == ent.player) then + if ent._dive == true then + local items + local pr = PseudoRandom(os.time() * math.random(1, 100)) + local r = pr:next(1, 100) + local fish_values = {85, 84.8, 84.7, 84.5} + local junk_values = {10, 8.1, 6.1, 4.2} + local luck_of_the_sea = math.min(mcl_enchanting.get_enchantment(itemstack, "luck_of_the_sea"), 3) + local index = luck_of_the_sea + 1 + local fish_value = fish_values[index] + local junk_value = junk_values[index] + fish_value + if r <= fish_value then + -- Fish + items = mcl_loot.get_loot({ + items = { + { itemstring = "mcl_fishing:fish_raw", weight = 60 }, + { itemstring = "mcl_fishing:salmon_raw", weight = 25 }, + { itemstring = "mcl_fishing:clownfish_raw", weight = 2 }, + { itemstring = "mcl_fishing:pufferfish_raw", weight = 13 }, + } + }, pr) + elseif r <= junk_value then + -- Junk + items = mcl_loot.get_loot({ + items = { + { itemstring = "mcl_core:bowl", weight = 10 }, + { itemstring = "mcl_fishing:fishing_rod", weight = 2, wear_min = 6554, wear_max = 65535 }, -- 10%-100% damage + { itemstring = "mcl_mobitems:leather", weight = 10 }, + { itemstring = "mcl_armor:boots_leather", weight = 10, wear_min = 6554, wear_max = 65535 }, -- 10%-100% damage + { itemstring = "mcl_mobitems:rotten_flesh", weight = 10 }, + { itemstring = "mcl_core:stick", weight = 5 }, + { itemstring = "mcl_mobitems:string", weight = 5 }, + { itemstring = "mcl_potions:water", weight = 10 }, + { itemstring = "mcl_mobitems:bone", weight = 10 }, + { itemstring = "mcl_dye:black", weight = 1, amount_min = 10, amount_max = 10 }, + { itemstring = "mcl_mobitems:string", weight = 10 }, -- TODO: Tripwire Hook + } + }, pr) + else + -- Treasure + items = mcl_loot.get_loot({ + items = { + -- TODO: Enchanted Bow + { itemstring = "mcl_bows:bow", wear_min = 49144, wear_max = 65535 }, -- 75%-100% damage + { itemstack = mcl_enchanting.get_randomly_enchanted_book(30, true, true)}, + -- TODO: Enchanted Fishing Rod + { itemstring = "mcl_fishing:fishing_rod", wear_min = 49144, wear_max = 65535 }, -- 75%-100% damage + { itemstring = "mcl_mobs:nametag", }, + { itemstring = "mcl_mobitems:saddle", }, + { itemstring = "mcl_flowers:waterlily", }, + } + }, pr) + end + local item + if #items >= 1 then + item = ItemStack(items[1]) + else + item = ItemStack() + end + local inv = player:get_inventory() + if inv:room_for_item("main", item) then + inv:add_item("main", item) + else + minetest.add_item(pos, item) + end + if mcl_experience.throw_experience then + mcl_experience.throw_experience(pos, math.random(1,6)) + end + + if not minetest.is_creative_enabled(player:get_player_name()) then + local idef = itemstack:get_definition() + itemstack:add_wear(65535/durability) -- 65 uses + if itemstack:get_count() == 0 and idef.sound and idef.sound.breaks then + minetest.sound_play(idef.sound.breaks, {pos=player:get_pos(), gain=0.5}, true) end end - --Check if object is on land. - local epos = ent.object:get_pos() - epos.y = math.floor(epos.y) - local node = minetest.get_node(epos) - local def = minetest.registered_nodes[node.name] - if def.walkable then - if not minetest.is_creative_enabled(player:get_player_name()) then - local idef = itemstack:get_definition() - itemstack:add_wear((65535/durability)*2) -- if so and not creative then wear double like in MC. - if itemstack:get_count() == 0 and idef.sound and idef.sound.breaks then - minetest.sound_play(idef.sound.breaks, {pos=player:get_pos(), gain=0.5}, true) - end - end - end - --Destroy bobber. - ent.object:remove() - return itemstack end + --Check if object is on land. + local epos = ent.object:get_pos() + epos.y = math.floor(epos.y) + local node = minetest.get_node(epos) + local def = minetest.registered_nodes[node.name] + if def.walkable then + if not minetest.is_creative_enabled(player:get_player_name()) then + local idef = itemstack:get_definition() + itemstack:add_wear((65535/durability)*2) -- if so and not creative then wear double like in MC. + if itemstack:get_count() == 0 and idef.sound and idef.sound.breaks then + minetest.sound_play(idef.sound.breaks, {pos=player:get_pos(), gain=0.5}, true) + end + end + end + --Destroy bobber. + ent.object:remove() + noent = false + break end end end - --Check for flying bobber. - for n = 1, #objs do - ent = objs[n]:get_luaentity() - if ent then - if ent._thrower and ent.objtype=="fishing" then - if player:get_player_name() == ent._thrower then - noent = false - break - end + end + --Check for flying bobber. + for n = 1, #objs do + ent = objs[n]:get_luaentity() + if ent then + if ent._thrower and ent.objtype=="fishing" then + if player:get_player_name() == ent._thrower then + noent = false + break end end end - --If no bobber or flying_bobber exists then throw bobber. - if noent == true then - local playerpos = player:get_pos() - local dir = player:get_look_dir() - mcl_throwing.throw("mcl_fishing:flying_bobber", {x=playerpos.x, y=playerpos.y+1.5, z=playerpos.z}, dir, 15, player:get_player_name()) - end + end + --If no bobber or flying_bobber exists then throw bobber. + if noent then + local playerpos = player:get_pos() + local dir = player:get_look_dir() + mcl_throwing.throw("mcl_fishing:flying_bobber", {x=playerpos.x, y=playerpos.y+1.5, z=playerpos.z}, dir, 15, player:get_player_name()) + end + return itemstack end -- Movement function of bobber @@ -334,13 +334,11 @@ minetest.register_entity("mcl_fishing:flying_bobber_entity", flying_bobber_ENTIT mcl_throwing.register_throwable_object("mcl_fishing:flying_bobber", "mcl_fishing:flying_bobber_entity", 5) --- If player leaves area, remove bobber. -minetest.register_on_leaveplayer(function(player) +local function remove_bobber(player) local objs = minetest.get_objects_inside_radius(player:get_pos(), 250) - local ent = nil - local noent = true + for n = 1, #objs do - ent = objs[n]:get_luaentity() + local ent = objs[n]:get_luaentity() if ent then if ent.player and ent.objtype=="fishing" then ent.object:remove() @@ -349,26 +347,13 @@ minetest.register_on_leaveplayer(function(player) end end end -end) +end + +-- If player leaves area, remove bobber. +minetest.register_on_leaveplayer(remove_bobber) -- If player dies, remove bobber. -minetest.register_on_dieplayer(function(player) - local objs = minetest.get_objects_inside_radius(player:get_pos(), 250) - local num = 0 - local ent = nil - local noent = true - - for n = 1, #objs do - ent = objs[n]:get_luaentity() - if ent then - if ent.player and ent.objtype=="fishing" then - ent.object:remove() - elseif ent._thrower and ent.objtype=="fishing" then - ent.object:remove() - end - end - end -end) +minetest.register_on_dieplayer(remove_bobber) -- Fishing Rod minetest.register_tool("mcl_fishing:fishing_rod", { From fcc2087b9718c600f1de0d878a20391e06c54b65 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 22 May 2021 23:50:28 +0200 Subject: [PATCH 017/103] [mcl_farming] fix warnings --- mods/ITEMS/mcl_farming/shared_functions.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_farming/shared_functions.lua b/mods/ITEMS/mcl_farming/shared_functions.lua index c4cb2fd71..025894a11 100644 --- a/mods/ITEMS/mcl_farming/shared_functions.lua +++ b/mods/ITEMS/mcl_farming/shared_functions.lua @@ -161,7 +161,7 @@ function mcl_farming:place_seed(itemstack, placer, pointed_thing, plantname) if string.find(farmland.name, "mcl_farming:soil") and string.find(place_s.name, "air") then minetest.sound_play(minetest.registered_nodes[plantname].sounds.place, {pos = pos}, true) minetest.add_node(pos, {name=plantname, param2 = minetest.registered_nodes[plantname].place_param2}) - local intervals_counter = get_intervals_counter(pos, 1, 1) + --local intervals_counter = get_intervals_counter(pos, 1, 1) else return end @@ -190,7 +190,7 @@ end function mcl_farming:add_gourd(full_unconnected_stem, connected_stem_basename, stem_itemstring, stem_def, stem_drop, gourd_itemstring, gourd_def, grow_interval, grow_chance, connected_stem_texture, gourd_on_construct_extra) - local connected_stem_names = { + local connected_stem_names = { connected_stem_basename .. "_r", connected_stem_basename .. "_l", connected_stem_basename .. "_t", From 56310a3624bd41f50e6e14b8248e8af70be62e94 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 22 May 2021 23:56:52 +0200 Subject: [PATCH 018/103] [mcl_end] fix some warnings --- mods/ITEMS/mcl_end/chorus_plant.lua | 13 ++++++------- mods/ITEMS/mcl_end/end_crystal.lua | 4 +++- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index 597842867..b54259885 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -29,7 +29,7 @@ local no_detach = {} -- This detaches all chorus plants that are/were attached -- at start_pos. -mcl_end.detach_chorus_plant = function(start_pos, digger) +function mcl_end.detach_chorus_plant(start_pos, digger) -- This node should not call a detach function, do NOTHING local hash = minetest.hash_node_position(start_pos) if no_detach[hash] ~= nil then @@ -106,11 +106,11 @@ mcl_end.detach_chorus_plant = function(start_pos, digger) no_detach = {} end -mcl_end.check_detach_chorus_plant = function(pos, oldnode, oldmetadata, digger) +function mcl_end.check_detach_chorus_plant(pos, oldnode, oldmetadata, digger) mcl_end.detach_chorus_plant(pos, digger) end -mcl_end.check_blast_chorus_plant = function(pos) +function mcl_end.check_blast_chorus_plant(pos) minetest.remove_node(pos) mcl_end.detach_chorus_plant(pos) end @@ -139,7 +139,7 @@ minetest.register_node("mcl_end:chorus_flower", { node_placement_prediction = "", on_place = function(itemstack, placer, pointed_thing) local node_under = minetest.get_node(pointed_thing.under) - local node_above = minetest.get_node(pointed_thing.above) + --local node_above = minetest.get_node(pointed_thing.above) if placer and not placer:get_player_control().sneak then -- Use pointed node's on_rightclick function first, if present if minetest.registered_nodes[node_under.name] and minetest.registered_nodes[node_under.name].on_rightclick then @@ -309,7 +309,7 @@ minetest.register_node("mcl_end:chorus_plant", { }) -- Grow a complete chorus plant at pos -mcl_end.grow_chorus_plant = function(pos, node, pr) +function mcl_end.grow_chorus_plant(pos, node, pr) local flowers = { pos } -- Plant initial flower (if it isn't there already) if not node then @@ -340,7 +340,7 @@ end -- Grow a single step of a chorus plant at pos. -- Pos must be a chorus flower. -mcl_end.grow_chorus_plant_step = function(pos, node, pr) +function mcl_end.grow_chorus_plant_step(pos, node, pr) local new_flower_buds = {} local above = { x = pos.x, y = pos.y + 1, z = pos.z } local node_above = minetest.get_node(above) @@ -408,7 +408,6 @@ mcl_end.grow_chorus_plant_step = function(pos, node, pr) elseif branching == true then branches = pr:next(0, 3) end - local branch_grown = false for b=1, branches do local next_branch = pr:next(1, #around) local branch = vector.add(pos, around[next_branch]) diff --git a/mods/ITEMS/mcl_end/end_crystal.lua b/mods/ITEMS/mcl_end/end_crystal.lua index 78fcc0e21..a188be383 100644 --- a/mods/ITEMS/mcl_end/end_crystal.lua +++ b/mods/ITEMS/mcl_end/end_crystal.lua @@ -1,5 +1,7 @@ local S = minetest.get_translator("mcl_end") +local vector = vector + local explosion_strength = 6 local directions = { @@ -45,7 +47,7 @@ local function set_crystal_animation(self) end local function spawn_crystal(pos) - local crystal = minetest.add_entity(pos, "mcl_end:crystal") + minetest.add_entity(pos, "mcl_end:crystal") if not vector.equals(pos, vector.floor(pos)) then return end if mcl_worlds.pos_to_dimension(pos) ~= "end" then return end local portal_center From bbde3b551f08a3dbe8a727b5acd49e54f495df59 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 00:01:30 +0200 Subject: [PATCH 019/103] [mcl_enchanting] fix warnings --- mods/ITEMS/mcl_enchanting/engine.lua | 4 ++-- mods/ITEMS/mcl_enchanting/init.lua | 11 +++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index 89fdc393d..47db36870 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -250,7 +250,7 @@ local function get_after_use_callback(itemdef) itemstack:add_wear(digparams.wear) end - local enchantments = mcl_enchanting.get_enchantments(itemstack) + --local enchantments = mcl_enchanting.get_enchantments(itemstack) mcl_enchanting.update_groupcaps(itemstack) end end @@ -292,7 +292,7 @@ end function mcl_enchanting.get_possible_enchantments(itemstack, enchantment_level, treasure) local possible_enchantments, weights, accum_weight = {}, {}, 0 for enchantment, enchantment_def in pairs(mcl_enchanting.enchantments) do - local supported, _, _, primary = mcl_enchanting.can_enchant(itemstack, enchantment, 1) + local _, _, _, primary = mcl_enchanting.can_enchant(itemstack, enchantment, 1) if primary or treasure then table.insert(possible_enchantments, enchantment) accum_weight = accum_weight + enchantment_def.weight diff --git a/mods/ITEMS/mcl_enchanting/init.lua b/mods/ITEMS/mcl_enchanting/init.lua index 26fd5e19d..06f9b0f75 100644 --- a/mods/ITEMS/mcl_enchanting/init.lua +++ b/mods/ITEMS/mcl_enchanting/init.lua @@ -1,6 +1,9 @@ local modpath = minetest.get_modpath("mcl_enchanting") local S = minetest.get_translator("mcl_enchanting") +local math = math +local vector = vector + mcl_enchanting = { book_offset = vector.new(0, 0.75, 0), book_animations = {["close"] = 1, ["opening"] = 2, ["open"] = 3, ["closing"] = 4}, @@ -122,7 +125,7 @@ minetest.register_chatcommand("forceenchant", { return false, S("Player '@1' cannot be found.", target_name) end local itemstack = target:get_wielded_item() - local can_enchant, errorstring, extra_info = mcl_enchanting.can_enchant(itemstack, enchantment, level) + local _, errorstring = mcl_enchanting.can_enchant(itemstack, enchantment, level) if errorstring == "enchantment invalid" then return false, S("There is no such enchantment '@1'.", enchantment) elseif errorstring == "item missing" then @@ -242,9 +245,9 @@ minetest.register_node("mcl_enchanting:table", { on_rotate = rotate, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) local player_meta = clicker:get_meta() - local table_meta = minetest.get_meta(pos) - local num_bookshelves = table_meta:get_int("mcl_enchanting:num_bookshelves") - local table_name = table_meta:get_string("name") + --local table_meta = minetest.get_meta(pos) + --local num_bookshelves = table_meta:get_int("mcl_enchanting:num_bookshelves") + local table_name = minetest.get_meta(pos):get_string("name") if table_name == "" then table_name = S("Enchant") end From b3c0e7c1bd0c1ce7520b747722d7da40a4c2b597 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 00:01:53 +0200 Subject: [PATCH 020/103] [mcl_dye] fix warnings --- mods/ITEMS/mcl_dye/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_dye/init.lua b/mods/ITEMS/mcl_dye/init.lua index 2897e96ec..863abd3d2 100644 --- a/mods/ITEMS/mcl_dye/init.lua +++ b/mods/ITEMS/mcl_dye/init.lua @@ -327,7 +327,7 @@ minetest.register_craftitem("mcl_dye:white", { _doc_items_usagehelp = S("Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place."), stack_max = 64, groups = dyelocal.dyes[1][4], - on_place = function(itemstack, user, pointed_thing) + on_place = function(itemstack, user, pointed_thing) -- Use pointed node's on_rightclick function first, if present local node = minetest.get_node(pointed_thing.under) if user and not user:get_player_control().sneak then From 30e83088d4dddf1349da06f87d8d1dbf669b4c3b Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 00:03:34 +0200 Subject: [PATCH 021/103] [mcl_doors] fix warnings --- mods/ITEMS/mcl_doors/api_trapdoors.lua | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index c8f769c67..3999ad0bf 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -98,13 +98,11 @@ function mcl_doors:register_trapdoor(name, def) if not usagehelp and not def.only_redstone_can_open then usagehelp = S("To open or close this trapdoor, rightclick it or send a redstone signal to it.") end - if not tt_help then - if def.only_redstone_can_open then - tt_help = S("Openable by redstone power") - else - tt_help = S("Openable by players and redstone power") - end - end + if def.only_redstone_can_open then + tt_help = S("Openable by redstone power") + else + tt_help = S("Openable by players and redstone power") + end -- Closed trapdoor @@ -164,7 +162,7 @@ function mcl_doors:register_trapdoor(name, def) local fpos = get_fpos(placer, pointed_thing) - local origname = itemstack:get_name() + --local origname = itemstack:get_name() if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) or (fpos < -0.5 and fpos > -0.999999999) then param2 = param2 + 20 From f9a86947e58316d2e336740bc2765f0df0a78f03 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 00:09:07 +0200 Subject: [PATCH 022/103] [mcl_core] fix warnings --- mods/ITEMS/mcl_core/nodes_base.lua | 5 ++--- mods/ITEMS/mcl_core/nodes_climb.lua | 1 - mods/ITEMS/mcl_core/nodes_glass.lua | 4 ++-- mods/ITEMS/mcl_core/nodes_liquid.lua | 7 +++++-- mods/ITEMS/mcl_core/nodes_misc.lua | 5 ++--- mods/ITEMS/mcl_core/nodes_trees.lua | 5 ++--- 6 files changed, 13 insertions(+), 14 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index 4477f0377..39015e53b 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -990,9 +990,8 @@ for i=1,8 do local itemcount = itemstack:get_count() local fakestack = ItemStack(itemstring.." "..itemcount) fakestack:set_name("mcl_core:snow_"..math.min(8, (i+g))) - local success - itemstack, success = minetest.item_place(fakestack, placer, pointed_thing) - minetest.sound_play(mcl_sounds.node_sound_snow_defaults().place, {pos = below}, true) + itemstack = minetest.item_place(fakestack, placer, pointed_thing) + minetest.sound_play(mcl_sounds.node_sound_snow_defaults().place, {pos = pointed_thing.under}, true) itemstack:set_name(itemstring) return itemstack end diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index d9ecd76d3..3b2d3ab60 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -120,7 +120,6 @@ minetest.register_node("mcl_core:vine", { local node = minetest.get_node(under) local def = minetest.registered_nodes[node.name] if not def then return itemstack end - local groups = def.groups -- Check special rightclick action of pointed node if def and def.on_rightclick then diff --git a/mods/ITEMS/mcl_core/nodes_glass.lua b/mods/ITEMS/mcl_core/nodes_glass.lua index 85bf614f4..8c12d8b93 100644 --- a/mods/ITEMS/mcl_core/nodes_glass.lua +++ b/mods/ITEMS/mcl_core/nodes_glass.lua @@ -20,7 +20,7 @@ minetest.register_node("mcl_core:glass", { }) ------------------------ --- Create Color Glass -- +-- Create Color Glass -- ------------------------ local canonical_color = "yellow" function mcl_core.add_stained_glass(desc, recipeitem, colorgroup, color) @@ -54,7 +54,7 @@ function mcl_core.add_stained_glass(desc, recipeitem, colorgroup, color) _mcl_hardness = 0.3, _mcl_silk_touch_drop = true, }) - + minetest.register_craft({ output = 'mcl_core:glass_'..color..' 8', recipe = { diff --git a/mods/ITEMS/mcl_core/nodes_liquid.lua b/mods/ITEMS/mcl_core/nodes_liquid.lua index c49b685eb..99d33cf59 100644 --- a/mods/ITEMS/mcl_core/nodes_liquid.lua +++ b/mods/ITEMS/mcl_core/nodes_liquid.lua @@ -3,7 +3,10 @@ local S = minetest.get_translator("mcl_core") local N = function(s) return s end -local WATER_ALPHA = 179 +local vector = vector +local math = math + +--local WATER_ALPHA = 179 local WATER_VISC = 1 local LAVA_VISC = 7 local LIGHT_LAVA = minetest.LIGHT_MAX @@ -215,7 +218,7 @@ local emit_lava_particle = function(pos) return end local ppos = vector.add(pos, { x = math.random(-7, 7)/16, y = 0.45, z = math.random(-7, 7)/16}) - local spos = vector.add(ppos, { x = 0, y = -0.2, z = 0 }) + --local spos = vector.add(ppos, { x = 0, y = -0.2, z = 0 }) local vel = { x = math.random(-3, 3)/10, y = math.random(4, 7), z = math.random(-3, 3)/10 } local acc = { x = 0, y = -9.81, z = 0 } -- Lava droplet diff --git a/mods/ITEMS/mcl_core/nodes_misc.lua b/mods/ITEMS/mcl_core/nodes_misc.lua index 8b36f0696..a8188350a 100644 --- a/mods/ITEMS/mcl_core/nodes_misc.lua +++ b/mods/ITEMS/mcl_core/nodes_misc.lua @@ -31,7 +31,7 @@ minetest.register_node("mcl_core:slimeblock", { node_box = { type = "fixed", fixed = { - {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, + {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, } }, @@ -39,7 +39,6 @@ minetest.register_node("mcl_core:slimeblock", { type = "regular", }, tiles = {"mcl_core_slime.png"}, - paramtype = "light", use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "blend" or true, stack_max = 64, -- According to Minecraft Wiki, bouncing off a slime block from a height off 255 blocks should result in a bounce height of 50 blocks @@ -213,7 +212,7 @@ minetest.register_node("mcl_core:barrier", { -- Same as barrier, but non-pointable. This node is only to be used internally to separate realms. -- It must NOT be used for anything else. -- This node only exists because Minetest does not have support for “dimensions” yet and needs to --- be removed when support for this is implemented. +-- be removed when support for this is implemented. minetest.register_node("mcl_core:realm_barrier", { description = S("Realm Barrier"), _doc_items_create_entry = false, diff --git a/mods/ITEMS/mcl_core/nodes_trees.lua b/mods/ITEMS/mcl_core/nodes_trees.lua index 801810dbd..cc64cd9cf 100644 --- a/mods/ITEMS/mcl_core/nodes_trees.lua +++ b/mods/ITEMS/mcl_core/nodes_trees.lua @@ -81,7 +81,7 @@ local register_stripped_trunk = function(subname, description_stripped_trunk, de _mcl_blast_resistance = 2, _mcl_hardness = 2, }) - + minetest.register_craft({ output = "mcl_core:"..subname.."_bark 3", recipe = { @@ -107,13 +107,12 @@ local register_wooden_planks = function(subname, description, tiles) end local register_leaves = function(subname, description, longdesc, tiles, sapling, drop_apples, sapling_chances, leafdecay_distance) - local drop if leafdecay_distance == nil then leafdecay_distance = 4 end local apple_chances = {200, 180, 160, 120, 40} local stick_chances = {50, 45, 30, 35, 10} - + local function get_drops(fortune_level) local drop = { max_items = 1, From b8488ce55ea4cbfc92cd2ff3734f04ff996cf81f Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 00:12:54 +0200 Subject: [PATCH 023/103] [mcl_core] fix missing warnings --- mods/ITEMS/mcl_core/craftitems.lua | 2 -- mods/ITEMS/mcl_core/functions.lua | 16 +++++++--------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/mods/ITEMS/mcl_core/craftitems.lua b/mods/ITEMS/mcl_core/craftitems.lua index 2428bb5ea..886535473 100644 --- a/mods/ITEMS/mcl_core/craftitems.lua +++ b/mods/ITEMS/mcl_core/craftitems.lua @@ -28,7 +28,6 @@ minetest.register_craftitem("mcl_core:coal_lump", { description = S("Coal"), _doc_items_longdesc = S("“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things."), _doc_items_hidden = false, - groups = { coal=1 }, inventory_image = "default_coal_lump.png", stack_max = 64, groups = { craftitem=1, coal=1 }, @@ -38,7 +37,6 @@ minetest.register_craftitem("mcl_core:charcoal_lump", { description = S("Charcoal"), _doc_items_longdesc = S("Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks."), _doc_items_hidden = false, - groups = { coal=1 }, inventory_image = "mcl_core_charcoal.png", stack_max = 64, groups = { craftitem=1, coal=1 }, diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index 732c386b0..a6c21302e 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -24,7 +24,7 @@ minetest.register_abm({ for w=1, #water do local waternode = minetest.get_node(water[w]) - local watertype = minetest.registered_nodes[waternode.name].liquidtype + --local watertype = minetest.registered_nodes[waternode.name].liquidtype -- Lava on top of water: Water turns into stone if water[w].y < pos.y and water[w].x == pos.x and water[w].z == pos.z then minetest.set_node(water[w], {name="mcl_core:stone"}) @@ -336,13 +336,12 @@ end -- oak tree. function mcl_core.generate_tree(pos, tree_type, options) pos.y = pos.y-1 - local nodename = minetest.get_node(pos).name + --local nodename = minetest.get_node(pos).name pos.y = pos.y+1 if not minetest.get_node_light(pos) then return end - local node local two_by_two = options and options.two_by_two local balloon = options and options.balloon @@ -390,7 +389,7 @@ end function mcl_core.generate_v6_oak_tree(pos) local trunk = "mcl_core:tree" local leaves = "mcl_core:leaves" - local node = {name = ""} + local node for dy=1,4 do pos.y = pos.y+dy if minetest.get_node(pos).name ~= "air" then @@ -409,10 +408,10 @@ function mcl_core.generate_v6_oak_tree(pos) node = {name = leaves} pos.y = pos.y+3 - local rarity = 0 + --[[local rarity = 0 if math.random(0, 10) == 3 then rarity = 1 - end + end]] for dx=-2,2 do for dz=-2,2 do for dy=0,3 do @@ -787,7 +786,6 @@ minetest.register_abm({ if pos == nil then return end - local can_change = false local above = {x=pos.x, y=pos.y+1, z=pos.z} local abovenode = minetest.get_node(above) if minetest.get_item_group(abovenode.name, "liquid") ~= 0 or minetest.get_item_group(abovenode.name, "opaque") == 1 then @@ -1021,7 +1019,7 @@ local sapling_grow_action = function(tree_id, soil_needed, one_by_one, two_by_tw if one_by_one and check_tree_growth(pos, tree_id) then -- Single sapling minetest.set_node(pos, {name="air"}) - local r = math.random(1, 12) + --local r = math.random(1, 12) mcl_core.generate_tree(pos, tree_id) return end @@ -1418,7 +1416,7 @@ minetest.register_abm({ for s=1, #surround do local spos = vector.add(p0, surround[s]) local maybe_vine = minetest.get_node(spos) - local surround_inverse = vector.multiply(surround[s], -1) + --local surround_inverse = vector.multiply(surround[s], -1) if maybe_vine.name == "mcl_core:vine" and (not mcl_core.check_vines_supported(spos, maybe_vine)) then minetest.remove_node(spos) vinedecay_particles(spos, maybe_vine) From 402a1d0088061138c65faa7a02fdeb7d56864a50 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 00:13:27 +0200 Subject: [PATCH 024/103] [mcl_core] fix last warning --- mods/ITEMS/mcl_core/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index a6c21302e..7f9a83bc9 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -23,7 +23,7 @@ minetest.register_abm({ local lavatype = minetest.registered_nodes[node.name].liquidtype for w=1, #water do - local waternode = minetest.get_node(water[w]) + --local waternode = minetest.get_node(water[w]) --local watertype = minetest.registered_nodes[waternode.name].liquidtype -- Lava on top of water: Water turns into stone if water[w].y < pos.y and water[w].x == pos.x and water[w].z == pos.z then From 8ac5d32416124d23cb311d090d01b61e707d6d9c Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 00:17:12 +0200 Subject: [PATCH 025/103] [mcl_compass] fix warnings --- mods/ITEMS/mcl_compass/init.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_compass/init.lua b/mods/ITEMS/mcl_compass/init.lua index 2c71eeac0..31944fa88 100644 --- a/mods/ITEMS/mcl_compass/init.lua +++ b/mods/ITEMS/mcl_compass/init.lua @@ -4,7 +4,8 @@ mcl_compass = {} local compass_frames = 32 -local default_spawn_settings = minetest.settings:get("static_spawnpoint") +--Not sure spawn point should be dymanic (is it in mc?) +--local default_spawn_settings = minetest.settings:get("static_spawnpoint") -- Timer for random compass spinning local random_timer = 0 @@ -79,7 +80,9 @@ for i,img in ipairs(images) do if i == stereotype_frame then inv = 0 end - local use_doc, longdesc, usagehelp, tt + local use_doc, longdesc, tt + --Why is there no usage help? This should be fixed. + --local usagehelp use_doc = i == stereotype_frame if use_doc then tt = S("Points to the world origin") @@ -91,7 +94,7 @@ for i,img in ipairs(images) do _tt_help = tt, _doc_items_create_entry = use_doc, _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usagehelp, + --_doc_items_usagehelp = usagehelp, inventory_image = img, wield_image = img, stack_max = 64, From df1eeba6b61905c045c7ba658cf1c31950a39b4d Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 00:18:42 +0200 Subject: [PATCH 026/103] [mcl_clock] fix warnings --- mods/ITEMS/mcl_clock/init.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/mods/ITEMS/mcl_clock/init.lua b/mods/ITEMS/mcl_clock/init.lua index 0f6978447..0eb83ee80 100644 --- a/mods/ITEMS/mcl_clock/init.lua +++ b/mods/ITEMS/mcl_clock/init.lua @@ -96,8 +96,6 @@ minetest.register_globalstep(function(dtime) for p, player in pairs(minetest.get_connected_players()) do for s, stack in pairs(player:get_inventory():get_list("main")) do - local dim = mcl_worlds.pos_to_dimension(player:get_pos()) - local frame -- Clocks do not work in certain zones if not mcl_worlds.clock_works(player:get_pos()) then From 60736d04b8717e71459f29c5fd682a870094bb36 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 00:31:22 +0200 Subject: [PATCH 027/103] [mcl_chests] fix some warnings --- mods/ITEMS/mcl_chests/init.lua | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 824530eb3..b92ed4c01 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -162,13 +162,14 @@ Value: Otherwise: nil ]] local open_chests = {} -local function back_is_blocked(pos, dir) +--[[local function back_is_blocked(pos, dir) pos = vector.add(pos, dir) local def = minetest.registered_nodes[minetest.get_node(pos).name] pos.y = pos.y + 1 local def2 = minetest.registered_nodes[minetest.get_node(pos).name] return not def or def.groups.opaque == 1 or not def2 or def2.groups.opaque == 1 -end +end]] + -- To be called if a player opened a chest local player_chest_open = function(player, pos, node_name, textures, param2, double, sound, mesh, shulker) local name = player:get_player_name() @@ -696,7 +697,6 @@ minetest.register_node("mcl_chests:"..basename.."_right", { minetest.swap_node(p, { name = small_name, param2 = param2 }) create_entity(p, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest", "chest") - local meta = minetest.get_meta(pos) end, after_dig_node = drop_items_chest, on_blast = on_chest_blast, @@ -898,7 +898,7 @@ register_chest("trapped_chest_on", "trapped_chest" ) -local function close_if_trapped_chest(pos, player) +--[[local function close_if_trapped_chest(pos, player) local node = minetest.get_node(pos) if node.name == "mcl_chests:trapped_chest_on_small" then @@ -928,7 +928,7 @@ local function close_if_trapped_chest(pos, player) player_chest_close(player) end -end +end]] -- Disable chest when it has been closed minetest.register_on_player_receive_fields(function(player, formname, fields) @@ -1330,7 +1330,6 @@ minetest.register_craft({ -- Save metadata of shulker box when used in crafting minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) - local new = itemstack:get_name() if minetest.get_item_group(itemstack:get_name(), "shulker_box") ~= 1 then return end From 621a5a53a8e0ab6ac19c8015f342e589807490aa Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 00:32:04 +0200 Subject: [PATCH 028/103] [mcl_bucket] fix warnings --- mods/ITEMS/mcl_buckets/register.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_buckets/register.lua b/mods/ITEMS/mcl_buckets/register.lua index 43156716c..5e46b6ce0 100644 --- a/mods/ITEMS/mcl_buckets/register.lua +++ b/mods/ITEMS/mcl_buckets/register.lua @@ -10,12 +10,12 @@ local sound_place = function(itemname, pos) end end -local sound_take = function(itemname, pos) +--[[local sound_take = function(itemname, pos) local def = minetest.registered_nodes[itemname] if def and def.sounds and def.sounds.dug then minetest.sound_play(def.sounds.dug, {gain=1.0, pos = pos, pitch = 1 + math.random(-10, 10)*0.005}, true) end -end +end]] if mod_mcl_core then -- Lava bucket From ac459d3914a946d930ccf7025f2026fc452f2fe4 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 00:42:31 +0200 Subject: [PATCH 029/103] [mcl_bucket] fix warnings --- mods/ITEMS/mcl_buckets/init.lua | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/mods/ITEMS/mcl_buckets/init.lua b/mods/ITEMS/mcl_buckets/init.lua index 7e67eee8e..fd07006b7 100644 --- a/mods/ITEMS/mcl_buckets/init.lua +++ b/mods/ITEMS/mcl_buckets/init.lua @@ -9,7 +9,7 @@ minetest.register_alias("bucket:bucket_lava", "mcl_buckets:bucket_lava") local mod_doc = minetest.get_modpath("doc") local mod_mcl_core = minetest.get_modpath("mcl_core") -local mod_mclx_core = minetest.get_modpath("mclx_core") +--local mod_mclx_core = minetest.get_modpath("mclx_core") if mod_mcl_core then minetest.register_craft({ @@ -76,10 +76,11 @@ function mcl_buckets.register_liquid(def) local node = minetest.get_node(pointed_thing.under) local place_pos = pointed_thing.under local nn = node.name + local nodedef = minetest.registered_nodes[nn] -- Call on_rightclick if the pointed node defines it if user and not user:get_player_control().sneak then - if minetest.registered_nodes[nn] and minetest.registered_nodes[nn].on_rightclick then - return minetest.registered_nodes[nn].on_rightclick(place_pos, node, user, itemstack) or itemstack + if nodedef and nodedef.on_rightclick then + return nodedef.on_rightclick(place_pos, node, user, itemstack) or itemstack end end @@ -90,11 +91,9 @@ function mcl_buckets.register_liquid(def) node_place = def.source_place end -- Check if pointing to a buildable node - local item = itemstack:get_name() + --local item = itemstack:get_name() - if def.extra_check and def.extra_check(place_pos, user) == false then - -- Fail placement of liquid - elseif minetest.registered_nodes[nn] and minetest.registered_nodes[nn].buildable_to then + if def.extra_check and def.extra_check(place_pos, user) == true and nodedef and nodedef.buildable_to then -- buildable; replace the node local pns = user:get_player_name() if minetest.is_protected(place_pos, pns) then @@ -147,12 +146,12 @@ function mcl_buckets.register_liquid(def) end end, _on_dispense = function(stack, pos, droppos, dropnode, dropdir) - local iname = stack:get_name() + --local iname = stack:get_name() local buildable = minetest.registered_nodes[dropnode.name].buildable_to or dropnode.name == "mcl_portals:portal" - if def.extra_check and def.extra_check(droppos, nil) == false then + --if def.extra_check and def.extra_check(droppos, nil) == false then -- Fail placement of liquid - elseif buildable then + if def.extra_check and def.extra_check(droppos, nil) == true and buildable then -- buildable; replace the node local node_place if type(def.source_place) == "function" then @@ -208,8 +207,8 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", { if not minetest.is_creative_enabled(user:get_player_name()) then new_bucket = ItemStack({name = liquiddef.itemname}) if liquiddef.on_take then - liquiddef.on_take(user) - end + liquiddef.on_take(user) + end end minetest.add_node(pointed_thing.under, {name="air"}) From fdfb586b16cce2ad9134206e779f4367bb5e5561 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 00:58:30 +0200 Subject: [PATCH 030/103] [mcl_brewing] fix warnings --- mods/ITEMS/mcl_brewing/init.lua | 37 ++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/mods/ITEMS/mcl_brewing/init.lua b/mods/ITEMS/mcl_brewing/init.lua index 617929ff7..1724a982d 100644 --- a/mods/ITEMS/mcl_brewing/init.lua +++ b/mods/ITEMS/mcl_brewing/init.lua @@ -61,14 +61,14 @@ local brewing_formspec = "size[9,8.75]".. "listring[context;stand]" -local function swap_node(pos, name) +--[[local function swap_node(pos, name) local node = minetest.get_node(pos) if node.name == name then return end node.name = name minetest.swap_node(pos, node) -end +end]] local function brewable(inv) @@ -110,12 +110,13 @@ local function brewing_stand_timer(pos, elapsed) local BREW_TIME = 20 -- all brews brew the same local BURN_TIME = BREW_TIME * 10 - local input_item = meta:get_string("input_item") or "" + --local input_item = meta:get_string("input_item") or "" local stand_timer = meta:get_float("stand_timer") or 0 local fuel = meta:get_float("fuel") or 0 local inv = meta:get_inventory() - local input_list, stand_list, fuel_list, brew_output, d + --local input_list, stand_list, fuel_list + local brew_output, d local input_count, fuel_name, fuel_count, formspec, fuel_percent, brew_percent local update = true @@ -124,9 +125,9 @@ local function brewing_stand_timer(pos, elapsed) update = false - input_list = inv:get_list("input") - stand_list = inv:get_list("stand") - fuel_list = inv:get_list("fuel") + --input_list = inv:get_list("input") + --stand_list = inv:get_list("stand") + --fuel_list = inv:get_list("fuel") -- TODO ... fix this. Goal is to reset the process if the stand changes -- for i=1, inv:get_size("stand", i) do -- reset the process due to change @@ -237,7 +238,7 @@ local function brewing_stand_timer(pos, elapsed) end -local function allow_metadata_inventory_put(pos, listname, index, stack, player) +--[[local function allow_metadata_inventory_put(pos, listname, index, stack, player) local name = player:get_player_name() if minetest.is_protected(pos, name) then minetest.record_protection_violation(pos, name) @@ -273,7 +274,7 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player) elseif listname == "stand" then return 0 end -end +end]] -- Drop input items of brewing_stand at pos with metadata meta @@ -315,12 +316,14 @@ local doc_string = S("When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.").."\n".. S("Different combinations of brewing materials and liquids will give different results. Try to experiment!") -local tiles = {"mcl_brewing_top.png", --top - "mcl_brewing_base.png", --bottom - "mcl_brewing_side.png", --right - "mcl_brewing_side.png", --left - "mcl_brewing_side.png", --back - "mcl_brewing_side.png^[transformFX"} --front +local tiles = { + "mcl_brewing_top.png", --top + "mcl_brewing_base.png", --bottom + "mcl_brewing_side.png", --right + "mcl_brewing_side.png", --left + "mcl_brewing_side.png", --back + "mcl_brewing_side.png^[transformFX", --front +} local allow_put = function(pos, listname, index, stack, player) local name = player:get_player_name() @@ -349,11 +352,11 @@ local on_put = function(pos, listname, index, stack, player) --some code here to enforce only potions getting placed on stands end -local after_dig = function(pos, oldnode, oldmetadata, digger) +--[[local after_dig = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) meta:from_table(oldmetadata) drop_brewing_stand_items(pos, meta) -end +end]] local on_destruct = function(pos) local meta = minetest.get_meta(pos) From b7bf566190cb9a4336ab2cd4b83f54383ce77142 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 01:06:34 +0200 Subject: [PATCH 031/103] [mcl_bows] fix warnings --- mods/ITEMS/mcl_bows/arrow.lua | 27 +++++++++++++++------------ mods/ITEMS/mcl_bows/bow.lua | 9 ++++----- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index c34e93479..a56b2e7cf 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -1,29 +1,32 @@ local S = minetest.get_translator("mcl_bows") +local math = math +local vector = vector + -- Time in seconds after which a stuck arrow is deleted local ARROW_TIMEOUT = 60 -- Time after which stuck arrow is rechecked for being stuck local STUCK_RECHECK_TIME = 5 -local GRAVITY = 9.81 +--local GRAVITY = 9.81 local YAW_OFFSET = -math.pi/2 -local dir_to_pitch = function(dir) - local dir2 = vector.normalize(dir) +local function dir_to_pitch(dir) + --local dir2 = vector.normalize(dir) local xz = math.abs(dir.x) + math.abs(dir.z) return -math.atan2(-dir.y, xz) end -local random_arrow_positions = function(positions, placement) - if positions == 'x' then +local function random_arrow_positions(positions, placement) + if positions == "x" then return math.random(-4, 4) - elseif positions == 'y' then + elseif positions == "y" then return math.random(0, 10) end - if placement == 'front' and positions == 'z' then + if placement == "front" and positions == "z" then return 3 - elseif placement == 'back' and positions == 'z' then + elseif placement == "back" and positions == "z" then return -3 end return 0 @@ -257,12 +260,12 @@ ARROW_ENTITY.on_step = function(self, dtime) damage_groups={fleshy=self._damage}, }, self.object:get_velocity()) if obj:is_player() then - local placement = '' + local placement self._placement = math.random(1, 2) if self._placement == 1 then - placement = 'front' + placement = "front" else - placement = 'back' + placement = "back" end self._in_player = true if self._placement == 2 then @@ -393,7 +396,7 @@ ARROW_ENTITY.on_step = function(self, dtime) if not v then v = 0 end - local old_v = self._viscosity + --local old_v = self._viscosity self._viscosity = v local vpenalty = math.max(0.1, 0.98 - 0.1 * v) if math.abs(vel.x) > 0.001 then diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 2257fcc5e..f752142c2 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -228,11 +228,10 @@ end controls.register_on_release(function(player, key, time) if key~="RMB" then return end - local inv = minetest.get_inventory({type="player", name=player:get_player_name()}) + --local inv = minetest.get_inventory({type="player", name=player:get_player_name()}) local wielditem = player:get_wielded_item() if (wielditem:get_name()=="mcl_bows:bow_0" or wielditem:get_name()=="mcl_bows:bow_1" or wielditem:get_name()=="mcl_bows:bow_2" or wielditem:get_name()=="mcl_bows:bow_0_enchanted" or wielditem:get_name()=="mcl_bows:bow_1_enchanted" or wielditem:get_name()=="mcl_bows:bow_2_enchanted") then - local has_shot = false local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) local speed, damage @@ -272,7 +271,7 @@ controls.register_on_release(function(player, key, time) damage = math.max(1, math.floor(9 * charge_ratio)) end - has_shot = player_shoot_arrow(wielditem, player, speed, damage, is_critical) + local has_shot = player_shoot_arrow(wielditem, player, speed, damage, is_critical) if enchanted then wielditem:set_name("mcl_bows:bow_enchanted") @@ -299,7 +298,7 @@ controls.register_on_hold(function(player, key, time) if key ~= "RMB" or not (creative or get_arrow(player)) then return end - local inv = minetest.get_inventory({type="player", name=name}) + --local inv = minetest.get_inventory({type="player", name=name}) local wielditem = player:get_wielded_item() if bow_load[name] == nil and (wielditem:get_name()=="mcl_bows:bow" or wielditem:get_name()=="mcl_bows:bow_enchanted") and wielditem:get_meta():get("active") and (creative or get_arrow(player)) then local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) @@ -346,7 +345,7 @@ minetest.register_globalstep(function(dtime) local name = player:get_player_name() local wielditem = player:get_wielded_item() local wieldindex = player:get_wield_index() - local controls = player:get_player_control() + --local controls = player:get_player_control() if type(bow_load[name]) == "number" and ((wielditem:get_name()~="mcl_bows:bow_0" and wielditem:get_name()~="mcl_bows:bow_1" and wielditem:get_name()~="mcl_bows:bow_2" and wielditem:get_name()~="mcl_bows:bow_0_enchanted" and wielditem:get_name()~="mcl_bows:bow_1_enchanted" and wielditem:get_name()~="mcl_bows:bow_2_enchanted") or wieldindex ~= bow_index[name]) then reset_bow_state(player, true) end From 892f4b96c94879929dd0261c5901098b671bb03d Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 01:07:10 +0200 Subject: [PATCH 032/103] [mcl_books] fix warnings --- mods/ITEMS/mcl_books/init.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index 95b45e69e..86f896707 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -238,7 +238,6 @@ minetest.register_craft_predict(function(itemstack, player, old_craft_grid, craf end local original - local index for i = 1, player:get_inventory():get_size("craft") do if old_craft_grid[i]:get_name() == "mcl_books:written_book" then original = old_craft_grid[i] From 203c7e2c846666ce585ac7895c975894b3576b41 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 01:09:45 +0200 Subject: [PATCH 033/103] [mcl_beds] fix warnings --- mods/ITEMS/mcl_beds/api.lua | 6 ++++-- mods/ITEMS/mcl_beds/functions.lua | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_beds/api.lua b/mods/ITEMS/mcl_beds/api.lua index c0b25b1c5..ee59bc34b 100644 --- a/mods/ITEMS/mcl_beds/api.lua +++ b/mods/ITEMS/mcl_beds/api.lua @@ -48,7 +48,9 @@ local function rotate(pos, node, user, mode, new_param2) return false end - local new_dir, newp = minetest_facedir_to_dir(new_param2) + local newp + local new_dir = minetest_facedir_to_dir(new_param2) + if bottom then newp = vector_add(pos, new_dir) else @@ -153,7 +155,7 @@ function mcl_beds.register_bed(name, def) paramtype2 = "facedir", is_ground_content = false, stack_max = 1, - groups = {handy=1, flammable = 3, bed = 1, dig_by_piston=1, bouncy=66, fall_damage_add_percent=-50, deco_block = 1, flammable=-1}, + groups = {handy=1, bed = 1, dig_by_piston=1, bouncy=66, fall_damage_add_percent=-50, deco_block = 1, flammable=-1}, _mcl_hardness = 0.2, _mcl_blast_resistance = 1, sounds = def.sounds or default_sounds, diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index ecd749603..f1bd096f4 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -319,14 +319,14 @@ function mcl_beds.on_rightclick(pos, player, is_top) -- move to bed if not mcl_beds.player[name] then - local success, message + local message if is_top then - success, message = lay_down(player, ppos, pos) + _, message = lay_down(player, ppos, pos) else local node = minetest.get_node(pos) local dir = minetest.facedir_to_dir(node.param2) local other = vector.add(pos, dir) - success, message = lay_down(player, ppos, other) + _, message = lay_down(player, ppos, other) end if message then mcl_tmp_message.message(player, message) From be5eb621fda50bbbdb93139f466d550cbbb39189 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 10:52:52 +0200 Subject: [PATCH 034/103] [mcl_books] fix warnings --- mods/ITEMS/mcl_books/init.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index 86f896707..b7bd20d9a 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -241,7 +241,6 @@ minetest.register_craft_predict(function(itemstack, player, old_craft_grid, craf for i = 1, player:get_inventory():get_size("craft") do if old_craft_grid[i]:get_name() == "mcl_books:written_book" then original = old_craft_grid[i] - index = i end end if not original then From 8f6a97eefe32583fe8301174f2072f03df5790ab Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 10:57:07 +0200 Subject: [PATCH 035/103] [mcl_beds] fix warnings --- mods/ITEMS/mcl_beds/functions.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index f1bd096f4..fd156757b 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -321,12 +321,12 @@ function mcl_beds.on_rightclick(pos, player, is_top) if not mcl_beds.player[name] then local message if is_top then - _, message = lay_down(player, ppos, pos) + message = select(2, lay_down(player, ppos, pos)) else local node = minetest.get_node(pos) local dir = minetest.facedir_to_dir(node.param2) local other = vector.add(pos, dir) - _, message = lay_down(player, ppos, other) + message = select(2, lay_down(player, ppos, other)) end if message then mcl_tmp_message.message(player, message) From 4bc473bc29ccc262449e2cb27e260a35322dd3b6 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 10:59:07 +0200 Subject: [PATCH 036/103] [mcl_banners] fix some warnings --- mods/ITEMS/mcl_banners/patterncraft.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/ITEMS/mcl_banners/patterncraft.lua b/mods/ITEMS/mcl_banners/patterncraft.lua index fbd0c9e33..516624301 100644 --- a/mods/ITEMS/mcl_banners/patterncraft.lua +++ b/mods/ITEMS/mcl_banners/patterncraft.lua @@ -426,7 +426,6 @@ local banner_pattern_craft = function(itemstack, player, old_craft_grid, craft_i if (pitem == d and minetest.get_item_group(itemname, "dye") == 0) or (pitem == e and itemname ~= e and inv_i ~= banner_index) then pattern_ok = false break - else end inv_i = inv_i + 1 if inv_i > max_i then From a9c49853aa023e8d2dbd1b56f962218ca18cbc29 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 11:01:29 +0200 Subject: [PATCH 037/103] [mesecons_pressureplates] fix warnings --- mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua b/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua index 2e161ae4d..34730760d 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/init.lua @@ -116,7 +116,7 @@ function mesecon.register_pressure_plate(basename, description, textures_off, te wield_image = image_w, paramtype = "light", walkable = false, - description = description, + description = description, on_timer = pp_on_timer, on_construct = function(pos) minetest.get_node_timer(pos):start(PRESSURE_PLATE_INTERVAL) From e75a2e3a671ed314adc60f8e0d1e82a146ef70b4 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 11:02:13 +0200 Subject: [PATCH 038/103] [mesecons_pistons] fix warnings --- mods/ITEMS/REDSTONE/mesecons_pistons/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua b/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua index 3230d9804..f37ffb761 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua @@ -124,7 +124,7 @@ local piston_off = function (pos, node) local dir = piston_get_direction(pistonspec.dir, node) local pullpos = vector.add(pos, vector.multiply(dir, 2)) local meta = minetest.get_meta(pos) - local success, stack, oldstack = mesecon.mvps_pull_single(pullpos, vector.multiply(dir, -1), PISTON_MAXIMUM_PUSH, meta:get_string("owner"), pos) + local success, stack = mesecon.mvps_pull_single(pullpos, vector.multiply(dir, -1), PISTON_MAXIMUM_PUSH, meta:get_string("owner"), pos) if success then mesecon.mvps_process_stack(pos, dir, stack) end From c580c1ccad64a2886970a659d47f29d6c974842c Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 11:17:19 +0200 Subject: [PATCH 039/103] [mesecons_pistons] unify code style --- mods/ITEMS/REDSTONE/mesecons_pistons/init.lua | 271 ++++++++++-------- 1 file changed, 151 insertions(+), 120 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua b/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua index f37ffb761..0073aeb48 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua @@ -2,29 +2,36 @@ local S = minetest.get_translator("mesecons_pistons") local PISTON_MAXIMUM_PUSH = 12 --- Get mesecon rules of pistons -local piston_rules = -{{x=0, y=0, z=1}, --everything apart from z- (pusher side) - {x=1, y=0, z=0}, - {x=-1, y=0, z=0}, - {x=0, y=1, z=0}, - {x=0, y=-1, z=0}} +--Get mesecon rules of pistons -local piston_up_rules = -{{x=0, y=0, z=-1}, --everything apart from y+ (pusher side) - {x=0, y=0, z=1}, - {x=-1, y=0, z=0}, - {x=1, y=0, z=0}, - {x=0, y=-1, z=0}} +--everything apart from z- (pusher side) +local piston_rules = { + {x=0, y=0, z=1}, + {x=1, y=0, z=0}, + {x=-1, y=0, z=0}, + {x=0, y=1, z=0}, + {x=0, y=-1, z=0}, +} -local piston_down_rules = -{{x=0, y=0, z=-1}, --everything apart from y- (pusher side) - {x=0, y=0, z=1}, - {x=-1, y=0, z=0}, - {x=1, y=0, z=0}, - {x=0, y=1, z=0}} +--everything apart from y+ (pusher side) +local piston_up_rules = { + {x=0, y=0, z=-1}, + {x=0, y=0, z=1}, + {x=-1, y=0, z=0}, + {x=1, y=0, z=0}, + {x=0, y=-1, z=0}, +} -local piston_get_rules = function (node) +--everything apart from y- (pusher side) +local piston_down_rules = { + {x=0, y=0, z=-1}, + {x=0, y=0, z=1}, + {x=-1, y=0, z=0}, + {x=1, y=0, z=0}, + {x=0, y=1, z=0}, +} + +local function piston_get_rules(node) local rules = piston_rules for i = 1, node.param2 do rules = mesecon.rotate_rules_left(rules) @@ -32,7 +39,7 @@ local piston_get_rules = function (node) return rules end -local piston_facedir_direction = function (node) +local function piston_facedir_direction(node) local rules = {{x = 0, y = 0, z = -1}} for i = 1, node.param2 do rules = mesecon.rotate_rules_left(rules) @@ -40,7 +47,7 @@ local piston_facedir_direction = function (node) return rules[1] end -local piston_get_direction = function (dir, node) +local function piston_get_direction(dir, node) if type(dir) == "function" then return dir(node) else @@ -50,7 +57,7 @@ end -- Remove pusher of piston. -- To be used when piston was destroyed or dug. -local piston_remove_pusher = function (pos, oldnode) +local function piston_remove_pusher(pos, oldnode) local pistonspec = minetest.registered_nodes[oldnode.name].mesecons_piston local dir = piston_get_direction(pistonspec.dir, oldnode) @@ -70,7 +77,7 @@ end -- Remove base node of piston. -- To be used when pusher was destroyed. -local piston_remove_base = function (pos, oldnode) +local function piston_remove_base(pos, oldnode) local basenodename = minetest.registered_nodes[oldnode.name].corresponding_piston local pistonspec = minetest.registered_nodes[basenodename].mesecons_piston @@ -89,7 +96,7 @@ local piston_remove_base = function (pos, oldnode) end end -local piston_on = function (pos, node) +local function piston_on(pos, node) local pistonspec = minetest.registered_nodes[node.name].mesecons_piston local dir = piston_get_direction(pistonspec.dir, node) @@ -113,7 +120,7 @@ local piston_on = function (pos, node) end end -local piston_off = function (pos, node) +local function piston_off(pos, node) local pistonspec = minetest.registered_nodes[node.name].mesecons_piston minetest.swap_node(pos, {param2 = node.param2, name = pistonspec.offname}) piston_remove_pusher (pos, node) @@ -130,7 +137,7 @@ local piston_off = function (pos, node) end end -local piston_orientate = function (pos, placer) +local function piston_orientate(pos, placer) mesecon.mvps_set_owner(pos, placer) -- not placed by player @@ -158,14 +165,14 @@ local piston_pusher_box = { fixed = { {-2/16, -2/16, -.5 + pt, 2/16, 2/16, .5 + pt}, {-.5 , -.5 , -.5 , .5 , .5 , -.5 + pt}, - } + }, } local piston_on_box = { type = "fixed", fixed = { {-.5, -.5, -.5 + pt, .5, .5, .5} - } + }, } @@ -195,18 +202,20 @@ minetest.register_node("mesecons_pistons:piston_normal_off", { "mesecons_piston_bottom.png^[transformR270", "mesecons_piston_back.png", "mesecons_piston_pusher_front.png" - }, - groups = {handy = 1, piston=1}, + }, + groups = {handy=1, piston=1}, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, after_place_node = piston_orientate, mesecons_piston = pistonspec_normal, sounds = mcl_sounds.node_sound_stone_defaults(), - mesecons = {effector={ - action_on = piston_on, - rules = piston_get_rules - }}, + mesecons = { + effector = { + action_on = piston_on, + rules = piston_get_rules + }, + }, _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, on_rotate = function(pos, node, user, mode) @@ -227,8 +236,8 @@ minetest.register_node("mesecons_pistons:piston_normal_on", { "mesecons_piston_bottom.png^[transformR270", "mesecons_piston_back.png", "mesecons_piston_on_front.png" - }, - groups = {handy=1, piston=1, not_in_creative_inventory = 1}, + }, + groups = {handy=1, piston=1, not_in_creative_inventory=1}, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, @@ -238,10 +247,12 @@ minetest.register_node("mesecons_pistons:piston_normal_on", { selection_box = piston_on_box, mesecons_piston = pistonspec_normal, sounds = mcl_sounds.node_sound_stone_defaults(), - mesecons = {effector={ - action_off = piston_off, - rules = piston_get_rules - }}, + mesecons = { + effector = { + action_off = piston_off, + rules = piston_get_rules + }, + }, _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, on_rotate = false, @@ -257,10 +268,10 @@ minetest.register_node("mesecons_pistons:piston_pusher_normal", { "mesecons_piston_pusher_right.png", "mesecons_piston_pusher_back.png", "mesecons_piston_pusher_front.png" - }, + }, paramtype = "light", paramtype2 = "facedir", - groups = { piston_pusher = 1 }, + groups = {piston_pusher=1}, is_ground_content = false, after_destruct = piston_remove_base, diggable = false, @@ -299,7 +310,7 @@ minetest.register_node("mesecons_pistons:piston_sticky_off", { "mesecons_piston_bottom.png^[transformR270", "mesecons_piston_back.png", "mesecons_piston_pusher_front_sticky.png" - }, + }, groups = {handy=1, piston=2}, paramtype = "light", paramtype2 = "facedir", @@ -307,10 +318,12 @@ minetest.register_node("mesecons_pistons:piston_sticky_off", { after_place_node = piston_orientate, mesecons_piston = pistonspec_sticky, sounds = mcl_sounds.node_sound_stone_defaults(), - mesecons = {effector={ - action_on = piston_on, - rules = piston_get_rules - }}, + mesecons = { + effector = { + action_on = piston_on, + rules = piston_get_rules + }, + }, _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, on_rotate = function(pos, node, user, mode) @@ -331,8 +344,8 @@ minetest.register_node("mesecons_pistons:piston_sticky_on", { "mesecons_piston_bottom.png^[transformR270", "mesecons_piston_back.png", "mesecons_piston_on_front.png" - }, - groups = {handy=1, piston=2, not_in_creative_inventory = 1}, + }, + groups = {handy=1, piston=2, not_in_creative_inventory=1}, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, @@ -342,10 +355,12 @@ minetest.register_node("mesecons_pistons:piston_sticky_on", { selection_box = piston_on_box, mesecons_piston = pistonspec_sticky, sounds = mcl_sounds.node_sound_stone_defaults(), - mesecons = {effector={ - action_off = piston_off, - rules = piston_get_rules - }}, + mesecons = { + effector = { + action_off = piston_off, + rules = piston_get_rules + }, + }, _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, on_rotate = false, @@ -361,10 +376,10 @@ minetest.register_node("mesecons_pistons:piston_pusher_sticky", { "mesecons_piston_pusher_right.png", "mesecons_piston_pusher_back.png", "mesecons_piston_pusher_front_sticky.png" - }, + }, paramtype = "light", paramtype2 = "facedir", - groups = { piston_pusher = 2 }, + groups = {piston_pusher=2}, is_ground_content = false, after_destruct = piston_remove_base, diggable = false, @@ -388,14 +403,14 @@ local piston_up_pusher_box = { fixed = { {-2/16, -.5 - pt, -2/16, 2/16, .5 - pt, 2/16}, {-.5 , .5 - pt, -.5 , .5 , .5 , .5}, - } + }, } local piston_up_on_box = { type = "fixed", fixed = { {-.5, -.5, -.5 , .5, .5-pt, .5} - } + }, } -- Normal @@ -404,7 +419,7 @@ local pistonspec_normal_up = { offname = "mesecons_pistons:piston_up_normal_off", onname = "mesecons_pistons:piston_up_normal_on", dir = {x = 0, y = 1, z = 0}, - pusher = "mesecons_pistons:piston_up_pusher_normal" + pusher = "mesecons_pistons:piston_up_pusher_normal", } -- offstate @@ -416,17 +431,19 @@ minetest.register_node("mesecons_pistons:piston_up_normal_off", { "mesecons_piston_bottom.png", "mesecons_piston_bottom.png", "mesecons_piston_bottom.png", - }, - groups = {handy=1, piston=1, not_in_creative_inventory = 1}, + }, + groups = {handy=1, piston=1, not_in_creative_inventory=1}, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, drop = "mesecons_pistons:piston_normal_off", mesecons_piston = pistonspec_normal_up, - mesecons = {effector={ - action_on = piston_on, - rules = piston_up_rules, - }}, + mesecons = { + effector = { + action_on = piston_on, + rules = piston_up_rules, + }, + }, sounds = mcl_sounds.node_sound_stone_defaults({ footstep = mcl_sounds.node_sound_wood_defaults().footstep }), @@ -451,8 +468,8 @@ minetest.register_node("mesecons_pistons:piston_up_normal_on", { "mesecons_piston_bottom.png", "mesecons_piston_bottom.png", "mesecons_piston_bottom.png", - }, - groups = {handy=1, piston_=1, not_in_creative_inventory = 1}, + }, + groups = {handy=1, piston_=1, not_in_creative_inventory=1}, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, @@ -462,10 +479,12 @@ minetest.register_node("mesecons_pistons:piston_up_normal_on", { selection_box = piston_up_on_box, mesecons_piston = pistonspec_normal_up, sounds = mcl_sounds.node_sound_stone_defaults(), - mesecons = {effector={ - action_off = piston_off, - rules = piston_up_rules, - }}, + mesecons = { + effector = { + action_off = piston_off, + rules = piston_up_rules, + }, + }, _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, on_rotate = false, @@ -481,10 +500,10 @@ minetest.register_node("mesecons_pistons:piston_up_pusher_normal", { "mesecons_piston_pusher_right.png^[transformR90", "mesecons_piston_pusher_bottom.png", "mesecons_piston_pusher_top.png^[transformR180", - }, + }, paramtype = "light", paramtype2 = "facedir", - groups = { piston_pusher = 1 }, + groups = {piston_pusher=1}, is_ground_content = false, after_destruct = piston_remove_base, diggable = false, @@ -507,7 +526,7 @@ local pistonspec_sticky_up = { onname = "mesecons_pistons:piston_up_sticky_on", dir = {x = 0, y = 1, z = 0}, pusher = "mesecons_pistons:piston_up_pusher_sticky", - sticky = true + sticky = true, } -- offstate @@ -519,8 +538,8 @@ minetest.register_node("mesecons_pistons:piston_up_sticky_off", { "mesecons_piston_bottom.png", "mesecons_piston_bottom.png", "mesecons_piston_bottom.png", - }, - groups = {handy=1, piston=2, not_in_creative_inventory = 1}, + }, + groups = {handy=1, piston=2, not_in_creative_inventory=1}, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, @@ -529,10 +548,12 @@ minetest.register_node("mesecons_pistons:piston_up_sticky_off", { sounds = mcl_sounds.node_sound_stone_defaults({ footstep = mcl_sounds.node_sound_wood_defaults().footstep }), - mesecons = {effector={ - action_on = piston_on, - rules = piston_up_rules, - }}, + mesecons = { + effector = { + action_on = piston_on, + rules = piston_up_rules, + }, + }, _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, on_rotate = function(pos, node, user, mode) @@ -554,8 +575,8 @@ minetest.register_node("mesecons_pistons:piston_up_sticky_on", { "mesecons_piston_bottom.png", "mesecons_piston_bottom.png", "mesecons_piston_bottom.png", - }, - groups = {handy=1, piston=2, not_in_creative_inventory = 1}, + }, + groups = {handy=1, piston=2, not_in_creative_inventory=1}, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, @@ -565,10 +586,12 @@ minetest.register_node("mesecons_pistons:piston_up_sticky_on", { selection_box = piston_up_on_box, mesecons_piston = pistonspec_sticky_up, sounds = mcl_sounds.node_sound_stone_defaults(), - mesecons = {effector={ - action_off = piston_off, - rules = piston_up_rules, - }}, + mesecons = { + effector = { + action_off = piston_off, + rules = piston_up_rules, + }, + }, _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, on_rotate = false, @@ -584,10 +607,10 @@ minetest.register_node("mesecons_pistons:piston_up_pusher_sticky", { "mesecons_piston_pusher_right.png^[transformR90", "mesecons_piston_pusher_bottom.png", "mesecons_piston_pusher_top.png^[transformR180", - }, + }, paramtype = "light", paramtype2 = "facedir", - groups = { piston_pusher = 2 }, + groups = {piston_pusher=2}, is_ground_content = false, after_destruct = piston_remove_base, diggable = false, @@ -611,14 +634,14 @@ local piston_down_pusher_box = { fixed = { {-2/16, -.5 + pt, -2/16, 2/16, .5 + pt, 2/16}, {-.5 , -.5 , -.5 , .5 , -.5 + pt, .5}, - } + }, } local piston_down_on_box = { type = "fixed", fixed = { {-.5, -.5+pt, -.5 , .5, .5, .5} - } + }, } @@ -641,18 +664,20 @@ minetest.register_node("mesecons_pistons:piston_down_normal_off", { "mesecons_piston_bottom.png^[transformR180", "mesecons_piston_bottom.png^[transformR180", "mesecons_piston_bottom.png^[transformR180", - }, - groups = {handy=1, piston=1, not_in_creative_inventory = 1}, + }, + groups = {handy=1, piston=1, not_in_creative_inventory=1}, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, drop = "mesecons_pistons:piston_normal_off", mesecons_piston = pistonspec_normal_down, sounds = mcl_sounds.node_sound_stone_defaults(), - mesecons = {effector={ - action_on = piston_on, - rules = piston_down_rules, - }}, + mesecons = { + effector = { + action_on = piston_on, + rules = piston_down_rules, + }, + }, _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, on_rotate = function(pos, node, user, mode) @@ -674,8 +699,8 @@ minetest.register_node("mesecons_pistons:piston_down_normal_on", { "mesecons_piston_bottom.png^[transformR180", "mesecons_piston_bottom.png^[transformR180", "mesecons_piston_bottom.png^[transformR180", - }, - groups = {handy=1, piston=1, not_in_creative_inventory = 1}, + }, + groups = {handy=1, piston=1, not_in_creative_inventory=1}, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, @@ -685,10 +710,12 @@ minetest.register_node("mesecons_pistons:piston_down_normal_on", { selection_box = piston_down_on_box, mesecons_piston = pistonspec_normal_down, sounds = mcl_sounds.node_sound_stone_defaults(), - mesecons = {effector={ - action_off = piston_off, - rules = piston_down_rules, - }}, + mesecons = { + effector = { + action_off = piston_off, + rules = piston_down_rules, + }, + }, _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, on_rotate = false, @@ -704,10 +731,10 @@ minetest.register_node("mesecons_pistons:piston_down_pusher_normal", { "mesecons_piston_pusher_right.png^[transformR270", "mesecons_piston_pusher_bottom.png^[transformR180", "mesecons_piston_pusher_top.png", - }, + }, paramtype = "light", paramtype2 = "facedir", - groups = { piston_pusher = 1 }, + groups = {piston_pusher=1}, is_ground_content = false, after_destruct = piston_remove_base, diggable = false, @@ -727,7 +754,7 @@ local pistonspec_sticky_down = { offname = "mesecons_pistons:piston_down_sticky_off", dir = {x = 0, y = -1, z = 0}, pusher = "mesecons_pistons:piston_down_pusher_sticky", - sticky = true + sticky = true, } -- offstate @@ -739,7 +766,7 @@ minetest.register_node("mesecons_pistons:piston_down_sticky_off", { "mesecons_piston_bottom.png^[transformR180", "mesecons_piston_bottom.png^[transformR180", "mesecons_piston_bottom.png^[transformR180", - }, + }, groups = {handy=1, piston=2, not_in_creative_inventory = 1}, paramtype = "light", paramtype2 = "facedir", @@ -747,10 +774,12 @@ minetest.register_node("mesecons_pistons:piston_down_sticky_off", { drop = "mesecons_pistons:piston_sticky_off", mesecons_piston = pistonspec_sticky_down, sounds = mcl_sounds.node_sound_stone_defaults(), - mesecons = {effector={ - action_on = piston_on, - rules = piston_down_rules, - }}, + mesecons = { + effector = { + action_on = piston_on, + rules = piston_down_rules, + }, + }, _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, on_rotate = function(pos, node, user, mode) @@ -772,8 +801,8 @@ minetest.register_node("mesecons_pistons:piston_down_sticky_on", { "mesecons_piston_bottom.png^[transformR180", "mesecons_piston_bottom.png^[transformR180", "mesecons_piston_bottom.png^[transformR180", - }, - groups = {handy=1, piston=1, not_in_creative_inventory = 1}, + }, + groups = {handy=1, piston=1, not_in_creative_inventory=1}, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, @@ -783,10 +812,12 @@ minetest.register_node("mesecons_pistons:piston_down_sticky_on", { selection_box = piston_down_on_box, mesecons_piston = pistonspec_sticky_down, sounds = mcl_sounds.node_sound_stone_defaults(), - mesecons = {effector={ - action_off = piston_off, - rules = piston_down_rules, - }}, + mesecons = { + effector = { + action_off = piston_off, + rules = piston_down_rules, + }, + }, _mcl_blast_resistance = 0.5, _mcl_hardness = 0.5, on_rotate = false, @@ -802,10 +833,10 @@ minetest.register_node("mesecons_pistons:piston_down_pusher_sticky", { "mesecons_piston_pusher_right.png^[transformR270", "mesecons_piston_pusher_bottom.png^[transformR180", "mesecons_piston_pusher_top.png", - }, + }, paramtype = "light", paramtype2 = "facedir", - groups = { piston_pusher = 2 }, + groups = {piston_pusher=2}, is_ground_content = false, after_destruct = piston_remove_base, diggable = false, @@ -839,7 +870,7 @@ minetest.register_craft({ {"group:wood", "group:wood", "group:wood"}, {"mcl_core:cobble", "mcl_core:iron_ingot", "mcl_core:cobble"}, {"mcl_core:cobble", "mesecons:redstone", "mcl_core:cobble"}, - } + }, }) minetest.register_craft({ @@ -847,7 +878,7 @@ minetest.register_craft({ recipe = { {"mcl_mobitems:slimeball"}, {"mesecons_pistons:piston_normal_off"}, - } + }, }) -- Add entry aliases for the Help From 21fdf492e26a2ad35261c89f4c07478d279eb3d2 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 11:20:21 +0200 Subject: [PATCH 040/103] [mcl_anvils] fix warnings --- mods/ITEMS/mcl_anvils/init.lua | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index c3c238e7f..09f4d954c 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -41,7 +41,7 @@ end -- needs to be used up to repair the tool. local function get_consumed_materials(tool, material) local wear = tool:get_wear() - local health = (MAX_WEAR - wear) + --local health = (MAX_WEAR - wear) local matsize = material:get_count() local materials_used = 0 for m=1, math.min(4, matsize) do @@ -74,10 +74,9 @@ end local function update_anvil_slots(meta) local inv = meta:get_inventory() local new_name = meta:get_string("set_name") - local input1, input2, output - input1 = inv:get_stack("input", 1) - input2 = inv:get_stack("input", 2) - output = inv:get_stack("output", 1) + local input1 = inv:get_stack("input", 1) + local input2 = inv:get_stack("input", 2) + --local output = inv:get_stack("output", 1) local new_output, name_item local just_rename = false @@ -243,7 +242,6 @@ end -- Returns true if anvil was destroyed. local function damage_anvil(pos) local node = minetest.get_node(pos) - local new if node.name == "mcl_anvils:anvil" then minetest.swap_node(pos, {name="mcl_anvils:anvil_damage_1", param2=node.param2}) damage_particles(pos, node) @@ -278,7 +276,6 @@ local function damage_anvil_by_using(pos) end local function damage_anvil_by_falling(pos, distance) - local chance local r = math.random(1, 100) if distance > 1 then if r <= (5*distance) then From 43f418c6c0ac2d3b2298ff496d005733652d7d5d Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 11:22:45 +0200 Subject: [PATCH 041/103] [mesecons_wire] fix warnings --- mods/ITEMS/REDSTONE/mesecons_wires/init.lua | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_wires/init.lua b/mods/ITEMS/REDSTONE/mesecons_wires/init.lua index e0c5ac531..3d00e5f20 100644 --- a/mods/ITEMS/REDSTONE/mesecons_wires/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_wires/init.lua @@ -33,7 +33,7 @@ local wire_getconnect = function (from_pos, self_pos) if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].mesecons then -- rules of node to possibly connect to - local rules = {} + local rules if (minetest.registered_nodes[node.name].mesecon_wire) then rules = wire_rules else @@ -214,8 +214,7 @@ local function register_wires() local dot_off = "redstone_redstone_dust_dot.png^[colorize:#FF0000:"..ratio_off local dot_on = "redstone_redstone_dust_dot.png^[colorize:#FF0000:"..ratio_on - local tiles_off = { crossing_off, crossing_off, straight0_off, straight1_off, straight0_off, straight1_off } - local tiles_on = { crossing_on, crossing_on, straight0_on, straight1_on, straight0_on, straight1_on } + local tiles_off, tiles_on local wirehelp, tt, longdesc, usagehelp, img, desc_off, desc_on if nodeid == "00000000" then @@ -238,8 +237,8 @@ S("Read the help entries on the other redstone components to learn how redstone else -- Connected redstone wire table.insert(nodebox, box_center) - tiles_off = { crossing_off, crossing_off, straight0_off, straight1_off, straight0_off, straight1_off, } - tiles_on = { crossing_on, crossing_on, straight0_on, straight1_on, straight0_on, straight1_on, } + tiles_off = { crossing_off, crossing_off, straight0_off, straight1_off, straight0_off, straight1_off } + tiles_on = { crossing_on, crossing_on, straight0_on, straight1_on, straight0_on, straight1_on } wirehelp = false desc_off = S("Redstone Trail (@1)", nodeid) desc_on = S("Powered Redstone Trail (@1)", nodeid) From dc10448c6e35235e339725bf956d57595a907039 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 11:25:22 +0200 Subject: [PATCH 042/103] [mesecons_mvps] fix warnings --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 8cd5ae872..fedb8fa5d 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -1,3 +1,5 @@ +local table = table + --register stoppers for movestones/pistons mesecon.mvps_stoppers = {} @@ -6,8 +8,6 @@ mesecon.mvps_droppers = {} mesecon.on_mvps_move = {} mesecon.mvps_unmov = {} -local is_protected = minetest.is_protected - --- Objects (entities) that cannot be moved function mesecon.register_mvps_unmov(objectname) mesecon.mvps_unmov[objectname] = true; @@ -151,6 +151,7 @@ function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos) -- add connected nodes to frontiers, connected is a vector list -- the vectors must be absolute positions local connected = {} + local has_loop if minetest.registered_nodes[nn.name] and minetest.registered_nodes[nn.name].mvps_sticky then connected, has_loop = minetest.registered_nodes[nn.name].mvps_sticky(np, nn, piston_pos) @@ -258,7 +259,7 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, n.meta = minetest.get_meta(n.pos):to_table() local is_dropper = mesecon.is_mvps_dropper(n.node, movedir, nodes, id) if is_dropper then - local drops = minetest.get_node_drops(n.node.name, "") + --local drops = minetest.get_node_drops(n.node.name, "") minetest.dig_node(n.pos) else minetest.remove_node(n.pos) From e6f72e0c60967a152d0485f46fe161b526487af0 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 11:29:32 +0200 Subject: [PATCH 043/103] [mesecons_delayer] fix warnings --- mods/ITEMS/REDSTONE/mesecons_delayer/init.lua | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua b/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua index caf5e9652..7fba42179 100644 --- a/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua @@ -145,8 +145,8 @@ end -- Register the 2 (states) x 4 (delay times) delayers for i = 1, 4 do -local groups = {} -if i == 1 then +local groups +if i == 1 then groups = {dig_immediate=3,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,attached_node=1,redstone_repeater=i} else groups = {dig_immediate=3,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,attached_node=1,redstone_repeater=i,not_in_creative_inventory=1} @@ -156,29 +156,29 @@ local delaytime = DELAYS[i] local boxes if i == 1 then -boxes = { - { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab - { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch - { -1/16, -6/16, 0/16, 1/16, -1/16, 2/16}, -- moved torch -} + boxes = { + { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab + { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch + { -1/16, -6/16, 0/16, 1/16, -1/16, 2/16}, -- moved torch + } elseif i == 2 then -boxes = { - { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab - { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch - { -1/16, -6/16, -2/16, 1/16, -1/16, 0/16}, -- moved torch -} + boxes = { + { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab + { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch + { -1/16, -6/16, -2/16, 1/16, -1/16, 0/16}, -- moved torch + } elseif i == 3 then -boxes = { - { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab - { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch - { -1/16, -6/16, -4/16, 1/16, -1/16, -2/16}, -- moved torch -} + boxes = { + { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab + { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch + { -1/16, -6/16, -4/16, 1/16, -1/16, -2/16}, -- moved torch + } elseif i == 4 then -boxes = { - { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab - { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch - { -1/16, -6/16, -6/16, 1/16, -1/16, -4/16}, -- moved torch -} + boxes = { + { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab + { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch + { -1/16, -6/16, -6/16, 1/16, -1/16, -4/16}, -- moved torch + } end local help, tt, longdesc, usagehelp, icon, on_construct @@ -248,7 +248,7 @@ minetest.register_node("mesecons_delayer:delayer_off_"..tostring(i), { "mesecons_delayer_ends_off.png", }, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, - wield_image = "mesecons_delayer_off.png", + --wield_image = "mesecons_delayer_off.png", walkable = true, selection_box = { type = "fixed", From 4fd0ea8a880980349acb9e09ebe625a3842ade0c Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 11:36:30 +0200 Subject: [PATCH 044/103] [mesecons_delayer] fix code style issues --- mods/ITEMS/REDSTONE/mesecons_delayer/init.lua | 444 +++++++++--------- 1 file changed, 218 insertions(+), 226 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua b/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua index 7fba42179..0a330ef2c 100644 --- a/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/init.lua @@ -4,7 +4,7 @@ local DELAYS = { 0.1, 0.2, 0.3, 0.4 } local DEFAULT_DELAY = DELAYS[1] -- Function that get the input/output rules of the delayer -local delayer_get_output_rules = function(node) +local function delayer_get_output_rules(node) local rules = {{x = -1, y = 0, z = 0, spread=true}} for i = 0, node.param2 do rules = mesecon.rotate_rules_left(rules) @@ -12,7 +12,7 @@ local delayer_get_output_rules = function(node) return rules end -local delayer_get_input_rules = function(node) +local function delayer_get_input_rules(node) local rules = {{x = 1, y = 0, z = 0}} for i = 0, node.param2 do rules = mesecon.rotate_rules_left(rules) @@ -22,7 +22,7 @@ end -- Return the sides of a delayer. -- Those are used to toggle the lock state. -local delayer_get_sides = function(node) +local function delayer_get_sides(node) local rules = { {x = 0, y = 0, z = -1}, {x = 0, y = 0, z = 1}, @@ -35,7 +35,7 @@ end -- Make the repeater at pos try to lock any repeater it faces. -- Returns true if a repeater was locked. -local check_lock_repeater = function(pos, node) +local function check_lock_repeater(pos, node) -- Check the repeater at pos and look if it faces -- a repeater placed sideways. -- If yes, lock the second repeater. @@ -67,7 +67,7 @@ end -- Make the repeater at pos try to unlock any repeater it faces. -- Returns true if a repeater was unlocked. -local check_unlock_repeater = function(pos, node) +local function check_unlock_repeater(pos, node) -- Check the repeater at pos and look if it faces -- a repeater placed sideways. -- If yes, also check if the second repeater doesn't receive @@ -119,21 +119,19 @@ local check_unlock_repeater = function(pos, node) end -- Functions that are called after the delay time -local delayer_activate = function(pos, node) +local function delayer_activate(pos, node) local def = minetest.registered_nodes[node.name] local time = def.delayer_time minetest.set_node(pos, {name=def.delayer_onstate, param2=node.param2}) mesecon.queue:add_action(pos, "receptor_on", {delayer_get_output_rules(node)}, time, nil) - check_lock_repeater(pos, node) end -local delayer_deactivate = function(pos, node) +local function delayer_deactivate(pos, node) local def = minetest.registered_nodes[node.name] local time = def.delayer_time minetest.set_node(pos, {name=def.delayer_offstate, param2=node.param2}) mesecon.queue:add_action(pos, "receptor_off", {delayer_get_output_rules(node)}, time, nil) - check_unlock_repeater(pos, node) end @@ -145,236 +143,230 @@ end -- Register the 2 (states) x 4 (delay times) delayers for i = 1, 4 do -local groups -if i == 1 then - groups = {dig_immediate=3,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,attached_node=1,redstone_repeater=i} -else - groups = {dig_immediate=3,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,attached_node=1,redstone_repeater=i,not_in_creative_inventory=1} -end + local groups + if i == 1 then + groups = {dig_immediate=3,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,attached_node=1,redstone_repeater=i} + else + groups = {dig_immediate=3,dig_by_water=1,destroy_by_lava_flow=1,dig_by_piston=1,attached_node=1,redstone_repeater=i,not_in_creative_inventory=1} + end -local delaytime = DELAYS[i] + local delaytime = DELAYS[i] -local boxes -if i == 1 then - boxes = { - { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab - { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch - { -1/16, -6/16, 0/16, 1/16, -1/16, 2/16}, -- moved torch - } -elseif i == 2 then - boxes = { - { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab - { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch - { -1/16, -6/16, -2/16, 1/16, -1/16, 0/16}, -- moved torch - } -elseif i == 3 then - boxes = { - { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab - { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch - { -1/16, -6/16, -4/16, 1/16, -1/16, -2/16}, -- moved torch - } -elseif i == 4 then - boxes = { - { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab - { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch - { -1/16, -6/16, -6/16, 1/16, -1/16, -4/16}, -- moved torch - } -end + local boxes + if i == 1 then + boxes = { + { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab + { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch + { -1/16, -6/16, 0/16, 1/16, -1/16, 2/16}, -- moved torch + } + elseif i == 2 then + boxes = { + { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab + { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch + { -1/16, -6/16, -2/16, 1/16, -1/16, 0/16}, -- moved torch + } + elseif i == 3 then + boxes = { + { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab + { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch + { -1/16, -6/16, -4/16, 1/16, -1/16, -2/16}, -- moved torch + } + elseif i == 4 then + boxes = { + { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, -- the main slab + { -1/16, -6/16, 6/16, 1/16, -1/16, 4/16}, -- still torch + { -1/16, -6/16, -6/16, 1/16, -1/16, -4/16}, -- moved torch + } + end -local help, tt, longdesc, usagehelp, icon, on_construct -if i == 1 then - help = true - tt = S("Transmits redstone power only in one direction").."\n".. - S("Delays signal").."\n".. - S("Output locks when getting active redstone repeater signal from the side") - longdesc = S("Redstone repeaters are versatile redstone components with multiple purposes: 1. They only allow signals to travel in one direction. 2. They delay the signal. 3. Optionally, they can lock their output in one state.") - usagehelp = S("To power a redstone repeater, send a signal in “arrow” direction (the input). The signal goes out on the opposite side (the output) with a delay. To change the delay, use the redstone repeater. The delay is between 0.1 and 0.4 seconds long and can be changed in steps of 0.1 seconds. It is indicated by the position of the moving redstone torch.").."\n".. - S("To lock a repeater, send a signal from an adjacent repeater into one of its sides. While locked, the moving redstone torch disappears, the output doesn't change and the input signal is ignored.") - icon = "mesecons_delayer_item.png" - - -- Check sides of constructed repeater and lock it, if required - on_construct = function(pos) - local node = minetest.get_node(pos) - local sides = delayer_get_sides(node) - for s=1, #sides do - local spos = vector.add(pos, sides[s]) - local snode = minetest.get_node(spos) - -- Is there a powered repeater at one of our sides? - local g = minetest.get_item_group(snode.name, "redstone_repeater") - if g ~= 0 and mesecon.is_receptor_on(snode.name) then - -- The other repeater must also face towards the constructed node - local sface = delayer_get_output_rules(snode)[1] - local sface_pos = vector.add(spos, sface) - if vector.equals(sface_pos, pos) then - -- Repeater is facing towards us! Now we just need to lock the costructed node - if mesecon.is_powered(pos, delayer_get_input_rules(node)[1]) ~= false then - local newnode = {name="mesecons_delayer:delayer_on_locked", param2 = node.param2} - minetest.set_node(pos, newnode) - mesecon.queue:add_action(pos, "receptor_on", {delayer_get_output_rules(newnode)}, DEFAULT_DELAY, nil) - else - minetest.set_node(pos, {name="mesecons_delayer:delayer_off_locked", param2 = node.param2}) + local help, tt, longdesc, usagehelp, icon, on_construct + if i == 1 then + help = true + tt = S("Transmits redstone power only in one direction").."\n".. + S("Delays signal").."\n".. + S("Output locks when getting active redstone repeater signal from the side") + longdesc = S("Redstone repeaters are versatile redstone components with multiple purposes: 1. They only allow signals to travel in one direction. 2. They delay the signal. 3. Optionally, they can lock their output in one state.") + usagehelp = S("To power a redstone repeater, send a signal in “arrow” direction (the input). The signal goes out on the opposite side (the output) with a delay. To change the delay, use the redstone repeater. The delay is between 0.1 and 0.4 seconds long and can be changed in steps of 0.1 seconds. It is indicated by the position of the moving redstone torch.").."\n".. + S("To lock a repeater, send a signal from an adjacent repeater into one of its sides. While locked, the moving redstone torch disappears, the output doesn't change and the input signal is ignored.") + icon = "mesecons_delayer_item.png" + -- Check sides of constructed repeater and lock it, if required + on_construct = function(pos) + local node = minetest.get_node(pos) + local sides = delayer_get_sides(node) + for s=1, #sides do + local spos = vector.add(pos, sides[s]) + local snode = minetest.get_node(spos) + -- Is there a powered repeater at one of our sides? + local g = minetest.get_item_group(snode.name, "redstone_repeater") + if g ~= 0 and mesecon.is_receptor_on(snode.name) then + -- The other repeater must also face towards the constructed node + local sface = delayer_get_output_rules(snode)[1] + local sface_pos = vector.add(spos, sface) + if vector.equals(sface_pos, pos) then + -- Repeater is facing towards us! Now we just need to lock the costructed node + if mesecon.is_powered(pos, delayer_get_input_rules(node)[1]) ~= false then + local newnode = {name="mesecons_delayer:delayer_on_locked", param2 = node.param2} + minetest.set_node(pos, newnode) + mesecon.queue:add_action(pos, "receptor_on", {delayer_get_output_rules(newnode)}, DEFAULT_DELAY, nil) + else + minetest.set_node(pos, {name="mesecons_delayer:delayer_off_locked", param2 = node.param2}) + end + break end - break end end end + else + help = false end -else - help = false -end -local desc_off -if i == 1 then - desc_off = S("Redstone Repeater") -else - desc_off = S("Redstone Repeater (Delay @1)", i) -end + local desc_off + if i == 1 then + desc_off = S("Redstone Repeater") + else + desc_off = S("Redstone Repeater (Delay @1)", i) + end -minetest.register_node("mesecons_delayer:delayer_off_"..tostring(i), { - description = desc_off, - inventory_image = icon, - wield_image = icon, - _tt_help = tt, - _doc_items_create_entry = help, - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usagehelp, - drawtype = "nodebox", - tiles = { - "mesecons_delayer_off.png", - "mcl_stairs_stone_slab_top.png", - "mesecons_delayer_sides_off.png", - "mesecons_delayer_sides_off.png", - "mesecons_delayer_ends_off.png", - "mesecons_delayer_ends_off.png", - }, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, - --wield_image = "mesecons_delayer_off.png", - walkable = true, - selection_box = { - type = "fixed", - fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, - }, - collision_box = { - type = "fixed", - fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, - }, - node_box = { - type = "fixed", - fixed = boxes - }, - groups = groups, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = false, - is_ground_content = false, - drop = 'mesecons_delayer:delayer_off_1', - on_rightclick = function (pos, node, clicker) - local protname = clicker:get_player_name() - if minetest.is_protected(pos, protname) then - minetest.record_protection_violation(pos, protname) - return - end - if node.name=="mesecons_delayer:delayer_off_1" then - minetest.set_node(pos, {name="mesecons_delayer:delayer_off_2", param2=node.param2}) - elseif node.name=="mesecons_delayer:delayer_off_2" then - minetest.set_node(pos, {name="mesecons_delayer:delayer_off_3", param2=node.param2}) - elseif node.name=="mesecons_delayer:delayer_off_3" then - minetest.set_node(pos, {name="mesecons_delayer:delayer_off_4", param2=node.param2}) - elseif node.name=="mesecons_delayer:delayer_off_4" then - minetest.set_node(pos, {name="mesecons_delayer:delayer_off_1", param2=node.param2}) - end - end, - on_construct = on_construct, - delayer_time = delaytime, - delayer_onstate = "mesecons_delayer:delayer_on_"..tostring(i), - delayer_lockstate = "mesecons_delayer:delayer_off_locked", - sounds = mcl_sounds.node_sound_stone_defaults(), - mesecons = { - receptor = - { - state = mesecon.state.off, - rules = delayer_get_output_rules + minetest.register_node("mesecons_delayer:delayer_off_"..tostring(i), { + description = desc_off, + inventory_image = icon, + wield_image = icon, + _tt_help = tt, + _doc_items_create_entry = help, + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usagehelp, + drawtype = "nodebox", + tiles = { + "mesecons_delayer_off.png", + "mcl_stairs_stone_slab_top.png", + "mesecons_delayer_sides_off.png", + "mesecons_delayer_sides_off.png", + "mesecons_delayer_ends_off.png", + "mesecons_delayer_ends_off.png", }, - effector = - { - rules = delayer_get_input_rules, - action_on = delayer_activate - } - }, - on_rotate = on_rotate, -}) - - -minetest.register_node("mesecons_delayer:delayer_on_"..tostring(i), { - description = S("Redstone Repeater (Delay @1, Powered)", i), - _doc_items_create_entry = false, - drawtype = "nodebox", - tiles = { - "mesecons_delayer_on.png", - "mcl_stairs_stone_slab_top.png", - "mesecons_delayer_sides_on.png", - "mesecons_delayer_sides_on.png", - "mesecons_delayer_ends_on.png", - "mesecons_delayer_ends_on.png", - }, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, - walkable = true, - selection_box = { - type = "fixed", - fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, - }, - collision_box = { - type = "fixed", - fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, - }, - node_box = { - type = "fixed", - fixed = boxes - }, - groups = {dig_immediate = 3, dig_by_water=1,destroy_by_lava_flow=1, dig_by_piston=1, attached_node=1, redstone_repeater=i, not_in_creative_inventory = 1}, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = false, - is_ground_content = false, - drop = 'mesecons_delayer:delayer_off_1', - on_rightclick = function (pos, node, clicker) - local protname = clicker:get_player_name() - if minetest.is_protected(pos, protname) then - minetest.record_protection_violation(pos, protname) - return - end - if node.name=="mesecons_delayer:delayer_on_1" then - minetest.set_node(pos, {name="mesecons_delayer:delayer_on_2",param2=node.param2}) - elseif node.name=="mesecons_delayer:delayer_on_2" then - minetest.set_node(pos, {name="mesecons_delayer:delayer_on_3",param2=node.param2}) - elseif node.name=="mesecons_delayer:delayer_on_3" then - minetest.set_node(pos, {name="mesecons_delayer:delayer_on_4",param2=node.param2}) - elseif node.name=="mesecons_delayer:delayer_on_4" then - minetest.set_node(pos, {name="mesecons_delayer:delayer_on_1",param2=node.param2}) - end - end, - after_dig_node = function(pos, oldnode) - check_unlock_repeater(pos, oldnode) - end, - delayer_time = delaytime, - delayer_offstate = "mesecons_delayer:delayer_off_"..tostring(i), - delayer_lockstate = "mesecons_delayer:delayer_on_locked", - sounds = mcl_sounds.node_sound_stone_defaults(), - mesecons = { - receptor = - { - state = mesecon.state.on, - rules = delayer_get_output_rules + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, + --wield_image = "mesecons_delayer_off.png", + walkable = true, + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, }, - effector = - { - rules = delayer_get_input_rules, - action_off = delayer_deactivate - } - }, - on_rotate = on_rotate, -}) + collision_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, + }, + node_box = { + type = "fixed", + fixed = boxes + }, + groups = groups, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = false, + is_ground_content = false, + drop = 'mesecons_delayer:delayer_off_1', + on_rightclick = function (pos, node, clicker) + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.record_protection_violation(pos, protname) + return + end + if node.name=="mesecons_delayer:delayer_off_1" then + minetest.set_node(pos, {name="mesecons_delayer:delayer_off_2", param2=node.param2}) + elseif node.name=="mesecons_delayer:delayer_off_2" then + minetest.set_node(pos, {name="mesecons_delayer:delayer_off_3", param2=node.param2}) + elseif node.name=="mesecons_delayer:delayer_off_3" then + minetest.set_node(pos, {name="mesecons_delayer:delayer_off_4", param2=node.param2}) + elseif node.name=="mesecons_delayer:delayer_off_4" then + minetest.set_node(pos, {name="mesecons_delayer:delayer_off_1", param2=node.param2}) + end + end, + on_construct = on_construct, + delayer_time = delaytime, + delayer_onstate = "mesecons_delayer:delayer_on_"..tostring(i), + delayer_lockstate = "mesecons_delayer:delayer_off_locked", + sounds = mcl_sounds.node_sound_stone_defaults(), + mesecons = { + receptor = { + state = mesecon.state.off, + rules = delayer_get_output_rules, + }, + effector = { + rules = delayer_get_input_rules, + action_on = delayer_activate, + }, + }, + on_rotate = on_rotate, + }) + minetest.register_node("mesecons_delayer:delayer_on_"..tostring(i), { + description = S("Redstone Repeater (Delay @1, Powered)", i), + _doc_items_create_entry = false, + drawtype = "nodebox", + tiles = { + "mesecons_delayer_on.png", + "mcl_stairs_stone_slab_top.png", + "mesecons_delayer_sides_on.png", + "mesecons_delayer_sides_on.png", + "mesecons_delayer_ends_on.png", + "mesecons_delayer_ends_on.png", + }, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, + walkable = true, + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, + }, + collision_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, + }, + node_box = { + type = "fixed", + fixed = boxes + }, + groups = {dig_immediate = 3, dig_by_water=1,destroy_by_lava_flow=1, dig_by_piston=1, attached_node=1, redstone_repeater=i, not_in_creative_inventory = 1}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = false, + is_ground_content = false, + drop = 'mesecons_delayer:delayer_off_1', + on_rightclick = function (pos, node, clicker) + local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then + minetest.record_protection_violation(pos, protname) + return + end + --HACK! we already know the node name, so we should generate the function to avoid multiple checks + if node.name=="mesecons_delayer:delayer_on_1" then + minetest.set_node(pos, {name="mesecons_delayer:delayer_on_2",param2=node.param2}) + elseif node.name=="mesecons_delayer:delayer_on_2" then + minetest.set_node(pos, {name="mesecons_delayer:delayer_on_3",param2=node.param2}) + elseif node.name=="mesecons_delayer:delayer_on_3" then + minetest.set_node(pos, {name="mesecons_delayer:delayer_on_4",param2=node.param2}) + elseif node.name=="mesecons_delayer:delayer_on_4" then + minetest.set_node(pos, {name="mesecons_delayer:delayer_on_1",param2=node.param2}) + end + end, + after_dig_node = function(pos, oldnode) + check_unlock_repeater(pos, oldnode) + end, + delayer_time = delaytime, + delayer_offstate = "mesecons_delayer:delayer_off_"..tostring(i), + delayer_lockstate = "mesecons_delayer:delayer_on_locked", + sounds = mcl_sounds.node_sound_stone_defaults(), + mesecons = { + receptor = { + state = mesecon.state.on, + rules = delayer_get_output_rules, + }, + effector = { + rules = delayer_get_input_rules, + action_off = delayer_deactivate, + }, + }, + on_rotate = on_rotate, + }) end From ddc157acbf495de0bdbf624874a293a11b8e69f0 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 11:37:51 +0200 Subject: [PATCH 045/103] [mesecons_commandblock] fix warnings --- mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua index 1928f809c..9c0914efb 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/init.lua @@ -72,7 +72,7 @@ end local function check_commands(commands, player_name) for _, command in pairs(commands:split("\n")) do local pos = command:find(" ") - local cmd, param = command, "" + local cmd = command if pos then cmd = command:sub(1, pos - 1) end @@ -103,10 +103,10 @@ local function commandblock_action_on(pos, node) if node.name ~= "mesecons_commandblock:commandblock_off" then return end - + local meta = minetest.get_meta(pos) local commander = meta:get_string("commander") - + if not command_blocks_activated then --minetest.chat_send_player(commander, msg_not_activated) return From 962ae359af048f9e23bf4e38aafd99580db59d1a Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 11:41:01 +0200 Subject: [PATCH 046/103] [mesecons] fix warnings --- mods/ITEMS/REDSTONE/mesecons/internal.lua | 12 ++++-------- mods/ITEMS/REDSTONE/mesecons/services.lua | 2 +- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons/internal.lua b/mods/ITEMS/REDSTONE/mesecons/internal.lua index f4ed9df4e..a5bcb80e8 100644 --- a/mods/ITEMS/REDSTONE/mesecons/internal.lua +++ b/mods/ITEMS/REDSTONE/mesecons/internal.lua @@ -329,7 +329,7 @@ function mesecon.get_conductor_on(node_off, rulename) return conductor.states[tonumber(binstate,2)+1] end end - return offstate + return conductor.offstate end function mesecon.get_conductor_off(node_on, rulename) @@ -345,7 +345,7 @@ function mesecon.get_conductor_off(node_on, rulename) return conductor.states[tonumber(binstate,2)+1] end end - return onstate + return conductor.onstate end function mesecon.conductor_get_rules(node) @@ -391,9 +391,7 @@ function mesecon.turnon(pos, link) local f = table.remove(frontiers, 1) local node = get_node_force(f.pos) - if not node then - -- Area does not exist; do nothing - elseif mesecon.is_conductor_off(node, f.link) then + if node and mesecon.is_conductor_off(node, f.link) then local rules = mesecon.conductor_get_rules(node) -- Call turnon on neighbors @@ -453,9 +451,7 @@ function mesecon.turnoff(pos, link) local f = table.remove(frontiers, 1) local node = get_node_force(f.pos) - if not node then - -- No-op - elseif mesecon.is_conductor_on(node, f.link) then + if node and mesecon.is_conductor_on(node, f.link) then local rules = mesecon.conductor_get_rules(node) for _, r in pairs(mesecon.rule2meta(f.link, rules)) do local np = vector.add(f.pos, r) diff --git a/mods/ITEMS/REDSTONE/mesecons/services.lua b/mods/ITEMS/REDSTONE/mesecons/services.lua index 9addda8bd..1e3e6237b 100644 --- a/mods/ITEMS/REDSTONE/mesecons/services.lua +++ b/mods/ITEMS/REDSTONE/mesecons/services.lua @@ -77,7 +77,7 @@ mesecon.on_dignode = function(pos, node) mesecon.receptor_off(pos, mesecon.receptor_get_rules(node)) end if minetest.get_item_group(node.name, "opaque") == 1 then - local sources = mesecon.is_powered(pos) + --local sources = mesecon.is_powered(pos) local neighbors = mesecon.mcl_get_neighbors(pos) for n=1, #neighbors do local npos = neighbors[n].pos From b814fe47f9b5a2ca21501988b968feac01bada34 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 11:47:59 +0200 Subject: [PATCH 047/103] [mcl_observers] fix warnings --- mods/ITEMS/REDSTONE/mcl_observers/init.lua | 317 +++++++++++---------- 1 file changed, 161 insertions(+), 156 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mcl_observers/init.lua b/mods/ITEMS/REDSTONE/mcl_observers/init.lua index 932f4f643..8f7f6c262 100644 --- a/mods/ITEMS/REDSTONE/mcl_observers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_observers/init.lua @@ -11,7 +11,7 @@ local realtime = true local rules_flat = { { x = 0, y = 0, z = -1, spread = true }, } -local get_rules_flat = function(node) +local function get_rules_flat(node) local rules = rules_flat for i=1, node.param2 do rules = mesecon.rotate_rules_left(rules) @@ -46,7 +46,7 @@ end -- and update the observer state if needed. -- TODO: Also scan metadata changes. -- TODO: Ignore some node changes. -local observer_scan = function(pos, initialize) +local function observer_scan(pos, initialize) local node = minetest.get_node(pos) local front if node.name == "mcl_observers:observer_up_off" or node.name == "mcl_observers:observer_up_on" then @@ -87,14 +87,14 @@ local observer_scan = function(pos, initialize) end -- Vertical orientation (CURRENTLY DISABLED) -local observer_orientate = function(pos, placer) +local function observer_orientate(pos, placer) -- Not placed by player if not placer then return end -- Placer pitch in degrees local pitch = placer:get_look_vertical() * (180 / math.pi) - local node = minetest.get_node(pos) + --local node = minetest.get_node(pos) if pitch > 55 then -- player looking upwards -- Observer looking downwards minetest.set_node(pos, {name="mcl_observers:observer_down_off"}) @@ -104,162 +104,167 @@ local observer_orientate = function(pos, placer) end end -mesecon.register_node("mcl_observers:observer", -{ - is_ground_content = false, - sounds = mcl_sounds.node_sound_stone_defaults(), - paramtype2 = "facedir", - on_rotate = false, - _mcl_blast_resistance = 3.5, - _mcl_hardness = 3.5, -}, -{ - description = S("Observer"), - _tt_help = S("Emits redstone pulse when block in front changes"), - _doc_items_longdesc = S("An observer is a redstone component which observes the block in front of it and sends a very short redstone pulse whenever this block changes."), - _doc_items_usagehelp = S("Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow points to the side of the output, which is at the opposite side of the “face”. You can place your redstone dust or any other component here."), +mesecon.register_node("mcl_observers:observer", { + is_ground_content = false, + sounds = mcl_sounds.node_sound_stone_defaults(), + paramtype2 = "facedir", + on_rotate = false, + _mcl_blast_resistance = 3.5, + _mcl_hardness = 3.5, + }, { + description = S("Observer"), + _tt_help = S("Emits redstone pulse when block in front changes"), + _doc_items_longdesc = S("An observer is a redstone component which observes the block in front of it and sends a very short redstone pulse whenever this block changes."), + _doc_items_usagehelp = S("Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow points to the side of the output, which is at the opposite side of the “face”. You can place your redstone dust or any other component here."), - groups = {pickaxey=1, material_stone=1, not_opaque=1, }, - tiles = { - "mcl_observers_observer_top.png^[transformR180", "default_furnace_bottom.png", - "mcl_observers_observer_side.png", "mcl_observers_observer_side.png", - "mcl_observers_observer_front.png", "mcl_observers_observer_back.png", - }, - mesecons = { receptor = { - state = mesecon.state.off, - rules = get_rules_flat, - }}, - on_construct = function(pos) - if not realtime then - observer_scan(pos, true) - end - end, - after_place_node = observer_orientate, -}, -{ - _doc_items_create_entry = false, - groups = {pickaxey=1, material_stone=1, not_opaque=1, not_in_creative_inventory=1 }, - tiles = { - "mcl_observers_observer_top.png^[transformR180", "default_furnace_bottom.png", - "mcl_observers_observer_side.png", "mcl_observers_observer_side.png", - "mcl_observers_observer_front.png", "mcl_observers_observer_back_lit.png", - }, - mesecons = { receptor = { - state = mesecon.state.on, - rules = get_rules_flat, - }}, + groups = {pickaxey=1, material_stone=1, not_opaque=1, }, + tiles = { + "mcl_observers_observer_top.png^[transformR180", "default_furnace_bottom.png", + "mcl_observers_observer_side.png", "mcl_observers_observer_side.png", + "mcl_observers_observer_front.png", "mcl_observers_observer_back.png", + }, + mesecons = { + receptor = { + state = mesecon.state.off, + rules = get_rules_flat, + }, + }, + on_construct = function(pos) + if not realtime then + observer_scan(pos, true) + end + end, + after_place_node = observer_orientate, + }, { + _doc_items_create_entry = false, + groups = {pickaxey=1, material_stone=1, not_opaque=1, not_in_creative_inventory=1 }, + tiles = { + "mcl_observers_observer_top.png^[transformR180", "default_furnace_bottom.png", + "mcl_observers_observer_side.png", "mcl_observers_observer_side.png", + "mcl_observers_observer_front.png", "mcl_observers_observer_back_lit.png", + }, + mesecons = { + receptor = { + state = mesecon.state.on, + rules = get_rules_flat, + } + }, - -- VERY quickly disable observer after construction - on_construct = function(pos) - local timer = minetest.get_node_timer(pos) - timer:start(mcl_vars.redstone_tick) - end, - on_timer = function(pos, elapsed) - local node = minetest.get_node(pos) - minetest.set_node(pos, {name = "mcl_observers:observer_off", param2 = node.param2}) - mesecon.receptor_off(pos, get_rules_flat(node)) - end, -} + -- VERY quickly disable observer after construction + on_construct = function(pos) + local timer = minetest.get_node_timer(pos) + timer:start(mcl_vars.redstone_tick) + end, + on_timer = function(pos, elapsed) + local node = minetest.get_node(pos) + minetest.set_node(pos, {name = "mcl_observers:observer_off", param2 = node.param2}) + mesecon.receptor_off(pos, get_rules_flat(node)) + end, + } ) -mesecon.register_node("mcl_observers:observer_down", -{ - is_ground_content = false, - sounds = mcl_sounds.node_sound_stone_defaults(), - groups = {pickaxey=1, material_stone=1, not_opaque=1, not_in_creative_inventory=1 }, - on_rotate = false, - _mcl_blast_resistance = 3.5, - _mcl_hardness = 3.5, - drop = "mcl_observers:observer_off", -}, -{ - tiles = { - "mcl_observers_observer_back.png", "mcl_observers_observer_front.png", - "mcl_observers_observer_side.png^[transformR90", "mcl_observers_observer_side.png^[transformR90", - "mcl_observers_observer_top.png", "mcl_observers_observer_top.png", - }, - mesecons = { receptor = { - state = mesecon.state.off, - rules = rules_down, - }}, - on_construct = function(pos) - if not realtime then - observer_scan(pos, true) - end - end, -}, -{ - _doc_items_create_entry = false, - tiles = { - "mcl_observers_observer_back_lit.png", "mcl_observers_observer_front.png", - "mcl_observers_observer_side.png^[transformR90", "mcl_observers_observer_side.png^[transformR90", - "mcl_observers_observer_top.png", "mcl_observers_observer_top.png", - }, - mesecons = { receptor = { - state = mesecon.state.on, - rules = rules_down, - }}, +mesecon.register_node("mcl_observers:observer_down", { + is_ground_content = false, + sounds = mcl_sounds.node_sound_stone_defaults(), + groups = {pickaxey=1, material_stone=1, not_opaque=1, not_in_creative_inventory=1 }, + on_rotate = false, + _mcl_blast_resistance = 3.5, + _mcl_hardness = 3.5, + drop = "mcl_observers:observer_off", + }, { + tiles = { + "mcl_observers_observer_back.png", "mcl_observers_observer_front.png", + "mcl_observers_observer_side.png^[transformR90", "mcl_observers_observer_side.png^[transformR90", + "mcl_observers_observer_top.png", "mcl_observers_observer_top.png", + }, + mesecons = { + receptor = { + state = mesecon.state.off, + rules = rules_down, + }, + }, + on_construct = function(pos) + if not realtime then + observer_scan(pos, true) + end + end, + }, { + _doc_items_create_entry = false, + tiles = { + "mcl_observers_observer_back_lit.png", "mcl_observers_observer_front.png", + "mcl_observers_observer_side.png^[transformR90", "mcl_observers_observer_side.png^[transformR90", + "mcl_observers_observer_top.png", "mcl_observers_observer_top.png", + }, + mesecons = { + receptor = { + state = mesecon.state.on, + rules = rules_down, + }, + }, - -- VERY quickly disable observer after construction - on_construct = function(pos) - local timer = minetest.get_node_timer(pos) - timer:start(mcl_vars.redstone_tick) - end, - on_timer = function(pos, elapsed) - local node = minetest.get_node(pos) - minetest.set_node(pos, {name = "mcl_observers:observer_down_off", param2 = node.param2}) - mesecon.receptor_off(pos, rules_down) - end, -}) + -- VERY quickly disable observer after construction + on_construct = function(pos) + local timer = minetest.get_node_timer(pos) + timer:start(mcl_vars.redstone_tick) + end, + on_timer = function(pos, elapsed) + local node = minetest.get_node(pos) + minetest.set_node(pos, {name = "mcl_observers:observer_down_off", param2 = node.param2}) + mesecon.receptor_off(pos, rules_down) + end, + } +) -mesecon.register_node("mcl_observers:observer_up", -{ - is_ground_content = false, - sounds = mcl_sounds.node_sound_stone_defaults(), - groups = {pickaxey=1, material_stone=1, not_opaque=1, not_in_creative_inventory=1 }, - on_rotate = false, - _mcl_blast_resistance = 3.5, - _mcl_hardness = 3.5, - drop = "mcl_observers:observer_off", -}, -{ - tiles = { - "mcl_observers_observer_front.png", "mcl_observers_observer_back.png", - "mcl_observers_observer_side.png^[transformR270", "mcl_observers_observer_side.png^[transformR270", - "mcl_observers_observer_top.png^[transformR180", "mcl_observers_observer_top.png^[transformR180", - }, - mesecons = { receptor = { - state = mesecon.state.off, - rules = rules_up, - }}, - on_construct = function(pos) - if not realtime then - observer_scan(pos, true) - end - end, -}, -{ - _doc_items_create_entry = false, - tiles = { - "mcl_observers_observer_front.png", "mcl_observers_observer_back_lit.png", - "mcl_observers_observer_side.png^[transformR270", "mcl_observers_observer_side.png^[transformR270", - "mcl_observers_observer_top.png^[transformR180", "mcl_observers_observer_top.png^[transformR180", - }, - mesecons = { receptor = { - state = mesecon.state.on, - rules = rules_up, - }}, +mesecon.register_node("mcl_observers:observer_up", { + is_ground_content = false, + sounds = mcl_sounds.node_sound_stone_defaults(), + groups = {pickaxey=1, material_stone=1, not_opaque=1, not_in_creative_inventory=1 }, + on_rotate = false, + _mcl_blast_resistance = 3.5, + _mcl_hardness = 3.5, + drop = "mcl_observers:observer_off", + }, { + tiles = { + "mcl_observers_observer_front.png", "mcl_observers_observer_back.png", + "mcl_observers_observer_side.png^[transformR270", "mcl_observers_observer_side.png^[transformR270", + "mcl_observers_observer_top.png^[transformR180", "mcl_observers_observer_top.png^[transformR180", + }, + mesecons = { + receptor = { + state = mesecon.state.off, + rules = rules_up, + }, + }, + on_construct = function(pos) + if not realtime then + observer_scan(pos, true) + end + end, + }, { + _doc_items_create_entry = false, + tiles = { + "mcl_observers_observer_front.png", "mcl_observers_observer_back_lit.png", + "mcl_observers_observer_side.png^[transformR270", "mcl_observers_observer_side.png^[transformR270", + "mcl_observers_observer_top.png^[transformR180", "mcl_observers_observer_top.png^[transformR180", + }, + mesecons = { + receptor = { + state = mesecon.state.on, + rules = rules_up, + }, + }, - -- VERY quickly disable observer after construction - on_construct = function(pos) - local timer = minetest.get_node_timer(pos) - timer:start(mcl_vars.redstone_tick) - end, - on_timer = function(pos, elapsed) - minetest.set_node(pos, {name = "mcl_observers:observer_up_off"}) - mesecon.receptor_off(pos, rules_up) - end, -}) + -- VERY quickly disable observer after construction + on_construct = function(pos) + local timer = minetest.get_node_timer(pos) + timer:start(mcl_vars.redstone_tick) + end, + on_timer = function(pos, elapsed) + minetest.set_node(pos, {name = "mcl_observers:observer_up_off"}) + mesecon.receptor_off(pos, rules_up) + end, + } +) minetest.register_craft({ output = "mcl_observers:observer_off", @@ -267,7 +272,7 @@ minetest.register_craft({ { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble" }, { "mcl_nether:quartz", "mesecons:redstone", "mesecons:redstone" }, { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble" }, - } + }, }) minetest.register_craft({ output = "mcl_observers:observer_off", @@ -275,7 +280,7 @@ minetest.register_craft({ { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble" }, { "mesecons:redstone", "mesecons:redstone", "mcl_nether:quartz" }, { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble" }, - } + }, }) if realtime then @@ -454,7 +459,7 @@ minetest.register_lbm({ "mcl_observers:observer_down_on", "mcl_observers:observer_up_on", }, - run_at_every_load = true, + run_at_every_load = true, action = function(pos) minetest.after(1, mcl_observers.observer_activate, {x=pos.x, y=pos.y, z=pos.z}) end, From d43b2149e6b07883c9443d1ef26375ddd7205699 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 11:50:16 +0200 Subject: [PATCH 048/103] [mcl_dispensers] fix warnings --- mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 200 ++++++++++---------- 1 file changed, 101 insertions(+), 99 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 02ed70aed..73bc1f0da 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -96,125 +96,127 @@ local dispenserdef = { end, _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, - mesecons = {effector = { - -- Dispense random item when triggered - action_on = function (pos, node) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local droppos, dropdir - if node.name == "mcl_dispensers:dispenser" then - dropdir = vector.multiply(minetest.facedir_to_dir(node.param2), -1) - droppos = vector.add(pos, dropdir) - elseif node.name == "mcl_dispensers:dispenser_up" then - dropdir = {x=0, y=1, z=0} - droppos = {x=pos.x, y=pos.y+1, z=pos.z} - elseif node.name == "mcl_dispensers:dispenser_down" then - dropdir = {x=0, y=-1, z=0} - droppos = {x=pos.x, y=pos.y-1, z=pos.z} - end - local dropnode = minetest.get_node(droppos) - local dropnodedef = minetest.registered_nodes[dropnode.name] - local stacks = {} - for i=1,inv:get_size("main") do - local stack = inv:get_stack("main", i) - if not stack:is_empty() then - table.insert(stacks, {stack = stack, stackpos = i}) + mesecons = { + effector = { + -- Dispense random item when triggered + action_on = function (pos, node) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local droppos, dropdir + if node.name == "mcl_dispensers:dispenser" then + dropdir = vector.multiply(minetest.facedir_to_dir(node.param2), -1) + droppos = vector.add(pos, dropdir) + elseif node.name == "mcl_dispensers:dispenser_up" then + dropdir = {x=0, y=1, z=0} + droppos = {x=pos.x, y=pos.y+1, z=pos.z} + elseif node.name == "mcl_dispensers:dispenser_down" then + dropdir = {x=0, y=-1, z=0} + droppos = {x=pos.x, y=pos.y-1, z=pos.z} end - end - if #stacks >= 1 then - local r = math.random(1, #stacks) - local stack = stacks[r].stack - local dropitem = ItemStack(stack) - dropitem:set_count(1) - local stack_id = stacks[r].stackpos - local stackdef = stack:get_definition() - local iname = stack:get_name() - local igroups = minetest.registered_items[iname].groups + local dropnode = minetest.get_node(droppos) + local dropnodedef = minetest.registered_nodes[dropnode.name] + local stacks = {} + for i=1,inv:get_size("main") do + local stack = inv:get_stack("main", i) + if not stack:is_empty() then + table.insert(stacks, {stack = stack, stackpos = i}) + end + end + if #stacks >= 1 then + local r = math.random(1, #stacks) + local stack = stacks[r].stack + local dropitem = ItemStack(stack) + dropitem:set_count(1) + local stack_id = stacks[r].stackpos + local stackdef = stack:get_definition() + local iname = stack:get_name() + local igroups = minetest.registered_items[iname].groups - --[===[ Dispense item ]===] + --[===[ Dispense item ]===] - -- Hardcoded dispensions -- + -- Hardcoded dispensions -- - -- Armor, mob heads and pumpkins - if igroups.armor then - local droppos_below = {x = droppos.x, y = droppos.y - 1, z = droppos.z} + -- Armor, mob heads and pumpkins + if igroups.armor then + local droppos_below = {x = droppos.x, y = droppos.y - 1, z = droppos.z} - for _, objs in ipairs({minetest.get_objects_inside_radius(droppos, 1), minetest.get_objects_inside_radius(droppos_below, 1)}) do - for _, obj in ipairs(objs) do - stack = mcl_armor.equip(stack, obj) + for _, objs in ipairs({minetest.get_objects_inside_radius(droppos, 1), minetest.get_objects_inside_radius(droppos_below, 1)}) do + for _, obj in ipairs(objs) do + stack = mcl_armor.equip(stack, obj) + if stack:is_empty() then + break + end + end if stack:is_empty() then break end end - if stack:is_empty() then - break - end - end - -- Place head or pumpkin as node, if equipping it as armor has failed - if not stack:is_empty() then - if igroups.head or iname == "mcl_farming:pumpkin_face" then - if dropnodedef.buildable_to then - minetest.set_node(droppos, {name = iname, param2 = node.param2}) - stack:take_item() + -- Place head or pumpkin as node, if equipping it as armor has failed + if not stack:is_empty() then + if igroups.head or iname == "mcl_farming:pumpkin_face" then + if dropnodedef.buildable_to then + minetest.set_node(droppos, {name = iname, param2 = node.param2}) + stack:take_item() + end end end - end - inv:set_stack("main", stack_id, stack) - -- Spawn Egg - elseif igroups.spawn_egg then - -- Spawn mob - if not dropnodedef.walkable then - pointed_thing = { above = droppos, under = { x=droppos.x, y=droppos.y-1, z=droppos.z } } - minetest.add_entity(droppos, stack:get_name()) - - stack:take_item() inv:set_stack("main", stack_id, stack) - end + -- Spawn Egg + elseif igroups.spawn_egg then + -- Spawn mob + if not dropnodedef.walkable then + --pointed_thing = { above = droppos, under = { x=droppos.x, y=droppos.y-1, z=droppos.z } } + minetest.add_entity(droppos, stack:get_name()) - -- Generalized dispension - elseif (not dropnodedef.walkable or stackdef._dispense_into_walkable) then - --[[ _on_dispense(stack, pos, droppos, dropnode, dropdir) - * stack: Itemstack which is dispense - * pos: Position of dispenser - * droppos: Position to which to dispense item - * dropnode: Node of droppos - * dropdir: Drop direction - - _dispense_into_walkable: If true, can dispense into walkable nodes - ]] - if stackdef._on_dispense then - -- Item-specific dispension (if defined) - local od_ret = stackdef._on_dispense(dropitem, pos, droppos, dropnode, dropdir) - if od_ret then - local newcount = stack:get_count() - 1 - stack:set_count(newcount) - inv:set_stack("main", stack_id, stack) - if newcount == 0 then - inv:set_stack("main", stack_id, od_ret) - elseif inv:room_for_item("main", od_ret) then - inv:add_item("main", od_ret) - else - minetest.add_item(droppos, dropitem) - end - else stack:take_item() inv:set_stack("main", stack_id, stack) end - else - -- Drop item otherwise - minetest.add_item(droppos, dropitem) - stack:take_item() - inv:set_stack("main", stack_id, stack) + + -- Generalized dispension + elseif (not dropnodedef.walkable or stackdef._dispense_into_walkable) then + --[[ _on_dispense(stack, pos, droppos, dropnode, dropdir) + * stack: Itemstack which is dispense + * pos: Position of dispenser + * droppos: Position to which to dispense item + * dropnode: Node of droppos + * dropdir: Drop direction + + _dispense_into_walkable: If true, can dispense into walkable nodes + ]] + if stackdef._on_dispense then + -- Item-specific dispension (if defined) + local od_ret = stackdef._on_dispense(dropitem, pos, droppos, dropnode, dropdir) + if od_ret then + local newcount = stack:get_count() - 1 + stack:set_count(newcount) + inv:set_stack("main", stack_id, stack) + if newcount == 0 then + inv:set_stack("main", stack_id, od_ret) + elseif inv:room_for_item("main", od_ret) then + inv:add_item("main", od_ret) + else + minetest.add_item(droppos, dropitem) + end + else + stack:take_item() + inv:set_stack("main", stack_id, stack) + end + else + -- Drop item otherwise + minetest.add_item(droppos, dropitem) + stack:take_item() + inv:set_stack("main", stack_id, stack) + end end + + end - - - end - end, - rules = mesecon.rules.alldirs, - }}, + end, + rules = mesecon.rules.alldirs, + }, + }, on_rotate = on_rotate, } From 3fbcacac3bb2270ab7db60adfc9bf393687a35fc Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 11:50:58 +0200 Subject: [PATCH 049/103] [show_wielded_item] fix warnings --- mods/HUD/show_wielded_item/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/HUD/show_wielded_item/init.lua b/mods/HUD/show_wielded_item/init.lua index bc06bee43..456dc23e0 100644 --- a/mods/HUD/show_wielded_item/init.lua +++ b/mods/HUD/show_wielded_item/init.lua @@ -11,7 +11,7 @@ local xp_mod = minetest.get_modpath("mcl_experience") local function set_hud(player) if not player:is_player() then return end - local player_name = player:get_player_name() + local player_name = player:get_player_name() -- Fixed offset in config file local fixed = tonumber(minetest.settings:get("show_wielded_item_y_offset")) local off @@ -84,7 +84,7 @@ minetest.register_globalstep(function(dtime) wield[player_name] = wname dtimes[player_name] = 0 - if huds[player_name] then + if huds[player_name] then local def = minetest.registered_items[wname] local meta = wstack:get_meta() From 52b147365706979ce1544926218a08193708eb75 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 11:53:05 +0200 Subject: [PATCH 050/103] [mcl_comparators] fix warnings --- mods/ITEMS/REDSTONE/mcl_comparators/init.lua | 168 +++++++++---------- 1 file changed, 84 insertions(+), 84 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/init.lua b/mods/ITEMS/REDSTONE/mcl_comparators/init.lua index cd194b0d1..a76821543 100644 --- a/mods/ITEMS/REDSTONE/mcl_comparators/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_comparators/init.lua @@ -217,94 +217,94 @@ if minetest.get_modpath("screwdriver") then end for _, mode in pairs{"comp", "sub"} do -for _, state in pairs{mesecon.state.on, mesecon.state.off} do - local state_str = state_strs[state] - local nodename = - "mcl_comparators:comparator_"..state_strs[state].."_"..mode + for _, state in pairs{mesecon.state.on, mesecon.state.off} do + local state_str = state_strs[state] + local nodename = + "mcl_comparators:comparator_"..state_str.."_"..mode - -- Help - local longdesc, usagehelp, use_help - if state_strs[state] == "off" and mode == "comp" then - longdesc = S("Redstone comparators are multi-purpose redstone components.").."\n".. - S("They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals.") + -- Help + local longdesc, usagehelp, use_help + if state_str == "off" and mode == "comp" then + longdesc = S("Redstone comparators are multi-purpose redstone components.").."\n".. + S("They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals.") - usagehelp = S("A redstone comparator has 1 main input, 2 side inputs and 1 output. The output is in arrow direction, the main input is in the opposite direction. The other 2 sides are the side inputs.").."\n".. - S("The main input can powered in 2 ways: First, it can be powered directly by redstone power like any other component. Second, it is powered if, and only if a container (like a chest) is placed in front of it and the container contains at least one item.").."\n".. - S("The side inputs are only powered by normal redstone power. The redstone comparator can operate in two modes: Transmission mode and subtraction mode. It starts in transmission mode and the mode can be changed by using the block.").."\n\n".. - S("Transmission mode:\nThe front torch is unlit and lowered. The output is powered if, and only if the main input is powered. The two side inputs are ignored.").."\n".. - S("Subtraction mode:\nThe front torch is lit. The output is powered if, and only if the main input is powered and none of the side inputs is powered.") - else - use_help = false - end + usagehelp = S("A redstone comparator has 1 main input, 2 side inputs and 1 output. The output is in arrow direction, the main input is in the opposite direction. The other 2 sides are the side inputs.").."\n".. + S("The main input can powered in 2 ways: First, it can be powered directly by redstone power like any other component. Second, it is powered if, and only if a container (like a chest) is placed in front of it and the container contains at least one item.").."\n".. + S("The side inputs are only powered by normal redstone power. The redstone comparator can operate in two modes: Transmission mode and subtraction mode. It starts in transmission mode and the mode can be changed by using the block.").."\n\n".. + S("Transmission mode:\nThe front torch is unlit and lowered. The output is powered if, and only if the main input is powered. The two side inputs are ignored.").."\n".. + S("Subtraction mode:\nThe front torch is lit. The output is powered if, and only if the main input is powered and none of the side inputs is powered.") + else + use_help = false + end - local nodedef = { - description = S("Redstone Comparator"), - inventory_image = icon, - wield_image = icon, - _doc_items_create_entry = use_help, - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usagehelp, - drawtype = "nodebox", - tiles = get_tiles(state_strs[state], mode), - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, - wield_image = "mcl_comparators_off.png", - walkable = true, - selection_box = collision_box, - collision_box = collision_box, - node_box = { - type = "fixed", - fixed = node_boxes[mode], - }, - groups = groups, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = false, - is_ground_content = false, - drop = 'mcl_comparators:comparator_off_comp', - on_construct = update_self, - on_rightclick = - make_rightclick_handler(state_strs[state], mode), - comparator_mode = mode, - comparator_onstate = "mcl_comparators:comparator_on_"..mode, - comparator_offstate = "mcl_comparators:comparator_off_"..mode, - sounds = mcl_sounds.node_sound_stone_defaults(), - mesecons = { - receptor = { - state = state, - rules = comparator_get_output_rules, + local nodedef = { + description = S("Redstone Comparator"), + inventory_image = icon, + wield_image = icon, + _doc_items_create_entry = use_help, + _doc_items_longdesc = longdesc, + _doc_items_usagehelp = usagehelp, + drawtype = "nodebox", + tiles = get_tiles(state_str, mode), + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, + --wield_image = "mcl_comparators_off.png", + walkable = true, + selection_box = collision_box, + collision_box = collision_box, + node_box = { + type = "fixed", + fixed = node_boxes[mode], }, - effector = { - rules = comparator_get_input_rules, - action_change = update_self, - } - }, - on_rotate = on_rotate, - } + groups = groups, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = false, + is_ground_content = false, + drop = 'mcl_comparators:comparator_off_comp', + on_construct = update_self, + on_rightclick = + make_rightclick_handler(state_str, mode), + comparator_mode = mode, + comparator_onstate = "mcl_comparators:comparator_on_"..mode, + comparator_offstate = "mcl_comparators:comparator_off_"..mode, + sounds = mcl_sounds.node_sound_stone_defaults(), + mesecons = { + receptor = { + state = state, + rules = comparator_get_output_rules, + }, + effector = { + rules = comparator_get_input_rules, + action_change = update_self, + } + }, + on_rotate = on_rotate, + } - if mode == "comp" and state == mesecon.state.off then - -- This is the prototype - nodedef._doc_items_create_entry = true - else - nodedef.groups = table.copy(nodedef.groups) - nodedef.groups.not_in_creative_inventory = 1 - local extra_desc = {} - if mode == "sub" or state == mesecon.state.on then - nodedef.inventory_image = nil + if mode == "comp" and state == mesecon.state.off then + -- This is the prototype + nodedef._doc_items_create_entry = true + else + nodedef.groups = table.copy(nodedef.groups) + nodedef.groups.not_in_creative_inventory = 1 + --local extra_desc = {} + if mode == "sub" or state == mesecon.state.on then + nodedef.inventory_image = nil + end + local desc = nodedef.description + if mode ~= "sub" and state == mesecon.state.on then + desc = S("Redstone Comparator (Powered)") + elseif mode == "sub" and state ~= mesecon.state.on then + desc = S("Redstone Comparator (Subtract)") + elseif mode == "sub" and state == mesecon.state.on then + desc = S("Redstone Comparator (Subtract, Powered)") + end + nodedef.description = desc end - local desc = nodedef.description - if mode ~= "sub" and state == mesecon.state.on then - desc = S("Redstone Comparator (Powered)") - elseif mode == "sub" and state ~= mesecon.state.on then - desc = S("Redstone Comparator (Subtract)") - elseif mode == "sub" and state == mesecon.state.on then - desc = S("Redstone Comparator (Subtract, Powered)") - end - nodedef.description = desc + + minetest.register_node(nodename, nodedef) + mcl_wip.register_wip_item(nodename) end - - minetest.register_node(nodename, nodedef) - mcl_wip.register_wip_item(nodename) -end end -- Register recipies @@ -351,9 +351,9 @@ minetest.register_abm({ -- Add entry aliases for the Help if minetest.get_modpath("doc") then doc.add_entry_alias("nodes", "mcl_comparators:comparator_off_comp", - "nodes", "mcl_comparators:comparator_off_sub") + "nodes", "mcl_comparators:comparator_off_sub") doc.add_entry_alias("nodes", "mcl_comparators:comparator_off_comp", - "nodes", "mcl_comparators:comparator_on_comp") + "nodes", "mcl_comparators:comparator_on_comp") doc.add_entry_alias("nodes", "mcl_comparators:comparator_off_comp", - "nodes", "mcl_comparators:comparator_on_sub") + "nodes", "mcl_comparators:comparator_on_sub") end From 8baea02f2401e0b896dfb4be1e255bf1f4a06a03 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 13:20:00 +0200 Subject: [PATCH 051/103] [mcl_inventory] fix warnings --- mods/HUD/mcl_inventory/creative.lua | 26 ++++++++++++-------------- mods/HUD/mcl_inventory/init.lua | 8 +++----- mods/HUD/mcl_inventory/mod.conf | 4 ++-- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 61ba39b10..4d73aca35 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -7,7 +7,7 @@ local players = {} -- Containing all the items for each Creative Mode tab local inventory_lists = {} -local mod_player = minetest.get_modpath("mcl_player") ~= nil +--local mod_player = minetest.get_modpath("mcl_player") ~= nil -- Create tables local builtin_filter_ids = {"blocks","deco","redstone","rail","food","tools","combat","mobs","brew","matr","misc","all"} @@ -161,7 +161,7 @@ end local function init(player) local playername = player:get_player_name() - local inv = minetest.create_detached_inventory("creative_"..playername, { + minetest.create_detached_inventory("creative_"..playername, { allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) if minetest.is_creative_enabled(playername) then return count @@ -203,7 +203,7 @@ local offset = {} -- string offset: local boffset = {} -- local hoch = {} local filtername = {} -local bg = {} +--local bg = {} local noffset_x_start = -0.24 local noffset_x = noffset_x_start @@ -257,7 +257,6 @@ hoch["mobs"] = "_down" hoch["matr"] = "_down" hoch["inv"] = "_down" -filtername = {} filtername["blocks"] = S("Building Blocks") filtername["deco"] = S("Decoration Blocks") filtername["redstone"] = S("Redstone") @@ -272,9 +271,9 @@ filtername["brew"] = S("Brewing") filtername["matr"] = S("Materials") filtername["inv"] = S("Survival Inventory") -local dark_bg = "crafting_creative_bg_dark.png" +--local dark_bg = "crafting_creative_bg_dark.png" -local function reset_menu_item_bg() +--[[local function reset_menu_item_bg() bg["blocks"] = dark_bg bg["deco"] = dark_bg bg["redstone"] = dark_bg @@ -289,11 +288,11 @@ local function reset_menu_item_bg() bg["matr"] = dark_bg bg["inv"] = dark_bg bg["default"] = dark_bg -end +end]] mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_size, show, page, filter) - reset_menu_item_bg() + --reset_menu_item_bg() pagenum = math.floor(pagenum) or 1 local playername = player:get_player_name() @@ -310,7 +309,6 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz end local pagemax = math.max(1, math.floor((inv_size-1) / (9*5) + 1)) local name = "nix" - local formspec = "" local main_list local listrings = "listring[detached:creative_"..playername..";main]".. "listring[current_player;main]".. @@ -322,7 +320,7 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz players[playername].page = page end end - bg[name] = "crafting_creative_bg.png" + --bg[name] = "crafting_creative_bg.png" local inv_bg = "crafting_inventory_creative.png" if name == "inv" then @@ -428,7 +426,7 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz caption = "label[0,1.2;"..F(minetest.colorize("#313131", filtername[name])).."]" end - formspec = "size[10,9.3]".. + local formspec = "size[10,9.3]".. "no_prepend[]".. mcl_vars.gui_nonbg..mcl_vars.gui_bg_color.. "background[-0.19,-0.25;10.5,9.87;"..inv_bg.."]".. @@ -560,7 +558,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end -- Figure out current scroll bar from formspec - local formspec = player:get_inventory_formspec() + --local formspec = player:get_inventory_formspec() local start_i = players[name].start_i @@ -628,7 +626,7 @@ if minetest.is_creative_enabled("") then end mcl_inventory.update_inventory_formspec = function(player) - local page = nil + local page local name = player:get_player_name() @@ -639,7 +637,7 @@ if minetest.is_creative_enabled("") then end -- Figure out current scroll bar from formspec - local formspec = player:get_inventory_formspec() + --local formspec = player:get_inventory_formspec() local start_i = players[name].start_i local inv_size diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 1744ec089..4c50a6c13 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -3,8 +3,8 @@ local F = minetest.formspec_escape mcl_inventory = {} -local mod_player = minetest.get_modpath("mcl_player") ~= nil -local mod_craftguide = minetest.get_modpath("mcl_craftguide") ~= nil +--local mod_player = minetest.get_modpath("mcl_player") ~= nil +--local mod_craftguide = minetest.get_modpath("mcl_craftguide") ~= nil -- Returns a single itemstack in the given inventory to the main inventory, or drop it when there's no space left function return_item(itemstack, dropper, pos, inv) @@ -60,8 +60,6 @@ local function set_inventory(player, armor_change_only) inv:set_width("craft", 2) inv:set_size("craft", 4) - local player_name = player:get_player_name() - -- Show armor and player image local player_preview if minetest.settings:get_bool("3d_player_preview", true) then @@ -180,6 +178,6 @@ minetest.register_on_joinplayer(function(player) end) if minetest.is_creative_enabled("") then - dofile(minetest.get_modpath("mcl_inventory").."/creative.lua") + dofile(minetest.get_modpath(minetest.get_current_modname()).."/creative.lua") end diff --git a/mods/HUD/mcl_inventory/mod.conf b/mods/HUD/mcl_inventory/mod.conf index fa6b2c2f4..7585d9f70 100644 --- a/mods/HUD/mcl_inventory/mod.conf +++ b/mods/HUD/mcl_inventory/mod.conf @@ -1,6 +1,6 @@ name = mcl_inventory author = BlockMen description = Adds the player inventory and creative inventory. -depends = mcl_init, mcl_formspec -optional_depends = mcl_player, _mcl_autogroup, mcl_armor, mcl_brewing, mcl_potions, mcl_enchanting +depends = mcl_init, mcl_formspec, mcl_player +optional_depends = _mcl_autogroup, mcl_armor, mcl_brewing, mcl_potions, mcl_enchanting, mcl_craftguide From 8536e2c033cf51ef99989d56e7c400fdc444f2f8 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 13:33:36 +0200 Subject: [PATCH 052/103] [mcl_experience] fix warnings --- mods/HUD/mcl_experience/init.lua | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/mods/HUD/mcl_experience/init.lua b/mods/HUD/mcl_experience/init.lua index b52611d5a..53376c63f 100644 --- a/mods/HUD/mcl_experience/init.lua +++ b/mods/HUD/mcl_experience/init.lua @@ -1,5 +1,11 @@ local S = minetest.get_translator("mcl_experience") + mcl_experience = {} + +local vector = vector +local math = math +local string = string + local pool = {} local registered_nodes local max_xp = 2^31-1 @@ -262,7 +268,6 @@ function mcl_experience.add_experience(player, experience) if #final_candidates > 0 then local can = final_candidates[math.random(#final_candidates)] local stack, list, index, wear = can.stack, can.list, can.index, can.wear - local unbreaking_level = mcl_enchanting.get_enchantment(stack, "unbreaking") local uses = mcl_util.calculate_durability(stack) local multiplier = 2 * 65535 / uses local repair = experience * multiplier @@ -329,14 +334,12 @@ minetest.register_on_dieplayer(function(player) mcl_experience.throw_experience(player:get_pos(), xp_amount) end) - -local name local collector, pos, pos2 local direction, distance, player_velocity, goal local currentvel, acceleration, multiplier, velocity local node, vel, def local is_moving, is_slippery, slippery, slip_factor -local size, data +local size local function xp_step(self, dtime) --if item set to be collected then only execute go to player if self.collected == true then From ce9258b7647f5b20db044a5e926dea4a6010e5a7 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 13:43:59 +0200 Subject: [PATCH 053/103] [awards] fix warnings --- .luacheckrc | 9 +++++++++ mods/HUD/awards/triggers.lua | 16 ++++------------ mods/HUD/awards/unified_inventory.lua | 5 ++--- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.luacheckrc b/.luacheckrc index 556b2e8f0..2497a10ff 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -40,4 +40,13 @@ read_globals = { "factorial" } }, + ------ + --MODS + ------ + + --GENERAL + "default", + + --HUD + "sfinv", "unified_inventory", } \ No newline at end of file diff --git a/mods/HUD/awards/triggers.lua b/mods/HUD/awards/triggers.lua index 318a4b281..995dd005c 100644 --- a/mods/HUD/awards/triggers.lua +++ b/mods/HUD/awards/triggers.lua @@ -250,9 +250,7 @@ minetest.register_on_dignode(function(pos, oldnode, digger) local tnodedug = string.split(entry.node, ":") local tmod = tnodedug[1] local titem = tnodedug[2] - if not tmod or not titem or not data.count[tmod] or not data.count[tmod][titem] then - -- table running failed! - elseif data.count[tmod][titem] > entry.target-1 then + if tmod and titem and data.count[tmod] and data.count[tmod][titem] and data.count[tmod][titem] > entry.target-1 then return entry.award end elseif awards.get_total_item_count(data, "count") > entry.target-1 then @@ -277,9 +275,7 @@ minetest.register_on_placenode(function(pos, node, digger) local tnodedug = string.split(entry.node, ":") local tmod = tnodedug[1] local titem = tnodedug[2] - if not tmod or not titem or not data.place[tmod] or not data.place[tmod][titem] then - -- table running failed! - elseif data.place[tmod][titem] > entry.target-1 then + if tmod and titem and data.place[tmod] and data.place[tmod][titem] and data.place[tmod][titem] > entry.target-1 then return entry.award end elseif awards.get_total_item_count(data, "place") > entry.target-1 then @@ -303,9 +299,7 @@ minetest.register_on_item_eat(function(hp_change, replace_with_item, itemstack, local titemstring = string.split(entry.item, ":") local tmod = titemstring[1] local titem = titemstring[2] - if not tmod or not titem or not data.eat[tmod] or not data.eat[tmod][titem] then - -- table running failed! - elseif data.eat[tmod][titem] > entry.target-1 then + if tmod and titem and data.eat[tmod] and data.eat[tmod][titem] and data.eat[tmod][titem] > entry.target-1 then return entry.award end elseif awards.get_total_item_count(data, "eat") > entry.target-1 then @@ -331,9 +325,7 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv local titemcrafted = string.split(entry.item, ":") local tmod = titemcrafted[1] local titem = titemcrafted[2] - if not tmod or not titem or not data.craft[tmod] or not data.craft[tmod][titem] then - -- table running failed! - elseif data.craft[tmod][titem] > entry.target-1 then + if tmod and titem and data.craft[tmod] and data.craft[tmod][titem] and data.craft[tmod][titem] > entry.target-1 then return entry.award end elseif awards.get_total_item_count(data, "craft") > entry.target-1 then diff --git a/mods/HUD/awards/unified_inventory.lua b/mods/HUD/awards/unified_inventory.lua index be5ca5f94..3dc238e1a 100644 --- a/mods/HUD/awards/unified_inventory.lua +++ b/mods/HUD/awards/unified_inventory.lua @@ -1,6 +1,5 @@ -if minetest.get_modpath("unified_inventory") ~= nil then - local S = minetest.get_translator("awards") - +if minetest.get_modpath("unified_inventory") then + local S = minetest.get_translator(minetest.get_current_modname()) unified_inventory.register_button("awards", { type = "image", image = "awards_ui_icon.png", From c19c05443e27bd3a552e1b9fc0d8838b2aefe462 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 13:46:08 +0200 Subject: [PATCH 054/103] [mcl_craftguide] fix warnings --- mods/HELP/mcl_craftguide/init.lua | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index d05d8b3d0..bfaef6011 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -417,9 +417,9 @@ local function get_tooltip(item, groups, cooktime, burntime) -- and just print the normal item name without special formatting if groups[1] == "compass" or groups[1] == "clock" then groupstr = reg_items[item].description - elseif group_names[groups[1]] then + elseif g then -- Use the special group name string - groupstr = minetest.colorize(gcol, group_names[groups[1]]) + groupstr = minetest.colorize(gcol, g) else --[[ Fallback: Generic group explanation: This always works, but the internally used group name (which @@ -545,7 +545,7 @@ local function get_recipe_fs(data, iY) if custom_recipe or shapeless or recipe.type == "cooking" then local icon = custom_recipe and custom_recipe.icon or - shapeless and "shapeless" or "furnace" + shapeless and "shapeless" or "furnace" if recipe.type == "cooking" then icon = "default_furnace_front_active.png" @@ -638,7 +638,7 @@ local function make_formspec(name) fs[#fs + 1] = "background9[1,1;1,1;mcl_base_textures_background9.png;true;7]" fs[#fs + 1] = fmt([[ tooltip[size_inc;%s] - tooltip[size_dec;%s] ]], + tooltip[size_dec;%s] ]], ESC(S("Increase window size")), ESC(S("Decrease window size"))) @@ -656,9 +656,9 @@ local function make_formspec(name) ]] fs[#fs + 1] = fmt([[ tooltip[search;%s] - tooltip[clear;%s] - tooltip[prev;%s] - tooltip[next;%s] ]], + tooltip[clear;%s] + tooltip[prev;%s] + tooltip[next;%s] ]], ESC(S("Search")), ESC(S("Reset")), ESC(S("Previous page")), From 58510b00ee4eca35a4c0c49192b913a30bdad172 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 13:51:54 +0200 Subject: [PATCH 055/103] [mcl_tt] fix some warnings --- mods/HELP/mcl_tt/snippets_base.lua | 10 +++++----- mods/HELP/mcl_tt/snippets_mcl.lua | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/mods/HELP/mcl_tt/snippets_base.lua b/mods/HELP/mcl_tt/snippets_base.lua index 8242f2c19..bd5495721 100644 --- a/mods/HELP/mcl_tt/snippets_base.lua +++ b/mods/HELP/mcl_tt/snippets_base.lua @@ -1,6 +1,6 @@ local S = minetest.get_translator("mcl_tt") -local function get_min_digtime(caps) +--[[local function get_min_digtime(caps) local mintime local unique = true local maxlevel = caps.maxlevel @@ -25,7 +25,7 @@ local function get_min_digtime(caps) end end return mintime, unique -end +end]] local function newline(str) if str ~= "" then @@ -47,7 +47,7 @@ tt.register_snippet(function(itemstring, toolcaps) local minestring = "" local capstr = "" local caplines = 0 - for k,v in pairs(groupcaps) do + for _,v in pairs(groupcaps) do local speedstr = "" local miningusesstr = "" -- Mining capabilities @@ -153,9 +153,9 @@ tt.register_snippet(function(itemstring, toolcaps) end) -- Weapon stats -tt.register_snippet(function(itemstring) +--[[tt.register_snippet(function(itemstring) local def = minetest.registered_items[itemstring] -end) +end)]] -- Food tt.register_snippet(function(itemstring) diff --git a/mods/HELP/mcl_tt/snippets_mcl.lua b/mods/HELP/mcl_tt/snippets_mcl.lua index 3d13df751..b10021640 100644 --- a/mods/HELP/mcl_tt/snippets_mcl.lua +++ b/mods/HELP/mcl_tt/snippets_mcl.lua @@ -2,7 +2,7 @@ local S = minetest.get_translator("mcl_tt") -- Armor tt.register_snippet(function(itemstring) - local def = minetest.registered_items[itemstring] + --local def = minetest.registered_items[itemstring] local s = "" local head = minetest.get_item_group(itemstring, "armor_head") local torso = minetest.get_item_group(itemstring, "armor_torso") @@ -26,7 +26,7 @@ tt.register_snippet(function(itemstring) return s end) tt.register_snippet(function(itemstring, _, itemstack) - local def = minetest.registered_items[itemstring] + --local def = minetest.registered_items[itemstring] local s = "" local use = minetest.get_item_group(itemstring, "mcl_armor_uses") local pts = minetest.get_item_group(itemstring, "mcl_armor_points") @@ -75,7 +75,7 @@ tt.register_snippet(function(itemstring) end) tt.register_snippet(function(itemstring) - local def = minetest.registered_items[itemstring] + --local def = minetest.registered_items[itemstring] if minetest.get_item_group(itemstring, "crush_after_fall") == 1 then return S("Deals damage when falling"), mcl_colors.YELLOW end From 5975b20cffc3843d501ba14c42571b8a9c04596b Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 14:02:47 +0200 Subject: [PATCH 056/103] [mcl_doc] fix warnings --- mods/HELP/mcl_doc/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/HELP/mcl_doc/init.lua b/mods/HELP/mcl_doc/init.lua index d926550f8..fa6ae6c05 100644 --- a/mods/HELP/mcl_doc/init.lua +++ b/mods/HELP/mcl_doc/init.lua @@ -154,7 +154,7 @@ doc.sub.items.register_factoid(nil, "use", function(itemstring, def) return s end) doc.sub.items.register_factoid(nil, "groups", function(itemstring, def) - local def = minetest.registered_items[itemstring] + --local def = minetest.registered_items[itemstring] local s = "" local use = minetest.get_item_group(itemstring, "mcl_armor_uses") local pts = minetest.get_item_group(itemstring, "mcl_armor_points") @@ -289,7 +289,7 @@ doc.sub.items.register_factoid("nodes", "drops", function(itemstring, def) local itemname = item:get_name() local itemcount = item:get_count() local idef = minetest.registered_items[itemname] - local text = "" + local text if idef.description and idef.description ~= "" then text = idef.description else From 4fd0bf2c3fb0961e765aebf3bc6798725c9c7aa6 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 14:12:19 +0200 Subject: [PATCH 057/103] [doc_items] fix warnings --- mods/HELP/doc/doc_items/init.lua | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/mods/HELP/doc/doc_items/init.lua b/mods/HELP/doc/doc_items/init.lua index ec4da620e..edba0dae3 100644 --- a/mods/HELP/doc/doc_items/init.lua +++ b/mods/HELP/doc/doc_items/init.lua @@ -164,7 +164,7 @@ local factoid_toolcaps = function(tool_capabilities, check_uses) local useslines = 0 for k,v in pairs(groupcaps) do -- Mining capabilities - local minrating, maxrating + --[[local minrating, maxrating if v.times then for rating, time in pairs(v.times) do if minrating == nil then minrating = rating else @@ -177,7 +177,7 @@ local factoid_toolcaps = function(tool_capabilities, check_uses) else minrating = 1 maxrating = 1 - end + end]] local maxlevel = v.maxlevel if not maxlevel then -- Default from tool.h @@ -577,11 +577,8 @@ doc.add_category("nodes", { description = S("Item reference of blocks and other things which are capable of occupying space"), build_formspec = function(data, playername) if data then - local formstring = "" - local datastring = "" - - formstring = entry_image(data) - datastring = factoids_header(data, "nodes") + local formstring = entry_image(data) + local datastring = factoids_header(data, "nodes") local liquid = data.def.liquidtype ~= "none" and minetest.get_item_group(data.itemstring, "fake_liquid") == 0 if not forbidden_core_factoids.basics then @@ -834,7 +831,7 @@ doc.add_category("nodes", { elseif type(data.def.drop) == "table" and data.def.drop.items ~= nil then local max = data.def.drop.max_items local dropstring = "" - local dropstring_base = "" + local dropstring_base if max == nil then dropstring_base = N("This block will drop the following items when mined: @1.") elseif max == 1 then @@ -852,7 +849,7 @@ doc.add_category("nodes", { local rarity_history = {} for i=1,#data.def.drop.items do local local_rarity = data.def.drop.items[i].rarity - local chance = 1 + local chance local rarity = 1 if local_rarity == nil then local_rarity = 1 @@ -937,7 +934,6 @@ doc.add_category("nodes", { end local rarity = probtable.rarity - local raritystring = "" -- No percentage if there's only one possible guaranteed drop if not(rarity == 1 and #data.def.drop.items == 1) then local chance = (1/rarity)*100 @@ -1086,11 +1082,8 @@ doc.add_category("tools", { end, build_formspec = function(data, playername) if data then - local formstring = "" - local datastring = "" - - formstring = entry_image(data) - datastring = factoids_header(data, "tools") + local formstring = entry_image(data) + local datastring = factoids_header(data, "tools") -- Overwritten durability info if type(data.def._doc_items_durability) == "number" then @@ -1120,11 +1113,8 @@ doc.add_category("craftitems", { description = S("Item reference of items which are neither blocks, tools or weapons (esp. crafting items)"), build_formspec = function(data, playername) if data then - local formstring = "" - local datastring = "" - - formstring = entry_image(data) - datastring = factoids_header(data, "craftitems") + local formstring = entry_image(data) + local datastring = factoids_header(data, "craftitems") datastring = datastring .. factoids_footer(data, playername, "craftitems") formstring = formstring .. doc.widgets.text(datastring, nil, nil, doc.FORMSPEC.ENTRY_WIDTH - 1.2) From 21b7647731fce4a11ce99dd47e3fdbd3d43fd56a Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 14:23:37 +0200 Subject: [PATCH 058/103] [doc] fix warnings --- .luacheckrc | 2 +- mods/HELP/doc/doc/init.lua | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/.luacheckrc b/.luacheckrc index 2497a10ff..910d73a11 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -48,5 +48,5 @@ read_globals = { "default", --HUD - "sfinv", "unified_inventory", + "sfinv", "sfinv_buttons", "unified_inventory", "cmsg", "inventory_plus", } \ No newline at end of file diff --git a/mods/HELP/doc/doc/init.lua b/mods/HELP/doc/doc/init.lua index 029914a53..a04d83bda 100644 --- a/mods/HELP/doc/doc/init.lua +++ b/mods/HELP/doc/doc/init.lua @@ -233,7 +233,7 @@ end -- Returns true if the specified entry has been viewed by the player function doc.entry_viewed(playername, category_id, entry_id) - local entry, category_id, entry_id = get_entry(category_id, entry_id) + local _, category_id, entry_id = get_entry(category_id, entry_id) if doc.data.players[playername].stored_data.viewed[category_id] == nil then return false else @@ -243,7 +243,7 @@ end -- Returns true if the specified entry is hidden from the player function doc.entry_revealed(playername, category_id, entry_id) - local entry, category_id, entry_id = get_entry(category_id, entry_id) + local _, category_id, entry_id = get_entry(category_id, entry_id) local hidden = doc.data.categories[category_id].entries[entry_id].hidden if doc.data.players[playername].stored_data.revealed[category_id] == nil then return not hidden @@ -302,7 +302,7 @@ function doc.show_entry(playername, category_id, entry_id, ignore_hidden) minetest.show_formspec(playername, "doc:error_no_categories", doc.formspec_error_no_categories()) return end - local entry, category_id, entry_id = get_entry(category_id, entry_id) + local _, category_id, entry_id = get_entry(category_id, entry_id) if ignore_hidden or doc.entry_revealed(playername, category_id, entry_id) then local playerdata = doc.data.players[playername] playerdata.category = category_id @@ -587,8 +587,6 @@ doc.widgets.gallery = function(imagedata, playername, x, y, aspect_ratio, width, formstring = formstring .. "label["..nx..","..ny..";"..i.."]" pos = pos + 1 end - local bw, bh - return formstring, ih end From 5f8d79b37ab4c0e02634ae5e19d5f18e07d49cd4 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 14:44:50 +0200 Subject: [PATCH 059/103] [mcl_weather] fix warnings --- mods/ENVIRONMENT/mcl_weather/rain.lua | 4 +- mods/ENVIRONMENT/mcl_weather/skycolor.lua | 6 +- mods/ENVIRONMENT/mcl_weather/snow.lua | 118 +++++++++--------- mods/ENVIRONMENT/mcl_weather/thunder.lua | 88 +++++++------ mods/ENVIRONMENT/mcl_weather/weather_core.lua | 30 ++--- 5 files changed, 122 insertions(+), 124 deletions(-) diff --git a/mods/ENVIRONMENT/mcl_weather/rain.lua b/mods/ENVIRONMENT/mcl_weather/rain.lua index d8425784a..786e08fa9 100644 --- a/mods/ENVIRONMENT/mcl_weather/rain.lua +++ b/mods/ENVIRONMENT/mcl_weather/rain.lua @@ -249,7 +249,7 @@ if mcl_weather.allow_abm then end end end - }) + }) -- Wetten the soil minetest.register_abm({ @@ -264,7 +264,7 @@ if mcl_weather.allow_abm then end end end - }) + }) end if mcl_weather.reg_weathers.rain == nil then diff --git a/mods/ENVIRONMENT/mcl_weather/skycolor.lua b/mods/ENVIRONMENT/mcl_weather/skycolor.lua index 061634fcb..488f6b1a1 100644 --- a/mods/ENVIRONMENT/mcl_weather/skycolor.lua +++ b/mods/ENVIRONMENT/mcl_weather/skycolor.lua @@ -11,7 +11,7 @@ mcl_weather.skycolor = { -- Update interval. update_interval = 15, - -- Main sky colors: starts from midnight to midnight. + -- Main sky colors: starts from midnight to midnight. -- Please do not set directly. Use add_layer instead. colors = {}, @@ -205,8 +205,8 @@ mcl_weather.skycolor = { -- Returns first player sky color. I assume that all players are in same color layout. get_current_bg_color = function() local players = mcl_weather.skycolor.utils.get_players(nil) - for _, player in ipairs(players) do - return player:get_sky() + if players[1] then + return players[1]:get_sky() end return nil end diff --git a/mods/ENVIRONMENT/mcl_weather/snow.lua b/mods/ENVIRONMENT/mcl_weather/snow.lua index 3a0c539e3..9ec9fbac1 100644 --- a/mods/ENVIRONMENT/mcl_weather/snow.lua +++ b/mods/ENVIRONMENT/mcl_weather/snow.lua @@ -5,80 +5,80 @@ mcl_weather.snow = {} mcl_weather.snow.particles_count = 15 mcl_weather.snow.init_done = false --- calculates coordinates and draw particles for snow weather +-- calculates coordinates and draw particles for snow weather mcl_weather.snow.add_snow_particles = function(player) - mcl_weather.rain.last_rp_count = 0 - for i=mcl_weather.snow.particles_count, 1,-1 do - local random_pos_x, random_pos_y, random_pos_z = mcl_weather.get_random_pos_by_player_look_dir(player) - random_pos_y = math.random() + math.random(player:get_pos().y - 1, player:get_pos().y + 7) - if minetest.get_node_light({x=random_pos_x, y=random_pos_y, z=random_pos_z}, 0.5) == 15 then - mcl_weather.rain.last_rp_count = mcl_weather.rain.last_rp_count + 1 - minetest.add_particle({ - pos = {x=random_pos_x, y=random_pos_y, z=random_pos_z}, - velocity = {x = math.random(-100,100)*0.001, y = math.random(-300,-100)*0.004, z = math.random(-100,100)*0.001}, - acceleration = {x = 0, y=0, z = 0}, - expirationtime = 8.0, - size = 1, - collisiondetection = true, - collision_removal = true, - object_collision = false, - vertical = false, - texture = mcl_weather.snow.get_texture(), - playername = player:get_player_name() - }) - end - end + mcl_weather.rain.last_rp_count = 0 + for i=mcl_weather.snow.particles_count, 1,-1 do + local random_pos_x, _, random_pos_z = mcl_weather.get_random_pos_by_player_look_dir(player) + local random_pos_y = math.random() + math.random(player:get_pos().y - 1, player:get_pos().y + 7) + if minetest.get_node_light({x=random_pos_x, y=random_pos_y, z=random_pos_z}, 0.5) == 15 then + mcl_weather.rain.last_rp_count = mcl_weather.rain.last_rp_count + 1 + minetest.add_particle({ + pos = {x=random_pos_x, y=random_pos_y, z=random_pos_z}, + velocity = {x = math.random(-100,100)*0.001, y = math.random(-300,-100)*0.004, z = math.random(-100,100)*0.001}, + acceleration = {x = 0, y=0, z = 0}, + expirationtime = 8.0, + size = 1, + collisiondetection = true, + collision_removal = true, + object_collision = false, + vertical = false, + texture = mcl_weather.snow.get_texture(), + playername = player:get_player_name() + }) + end + end end mcl_weather.snow.set_sky_box = function() - mcl_weather.skycolor.add_layer( - "weather-pack-snow-sky", - {{r=0, g=0, b=0}, - {r=85, g=86, b=86}, - {r=135, g=135, b=135}, - {r=85, g=86, b=86}, - {r=0, g=0, b=0}}) - mcl_weather.skycolor.active = true - for _, player in pairs(get_connected_players()) do - player:set_clouds({color="#ADADADE8"}) - end - mcl_weather.skycolor.active = true + mcl_weather.skycolor.add_layer( + "weather-pack-snow-sky", + {{r=0, g=0, b=0}, + {r=85, g=86, b=86}, + {r=135, g=135, b=135}, + {r=85, g=86, b=86}, + {r=0, g=0, b=0}}) + mcl_weather.skycolor.active = true + for _, player in pairs(get_connected_players()) do + player:set_clouds({color="#ADADADE8"}) + end + mcl_weather.skycolor.active = true end -mcl_weather.snow.clear = function() - mcl_weather.skycolor.remove_layer("weather-pack-snow-sky") - mcl_weather.snow.init_done = false +function mcl_weather.snow.clear() + mcl_weather.skycolor.remove_layer("weather-pack-snow-sky") + mcl_weather.snow.init_done = false end -- Simple random texture getter -mcl_weather.snow.get_texture = function() - return "weather_pack_snow_snowflake"..math.random(1,2)..".png" +function mcl_weather.snow.get_texture() + return "weather_pack_snow_snowflake"..math.random(1,2)..".png" end local timer = 0 minetest.register_globalstep(function(dtime) - if mcl_weather.state ~= "snow" then - return false - end - - timer = timer + dtime; - if timer >= 0.5 then - timer = 0 - else - return - end + if mcl_weather.state ~= "snow" then + return false + end - if mcl_weather.snow.init_done == false then - mcl_weather.snow.set_sky_box() - mcl_weather.snow.init_done = true - end + timer = timer + dtime; + if timer >= 0.5 then + timer = 0 + else + return + end - for _, player in pairs(get_connected_players()) do - if (mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:get_pos())) then - return false - end - mcl_weather.snow.add_snow_particles(player) - end + if mcl_weather.snow.init_done == false then + mcl_weather.snow.set_sky_box() + mcl_weather.snow.init_done = true + end + + for _, player in pairs(get_connected_players()) do + if (mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:get_pos())) then + return false + end + mcl_weather.snow.add_snow_particles(player) + end end) -- register snow weather diff --git a/mods/ENVIRONMENT/mcl_weather/thunder.lua b/mods/ENVIRONMENT/mcl_weather/thunder.lua index ece673170..f8e5a0371 100644 --- a/mods/ENVIRONMENT/mcl_weather/thunder.lua +++ b/mods/ENVIRONMENT/mcl_weather/thunder.lua @@ -4,60 +4,58 @@ local get_connected_players = minetest.get_connected_players lightning.auto = false mcl_weather.thunder = { - next_strike = 0, - min_delay = 3, - max_delay = 12, - init_done = false, + next_strike = 0, + min_delay = 3, + max_delay = 12, + init_done = false, } minetest.register_globalstep(function(dtime) - if mcl_weather.get_weather() ~= "thunder" then - return false - end - - mcl_weather.rain.set_particles_mode("thunder") - mcl_weather.rain.make_weather() + if mcl_weather.get_weather() ~= "thunder" then + return false + end - if mcl_weather.thunder.init_done == false then - mcl_weather.skycolor.add_layer( - "weather-pack-thunder-sky", - {{r=0, g=0, b=0}, - {r=40, g=40, b=40}, - {r=85, g=86, b=86}, - {r=40, g=40, b=40}, - {r=0, g=0, b=0}}) - mcl_weather.skycolor.active = true - for _, player in pairs(get_connected_players()) do - player:set_clouds({color="#3D3D3FE8"}) - end - mcl_weather.thunder.init_done = true - end - - if (mcl_weather.thunder.next_strike <= minetest.get_gametime()) then - lightning.strike() - local delay = math.random(mcl_weather.thunder.min_delay, mcl_weather.thunder.max_delay) - mcl_weather.thunder.next_strike = minetest.get_gametime() + delay - end + mcl_weather.rain.set_particles_mode("thunder") + mcl_weather.rain.make_weather() + if mcl_weather.thunder.init_done == false then + mcl_weather.skycolor.add_layer("weather-pack-thunder-sky", { + {r=0, g=0, b=0}, + {r=40, g=40, b=40}, + {r=85, g=86, b=86}, + {r=40, g=40, b=40}, + {r=0, g=0, b=0}, + }) + mcl_weather.skycolor.active = true + for _, player in pairs(get_connected_players()) do + player:set_clouds({color="#3D3D3FE8"}) + end + mcl_weather.thunder.init_done = true + end + if (mcl_weather.thunder.next_strike <= minetest.get_gametime()) then + lightning.strike() + local delay = math.random(mcl_weather.thunder.min_delay, mcl_weather.thunder.max_delay) + mcl_weather.thunder.next_strike = minetest.get_gametime() + delay + end end) -mcl_weather.thunder.clear = function() - mcl_weather.rain.clear() - mcl_weather.skycolor.remove_layer("weather-pack-thunder-sky") - mcl_weather.skycolor.remove_layer("lightning") - mcl_weather.thunder.init_done = false +function mcl_weather.thunder.clear() + mcl_weather.rain.clear() + mcl_weather.skycolor.remove_layer("weather-pack-thunder-sky") + mcl_weather.skycolor.remove_layer("lightning") + mcl_weather.thunder.init_done = false end -- register thunderstorm weather if mcl_weather.reg_weathers.thunder == nil then - mcl_weather.reg_weathers.thunder = { - clear = mcl_weather.thunder.clear, - light_factor = 0.33333, - -- 10min - 20min - min_duration = 600, - max_duration = 1200, - transitions = { - [100] = "rain", - } - } + mcl_weather.reg_weathers.thunder = { + clear = mcl_weather.thunder.clear, + light_factor = 0.33333, + -- 10min - 20min + min_duration = 600, + max_duration = 1200, + transitions = { + [100] = "rain", + }, + } end diff --git a/mods/ENVIRONMENT/mcl_weather/weather_core.lua b/mods/ENVIRONMENT/mcl_weather/weather_core.lua index d3772dc7e..b8deba318 100644 --- a/mods/ENVIRONMENT/mcl_weather/weather_core.lua +++ b/mods/ENVIRONMENT/mcl_weather/weather_core.lua @@ -1,27 +1,29 @@ local S = minetest.get_translator("mcl_weather") +local math = math + -- weather states, 'none' is default, other states depends from active mods mcl_weather.state = "none" - + -- player list for saving player meta info mcl_weather.players = {} - + -- default weather check interval for global step mcl_weather.check_interval = 5 - + -- weather min duration mcl_weather.min_duration = 600 - + -- weather max duration mcl_weather.max_duration = 9000 -- weather calculated end time mcl_weather.end_time = nil - + -- registered weathers mcl_weather.reg_weathers = {} --- global flag to disable/enable ABM logic. +-- global flag to disable/enable ABM logic. mcl_weather.allow_abm = true mcl_weather.reg_weathers["none"] = { @@ -51,7 +53,7 @@ mcl_weather.get_rand_end_time = function(min_duration, max_duration) r = math.random(min_duration, max_duration) else r = math.random(mcl_weather.min_duration, mcl_weather.max_duration) - end + end return minetest.get_gametime() + r end @@ -80,8 +82,8 @@ end mcl_weather.is_underwater = function(player) local ppos = player:get_pos() local offset = player:get_eye_offset() - local player_eye_pos = {x = ppos.x + offset.x, - y = ppos.y + offset.y + 1.5, + local player_eye_pos = {x = ppos.x + offset.x, + y = ppos.y + offset.y + 1.5, z = ppos.z + offset.z} local node_level = minetest.get_node_level(player_eye_pos) if node_level == 8 or node_level == 7 then @@ -91,14 +93,12 @@ mcl_weather.is_underwater = function(player) end -- trying to locate position for particles by player look direction for performance reason. --- it is costly to generate many particles around player so goal is focus mainly on front view. +-- it is costly to generate many particles around player so goal is focus mainly on front view. mcl_weather.get_random_pos_by_player_look_dir = function(player) local look_dir = player:get_look_dir() local player_pos = player:get_pos() - local random_pos_x = 0 - local random_pos_y = 0 - local random_pos_z = 0 + local random_pos_x, random_pos_y, random_pos_z if look_dir.x > 0 then if look_dir.z > 0 then @@ -208,7 +208,7 @@ minetest.register_privilege("weather_manager", { give_to_singleplayer = false }) --- Weather command definition. Set +-- Weather command definition. Set minetest.register_chatcommand("weather", { params = "(clear | rain | snow | thunder) []", description = S("Changes the weather to the specified parameter."), @@ -270,7 +270,7 @@ minetest.register_chatcommand("toggledownfall", { local weather_allow_abm = minetest.settings:get_bool("weather_allow_abm") if weather_allow_abm ~= nil and weather_allow_abm == false then mcl_weather.allow_abm = false -end +end local load_weather = function() From 36dc18e9da888db5f01c9730c5ef28e900aeab80 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 14:46:13 +0200 Subject: [PATCH 060/103] [mcl_void_damage] fix warnings --- mods/ENVIRONMENT/mcl_void_damage/init.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ENVIRONMENT/mcl_void_damage/init.lua b/mods/ENVIRONMENT/mcl_void_damage/init.lua index 24f7d0e4b..c3819c1da 100644 --- a/mods/ENVIRONMENT/mcl_void_damage/init.lua +++ b/mods/ENVIRONMENT/mcl_void_damage/init.lua @@ -1,5 +1,5 @@ local S = minetest.get_translator("mcl_void_damage") -local enable_damage = minetest.settings:get_bool("enable_damage") +--local enable_damage = minetest.settings:get_bool("enable_damage") local pos_to_dim = mcl_worlds.pos_to_dimension local dim_change = mcl_worlds.dimension_change @@ -39,9 +39,9 @@ minetest.register_on_mods_loaded(function() end self._void_timer = 0 - local void, void_deadly = is_in_void(pos) + local _, void_deadly = is_in_void(pos) if void_deadly then - local ent = obj:get_luaentity() + --local ent = obj:get_luaentity() obj:remove() return end @@ -61,7 +61,7 @@ minetest.register_globalstep(function(dtime) for p=1, #players do local player = players[p] local pos = player:get_pos() - local void, void_deadly = is_in_void(pos) + local _, void_deadly = is_in_void(pos) if void_deadly then local immortal_val = player:get_armor_groups().immortal local is_immortal = false From 9f41c6fc64b1255bd87dce954708187dc54f9e91 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 14:48:52 +0200 Subject: [PATCH 061/103] [mcl_moon] fix warnings --- mods/ENVIRONMENT/mcl_moon/init.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/mods/ENVIRONMENT/mcl_moon/init.lua b/mods/ENVIRONMENT/mcl_moon/init.lua index 4ee2623a6..1a5030b4e 100644 --- a/mods/ENVIRONMENT/mcl_moon/init.lua +++ b/mods/ENVIRONMENT/mcl_moon/init.lua @@ -4,11 +4,9 @@ local SHEET_W = 4 local SHEET_H = 2 -- Randomize initial moon phase, based on map seed -local phase_offset local mg_seed = minetest.get_mapgen_setting("seed") local rand = PseudoRandom(mg_seed) local phase_offset = rand:next(0, MOON_PHASES - 1) -rand = nil minetest.log("info", "[mcl_moon] Moon phase offset of this world: "..phase_offset) From b0a3cffad0414ced64bdb32b049b77ae2439c869 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 14:50:38 +0200 Subject: [PATCH 062/103] [lightning] fix warnings --- mods/ENVIRONMENT/lightning/init.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index 4a58866f9..2b79bf5ce 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -134,6 +134,7 @@ lightning.strike = function(pos) sound_play({ name = "lightning_thunder", gain = 10 }, { pos = pos, max_hear_distance = 500 }, true) -- damage nearby objects, transform mobs + -- TODO: use an API insteed of hardcoding this behaviour local objs = get_objects_inside_radius(pos2, 3.5) for o=1, #objs do local obj = objs[o] @@ -153,7 +154,7 @@ lightning.strike = function(pos) end obj:set_properties({textures = lua.base_texture}) -- villager → witch (no damage) - elseif lua and lua.name == "mobs_mc:villager" then + --elseif lua and lua.name == "mobs_mc:villager" then -- Witches are incomplete, this code is unused -- TODO: Enable this code when witches are working. --[[ From 470f7b70bcf44b93f26dde66b836759a5371b8ff Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 14:54:20 +0200 Subject: [PATCH 063/103] [mobs_mc_gameconfig] fix warning --- mods/ENTITIES/mobs_mc_gameconfig/init.lua | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mods/ENTITIES/mobs_mc_gameconfig/init.lua b/mods/ENTITIES/mobs_mc_gameconfig/init.lua index 06d7eb87f..27cb4b4bf 100644 --- a/mods/ENTITIES/mobs_mc_gameconfig/init.lua +++ b/mods/ENTITIES/mobs_mc_gameconfig/init.lua @@ -200,14 +200,14 @@ end mobs_mc.override.enderman_block_texture_overrides = { ["mcl_core:cactus"] = ctable, -- FIXME: replace colorize colors with colors from palette - ["mcl_core:dirt_with_grass"] = - { - "mcl_core_grass_block_top.png^[colorize:green:90", - "default_dirt.png", - "default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)", - "default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)", - "default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)", - "default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)"} + ["mcl_core:dirt_with_grass"] = { + "mcl_core_grass_block_top.png^[colorize:green:90", + "default_dirt.png", + "default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)", + "default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)", + "default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)", + "default_dirt.png^(mcl_core_grass_block_side_overlay.png^[colorize:green:90)", + }, } -- List of nodes on which mobs can spawn From 335405f1310d9bc0bcc6d8ef9ccf8ffe618ee3cd Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 15:10:20 +0200 Subject: [PATCH 064/103] [mobs_mc] fix warnings --- mods/ENTITIES/mobs_mc/0_gameconfig.lua | 3 +-- mods/ENTITIES/mobs_mc/2_throwing.lua | 2 +- mods/ENTITIES/mobs_mc/4_heads.lua | 3 ++- mods/ENTITIES/mobs_mc/blaze.lua | 2 +- mods/ENTITIES/mobs_mc/cow+mooshroom.lua | 4 ++-- mods/ENTITIES/mobs_mc/ender_dragon.lua | 13 ++++++------- mods/ENTITIES/mobs_mc/enderman.lua | 4 ++-- mods/ENTITIES/mobs_mc/guardian.lua | 3 +-- mods/ENTITIES/mobs_mc/guardian_elder.lua | 1 - mods/ENTITIES/mobs_mc/horse.lua | 6 +++--- mods/ENTITIES/mobs_mc/iron_golem.lua | 2 +- mods/ENTITIES/mobs_mc/llama.lua | 12 ++++++------ mods/ENTITIES/mobs_mc/ocelot.lua | 2 +- mods/ENTITIES/mobs_mc/parrot.lua | 2 +- mods/ENTITIES/mobs_mc/pig.lua | 4 ++-- mods/ENTITIES/mobs_mc/sheep.lua | 5 ++--- mods/ENTITIES/mobs_mc/silverfish.lua | 1 - mods/ENTITIES/mobs_mc/skeleton+stray.lua | 6 +----- mods/ENTITIES/mobs_mc/vex.lua | 3 +-- mods/ENTITIES/mobs_mc/wither.lua | 3 +-- mods/ENTITIES/mobs_mc/wolf.lua | 4 ++-- 21 files changed, 37 insertions(+), 48 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/0_gameconfig.lua b/mods/ENTITIES/mobs_mc/0_gameconfig.lua index c947e9185..f21d946fe 100644 --- a/mods/ENTITIES/mobs_mc/0_gameconfig.lua +++ b/mods/ENTITIES/mobs_mc/0_gameconfig.lua @@ -83,7 +83,7 @@ mobs_mc.items = { water_source = "default:water_source", water_flowing = "default:water_flowing", river_water_source = "default:river_water_source", - water_flowing = "default:river_water_flowing", + --water_flowing = "default:river_water_flowing", black_dye = "dye:black", poppy = "flowers:rose", dandelion = "flowers:dandelion_yellow", @@ -128,7 +128,6 @@ mobs_mc.items = { nether_portal = "nether:portal", netherrack = "nether:rack", - nether_brick_block = "nether:brick", -- Wool (Minecraft color scheme) wool_white = "wool:white", diff --git a/mods/ENTITIES/mobs_mc/2_throwing.lua b/mods/ENTITIES/mobs_mc/2_throwing.lua index 23ae86d80..6f01ae6e6 100644 --- a/mods/ENTITIES/mobs_mc/2_throwing.lua +++ b/mods/ENTITIES/mobs_mc/2_throwing.lua @@ -6,7 +6,7 @@ -- NOTE: Strings intentionally not marked for translation, other mods already have these items. -- TODO: Remove this file eventually, all items here are already outsourced in other mods. -local S = minetest.get_translator("mobs_mc") +--local S = minetest.get_translator("mobs_mc") --maikerumines throwing code --arrow (weapon) diff --git a/mods/ENTITIES/mobs_mc/4_heads.lua b/mods/ENTITIES/mobs_mc/4_heads.lua index 01b8ee577..2ba0d548b 100644 --- a/mods/ENTITIES/mobs_mc/4_heads.lua +++ b/mods/ENTITIES/mobs_mc/4_heads.lua @@ -3,8 +3,9 @@ -- NOTE: Strings intentionally not marked for translation, other mods already have these items. -- TODO: Remove this file eventually, all items here are already outsourced in other mods. +-- TODO: Add translation. -local S = minetest.get_translator("mobs_mc") +--local S = minetest.get_translator("mobs_mc") -- Heads system diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index 146e8da70..a5e6f2bd3 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -20,7 +20,7 @@ mobs:register_mob("mobs_mc:blaze", { xp_max = 10, tilt_fly = false, hostile = true, - rotate = 270, + --rotate = 270, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.79, 0.3}, rotate = -180, visual = "mesh", diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua index 0d6d31ffe..6100e5899 100644 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua @@ -89,7 +89,7 @@ local cow_def = { --head code has_head = true, head_bone = "head", - + swap_y_with_x = false, reverse_head_yaw = false, @@ -168,7 +168,7 @@ mooshroom_def.on_rightclick = function(self, clicker) pos.y = pos.y + 0.5 minetest.add_item(pos, {name = mobs_mc.items.mushroom_stew}) end - end + end end mobs:register_mob("mobs_mc:mooshroom", mooshroom_def) diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index 2111105d3..d2d040ad2 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -16,7 +16,7 @@ mobs:register_mob("mobs_mc:enderdragon", { shoot_arrow = function(self, pos, dir) -- 2-4 damage per arrow local dmg = math.random(2,4) - mobs.shoot_projectile_handling("mobs_mc:dragon_fireball", pos, dir, self.object:get_yaw(), self.object, nil, dmg) + mobs.shoot_projectile_handling("mobs_mc:dragon_fireball", pos, dir, self.object:get_yaw(), self.object, nil, dmg) end, hp_max = 200, hp_min = 200, @@ -24,7 +24,6 @@ mobs:register_mob("mobs_mc:enderdragon", { xp_max = 500, collisionbox = {-2, 0, -2, 2, 2, 2}, eye_height = 1, - physical = false, visual = "mesh", mesh = "mobs_mc_dragon.b3d", textures = { @@ -60,8 +59,6 @@ mobs:register_mob("mobs_mc:enderdragon", { arrow = "mobs_mc:dragon_fireball", shoot_interval = 0.5, shoot_offset = -1.0, - xp_min = 500, - xp_max = 500, animation = { fly_speed = 8, stand_speed = 8, stand_start = 0, stand_end = 20, @@ -114,8 +111,8 @@ mobs:register_mob("mobs_mc:enderdragon", { fire_resistant = true, }) - -local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false +--TODO: replace this setting by a proper gamerules system +local mobs_griefing = minetest.settings:get_bool("mobs_griefing", true) -- dragon fireball (projectile) mobs:register_arrow("mobs_mc:dragon_fireball", { @@ -143,7 +140,9 @@ mobs:register_arrow("mobs_mc:dragon_fireball", { -- node hit, explode hit_node = function(self, pos, node) --mobs:boom(self, pos, 2) - mcl_explosions.explode(self.object:get_pos(), 2,{ drop_chance = 1.0 }) + if mobs_griefing then + mcl_explosions.explode(self.object:get_pos(), 2, { drop_chance = 1.0 }) + end end }) diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua index 9ebc3d6fa..0b6985711 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mobs_mc/enderman.lua @@ -318,12 +318,12 @@ mobs:register_mob("mobs_mc:enderman", { for n = 1, #objs do local obj = objs[n] if obj then - if minetest.is_player(obj) then + --if minetest.is_player(obj) then -- Warp from players during day. --if (minetest.get_timeofday() * 24000) > 5001 and (minetest.get_timeofday() * 24000) < 19000 then -- self:teleport(nil) --end - else + if not obj:is_player() then local lua = obj:get_luaentity() if lua then if lua.name == "mcl_bows:arrow_entity" or lua.name == "mcl_throwing:snowball_entity" then diff --git a/mods/ENTITIES/mobs_mc/guardian.lua b/mods/ENTITIES/mobs_mc/guardian.lua index 241ac3444..0916010d2 100644 --- a/mods/ENTITIES/mobs_mc/guardian.lua +++ b/mods/ENTITIES/mobs_mc/guardian.lua @@ -13,7 +13,7 @@ mobs:register_mob("mobs_mc:guardian", { xp_min = 10, xp_max = 10, breath_max = -1, - passive = false, + passive = false, attack_type = "punch", pathfinding = 1, view_range = 16, @@ -94,7 +94,6 @@ mobs:register_mob("mobs_mc:guardian", { makes_footstep_sound = false, fly_in = { mobs_mc.items.water_source, mobs_mc.items.river_water_source }, jump = false, - view_range = 16, }) -- Spawning disabled due to size issues diff --git a/mods/ENTITIES/mobs_mc/guardian_elder.lua b/mods/ENTITIES/mobs_mc/guardian_elder.lua index e44796bad..0c871da7a 100644 --- a/mods/ENTITIES/mobs_mc/guardian_elder.lua +++ b/mods/ENTITIES/mobs_mc/guardian_elder.lua @@ -104,7 +104,6 @@ mobs:register_mob("mobs_mc:guardian_elder", { makes_footstep_sound = false, fly_in = { mobs_mc.items.water_source, mobs_mc.items.river_water_source }, jump = false, - view_range = 16, }) -- Spawning disabled due to size issues <- what do you mean? -j4i diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 461c60efd..db23d410b 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -38,9 +38,9 @@ end local can_equip_horse_armor = function(entity_id) return entity_id == "mobs_mc:horse" or entity_id == "mobs_mc:skeleton_horse" or entity_id == "mobs_mc:zombie_horse" end -local can_equip_chest = function(entity_id) +--[[local can_equip_chest = function(entity_id) return entity_id == "mobs_mc:mule" or entity_id == "mobs_mc:donkey" -end +end]] local can_breed = function(entity_id) return entity_id == "mobs_mc:horse" or "mobs_mc:mule" or entity_id == "mobs_mc:donkey" end @@ -314,7 +314,7 @@ local horse = { -- Make sure tamed horse is mature and being clicked by owner only if self.tamed and not self.child and self.owner == clicker:get_player_name() then - local inv = clicker:get_inventory() + --local inv = clicker:get_inventory() -- detatch player already riding horse if self.driver and clicker == self.driver then diff --git a/mods/ENTITIES/mobs_mc/iron_golem.lua b/mods/ENTITIES/mobs_mc/iron_golem.lua index 48e573e13..d68dc157b 100644 --- a/mods/ENTITIES/mobs_mc/iron_golem.lua +++ b/mods/ENTITIES/mobs_mc/iron_golem.lua @@ -18,7 +18,7 @@ mobs:register_mob("mobs_mc:iron_golem", { passive = true, rotate = 270, hp_min = 100, - hp_max = 100, + hp_max = 100, protect = true, neutral = true, breath_max = -1, diff --git a/mods/ENTITIES/mobs_mc/llama.lua b/mods/ENTITIES/mobs_mc/llama.lua index 58f565ec1..9803b582b 100644 --- a/mods/ENTITIES/mobs_mc/llama.lua +++ b/mods/ENTITIES/mobs_mc/llama.lua @@ -35,7 +35,7 @@ mobs:register_mob("mobs_mc:llama", { shoot_arrow = function(self, pos, dir) -- 2-4 damage per arrow local dmg = 1 - mobs.shoot_projectile_handling("mobs_mc:spit", pos, dir, self.object:get_yaw(), self.object, nil, dmg) + mobs.shoot_projectile_handling("mobs_mc:spit", pos, dir, self.object:get_yaw(), self.object, nil, dmg) end, hp_min = 15, hp_max = 30, @@ -146,7 +146,7 @@ mobs:register_mob("mobs_mc:llama", { self.tamed = true self.owner = clicker:get_player_name() return - end + end --ignore other logic --make baby grow faster @@ -307,19 +307,19 @@ mobs:register_arrow("mobs_mc:spit", { tail_distance_divider = 4, hit_player = function(self, player) - if rawget(_G, "armor") and armor.last_damage_types then + --[[if rawget(_G, "armor") and armor.last_damage_types then armor.last_damage_types[player:get_player_name()] = "spit" - end + end]] player:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = self._damage}, }, nil) end, - hit_mob = function(self, mob) + hit_mob = function(self, mob) mob:punch(self.object, 1.0, { full_punch_interval = 1.0, - damage_groups = {fleshy = _damage}, + damage_groups = {fleshy = self._damage}, }, nil) end, diff --git a/mods/ENTITIES/mobs_mc/ocelot.lua b/mods/ENTITIES/mobs_mc/ocelot.lua index e36abec77..933d7aad4 100644 --- a/mods/ENTITIES/mobs_mc/ocelot.lua +++ b/mods/ENTITIES/mobs_mc/ocelot.lua @@ -151,7 +151,7 @@ end mobs:register_mob("mobs_mc:cat", cat) -local base_spawn_chance = 5000 +--local base_spawn_chance = 5000 -- Spawn ocelot --they get the same as the llama because I'm trying to rework so much of this code right now -j4i diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mobs_mc/parrot.lua index de52c6252..88ab54ff5 100644 --- a/mods/ENTITIES/mobs_mc/parrot.lua +++ b/mods/ENTITIES/mobs_mc/parrot.lua @@ -44,7 +44,7 @@ mobs:register_mob("mobs_mc:parrot", { max = 2, looting = "common",}, }, - animation = { + animation = { stand_speed = 50, walk_speed = 50, fly_speed = 50, diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index d7433a092..14c9595b6 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -130,7 +130,7 @@ mobs:register_mob("mobs_mc:pig", { -- Put saddle on pig local item = clicker:get_wielded_item() local wielditem = item - + if item:get_name() == mobs_mc.items.saddle and self.saddle ~= "yes" then self.base_texture = { "blank.png", -- baby @@ -163,7 +163,7 @@ mobs:register_mob("mobs_mc:pig", { end -- Mount or detach player - local name = clicker:get_player_name() + --local name = clicker:get_player_name() if self.driver and clicker == self.driver then -- Detach if already attached mobs.detach(clicker, {x=1, y=0, z=0}) diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index 1527fd6da..7e01a1403 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -79,11 +79,11 @@ mobs:register_mob("mobs_mc:sheep", { makes_footstep_sound = true, walk_velocity = 1, run_velocity = 3, - + --head code has_head = true, head_bone = "head", - + swap_y_with_x = false, reverse_head_yaw = false, @@ -150,7 +150,6 @@ mobs:register_mob("mobs_mc:sheep", { do_custom = function(self, dtime) if not self.initial_color_set then local r = math.random(0,100000) - local textures if r <= 81836 then -- 81.836% self.color = "unicolor_white" diff --git a/mods/ENTITIES/mobs_mc/silverfish.lua b/mods/ENTITIES/mobs_mc/silverfish.lua index 148c4c722..05485bc51 100644 --- a/mods/ENTITIES/mobs_mc/silverfish.lua +++ b/mods/ENTITIES/mobs_mc/silverfish.lua @@ -46,7 +46,6 @@ mobs:register_mob("mobs_mc:silverfish", { view_range = 16, attack_type = "punch", damage = 1, - reach = 1, }) mobs:register_egg("mobs_mc:silverfish", S("Silverfish"), "mobs_mc_spawn_icon_silverfish.png", 0) diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index 37b1fc6dd..e0aaef215 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -31,12 +31,8 @@ local skeleton = { group_attack = true, visual = "mesh", mesh = "mobs_mc_skeleton.b3d", - textures = { { - "mcl_bows_bow_0.png", -- bow - "mobs_mc_skeleton.png", -- skeleton - } }, - --head code + --head code has_head = false, head_bone = "head", diff --git a/mods/ENTITIES/mobs_mc/vex.lua b/mods/ENTITIES/mobs_mc/vex.lua index c23643cda..da162e5bf 100644 --- a/mods/ENTITIES/mobs_mc/vex.lua +++ b/mods/ENTITIES/mobs_mc/vex.lua @@ -15,7 +15,7 @@ mobs:register_mob("mobs_mc:vex", { spawn_class = "hostile", pathfinding = 1, passive = false, - attack_type = "punch", + attack_type = "dogfight", physical = false, hp_min = 14, hp_max = 14, @@ -36,7 +36,6 @@ mobs:register_mob("mobs_mc:vex", { view_range = 16, walk_velocity = 3.2, run_velocity = 5.9, - attack_type = "dogfight", sounds = { -- TODO: random death = "mobs_mc_vex_death", diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 7c9072f43..8bd8f5341 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -26,7 +26,6 @@ mobs:register_mob("mobs_mc:wither", { {"mobs_mc_wither.png"}, }, visual_size = {x=4, y=4}, - makes_footstep_sound = true, view_range = 16, fear_height = 4, walk_velocity = 2, @@ -81,7 +80,7 @@ mobs:register_mob("mobs_mc:wither", { end, }) -local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false +--local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false mobs:register_arrow("mobs_mc:wither_skull", { visual = "sprite", diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua index 89a4b4629..2ce142c33 100644 --- a/mods/ENTITIES/mobs_mc/wolf.lua +++ b/mods/ENTITIES/mobs_mc/wolf.lua @@ -35,7 +35,7 @@ local wolf = { --head code has_head = false, head_bone = "head", - + swap_y_with_x = false, reverse_head_yaw = false, @@ -186,7 +186,7 @@ dog.on_rightclick = function(self, clicker) if is_food(item:get_name()) then -- Feed to increase health local hp = self.health - local hp_add = 0 + local hp_add -- Use eatable group to determine health boost local eatable = minetest.get_item_group(item, "eatable") if eatable > 0 then From b6dd8d5c44db47fd04cadc3ca180e6d8c38f9c39 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 23 May 2021 15:13:44 +0200 Subject: [PATCH 065/103] [mcl_paintings] fix warnings --- mods/ENTITIES/mcl_paintings/init.lua | 20 +++++++++++--------- mods/ENTITIES/mcl_paintings/paintings.lua | 6 +++--- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/mods/ENTITIES/mcl_paintings/init.lua b/mods/ENTITIES/mcl_paintings/init.lua index cb85ee5f8..be210c74c 100644 --- a/mods/ENTITIES/mcl_paintings/init.lua +++ b/mods/ENTITIES/mcl_paintings/init.lua @@ -4,9 +4,11 @@ dofile(minetest.get_modpath(minetest.get_current_modname()).."/paintings.lua") local S = minetest.get_translator("mcl_paintings") +local math = math + local wood = "[combine:16x16:-192,0=mcl_paintings_paintings.png" -local is_protected = function(pos, name) +local function is_protected(pos, name) if minetest.is_protected(pos, name) then minetest.record_protection_violation(pos, name) return true @@ -17,7 +19,7 @@ end -- Check if there's a painting for provided painting size. -- If yes, returns the arguments. -- If not, returns the next smaller available painting. -local shrink_painting = function(x, y) +local function shrink_painting(x, y) if x > 4 or y > 4 then return nil end @@ -43,7 +45,7 @@ local shrink_painting = function(x, y) end end -local get_painting = function(x, y, motive) +local function get_painting(x, y, motive) local painting = mcl_paintings.paintings[y] and mcl_paintings.paintings[y][x] and mcl_paintings.paintings[y][x][motive] if not painting then return nil @@ -53,7 +55,7 @@ local get_painting = function(x, y, motive) return "[combine:"..sx.."x"..sy..":"..px..","..py.."=mcl_paintings_paintings.png" end -local get_random_painting = function(x, y) +local function get_random_painting(x, y) if not mcl_paintings.paintings[y] or not mcl_paintings.paintings[y][x] then return nil end @@ -65,7 +67,7 @@ local get_random_painting = function(x, y) return get_painting(x, y, r), r end -local size_to_minmax = function(size) +--[[local function size_to_minmax(size) local min, max if size == 2 then min = -0.5 @@ -81,13 +83,13 @@ local size_to_minmax = function(size) max = 0.5 end return min, max -end +end]] -local size_to_minmax_entity = function(size) +local function size_to_minmax_entity(size) return -size/2, size/2 end -local set_entity = function(object) +local function set_entity(object) local ent = object:get_luaentity() local wallm = ent._facing local xsize = ent._xsize @@ -169,7 +171,7 @@ minetest.register_entity("mcl_paintings:painting", { on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage) -- Drop as item on punch if puncher and puncher:is_player() then - kname = puncher:get_player_name() + local kname = puncher:get_player_name() local pos = self._pos if not pos then pos = self.object:get_pos() diff --git a/mods/ENTITIES/mcl_paintings/paintings.lua b/mods/ENTITIES/mcl_paintings/paintings.lua index d606306c2..ccf584364 100644 --- a/mods/ENTITIES/mcl_paintings/paintings.lua +++ b/mods/ENTITIES/mcl_paintings/paintings.lua @@ -3,7 +3,7 @@ local TS = 16 -- texture size mcl_paintings.paintings = { [1] = { [1] = { - { cx = 0, cy = 0 }, + { cx = 0, cy = 0 }, { cx = TS, cy = 0 }, { cx = 2*TS, cy = 0 }, { cx = 3*TS, cy = 0 }, @@ -26,7 +26,7 @@ mcl_paintings.paintings = { { cx = 0, cy = 4*TS }, { cx = TS, cy = 4*TS }, }, - [2] = { + [2] = { { cx = 0, cy = 8*TS }, { cx = 2*TS, cy = 8*TS }, { cx = 4*TS, cy = 8*TS }, @@ -35,7 +35,7 @@ mcl_paintings.paintings = { { cx = 10*TS, cy = 8*TS }, }, [3] = 2, - [4] = { + [4] = { { cx = 0, cy = 6*TS }, }, }, From 66f132a645bee3be6913a7ccb0b407b06078462f Mon Sep 17 00:00:00 2001 From: cora Date: Mon, 24 May 2021 12:41:16 +0200 Subject: [PATCH 066/103] fix crash on creeper explosion ( #1755 ) --- .../mcl_mobs/api/mob_functions/movement.lua | 53 ++++++++++--------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua index 9a5fd9ea1..04e3e370c 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -22,7 +22,7 @@ local DEFAULT_CLIMB_SPEED = 3 mobs.stick_in_cobweb = function(self) local current_velocity = self.object:get_velocity() - + local goal_velocity = vector_multiply(vector_normalize(current_velocity), 0.4) goal_velocity.y = -0.5 @@ -38,8 +38,11 @@ end --this is a generic float function mobs.float = function(self) - if self.object:get_acceleration().y ~= 0 then + local acceleration = self.object:get_acceleration() + if acceleration and acceleration.y ~= 0 then self.object:set_acceleration(vector_new(0,0,0)) + else + return end local current_velocity = self.object:get_velocity() @@ -86,10 +89,10 @@ end --[[ - _ _ + _ _ | | | | | | __ _ _ __ __| | -| | / _` | '_ \ / _` | +| | / _` | '_ \ / _` | | |___| (_| | | | | (_| | \_____/\__,_|_| |_|\__,_| ]] @@ -100,7 +103,7 @@ end --internal = lua (self.yaw) --engine = c++ (self.object:get_yaw()) mobs.set_velocity = function(self, v) - + local yaw = (self.yaw or 0) local current_velocity = self.object:get_velocity() @@ -152,7 +155,7 @@ mobs.jump = function(self, velocity) --fallback velocity to allow modularity velocity = velocity or DEFAULT_JUMP_HEIGHT - self.object:add_velocity(vector_new(0,velocity,0)) + self.object:add_velocity(vector_new(0,velocity,0)) end --make mobs fall slowly @@ -188,10 +191,10 @@ end --[[ - _____ _ -/ ___| (_) -\ `--.__ ___ _ __ ___ - `--. \ \ /\ / / | '_ ` _ \ + _____ _ +/ ___| (_) +\ `--.__ ___ _ __ ___ + `--. \ \ /\ / / | '_ ` _ \ /\__/ /\ V V /| | | | | | | \____/ \_/\_/ |_|_| |_| |_| ]]-- @@ -221,7 +224,7 @@ mobs.flop = function(self, velocity) local final_additional_force = vector_multiply(minetest_yaw_to_dir(dir), force) --place in the "flop" velocity to make the mob flop - final_additional_force.y = velocity + final_additional_force.y = velocity self.object:add_velocity(final_additional_force) @@ -235,7 +238,7 @@ end --internal = lua (self.yaw) --engine = c++ (self.object:get_yaw()) mobs.set_swim_velocity = function(self, v) - + local yaw = (self.yaw or 0) local pitch = (self.pitch or 0) @@ -265,14 +268,14 @@ mobs.set_swim_velocity = function(self, v) end --[[ -______ _ -| ___| | -| |_ | |_ _ +______ _ +| ___| | +| |_ | |_ _ | _| | | | | | | | | | |_| | \_| |_|\__, | __/ | - |___/ + |___/ ]]-- -- move mob in facing direction @@ -280,7 +283,7 @@ ______ _ --internal = lua (self.yaw) --engine = c++ (self.object:get_yaw()) mobs.set_fly_velocity = function(self, v) - + local yaw = (self.yaw or 0) local pitch = (self.pitch or 0) @@ -332,14 +335,14 @@ end --[[ - ___ - |_ | - | |_ _ _ __ ___ _ __ - | | | | | '_ ` _ \| '_ \ + ___ + |_ | + | |_ _ _ __ ___ _ __ + | | | | | '_ ` _ \| '_ \ /\__/ / |_| | | | | | | |_) | -\____/ \__,_|_| |_| |_| .__/ - | | - |_| +\____/ \__,_|_| |_| |_| .__/ + | | + |_| ]]-- --special mob jump movement @@ -388,4 +391,4 @@ mobs.swap_auto_step_height_adjust = function(self) elseif y_vel ~= 0 and self.stepheight ~= 0 then self.stepheight = 0 end -end \ No newline at end of file +end From f76b66eec6e596cab2ecaf310c8e2dd6d6820cf1 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 00:37:02 +0200 Subject: [PATCH 067/103] [mcl_mobs] fix some warnings (131 remaining!) --- .luacheckrc | 3 + mods/ENTITIES/mcl_mobs/api/api.lua | 16 +- .../mcl_mobs/api/mob_functions/ai.lua | 221 +++++++----------- .../mcl_mobs/api/mob_functions/animation.lua | 20 +- .../attack_type_instructions.lua | 55 +++-- ...ackup_code_api.lua => backup_code_api.txt} | 74 +++--- .../mcl_mobs/api/mob_functions/breeding.lua | 53 ++--- .../mcl_mobs/api/mob_functions/collision.lua | 15 +- .../api/mob_functions/death_logic.lua | 16 +- .../api/mob_functions/environment.lua | 20 +- .../mcl_mobs/api/mob_functions/head_logic.lua | 176 +++++++------- .../api/mob_functions/interaction.lua | 51 ++-- .../api/mob_functions/mob_effects.lua | 12 +- .../mcl_mobs/api/mob_functions/movement.lua | 87 ++++--- .../mcl_mobs/api/mob_functions/set_up.lua | 10 +- mods/ENTITIES/mcl_mobs/api/mount.lua | 34 +-- mods/ENTITIES/mcl_mobs/api/spawning.lua | 10 +- 17 files changed, 387 insertions(+), 486 deletions(-) rename mods/ENTITIES/mcl_mobs/api/mob_functions/{backup_code_api.lua => backup_code_api.txt} (97%) diff --git a/.luacheckrc b/.luacheckrc index 910d73a11..9d0b8cb2a 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -47,6 +47,9 @@ read_globals = { --GENERAL "default", + --ENTITIES + "cmi", + --HUD "sfinv", "sfinv_buttons", "unified_inventory", "cmsg", "inventory_plus", } \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index d413bae72..878474cf1 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -92,13 +92,13 @@ local node_snowblock = "mcl_core:snowblock" local node_snow = "mcl_core:snow" mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "mcl_core:dirt" -local mod_weather = minetest_get_modpath("mcl_weather") ~= nil -local mod_explosions = minetest_get_modpath("mcl_explosions") ~= nil -local mod_mobspawners = minetest_get_modpath("mcl_mobspawners") ~= nil -local mod_hunger = minetest_get_modpath("mcl_hunger") ~= nil -local mod_worlds = minetest_get_modpath("mcl_worlds") ~= nil -local mod_armor = minetest_get_modpath("mcl_armor") ~= nil -local mod_experience = minetest_get_modpath("mcl_experience") ~= nil +local mod_weather = minetest_get_modpath("mcl_weather") +local mod_explosions = minetest_get_modpath("mcl_explosions") +local mod_mobspawners = minetest_get_modpath("mcl_mobspawners") +local mod_hunger = minetest_get_modpath("mcl_hunger") +local mod_worlds = minetest_get_modpath("mcl_worlds") +local mod_armor = minetest_get_modpath("mcl_armor") +local mod_experience = minetest_get_modpath("mcl_experience") -- random locals I found @@ -743,7 +743,7 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) nametag = string.sub(nametag, 1, MAX_MOB_NAME_LENGTH) end ent.nametag = nametag - update_tag(ent) + --update_tag(ent) end -- if not in creative then take item diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index d75bda6c6..df2ccade2 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -1,12 +1,8 @@ -local math_random = math.random -local math_pi = math.pi -local math_floor = math.floor -local math_round = math.round +local math = math +local vector = vector +local string = string -local vector_multiply = vector.multiply -local vector_add = vector.add -local vector_new = vector.new -local vector_distance = vector.distance +local tonumber = tonumber local minetest_yaw_to_dir = minetest.yaw_to_dir local minetest_get_item_group = minetest.get_item_group @@ -28,16 +24,16 @@ end --a simple helper function for rounding --http://lua-users.org/wiki/SimpleRound -function round2(num, numDecimalPlaces) +local function round2(num, numDecimalPlaces) return tonumber(string.format("%." .. (numDecimalPlaces or 0) .. "f", num)) end --[[ - _ _ + _ _ | | | | | | __ _ _ __ __| | -| | / _` | '_ \ / _` | +| | / _` | '_ \ / _` | | |___| (_| | | | | (_| | \_____/\__,_|_| |_|\__,_| ]]-- @@ -50,24 +46,23 @@ local cliff_check = function(self,dtime) end local pos = self.object:get_pos() - local dir = minetest_yaw_to_dir(self.yaw) + local dir = minetest_yaw_to_dir(self.yaw) local collisionbox = self.object:get_properties().collisionbox local radius = collisionbox[4] + 0.5 - dir = vector_multiply(dir,radius) + dir = vector.multiply(dir,radius) - local free_fall, blocker = minetest_line_of_sight( + local free_fall = minetest_line_of_sight( {x = pos.x + dir.x, y = pos.y, z = pos.z + dir.z}, {x = pos.x + dir.x, y = pos.y - self.fear_height, z = pos.z + dir.z}) return free_fall end - -- state switching logic (stand, walk, run, attacks) local land_state_list_wandering = {"stand", "walk"} -local land_state_switch = function(self, dtime) +local function land_state_switch(self, dtime) --do math before sure not attacking, following, or running away so continue --doing random walking for mobs if all states are not met @@ -93,8 +88,8 @@ local land_state_switch = function(self, dtime) end --ignore everything else if following - if mobs.check_following(self) and - (not self.breed_lookout_timer or (self.breed_lookout_timer and self.breed_lookout_timer == 0)) and + if mobs.check_following(self) and + (not self.breed_lookout_timer or (self.breed_lookout_timer and self.breed_lookout_timer == 0)) and (not self.breed_timer or (self.breed_timer and self.breed_timer == 0)) then self.state = "follow" return @@ -136,7 +131,6 @@ local land_state_execution = function(self,dtime) if not self.object:get_properties() then return end - --timer to time out looking for mate if self.breed_lookout_timer and self.breed_lookout_timer > 0 then @@ -176,12 +170,12 @@ local land_state_execution = function(self,dtime) if velocity.y < 0 then --lua is acting really weird so we have to help it if round2(self.object:get_acceleration().y, 1) == -self.gravity then - self.object:set_acceleration(vector_new(0,0,0)) + self.object:set_acceleration(vector.new(0,0,0)) mobs.mob_fall_slow(self) end else if round2(self.object:get_acceleration().y, 1) == 0 then - self.object:set_acceleration(vector_new(0,-self.gravity,0)) + self.object:set_acceleration(vector.new(0,-self.gravity,0)) end end end @@ -206,15 +200,13 @@ local land_state_execution = function(self,dtime) end mobs.lock_yaw(self) - elseif self.state == "follow" then - + elseif self.state == "follow" then --always look at players mobs.set_yaw_while_following(self) --check distance - local distance_from_follow_person = vector_distance(self.object:get_pos(), self.following_person:get_pos()) + local distance_from_follow_person = vector.distance(self.object:get_pos(), self.following_person:get_pos()) local distance_2d = mobs.get_2d_distance(self.object:get_pos(), self.following_person:get_pos()) - --don't push the player if too close --don't spin around randomly if self.follow_distance < distance_from_follow_person and self.minimum_follow_distance < distance_2d then @@ -240,7 +232,7 @@ local land_state_execution = function(self,dtime) self.walk_timer = math.random(1,6) + math.random() --set the mob into a random direction - self.yaw = (math_random() * (math.pi * 2)) + self.yaw = (math.random() * (math.pi * 2)) end --do animation @@ -253,15 +245,13 @@ local land_state_execution = function(self,dtime) local node_in_front_of = mobs.jump_check(self) if node_in_front_of == 1 then - mobs.jump(self) - - --turn if on the edge of cliff - --(this is written like this because unlike - --jump_check which simply tells the mob to jump - --this requires a mob to turn, removing the - --ease of a full implementation for it in a single - --function) + --turn if on the edge of cliff + --(this is written like this because unlike + --jump_check which simply tells the mob to jump + --this requires a mob to turn, removing the + --ease of a full implementation for it in a single + --function) elseif node_in_front_of == 2 or (self.fear_height ~= 0 and cliff_check(self,dtime)) then --turn 45 degrees if so quick_rotate(self,dtime) @@ -292,9 +282,7 @@ local land_state_execution = function(self,dtime) local node_in_front_of = mobs.jump_check(self) if node_in_front_of == 1 then - mobs.jump(self) - --turn if on the edge of cliff --(this is written like this because unlike --jump_check which simply tells the mob to jump @@ -342,7 +330,7 @@ local land_state_execution = function(self,dtime) mobs.set_velocity(self, self.walk_velocity) --smoosh together basically - if vector_distance(self.object:get_pos(), mate:get_pos()) <= self.breed_distance then + if vector.distance(self.object:get_pos(), mate:get_pos()) <= self.breed_distance then mobs.set_mob_animation(self, "stand") if self.special_breed_timer == 0 then self.special_breed_timer = 2 --breeding takes 2 seconds @@ -353,7 +341,7 @@ local land_state_execution = function(self,dtime) --pop a baby out, it's a miracle! local baby_pos = vector.divide(vector.add(self.object:get_pos(), mate:get_pos()), 2) - local baby_mob = minetest.add_entity(pos, self.name, minetest.serialize({baby = true, grow_up_timer = self.grow_up_goal, bred = true})) + minetest.add_entity(baby_pos, self.name, minetest.serialize({baby = true, grow_up_timer = self.grow_up_goal, bred = true})) mobs.play_sound_specific(self,"item_drop_pickup") @@ -375,14 +363,13 @@ local land_state_execution = function(self,dtime) mobs.set_velocity(self,0) end - end - + end if float_now then mobs.float(self) else local acceleration = self.object:get_acceleration() if acceleration and acceleration.y == 0 then - self.object:set_acceleration(vector_new(0,-self.gravity,0)) + self.object:set_acceleration(vector.new(0,-self.gravity,0)) end end end @@ -391,10 +378,10 @@ end --[[ - _____ _ -/ ___| (_) -\ `--.__ ___ _ __ ___ - `--. \ \ /\ / / | '_ ` _ \ + _____ _ +/ ___| (_) +\ `--.__ ___ _ __ ___ + `--. \ \ /\ / / | '_ ` _ \ /\__/ /\ V V /| | | | | | | \____/ \_/\_/ |_|_| |_| |_| ]]-- @@ -416,16 +403,16 @@ end --check if a mob needs to turn while swimming local swim_turn_check = function(self,dtime) - local pos = self.object:get_pos() - pos.y = pos.y + 0.1 - local dir = minetest_yaw_to_dir(self.yaw) + local pos = self.object:get_pos() + pos.y = pos.y + 0.1 + local dir = minetest_yaw_to_dir(self.yaw) - local collisionbox = self.object:get_properties().collisionbox + local collisionbox = self.object:get_properties().collisionbox local radius = collisionbox[4] + 0.5 - vector_multiply(dir, radius) + vector.multiply(dir, radius) - local test_dir = vector.add(pos,dir) + local test_dir = vector.add(pos,dir) local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 @@ -437,11 +424,11 @@ local swim_physics_swapper = function(self,inside_swim_node) --should be swimming, gravity is applied, switch to floating if inside_swim_node and self.object:get_acceleration().y ~= 0 then - self.object:set_acceleration(vector_new(0,0,0)) + self.object:set_acceleration(vector.new(0,0,0)) --not be swim, gravity isn't applied, switch to falling elseif not inside_swim_node and self.object:get_acceleration().y == 0 then self.pitch = 0 - self.object:set_acceleration(vector_new(0,-self.gravity,0)) + self.object:set_acceleration(vector.new(0,-self.gravity,0)) end end @@ -482,22 +469,17 @@ local swim_state_execution = function(self,dtime) end mobs.lock_yaw(self) - elseif self.state == "swim" then - self.walk_timer = self.walk_timer - dtime - --reset the walk timer if self.walk_timer <= 0 then - --re-randomize the walk timer self.walk_timer = math.random(1,6) + math.random() - --set the mob into a random direction - self.yaw = (math_random() * (math.pi * 2)) + self.yaw = (math.random() * (math.pi * 2)) --create a truly random pitch, since there is no easy access to pitch math that I can find - self.pitch = math_random() * math.random(1,3) * random_pitch_multiplier[math_random(1,2)] + self.pitch = math.random() * math.random(1,3) * random_pitch_multiplier[math.random(1,2)] end --do animation @@ -535,14 +517,14 @@ end --[[ -______ _ -| ___| | -| |_ | |_ _ +______ _ +| ___| | +| |_ | |_ _ | _| | | | | | | | | | |_| | \_| |_|\__, | - __/ | - |___/ + __/ | + |___/ ]]-- -- state switching logic (stand, walk, run, attacks) @@ -566,16 +548,16 @@ end --check if a mob needs to turn while flying local fly_turn_check = function(self,dtime) - local pos = self.object:get_pos() - pos.y = pos.y + 0.1 - local dir = minetest_yaw_to_dir(self.yaw) + local pos = self.object:get_pos() + pos.y = pos.y + 0.1 + local dir = minetest_yaw_to_dir(self.yaw) - local collisionbox = self.object:get_properties().collisionbox + local collisionbox = self.object:get_properties().collisionbox local radius = collisionbox[4] + 0.5 - vector_multiply(dir, radius) + vector.multiply(dir, radius) - local test_dir = vector.add(pos,dir) + local test_dir = vector.add(pos,dir) local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 @@ -587,11 +569,11 @@ local fly_physics_swapper = function(self,inside_fly_node) --should be flyming, gravity is applied, switch to floating if inside_fly_node and self.object:get_acceleration().y ~= 0 then - self.object:set_acceleration(vector_new(0,0,0)) + self.object:set_acceleration(vector.new(0,0,0)) --not be fly, gravity isn't applied, switch to falling elseif not inside_fly_node and self.object:get_acceleration().y == 0 then self.pitch = 0 - self.object:set_acceleration(vector_new(0,-self.gravity,0)) + self.object:set_acceleration(vector.new(0,-self.gravity,0)) end end @@ -635,15 +617,13 @@ local fly_state_execution = function(self,dtime) --reset the walk timer if self.walk_timer <= 0 then - --re-randomize the walk timer self.walk_timer = math.random(1,6) + math.random() - --set the mob into a random direction - self.yaw = (math_random() * (math.pi * 2)) + self.yaw = (math.random() * (math.pi * 2)) --create a truly random pitch, since there is no easy access to pitch math that I can find - self.pitch = math_random() * math.random(1,3) * random_pitch_multiplier[math_random(1,2)] + self.pitch = math.random() * math.random(1,3) * random_pitch_multiplier[math.random(1,2)] end --do animation @@ -663,9 +643,7 @@ local fly_state_execution = function(self,dtime) --enable rotation locking mobs.movement_rotation_lock(self) - elseif self.state == "attack" then - --execute mob attack type --if self.attack_type == "explode" then @@ -697,40 +675,39 @@ end --[[ - ___ - |_ | - | |_ _ _ __ ___ _ __ - | | | | | '_ ` _ \| '_ \ + ___ + |_ | + | |_ _ _ __ ___ _ __ + | | | | | '_ ` _ \| '_ \ /\__/ / |_| | | | | | | |_) | -\____/ \__,_|_| |_| |_| .__/ - | | - |_| +\____/ \__,_|_| |_| |_| .__/ + | | + |_| ]]-- --check if a mob needs to turn while jumping -local jump_turn_check = function(self,dtime) +--[[local function jump_turn_check(self, dtime) + local pos = self.object:get_pos() + pos.y = pos.y + 0.1 + local dir = minetest_yaw_to_dir(self.yaw) - local pos = self.object:get_pos() - pos.y = pos.y + 0.1 - local dir = minetest_yaw_to_dir(self.yaw) - - local collisionbox = self.object:get_properties().collisionbox + local collisionbox = self.object:get_properties().collisionbox local radius = collisionbox[4] + 0.5 - vector_multiply(dir, radius) + vector.multiply(dir, radius) - local test_dir = vector.add(pos,dir) + local test_dir = vector.add(pos,dir) local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 - return(green_flag_1) -end + return green_flag_1 +end]] -- state switching logic (stand, jump, run, attacks) local jump_state_list_wandering = {"stand", "jump"} -local jump_state_switch = function(self, dtime) +local function jump_state_switch(self, dtime) self.state_timer = self.state_timer - dtime if self.state_timer <= 0 then self.state_timer = math.random(4,10) + math.random() @@ -739,8 +716,8 @@ local jump_state_switch = function(self, dtime) end -- states are executed here -local jump_state_execution = function(self,dtime) - +local function jump_state_execution(self, dtime) + local node_in_front_of = mobs.jump_check(self) local pos = self.object:get_pos() local collisionbox = self.object:get_properties().collisionbox --get the center of the mob @@ -775,7 +752,7 @@ local jump_state_execution = function(self,dtime) self.walk_timer = math.random(1,6) + math.random() --set the mob into a random direction - self.yaw = (math_random() * (math.pi * 2)) + self.yaw = (math.random() * (math.pi * 2)) end --do animation @@ -793,15 +770,10 @@ local jump_state_execution = function(self,dtime) mobs.jump_move(self,self.walk_velocity) elseif self.state == "run" then - print("run") - elseif self.state == "attack" then - print("attack") - - end - + end if float_now then mobs.float(self) end @@ -811,14 +783,14 @@ end --[[ -___ ___ _ _ _ -| \/ | (_) | | (_) -| . . | __ _ _ _ __ | | ___ __ _ _ ___ +___ ___ _ _ _ +| \/ | (_) | | (_) +| . . | __ _ _ _ __ | | ___ __ _ _ ___ | |\/| |/ _` | | '_ \ | | / _ \ / _` | |/ __| -| | | | (_| | | | | | | |___| (_) | (_| | | (__ +| | | | (_| | | | | | | |___| (_) | (_| | | (__ \_| |_/\__,_|_|_| |_| \_____/\___/ \__, |_|\___| - __/ | - |___/ + __/ | + |___/ ]]-- --the main loop @@ -859,13 +831,13 @@ mobs.mob_step = function(self, dtime) end --color modifier which coincides with the pause_timer - if self.old_health and self.health < self.old_health then + if self.old_health and self.health < self.old_health then self.object:set_texture_mod("^[colorize:red:120") --fix double death sound if self.health > 0 then mobs.play_sound(self,"damage") end - end + end self.old_health = self.health --do death logic (animation, poof, explosion, etc) @@ -916,7 +888,6 @@ mobs.mob_step = function(self, dtime) elseif self.breath < self.breath_max then self.breath = self.breath + dtime - --clean timer reset if self.breath > self.breath_max then self.breath = self.breath_max @@ -948,10 +919,6 @@ mobs.mob_step = function(self, dtime) end end - - - - --baby grows up if self.baby then --print(self.grow_up_timer) @@ -968,8 +935,6 @@ mobs.mob_step = function(self, dtime) mobs.baby_grow_up(self) end end - - --do custom mob instructions if self.do_custom then @@ -1015,7 +980,7 @@ mobs.mob_step = function(self, dtime) self.memory = self.memory - dtime --get if memory player is within viewing range if self.attacking and self.attacking:is_player() then - local distance = vector_distance(self.object:get_pos(), self.attacking:get_pos()) + local distance = vector.distance(self.object:get_pos(), self.attacking:get_pos()) if distance > self.view_range then self.memory = 0 end @@ -1090,7 +1055,7 @@ mobs.mob_step = function(self, dtime) --jump only (like slimes) if self.jump_only then jump_state_switch(self, dtime) - jump_state_execution(self, dtime) + jump_state_execution(self, dtime) --swimming elseif self.swim then swim_state_switch(self, dtime) @@ -1124,28 +1089,22 @@ mobs.mob_step = function(self, dtime) --overrides absolutely everything --mobs get stuck in cobwebs like players if not self.ignores_cobwebs then - local pos = self.object:get_pos() local node = pos and minetest_get_node(pos).name - if node == "mcl_core:cobweb" then - --fight the rest of the api if self.object:get_acceleration().y ~= 0 then - self.object:set_acceleration(vector_new(0,0,0)) + self.object:set_acceleration(vector.new(0,0,0)) end - mobs.stick_in_cobweb(self) - self.was_stuck_in_cobweb = true - else --do not override other functions if self.was_stuck_in_cobweb == true then --return the mob back to normal self.was_stuck_in_cobweb = nil if self.object:get_acceleration().y == 0 and not self.swim and not self.fly then - self.object:set_acceleration(vector_new(0,-self.gravity,0)) + self.object:set_acceleration(vector.new(0,-self.gravity,0)) end end end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua index c26d33089..8f2ea9e31 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua @@ -1,7 +1,7 @@ -local math_pi = math.pi -local math_floor = math.floor -local math_random = math.random -local HALF_PI = math_pi/2 +local math = math +local vector = vector + +local HALF_PI = math.pi/2 local vector_direction = vector.direction @@ -48,8 +48,7 @@ mobs.set_mob_animation = function(self, anim, fixed_frame) self.animation[anim .. "_speed"] or self.animation.speed_normal or 15, 0, self.animation[anim .. "_loop"] ~= false) - - self.current_animation = anim + self.current_animation = anim end @@ -65,14 +64,14 @@ mobs.death_effect = function(pos, yaw, collisionbox, rotate) max = { x = 0.5, y = 0.5, z = 0.5 } end if rotate then - min = vector.rotate(min, {x=0, y=yaw, z=math_pi/2}) - max = vector.rotate(max, {x=0, y=yaw, z=math_pi/2}) + min = vector.rotate(min, {x=0, y=yaw, z=math.pi/2}) + max = vector.rotate(max, {x=0, y=yaw, z=math.pi/2}) min, max = vector.sort(min, max) min = vector.multiply(min, 0.5) max = vector.multiply(max, 0.5) end - minetest_add_particlespawner({ + minetest.add_particlespawner({ amount = 50, time = 0.001, minpos = vector.add(pos, min), @@ -88,7 +87,7 @@ mobs.death_effect = function(pos, yaw, collisionbox, rotate) texture = "mcl_particles_mob_death.png^[colorize:#000000:255", }) - minetest_sound_play("mcl_mobs_mob_poof", { + minetest.sound_play("mcl_mobs_mob_poof", { pos = pos, gain = 1.0, max_hear_distance = 8, @@ -99,7 +98,6 @@ end --this allows auto facedir rotation while making it so mobs --don't look like wet noodles flopping around mobs.movement_rotation_lock = function(self) - local current_engine_yaw = self.object:get_yaw() local current_lua_yaw = self.yaw diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/attack_type_instructions.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/attack_type_instructions.lua index c973f3d1b..f5d33def4 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/attack_type_instructions.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/attack_type_instructions.lua @@ -1,11 +1,11 @@ local vector_direction = vector.direction -local minetest_dir_to_yaw = minetest.dir_to_yaw +--local minetest_dir_to_yaw = minetest.dir_to_yaw local vector_distance = vector.distance local vector_multiply = vector.multiply local math_random = math.random --[[ - _ _ _ _ + _ _ _ _ | | | | | | | | | | | | __ _ _ __ __| | | | | | | | / _` | '_ \ / _` | | | @@ -16,14 +16,14 @@ local math_random = math.random --[[ - _____ _ _ -| ___| | | | | -| |____ ___ __ | | ___ __| | ___ + _____ _ _ +| ___| | | | | +| |____ ___ __ | | ___ __| | ___ | __\ \/ / '_ \| |/ _ \ / _` |/ _ \ | |___> <| |_) | | (_) | (_| | __/ \____/_/\_\ .__/|_|\___/ \__,_|\___| - | | - |_| + | | + |_| ]]-- mobs.explode_attack_walk = function(self,dtime) @@ -74,7 +74,6 @@ mobs.explode_attack_walk = function(self,dtime) if node_in_front_of == 1 then mobs.jump(self) end - --do biggening explosion thing if self.explosion_animation and self.explosion_animation > self.explosion_timer then @@ -102,10 +101,10 @@ end --[[ -______ _ -| ___ \ | | -| |_/ / _ _ __ ___| |__ -| __/ | | | '_ \ / __| '_ \ +______ _ +| ___ \ | | +| |_/ / _ _ __ ___| |__ +| __/ | | | '_ \ / __| '_ \ | | | |_| | | | | (__| | | | \_| \__,_|_| |_|\___|_| |_| ]]-- @@ -113,7 +112,6 @@ ______ _ mobs.punch_attack_walk = function(self,dtime) - --this needs an exception if self.attacking == nil or not self.attacking:is_player() then self.attacking = nil @@ -187,14 +185,14 @@ end --[[ -______ _ _ _ _ -| ___ \ (_) | | (_) | -| |_/ / __ ___ _ ___ ___| |_ _| | ___ +______ _ _ _ _ +| ___ \ (_) | | (_) | +| |_/ / __ ___ _ ___ ___| |_ _| | ___ | __/ '__/ _ \| |/ _ \/ __| __| | |/ _ \ | | | | | (_) | | __/ (__| |_| | | __/ \_| |_| \___/| |\___|\___|\__|_|_|\___| - _/ | - |__/ + _/ | + |__/ ]]-- @@ -255,40 +253,39 @@ end --[[ - _ ______ _ _ + _ ______ _ _ | | | ___| | | | | | | |_ | |_ _ | | | | | _| | | | | | | | |_| | | | | |_| | |_| (_) \_| |_|\__, | (_) - __/ | - |___/ + __/ | + |___/ ]]-- --[[ -______ _ _ _ _ -| ___ \ (_) | | (_) | -| |_/ / __ ___ _ ___ ___| |_ _| | ___ +______ _ _ _ _ +| ___ \ (_) | | (_) | +| |_/ / __ ___ _ ___ ___| |_ _| | ___ | __/ '__/ _ \| |/ _ \/ __| __| | |/ _ \ | | | | | (_) | | __/ (__| |_| | | __/ \_| |_| \___/| |\___|\___|\__|_|_|\___| - _/ | - |__/ + _/ | + |__/ ]]-- local random_pitch_multiplier = {-1,1} mobs.projectile_attack_fly = function(self, dtime) - --this needs an exception if self.attacking == nil or not self.attacking:is_player() then self.attacking = nil return end - + --this is specifically for random ghast movement if self.fly_random_while_attack then @@ -315,7 +312,7 @@ mobs.projectile_attack_fly = function(self, dtime) local distance_from_attacking = vector_distance(self.object:get_pos(), self.attacking:get_pos()) - if distance_from_attacking >= self.reach then + if distance_from_attacking >= self.reach then mobs.set_pitch_while_attacking(self) mobs.set_fly_velocity(self, self.run_velocity) mobs.set_mob_animation(self,"run") diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.txt similarity index 97% rename from mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua rename to mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.txt index 76c062a40..48233d0b4 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.txt @@ -1,4 +1,7 @@ -local disable_physics = function(object, luaentity, ignore_check, reset_movement) +local math = math +local vector = vector + +local function disable_physics(object, luaentity, ignore_check, reset_movement) if luaentity.physical_state == true or ignore_check == true then luaentity.physical_state = false object:set_properties({ @@ -12,7 +15,7 @@ local disable_physics = function(object, luaentity, ignore_check, reset_movement end ----For Water Flowing: -local enable_physics = function(object, luaentity, ignore_check) +local function enable_physics(object, luaentity, ignore_check) if luaentity.physical_state == false or ignore_check == true then luaentity.physical_state = true object:set_properties({ @@ -272,7 +275,7 @@ local falling = function(self, pos) self.object:set_acceleration({ x = 0, - y = -self.fall_speed / (math_max(1, v.y) ^ 2), + y = -self.fall_speed / (math.max(1, v.y) ^ 2), z = 0 }) end @@ -503,9 +506,9 @@ local follow_flop = function(self) if sdef and sdef.walkable then mob_sound(self, "flop") self.object:set_velocity({ - x = math_random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), + x = math.random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), y = FLOP_HEIGHT, - z = math_random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), + z = math.random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), }) end @@ -987,7 +990,7 @@ local check_for_death = function(self, cause, cmi_cause) item_drop(self, cooked, looting) if mod_experience and ((not self.child) or self.type ~= "animal") and (minetest_get_us_time() - self.xp_timestamp <= 5000000) then - mcl_experience.throw_experience(self.object:get_pos(), math_random(self.xp_min, self.xp_max)) + mcl_experience.throw_experience(self.object:get_pos(), math.random(self.xp_min, self.xp_max)) end end end @@ -1361,7 +1364,7 @@ local do_attack = function(self, player) self.state = "attack" -- TODO: Implement war_cry sound without being annoying - --if math_random(0, 100) < 90 then + --if math.random(0, 100) < 90 then --mob_sound(self, "war_cry", true) --end end @@ -1396,7 +1399,7 @@ local mob_sound = function(self, soundname, is_opinion, fixed_pitch) pitch = base_pitch end -- randomize the pitch a bit - pitch = pitch + math_random(-10, 10) * 0.005 + pitch = pitch + math.random(-10, 10) * 0.005 end minetest_sound_play(sound, { object = self.object, @@ -1699,7 +1702,7 @@ local do_env_damage = function(self) end if drowning then - self.breath = math_max(0, self.breath - 1) + self.breath = math.max(0, self.breath - 1) effect(pos, 2, "bubble.png", nil, nil, 1, nil) if self.breath <= 0 then @@ -2044,7 +2047,7 @@ local breed = function(self) -- Give XP if mod_experience then - mcl_experience.throw_experience(pos, math_random(1, 7)) + mcl_experience.throw_experience(pos, math.random(1, 7)) end -- custom breed function @@ -2061,7 +2064,7 @@ local breed = function(self) -- Use texture of one of the parents - local p = math_random(1, 2) + local p = math.random(1, 2) if p == 1 then ent_c.base_texture = parent1.base_texture else @@ -2091,7 +2094,7 @@ local replace = function(self, pos) or not self.replace_what or self.child == true or self.object:get_velocity().y ~= 0 - or math_random(1, self.replace_rate) > 1 then + or math.random(1, self.replace_rate) > 1 then return end @@ -2099,7 +2102,7 @@ local replace = function(self, pos) if type(self.replace_what[1]) == "table" then - local num = math_random(#self.replace_what) + local num = math.random(#self.replace_what) what = self.replace_what[num][1] or "" with = self.replace_what[num][2] or "" @@ -2163,7 +2166,7 @@ function do_states(self) if self.state == "stand" then - if math_random(1, 4) == 1 then + if math.random(1, 4) == 1 then local lp = nil local s = self.object:get_pos() @@ -2189,7 +2192,7 @@ function do_states(self) if lp.x > s.x then yaw = yaw + math_pi end else - yaw = yaw + math_random(-0.5, 0.5) + yaw = yaw + math.random(-0.5, 0.5) end yaw = set_yaw(self, yaw, 8) @@ -2204,7 +2207,7 @@ function do_states(self) if self.walk_chance ~= 0 and self.facing_fence ~= true - and math_random(1, 100) <= self.walk_chance + and math.random(1, 100) <= self.walk_chance and is_at_cliff_or_danger(self) == false then set_velocity(self, self.walk_velocity) @@ -2254,7 +2257,7 @@ function do_states(self) {x = s.x + 5, y = s.y + 1, z = s.z + 5}, {"group:solid"}) - lp = #lp > 0 and lp[math_random(#lp)] + lp = #lp > 0 and lp[math.random(#lp)] -- did we find land? if lp then @@ -2280,8 +2283,8 @@ function do_states(self) else -- Randomly turn - if math_random(1, 100) <= 30 then - yaw = yaw + math_random(-0.5, 0.5) + if math.random(1, 100) <= 30 then + yaw = yaw + math.random(-0.5, 0.5) yaw = set_yaw(self, yaw, 8) end end @@ -2289,9 +2292,9 @@ function do_states(self) yaw = set_yaw(self, yaw, 8) -- otherwise randomly turn - elseif math_random(1, 100) <= 30 then + elseif math.random(1, 100) <= 30 then - yaw = yaw + math_random(-0.5, 0.5) + yaw = yaw + math.random(-0.5, 0.5) yaw = set_yaw(self, yaw, 8) end @@ -2302,7 +2305,7 @@ function do_states(self) end if self.facing_fence == true or cliff_or_danger - or math_random(1, 100) <= 30 then + or math.random(1, 100) <= 30 then set_velocity(self, 0) self.state = "stand" @@ -2602,7 +2605,7 @@ function do_states(self) self.timer = 0 if self.double_melee_attack - and math_random(1, 2) == 1 then + and math.random(1, 2) == 1 then set_animation(self, "punch2") else set_animation(self, "punch") @@ -2669,7 +2672,7 @@ function do_states(self) if self.shoot_interval and self.timer > self.shoot_interval and not minetest_raycast(p, self.attack:get_pos(), false, false):next() - and math_random(1, 100) <= 60 then + and math.random(1, 100) <= 60 then self.timer = 0 set_animation(self, "shoot") @@ -2759,7 +2762,7 @@ end -- Code to execute before custom on_rightclick handling -local on_rightclick_prefix = function(self, clicker) +local function on_rightclick_prefix(self, clicker) local item = clicker:get_wielded_item() -- Name mob with nametag @@ -2785,17 +2788,17 @@ local on_rightclick_prefix = function(self, clicker) return false end -local create_mob_on_rightclick = function(on_rightclick) +--[[local function create_mob_on_rightclick(on_rightclick) return function(self, clicker) local stop = on_rightclick_prefix(self, clicker) if (not stop) and (on_rightclick) then on_rightclick(self, clicker) end end -end +end]] -- set and return valid yaw -local set_yaw = function(self, yaw, delay, dtime) +local function set_yaw(self, yaw, delay, dtime) if not yaw or yaw ~= yaw then yaw = 0 @@ -2805,7 +2808,7 @@ local set_yaw = function(self, yaw, delay, dtime) if delay == 0 then if self.shaking and dtime then - yaw = yaw + (math_random() * 2 - 1) * 5 * dtime + yaw = yaw + (math.random() * 2 - 1) * 5 * dtime end self.yaw(yaw) update_roll(self) @@ -2825,8 +2828,7 @@ function mobs:yaw(self, yaw, delay, dtime) end -mob_step = function() - +--mob_step = function() --if self.state == "die" then -- print("need custom die stop moving thing") -- return @@ -2901,7 +2903,7 @@ mob_step = function() --end -- mob plays random sound at times - --if math_random(1, 70) == 1 then + --if math.random(1, 70) == 1 then -- mob_sound(self, "random", true) --end @@ -2934,11 +2936,11 @@ mob_step = function() --if is_at_water_danger(self) and self.state ~= "attack" then - -- if math_random(1, 10) <= 6 then + -- if math.random(1, 10) <= 6 then -- set_velocity(self, 0) -- self.state = "stand" -- set_animation(self, "stand") - -- yaw = yaw + math_random(-0.5, 0.5) + -- yaw = yaw + math.random(-0.5, 0.5) -- yaw = set_yaw(self, yaw, 8) -- end --end @@ -2982,7 +2984,7 @@ mob_step = function() mcl_burning.extinguish(self.object) self.object:remove() elseif self.lifetimer <= 10 then - if math_random(10) < 4 then + if math.random(10) < 4 then self.despawn_immediately = true else self.lifetimer = 20 @@ -2991,4 +2993,4 @@ mob_step = function() end ]]-- -end +--end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua index 5dc0b8884..57650a9c9 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua @@ -1,14 +1,13 @@ local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius -local vector_distance = vector.distance +local vector = vector --check to see if someone nearby has some tasty food mobs.check_following = function(self) -- returns true or false - --ignore if not self.follow then self.following_person = nil - return(false) + return false end --hey look, this thing works for passive mobs too! @@ -20,20 +19,20 @@ mobs.check_following = function(self) -- returns true or false --safety check if not stack then self.following_person = nil - return(false) + return false end local item_name = stack:get_name() --all checks have passed, that guy has some good looking food if item_name == self.follow then self.following_person = follower - return(true) + return true end end --everything failed self.following_person = nil - return(false) + return false end --a function which attempts to make mobs enter @@ -42,30 +41,30 @@ mobs.enter_breed_state = function(self,clicker) --do not breed if baby if self.baby then - return(false) + return false end --do not do anything if looking for mate or --if cooling off from breeding if self.breed_lookout_timer > 0 or self.breed_timer > 0 then - return(false) + return false end --if this is caught, that means something has gone --seriously wrong if not clicker or not clicker:is_player() then - return(false) + return false end local stack = clicker:get_wielded_item() --safety check if not stack then - return(false) + return false end local item_name = stack:get_name() --all checks have passed, that guy has some good looking food - if item_name == self.follow then + if item_name == self.follow then if not minetest.is_creative_enabled(clicker:get_player_name()) then stack:take_item() clicker:set_wielded_item(stack) @@ -73,11 +72,11 @@ mobs.enter_breed_state = function(self,clicker) self.breed_lookout_timer = self.breed_lookout_timer_goal self.bred = true mobs.play_sound_specific(self,"mobs_mc_animal_eat_generic") - return(true) + return true end --everything failed - return(false) + return false end @@ -96,23 +95,23 @@ mobs.look_for_mate = function(self) for _,mate in pairs(minetest_get_objects_inside_radius(pos1, radius)) do --look for a breeding mate - if mate and mate:get_luaentity() - and mate:get_luaentity()._cmi_is_mob - and mate:get_luaentity().name == self.name + if mate and mate:get_luaentity() + and mate:get_luaentity()._cmi_is_mob + and mate:get_luaentity().name == self.name and mate:get_luaentity().breed_lookout_timer > 0 and mate:get_luaentity() ~= self then local pos2 = mate:get_pos() - local distance = vector_distance(pos1,pos2) + local distance = vector.distance(pos1,pos2) if distance <= radius then - if line_of_sight then + if minetest.line_of_sight then --must add eye height or stuff breaks randomly because of --seethrough nodes being a blocker (like grass) - if minetest_line_of_sight( - vector_new(pos1.x, pos1.y, pos1.z), - vector_new(pos2.x, pos2.y + mate:get_properties().eye_height, pos2.z) + if minetest.line_of_sight( + vector.new(pos1.x, pos1.y, pos1.z), + vector.new(pos2.x, pos2.y + mate:get_properties().eye_height, pos2.z) ) then mates_detected = mates_detected + 1 mates_in_area[mate] = distance @@ -160,14 +159,14 @@ mobs.make_baby_grow_faster = function(self,clicker) if clicker and clicker:is_player() then local stack = clicker:get_wielded_item() --safety check - if not stack then - return(false) + if not stack then + return false end local item_name = stack:get_name() --all checks have passed, that guy has some good looking food if item_name == self.follow then - self.grow_up_timer = self.grow_up_timer - (self.grow_up_timer * 0.10) --take 10 percent off - diminishing returns + self.grow_up_timer = self.grow_up_timer - (self.grow_up_timer * 0.10) --take 10 percent off - diminishing returns if not minetest.is_creative_enabled(clicker:get_player_name()) then stack:take_item() @@ -175,10 +174,8 @@ mobs.make_baby_grow_faster = function(self,clicker) end mobs.play_sound_specific(self,"mobs_mc_animal_eat_generic") - - return(true) + return true end end - - return(false) + return false end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua index 44f43f20f..ed9aec6cd 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua @@ -8,10 +8,8 @@ local vector_direction = vector.direction local integer_test = {-1,1} mobs.collision = function(self) - local pos = self.object:get_pos() - if not self or not self.object or not self.object:get_luaentity() then return end @@ -20,7 +18,7 @@ mobs.collision = function(self) local collisionbox = self.object:get_properties().collisionbox pos.y = pos.y + collisionbox[2] - + local collision_boundary = collisionbox[4] local radius = collision_boundary @@ -41,7 +39,7 @@ mobs.collision = function(self) for _,object in ipairs(minetest_get_objects_inside_radius(pos, radius*1.25)) do if object and object ~= self.object and (object:is_player() or (object:get_luaentity() and object:get_luaentity()._cmi_is_mob == true and object:get_luaentity().health > 0)) and --don't collide with rider, rider don't collide with thing - (not object:get_attach() or (object:get_attach() and object:get_attach() ~= self.object)) and + (not object:get_attach() or (object:get_attach() and object:get_attach() ~= self.object)) and (not self.object:get_attach() or (self.object:get_attach() and self.object:get_attach() ~= object)) then --stop infinite loop collision_count = collision_count + 1 @@ -52,7 +50,7 @@ mobs.collision = function(self) end local pos2 = object:get_pos() - + local object_collisionbox = object:get_properties().collisionbox pos2.y = pos2.y + object_collisionbox[2] @@ -74,7 +72,7 @@ mobs.collision = function(self) local dir = vector.direction(pos,pos2) dir.y = 0 - + --eliminate mob being stuck in corners if dir.x == 0 and dir.z == 0 then --slightly adjust mob position to prevent equal length @@ -84,7 +82,7 @@ mobs.collision = function(self) end local velocity = dir - + --0.5 is the max force multiplier local force = 0.5 - (0.5 * distance / (collision_boundary + object_collision_boundary)) @@ -104,11 +102,9 @@ mobs.collision = function(self) end end end - self.object:add_velocity(vel1) object:add_velocity(vel2) end - end end end @@ -116,7 +112,6 @@ end --this is used for arrow collisions mobs.arrow_hit = function(self, player) - player:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = self._damage} diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua index 57cb6e4e5..45e46d3db 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua @@ -1,5 +1,5 @@ local minetest_add_item = minetest.add_item -local minetest_sound_play = minetest.sound_play +--local minetest_sound_play = minetest.sound_play local math_pi = math.pi local math_random = math.random @@ -19,7 +19,7 @@ local item_drop = function(self, cooked, looting_level) return end - local obj, item, num + local obj, item local pos = self.object:get_pos() self.drops = self.drops or {} -- nil check @@ -56,8 +56,11 @@ local item_drop = function(self, cooked, looting_level) -- cook items when true if cooked then - local output = minetest_get_craft_result({ - method = "cooking", width = 1, items = {item}}) + local output = minetest.get_craft_result({ + method = "cooking", + width = 1, + items = {item}, + }) if output and output.item and not output.item:is_empty() then item = output.item:get_name() @@ -117,15 +120,10 @@ mobs.death_logic = function(self, dtime) --the final POOF of a mob despawning if self.death_animation_timer >= 1.25 then - item_drop(self,false,1) - mobs.death_effect(self) - mcl_experience.throw_experience(self.object:get_pos(), math_random(self.xp_min, self.xp_max)) - self.object:remove() - return end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua index 7c709c09e..3b204a4bf 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua @@ -1,5 +1,5 @@ local minetest_line_of_sight = minetest.line_of_sight -local minetest_dir_to_yaw = minetest.dir_to_yaw +--local minetest_dir_to_yaw = minetest.dir_to_yaw local minetest_yaw_to_dir = minetest.yaw_to_dir local minetest_get_node = minetest.get_node local minetest_get_item_group = minetest.get_item_group @@ -18,19 +18,16 @@ local table_copy = table.copy local math_abs = math.abs -- default function when mobs are blown up with TNT -local do_tnt = function(obj, damage) - +--[[local function do_tnt(obj, damage) obj.object:punch(obj.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = damage}, }, nil) - return false, true, {} -end +end]] --a fast function to be able to detect only players without using objects_in_radius mobs.detect_closest_player_within_radius = function(self, line_of_sight, radius, object_height_adder) - local pos1 = self.object:get_pos() local players_in_area = {} local winner_player = nil @@ -49,7 +46,7 @@ mobs.detect_closest_player_within_radius = function(self, line_of_sight, radius, --must add eye height or stuff breaks randomly because of --seethrough nodes being a blocker (like grass) if minetest_line_of_sight( - vector_new(pos1.x, pos1.y + object_height_adder, pos1.z), + vector_new(pos1.x, pos1.y + object_height_adder, pos1.z), vector_new(pos2.x, pos2.y + player:get_properties().eye_height, pos2.z) ) then players_detected = players_detected + 1 @@ -108,7 +105,7 @@ mobs.jump_check = function(self,dtime) if green_flag_1 and green_flag_2 then --can jump over node return(1) - elseif green_flag_1 and not green_flag_2 then + elseif green_flag_1 and not green_flag_2 then --wall in front of mob return(2) end @@ -180,15 +177,10 @@ end -- check if within physical map limits (-30911 to 30927) -- within_limits, wmin, wmax = nil, -30913, 30928 mobs.within_limits = function(pos, radius) + local wmin, wmax if mcl_vars then if mcl_vars.mapgen_edge_min and mcl_vars.mapgen_edge_max then wmin, wmax = mcl_vars.mapgen_edge_min, mcl_vars.mapgen_edge_max - within_limits = function(pos, radius) - return pos - and (pos.x - radius) > wmin and (pos.x + radius) < wmax - and (pos.y - radius) > wmin and (pos.y + radius) < wmax - and (pos.z - radius) > wmin and (pos.z + radius) < wmax - end end end return pos diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua index 0fc94ffe6..13bc6584d 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua @@ -1,112 +1,98 @@ -local vector_new = vector.new - +local math = math +local vector = vector --converts yaw to degrees local degrees = function(yaw) return(yaw*180.0/math.pi) end - mobs.do_head_logic = function(self,dtime) - local player = minetest.get_player_by_name("singleplayer") + local player = minetest.get_player_by_name("singleplayer") - local look_at = player:get_pos() - look_at.y = look_at.y + player:get_properties().eye_height + local look_at = player:get_pos() + look_at.y = look_at.y + player:get_properties().eye_height + + local pos = self.object:get_pos() + + local body_yaw = self.object:get_yaw() + + local body_dir = minetest.yaw_to_dir(body_yaw) + + pos.y = pos.y + self.head_height_offset + + local head_offset = vector.multiply(body_dir, self.head_direction_offset) + + pos = vector.add(pos, head_offset) + + minetest.add_particle({ + pos = pos, + velocity = {x=0, y=0, z=0}, + acceleration = {x=0, y=0, z=0}, + expirationtime = 0.2, + size = 1, + texture = "default_dirt.png", + }) + + local bone_pos = vector.new(0,0,0) + + --(horizontal) + bone_pos.y = self.head_bone_pos_y + + --(vertical) + bone_pos.z = self.head_bone_pos_z + + --print(yaw) + + --local _, bone_rot = self.object:get_bone_position("head") + + --bone_rot.x = bone_rot.x + (dtime * 10) + --bone_rot.z = bone_rot.z + (dtime * 10) + + local head_yaw = minetest.dir_to_yaw(vector.direction(pos,look_at)) - body_yaw + + if self.reverse_head_yaw then + head_yaw = head_yaw * -1 + end + + --over rotation protection + --stops radians from going out of spec + if head_yaw > math.pi then + head_yaw = head_yaw - (math.pi * 2) + elseif head_yaw < -math.pi then + head_yaw = head_yaw + (math.pi * 2) + end + local check_failed = false + --upper check + 90 degrees or upper math.radians (3.14/2) + if head_yaw > math.pi - (math.pi/2) then + head_yaw = 0 + check_failed = true + --lower check - 90 degrees or lower negative math.radians (-3.14/2) + elseif head_yaw < -math.pi + (math.pi/2) then + head_yaw = 0 + check_failed = true + end + local head_pitch = 0 - local pos = self.object:get_pos() + --DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG + --head_yaw = 0 + --DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG - local body_yaw = self.object:get_yaw() + if not check_failed then + head_pitch = minetest.dir_to_yaw(vector.new(vector.distance(vector.new(pos.x,0,pos.z),vector.new(look_at.x,0,look_at.z)),0,pos.y-look_at.y))+(math.pi/2) + end - local body_dir = minetest.yaw_to_dir(body_yaw) + if self.head_pitch_modifier then + head_pitch = head_pitch + self.head_pitch_modifier + end - - pos.y = pos.y + self.head_height_offset - - local head_offset = vector.multiply(body_dir, self.head_direction_offset) - - pos = vector.add(pos, head_offset) - - - - - minetest.add_particle({ - pos = pos, - velocity = {x=0, y=0, z=0}, - acceleration = {x=0, y=0, z=0}, - expirationtime = 0.2, - size = 1, - texture = "default_dirt.png", - }) - - - local bone_pos = vector_new(0,0,0) - - - --(horizontal) - bone_pos.y = self.head_bone_pos_y - - --(vertical) - bone_pos.z = self.head_bone_pos_z - - --print(yaw) - - --local _, bone_rot = self.object:get_bone_position("head") - - --bone_rot.x = bone_rot.x + (dtime * 10) - --bone_rot.z = bone_rot.z + (dtime * 10) - - - local head_yaw - head_yaw = minetest.dir_to_yaw(vector.direction(pos,look_at)) - body_yaw - - if self.reverse_head_yaw then - head_yaw = head_yaw * -1 - end - - --over rotation protection - --stops radians from going out of spec - if head_yaw > math.pi then - head_yaw = head_yaw - (math.pi * 2) - elseif head_yaw < -math.pi then - head_yaw = head_yaw + (math.pi * 2) - end - - - local check_failed = false - --upper check + 90 degrees or upper math.radians (3.14/2) - if head_yaw > math.pi - (math.pi/2) then - head_yaw = 0 - check_failed = true - --lower check - 90 degrees or lower negative math.radians (-3.14/2) - elseif head_yaw < -math.pi + (math.pi/2) then - head_yaw = 0 - check_failed = true - end - - local head_pitch = 0 - - --DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG - --head_yaw = 0 - --DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG - - if not check_failed then - head_pitch = minetest.dir_to_yaw(vector.new(vector.distance(vector.new(pos.x,0,pos.z),vector.new(look_at.x,0,look_at.z)),0,pos.y-look_at.y))+(math.pi/2) - end - - if self.head_pitch_modifier then - head_pitch = head_pitch + self.head_pitch_modifier - end - - if self.swap_y_with_x then - self.object:set_bone_position(self.head_bone, bone_pos, vector_new(degrees(head_pitch),degrees(head_yaw),0)) - else - self.object:set_bone_position(self.head_bone, bone_pos, vector_new(degrees(head_pitch),0,degrees(head_yaw))) - end - - - --set_bone_position([bone, position, rotation]) + if self.swap_y_with_x then + self.object:set_bone_position(self.head_bone, bone_pos, vector.new(degrees(head_pitch),degrees(head_yaw),0)) + else + self.object:set_bone_position(self.head_bone, bone_pos, vector.new(degrees(head_pitch),0,degrees(head_yaw))) + end + --set_bone_position([bone, position, rotation]) end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua index 6b23d2fe7..fa5b31210 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua @@ -2,22 +2,19 @@ local minetest_after = minetest.after local minetest_sound_play = minetest.sound_play local minetest_dir_to_yaw = minetest.dir_to_yaw -local math_floor = math.floor -local math_min = math.min -local math_random = math.random - -local vector_direction = vector.direction -local vector_multiply = vector.multiply +local math = math +local vector = vector local MAX_MOB_NAME_LENGTH = 30 +local mod_hunger = minetest.get_modpath("mcl_hunger") + mobs.feed_tame = function(self) return nil end -- Code to execute before custom on_rightclick handling -local on_rightclick_prefix = function(self, clicker) - +local function on_rightclick_prefix(self, clicker) local item = clicker:get_wielded_item() -- Name mob with nametag @@ -60,7 +57,6 @@ end -- deal damage and effects when mob punched mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) - --don't do anything if the mob is already dead if self.health <= 0 then return @@ -94,14 +90,13 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) pos2.y = 0 - local dir = vector_direction(pos2,pos1) + local dir = vector.direction(pos2,pos1) local yaw = minetest_dir_to_yaw(dir) self.yaw = yaw end - -- custom punch function if self.do_punch then -- when false skip going any further @@ -113,23 +108,20 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) --don't do damage until pause timer resets if self.pause_timer > 0 then return - end + end - -- error checking when mod profiling is enabled if not tool_capabilities then minetest.log("warning", "[mobs_mc] Mod profiling enabled, damage not enabled") return end - local is_player = hitter:is_player() - -- punch interval local weapon = hitter:get_wielded_item() - local punch_interval = 1.4 + --local punch_interval = 1.4 -- exhaust attacker if mod_hunger and is_player then @@ -139,7 +131,6 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- calculate mob damage local damage = 0 local armor = self.object:get_armor_groups() or {} - local tmp --calculate damage groups for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do @@ -163,13 +154,13 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- healing if damage <= -1 then - self.health = self.health - math_floor(damage) + self.health = self.health - math.floor(damage) return end - if tool_capabilities then - punch_interval = tool_capabilities.full_punch_interval or 1.4 - end + --if tool_capabilities then + -- punch_interval = tool_capabilities.full_punch_interval or 1.4 + --end -- add weapon wear manually -- Required because we have custom health handling ("health" property) @@ -183,7 +174,7 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) local weapon = hitter:get_wielded_item(player) local def = weapon:get_definition() if def.tool_capabilities and def.tool_capabilities.punch_attack_uses then - local wear = math_floor(65535/tool_capabilities.punch_attack_uses) + local wear = math.floor(65535/tool_capabilities.punch_attack_uses) weapon:add_wear(wear) hitter:set_wielded_item(weapon) end @@ -224,7 +215,7 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) -- knock back effect local velocity = self.object:get_velocity() - + --2d direction local pos1 = self.object:get_pos() pos1.y = 0 @@ -240,9 +231,8 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) up = 0 end - --0.75 for perfect distance to not be too easy, and not be too hard - local multiplier = 0.75 + local multiplier = 0.75 -- check if tool already has specific knockback value local knockback_enchant = mcl_enchanting.get_enchantment(hitter:get_wielded_item(), "knockback") @@ -254,21 +244,16 @@ mobs.mob_punch = function(self, hitter, tflp, tool_capabilities, dir) --it's coming for you if self.hostile then multiplier = multiplier + 2 - end - - dir = vector_multiply(dir,multiplier) - + end + dir = vector.multiply(dir,multiplier) dir.y = up - --add the velocity self.object:add_velocity(dir) - end end --do internal per mob projectile calculations mobs.shoot_projectile = function(self) - local pos1 = self.object:get_pos() --add mob eye height pos1.y = pos1.y + self.eye_height @@ -278,7 +263,7 @@ mobs.shoot_projectile = function(self) pos2.y = pos2.y + self.attacking:get_properties().eye_height --get direction - local dir = vector_direction(pos1,pos2) + local dir = vector.direction(pos1,pos2) --call internal shoot_arrow function self.shoot_arrow(self,pos1,dir) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua index 847315ff1..83df80992 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua @@ -1,9 +1,8 @@ local minetest_add_particlespawner = minetest.add_particlespawner mobs.death_effect = function(self) - local pos = self.object:get_pos() - local yaw = self.object:get_yaw() + --local yaw = self.object:get_yaw() local collisionbox = self.object:get_properties().collisionbox local min, max @@ -33,7 +32,7 @@ end mobs.critical_effect = function(self) local pos = self.object:get_pos() - local yaw = self.object:get_yaw() + --local yaw = self.object:get_yaw() local collisionbox = self.object:get_properties().collisionbox local min, max @@ -62,9 +61,8 @@ end --when feeding a mob mobs.feed_effect = function(self) - local pos = self.object:get_pos() - local yaw = self.object:get_yaw() + --local yaw = self.object:get_yaw() local collisionbox = self.object:get_properties().collisionbox local min, max @@ -94,7 +92,7 @@ end --hearts when tamed mobs.tamed_effect = function(self) local pos = self.object:get_pos() - local yaw = self.object:get_yaw() + --local yaw = self.object:get_yaw() local collisionbox = self.object:get_properties().collisionbox local min, max @@ -124,7 +122,7 @@ end --hearts when breeding mobs.breeding_effect = function(self) local pos = self.object:get_pos() - local yaw = self.object:get_yaw() + --local yaw = self.object:get_yaw() local collisionbox = self.object:get_properties().collisionbox local min, max diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua index 04e3e370c..72612b1eb 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -1,16 +1,10 @@ -local math_pi = math.pi -local math_sin = math.sin -local math_cos = math.cos -local math_random = math.random -local HALF_PI = math_pi / 2 -local DOUBLE_PI = math_pi * 2 +-- localize math functions +local math = math +local HALF_PI = math.pi / 2 +local DOUBLE_PI = math.pi * 2 -- localize vector functions -local vector_new = vector.new -local vector_length = vector.length -local vector_multiply = vector.multiply -local vector_distance = vector.distance -local vector_normalize = vector.normalize +local vector = vector local minetest_yaw_to_dir = minetest.yaw_to_dir local minetest_dir_to_yaw = minetest.dir_to_yaw @@ -19,18 +13,17 @@ local DEFAULT_JUMP_HEIGHT = 5 local DEFAULT_FLOAT_SPEED = 4 local DEFAULT_CLIMB_SPEED = 3 - mobs.stick_in_cobweb = function(self) local current_velocity = self.object:get_velocity() - local goal_velocity = vector_multiply(vector_normalize(current_velocity), 0.4) + local goal_velocity = vector.multiply(vector.normalize(current_velocity), 0.4) goal_velocity.y = -0.5 local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then + if vector.length(new_velocity_addition) >= 0.0001 then self.object:add_velocity(new_velocity_addition) end end @@ -40,7 +33,7 @@ mobs.float = function(self) local acceleration = self.object:get_acceleration() if acceleration and acceleration.y ~= 0 then - self.object:set_acceleration(vector_new(0,0,0)) + self.object:set_acceleration(vector.new(0,0,0)) else return end @@ -59,7 +52,7 @@ mobs.float = function(self) new_velocity_addition.z = 0 --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then + if vector.length(new_velocity_addition) >= 0.0001 then self.object:add_velocity(new_velocity_addition) end end @@ -81,7 +74,7 @@ mobs.climb = function(self) new_velocity_addition.z = 0 --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then + if vector.length(new_velocity_addition) >= 0.0001 then self.object:add_velocity(new_velocity_addition) end end @@ -109,22 +102,22 @@ mobs.set_velocity = function(self, v) local current_velocity = self.object:get_velocity() local goal_velocity = { - x = (math_sin(yaw) * -v), + x = (math.sin(yaw) * -v), y = 0, - z = (math_cos(yaw) * v), + z = (math.cos(yaw) * v), } local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) - if vector_length(new_velocity_addition) > vector_length(goal_velocity) then - vector.multiply(new_velocity_addition, (vector_length(goal_velocity) / vector_length(new_velocity_addition))) + if vector.length(new_velocity_addition) > vector.length(goal_velocity) then + vector.multiply(new_velocity_addition, (vector.length(goal_velocity) / vector.length(new_velocity_addition))) end new_velocity_addition.y = 0 --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then + if vector.length(new_velocity_addition) >= 0.0001 then self.object:add_velocity(new_velocity_addition) end end @@ -139,7 +132,7 @@ mobs.get_velocity = function(self) v.y = 0 if v then - return vector_length(v) + return vector.length(v) end return 0 @@ -155,7 +148,7 @@ mobs.jump = function(self, velocity) --fallback velocity to allow modularity velocity = velocity or DEFAULT_JUMP_HEIGHT - self.object:add_velocity(vector_new(0,velocity,0)) + self.object:add_velocity(vector.new(0,velocity,0)) end --make mobs fall slowly @@ -175,15 +168,15 @@ mobs.mob_fall_slow = function(self) new_velocity_addition.x = 0 new_velocity_addition.z = 0 - if vector_length(new_velocity_addition) > vector_length(goal_velocity) then - vector.multiply(new_velocity_addition, (vector_length(goal_velocity) / vector_length(new_velocity_addition))) + if vector.length(new_velocity_addition) > vector.length(goal_velocity) then + vector.multiply(new_velocity_addition, (vector.length(goal_velocity) / vector.length(new_velocity_addition))) end new_velocity_addition.x = 0 new_velocity_addition.z = 0 --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then + if vector.length(new_velocity_addition) >= 0.0001 then self.object:add_velocity(new_velocity_addition) end @@ -215,13 +208,13 @@ mobs.flop = function(self, velocity) velocity = velocity or DEFAULT_JUMP_HEIGHT --create a random direction (2d yaw) - local dir = DOUBLE_PI * math_random() + local dir = DOUBLE_PI * math.random() --create a random force value - local force = math_random(0,3) + math_random() + local force = math.random(0,3) + math.random() --convert the yaw to a direction vector then multiply it times the force - local final_additional_force = vector_multiply(minetest_yaw_to_dir(dir), force) + local final_additional_force = vector.multiply(minetest_yaw_to_dir(dir), force) --place in the "flop" velocity to make the mob flop final_additional_force.y = velocity @@ -249,20 +242,20 @@ mobs.set_swim_velocity = function(self, v) local current_velocity = self.object:get_velocity() local goal_velocity = { - x = (math_sin(yaw) * -v), + x = (math.sin(yaw) * -v), y = pitch, - z = (math_cos(yaw) * v), + z = (math.cos(yaw) * v), } local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) - if vector_length(new_velocity_addition) > vector_length(goal_velocity) then - vector.multiply(new_velocity_addition, (vector_length(goal_velocity) / vector_length(new_velocity_addition))) + if vector.length(new_velocity_addition) > vector.length(goal_velocity) then + vector.multiply(new_velocity_addition, (vector.length(goal_velocity) / vector.length(new_velocity_addition))) end --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then + if vector.length(new_velocity_addition) >= 0.0001 then self.object:add_velocity(new_velocity_addition) end end @@ -294,20 +287,20 @@ mobs.set_fly_velocity = function(self, v) local current_velocity = self.object:get_velocity() local goal_velocity = { - x = (math_sin(yaw) * -v), + x = (math.sin(yaw) * -v), y = pitch, - z = (math_cos(yaw) * v), + z = (math.cos(yaw) * v), } local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) - if vector_length(new_velocity_addition) > vector_length(goal_velocity) then - vector.multiply(new_velocity_addition, (vector_length(goal_velocity) / vector_length(new_velocity_addition))) + if vector.length(new_velocity_addition) > vector.length(goal_velocity) then + vector.multiply(new_velocity_addition, (vector.length(goal_velocity) / vector.length(new_velocity_addition))) end --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then + if vector.length(new_velocity_addition) >= 0.0001 then self.object:add_velocity(new_velocity_addition) end end @@ -319,7 +312,7 @@ mobs.calculate_pitch = function(pos1, pos2) return false end - return(minetest_dir_to_yaw(vector_new(vector_distance(vector_new(pos1.x,0,pos1.z),vector_new(pos2.x,0,pos2.z)),0,pos1.y - pos2.y)) + HALF_PI) + return(minetest_dir_to_yaw(vector.new(vector.distance(vector.new(pos1.x,0,pos1.z),vector.new(pos2.x,0,pos2.z)),0,pos1.y - pos2.y)) + HALF_PI) end --make mobs fly up or down based on their y difference @@ -356,27 +349,27 @@ mobs.jump_move = function(self, velocity) mobs.set_velocity(self,0) --fallback velocity to allow modularity - jump_height = DEFAULT_JUMP_HEIGHT + local jump_height = DEFAULT_JUMP_HEIGHT local yaw = (self.yaw or 0) local current_velocity = self.object:get_velocity() local goal_velocity = { - x = (math_sin(yaw) * -velocity), + x = (math.sin(yaw) * -velocity), y = jump_height, - z = (math_cos(yaw) * velocity), + z = (math.cos(yaw) * velocity), } local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) - if vector_length(new_velocity_addition) > vector_length(goal_velocity) then - vector.multiply(new_velocity_addition, (vector_length(goal_velocity) / vector_length(new_velocity_addition))) + if vector.length(new_velocity_addition) > vector.length(goal_velocity) then + vector.multiply(new_velocity_addition, (vector.length(goal_velocity) / vector.length(new_velocity_addition))) end --smooths out mobs a bit - if vector_length(new_velocity_addition) >= 0.0001 then + if vector.length(new_velocity_addition) >= 0.0001 then self.object:add_velocity(new_velocity_addition) end end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua index dfef98ee8..65ba764f6 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua @@ -1,10 +1,12 @@ local math_random = math.random -local minetest_settings = minetest.settings +local minetest_settings = minetest.settings + +-- CMI support check +local use_cmi = minetest.global_exists("cmi") -- get entity staticdata mobs.mob_staticdata = function(self) - --despawn mechanism --don't despawned tamed or bred mobs if not self.tamed and not self.bred then @@ -142,8 +144,6 @@ mobs.mob_activate = function(self, staticdata, def, dtime) self.health = math_random (self.hp_min, self.hp_max) end - - if not self.random_sound_timer then self.random_sound_timer = math_random(self.random_sound_timer_min,self.random_sound_timer_max) end @@ -185,7 +185,6 @@ mobs.mob_activate = function(self, staticdata, def, dtime) self.opinion_sound_cooloff = 0 -- used to prevent sound spam of particular sound types self.texture_mods = {} - self.v_start = false self.timer = 0 @@ -199,7 +198,6 @@ mobs.mob_activate = function(self, staticdata, def, dtime) else self.object:set_texture_mod("") end - -- set anything changed above self.object:set_properties(self) diff --git a/mods/ENTITIES/mcl_mobs/api/mount.lua b/mods/ENTITIES/mcl_mobs/api/mount.lua index 8ee45f299..0ed54a46e 100644 --- a/mods/ENTITIES/mcl_mobs/api/mount.lua +++ b/mods/ENTITIES/mcl_mobs/api/mount.lua @@ -1,8 +1,11 @@ -- lib_mount by Blert2112 (edited by TenPlus1) -local enable_crash = false -local crash_threshold = 6.5 -- ignored if enable_crash=false +--local enable_crash = false +--local crash_threshold = 6.5 -- ignored if enable_crash=false + +local math = math +local vector = vector ------------------------------------------------------------------------------ @@ -10,7 +13,7 @@ local crash_threshold = 6.5 -- ignored if enable_crash=false -- Helper functions -- -local node_ok = function(pos, fallback) +--[[local function node_ok(pos, fallback) fallback = fallback or mobs.fallback_node @@ -21,10 +24,10 @@ local node_ok = function(pos, fallback) end return {name = fallback} -end +end]] -local function node_is(pos) +--[[local function node_is(pos) local node = node_ok(pos) @@ -45,7 +48,7 @@ local function node_is(pos) end return "other" -end +end]] local function get_sign(i) @@ -60,13 +63,11 @@ local function get_sign(i) end -local function get_velocity(v, yaw, y) - +--[[local function get_velocity(v, yaw, y) local x = -math.sin(yaw) * v local z = math.cos(yaw) * v - return {x = x, y = y, z = z} -end +end]] local function get_v(v) @@ -172,7 +173,7 @@ function mobs.detach(player, offset) --pos = {x = pos.x + offset.x, y = pos.y + 0.2 + offset.y, z = pos.z + offset.z} - player:add_velocity(vector.new(math.random(-6,6),math.random(5,8),math.random(-6,6))) --throw the rider off + player:add_velocity(vector.new(math.random(-6,6), math.random(5,8), math.random(-6,6))) --throw the rider off --[[ minetest.after(0.1, function(name, pos) @@ -187,13 +188,13 @@ end function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) - local rot_view = 0 + --local rot_view = 0 - if entity.player_rotation.y == 90 then - rot_view = math.pi/2 - end + --if entity.player_rotation.y == 90 then + -- rot_view = math.pi/2 + --end - local acce_y = 0 + --local acce_y = 0 local velo = entity.object:get_velocity() entity.v = get_v(velo) * get_sign(entity.v) @@ -388,7 +389,6 @@ end -- directional flying routine by D00Med (edited by TenPlus1) function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) - if true then print("succ") return diff --git a/mods/ENTITIES/mcl_mobs/api/spawning.lua b/mods/ENTITIES/mcl_mobs/api/spawning.lua index ca4dc1e4f..08b161527 100644 --- a/mods/ENTITIES/mcl_mobs/api/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/api/spawning.lua @@ -9,9 +9,9 @@ local get_objects_inside_radius = minetest.get_objects_inside_radius local math_random = math.random local math_floor = math.floor -local max = math.max +--local max = math.max -local vector_distance = vector.distance +--local vector_distance = vector.distance local vector_new = vector.new local vector_floor = vector.floor @@ -573,10 +573,10 @@ if mobs_spawn then local spawning_position = spawning_position_list[math_random(1,#spawning_position_list)] --Prevent strange behavior --- this is commented out: /too close to player --fixed with inner circle - if not spawning_position then -- or vector_distance(player_pos, spawning_position) < 15 + if not spawning_position then -- or vector_distance(player_pos, spawning_position) < 15 break end - + --hard code mob limit in area to 5 for now if count_mobs(spawning_position) >= 5 then break @@ -606,7 +606,7 @@ if mobs_spawn then local is_lava = get_item_group(gotten_node, "lava") ~= 0 local mob_def = nil - + --create a disconnected clone of the spawn dictionary --prevents memory leak local mob_library_worker_table = table_copy(spawn_dictionary) From 8286fd2a4dc5efb81e58fd38d0770344c9ec76ed Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 00:43:08 +0200 Subject: [PATCH 068/103] [mcl_minecarts] fix warnings --- mods/ENTITIES/mcl_minecarts/init.lua | 46 +++++++++++++--------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index 70bf16477..e741fb0bc 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -486,7 +486,6 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o if update.pos then self.object:set_pos(pos) end - update = nil end function cart:get_staticdata() @@ -817,31 +816,30 @@ minetest.register_craft({ }) -- TODO: Re-enable crafting of special minecarts when they have been implemented -if false then - minetest.register_craft({ - output = "mcl_minecarts:furnace_minecart", - recipe = { - {"mcl_furnaces:furnace"}, - {"mcl_minecarts:minecart"}, - }, - }) +--[[minetest.register_craft({ + output = "mcl_minecarts:furnace_minecart", + recipe = { + {"mcl_furnaces:furnace"}, + {"mcl_minecarts:minecart"}, + }, +}) - minetest.register_craft({ - output = "mcl_minecarts:hopper_minecart", - recipe = { - {"mcl_hoppers:hopper"}, - {"mcl_minecarts:minecart"}, - }, - }) +minetest.register_craft({ + output = "mcl_minecarts:hopper_minecart", + recipe = { + {"mcl_hoppers:hopper"}, + {"mcl_minecarts:minecart"}, + }, +}) + +minetest.register_craft({ + output = "mcl_minecarts:chest_minecart", + recipe = { + {"mcl_chests:chest"}, + {"mcl_minecarts:minecart"}, + }, +})]] - minetest.register_craft({ - output = "mcl_minecarts:chest_minecart", - recipe = { - {"mcl_chests:chest"}, - {"mcl_minecarts:minecart"}, - }, - }) -end if has_mcl_wip then mcl_wip.register_wip_item("mcl_minecarts:chest_minecart") From fddaacdeaea953d7cf73a73214dd4329325e5cc3 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 00:43:42 +0200 Subject: [PATCH 069/103] [mcl_item_entity] fix warnings --- mods/ENTITIES/mcl_item_entity/init.lua | 4 ---- mods/ENTITIES/mcl_minecarts/functions.lua | 23 ++++++++++------------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 895bfc892..0c26c38c8 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -426,13 +426,9 @@ minetest.register_entity(":__builtin:item", { if itemtable then itemname = stack:to_table().name end - local item_texture = nil - local item_type = "" local glow local def = minetest.registered_items[itemname] if def then - item_texture = def.inventory_image - item_type = def.type description = def.description glow = def.light_source end diff --git a/mods/ENTITIES/mcl_minecarts/functions.lua b/mods/ENTITIES/mcl_minecarts/functions.lua index 42cdecd12..2f0dfe0ae 100644 --- a/mods/ENTITIES/mcl_minecarts/functions.lua +++ b/mods/ENTITIES/mcl_minecarts/functions.lua @@ -1,3 +1,5 @@ +local vector = vector + function mcl_minecarts:get_sign(z) if z == 0 then return 0 @@ -38,11 +40,9 @@ end function mcl_minecarts:check_front_up_down(pos, dir_, check_down, railtype) local dir = vector.new(dir_) - local cur = nil - -- Front dir.y = 0 - cur = vector.add(pos, dir) + local cur = vector.add(pos, dir) if mcl_minecarts:is_rail(cur, railtype) then return dir end @@ -65,9 +65,9 @@ end function mcl_minecarts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) local pos = vector.round(pos_) - local cur = nil + local cur local left_check, right_check = true, true - + -- Check left and right local left = {x=0, y=0, z=0} local right = {x=0, y=0, z=0} @@ -78,7 +78,7 @@ function mcl_minecarts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) left.z = dir.x right.z = -dir.x end - + if ctrl then if old_switch == 1 then left_check = false @@ -100,13 +100,13 @@ function mcl_minecarts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) right_check = true end end - + -- Normal cur = mcl_minecarts:check_front_up_down(pos, dir, true, railtype) if cur then return cur end - + -- Left, if not already checked if left_check then cur = mcl_minecarts:check_front_up_down(pos, left, false, railtype) @@ -114,7 +114,7 @@ function mcl_minecarts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) return cur end end - + -- Right, if not already checked if right_check then cur = mcl_minecarts:check_front_up_down(pos, right, false, railtype) @@ -122,7 +122,6 @@ function mcl_minecarts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) return cur end end - -- Backwards if not old_switch then cur = mcl_minecarts:check_front_up_down(pos, { @@ -134,7 +133,5 @@ function mcl_minecarts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) return cur end end - return {x=0, y=0, z=0} -end - +end \ No newline at end of file From dd3b5a98ae36bbdffec0d846e44a9ce72643abfe Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 00:46:39 +0200 Subject: [PATCH 070/103] [mcl_falling_nodes] fix warnings --- mods/ENTITIES/mcl_falling_nodes/init.lua | 22 +++++-------------- .../locale/mcl_falling_nodes.de.tr | 3 --- .../locale/mcl_falling_nodes.es.tr | 3 --- .../locale/mcl_falling_nodes.fr.tr | 3 --- .../locale/mcl_falling_nodes.ru.tr | 3 --- .../mcl_falling_nodes/locale/template.txt | 3 --- 6 files changed, 6 insertions(+), 31 deletions(-) delete mode 100644 mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr delete mode 100644 mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.es.tr delete mode 100644 mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.fr.tr delete mode 100644 mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.ru.tr delete mode 100644 mods/ENTITIES/mcl_falling_nodes/locale/template.txt diff --git a/mods/ENTITIES/mcl_falling_nodes/init.lua b/mods/ENTITIES/mcl_falling_nodes/init.lua index af2c06703..01681a159 100644 --- a/mods/ENTITIES/mcl_falling_nodes/init.lua +++ b/mods/ENTITIES/mcl_falling_nodes/init.lua @@ -1,7 +1,4 @@ -local S = minetest.get_translator("mcl_falling_nodes") -local has_mcl_armor = minetest.get_modpath("mcl_armor") - -local get_falling_depth = function(self) +local function get_falling_depth(self) if not self._startpos then -- Fallback self._startpos = self.object:get_pos() @@ -9,7 +6,7 @@ local get_falling_depth = function(self) return self._startpos.y - vector.round(self.object:get_pos()).y end -local deal_falling_damage = function(self, dtime) +local function deal_falling_damage(self, dtime) if minetest.get_item_group(self.node.name, "falling_node_damage") == 0 then return end @@ -38,7 +35,7 @@ local deal_falling_damage = function(self, dtime) inv:set_stack("armor", 2, helmet) end end - local deathmsg, dmg_type + local dmg_type if minetest.get_item_group(self.node.name, "anvil") ~= 0 then dmg_type = "anvil" else @@ -60,10 +57,8 @@ minetest.register_entity(":__builtin:falling_node", { collide_with_objects = false, collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, }, - node = {}, meta = {}, - set_node = function(self, node, meta) local def = minetest.registered_nodes[node.name] -- Change falling node if definition tells us to @@ -90,7 +85,6 @@ minetest.register_entity(":__builtin:falling_node", { glow = glow, }) end, - get_staticdata = function(self) local meta = self.meta -- Workaround: Save inventory seperately from metadata. @@ -111,7 +105,6 @@ minetest.register_entity(":__builtin:falling_node", { } return minetest.serialize(ds) end, - on_activate = function(self, staticdata) self.object:set_armor_groups({immortal = 1}) @@ -134,7 +127,6 @@ minetest.register_entity(":__builtin:falling_node", { end self._startpos = vector.round(self._startpos) end, - on_step = function(self, dtime) -- Set gravity local acceleration = self.object:get_acceleration() @@ -186,10 +178,9 @@ minetest.register_entity(":__builtin:falling_node", { return end local nd = minetest.registered_nodes[n2.name] - if n2.name == "mcl_portals:portal_end" then - -- TODO: Teleport falling node. - - elseif (nd and nd.buildable_to == true) or minetest.get_item_group(self.node.name, "crush_after_fall") ~= 0 then + --if n2.name == "mcl_portals:portal_end" then + -- TODO: Teleport falling node. + if (nd and nd.buildable_to == true) or minetest.get_item_group(self.node.name, "crush_after_fall") ~= 0 then -- Replace destination node if it's buildable to minetest.remove_node(np) -- Run script hook @@ -256,7 +247,6 @@ minetest.register_entity(":__builtin:falling_node", { self.object:set_pos(npos) end end - deal_falling_damage(self, dtime) end }) diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr deleted file mode 100644 index 71dfa4be9..000000000 --- a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.de.tr +++ /dev/null @@ -1,3 +0,0 @@ -# textdomain: mcl_falling_nodes -@1 was smashed by a falling anvil.=@1 wurde von einem fallenden Amboss zerschmettert. -@1 was smashed by a falling block.=@1 wurde von einem fallenden Block zerschmettert. diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.es.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.es.tr deleted file mode 100644 index 41cbf61b4..000000000 --- a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.es.tr +++ /dev/null @@ -1,3 +0,0 @@ -# textdomain: mcl_falling_nodes -@1 was smashed by a falling anvil.=@1 fue aplastado por la caída de un yunque. -@1 was smashed by a falling block.=@1 fue aplastado por la caída de un bloque. diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.fr.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.fr.tr deleted file mode 100644 index 781cd7048..000000000 --- a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.fr.tr +++ /dev/null @@ -1,3 +0,0 @@ -# textdomain: mcl_falling_nodes -@1 was smashed by a falling anvil.=@1 a été écrasé par une enclume qui tombait. -@1 was smashed by a falling block.=@1 a été écrasé par un bloc qui tombait. diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.ru.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.ru.tr deleted file mode 100644 index 6c8b9375a..000000000 --- a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.ru.tr +++ /dev/null @@ -1,3 +0,0 @@ -# textdomain: mcl_falling_nodes -@1 was smashed by a falling anvil.=@1 придавило падающей наковальней. -@1 was smashed by a falling block.=@1 раздавило падающим блоком. diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/template.txt b/mods/ENTITIES/mcl_falling_nodes/locale/template.txt deleted file mode 100644 index 4adabaf01..000000000 --- a/mods/ENTITIES/mcl_falling_nodes/locale/template.txt +++ /dev/null @@ -1,3 +0,0 @@ -# textdomain: mcl_falling_nodes -@1 was smashed by a falling anvil.= -@1 was smashed by a falling block.= From ad16fe70726807ff5c5cbcc9a8ba8bd28c8d137d Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 00:48:46 +0200 Subject: [PATCH 071/103] [mcl_burning] fix warnings --- mods/ENTITIES/mcl_burning/api.lua | 4 +--- mods/ENTITIES/mcl_burning/init.lua | 6 +----- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/mods/ENTITIES/mcl_burning/api.lua b/mods/ENTITIES/mcl_burning/api.lua index 78814a2c7..4cb19cca1 100644 --- a/mods/ENTITIES/mcl_burning/api.lua +++ b/mods/ENTITIES/mcl_burning/api.lua @@ -1,5 +1,3 @@ -local S = minetest.get_translator("mcl_burning") - function mcl_burning.get_storage(obj) return obj:is_player() and mcl_burning.storage[obj] or obj:get_luaentity() end @@ -145,4 +143,4 @@ function mcl_burning.tick(obj, dtime, storage) end end end -end +end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_burning/init.lua b/mods/ENTITIES/mcl_burning/init.lua index e1943e1bc..5cf0d85fe 100644 --- a/mods/ENTITIES/mcl_burning/init.lua +++ b/mods/ENTITIES/mcl_burning/init.lua @@ -1,5 +1,4 @@ -local S = minetest.get_translator("mcl_burning") -local modpath = minetest.get_modpath("mcl_burning") +local modpath = minetest.get_modpath(minetest.get_current_modname()) mcl_burning = { storage = {}, @@ -56,7 +55,6 @@ minetest.register_on_leaveplayer(function(player) local storage = mcl_burning.storage[player] storage.fire_hud_id = nil player:get_meta():set_string("mcl_burning:data", minetest.serialize(storage)) - mcl_burning.storage[player] = nil end) @@ -70,10 +68,8 @@ minetest.register_entity("mcl_burning:fire", { glow = -1, backface_culling = false, }, - animation_frame = 0, animation_timer = 0, - on_step = function(self, dtime) local parent, storage = self:sanity_check() From be9fff4fe25d15c642f62027fc64f02b2db78f5a Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 00:50:04 +0200 Subject: [PATCH 072/103] [mcl_boats] fix warnings --- mods/ENTITIES/mcl_boats/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index 5facec28a..8c187617c 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -328,10 +328,10 @@ function boat.on_step(self, dtime, moveresult) p.y = p.y - boat_y_offset local new_velo - local new_acce = {x = 0, y = 0, z = 0} + local new_acce if not is_water(p) and not on_ice then -- Not on water or inside water: Free fall - local nodedef = minetest.registered_nodes[minetest.get_node(p).name] + --local nodedef = minetest.registered_nodes[minetest.get_node(p).name] new_acce = {x = 0, y = -9.8, z = 0} new_velo = get_velocity(self._v, self.object:get_yaw(), self.object:get_velocity().y) From 0d13e1ffdd2169730427865fc4b3fc0df90eadf4 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 00:54:12 +0200 Subject: [PATCH 073/103] [drippingwater] fix warnings --- mods/ENTITIES/drippingwater/init.lua | 85 ++++++++++++---------------- 1 file changed, 37 insertions(+), 48 deletions(-) diff --git a/mods/ENTITIES/drippingwater/init.lua b/mods/ENTITIES/drippingwater/init.lua index 730cb7b77..e17bdda40 100644 --- a/mods/ENTITIES/drippingwater/init.lua +++ b/mods/ENTITIES/drippingwater/init.lua @@ -1,6 +1,8 @@ --Dripping Water Mod --by kddekadenz +local math = math + -- License of code, textures & sounds: CC0 --Drop entities @@ -20,26 +22,21 @@ minetest.register_entity("drippingwater:drop_water", { spritediv = {x=1, y=1}, initial_sprite_basepos = {x=0, y=0}, static_save = false, - on_activate = function(self, staticdata) self.object:set_sprite({x=0,y=0}, 1, 1, true) end, - on_step = function(self, dtime) - local k = math.random(1,222) - local ownpos = self.object:get_pos() - - if k==1 then - self.object:set_acceleration({x=0, y=-5, z=0}) - end - - if minetest.get_node({x=ownpos.x, y=ownpos.y +0.5, z=ownpos.z}).name == "air" then - self.object:set_acceleration({x=0, y=-5, z=0}) - end - + local k = math.random(1,222) + local ownpos = self.object:get_pos() + if k==1 then + self.object:set_acceleration({x=0, y=-5, z=0}) + end + if minetest.get_node({x=ownpos.x, y=ownpos.y +0.5, z=ownpos.z}).name == "air" then + self.object:set_acceleration({x=0, y=-5, z=0}) + end if minetest.get_node({x=ownpos.x, y=ownpos.y -0.5, z=ownpos.z}).name ~= "air" then - self.object:remove() - minetest.sound_play({name="drippingwater_drip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) + self.object:remove() + minetest.sound_play({name="drippingwater_drip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) end end, }) @@ -61,27 +58,21 @@ minetest.register_entity("drippingwater:drop_lava", { spritediv = {x=1, y=1}, initial_sprite_basepos = {x=0, y=0}, static_save = false, - on_activate = function(self, staticdata) self.object:set_sprite({x=0,y=0}, 1, 0, true) end, - on_step = function(self, dtime) - local k = math.random(1,222) - local ownpos = self.object:get_pos() - - if k==1 then - self.object:set_acceleration({x=0, y=-5, z=0}) - end - - if minetest.get_node({x=ownpos.x, y=ownpos.y +0.5, z=ownpos.z}).name == "air" then - self.object:set_acceleration({x=0, y=-5, z=0}) - end - - + local k = math.random(1,222) + local ownpos = self.object:get_pos() + if k == 1 then + self.object:set_acceleration({x=0, y=-5, z=0}) + end + if minetest.get_node({x=ownpos.x, y=ownpos.y +0.5, z=ownpos.z}).name == "air" then + self.object:set_acceleration({x=0, y=-5, z=0}) + end if minetest.get_node({x=ownpos.x, y=ownpos.y -0.5, z=ownpos.z}).name ~= "air" then - self.object:remove() - minetest.sound_play({name="drippingwater_lavadrip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) + self.object:remove() + minetest.sound_play({name="drippingwater_lavadrip"}, {pos = ownpos, gain = 0.5, max_hear_distance = 8}, true) end end, }) @@ -90,36 +81,34 @@ minetest.register_entity("drippingwater:drop_lava", { --Create drop -minetest.register_abm( - { +minetest.register_abm({ label = "Create water drops", nodenames = {"group:opaque", "group:leaves"}, neighbors = {"group:water"}, - interval = 2, - chance = 22, - action = function(pos) - if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name, "water") ~= 0 and - minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" then + interval = 2, + chance = 22, + action = function(pos) + if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name, "water") ~= 0 + and minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" then local i = math.random(-45,45) / 100 minetest.add_entity({x=pos.x + i, y=pos.y - 0.501, z=pos.z + i}, "drippingwater:drop_water") end - end, + end, }) --Create lava drop -minetest.register_abm( - { +minetest.register_abm({ label = "Create lava drops", nodenames = {"group:opaque"}, neighbors = {"group:lava"}, - interval = 2, - chance = 22, - action = function(pos) - if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name, "lava") ~= 0 and - minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" then + interval = 2, + chance = 22, + action = function(pos) + if minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name, "lava") ~= 0 + and minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" then local i = math.random(-45,45) / 100 minetest.add_entity({x=pos.x + i, y=pos.y - 0.501, z=pos.z + i}, "drippingwater:drop_lava") end - end, -}) + end, +}) \ No newline at end of file From 36f3c26139dabd3e0a902c6a1b5406dc95bf7f0d Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 00:55:14 +0200 Subject: [PATCH 074/103] [walkover] fix warnings --- mods/CORE/walkover/init.lua | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/mods/CORE/walkover/init.lua b/mods/CORE/walkover/init.lua index 220157c8b..6260b43e0 100644 --- a/mods/CORE/walkover/init.lua +++ b/mods/CORE/walkover/init.lua @@ -31,24 +31,21 @@ minetest.register_globalstep(function(dtime) timer = timer + dtime; if timer >= 0.3 then for _,player in pairs(get_connected_players()) do - local pp = player:get_pos() - pp.y = ceil(pp.y) - local loc = vector_add(pp, {x=0,y=-1,z=0}) - if loc ~= nil then - - local nodeiamon = get_node(loc) - - if nodeiamon ~= nil then - if on_walk[nodeiamon.name] then - on_walk[nodeiamon.name](loc, nodeiamon, player) - end - for i = 1, #registered_globals do + local pp = player:get_pos() + pp.y = ceil(pp.y) + local loc = vector_add(pp, {x=0,y=-1,z=0}) + if loc ~= nil then + local nodeiamon = get_node(loc) + if nodeiamon ~= nil then + if on_walk[nodeiamon.name] then + on_walk[nodeiamon.name](loc, nodeiamon, player) + end + for i = 1, #registered_globals do registered_globals[i](loc, nodeiamon, player) - end - end - end - end - + end + end + end + end timer = 0 end end) From 03c9c0b830c139aa89422032c9a587757d756bde Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 00:57:42 +0200 Subject: [PATCH 075/103] [mcl_explosion] fix warnings --- mods/CORE/mcl_explosions/init.lua | 11 +++-------- mods/CORE/mcl_explosions/locale/mcl_explosions.de.tr | 2 -- mods/CORE/mcl_explosions/locale/mcl_explosions.fr.tr | 2 -- mods/CORE/mcl_explosions/locale/mcl_explosions.ru.tr | 2 -- mods/CORE/mcl_explosions/locale/template.txt | 2 -- 5 files changed, 3 insertions(+), 16 deletions(-) delete mode 100644 mods/CORE/mcl_explosions/locale/mcl_explosions.de.tr delete mode 100644 mods/CORE/mcl_explosions/locale/mcl_explosions.fr.tr delete mode 100644 mods/CORE/mcl_explosions/locale/mcl_explosions.ru.tr delete mode 100644 mods/CORE/mcl_explosions/locale/template.txt diff --git a/mods/CORE/mcl_explosions/init.lua b/mods/CORE/mcl_explosions/init.lua index dfae884cd..3a60f2f37 100644 --- a/mods/CORE/mcl_explosions/init.lua +++ b/mods/CORE/mcl_explosions/init.lua @@ -13,9 +13,7 @@ under the LGPLv2.1 license. mcl_explosions = {} local mod_fire = minetest.get_modpath("mcl_fire") ~= nil -local CONTENT_FIRE = minetest.get_content_id("mcl_fire:fire") - -local S = minetest.get_translator("mcl_explosions") +--local CONTENT_FIRE = minetest.get_content_id("mcl_fire:fire") local hash_node_position = minetest.hash_node_position local get_objects_inside_radius = minetest.get_objects_inside_radius @@ -174,14 +172,11 @@ local function trace_explode(pos, strength, raydirs, radius, info, direct, sourc local ystride = (emax.x - emin_x + 1) local zstride = ystride * (emax.y - emin_y + 1) - local pos_x = pos.x - local pos_y = pos.y - local pos_z = pos.z - local area = VoxelArea:new { + --[[local area = VoxelArea:new { MinEdge = emin, MaxEdge = emax - } + }]] local data = vm:get_data() local destroy = {} diff --git a/mods/CORE/mcl_explosions/locale/mcl_explosions.de.tr b/mods/CORE/mcl_explosions/locale/mcl_explosions.de.tr deleted file mode 100644 index 4abbc64bf..000000000 --- a/mods/CORE/mcl_explosions/locale/mcl_explosions.de.tr +++ /dev/null @@ -1,2 +0,0 @@ -# textdomain:mcl_explosions -@1 was caught in an explosion.=@1 wurde Opfer einer Explosion. diff --git a/mods/CORE/mcl_explosions/locale/mcl_explosions.fr.tr b/mods/CORE/mcl_explosions/locale/mcl_explosions.fr.tr deleted file mode 100644 index cb9a0f38e..000000000 --- a/mods/CORE/mcl_explosions/locale/mcl_explosions.fr.tr +++ /dev/null @@ -1,2 +0,0 @@ -# textdomain:mcl_explosions -@1 was caught in an explosion.=@1 a été pris dans une explosion. \ No newline at end of file diff --git a/mods/CORE/mcl_explosions/locale/mcl_explosions.ru.tr b/mods/CORE/mcl_explosions/locale/mcl_explosions.ru.tr deleted file mode 100644 index 2c885845f..000000000 --- a/mods/CORE/mcl_explosions/locale/mcl_explosions.ru.tr +++ /dev/null @@ -1,2 +0,0 @@ -# textdomain:mcl_explosions -@1 was caught in an explosion.=@1 не удалось пережить взрыва. diff --git a/mods/CORE/mcl_explosions/locale/template.txt b/mods/CORE/mcl_explosions/locale/template.txt deleted file mode 100644 index 6a9348ddf..000000000 --- a/mods/CORE/mcl_explosions/locale/template.txt +++ /dev/null @@ -1,2 +0,0 @@ -# textdomain:mcl_explosions -@1 was caught in an explosion.= From 540508638c400288ed15345b7fa16bdbaf716e6d Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 01:22:25 +0200 Subject: [PATCH 076/103] rewrite flowlib to be more efficient --- mods/CORE/flowlib/init.lua | 144 ++++++++++++++++++------------------- 1 file changed, 71 insertions(+), 73 deletions(-) diff --git a/mods/CORE/flowlib/init.lua b/mods/CORE/flowlib/init.lua index e4e22a20e..ab710e476 100644 --- a/mods/CORE/flowlib/init.lua +++ b/mods/CORE/flowlib/init.lua @@ -1,95 +1,100 @@ +local math = math + +local get_node = minetest.get_node +local get_item_group = minetest.get_item_group + +local registered_nodes = minetest.registered_nodes + flowlib = {} --sum of direction vectors must match an array index + +--(sum,root) +--(0,1), (1,1+0=1), (2,1+1=2), (3,1+2^2=5), (4,2^2+2^2=8) + +local inv_roots = { + [0] = 1, + [1] = 1, + [2] = 0.70710678118655, + [4] = 0.5, + [5] = 0.44721359549996, + [8] = 0.35355339059327, +} + local function to_unit_vector(dir_vector) - --(sum,root) - -- (0,1), (1,1+0=1), (2,1+1=2), (3,1+2^2=5), (4,2^2+2^2=8) - local inv_roots = {[0] = 1, [1] = 1, [2] = 0.70710678118655, [4] = 0.5 - , [5] = 0.44721359549996, [8] = 0.35355339059327} - local sum = dir_vector.x*dir_vector.x + dir_vector.z*dir_vector.z - return {x=dir_vector.x*inv_roots[sum],y=dir_vector.y - ,z=dir_vector.z*inv_roots[sum]} + local sum = dir_vector.x * dir_vector.x + dir_vector.z * dir_vector.z + return {x = dir_vector.x * inv_roots[sum], y = dir_vector.y, z = dir_vector.z * inv_roots[sum]} end -local is_touching = function(realpos,nodepos,radius) +local function is_touching(realpos,nodepos,radius) local boarder = 0.5 - radius - return (math.abs(realpos - nodepos) > (boarder)) + return math.abs(realpos - nodepos) > (boarder) end flowlib.is_touching = is_touching -local is_water = function(pos) - return (minetest.get_item_group(minetest.get_node( - {x=pos.x,y=pos.y,z=pos.z}).name - , "water") ~= 0) +local function is_water(pos) + return get_item_group(get_node(pos).name, "water") ~= 0 end flowlib.is_water = is_water -local node_is_water = function(node) - return (minetest.get_item_group(node.name, "water") ~= 0) +local function node_is_water(node) + return get_item_group(node.name, "water") ~= 0 end flowlib.node_is_water = node_is_water -local is_lava = function(pos) - return (minetest.get_item_group(minetest.get_node( - {x=pos.x,y=pos.y,z=pos.z}).name - , "lava") ~= 0) +local function is_lava(pos) + return get_item_group(get_node(pos).name, "lava") ~= 0 end flowlib.is_lava = is_lava -local node_is_lava = function(node) - return (minetest.get_item_group(node.name, "lava") ~= 0) +local function node_is_lava(node) + return get_item_group(node.name, "lava") ~= 0 end flowlib.node_is_lava = node_is_lava -local is_liquid = function(pos) - return (minetest.get_item_group(minetest.get_node( - {x=pos.x,y=pos.y,z=pos.z}).name - , "liquid") ~= 0) +local function is_liquid(pos) + return get_item_group(get_node(pos).name, "liquid") ~= 0 end flowlib.is_liquid = is_liquid -local node_is_liquid = function(node) - return (minetest.get_item_group(node.name, "liquid") ~= 0) +local function node_is_liquid(node) + return minetest.get_item_group(node.name, "liquid") ~= 0 end flowlib.node_is_liquid = node_is_liquid --This code is more efficient -local function quick_flow_logic(node,pos_testing,direction) +local function quick_flow_logic(node, pos_testing, direction) local name = node.name - if not minetest.registered_nodes[name] then + if not registered_nodes[name] then return 0 end - if minetest.registered_nodes[name].liquidtype == "source" then - local node_testing = minetest.get_node(pos_testing) - local param2_testing = node_testing.param2 - if not minetest.registered_nodes[node_testing.name] then + if registered_nodes[name].liquidtype == "source" then + local node_testing = get_node(pos_testing) + if not registered_nodes[node_testing.name] then return 0 end - if minetest.registered_nodes[node_testing.name].liquidtype - ~= "flowing" then + if registered_nodes[node_testing.name].liquidtype ~= "flowing" then return 0 else return direction end - elseif minetest.registered_nodes[name].liquidtype == "flowing" then - local node_testing = minetest.get_node(pos_testing) + elseif registered_nodes[name].liquidtype == "flowing" then + local node_testing = get_node(pos_testing) local param2_testing = node_testing.param2 - if not minetest.registered_nodes[node_testing.name] then + if not registered_nodes[node_testing.name] then return 0 end - if minetest.registered_nodes[node_testing.name].liquidtype - == "source" then + if registered_nodes[node_testing.name].liquidtype == "source" then return -direction - elseif minetest.registered_nodes[node_testing.name].liquidtype - == "flowing" then + elseif registered_nodes[node_testing.name].liquidtype == "flowing" then if param2_testing < node.param2 then if (node.param2 - param2_testing) > 6 then return -direction @@ -108,48 +113,41 @@ local function quick_flow_logic(node,pos_testing,direction) return 0 end -local quick_flow = function(pos,node) - local x = 0 - local z = 0 - +local function quick_flow(pos, node) if not node_is_liquid(node) then - return {x=0,y=0,z=0} + return {x = 0, y = 0, z = 0} end - - x = x + quick_flow_logic(node,{x=pos.x-1,y=pos.y,z=pos.z},-1) - x = x + quick_flow_logic(node,{x=pos.x+1,y=pos.y,z=pos.z}, 1) - z = z + quick_flow_logic(node,{x=pos.x,y=pos.y,z=pos.z-1},-1) - z = z + quick_flow_logic(node,{x=pos.x,y=pos.y,z=pos.z+1}, 1) - - return to_unit_vector({x=x,y=0,z=z}) + local x = quick_flow_logic(node,{x = pos.x-1, y = pos.y, z = pos.z},-1) + quick_flow_logic(node,{x = pos.x+1, y = pos.y, z = pos.z}, 1) + local z = quick_flow_logic(node,{x = pos.x, y = pos.y, z = pos.z-1},-1) + quick_flow_logic(node,{x = pos.x, y = pos.y, z = pos.z+1}, 1) + return to_unit_vector({x = x, y = 0, z = z}) end flowlib.quick_flow = quick_flow +--if not in water but touching, move centre to touching block +--x has higher precedence than z +--if pos changes with x, it affects z - --if not in water but touching, move centre to touching block - --x has higher precedence than z - --if pos changes with x, it affects z -local move_centre = function(pos,realpos,node,radius) - if is_touching(realpos.x,pos.x,radius) then - if is_liquid({x=pos.x-1,y=pos.y,z=pos.z}) then - node = minetest.get_node({x=pos.x-1,y=pos.y,z=pos.z}) - pos = {x=pos.x-1,y=pos.y,z=pos.z} - elseif is_liquid({x=pos.x+1,y=pos.y,z=pos.z}) then - node = minetest.get_node({x=pos.x+1,y=pos.y,z=pos.z}) - pos = {x=pos.x+1,y=pos.y,z=pos.z} +local function move_centre(pos, realpos, node, radius) + if is_touching(realpos.x, pos.x, radius) then + if is_liquid({x = pos.x-1, y = pos.y, z = pos.z}) then + node = get_node({x=pos.x-1, y = pos.y, z = pos.z}) + pos = {x = pos.x-1, y = pos.y, z = pos.z} + elseif is_liquid({x = pos.x+1, y = pos.y, z = pos.z}) then + node = get_node({x = pos.x+1, y = pos.y, z = pos.z}) + pos = {x = pos.x+1, y = pos.y, z = pos.z} end end - if is_touching(realpos.z,pos.z,radius) then - if is_liquid({x=pos.x,y=pos.y,z=pos.z-1}) then - node = minetest.get_node({x=pos.x,y=pos.y,z=pos.z-1}) - pos = {x=pos.x,y=pos.y,z=pos.z-1} - elseif is_liquid({x=pos.x,y=pos.y,z=pos.z+1}) then - node = minetest.get_node({x=pos.x,y=pos.y,z=pos.z+1}) - pos = {x=pos.x,y=pos.y,z=pos.z+1} + if is_touching(realpos.z, pos.z, radius) then + if is_liquid({x = pos.x, y = pos.y, z = pos.z - 1}) then + node = get_node({x = pos.x, y = pos.y, z = pos.z - 1}) + pos = {x = pos.x, y = pos.y, z = pos.z - 1} + elseif is_liquid({x = pos.x, y = pos.y, z = pos.z + 1}) then + node = get_node({x = pos.x, y = pos.y, z = pos.z + 1}) + pos = {x = pos.x, y = pos.y, z = pos.z + 1} end end - return pos,node + return pos, node end flowlib.move_centre = move_centre From f5a91f7c24520dfd385f8048d215bb271dd36b6e Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 01:23:41 +0200 Subject: [PATCH 077/103] [biomeinfo] fix warnings --- mods/CORE/biomeinfo/init.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/CORE/biomeinfo/init.lua b/mods/CORE/biomeinfo/init.lua index 5013647ed..950925f9d 100644 --- a/mods/CORE/biomeinfo/init.lua +++ b/mods/CORE/biomeinfo/init.lua @@ -81,11 +81,11 @@ if v6_use_snow_biomes then end local v6_freq_desert = tonumber(minetest.get_mapgen_setting("mgv6_freq_desert") or 0.45) -local NOISE_MAGIC_X = 1619 -local NOISE_MAGIC_Y = 31337 -local NOISE_MAGIC_Z = 52591 -local NOISE_MAGIC_SEED = 1013 -local noise2d = function(x, y, seed) +--local NOISE_MAGIC_X = 1619 +--local NOISE_MAGIC_Y = 31337 +--local NOISE_MAGIC_Z = 52591 +--local NOISE_MAGIC_SEED = 1013 +local function noise2d(x, y, seed) -- TODO: implement noise2d function for biome blend return 0 --[[ From f61102279f6aff046ed203a1370ef576c4a910a7 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 01:26:26 +0200 Subject: [PATCH 078/103] [_mcl_autogroup] fix warnings --- mods/CORE/_mcl_autogroup/init.lua | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mods/CORE/_mcl_autogroup/init.lua b/mods/CORE/_mcl_autogroup/init.lua index c8475d0bd..e6b3aa2d0 100644 --- a/mods/CORE/_mcl_autogroup/init.lua +++ b/mods/CORE/_mcl_autogroup/init.lua @@ -121,7 +121,7 @@ local hardness_values = get_hardness_values_for_groups() -- hardness_value. Used for quick lookup. local hardness_lookup = get_hardness_lookup_for_groups(hardness_values) -local function compute_creativetimes(group) +--[[local function compute_creativetimes(group) local creativetimes = {} for index, hardness in pairs(hardness_values[group]) do @@ -129,7 +129,7 @@ local function compute_creativetimes(group) end return creativetimes -end +end]] -- Get the list of digging times for using a specific tool on a specific -- diggroup. @@ -239,13 +239,13 @@ function mcl_autogroup.can_harvest(nodename, toolname) end -- Get one groupcap field for using a specific tool on a specific group. -local function get_groupcap(group, can_harvest, multiplier, efficiency, uses) +--[[local function get_groupcap(group, can_harvest, multiplier, efficiency, uses) return { times = get_digtimes(group, can_harvest, multiplier, efficiency), uses = uses, maxlevel = 0, } -end +end]] -- Returns the tool_capabilities from a tool definition or a default set of -- tool_capabilities @@ -271,7 +271,7 @@ end -- toolname - Name of the tool being enchanted (like "mcl_tools:diamond_pickaxe") -- efficiency - The efficiency level the tool is enchanted with (default 0) -- --- NOTE: +-- NOTE: -- This function can only be called after mod initialization. Otherwise a mod -- would have to add _mcl_autogroup as a dependency which would break the mod -- loading order. @@ -288,7 +288,7 @@ end -- toolname - Name of the tool used -- diggroup - The name of the diggroup the tool is used on -- --- NOTE: +-- NOTE: -- This function can only be called after mod initialization. Otherwise a mod -- would have to add _mcl_autogroup as a dependency which would break the mod -- loading order. @@ -315,12 +315,12 @@ local overwrite = function() newgroups.opaque = 1 end - local creative_breakable = false + --local creative_breakable = false -- Assign groups used for digging this node depending on -- the registered digging groups for g, gdef in pairs(mcl_autogroup.registered_diggroups) do - creative_breakable = true + --creative_breakable = true local index = hardness_lookup[g][ndef._mcl_hardness or 0] if ndef.groups[g] then if gdef.levels then From 0cc11d0bbb1f8c6acf98476c2908026af462ddaf Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 01:28:10 +0200 Subject: [PATCH 079/103] [mcl_loot] fix warnings --- mods/CORE/mcl_loot/init.lua | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mods/CORE/mcl_loot/init.lua b/mods/CORE/mcl_loot/init.lua index 6db743740..1b2c50807 100644 --- a/mods/CORE/mcl_loot/init.lua +++ b/mods/CORE/mcl_loot/init.lua @@ -40,10 +40,9 @@ function mcl_loot.get_loot(loot_definitions, pr) total_weight = total_weight + (loot_definitions.items[i].weight or 1) end - local stacks_min = loot_definitions.stacks_min - local stacks_max = loot_definitions.stacks_max - if not stacks_min then stacks_min = 1 end - if not stacks_max then stacks_max = 1 end + --local stacks_min = loot_definitions.stacks_min or 1 + --local stacks_max = loot_definitions.stacks_max or 1 + local stacks = pr:next(loot_definitions.stacks_min, loot_definitions.stacks_max) for s=1, stacks do local r = pr:next(1, total_weight) From 00f4cfa5b5216bfcfe41f11598ccf2f968c4262f Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 01:33:26 +0200 Subject: [PATCH 080/103] simplify mcl_util code --- mods/CORE/mcl_util/init.lua | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 1bf3add38..0168229f2 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -457,9 +457,7 @@ function mcl_util.calculate_durability(itemstack) end end if not uses then - local toolcaps = itemstack:get_tool_capabilities() - local groupcaps = toolcaps.groupcaps - for _, v in pairs(groupcaps) do + for _, v in pairs(itemstack:get_tool_capabilities().groupcaps) do uses = v.uses break end From 79cf98c8e30be6026eea09bfa8401243149fae8f Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 01:48:14 +0200 Subject: [PATCH 081/103] [mcl_mobs] fix some warnings --- mods/ENTITIES/mcl_mobs/api/api.lua | 154 ++++++++++++----------------- mods/ENTITIES/mcl_mobs/mod.conf | 2 +- 2 files changed, 65 insertions(+), 91 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua index 878474cf1..41b522fef 100644 --- a/mods/ENTITIES/mcl_mobs/api/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -11,133 +11,111 @@ local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius local minetest_get_modpath = minetest.get_modpath local minetest_registered_nodes = minetest.registered_nodes local minetest_get_node = minetest.get_node -local minetest_get_item_group = minetest.get_item_group +--local minetest_get_item_group = minetest.get_item_group local minetest_registered_entities = minetest.registered_entities -local minetest_line_of_sight = minetest.line_of_sight -local minetest_after = minetest.after -local minetest_sound_play = minetest.sound_play -local minetest_add_particlespawner = minetest.add_particlespawner -local minetest_registered_items = minetest.registered_items -local minetest_set_node = minetest.set_node +--local minetest_line_of_sight = minetest.line_of_sight +--local minetest_after = minetest.after +--local minetest_sound_play = minetest.sound_play +--local minetest_add_particlespawner = minetest.add_particlespawner +--local minetest_registered_items = minetest.registered_items +--local minetest_set_node = minetest.set_node local minetest_add_item = minetest.add_item -local minetest_get_craft_result = minetest.get_craft_result -local minetest_find_path = minetest.find_path -local minetest_is_protected = minetest.is_protected +--local minetest_get_craft_result = minetest.get_craft_result +--local minetest_find_path = minetest.find_path local minetest_is_creative_enabled = minetest.is_creative_enabled -local minetest_find_node_near = minetest.find_node_near -local minetest_find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air -local minetest_raycast = minetest.raycast -local minetest_get_us_time = minetest.get_us_time +--local minetest_find_node_near = minetest.find_node_near +--local minetest_find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air +--local minetest_raycast = minetest.raycast +--local minetest_get_us_time = minetest.get_us_time local minetest_add_entity = minetest.add_entity -local minetest_get_natural_light = minetest.get_natural_light -local minetest_get_node_or_nil = minetest.get_node_or_nil +--local minetest_get_natural_light = minetest.get_natural_light +--local minetest_get_node_or_nil = minetest.get_node_or_nil -- localize math functions -local math_pi = math.pi -local math_sin = math.sin -local math_cos = math.cos -local math_abs = math.abs -local math_min = math.min -local math_max = math.max -local math_atan = math.atan -local math_random = math.random -local math_floor = math.floor +local math = math -- localize vector functions -local vector_new = vector.new -local vector_add = vector.add -local vector_length = vector.length -local vector_direction = vector.direction -local vector_normalize = vector.normalize -local vector_multiply = vector.multiply -local vector_divide = vector.divide +local vector = vector + +local string = string -- mob constants -local BREED_TIME = 30 -local BREED_TIME_AGAIN = 300 -local CHILD_GROW_TIME = 60*20 -local DEATH_DELAY = 0.5 +--local BREED_TIME = 30 +--local BREED_TIME_AGAIN = 300 +--local CHILD_GROW_TIME = 60*20 +--local DEATH_DELAY = 0.5 local DEFAULT_FALL_SPEED = -10 -local FLOP_HEIGHT = 5.0 -local FLOP_HOR_SPEED = 1.5 +--local FLOP_HEIGHT = 5.0 +--local FLOP_HOR_SPEED = 1.5 local GRAVITY = minetest_settings:get("movement_gravity")-- + 9.81 +local MAX_MOB_NAME_LENGTH = 30 -local MOB_CAP = {} + +--[[local MOB_CAP = {} MOB_CAP.hostile = 70 MOB_CAP.passive = 10 MOB_CAP.ambient = 15 MOB_CAP.water = 15 +]] -- Load main settings -local damage_enabled = minetest_settings:get_bool("enable_damage") -local disable_blood = minetest_settings:get_bool("mobs_disable_blood") -local mobs_drop_items = minetest_settings:get_bool("mobs_drop_items") ~= false -local mobs_griefing = minetest_settings:get_bool("mobs_griefing") ~= false -local spawn_protected = minetest_settings:get_bool("mobs_spawn_protected") ~= false -local remove_far = true +--local damage_enabled = minetest_settings:get_bool("enable_damage") +--local disable_blood = minetest_settings:get_bool("mobs_disable_blood") +--local mobs_drop_items = minetest_settings:get_bool("mobs_drop_items") ~= false +--local mobs_griefing = minetest_settings:get_bool("mobs_griefing") ~= false +--local spawn_protected = minetest_settings:get_bool("mobs_spawn_protected") ~= false +--local remove_far = true local difficulty = tonumber(minetest_settings:get("mob_difficulty")) or 1.0 -local show_health = false -local max_per_block = tonumber(minetest_settings:get("max_objects_per_block") or 64) -local mobs_spawn_chance = tonumber(minetest_settings:get("mobs_spawn_chance") or 2.5) +--local show_health = false +--local max_per_block = tonumber(minetest_settings:get("max_objects_per_block") or 64) +---local mobs_spawn_chance = tonumber(minetest_settings:get("mobs_spawn_chance") or 2.5) -- pathfinding settings -local enable_pathfinding = true -local stuck_timeout = 3 -- how long before mob gets stuck in place and starts searching -local stuck_path_timeout = 10 -- how long will mob follow path before giving up +--local enable_pathfinding = true +--local stuck_timeout = 3 -- how long before mob gets stuck in place and starts searching +--local stuck_path_timeout = 10 -- how long will mob follow path before giving up -- default nodes -local node_ice = "mcl_core:ice" -local node_snowblock = "mcl_core:snowblock" -local node_snow = "mcl_core:snow" +--local node_ice = "mcl_core:ice" +--local node_snowblock = "mcl_core:snowblock" +--local node_snow = "mcl_core:snow" mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "mcl_core:dirt" -local mod_weather = minetest_get_modpath("mcl_weather") -local mod_explosions = minetest_get_modpath("mcl_explosions") +--local mod_weather = minetest_get_modpath("mcl_weather") +--local mod_explosions = minetest_get_modpath("mcl_explosions") local mod_mobspawners = minetest_get_modpath("mcl_mobspawners") -local mod_hunger = minetest_get_modpath("mcl_hunger") -local mod_worlds = minetest_get_modpath("mcl_worlds") -local mod_armor = minetest_get_modpath("mcl_armor") -local mod_experience = minetest_get_modpath("mcl_experience") +--local mod_hunger = minetest_get_modpath("mcl_hunger") +--local mod_worlds = minetest_get_modpath("mcl_worlds") +--local mod_armor = minetest_get_modpath("mcl_armor") +--local mod_experience = minetest_get_modpath("mcl_experience") -- random locals I found -local los_switcher = false -local height_switcher = false +--local los_switcher = false +--local height_switcher = false -- Get translator local S = minetest.get_translator("mcl_mobs") -- CMI support check -local use_cmi = minetest.global_exists("cmi") - - --- Invisibility mod check -mobs.invis = {} -if minetest.global_exists("invisibility") then - mobs.invis = invisibility -end - +--local use_cmi = minetest.global_exists("cmi") -- creative check function mobs.is_creative(name) return minetest_is_creative_enabled(name) end - -local atan = function(x) +--[[local function atan(x) if not x or x ~= x then return 0 else - return math_atan(x) + return math.atan(x) end -end - - - +end]] -- Shows helpful debug info above each mob -local mobs_debug = minetest_settings:get_bool("mobs_debug", false) +--local mobs_debug = minetest_settings:get_bool("mobs_debug", false) -- Peaceful mode message so players will know there are no monsters if minetest_settings:get_bool("only_peaceful_mobs", false) then @@ -191,7 +169,7 @@ function mobs:register_mob(name, def) if (not value) or (value == default) or (value == special) then return default else - return math_max(min, value * difficulty) + return math.max(min, value * difficulty) end end @@ -366,15 +344,11 @@ function mobs:register_mob(name, def) random_sound_timer_min = 3, random_sound_timer_max = 10, - --head code variables --defaults are for the cow's default --because I don't know what else to set them --to :P - has_head = def.has_head or false, - head_bone = def.head_bone, - --you must use these to adjust the mob's head positions --has_head is used as a logic gate (quick easy check) @@ -444,7 +418,7 @@ function mobs:register_mob(name, def) --on_detach_child = mob_detach_child, on_activate = function(self, staticdata, dtime) - self.object:set_acceleration(vector_new(0,-GRAVITY, 0)) + self.object:set_acceleration(vector.new(0,-GRAVITY, 0)) return mobs.mob_activate(self, staticdata, def, dtime) end, @@ -556,10 +530,10 @@ function mobs:register_arrow(name, def) and def.tail_texture then --do this to prevent clipping through main entity sprite - local pos_adjustment = vector_multiply(vector_normalize(vel), -1) + local pos_adjustment = vector.multiply(vector.normalize(vel), -1) local divider = def.tail_distance_divider or 1 - pos_adjustment = vector_divide(pos_adjustment, divider) - local new_pos = vector_add(pos, pos_adjustment) + pos_adjustment = vector.divide(pos_adjustment, divider) + local new_pos = vector.add(pos, pos_adjustment) minetest.add_particle({ pos = new_pos, velocity = {x = 0, y = 0, z = 0}, @@ -693,12 +667,12 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative) if pos --and within_limits(pos, 0) - and not minetest_is_protected(pos, placer:get_player_name()) then + and not minetest.is_protected(pos, placer:get_player_name()) then local name = placer:get_player_name() local privs = minetest.get_player_privs(name) if mod_mobspawners and under.name == "mcl_mobspawners:spawner" then - if minetest_is_protected(pointed_thing.under, name) then + if minetest.is_protected(pointed_thing.under, name) then minetest.record_protection_violation(pointed_thing.under, name) return itemstack end diff --git a/mods/ENTITIES/mcl_mobs/mod.conf b/mods/ENTITIES/mcl_mobs/mod.conf index 9dfb43aef..2a91a7764 100644 --- a/mods/ENTITIES/mcl_mobs/mod.conf +++ b/mods/ENTITIES/mcl_mobs/mod.conf @@ -2,4 +2,4 @@ name = mcl_mobs author = PilzAdam description = Adds a mob API for mods to add animals or monsters, etc. depends = mcl_particles -optional_depends = mcl_weather, mcl_explosions, mcl_hunger, mcl_worlds, invisibility, cmi, doc_identifier, mcl_armor, mcl_portals, mcl_experience +optional_depends = mcl_weather, mcl_explosions, mcl_hunger, mcl_worlds, cmi, doc_identifier, mcl_armor, mcl_portals, mcl_experience From d3a237384dc5c614733799b2f93ad19343777529 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 08:40:21 +0200 Subject: [PATCH 082/103] [mcl_end] fix warnings --- mods/ITEMS/mcl_end/chorus_plant.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index b54259885..0e35ff286 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -450,6 +450,8 @@ function mcl_end.grow_chorus_plant_step(pos, node, pr) end --- ABM --- +local seed = minetest.get_mapgen_params().seed +local pr = PseudoRandom(seed) minetest.register_abm({ label = "Chorus plant growth", nodenames = { "mcl_end:chorus_flower" }, From 8592670f9b0592e1e1eaf26730cbf9dc99757904 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 08:44:24 +0200 Subject: [PATCH 083/103] [tsm_railcorridors] fix warnings --- mods/MAPGEN/tsm_railcorridors/init.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/MAPGEN/tsm_railcorridors/init.lua b/mods/MAPGEN/tsm_railcorridors/init.lua index 2414cc962..550167dc3 100644 --- a/mods/MAPGEN/tsm_railcorridors/init.lua +++ b/mods/MAPGEN/tsm_railcorridors/init.lua @@ -114,7 +114,8 @@ if not tsm_railcorridors.nodes.corridor_woods_function then end -- Random Perlin noise generators -local pr, pr_carts, pr_treasures, pr_deco, webperlin_major, webperlin_minor +local pr, pr_carts, pr_deco, webperlin_major, webperlin_minor +--local pr_treasures local function InitRandomizer(seed) -- Mostly used for corridor gen. @@ -124,7 +125,7 @@ local function InitRandomizer(seed) -- Separate randomizer for carts because spawning carts is very timing-dependent pr_carts = PseudoRandom(seed-654) -- Chest contents randomizer - pr_treasures = PseudoRandom(seed+777) + --pr_treasures = PseudoRandom(seed+777) -- Used for cobweb generation, both noises have to reach a high value for cobwebs to appear webperlin_major = PerlinNoise(934, 3, 0.6, 500) webperlin_minor = PerlinNoise(834, 3, 0.6, 50) From 42d3830c4820fe6f22ff42b271d05d5b42296dd3 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 08:49:46 +0200 Subject: [PATCH 084/103] [mcl_nether] fix warnings --- mods/ITEMS/mcl_nether/lava.lua | 10 +--------- mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr | 2 -- mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr | 4 +--- mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr | 2 -- mods/ITEMS/mcl_nether/locale/template.txt | 4 +--- 5 files changed, 3 insertions(+), 19 deletions(-) diff --git a/mods/ITEMS/mcl_nether/lava.lua b/mods/ITEMS/mcl_nether/lava.lua index da85b8e3c..035a50322 100644 --- a/mods/ITEMS/mcl_nether/lava.lua +++ b/mods/ITEMS/mcl_nether/lava.lua @@ -1,12 +1,6 @@ -- Lava in the Nether -local S = minetest.get_translator("mcl_nether") -local N = function(s) return s end - -local msg = { - N("@1 has become one with the lava."), - N("@1 has been consumed by the lava."), -} +local S = minetest.get_translator(minetest.get_current_modname()) -- TODO: Increase flow speed. This could be done by reducing viscosity, -- but this would also allow players to swim faster in lava. @@ -20,7 +14,6 @@ lava_src_def._doc_items_usagehelp = nil lava_src_def.liquid_range = 7 lava_src_def.liquid_alternative_source = "mcl_nether:nether_lava_source" lava_src_def.liquid_alternative_flowing = "mcl_nether:nether_lava_flowing" -lava_src_def._mcl_node_death_message = msg, minetest.register_node("mcl_nether:nether_lava_source", lava_src_def) local lava_flow_def = table.copy(minetest.registered_nodes["mcl_core:lava_flowing"]) @@ -29,7 +22,6 @@ lava_flow_def._doc_items_create_entry = false lava_flow_def.liquid_range = 7 lava_flow_def.liquid_alternative_flowing = "mcl_nether:nether_lava_flowing" lava_flow_def.liquid_alternative_source = "mcl_nether:nether_lava_source" -lava_flow_def._mcl_node_death_message = msg, minetest.register_node("mcl_nether:nether_lava_flowing", lava_flow_def) -- Add entry aliases for the Help diff --git a/mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr b/mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr index bfa62488c..f81f381e2 100644 --- a/mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr +++ b/mods/ITEMS/mcl_nether/locale/mcl_nether.de.tr @@ -38,5 +38,3 @@ Place this item on soul sand to plant it and watch it grow.=Platzieren Sie den G Burns your feet=Verbrennt Ihre Füße Grows on soul sand=Wächst auf Seelensand Reduces walking speed=Reduziert das Schritttempo -@1 has become one with the lava.=@1 wurde eins mit der Lava. -@1 has been consumed by the lava.=@1 wurde von der Lava verzehrt. diff --git a/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr b/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr index 11a046374..3e3583355 100644 --- a/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr +++ b/mods/ITEMS/mcl_nether/locale/mcl_nether.fr.tr @@ -37,6 +37,4 @@ Nether warts are plants home to the Nether. They can be planted on soul sand and Place this item on soul sand to plant it and watch it grow.=Placez cet article sur du sable d'âme pour le planter et regardez-le grandir. Burns your feet=Vous brûle les pieds Grows on soul sand=Pousse sur le sable de l'âme -Reduces walking speed=Réduit la vitesse de marche -@1 has become one with the lava.=@1 est devenu un avec la lave. -@1 has been consumed by the lava.=@1 a été consumé par la lave. \ No newline at end of file +Reduces walking speed=Réduit la vitesse de marche \ No newline at end of file diff --git a/mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr b/mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr index 2cfdd370b..f546d16ca 100644 --- a/mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr +++ b/mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr @@ -38,5 +38,3 @@ Place this item on soul sand to plant it and watch it grow.=Поместите Burns your feet=Обжигает ваши ноги Grows on soul sand=Растёт на песке душ Reduces walking speed=Уменьшает скорость ходьбы -@1 has become one with the lava.=@1 породнился(лась) с лавой. -@1 has been consumed by the lava.=@1 был(а) поглощен(а) лавой. diff --git a/mods/ITEMS/mcl_nether/locale/template.txt b/mods/ITEMS/mcl_nether/locale/template.txt index 7b5052166..0e69ad520 100644 --- a/mods/ITEMS/mcl_nether/locale/template.txt +++ b/mods/ITEMS/mcl_nether/locale/template.txt @@ -37,6 +37,4 @@ Nether warts are plants home to the Nether. They can be planted on soul sand and Place this item on soul sand to plant it and watch it grow.= Burns your feet= Grows on soul sand= -Reduces walking speed= -@1 has become one with the lava.= -@1 has been consumed by the lava.= +Reduces walking speed= \ No newline at end of file From 3f3abbbee11f0f80997886f4c131c1f61aeac7d3 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 09:09:16 +0200 Subject: [PATCH 085/103] speedup mcl_particles code --- mods/CORE/mcl_particles/init.lua | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/mods/CORE/mcl_particles/init.lua b/mods/CORE/mcl_particles/init.lua index 48e9db8df..4854afd54 100644 --- a/mods/CORE/mcl_particles/init.lua +++ b/mods/CORE/mcl_particles/init.lua @@ -1,3 +1,12 @@ +local vector = vector +local table = table + +local hash_node_position = minetest.hash_node_position +local add_particlespawner = minetest.add_particlespawner +local delete_particlespawner = minetest.delete_particlespawner + +local ipairs = ipairs + mcl_particles = {} -- Table of particlespawner IDs on a per-node hash basis @@ -32,11 +41,11 @@ function mcl_particles.add_node_particlespawner(pos, particlespawner_definition, if allowed_level == 0 or levels[level] > allowed_level then return end - local poshash = minetest.hash_node_position(pos) + local poshash = hash_node_position(pos) if not poshash then return end - local id = minetest.add_particlespawner(particlespawner_definition) + local id = add_particlespawner(particlespawner_definition) if id == -1 then return end @@ -47,6 +56,8 @@ function mcl_particles.add_node_particlespawner(pos, particlespawner_definition, return id end +local add_node_particlespawner = mcl_particles.add_node_particlespawner + -- Deletes all particlespawners that are assigned to a node position. -- If no particlespawners exist for this position, nothing happens. -- pos: Node positon. MUST use integer values! @@ -55,11 +66,11 @@ function mcl_particles.delete_node_particlespawners(pos) if allowed_level == 0 then return false end - local poshash = minetest.hash_node_position(pos) + local poshash = hash_node_position(pos) local ids = particle_nodes[poshash] if ids then for i=1, #ids do - minetest.delete_particlespawner(ids[i]) + delete_particlespawner(ids[i]) end particle_nodes[poshash] = nil return true @@ -72,7 +83,6 @@ end local smoke_pdef_cached = {} function mcl_particles.spawn_smoke(pos, name, smoke_pdef_base) - local min = math.min local new_minpos = vector.add(pos, smoke_pdef_base.minrelpos) local new_maxpos = vector.add(pos, smoke_pdef_base.maxrelpos) @@ -81,7 +91,7 @@ function mcl_particles.spawn_smoke(pos, name, smoke_pdef_base) for i, smoke_pdef in ipairs(smoke_pdef_cached[name]) do smoke_pdef.minpos = new_minpos smoke_pdef.maxpos = new_maxpos - mcl_particles.add_node_particlespawner(pos, smoke_pdef, "high") + add_node_particlespawner(pos, smoke_pdef, "high") end -- cache already populated else @@ -111,13 +121,11 @@ function mcl_particles.spawn_smoke(pos, name, smoke_pdef_base) smoke_pdef.animation.length = exptime + 0.1 -- minexptime must be set such that the last frame is actully rendered, -- even if its very short. Larger exptime -> larger range - smoke_pdef.minexptime = min(exptime, (7.0/8.0 * (exptime + 0.1) + 0.1)) + smoke_pdef.minexptime = math.min(exptime, (7.0/8.0 * (exptime + 0.1) + 0.1)) smoke_pdef.texture = "mcl_particles_smoke_anim.png^[colorize:#000000:" ..colorize - - mcl_particles.add_node_particlespawner(pos, smoke_pdef, "high") - + add_node_particlespawner(pos, smoke_pdef, "high") table.insert(smoke_pdef_cached[name], table.copy(smoke_pdef)) end end end -end +end \ No newline at end of file From 981f3d5d74ed49a9748cee3d168c8626bab1fd61 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 10:51:46 +0200 Subject: [PATCH 086/103] fix some codestyle issues --- mods/CORE/mcl_worlds/init.lua | 62 +++++++++++++++++------------------ 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/mods/CORE/mcl_worlds/init.lua b/mods/CORE/mcl_worlds/init.lua index 435ce51c7..ec8144794 100644 --- a/mods/CORE/mcl_worlds/init.lua +++ b/mods/CORE/mcl_worlds/init.lua @@ -33,15 +33,15 @@ end -- If the Y coordinate is not located in any dimension, it will return: -- nil, "void" function mcl_worlds.y_to_layer(y) - if y >= mcl_vars.mg_overworld_min then - return y - mcl_vars.mg_overworld_min, "overworld" - elseif y >= mcl_vars.mg_nether_min and y <= mcl_vars.mg_nether_max+128 then - return y - mcl_vars.mg_nether_min, "nether" - elseif y >= mcl_vars.mg_end_min and y <= mcl_vars.mg_end_max then - return y - mcl_vars.mg_end_min, "end" - else - return nil, "void" - end + if y >= mcl_vars.mg_overworld_min then + return y - mcl_vars.mg_overworld_min, "overworld" + elseif y >= mcl_vars.mg_nether_min and y <= mcl_vars.mg_nether_max+128 then + return y - mcl_vars.mg_nether_min, "nether" + elseif y >= mcl_vars.mg_end_min and y <= mcl_vars.mg_end_max then + return y - mcl_vars.mg_end_min, "end" + else + return nil, "void" + end end -- Takes a pos and returns the dimension it belongs to (same as above) @@ -55,38 +55,38 @@ end -- MineClone 2. -- mc_dimension is one of "overworld", "nether", "end" (default: "overworld"). function mcl_worlds.layer_to_y(layer, mc_dimension) - if mc_dimension == "overworld" or mc_dimension == nil then - return layer + mcl_vars.mg_overworld_min - elseif mc_dimension == "nether" then - return layer + mcl_vars.mg_nether_min - elseif mc_dimension == "end" then - return layer + mcl_vars.mg_end_min - end + if mc_dimension == "overworld" or mc_dimension == nil then + return layer + mcl_vars.mg_overworld_min + elseif mc_dimension == "nether" then + return layer + mcl_vars.mg_nether_min + elseif mc_dimension == "end" then + return layer + mcl_vars.mg_end_min + end end -- Takes a position and returns true if this position can have weather function mcl_worlds.has_weather(pos) - -- Weather in the Overworld and the high part of the void below - return pos.y <= mcl_vars.mg_overworld_max and pos.y >= mcl_vars.mg_overworld_min - 64 + -- Weather in the Overworld and the high part of the void below + return pos.y <= mcl_vars.mg_overworld_max and pos.y >= mcl_vars.mg_overworld_min - 64 end -- Takes a position and returns true if this position can have Nether dust function mcl_worlds.has_dust(pos) - -- Weather in the Overworld and the high part of the void below - return pos.y <= mcl_vars.mg_nether_max + 138 and pos.y >= mcl_vars.mg_nether_min - 10 + -- Weather in the Overworld and the high part of the void below + return pos.y <= mcl_vars.mg_nether_max + 138 and pos.y >= mcl_vars.mg_nether_min - 10 end -- Takes a position (pos) and returns true if compasses are working here function mcl_worlds.compass_works(pos) - -- It doesn't work in Nether and the End, but it works in the Overworld and in the high part of the void below - local _, dim = mcl_worlds.y_to_layer(pos.y) - if dim == "nether" or dim == "end" then - return false - elseif dim == "void" then - return pos.y <= mcl_vars.mg_overworld_max and pos.y >= mcl_vars.mg_overworld_min - 64 - else - return true - end + -- It doesn't work in Nether and the End, but it works in the Overworld and in the high part of the void below + local _, dim = mcl_worlds.y_to_layer(pos.y) + if dim == "nether" or dim == "end" then + return false + elseif dim == "void" then + return pos.y <= mcl_vars.mg_overworld_max and pos.y >= mcl_vars.mg_overworld_min - 64 + else + return true + end end -- Takes a position (pos) and returns true if clocks are working here @@ -112,11 +112,11 @@ local last_dimension = {} -- * player: Player who changed the dimension -- * dimension: New dimension ("overworld", "nether", "end", "void") function mcl_worlds.dimension_change(player, dimension) - local playername = player:get_player_name() + local playername = player:get_player_name() for i=1, #mcl_worlds.registered_on_dimension_change do mcl_worlds.registered_on_dimension_change[i](player, dimension, last_dimension[playername]) end - last_dimension[playername] = dimension + last_dimension[playername] = dimension end ----------------------- INTERNAL STUFF ---------------------- From 388ab6d8dffea8c7daa5760e962ee0ebf3cbaeb1 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 10:56:06 +0200 Subject: [PATCH 087/103] fix some codestyle issues --- mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua | 4 ++-- .../mcl_mobs/api/mob_functions/animation.lua | 2 +- .../mcl_mobs/api/mob_functions/breeding.lua | 4 +--- .../mcl_mobs/api/mob_functions/environment.lua | 16 +++++++--------- .../mcl_mobs/api/mob_functions/head_logic.lua | 2 +- .../mcl_mobs/api/mob_functions/movement.lua | 2 +- mods/ENTITIES/mcl_mobs/api/spawning.lua | 2 +- mods/HUD/mcl_experience/init.lua | 6 +++--- mods/ITEMS/mcl_enchanting/engine.lua | 2 +- mods/MAPGEN/mcl_structures/init.lua | 2 +- mods/MAPGEN/mcl_villages/buildings.lua | 4 ++-- mods/PLAYER/mcl_playerplus/init.lua | 2 +- 12 files changed, 22 insertions(+), 26 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index df2ccade2..ef2687455 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -416,7 +416,7 @@ local swim_turn_check = function(self,dtime) local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 - return(green_flag_1) + return green_flag_1 end --this is to swap the built in engine acceleration modifier @@ -561,7 +561,7 @@ local fly_turn_check = function(self,dtime) local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 - return(green_flag_1) + return green_flag_1 end --this is to swap the built in engine acceleration modifier diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua index 8f2ea9e31..cea6d838b 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua @@ -157,7 +157,7 @@ local calculate_pitch = function(self) return false end - return(minetest_dir_to_yaw(vector_new(vector_distance(vector_new(pos.x,0,pos.z),vector_new(pos2.x,0,pos2.z)),0,pos.y - pos2.y)) + HALF_PI) + return minetest_dir_to_yaw(vector_new(vector_distance(vector_new(pos.x,0,pos.z),vector_new(pos2.x,0,pos2.z)),0,pos.y - pos2.y)) + HALF_PI end --this is a helper function used to make mobs pitch rotation dynamically flow when flying/swimming diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua index 57650a9c9..c50fb6300 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua @@ -140,9 +140,7 @@ mobs.look_for_mate = function(self) winner_mate = mate end end - - return(winner_mate) - + return winner_mate end --make the baby grow up diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua index 3b204a4bf..5c431135e 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua @@ -76,8 +76,7 @@ mobs.detect_closest_player_within_radius = function(self, line_of_sight, radius, winner_player = player end end - - return(winner_player) + return winner_player end @@ -104,14 +103,13 @@ mobs.jump_check = function(self,dtime) if green_flag_1 and green_flag_2 then --can jump over node - return(1) + return 1 elseif green_flag_1 and not green_flag_2 then --wall in front of mob - return(2) + return 2 end - --nothing to jump over - return(0) + return 0 end -- a helper function to quickly turn neutral passive mobs hostile @@ -223,12 +221,12 @@ mobs.check_for_player_within_area = function(self, radius) local distance = vector_distance(pos1,pos2) if distance < radius then --found a player - return(true) + return true end end end --did not find a player - return(false) + return false end @@ -236,7 +234,7 @@ end mobs.get_2d_distance = function(pos1,pos2) pos1.y = 0 pos2.y = 0 - return(vector_distance(pos1, pos2)) + return vector_distance(pos1, pos2) end -- fall damage onto solid ground diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua index 13bc6584d..0f5615504 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua @@ -3,7 +3,7 @@ local vector = vector --converts yaw to degrees local degrees = function(yaw) - return(yaw*180.0/math.pi) + return yaw*180.0/math.pi end mobs.do_head_logic = function(self,dtime) diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua index 72612b1eb..893f8eede 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -312,7 +312,7 @@ mobs.calculate_pitch = function(pos1, pos2) return false end - return(minetest_dir_to_yaw(vector.new(vector.distance(vector.new(pos1.x,0,pos1.z),vector.new(pos2.x,0,pos2.z)),0,pos1.y - pos2.y)) + HALF_PI) + return minetest_dir_to_yaw(vector.new(vector.distance(vector.new(pos1.x,0,pos1.z),vector.new(pos2.x,0,pos2.z)),0,pos1.y - pos2.y)) + HALF_PI end --make mobs fly up or down based on their y difference diff --git a/mods/ENTITIES/mcl_mobs/api/spawning.lua b/mods/ENTITIES/mcl_mobs/api/spawning.lua index 08b161527..bf7176b99 100644 --- a/mods/ENTITIES/mcl_mobs/api/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/api/spawning.lua @@ -501,7 +501,7 @@ local position_calculation = function(pos) pos.z = pos.z + math_random(inner,outer)*int[math_random(1,2)] pos.x = pos.x + math_random(-outer,outer) end - return(pos) + return pos end --[[ diff --git a/mods/HUD/mcl_experience/init.lua b/mods/HUD/mcl_experience/init.lua index 53376c63f..a40599d17 100644 --- a/mods/HUD/mcl_experience/init.lua +++ b/mods/HUD/mcl_experience/init.lua @@ -120,9 +120,9 @@ end hud_manager.hud_exists = function(player,hud_name) local name = player:get_player_name() if player_huds[name] and player_huds[name][hud_name] then - return(true) + return true else - return(false) + return false end end ------------------- @@ -150,7 +150,7 @@ end) function mcl_experience.get_player_xp_level(player) local name = player:get_player_name() - return(pool[name].level) + return pool[name].level end function mcl_experience.set_player_xp_level(player,level) diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index 47db36870..d2db2281a 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -7,7 +7,7 @@ end function mcl_enchanting.get_enchantments(itemstack) if not itemstack then - return({}) + return {} end return minetest.deserialize(itemstack:get_meta():get_string("mcl_enchanting:enchantments")) or {} end diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index e3f6b4829..f939b9c1a 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -15,7 +15,7 @@ local function ecb_place(blockpos, action, calls_remaining, param) end end mcl_structures.place_schematic = function(pos, schematic, rotation, replacements, force_placement, flags, after_placement_callback, pr, callback_param) - local s = loadstring(minetest.serialize_schematic(schematic, "lua", {lua_use_comments = false, lua_num_indent_spaces = 0}) .. " return(schematic)")() + local s = loadstring(minetest.serialize_schematic(schematic, "lua", {lua_use_comments = false, lua_num_indent_spaces = 0}) .. " return schematic")() if s and s.size then local x, z = s.size.x, s.size.z if rotation then diff --git a/mods/MAPGEN/mcl_villages/buildings.lua b/mods/MAPGEN/mcl_villages/buildings.lua index 9d8e7580f..3f4490bf9 100644 --- a/mods/MAPGEN/mcl_villages/buildings.lua +++ b/mods/MAPGEN/mcl_villages/buildings.lua @@ -14,7 +14,7 @@ function settlements.build_schematic(vm, data, va, pos, building, replace_wall, -- schematic conversion to lua local schem_lua = minetest.serialize_schematic(building, "lua", - {lua_use_comments = false, lua_num_indent_spaces = 0}).." return(schematic)" + {lua_use_comments = false, lua_num_indent_spaces = 0}).." return schematic" -- replace material if replace_wall == "y" then schem_lua = schem_lua:gsub("mcl_core:cobble", material) @@ -228,7 +228,7 @@ function settlements.place_schematics(settlement_info, pr) -- schematic conversion to lua local schem_lua = minetest.serialize_schematic(building, "lua", - {lua_use_comments = false, lua_num_indent_spaces = 0}).." return(schematic)" + {lua_use_comments = false, lua_num_indent_spaces = 0}).." return schematic" schem_lua = schem_lua:gsub("mcl_core:stonebrickcarved", "mcl_villages:stonebrickcarved") -- replace material if replace_wall then diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 3ad6ba6e8..40752b835 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -49,7 +49,7 @@ local player_collision = function(player) end end - return({x,z}) + return {x,z} end -- converts yaw to degrees From 9e074af07f542adfadbc3e16456571b31579309e Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 12:52:25 +0200 Subject: [PATCH 088/103] unify code style [1] --- CONTRIBUTING.md | 2 +- mods/CORE/_mcl_autogroup/init.lua | 2 +- mods/CORE/mcl_attached/init.lua | 21 ++++--- mods/CORE/mcl_util/init.lua | 4 +- mods/ENTITIES/mcl_item_entity/init.lua | 12 ++-- mods/ENTITIES/mcl_minecarts/init.lua | 4 +- mods/ENTITIES/mcl_minecarts/rails.lua | 2 +- .../mcl_mobs/api/mob_functions/ai.lua | 28 ++++----- mods/ENTITIES/mcl_mobs/api/spawning.lua | 8 +-- mods/ITEMS/REDSTONE/mesecons/presets.lua | 4 +- mods/ITEMS/REDSTONE/mesecons/services.lua | 6 +- mods/ITEMS/REDSTONE/mesecons_button/init.lua | 2 +- mods/ITEMS/mcl_fences/init.lua | 4 +- mods/ITEMS/mcl_fire/init.lua | 2 +- mods/ITEMS/mcl_fishing/init.lua | 11 ++-- mods/ITEMS/xpanes/init.lua | 2 +- mods/MAPGEN/mcl_biomes/init.lua | 8 +-- mods/MAPGEN/mcl_mapgen_core/init.lua | 16 ++--- mods/MAPGEN/mcl_strongholds/init.lua | 4 +- mods/MAPGEN/mcl_structures/init.lua | 61 ++++++++++--------- mods/MAPGEN/mcl_villages/const.lua | 2 +- mods/MAPGEN/tsm_railcorridors/gameconfig.lua | 2 +- mods/MAPGEN/tsm_railcorridors/init.lua | 6 +- mods/PLAYER/mcl_playerinfo/init.lua | 4 +- mods/PLAYER/mcl_playerplus/init.lua | 5 +- mods/PLAYER/mcl_skins/init.lua | 11 ++-- mods/PLAYER/mcl_sprint/init.lua | 2 +- 27 files changed, 118 insertions(+), 117 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 21facbd1b..5758d194f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1,5 @@ # Contributing to MineClone 2 -So you want to MineClone 2? +So you want to contribute to MineClone 2? Wow, thank you! :-) But first, some things to note: diff --git a/mods/CORE/_mcl_autogroup/init.lua b/mods/CORE/_mcl_autogroup/init.lua index e6b3aa2d0..76c68122b 100644 --- a/mods/CORE/_mcl_autogroup/init.lua +++ b/mods/CORE/_mcl_autogroup/init.lua @@ -298,7 +298,7 @@ function mcl_autogroup.get_wear(toolname, diggroup) return math.ceil(65535 / uses) end -local overwrite = function() +local function overwrite() for nname, ndef in pairs(minetest.registered_nodes) do local newgroups = table.copy(ndef.groups) if (nname ~= "ignore" and ndef.diggable) then diff --git a/mods/CORE/mcl_attached/init.lua b/mods/CORE/mcl_attached/init.lua index 146cb2251..4f538e104 100644 --- a/mods/CORE/mcl_attached/init.lua +++ b/mods/CORE/mcl_attached/init.lua @@ -1,17 +1,21 @@ +local vector = vector + +local facedir_to_dir = minetest.facedir_to_dir +local get_item_group = minetest.get_item_group +local remove_node = minetest.remove_node +local get_node = minetest.get_node + local original_function = minetest.check_single_for_falling -minetest.check_single_for_falling = function(pos) +function minetest.check_single_for_falling(pos) local ret_o = original_function(pos) - local ret = false local node = minetest.get_node(pos) - if minetest.get_item_group(node.name, "attached_node_facedir") ~= 0 then - local dir = minetest.facedir_to_dir(node.param2) + if get_item_group(node.name, "attached_node_facedir") ~= 0 then + local dir = facedir_to_dir(node.param2) if dir then - local cpos = vector.add(pos, dir) - local cnode = minetest.get_node(cpos) - if minetest.get_item_group(cnode.name, "solid") == 0 then - minetest.remove_node(pos) + if get_item_group(get_node(vector.add(pos, dir)).name, "solid") == 0 then + remove_node(pos) local drops = minetest.get_node_drops(node.name, "") for dr=1, #drops do minetest.add_item(pos, drops[dr]) @@ -20,7 +24,6 @@ minetest.check_single_for_falling = function(pos) end end end - return ret_o or ret end diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 0168229f2..1ac2c1f9b 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -150,7 +150,7 @@ function mcl_util.get_eligible_transfer_item_slot(src_inventory, src_list, dst_i end -- Returns true if itemstack is a shulker box -local is_not_shulker_box = function(itemstack) +local function is_not_shulker_box(itemstack) local g = minetest.get_item_group(itemstack:get_name(), "shulker_box") return g == 0 or g == nil end @@ -212,7 +212,7 @@ function mcl_util.move_item_container(source_pos, destination_pos, source_list, end -- Normalize double container by forcing to always use the left segment first - local normalize_double_container = function(pos, node, ctype) + local function normalize_double_container(pos, node, ctype) if ctype == 6 then pos = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") if not pos then diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 0c26c38c8..a73f586e9 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -1,5 +1,5 @@ --these are lua locals, used for higher performance -local minetest,math,vector,ipairs = minetest,math,vector,ipairs +local minetest, math, vector, ipairs = minetest, math, vector, ipairs --this is used for the player pool in the sound buffer local pool = {} @@ -38,7 +38,7 @@ item_drop_settings.drop_single_item = false --if true, the drop control dro item_drop_settings.magnet_time = 0.75 -- how many seconds an item follows the player before giving up -local get_gravity = function() +local function get_gravity() return tonumber(minetest.settings:get("movement_gravity")) or 9.81 end @@ -60,7 +60,7 @@ mcl_item_entity.register_pickup_achievement("mcl_mobitems:blaze_rod", "mcl:blaze mcl_item_entity.register_pickup_achievement("mcl_mobitems:leather", "mcl:killCow") mcl_item_entity.register_pickup_achievement("mcl_core:diamond", "mcl:diamonds") -local check_pickup_achievements = function(object, player) +local function check_pickup_achievements(object, player) if has_awards then local itemname = ItemStack(object:get_luaentity().itemstring):get_name() local playername = player:get_player_name() @@ -72,7 +72,7 @@ local check_pickup_achievements = function(object, player) end end -local enable_physics = function(object, luaentity, ignore_check) +local function enable_physics(object, luaentity, ignore_check) if luaentity.physical_state == false or ignore_check == true then luaentity.physical_state = true object:set_properties({ @@ -83,7 +83,7 @@ local enable_physics = function(object, luaentity, ignore_check) end end -local disable_physics = function(object, luaentity, ignore_check, reset_movement) +local function disable_physics(object, luaentity, ignore_check, reset_movement) if luaentity.physical_state == true or ignore_check == true then luaentity.physical_state = false object:set_properties({ @@ -98,13 +98,11 @@ end minetest.register_globalstep(function(dtime) - tick = not tick for _,player in pairs(minetest.get_connected_players()) do if player:get_hp() > 0 or not minetest.settings:get_bool("enable_damage") then - local name = player:get_player_name() local pos = player:get_pos() diff --git a/mods/ENTITIES/mcl_minecarts/init.lua b/mods/ENTITIES/mcl_minecarts/init.lua index e741fb0bc..6fd98f550 100644 --- a/mods/ENTITIES/mcl_minecarts/init.lua +++ b/mods/ENTITIES/mcl_minecarts/init.lua @@ -496,7 +496,7 @@ local function register_entity(entity_id, mesh, textures, drop, on_rightclick, o end -- Place a minecart at pointed_thing -mcl_minecarts.place_minecart = function(itemstack, pointed_thing, placer) +function mcl_minecarts.place_minecart(itemstack, pointed_thing, placer) if not pointed_thing.type == "node" then return end @@ -540,7 +540,7 @@ mcl_minecarts.place_minecart = function(itemstack, pointed_thing, placer) end -local register_craftitem = function(itemstring, entity_id, description, tt_help, longdesc, usagehelp, icon, creative) +local function register_craftitem(itemstring, entity_id, description, tt_help, longdesc, usagehelp, icon, creative) entity_mapping[itemstring] = entity_id local groups = { minecart = 1, transport = 1 } diff --git a/mods/ENTITIES/mcl_minecarts/rails.lua b/mods/ENTITIES/mcl_minecarts/rails.lua index 4c26aea8c..53ec86d94 100644 --- a/mods/ENTITIES/mcl_minecarts/rails.lua +++ b/mods/ENTITIES/mcl_minecarts/rails.lua @@ -1,7 +1,7 @@ local S = minetest.get_translator("mcl_minecarts") -- Template rail function -local register_rail = function(itemstring, tiles, def_extras, creative) +local function register_rail(itemstring, tiles, def_extras, creative) local groups = {handy=1,pickaxey=1, attached_node=1,rail=1,connect_to_raillike=minetest.raillike_group("rail"),dig_by_water=1,destroy_by_lava_flow=1, transport=1} if creative == false then groups.not_in_creative_inventory = 1 diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua index ef2687455..894a1f5e4 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -13,9 +13,8 @@ local minetest_get_node_light = minetest.get_node_light local DOUBLE_PI = math.pi * 2 local THIRTY_SECONDTH_PI = DOUBLE_PI * 0.03125 - --a simple helper function which is too small to move into movement.lua -local quick_rotate = function(self,dtime) +local function quick_rotate(self,dtime) self.yaw = self.yaw + THIRTY_SECONDTH_PI if self.yaw > DOUBLE_PI then self.yaw = self.yaw - DOUBLE_PI @@ -39,7 +38,7 @@ end ]]-- --this is basically reverse jump_check -local cliff_check = function(self,dtime) +local function cliff_check(self,dtime) --mobs will flip out if they are falling without this if self.object:get_velocity().y ~= 0 then return false @@ -115,7 +114,7 @@ local function land_state_switch(self, dtime) end -- states are executed here -local land_state_execution = function(self,dtime) +local function land_state_execution(self, dtime) --[[ -- this is a debug which shows the timer and makes mobs breed 100 times faster print(self.breed_timer) @@ -391,7 +390,7 @@ end -- state switching logic (stand, walk, run, attacks) local swim_state_list_wandering = {"stand", "swim"} -local swim_state_switch = function(self, dtime) +local function swim_state_switch(self, dtime) self.state_timer = self.state_timer - dtime if self.state_timer <= 0 then self.state_timer = math.random(4,10) + math.random() @@ -401,7 +400,7 @@ end --check if a mob needs to turn while swimming -local swim_turn_check = function(self,dtime) +local function swim_turn_check(self,dtime) local pos = self.object:get_pos() pos.y = pos.y + 0.1 @@ -420,8 +419,7 @@ local swim_turn_check = function(self,dtime) end --this is to swap the built in engine acceleration modifier -local swim_physics_swapper = function(self,inside_swim_node) - +local function swim_physics_swapper(self, inside_swim_node) --should be swimming, gravity is applied, switch to floating if inside_swim_node and self.object:get_acceleration().y ~= 0 then self.object:set_acceleration(vector.new(0,0,0)) @@ -435,7 +433,7 @@ end local random_pitch_multiplier = {-1,1} -- states are executed here -local swim_state_execution = function(self,dtime) +local function swim_state_execution(self, dtime) local pos = self.object:get_pos() @@ -452,7 +450,7 @@ local swim_state_execution = function(self,dtime) end --turn gravity on or off - swim_physics_swapper(self,inside_swim_node) + swim_physics_swapper(self, inside_swim_node) --swim properly if inside swim node if inside_swim_node then @@ -530,7 +528,7 @@ ______ _ -- state switching logic (stand, walk, run, attacks) local fly_state_list_wandering = {"stand", "fly"} -local fly_state_switch = function(self, dtime) +local function fly_state_switch(self, dtime) if self.hostile and self.attacking then self.state = "attack" @@ -546,7 +544,7 @@ end --check if a mob needs to turn while flying -local fly_turn_check = function(self,dtime) +local function fly_turn_check(self, dtime) local pos = self.object:get_pos() pos.y = pos.y + 0.1 @@ -565,7 +563,7 @@ local fly_turn_check = function(self,dtime) end --this is to swap the built in engine acceleration modifier -local fly_physics_swapper = function(self,inside_fly_node) +local function fly_physics_swapper(self, inside_fly_node) --should be flyming, gravity is applied, switch to floating if inside_fly_node and self.object:get_acceleration().y ~= 0 then @@ -580,7 +578,7 @@ end local random_pitch_multiplier = {-1,1} -- states are executed here -local fly_state_execution = function(self,dtime) +local function fly_state_execution(self, dtime) local pos = self.object:get_pos() pos.y = pos.y + 0.1 local current_node = minetest_get_node(pos).name @@ -794,7 +792,7 @@ ___ ___ _ _ _ ]]-- --the main loop -mobs.mob_step = function(self, dtime) +function mobs.mob_step(self, dtime) --do not continue if non-existent if not self or not self.object or not self.object:get_luaentity() then diff --git a/mods/ENTITIES/mcl_mobs/api/spawning.lua b/mods/ENTITIES/mcl_mobs/api/spawning.lua index bf7176b99..70167b421 100644 --- a/mods/ENTITIES/mcl_mobs/api/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/api/spawning.lua @@ -167,7 +167,7 @@ Overworld regular: -- count how many mobs are in an area -local count_mobs = function(pos) +local function count_mobs(pos) local num = 0 for _,object in pairs(get_objects_inside_radius(pos, aoc_range)) do if object and object:get_luaentity() and object:get_luaentity()._cmi_is_mob then @@ -242,8 +242,7 @@ function mobs:spawn_specific(name, dimension, type_of_spawning, biomes, min_ligh end --[[ - local spawn_action - spawn_action = function(pos, node, active_object_count, active_object_count_wider, name) + local function spawn_action(pos, node, active_object_count, active_object_count_wider, name) local orig_pos = table.copy(pos) -- is mob actually registered? @@ -486,7 +485,8 @@ local axis local inner = 15 local outer = 64 local int = {-1,1} -local position_calculation = function(pos) + +local function position_calculation(pos) pos = vector_floor(pos) diff --git a/mods/ITEMS/REDSTONE/mesecons/presets.lua b/mods/ITEMS/REDSTONE/mesecons/presets.lua index f624c52fe..d9d8418d8 100644 --- a/mods/ITEMS/REDSTONE/mesecons/presets.lua +++ b/mods/ITEMS/REDSTONE/mesecons/presets.lua @@ -96,12 +96,12 @@ local function rules_from_dir(ruleset, dir) if dir.z == -1 then return ruleset.zn end end -mesecon.rules.buttonlike_get = function(node) +function mesecon.rules.buttonlike_get(node) local dir = minetest.facedir_to_dir(node.param2) return rules_from_dir(rules_buttonlike, dir) end -mesecon.rules.wallmounted_get = function(node) +function mesecon.rules.wallmounted_get(node) local dir = minetest.wallmounted_to_dir(node.param2) return rules_from_dir(rules_wallmounted, dir) end diff --git a/mods/ITEMS/REDSTONE/mesecons/services.lua b/mods/ITEMS/REDSTONE/mesecons/services.lua index 1e3e6237b..7d1fce2d8 100644 --- a/mods/ITEMS/REDSTONE/mesecons/services.lua +++ b/mods/ITEMS/REDSTONE/mesecons/services.lua @@ -1,6 +1,6 @@ -- Dig and place services -mesecon.on_placenode = function(pos, node) +function mesecon.on_placenode(pos, node) mesecon.execute_autoconnect_hooks_now(pos, node) -- Receptors: Send on signal when active @@ -70,7 +70,7 @@ mesecon.on_placenode = function(pos, node) end end -mesecon.on_dignode = function(pos, node) +function mesecon.on_dignode(pos, node) if mesecon.is_conductor_on(node) then mesecon.receptor_off(pos, mesecon.conductor_get_rules(node)) elseif mesecon.is_receptor_on(node.name) then @@ -95,7 +95,7 @@ mesecon.on_dignode = function(pos, node) mesecon.execute_autoconnect_hooks_queue(pos, node) end -mesecon.on_blastnode = function(pos, node) +function mesecon.on_blastnode(pos, node) local node = minetest.get_node(pos) minetest.remove_node(pos) mesecon.on_dignode(pos, node) diff --git a/mods/ITEMS/REDSTONE/mesecons_button/init.lua b/mods/ITEMS/REDSTONE/mesecons_button/init.lua index 377a24c00..a8c671004 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_button/init.lua @@ -21,7 +21,7 @@ local boxes_on = { } -- Push the button -mesecon.push_button = function(pos, node) +function mesecon.push_button(pos, node) -- No-op if button is already pushed if mesecon.is_receptor_on(node) then return diff --git a/mods/ITEMS/mcl_fences/init.lua b/mods/ITEMS/mcl_fences/init.lua index e60782215..ddd85d470 100644 --- a/mods/ITEMS/mcl_fences/init.lua +++ b/mods/ITEMS/mcl_fences/init.lua @@ -20,7 +20,7 @@ local cz2 = {-2/16, -0.5, 2/16, 2/16, 1.01, 0.5} --unten(quer) z mcl_fences = {} -mcl_fences.register_fence = function(id, fence_name, texture, groups, hardness, blast_resistance, connects_to, sounds) +function mcl_fences.register_fence(id, fence_name, texture, groups, hardness, blast_resistance, connects_to, sounds) local cgroups = table.copy(groups) if cgroups == nil then cgroups = {} end cgroups.fence = 1 @@ -72,7 +72,7 @@ mcl_fences.register_fence = function(id, fence_name, texture, groups, hardness, return fence_id end -mcl_fences.register_fence_gate = function(id, fence_gate_name, texture, groups, hardness, blast_resistance, sounds, sound_open, sound_close, sound_gain_open, sound_gain_close) +function mcl_fences.register_fence_gate(id, fence_gate_name, texture, groups, hardness, blast_resistance, sounds, sound_open, sound_close, sound_gain_open, sound_gain_close) local meta2 local state2 = 0 diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index 176fb250c..f1a95fec6 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -522,7 +522,7 @@ end -- * pointed_thing: Pointed thing to ignite -- * player: Player who sets fire or nil if nobody -- * allow_on_fire: If false, can't ignite fire on fire (default: true) -mcl_fire.set_fire = function(pointed_thing, player, allow_on_fire) +function mcl_fire.set_fire(pointed_thing, player, allow_on_fire) local pname if player == nil then pname = "" diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index cc7c5cca5..567e96e96 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -305,7 +305,7 @@ local flying_bobber_ENTITY={ } -- Movement function of flying bobber -local flying_bobber_on_step = function(self, dtime) +local function flying_bobber_on_step(self, dtime) self.timer=self.timer+dtime local pos = self.object:get_pos() local node = minetest.get_node(pos) @@ -315,12 +315,9 @@ local flying_bobber_on_step = function(self, dtime) -- Destroy when hitting a solid node if self._lastpos.x~=nil then if (def and (def.walkable or def.liquidtype == "flowing" or def.liquidtype == "source")) or not def then - local make_child= function(object) - local ent = object:get_luaentity() - ent.player = self._thrower - ent.child = true - end - make_child(minetest.add_entity(self._lastpos, "mcl_fishing:bobber_entity")) + local ent = minetest.add_entity(self._lastpos, "mcl_fishing:bobber_entity"):get_luaentity() + ent.player = self._thrower + ent.child = true self.object:remove() return end diff --git a/mods/ITEMS/xpanes/init.lua b/mods/ITEMS/xpanes/init.lua index b7faffb3b..472b3efdf 100644 --- a/mods/ITEMS/xpanes/init.lua +++ b/mods/ITEMS/xpanes/init.lua @@ -170,7 +170,7 @@ end local canonical_color = "yellow" -- Register glass pane (stained and unstained) -local pane = function(description, node, append) +local function pane(description, node, append) local texture1, longdesc, entry_name, create_entry local is_canonical = true -- Special case: Default (unstained) glass texture diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 4e01df5f2..9108b75c1 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -1775,7 +1775,7 @@ local function register_biomelike_ores() -- Mesa strata (registered as sheet ores) -- Helper function to create strata. - local stratum = function(y_min, height, color, seed, is_perfect) + local function stratum(y_min, height, color, seed, is_perfect) if not height then height = 1 end @@ -3079,7 +3079,7 @@ local function register_decorations() }) -- Doubletall grass - local register_doubletall_grass = function(offset, scale, biomes) + local function register_doubletall_grass(offset, scale, biomes) for b=1, #biomes do local param2 = minetest.registered_biomes[biomes[b]]._mcl_palette_index @@ -3115,7 +3115,7 @@ local function register_decorations() register_doubletall_grass(-0.0005, -0.03, {"Savanna", "SavannaM"}) -- Large ferns - local register_double_fern = function(offset, scale, biomes) + local function register_double_fern(offset, scale, biomes) for b=1, #biomes do local param2 = minetest.registered_biomes[biomes[b]]._mcl_palette_index minetest.register_decoration({ @@ -3149,7 +3149,7 @@ local function register_decorations() register_double_fern(0.15, 0.1, { "JungleM" }) -- Large flowers - local register_large_flower = function(name, biomes, seed, offset, flower_forest_offset) + local function register_large_flower(name, biomes, seed, offset, flower_forest_offset) local maxi if flower_forest_offset then maxi = 2 diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 285da25c2..b3db122e6 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -765,7 +765,7 @@ local function register_mgv6_decorations() }) -- Large flowers - local register_large_flower = function(name, seed, offset) + local function register_large_flower(name, seed, offset) minetest.register_decoration({ deco_type = "schematic", schematic = { @@ -1169,7 +1169,7 @@ end -- minp and maxp (from an on_generated callback) and returns the real world coordinates -- as X, Z. -- Inverse function of xz_to_biomemap ---[[local biomemap_to_xz = function(index, minp, maxp) +--[[local function biomemap_to_xz(index, minp, maxp) local xwidth = maxp.x - minp.x + 1 local zwidth = maxp.z - minp.z + 1 local x = ((index-1) % xwidth) + minp.x @@ -1180,7 +1180,7 @@ end]] -- Takes x and z coordinates and minp and maxp of a generated chunk -- (in on_generated callback) and returns a biomemap index) -- Inverse function of biomemap_to_xz -local xz_to_biomemap_index = function(x, z, minp, maxp) +local function xz_to_biomemap_index(x, z, minp, maxp) local xwidth = maxp.x - minp.x + 1 local zwidth = maxp.z - minp.z + 1 local minix = x % xwidth @@ -1404,7 +1404,7 @@ local function generate_structures(minp, maxp, blockseed, biomemap) -- TODO: Spawn witch in or around hut when the mob sucks less. - local place_tree_if_free = function(pos, prev_result) + local function place_tree_if_free(pos, prev_result) local nn = minetest.get_node(pos).name if nn == "mcl_flowers:waterlily" or nn == "mcl_core:water_source" or nn == "mcl_core:water_flowing" or nn == "air" then minetest.set_node(pos, {name="mcl_core:tree", param2=0}) @@ -1720,7 +1720,7 @@ end -- Generate mushrooms in caves manually. -- Minetest's API does not support decorations in caves yet. :-( -local generate_underground_mushrooms = function(minp, maxp, seed) +local function generate_underground_mushrooms(minp, maxp, seed) local pr_shroom = PseudoRandom(seed-24359) -- Generate rare underground mushrooms -- TODO: Make them appear in groups, use Perlin noise @@ -1754,7 +1754,7 @@ else end -- Generate Nether decorations manually: Eternal fire, mushrooms, nether wart -- Minetest's API does not support decorations in caves yet. :-( -local generate_nether_decorations = function(minp, maxp, seed) +local function generate_nether_decorations(minp, maxp, seed) local pr_nether = PseudoRandom(seed+667) if minp.y > mcl_vars.mg_nether_max or maxp.y < mcl_vars.mg_nether_min then @@ -1771,7 +1771,7 @@ local generate_nether_decorations = function(minp, maxp, seed) local ssand = minetest.find_nodes_in_area_under_air(minp, maxp, {"mcl_nether:soul_sand"}) -- Helper function to spawn “fake” decoration - local special_deco = function(nodes, spawn_func) + local function special_deco(nodes, spawn_func) for n = 1, #nodes do bpos = {x = nodes[n].x, y = nodes[n].y + 1, z = nodes[n].z } @@ -1912,7 +1912,7 @@ end local bedrock_check if mcl_vars.mg_bedrock_is_rough then - bedrock_check = function(pos, _, pr) + function bedrock_check(pos, _, pr) local y = pos.y -- Bedrock layers with increasing levels of roughness, until a perfecly flat bedrock later at the bottom layer -- This code assumes a bedrock height of 5 layers. diff --git a/mods/MAPGEN/mcl_strongholds/init.lua b/mods/MAPGEN/mcl_strongholds/init.lua index e465b2e40..083172a3c 100644 --- a/mods/MAPGEN/mcl_strongholds/init.lua +++ b/mods/MAPGEN/mcl_strongholds/init.lua @@ -25,7 +25,7 @@ local superflat = mg_name == "flat" and minetest.get_mapgen_setting("mcl_superfl -- The stronghold positions are based on the world seed. -- The actual position might be offset by a few blocks because it might be shifted -- to make sure the end portal room is completely within the boundaries of a mapchunk. -local init_strongholds = function() +local function init_strongholds() if strongholds_inited then return end @@ -67,7 +67,7 @@ local init_strongholds = function() end -- Stronghold generation for register_on_generated. -local generate_strongholds = function(minp, maxp, blockseed) +local function generate_strongholds(minp, maxp, blockseed) local pr = PseudoRandom(blockseed) for s=1, #strongholds do if not strongholds[s].generated then diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index f939b9c1a..dfb7da24b 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -1,5 +1,9 @@ -local S = minetest.get_translator("mcl_structures") -mcl_structures ={} +local modname = minetest.get_current_modname() +local S = minetest.get_translator(modname) +local modpath = minetest.get_modpath(modname) + +mcl_structures = {} + local rotations = { "0", "90", @@ -14,7 +18,8 @@ local function ecb_place(blockpos, action, calls_remaining, param) param.after_placement_callback(param.p1, param.p2, param.size, param.rotation, param.pr, param.callback_param) end end -mcl_structures.place_schematic = function(pos, schematic, rotation, replacements, force_placement, flags, after_placement_callback, pr, callback_param) + +function mcl_structures.place_schematic(pos, schematic, rotation, replacements, force_placement, flags, after_placement_callback, pr, callback_param) local s = loadstring(minetest.serialize_schematic(schematic, "lua", {lua_use_comments = false, lua_num_indent_spaces = 0}) .. " return schematic")() if s and s.size then local x, z = s.size.x, s.size.z @@ -37,7 +42,7 @@ mcl_structures.place_schematic = function(pos, schematic, rotation, replacements end end -mcl_structures.get_struct = function(file) +function mcl_structures.get_struct(file) local localfile = minetest.get_modpath("mcl_structures").."/schematics/"..file local file, errorload = io.open(localfile, "rb") if errorload ~= nil then @@ -53,7 +58,7 @@ end -- Call on_construct on pos. -- Useful to init chests from formspec. -local init_node_construct = function(pos) +local function init_node_construct(pos) local node = minetest.get_node(pos) local def = minetest.registered_nodes[node.name] if def and def.on_construct then @@ -64,7 +69,7 @@ local init_node_construct = function(pos) end -- The call of Struct -mcl_structures.call_struct = function(pos, struct_style, rotation, pr) +function mcl_structures.call_struct(pos, struct_style, rotation, pr) minetest.log("action","[mcl_structures] call_struct " .. struct_style.." at "..minetest.pos_to_string(pos)) if not rotation then rotation = "random" @@ -96,13 +101,13 @@ mcl_structures.call_struct = function(pos, struct_style, rotation, pr) end end -mcl_structures.generate_desert_well = function(pos, rot) +function mcl_structures.generate_desert_well(pos, rot) local newpos = {x=pos.x,y=pos.y-2,z=pos.z} - local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_desert_well.mts" + local path = modpath.."/schematics/mcl_structures_desert_well.mts" return mcl_structures.place_schematic(newpos, path, rot or "0", nil, true) end -mcl_structures.generate_igloo = function(pos, rotation, pr) +function mcl_structures.generate_igloo(pos, rotation, pr) -- Place igloo local success, rotation = mcl_structures.generate_igloo_top(pos, pr) -- Place igloo basement with 50% chance @@ -148,7 +153,7 @@ mcl_structures.generate_igloo = function(pos, rotation, pr) else return success end - local set_brick = function(pos) + local function set_brick(pos) local c = pr:next(1, 3) -- cracked chance local m = pr:next(1, 10) -- chance for monster egg local brick @@ -198,11 +203,11 @@ mcl_structures.generate_igloo = function(pos, rotation, pr) return success end -mcl_structures.generate_igloo_top = function(pos, pr) +function mcl_structures.generate_igloo_top(pos, pr) -- FIXME: This spawns bookshelf instead of furnace. Fix this! -- Furnace does ot work atm because apparently meta is not set. :-( local newpos = {x=pos.x,y=pos.y-1,z=pos.z} - local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_igloo_top.mts" + local path = modpath.."/schematics/mcl_structures_igloo_top.mts" local rotation = tostring(pr:next(0,3)*90) return mcl_structures.place_schematic(newpos, path, rotation, nil, true), rotation end @@ -250,22 +255,22 @@ local function igloo_placement_callback(p1, p2, size, orientation, pr) mcl_loot.fill_inventory(inv, "main", lootitems, pr) end -mcl_structures.generate_igloo_basement = function(pos, orientation, pr) +function mcl_structures.generate_igloo_basement(pos, orientation, pr) -- TODO: Add brewing stand -- TODO: Add monster eggs -- TODO: Spawn villager and zombie villager - local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_igloo_basement.mts" + local path = modpath.."/schematics/mcl_structures_igloo_basement.mts" mcl_structures.place_schematic(pos, path, orientation, nil, true, nil, igloo_placement_callback, pr) end -mcl_structures.generate_boulder = function(pos, rotation, pr) +function mcl_structures.generate_boulder(pos, rotation, pr) -- Choose between 2 boulder sizes (2×2×2 or 3×3×3) local r = pr:next(1, 10) local path if r <= 3 then - path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_boulder_small.mts" + path = modpath.."/schematics/mcl_structures_boulder_small.mts" else - path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_boulder.mts" + path = modpath.."/schematics/mcl_structures_boulder.mts" end local newpos = {x=pos.x,y=pos.y-1,z=pos.z} @@ -284,22 +289,22 @@ local function hut_placement_callback(p1, p2, size, orientation, pr) end end -mcl_structures.generate_witch_hut = function(pos, rotation, pr) +function mcl_structures.generate_witch_hut(pos, rotation, pr) local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_witch_hut.mts" mcl_structures.place_schematic(pos, path, rotation, nil, true, nil, hut_placement_callback, pr) end -mcl_structures.generate_ice_spike_small = function(pos, rotation) +function mcl_structures.generate_ice_spike_small(pos, rotation) local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_ice_spike_small.mts" return minetest.place_schematic(pos, path, rotation or "random", nil, false) -- don't serialize schematics for registered biome decorations, for MT 5.4.0 end -mcl_structures.generate_ice_spike_large = function(pos, rotation) +function mcl_structures.generate_ice_spike_large(pos, rotation) local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_ice_spike_large.mts" return minetest.place_schematic(pos, path, rotation or "random", nil, false) -- don't serialize schematics for registered biome decorations, for MT 5.4.0 end -mcl_structures.generate_fossil = function(pos, rotation, pr) +function mcl_structures.generate_fossil(pos, rotation, pr) -- Generates one out of 8 possible fossil pieces local newpos = {x=pos.x,y=pos.y-1,z=pos.z} local fossils = { @@ -317,17 +322,17 @@ mcl_structures.generate_fossil = function(pos, rotation, pr) return mcl_structures.place_schematic(newpos, path, rotation or "random", nil, true) end -mcl_structures.generate_end_exit_portal = function(pos, rot) +function mcl_structures.generate_end_exit_portal(pos, rot) local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_end_exit_portal.mts" return mcl_structures.place_schematic(pos, path, rot or "0", {["mcl_portals:portal_end"] = "air"}, true) end -mcl_structures.generate_end_exit_portal_open = function(pos, rot) +function mcl_structures.generate_end_exit_portal_open(pos, rot) local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_end_exit_portal.mts" return mcl_structures.place_schematic(pos, path, rot or "0", nil, true) end -mcl_structures.generate_end_gateway_portal = function(pos, rot) +function mcl_structures.generate_end_gateway_portal(pos, rot) local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_end_gateway_portal.mts" return mcl_structures.place_schematic(pos, path, rot or "0", nil, true) end @@ -410,7 +415,7 @@ local function shrine_placement_callback(p1, p2, size, rotation, pr) end end -mcl_structures.generate_end_portal_shrine = function(pos, rotation, pr) +function mcl_structures.generate_end_portal_shrine(pos, rotation, pr) local offset = {x=6, y=4, z=6} --local size = {x=13, y=8, z=13} local newpos = { x = pos.x - offset.x, y = pos.y, z = pos.z - offset.z } @@ -493,7 +498,7 @@ local function temple_placement_callback(p1, p2, size, rotation, pr) end end -mcl_structures.generate_desert_temple = function(pos, rotation, pr) +function mcl_structures.generate_desert_temple(pos, rotation, pr) -- No Generating for the temple ... Why using it ? No Change local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_desert_temple.mts" local newpos = {x=pos.x,y=pos.y-12,z=pos.z} @@ -517,7 +522,7 @@ Format of return value: TODO: Implement this function for all other structure types as well. ]] -mcl_structures.get_registered_structures = function(structure_type) +function mcl_structures.get_registered_structures(structure_type) if registered_structures[structure_type] then return table.copy(registered_structures[structure_type]) else @@ -527,7 +532,7 @@ end -- Register a structures table for the given type. The table format is the same as for -- mcl_structures.get_registered_structures. -mcl_structures.register_structures = function(structure_type, structures) +function mcl_structures.register_structures(structure_type, structures) registered_structures[structure_type] = structures end diff --git a/mods/MAPGEN/mcl_villages/const.lua b/mods/MAPGEN/mcl_villages/const.lua index e5cbc9b39..eb7806209 100644 --- a/mods/MAPGEN/mcl_villages/const.lua +++ b/mods/MAPGEN/mcl_villages/const.lua @@ -1,5 +1,5 @@ -- switch for debugging -settlements.debug = function(message) +function settlements.debug(message) -- minetest.chat_send_all(message) -- minetest.log("warning", "[mcl_villages] "..message) minetest.log("verbose", "[mcl_villages] "..message) diff --git a/mods/MAPGEN/tsm_railcorridors/gameconfig.lua b/mods/MAPGEN/tsm_railcorridors/gameconfig.lua index 904c3af08..168ecf535 100644 --- a/mods/MAPGEN/tsm_railcorridors/gameconfig.lua +++ b/mods/MAPGEN/tsm_railcorridors/gameconfig.lua @@ -27,7 +27,7 @@ if mg_name == "v6" then } else -- This generates dark oak wood in mesa biomes and oak wood everywhere else. - tsm_railcorridors.nodes.corridor_woods_function = function(pos, node) + function tsm_railcorridors.nodes.corridor_woods_function(pos, node) if minetest.get_item_group(node.name, "hardened_clay") ~= 0 then return "mcl_core:darkwood", "mcl_fences:dark_oak_fence" else diff --git a/mods/MAPGEN/tsm_railcorridors/init.lua b/mods/MAPGEN/tsm_railcorridors/init.lua index 550167dc3..d7a074a00 100644 --- a/mods/MAPGEN/tsm_railcorridors/init.lua +++ b/mods/MAPGEN/tsm_railcorridors/init.lua @@ -681,11 +681,11 @@ local function create_corridor_section(waypoint, axis, sign, up_or_down, up_or_d railsegcount = segcount end for i=1,railsegcount do - local p = {x=waypoint.x+vek.x*i, y=waypoint.y+vek.y*i-1, z=waypoint.z+vek.z*i} + local p = {x = waypoint.x + vek.x * i, y = waypoint.y + vek.y * i-1, z = waypoint.z + vek.z * i} -- Randomly returns either the left or right side of the main rail. -- Also returns offset as second return value. - local left_or_right = function(pos, vek) + local function left_or_right(pos, vek) local off if pr:next(1, 2) == 1 then -- left @@ -765,7 +765,7 @@ local function create_corridor_section(waypoint, axis, sign, up_or_down, up_or_d -- Place cobwebs left and right in the corridor if place_cobwebs and tsm_railcorridors.nodes.cobweb then -- Helper function to place a cobweb at the side (based on chance an Perlin noise) - local cobweb_at_side = function(basepos, vek) + local function cobweb_at_side(basepos, vek) if pr:next(1,5) == 1 then local h = pr:next(0, 2) -- 3 possible cobweb heights local cpos = {x=basepos.x+vek.x, y=basepos.y+h, z=basepos.z+vek.z} diff --git a/mods/PLAYER/mcl_playerinfo/init.lua b/mods/PLAYER/mcl_playerinfo/init.lua index 5086f3195..9c5d1433f 100644 --- a/mods/PLAYER/mcl_playerinfo/init.lua +++ b/mods/PLAYER/mcl_playerinfo/init.lua @@ -1,3 +1,5 @@ +local table = table + -- Player state for public API mcl_playerinfo = {} @@ -21,7 +23,7 @@ end local time = 0 -local get_player_nodes = function(player_pos) +local function get_player_nodes(player_pos) local work_pos = table.copy(player_pos) -- what is around me? diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 40752b835..ceaef6346 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -25,7 +25,7 @@ local mcl_playerplus_internal = {} local time = 0 local look_pitch = 0 -local player_collision = function(player) +local function player_collision(player) local pos = player:get_pos() --local vel = player:get_velocity() @@ -48,7 +48,6 @@ local player_collision = function(player) z = z + (vec.z * force) end end - return {x,z} end @@ -57,7 +56,7 @@ local function degrees(rad) return rad * 180.0 / math.pi end -local dir_to_pitch = function(dir) +local function dir_to_pitch(dir) --local dir2 = vector.normalize(dir) local xz = math.abs(dir.x) + math.abs(dir.z) return -math.atan2(-dir.y, xz) diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index 0f23519ab..fb91d74d3 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -70,7 +70,7 @@ while true do id = id + 1 end -mcl_skins.cycle_skin = function(player) +function mcl_skins.cycle_skin(player) local skin_id = tonumber(player:get_meta():get_string("mcl_skins:skin_id")) if not skin_id then skin_id = 0 @@ -82,7 +82,7 @@ mcl_skins.cycle_skin = function(player) mcl_skins.set_player_skin(player, skin_id) end -mcl_skins.set_player_skin = function(player, skin_id) +function mcl_skins.set_player_skin(player, skin_id) if not player then return false end @@ -124,7 +124,7 @@ mcl_skins.set_player_skin = function(player, skin_id) return true end -mcl_skins.update_player_skin = function(player) +function mcl_skins.update_player_skin(player) if not player then return end @@ -134,7 +134,6 @@ end -- load player skin on join minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() local skin_id = player:get_meta():get_string("mcl_skins:skin_id") local set_skin @@ -156,7 +155,7 @@ end) mcl_skins.registered_on_set_skins = {} -mcl_skins.register_on_set_skin = function(func) +function mcl_skins.register_on_set_skin(func) table.insert(mcl_skins.registered_on_set_skins, func) end @@ -231,7 +230,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end) -mcl_skins.show_formspec = function(playername) +function mcl_skins.show_formspec(playername) local formspec = "size[7,8.5]" formspec = formspec .. "label[2,2;" .. minetest.formspec_escape(minetest.colorize("#383838", S("Select player skin:"))) .. "]" diff --git a/mods/PLAYER/mcl_sprint/init.lua b/mods/PLAYER/mcl_sprint/init.lua index 12d0394e5..546a5f4f0 100644 --- a/mods/PLAYER/mcl_sprint/init.lua +++ b/mods/PLAYER/mcl_sprint/init.lua @@ -16,7 +16,7 @@ local players = {} -- Returns true if the player with the given name is sprinting, false if not. -- Returns nil if player does not exist. -mcl_sprint.is_sprinting = function(playername) +function mcl_sprint.is_sprinting(playername) if players[playername] then return players[playername].sprinting else From 49044ac15e8bcc01044a4caf9ffa2c405723d02f Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 25 May 2021 13:18:12 +0200 Subject: [PATCH 089/103] unify codestyle [2] --- CONTRIBUTING.md | 22 ++++++++++++++++++++++ mods/ENVIRONMENT/mcl_moon/init.lua | 4 ++-- mods/ENVIRONMENT/mcl_weather/rain.lua | 24 +++++++++++------------- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5758d194f..023d89de8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -46,6 +46,28 @@ Your commit names should be relatively descriptive, e.g. when saying "Fix #issue Contributors will be credited in `CREDITS.md`. +## Code Style + +Each mod must provide `mod.conf`. +Each mod which add API functions should store functions inside a global table named like the mod. +Object oriented API shoud be avoided e.g.:`function mobs.register_mod(self)` +Functions should be defined in this way: +``` +function mcl_xyz.stuff(param) end +``` +Insteed of this way: +``` +mcl_xyz.stuff = function(param) end +``` +Indentation must be unified, more likely with tabs. + +Time sensitive mods should make a local copy of most used API functions to improve performances. +``` +local vector = vector +local get_node = minetest.get_node +``` + + ## Features > 1.12 If you want to make a feature that was added in a Minecraft version later than 1.12, you should fork MineClone5 (mineclone5 branch in the repository) and add your changes to this. diff --git a/mods/ENVIRONMENT/mcl_moon/init.lua b/mods/ENVIRONMENT/mcl_moon/init.lua index 1a5030b4e..200c6ca41 100644 --- a/mods/ENVIRONMENT/mcl_moon/init.lua +++ b/mods/ENVIRONMENT/mcl_moon/init.lua @@ -13,7 +13,7 @@ minetest.log("info", "[mcl_moon] Moon phase offset of this world: "..phase_offse mcl_moon = {} mcl_moon.MOON_PHASES = MOON_PHASES -mcl_moon.get_moon_phase = function() +function mcl_moon.get_moon_phase() local after_midday = 0 -- Moon phase changes after midday local tod = minetest.get_timeofday() @@ -23,7 +23,7 @@ mcl_moon.get_moon_phase = function() return (minetest.get_day_count() + phase_offset + after_midday) % MOON_PHASES end -local get_moon_texture = function() +local function get_moon_texture() local phase = mcl_moon.get_moon_phase() local x = phase % MOON_PHASES_HALF local y diff --git a/mods/ENVIRONMENT/mcl_weather/rain.lua b/mods/ENVIRONMENT/mcl_weather/rain.lua index 786e08fa9..c128da942 100644 --- a/mods/ENVIRONMENT/mcl_weather/rain.lua +++ b/mods/ENVIRONMENT/mcl_weather/rain.lua @@ -20,7 +20,7 @@ mcl_weather.rain = { init_done = false, } -mcl_weather.rain.sound_handler = function(player) +function mcl_weather.rain.sound_handler(player) return minetest.sound_play("weather_rain", { to_player = player:get_player_name(), loop = true, @@ -28,7 +28,7 @@ mcl_weather.rain.sound_handler = function(player) end -- set skybox based on time (uses skycolor api) -mcl_weather.rain.set_sky_box = function() +function mcl_weather.rain.set_sky_box() if mcl_weather.state == "rain" then mcl_weather.skycolor.add_layer( "weather-pack-rain-sky", @@ -46,8 +46,7 @@ end -- creating manually parctiles instead of particles spawner because of easier to control -- spawn position. -mcl_weather.rain.add_rain_particles = function(player) - +function mcl_weather.rain.add_rain_particles(player) mcl_weather.rain.last_rp_count = 0 for i=mcl_weather.rain.particles_count, 1,-1 do local random_pos_x, random_pos_y, random_pos_z = mcl_weather.get_random_pos_by_player_look_dir(player) @@ -70,7 +69,7 @@ mcl_weather.rain.add_rain_particles = function(player) end -- Simple random texture getter -mcl_weather.rain.get_texture = function() +function mcl_weather.rain.get_texture() local texture_name local random_number = math.random() if random_number > 0.33 then @@ -85,7 +84,7 @@ end -- register player for rain weather. -- basically needs for origin sky reference and rain sound controls. -mcl_weather.rain.add_player = function(player) +function mcl_weather.rain.add_player(player) if mcl_weather.players[player:get_player_name()] == nil then local player_meta = {} player_meta.origin_sky = {player:get_sky()} @@ -95,7 +94,7 @@ end -- remove player from player list effected by rain. -- be sure to remove sound before removing player otherwise soundhandler reference will be lost. -mcl_weather.rain.remove_player = function(player) +function mcl_weather.rain.remove_player(player) local player_meta = mcl_weather.players[player:get_player_name()] if player_meta ~= nil and player_meta.origin_sky ~= nil then player:set_clouds({color="#FFF0F0E5"}) @@ -119,7 +118,7 @@ end) -- adds and removes rain sound depending how much rain particles around player currently exist. -- have few seconds delay before each check to avoid on/off sound too often -- when player stay on 'edge' where sound should play and stop depending from random raindrop appearance. -mcl_weather.rain.update_sound = function(player) +function mcl_weather.rain.update_sound(player) local player_meta = mcl_weather.players[player:get_player_name()] if player_meta ~= nil then if player_meta.sound_updated ~= nil and player_meta.sound_updated + 5 > minetest.get_gametime() then @@ -140,7 +139,7 @@ mcl_weather.rain.update_sound = function(player) end -- rain sound removed from player. -mcl_weather.rain.remove_sound = function(player) +function mcl_weather.rain.remove_sound(player) local player_meta = mcl_weather.players[player:get_player_name()] if player_meta ~= nil and player_meta.sound_handler ~= nil then minetest.sound_fade(player_meta.sound_handler, -0.5, 0.0) @@ -150,7 +149,7 @@ mcl_weather.rain.remove_sound = function(player) end -- callback function for removing rain -mcl_weather.rain.clear = function() +function mcl_weather.rain.clear() mcl_weather.rain.raining = false mcl_weather.rain.sky_last_update = -1 mcl_weather.rain.init_done = false @@ -166,11 +165,10 @@ minetest.register_globalstep(function(dtime) if mcl_weather.state ~= "rain" then return false end - mcl_weather.rain.make_weather() end) -mcl_weather.rain.make_weather = function() +function mcl_weather.rain.make_weather() if mcl_weather.rain.init_done == false then mcl_weather.rain.raining = true mcl_weather.rain.set_sky_box() @@ -190,7 +188,7 @@ mcl_weather.rain.make_weather = function() end -- Switch the number of raindrops: "thunder" for many raindrops, otherwise for normal raindrops -mcl_weather.rain.set_particles_mode = function(mode) +function mcl_weather.rain.set_particles_mode(mode) if mode == "thunder" then mcl_weather.rain.particles_count = PARTICLES_COUNT_THUNDER else From 6105a9ef2292efe1a8a6da1a695d2e5d9baab322 Mon Sep 17 00:00:00 2001 From: NO11 Date: Tue, 25 May 2021 20:00:06 +0000 Subject: [PATCH 090/103] Fix function code style in mcl:core/crafting.lua --- mods/ITEMS/mcl_core/crafting.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/crafting.lua b/mods/ITEMS/mcl_core/crafting.lua index f031c7ca2..cec26e747 100644 --- a/mods/ITEMS/mcl_core/crafting.lua +++ b/mods/ITEMS/mcl_core/crafting.lua @@ -4,7 +4,7 @@ -- Crafting definition -- -local craft_planks = function(output, input) +local function craft_planks(output, input) minetest.register_craft({ output = "mcl_core:"..output.."wood 4", recipe = { From 4c9eeed499d225552bd7e35a4433dc1c892383bc Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 26 May 2021 16:25:16 +0200 Subject: [PATCH 091/103] Update CONTRIBUTING.md --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 023d89de8..1b5098a4f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -50,7 +50,7 @@ Contributors will be credited in `CREDITS.md`. Each mod must provide `mod.conf`. Each mod which add API functions should store functions inside a global table named like the mod. -Object oriented API shoud be avoided e.g.:`function mobs.register_mod(self)` +Public functions should not use self references but rather just access the table directly. Functions should be defined in this way: ``` function mcl_xyz.stuff(param) end From fd387a65af861e7e8fbd099f067cb9152c69b349 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 26 May 2021 16:42:12 +0200 Subject: [PATCH 092/103] fix some codestyle issues in hudbars --- mods/HUD/hudbars/init.lua | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/mods/HUD/hudbars/init.lua b/mods/HUD/hudbars/init.lua index 6f90aa03d..a88d14dcf 100644 --- a/mods/HUD/hudbars/init.lua +++ b/mods/HUD/hudbars/init.lua @@ -1,17 +1,22 @@ -local S = minetest.get_translator("hudbars") +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) + +local S = minetest.get_translator(modname) local N = function(s) return s end -hb = {} +local math = math +local table = table -hb.hudtables = {} - --- number of registered HUD bars -hb.hudbars_count = 0 - --- table which records which HUD bar slots have been “registered” so far; used for automatic positioning -hb.registered_slots = {} - -hb.settings = {} +hb = { + hudtables = {}, + -- number of registered HUD bars + hudbars_count = 0, + -- table which records which HUD bar slots have been “registered” so far; used for automatic positioning + registered_slots = {}, + settings = {}, + -- Table which contains all players with active default HUD bars (only for internal use) + players = {}, +} function hb.load_setting(sname, stype, defaultval, valid_values) local sval @@ -45,7 +50,8 @@ function hb.load_setting(sname, stype, defaultval, valid_values) end -- Load default settings -dofile(minetest.get_modpath("hudbars").."/default_settings.lua") +dofile(modpath.."/default_settings.lua") + if minetest.get_modpath("mcl_experience") and not minetest.is_creative_enabled("") then -- reserve some space for experience bar: hb.settings.start_offset_left.y = hb.settings.start_offset_left.y - 20 @@ -85,9 +91,6 @@ local function make_label(format_string, format_string_config, label, start_valu return ret end --- Table which contains all players with active default HUD bars (only for internal use) -hb.players = {} - function hb.value_to_barlength(value, max) if max == 0 then return 0 From ee9577b62597bab6368b66bf32985f03f7c6da5d Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 26 May 2021 16:43:36 +0200 Subject: [PATCH 093/103] fix functions in mcl_hbarmor --- mods/HUD/mcl_hbarmor/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/HUD/mcl_hbarmor/init.lua b/mods/HUD/mcl_hbarmor/init.lua index 9e5aa634b..f8fa6e619 100644 --- a/mods/HUD/mcl_hbarmor/init.lua +++ b/mods/HUD/mcl_hbarmor/init.lua @@ -21,11 +21,11 @@ if tonumber(set) ~= nil then end -local must_hide = function(playername, arm) +local function must_hide(playername, arm) return arm == 0 end -local arm_printable = function(arm) +local function arm_printable(arm) return math.ceil(math.floor(arm+0.5)) end From 5fc3256930545d28eca105eec0ec785558e39b1b Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 26 May 2021 16:55:32 +0200 Subject: [PATCH 094/103] fix codestyle in mcl_hbarmor --- mods/HUD/mcl_hbarmor/init.lua | 36 +++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/mods/HUD/mcl_hbarmor/init.lua b/mods/HUD/mcl_hbarmor/init.lua index f8fa6e619..422a409fb 100644 --- a/mods/HUD/mcl_hbarmor/init.lua +++ b/mods/HUD/mcl_hbarmor/init.lua @@ -1,23 +1,26 @@ -local S = minetest.get_translator("mcl_hbarmor") +local S = minetest.get_translator(minetest.get_current_modname()) -local mcl_hbarmor = {} +local math = math +local tonumber = tonumber --- HUD statbar values -mcl_hbarmor.armor = {} +local get_connected_players = minetest.get_connected_players --- Stores if player's HUD bar has been initialized so far. -mcl_hbarmor.player_active = {} +local mcl_hbarmor = { + -- HUD statbar values + armor = {}, + -- Stores if player's HUD bar has been initialized so far. + player_active = {}, + -- Time difference in seconds between updates to the HUD armor bar. + -- Increase this number for slow servers. + tick = 0.1, + -- If true, the armor bar is hidden when the player does not wear any armor + autohide = true, +} --- Time difference in seconds between updates to the HUD armor bar. --- Increase this number for slow servers. -mcl_hbarmor.tick = 0.1 +local tick_config = minetest.settings:get("mcl_hbarmor_tick") --- If true, the armor bar is hidden when the player does not wear any armor -mcl_hbarmor.autohide = true - -set = minetest.settings:get("mcl_hbarmor_tick") -if tonumber(set) ~= nil then - mcl_hbarmor.tick = tonumber(set) +if tonumber(tick_config) ~= nil then + mcl_hbarmor.tick = tonumber(tick_config) end @@ -106,12 +109,13 @@ end) local main_timer = 0 local timer = 0 minetest.register_globalstep(function(dtime) + --TODO: replace this by playerglobalstep API then implemented main_timer = main_timer + dtime timer = timer + dtime if main_timer > mcl_hbarmor.tick or timer > 4 then if minetest.settings:get_bool("enable_damage") then if main_timer > mcl_hbarmor.tick then main_timer = 0 end - for _,player in pairs(minetest.get_connected_players()) do + for _,player in pairs(get_connected_players()) do local name = player:get_player_name() if mcl_hbarmor.player_active[name] == true then local ret = mcl_hbarmor.get_armor(player) From bb77443892805a39471bc7d2776639cd2b72c87f Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 26 May 2021 17:43:42 +0000 Subject: [PATCH 095/103] [mcl_core] fix function codestyle in functions.lua --- mods/ITEMS/mcl_core/functions.lua | 36 +++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index 7f9a83bc9..f66240b94 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -53,7 +53,7 @@ minetest.register_abm({ -- -- Functions -mcl_core.grow_cactus = function(pos, node) +function mcl_core.grow_cactus(pos, node) pos.y = pos.y-1 local name = minetest.get_node(pos).name if minetest.get_item_group(name, "sand") ~= 0 then @@ -71,7 +71,7 @@ mcl_core.grow_cactus = function(pos, node) end end -mcl_core.grow_reeds = function(pos, node) +function mcl_core.grow_reeds(pos, node) pos.y = pos.y-1 local name = minetest.get_node(pos).name if minetest.get_item_group(name, "soil_sugarcane") ~= 0 then @@ -114,8 +114,8 @@ local function drop_attached_node(p) end -- Helper function for node actions for liquid flow -local liquid_flow_action = function(pos, group, action) - local check_detach = function(pos, xp, yp, zp) +local function liquid_flow_action(pos, group, action) + local function check_detach(pos, xp, yp, zp) local p = {x=pos.x+xp, y=pos.y+yp, z=pos.z+zp} local n = minetest.get_node_or_nil(p) if not n then @@ -594,13 +594,13 @@ function mcl_core.generate_v6_spruce_tree(pos) vm:write_to_map() end -mcl_core.generate_spruce_tree = function(pos) +function mcl_core.generate_spruce_tree(pos) local r = math.random(1, 3) local path = minetest.get_modpath("mcl_core") .. "/schematics/mcl_core_spruce_"..r..".mts" minetest.place_schematic({ x = pos.x - 3, y = pos.y - 1, z = pos.z - 3 }, path, "0", nil, false) end -mcl_core.generate_huge_spruce_tree = function(pos) +function mcl_core.generate_huge_spruce_tree(pos) local r1 = math.random(1, 2) local r2 = math.random(1, 4) local path @@ -911,7 +911,7 @@ minetest.register_lbm({ -------------------------- local treelight = 9 -local sapling_grow_action = function(tree_id, soil_needed, one_by_one, two_by_two, sapling) +local function sapling_grow_action(tree_id, soil_needed, one_by_one, two_by_two, sapling) return function(pos) local meta = minetest.get_meta(pos) if meta:get("grown") then return end @@ -953,7 +953,7 @@ local sapling_grow_action = function(tree_id, soil_needed, one_by_one, two_by_tw -- This sapling grows in a special way when there are 4 saplings in a 2×2 pattern if two_by_two then -- Check 8 surrounding saplings and try to find a 2×2 pattern - local is_sapling = function(pos, sapling) + local function is_sapling(pos, sapling) return minetest.get_node(pos).name == sapling end local p2 = {x=pos.x+1, y=pos.y, z=pos.z} @@ -1040,7 +1040,7 @@ local grow_birch = sapling_grow_action(BIRCH_TREE_ID, 1, true, false) -- pos: Position -- node: Node table of the node at this position, from minetest.get_node -- Returns true on success and false on failure -mcl_core.grow_sapling = function(pos, node) +function mcl_core.grow_sapling(pos, node) local grow if node.name == "mcl_core:sapling" then grow = grow_oak @@ -1245,7 +1245,7 @@ minetest.register_abm({ end -- Add vines below pos (if empty) - local spread_down = function(origin, target, dir, node) + local function spread_down(origin, target, dir, node) if math.random(1, 2) == 1 then if minetest.get_node(target).name == "air" then minetest.add_node(target, {name = "mcl_core:vine", param2 = node.param2}) @@ -1254,7 +1254,7 @@ minetest.register_abm({ end -- Add vines above pos if it is backed up - local spread_up = function(origin, target, dir, node) + local function spread_up(origin, target, dir, node) local vines_in_area = minetest.find_nodes_in_area({x=origin.x-4, y=origin.y-1, z=origin.z-4}, {x=origin.x+4, y=origin.y+1, z=origin.z+4}, "mcl_core:vine") -- Less then 4 vines blocks around the ticked vines block (remember the ticked block is counted by above function as well) if #vines_in_area < 5 then @@ -1273,7 +1273,7 @@ minetest.register_abm({ end end - local spread_horizontal = function(origin, target, dir, node) + local function spread_horizontal(origin, target, dir, node) local vines_in_area = minetest.find_nodes_in_area({x=origin.x-4, y=origin.y-1, z=origin.z-4}, {x=origin.x+4, y=origin.y+1, z=origin.z+4}, "mcl_core:vine") -- Less then 4 vines blocks around the ticked vines block (remember the ticked block is counted by above function as well) if #vines_in_area < 5 then @@ -1310,7 +1310,7 @@ minetest.register_abm({ }) -- Returns true of the node supports vines -mcl_core.supports_vines = function(nodename) +function mcl_core.supports_vines(nodename) local def = minetest.registered_nodes[nodename] -- Rules: 1) walkable 2) full cube return def.walkable and @@ -1530,7 +1530,7 @@ end -- -- The snowable nodes also MUST have _mcl_snowed defined to contain the name -- of the snowed node. -mcl_core.register_snowed_node = function(itemstring_snowed, itemstring_clear, tiles, sounds, clear_colorization, desc) +function mcl_core.register_snowed_node(itemstring_snowed, itemstring_clear, tiles, sounds, clear_colorization, desc) local def = table.copy(minetest.registered_nodes[itemstring_clear]) local create_doc_alias if def.description then @@ -1593,7 +1593,7 @@ end -- Reverts a snowed dirtlike node at pos to its original snow-less form. -- This function assumes there is no snow cover node above. This function -- MUST NOT be called if there is a snow cover node above pos. -mcl_core.clear_snow_dirt = function(pos, node) +function mcl_core.clear_snow_dirt(pos, node) local def = minetest.registered_nodes[node.name] if def._mcl_snowless then minetest.swap_node(pos, {name = def._mcl_snowless, param2=node.param2}) @@ -1605,7 +1605,7 @@ end -- on_construct -- Makes constructed snowable node snowed if placed below a snow cover node. -mcl_core.on_snowable_construct = function(pos) +function mcl_core.on_snowable_construct(pos) -- Myself local node = minetest.get_node(pos) @@ -1633,7 +1633,7 @@ end -- on_construct -- Makes snowable node below snowed. -mcl_core.on_snow_construct = function(pos) +function mcl_core.on_snow_construct(pos) local npos = {x=pos.x, y=pos.y-1, z=pos.z} local node = minetest.get_node(npos) local def = minetest.registered_nodes[node.name] @@ -1643,7 +1643,7 @@ mcl_core.on_snow_construct = function(pos) end -- after_destruct -- Clears snowed dirtlike node below. -mcl_core.after_snow_destruct = function(pos) +function mcl_core.after_snow_destruct(pos) local nn = minetest.get_node(pos).name -- No-op if snow was replaced with snow if minetest.get_item_group(nn, "snow_cover") == 1 then From 211b078d3a112c47be808afe313247c8aafc5868 Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 26 May 2021 17:51:24 +0000 Subject: [PATCH 096/103] [mcl_core] fix function codestyle in nodes_base.lua --- mods/ITEMS/mcl_core/nodes_base.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index 39015e53b..9baa6c33e 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -86,7 +86,7 @@ minetest.register_node("mcl_core:stone_with_gold", { }) local redstone_timer = 68.28 -local redstone_ore_activate = function(pos) +local function redstone_ore_activate(pos) minetest.swap_node(pos, {name="mcl_core:stone_with_redstone_lit"}) local t = minetest.get_node_timer(pos) t:start(redstone_timer) @@ -124,7 +124,7 @@ minetest.register_node("mcl_core:stone_with_redstone", { } }) -local redstone_ore_reactivate = function(pos) +local function redstone_ore_reactivate(pos) local t = minetest.get_node_timer(pos) t:start(redstone_timer) end @@ -864,7 +864,7 @@ minetest.register_node("mcl_core:packed_ice", { -- Frosted Ice (4 nodes) for i=0,3 do local ice = {} - ice.increase_age = function(pos, ice_near, first_melt) + function ice.increase_age(pos, ice_near, first_melt) -- Increase age of frosted age or turn to water source if too old local nn = minetest.get_node(pos).name local age = tonumber(string.sub(nn, -1)) From 5b433038732317304c91fa3b78505b6ebd2910ce Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 26 May 2021 17:54:58 +0000 Subject: [PATCH 097/103] [mcl_core] fix function codestyle in nodes_climb.lua --- mods/ITEMS/mcl_core/nodes_climb.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index 3b2d3ab60..ad861b4f2 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -1,7 +1,7 @@ -- Climbable nodes local S = minetest.get_translator("mcl_core") -local rotate_climbable = function(pos, node, user, mode) +local function rotate_climbable(pos, node, user, mode) if mode == screwdriver.ROTATE_FACE then local r = screwdriver.rotate.wallmounted(pos, node, mode) node.param2 = r From 90bab9026b5f7c2b89a930368d0784f1d67f0857 Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 26 May 2021 17:57:43 +0000 Subject: [PATCH 098/103] [mcl_core] fix function codestyle in nodes_liquid.lua --- mods/ITEMS/mcl_core/nodes_liquid.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/nodes_liquid.lua b/mods/ITEMS/mcl_core/nodes_liquid.lua index 99d33cf59..42276685e 100644 --- a/mods/ITEMS/mcl_core/nodes_liquid.lua +++ b/mods/ITEMS/mcl_core/nodes_liquid.lua @@ -212,7 +212,7 @@ S("• When lava is directly above water, the water turns into stone."), _mcl_hardness = -1, }) -local emit_lava_particle = function(pos) +local function emit_lava_particle(pos) local node = minetest.get_node(pos) if minetest.get_item_group(node.name, "lava_source") == 0 then return From 656891ec61412f64e3339d24e19b95954c56078a Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 26 May 2021 18:02:28 +0000 Subject: [PATCH 099/103] [mcl_core] fix function codestyle in nodes_trees.lua --- mods/ITEMS/mcl_core/nodes_trees.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_trees.lua b/mods/ITEMS/mcl_core/nodes_trees.lua index cc64cd9cf..a72935f05 100644 --- a/mods/ITEMS/mcl_core/nodes_trees.lua +++ b/mods/ITEMS/mcl_core/nodes_trees.lua @@ -8,7 +8,7 @@ if mod_screwdriver then end -- Register tree trunk (wood) and bark -local register_tree_trunk = function(subname, description_trunk, description_bark, longdesc, tile_inner, tile_bark, stripped_varient) +local function register_tree_trunk(subname, description_trunk, description_bark, longdesc, tile_inner, tile_bark, stripped_varient) minetest.register_node("mcl_core:"..subname, { description = description_trunk, _doc_items_longdesc = longdesc, @@ -91,7 +91,7 @@ local register_stripped_trunk = function(subname, description_stripped_trunk, de }) end -local register_wooden_planks = function(subname, description, tiles) +local function register_wooden_planks(subname, description, tiles) minetest.register_node("mcl_core:"..subname, { description = description, _doc_items_longdesc = doc.sub.items.temp.build, @@ -106,7 +106,7 @@ local register_wooden_planks = function(subname, description, tiles) }) end -local register_leaves = function(subname, description, longdesc, tiles, sapling, drop_apples, sapling_chances, leafdecay_distance) +local function register_leaves(subname, description, longdesc, tiles, sapling, drop_apples, sapling_chances, leafdecay_distance) if leafdecay_distance == nil then leafdecay_distance = 4 end @@ -173,7 +173,7 @@ local register_leaves = function(subname, description, longdesc, tiles, sapling, }) end -local register_sapling = function(subname, description, longdesc, tt_help, texture, selbox) +local function register_sapling(subname, description, longdesc, tt_help, texture, selbox) minetest.register_node("mcl_core:"..subname, { description = description, _tt_help = tt_help, From 1b0d6a2c2dffe94022c42892e84fbeb9c34b4c71 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 26 May 2021 20:48:00 +0200 Subject: [PATCH 100/103] Fix timing out of assist death message sources --- mods/HUD/mcl_death_messages/init.lua | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/mods/HUD/mcl_death_messages/init.lua b/mods/HUD/mcl_death_messages/init.lua index 0432c3488..107daa2a3 100644 --- a/mods/HUD/mcl_death_messages/init.lua +++ b/mods/HUD/mcl_death_messages/init.lua @@ -237,12 +237,10 @@ mcl_damage.register_on_damage(function(obj, damage, reason) end) minetest.register_globalstep(function(dtime) - local new_assist = {} - for obj, tbl in pairs(mcl_death_messages.assist) do tbl.timeout = tbl.timeout - dtime - if (obj:is_player() or obj:get_luaentity()) and tbl.timeout > 0 then - new_assist[obj] = tbl + if not obj:is_player() and not obj:get_luaentity() or tbl.timeout > 0 then + mcl_death_messages.assist[obj] = nil end end end) From 772f48ed58d81c44b6a9dbbb7cbfb2ad274deacc Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 26 May 2021 20:51:39 +0200 Subject: [PATCH 101/103] Fix crash / luacheck warning caused by armor with thorns level > 10 --- mods/ITEMS/mcl_armor/damage.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_armor/damage.lua b/mods/ITEMS/mcl_armor/damage.lua index f17033495..ed616397d 100644 --- a/mods/ITEMS/mcl_armor/damage.lua +++ b/mods/ITEMS/mcl_armor/damage.lua @@ -68,7 +68,7 @@ mcl_damage.register_modifier(function(obj, damage, reason) if do_irregular_damage or thorns_damage_regular < 4 and math.random() < enchantments.thorns * 0.15 then if do_irregular_damage then - thorns_damage_irregular = thorns_damage_irregular + throrns_level - 10 + thorns_damage_irregular = thorns_damage_irregular + enchantments.thorns - 10 else thorns_damage_regular = math.min(4, thorns_damage_regular + math.random(4)) end From c57ead698591ea205d184e6a84b760816daaadce Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 26 May 2021 20:56:00 +0200 Subject: [PATCH 102/103] Use next() instead of one-time loop to fix luacheck warning in mcl_util.calculate_durability --- mods/CORE/mcl_util/init.lua | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 1ac2c1f9b..a7504af08 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -456,12 +456,7 @@ function mcl_util.calculate_durability(itemstack) end end end - if not uses then - for _, v in pairs(itemstack:get_tool_capabilities().groupcaps) do - uses = v.uses - break - end - end + uses = uses or (next(itemstack:get_tool_capabilities().groupcaps) or {}).uses end return uses or 0 From 138a3cd154ac6498cb4f829bd39390579bb383f0 Mon Sep 17 00:00:00 2001 From: epCode Date: Wed, 26 May 2021 19:13:30 -0700 Subject: [PATCH 103/103] Add in header blend file --- menu/Header.blend | Bin 0 -> 1670380 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 menu/Header.blend diff --git a/menu/Header.blend b/menu/Header.blend new file mode 100644 index 0000000000000000000000000000000000000000..78a9f6158d1bde99a24376353485d5becf84dd73 GIT binary patch literal 1670380 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 z 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

R+D(RA(!nOz$92aI zEe$fN4_rqiS8m?#XA4>dEuK=N?ilmv;q9!_Wp~B4a-rfNro|l#;>2l)|FByr3lYzH zOa>Z6qezP6wB%L-!gLY zN^a1}NV#a}WUk9mZj`oJkg|}=5!H5*W%KRQZpK}Tm56aszFrf~w9&A7q$Fd1RcbU<|Sc4|ao9uK{PrYYQ@pj^=0ny6$*U?u*epk0UfT_c2628`4IiAgyVmuxX0Yn&W`|+n zW$#=M@NjI*bW<-rfH=aLmSg?$;kaISxRDWL2*w*s9T*s>uk?M`B`VACwN_dy1&k?S z@?d{UldTc`ltyihn{${bY?Q((KU80@qz`0vYzVo?*?(DHL8j~^$)dy1TwcRtUvPu; z0`ACCiXvRQ;=;ir9O~9ANnQ5(T9TpKuuz6b7NNA7_IM+JT|*&omT>#1AursZmD6^_ zokXuQ(&=(jLdWUQ{#MEjPkh)XJNSLv`a03mwQ#WI$CMqkTU9#emPx-Sw+t*xW>;2d zV^L#%@cneGbox5EOLFlcC0rb;`_$1@U~#aK1u=L8tQYlGW=nvS!7ta-m6JoqB^`Xn zo$MYj3W9Cj9m}So7)}SY>q1ZMtO$w=8}r=tUeXI*%qL8Jfdj)2LpDH)iauPGWVn?l zakni(T2;x$74U)OLt*%N$b!RtT>AX(Lb&GO&1?ZGhi*k(o4_Y9w}jy|M^wa^9Q_ud zfa(KaZ92r`9py-cc0eCtOfe%`A=o(XodCwU<<--!YF9#RF7mNe=(Dm=BI7%l0Ty*b z67HmZ(!h|2e7K`=0^COrTnQ``P^kY;*?Ry+RebN?b2pnpf{2KSii!nAY!nN22%#x~ zNJ6p31VS-DVjwgdcI?=(W9Mr{>>WE|!`^$Z*n4?D&zZS*cOm%yy@Y4)%$YuS%9%4~ z=1vO-2v~FZPa>>Z+v4XY`c}shLf-=k9d|NP{G5uiTQhPfaSN5YgXCtO$+2FVOCmRD zh1tijGX5AY*n`SUU<>4?-5qlQMlNkR)THZE9`rJRVC9UDV4 z9&>0pzWG3ck1|mUw?$yGOJg=yTW8+`^iu-7mp{XSCvxdUEP-Wc@&Z!{FlY*}uYs-% zgzIY=%~@1x#j>N$Ry64AONfH##@+zMmeg!3Fz_MFVrG;u6mdCm=%bWyKK9G!y)pB- zZ+`9mT&hWYGYbWiZ-f<%U$VnHB7*amo=WT$Rzu19(~6<`(-u1`Ae#%d58}7Gc__{q z`We@3hib=#E;bg9*~SFgCnG)!eP(_gdtt}2frS*@k*Q}8S@l@2P88wTJh1HgskYed_O=zZ( z61uTBa|VPpA=-ny8QpH!FwKMzwcH${ll5#ha~B$-IL=SVENQczMhH8WvfG&=p2pwB z7XQ}OQWS!M1S8vwUI_uR%(nGr-3P0EkI(Cd=x`+B5E>1`RhY40ub5AD$k@(H!IGfz zqEsChSce4ZES}7o+^YgH!h{d0t9|(vtM;s@Xe{Bu=g&}aXGUhH8wc*~BzNj2Qp$l~ z?lLGn)l@Jhbov+4RvfKcvO-i~-pqLUl=8QwBoCoa*$egA@y02&yaV1~#%3mq&rC_| z!G;h>jeE50F9jim6Pe}kJB&A7Rt1tZ! zJ-ndW%xu$&)H9ppM{Mt4_mG(vnZmva%5ElI4bR};1{U$us$vPbFl$RIF>BY7?7&Ld zl;FDq+a%VWOi4mgQzW6%myl$S@-d>@*O8={g@8d9hS2}47K~Fu4NLj=W+Njj=5tWK zJhjB4Y=lbarnSWZJvfADT0fpkRCm_yF{j7a1V@O=r>)sPL-)cSjbnRC4M{w*?M7+1 zV|&UtVgJUb&5&-Mc;((2E8+Iw+*z&5ARTi(y@a-#c@6nifSt97p~Uv2630@hg8~O;elvpzMGlzDiDV$^e zv{V_qyEmeVU=utwgtqv2MjpOY=%*6;j#q`ye!rPQ>(E%}TcU3*vJ*INJg})IU#r$_ zdJJg#ATBJWt!$XWO%5NAuCX;K52La)FWB+ZO|W9;HDK#g&&u7@3Dh1dZ#rviq_4)B zqGCd|GWMAZS`yWMiC_W?@5pG&#A7v06Y|>v;geEv3~{|B2~Tg(rJQ5xkOtY%sL4%V zryXDlrvx+AH!9cHovO|&&v+(1L~m~(m~H3|=I}ydn-$V`T-u$4jM{XO{F1@m#F+7L zp=liU%i118p5A4=#gKhsM=w35%be{N=vGqZKL4pzEivr#+7_obYSI?B7dH<@6o%K9 zocR7zP|^?C^PX((w`k%FC4sXNx3-x$#6Fc`Ld^D^^)+rC8*#jwiLkg*BBQ0o4Jk1s ztqJGYYg1h#FW6eOu}f0Nq~;;|SnL8QKfq@hbC20X z%nXh+Ttx>ZOk|q8dSz9ouVHG=rY}Fk*|foGpg|vFFx7(bjpKaLd__z}^#(N-EjiR7 zjUl$9MSg8SP4Kx;s|j&(HYE7CY^9Q^YJXZqs>_;x#ZcHiQ7BHqgK*Cz$C1dJGPlpY;5t2YLjj_v1X);7SLG4%IuV}m>WKH zC_Zrxc5BppJJ4U@+HFk67$*{hvGMxZb0EI$nnnkMsAQ#@U9zZ|<$o42=W~kTJFlE< znke0MO(Xs#CU4GKP;l~1z*btbgSHc@M+m_vfNvxid^LLx)4cjnG&5^uxvxJKMQ7T> z_{8WF)oY6t3Y0$>*tiP@4_q{jUVt&4Hm_R>v?vx5VeHTl>u1Fzuyx7coDkiFsne}N ziQ(i!U8)2Yf#~sBmp4@pxg&Up7fQh9=-6X1HECwq;5Xoa3J4k3eZBT_Z@4A=uDFj{R8U z2P%7y$+#7UnsIPe@U8Z!hA;O9K0&POBb&y>U-MKjlovCjyA*3OwsCB2TSMT0OO_|E z4;{QwcM?Y_CO-FS(hrWh#-Dz*4jz9O*0gx!V!r%>lc5TEoG*_JoUrx~Xv@ZE@c#Y1 z?>a&xT?ytu&XDM00}bJ*2Ek@&q)g;e-NgMNLGU}XSm+xPmx#;_-pu*DL|)!(*la3L za%6Nsb)SnaP~c@ZqOb|8ug>JZRzTd+|CXu;JH+wTB2)Q! zqMfFzzwm{4Y&?X8 zqOQG8gulC3@6?;{%6Tr7<`Gj#AC(EopEA|dK0_@l9Q3W9%x40}vUFu5Ws+B~lSwOQ z*jvS5OWBN-QzQs#l2_-;WwWO@YUGs8qt#C6Dt1`1iL)CGjhqS^)4(DLc_7`4aMIAX ziI8Mx!8w@bvt&X3dIw}*QiV1`7=(Pq1q<4C*x~(PSHqr|UBc$K#{${k0_40yut+yW z?S(q^10F6N_U@=w2M3%d#E{$^_E1ABAP$QYi&$c>(HU~*|bnSPGr{9l$Ke-Tdn3`hr?1Two);H zVj8^g`3lQJBBR9USCGLG9-P*%9MOZ3`^KBJUKgGTRX6oeR{Dq{@S7On@UOQJQ6Ohl z5Hul?gA7Q)|PJj12wYRFZ+ex#mkQqKREEVEag}1_vg!Q$z z+a8DQ)F@v@Q(Xl|%^oIN*U@t?;I>|!(3ns7>P*HD?~0vn+uoxJ2t*ch30_el6GAL| zPyuHm@k5T6-Rllyt=MM+ve0`A5MK>~@O|EuSkSCYrUkV`mW~8l znJxHkiHvV{D_ZcJORZlyDXz%NO{AX1S9Uz8f#ld>^dvvdN=et}ax6TH(#YXmPW3P{ zgzC;JJuGVd@wizG>;jbyQV(9qUf z>@8->FMmA`#iTP z^`5O!GF38=2T#hBCeI8dP9T@+hn5_VUMrJZal$=T{w{E_UOq8v;NHkO0J3Ut7uB8( zUp5bTBi%4;CHd0Cn~3AI#TPgm^J%*PYE3peDVjhD;}vQutQZxY?H_Pp!f#t?xywj| zk^sWQL_lL($iCyjBTIPWEuw2>tgqAhb4IL9ZNu49ZQStMR9RF%NBc=b?5DO|efnWM z^A=O>wr_zX$#`K@%pQneS6*zt-|8?B{PdrlQ$}F+L-{}&^NY?=WQXMD7%Gp`q#F0^ zx<#z;Cw6O`kIL5AoVpG-*(Ig6G6ZfT$)w+lL72e0+}>o5?)v_eu1=diR!TX^Mh0?t zf4z3%XpPJZ9n=PT*q5s$Y|RKXyhz}Z{c9U>~rfKo_ zvd;*H*$@U@U(iHx8kv5)MdsIiRM;e2+(@McW7rIqaZCfNM9rz=nz6;I1)LApc&_+@ zB3#Tc##2!;-zDA17JD#pUY}3O9%p%zLpgbYO=)DlqHVLJQywVLx!5%J1 zGI31Ey5(2b{aNAtxl9{M;gg%JV5mU_MtCbS#$1*{UpXQG;AwBm- zajrC?`0SYv;MquT4x0A#UY1XU)VDT5ddRzUP(8MVsN#sdN|{fEuv%}M&H)PziE&IE zHUGLCKhVA|PPr0GfYtC{3CuA_PN1=@nCU2!_Vk zPh(FBy{zx))Jqc@Dh(VFYSJeVL=E2~)<|vH9L(sczP_h&V~edfyT+IRKoPwc2VcU83wyF3m3t9IE9AkNPkZtlNvr>sUi(t`t zE7QTy{A3m%jTw#Wv?X3}pxDSVc_r^)EMHKLgn zxCxVZOJsqaQ7Z^CbUGw=J@40`jG^?>OpgnvV3**8J*1^1+H^;G{$je+_ZHm>1gnbvozaJu0?JzfL7!uW^&@VBZUzunv;;*_kDSnVo zWu187wR!<$EKl%v>d>!rI9kK8w!D+ph#)XAi#`?UaI8qLqvN>*COUP&FvpT_4i+}l ziW@)>F9}wrp9LK>8wG5_)io8>XdIbDB%9*JCK(E+X;<ioJG>LDl~hkps;qBfqqaX2h=EyUr)}261>ZFMurPGaj<6G^aVY9m97zo(Yv&1Ur-y6=KeH!!=RpnQScC%$(y-bf6L zR^0zk!$6fgu_fGq-xx*ol5<)$Tycp^QhF`44%SIT$T4g21fjPvK_fi1^)R0|VESQv zVG%8_;ZrqSYRD?utIeUZB<9{~&uf(14t%%>I4f2=iJeJCe6a}vq`yQ%4Fy-se)<%* zlJV}wG|g(%0Yu%SV5^F3LimnfH#h`oCNME;-jsT~4FVcfP$_XW4QNnlYF6A>k_i~S zIFb!Jvtd#WG=HIk4-)d|RR>otA+O6WOgC=GK7T3!CgTo_8J9e0gVtN9eZQ2X&_TCB zEPDgHSRnx#i|#{{ZhgU;tXSa*sGNcr@FiG#J)71$?)-OqfZ|mN|aPg87NRg z7CcFnIfY9iljaZq1S_YJM=ZPq4qET%iHmkY{P|Hcz%Gon)1=-8Uuja%3>(k9v@%6E zz32>1!s=JELzyJ16A_Y1XrTgEsVn=Gbj)4Ktl-L$DnR-S@gSpxe|BkLKC|sK8wnr8 zz=RTJD4EPC63;8H9Gzc3B1h3DJ>iV)PPgpztRgb*vlM|fN?&0am)Ua3Dr8)PaiNh9 zF;8WAu(`v^yQAcI$!4obLhUtW$!1|mCDcJRvew3VU)>C&OfIPW%AmJJk?DQo>}fUW znPPi4cIPIcr3PiuC}c3&z5}Sa(i{M)p}Xg1c-0ID!iC_F#9xhZeYcTsvrs(+}KcNx9L}w&C?r}0Rn%S*e?kcvv*z4SoLqU$6l!*?nN1HdDXK4dudxIC{$@FK zqC=X*w?NDa*DqVL>z?c}4^`p)Ztt4=)kQl&9QeH!i zvz0xt!j6+y+KMJ7x{(8PAHMxsF4T7V>n8J3@$;n(Go2`<%;;_?SFO2z^u)pXpd@Kb zle2Fl{TU*>yP6E`+=g#aE&lQ$oQI_KR9CVDtaGuIxKV(J-eC~(WX(>uu^os^xd0tI> z#0bWX&{Xu|a{VAAn#P4z*NT=Q)%CIvKetr3`L<;*_L|nJ-?&j9f~8&bDY5JE5wAC-L5MA{;T27ocr| z9BLUCTf^w(daX3kYL35tynr0SDAvw7guYU1V3D3f90X6FL#PawaO4pC>1vNvDbDDX z6DKDHGXiaBQbMu8#P=O@9E7r@?=p(B(ysUp!<@p|hF(re)Vr1)RQek{ay$jM z0W1Tp8}l^~ZN=pHQS@PXs9r^547#bZ^+N;Ch6CR@aspNa?W{^JFsPgSA5JdzIoR%G zSn2)tpV>Hx;WH=5Q zFZ#k5<`P*n%*de(8?$ot8pYYKf8C?F)Fda2A8|$wv;i!;Gsh0)6KA# zi?pfeMC3RO6{|35mG_loMAK5;%#rbai0GAdhpn1NqZs>Vrr{>Kah2q_6hVX;Y=#S6 zyM>aJA;&};wsC^RyV6&W65R7B< zq{eBLehPK9eZ361wu1E|Hdx7#6K5v{tSz?<_zLOvYXl;F4RlUJc`5fPx#3(G1ur#r z*09=)xgYHRuv(4(ZuroFE}o-&^-gt_rT*n6u~ai$@SQ>!v$3-RM~V4#@<)ojWrkJnLYbE#P0t|cnxwa30Rhg z3>WR0T8n^jK4F99A*rWq2mg*${eE#!%25mp?NiP&GWZxXS;ac1+^f0RkdwShvsE$S z7`tnu3aqbh_i)RY+ZmGo-^|r*DZwGF~^k5j+=wlw(=&LxkdFR;X z-=VjS48)3R@27g8G&)%u#r7mENU)9J6IgZC34H`#!kSp;S;2&8by;bL7_8Y^Dv7HN z1njtv%GdAW&P0HL{x&P;$2rEeVVPry{>5n>?xUkbh}W%0E7pO75T9o{j&IGD zi!7F6xP4L3hYzc_{w7woI2pbq4EIw&$g?d)W=vMQY6=N!y^eG<*pe0&Vzufv0fGoU z%d(>DS>{(Z=Ec@WW-67~)=c8=`Ni{wPw1Z4rsMJ-ktdQW@&6j1_uQOQY`gN1Z5`ths ziwMmh-i5AG!!bJ%%+o5=0jS;AH4Q>eqR&*ypQlK25-LPQb1`YkjLBXm!dsUE0}m2! zpKt5D@r&`9HQ7Zdf+fPtG}-&svNX3+M4@5oXjZ5QZ%)?IHg20OW*a5b@Ri4S=`?@g z!rL1*ZfY3eP?{r`l606qMn)05MG^|6EaQSxj`SjA+5%NIG?pUPGIOOJl9aW1qOF+y z!!OpGC&tfF6Im`zv%aryZF;N1)+MwGZ7Ky@)dZNT5rdsQEgf$ZTVh_k6=Pt`J+apO zGtcR`tgBW1^h2SR*~itYaODX6Gp51t=n~>|8h7aw_Yw?0H^WeQzX(yz4VrbR=4e`$O4Oh}Z zh=!YFivAJ%h620X;(&?IAjebI2HNLKl`*S^kjW%(wJOqZwMUwDjBGf5ij1ttgVz>%7jwB>SBIZf=&CD<=$)ojp7@XBl#|qBcn6Skfd%lYh{)L zZeV98hCi!3-k(kPQqLgFyJ~)Gj87vU%Bp)v1Du*Ao>L7knzCV{I(-u*uw$GTgHDEu_SHDjOI}jfpiz z8&RXQ50l1;%o06evEaca#}W(YUG3m~Y<|MP=T^A~&ol3SIbg$rCnWJ^(PGa@0vgzP z2{4l_kX&uXxyoN~TU#+}+JuHF8M>?8hgkx_&%`m=M2Wnn)D7Mzn-*79HjQRGroM`g zsK(iFwZnB61#?e5O(#PgqD`$;sFkR`O3 zaJ}U+n^=YvdKDrp0KL)ACYg-W-}M>1mC6_|nD*AzLw3yl^tIVs&(_?Ajm!3BrIC_d zHnBqLCD{bBK19lg*)(c*6`HTbl{~@#x8O68PG`sI3%*Kyg#8ecz-4>){fQw8W;C0g zDU>AP*)IOA#GO8F#C{|-#>Nko-l!7;ta-)NRGQgFd$SvFYbNiWaZ$fF8+hr?R|7&@a3B@-wS>Wg1GNF4Lrx*h=mDCum&cP?=XM*|1EaGG;rmnb31JBwvLV zvfl)xxix02n$a+Nzp1g&-kP^*MZ66(QqaQTIZp^r_VIfTaDbpu5HB6C~MoeO{WuH=r?L&2iQfwL7fbWKhv9&yWq9?X% z?u^alHRJgdmeSFZxvr@%x_5j^85u=}re>b>^(;EM&e<8nu0X^5XX|8S-9n?M=3!}* z7UGGC)rKJ^(QLw$sgsyI5=wz(6FIJEZ!a8PxjTk9b zGGkAg4r{&)l|l{fUztVl#p^q4q^C7cDdki0Y$j(^x%$H<`InqUG~eu@ChsY!>3Aul zG!r7c#RLnIp>R=gju$`rtm@HP>2Phk%KP9cDAb36O7>XJ=x1$vf4+aj4t;g)vAHsS zAQbguTy{_kRB1Z?tB|do=;c}Bah!gXvo*a5hp2dq#7j8!8cgiPeh@608H02t5&D=o z$-=s6L5gPO98@_nma3T@izaB>^ffJk%$}$pzB2ay@pa+afzk?FOs1GinM={li0x*v z#u!tAkkcmmn3e<&oL5XQ(|5AH050)jkyTacvUUTsFq9G8(P2M3`#Egc;3{%sZolS4O#U1Rt^9fxi_mV>i=Of0bXnl(H0zWUi*zlastx^^vzprf+HEY{r@$k9kluW3}@h zyM)GMth|>1;=>e?f=kS)*n6>|v?T|>``?mFm9&9dbU>EZ65ZNrOAf=3prR+(l9O#; zx8z`}q?Q~)t7yr|?|ir9q78tS=(cOfK4433!|VdOmR!7mvn7{!b`z$G*=YFUY!lrkfFH3ok`+&SF~B zc?aT_SPY4kk5%>D;IVzjPOCy1Z_}#ggyFh7D>e*lsF~E)R0(5>*=VqnOm`yj=vRG1 z{8nqmubsWDv~z+naeyfT$wot9Dz|CMYqoeMDYL=bcW6~#@fX!Bt8qh(W$Eo{2w(0olA3Ed-;L$EAFh{h7BsU|mkOEhCKTZ%Ztd*()x zbgG zhn!G{)yAY`msh(Q>J+&I(;7@j3<>m!FoIbCxhEq>La|{yCRg{Bk}jQ5cT*)^Y~}Xf zUTnJ88PosvmYbNCm69z>B`LJP)uj1fK37fpzkIJg2cgCNA9Ap=&;QQB%D!`RpaI-e z&Z>Krt**vf_OoiLE&Iz&&kx?KDdb9ytERA$huo<9Y3mu8i%!q2CV>{cteQ-V-f|PG z3JcoRB(#e2s)?-PB{u<9k^ZBCt4U#1_f?Zv)laQj?sGDin{tr)58Xm8^BI64WRv({KI;duOnED?v!sXUUU1!>V_~}{Z znfw3r!UW~NsQMqi!ulb;={3pxstu`M4XlglcA?3S>UZtLF@9JvE~#(rn7&+10}D0? z-E?~2Kur!(fUpV1>sS~Qss*pN8Y5}WH2YZRGZV!0LlUb*JEqLxXW)3ZGG<~j+%OSJ zDFA*|C*DvlPw>48l@rs3^V(0r;&_MQi+?T_ zN9e>(Y$<2s-8RpwI5Xp_hV&mAxyYsXONYNAr$6V~x{e@?xi!zWZY*%Fvzz0(^Viia z!nVAqtNHB1?>sj*ztL^(2D#VW-L7La0YAUtzoTn(zvXv#ueU0~_PXnnnz>#_{8ywq zrbqLXyK{X=r%$vb>gbB{7P`67=g~aZJ#Rkt`EGQyH0|63{(48F@z>T>q#WreY+L1{ z5TpI;YPnU8)2=#oG!*4>@gNY2u3$zG#f$Gi#TWg)RGh$_;3$gRrQRcZC= z9xWgqm8CoR&_Cr&xm{|{nS@l!Sx8;UpZ`~p?yeRZwWVEcL%MVGcpp()N~eFVtwvNY zMQ(Jeh_WqkzeT@AGcnEa?}?b^l5QVj?#SQVs4X_th5CB?_+MMx)A(!a ziqfi;B5caj1WKlym63~1l&G~U%BOt!lomgITxWcB=1+NOZ{dpEl026#N-xP<&U0zr zQl1`z@Vk_H??Vpe;CC*4eh@K>l7`-z9QO`!Xq+j^BemqOHSMV*tzrrJ=yr1&!J<8Jb_9Q$Z6lRwp@ zYPHCI+mrJ{=sDdZz4O<}MWcH^^1ZQw5>2okG>5!vv?|I|dv>(9HT#)RH{in`M{JIYw`* z%vg=|p*$*~%1LXC=z-A!>bWzn8hbxaIYuCP*SqMRzm%t1t8kw}T;_HChx)!o6E^A>@tZP%-#XzG~#BY1xLpbx@k>B<3 zw?5baQ!#Krb807xIpsElvJu!AbjIH%U{gXA0tXcDW~8|}{^hp|?pqLBni#f(uAaCR zF5P&pO(`6RFmFw)+YsxvP`0zQ()dcd?Ll|Y1M~#Fzz*bpN8;Rxa61#eH`s;nt+4M( zu684i-N7Ev_9TaU5vC7u_64QnR`uEslwt1=24EgYt_Sh#j@{>bbKXrCHyHcgU?0#P zbRga#lxQ8`Kt!p^Db-L)GYnK@`QI1wa8L=VKnE~_n)2^2?M7lA1xADYsImR2nL;Z= z8+QP49f*IWeGoX9)Vfe>YXS!%d{$dH<;&4SQmzK*&DVl4)CrA~H|pSa3SAu-M=h^u z@o(d}>5-n`+(i5y%Cnw#Gl}#k<30sigT>|BNF!kngVw~`DX=%Rt-a@|gqsFkZ@!tg zR$_5GHyzUq=rfJp#?2zkY;ZWVBfycgZ56`U6G*#+9^;0#(yYv4dci#d}PGmjQ?7A@v%+|L2$0>yitg-yBh zX-P%Y?gh}4{(NvDxQH|_PU7F$`s*doF9nx@%fSL#-+D=%`ue)U!W6nIalZ;&4Xy## zg6qIS@IP=pxB=W~_1?wZL~Fm9yxhXOSVReK1&b;3ZM5>+DaTs0@;k`Wo!~BTH@F8s z_k#Pt{on!8evs!OxIF|Ku`dA+gGWFIdPp8{Afl%{N>52!Z`s}6soKk9^qe$M4~ne+ zh_)xRJ)!Lx{O#o)r&npLdICHNmV&3~Wre_j2>07DDPPNQdz$Anypyd$JK3Gy_$>YI zIm-Jyy>vOx7s%s_;3fR4znl*=(!Gq^D?DGt{u+24yaC=M&bKU&ZQR@R?RW6=E_e^T zkJ|^}L;QV2u095zfKTcDpF#f|JPE!4U*i8O()b#D!^rS0BZJ0<72rGYJ@|n(@*|_g zPx${C`~rRjzk%PuAK*`*w)hwL8~g+Qg|-plU6gVWNP#?%ju`hr0Vo7TpcSw&f@cY6 z4b}i{z?z^fSPQfRYlHS+9nb-+3p#@J!1`bV&-ir;!L2}}l4C}#s`#Lr=%2}}j|Qf|$^nf_hq zrs2PtyiJcZmhIzaL>i|xwyB(I^KfXmFJ@*EFE9)Lv%%lQqxmYgooY2%=nlvI2yi5I zJ(wA+6>%MfJySOdTj-94Hivv3L;NTR(fi~2jOW9&I~G4Hx8viW9S=?bCxVl}TyQct z1)K^_1E+&Cz?sC~%xpK0I_Qo0ENJoAc{b*Az`5W&+|LIWfcfA;{9Xhu#(W9xmx9Z{ z?^KNhtw0psQ;C|A63%?Iweh@qamVk%BBj8cu zJr+EM`Ej04@O(1bH;kET$BJ9ydv2Yp4=x2yfo0%4+@I$840ski2c9Qwm3=vRQa!u? z?uz2}q;^#3UWE1%cp1C`UIniaM(^Ww@CN2L!CT;M@DBCzZq&xTM_s%h4QGy2`w;&n zu1CDrChmi%3T~zfY87+B2=^gz#=KO$$^kT{=uiCYN2K#H_yl|kJ_DZvahYH6{4yE| z{}s2xHts9Z{~CN_?|5JLE%{O%tstH6!1vg90zVK|eM952`p1vpC-5`*`-So4*QhIV zY$5C1LiaoP1MEt;N^<>Y6uG~^-{2qcFLVmXkj{t)@<1AUK3L|qG(M#OnvX}}5bdOJ zgr+#_;ru!P2O=U;eH59y-Y>j=3f>>@_0UV8w+3r~HegNAmUz|z?NTxSnR07GZ%?>& zQlp81c(4}{hw5S(9A=ub#dWX3b3;2$>K`H15 z%2NBe{`eUH22xLhz+mDzjP&;AxesB6fO0St`>>SS#lfUdjij#H?Q8L;-SE^Qv_X!R z;a-)hbtBB*7&nsVF8Cfr__r8UN2gl3{lNafGP^!)yjC(aW1k`|9P!ESb zCRGEc8o!h5`XBGcrY5+$)I>Kfb*LMks&^AoT#S^O><&#$arLPNH!0QVCZ`T_Q<? zfp{8Id@(S^2hPD%Fby<=>6BqOd7Qy>CYS|ggTuiQ;7D*3Wsl$W_w*r~3&`UfAfD+M zp2vdY!127#@8~Nh5avYeCxN*@Jm|^9bqaNLJFAK!`217xa~ibMaaX%MgRsXE|3kd< zGbw}G=saj=1^2TlQ$Eyl2y-s9^T64-cVP7*`uWfg#~!!yCt1-*{(AxR`6-Q-%%!x& z_PjrtFNA(ks+m4l=q^r8=b3hwq-Nme+@<_nmYQk)E+?OVM2EpE&vXk2a|P%?tJJ#v zN;4m7=BvzHPb~C(`a=OI1U;hJmd4d7t$Nb#8vI>LoY(POm^y-Z#VLuV_kJYixSt-C zWuAnuxa`bPguOnL^#%fTpm(Yqr}4g(eh<>kjn&WOx9piT39d)x6*c^9DYJgkBIB+X|7K7VJ|8{Uk>NtGKJ>~8McY(WsYVIDM z_k#QI-vwXy(;ps49nbhK|KjVE9&;al^!~fB63ca?Ed;lER({@%Ig+}2*yyZd$it(l zlag?ck=9t!Ry$HVeLOW6F5aj21Zh4AmV&2xU?%nQJoM!$tuB4p zUa<6-6OCTzULuZ{Q>XCmOelfOo-r;C=7` z`Th_*Ns1p4-^bt+?4N?^jJKbqP77r`9XZq)?u*o!?o0f9MLO-_1brD-_l{J@Y4^3o zSLnXM{4HtPyqG#GyuU8)JKW!*?B5gb58y}e6Zjdrf8T1KX9xdx*84%D5()FaK2yIt68C4xW`9vEDrH?ar@}) zP6irZra*51jnu2^?lAJygncTQmUm||9yH@V9n1i~Qnxd4|AXf$`I(h>m)q3x zaJQSCcaJ+9zej*0!BO}>8mRBh0mp!2!ExYtZ~{0HXbd}v=Ui|y;Z6aklGoF~>EH}- zCYT45uH;x}k>|7V_bB-}nlhb(TRki0c9xgbj~D0iF3!X6`QU;)^<6(^JxDzBL;Svv z-v|F6*DY&H((BFmbP-`LCZCspOTlG?xtx3~$Q$6UAnq%%Uxoc@p4Wh8BwjvG&RvWB zI>Iaj|HFJexB+w~?f+LiD))_f4T}?j~?E>E81H%uAtLgr8fj9Fjpj7{=v? z+~T|??l$6)?6@B3V6l~3bElV&-cBBm0m_5gq1w^8VPWxxB!tX=4%g?#I>wiLfTY~?G!HU!qp>Gws zNAUaTfBMz?ecU~k_hcA1oO_%&o}eDYA3RA|$$^*hJb|1)h1)Xf^J$*XfCIp7sijH1 zs}598&q99=JP+6(bT5F#w2!eoUzC|RUn0(z!7JcZ@EY{Tkc#?wj~#aM{s#Dm`goHu z@GZ-e%C{_x1HNr$_vg3GkNT|M)zb-2^bCDbV}Ra|^4JCGs&Btt+&iT4E_e^T4?X}N zlAn*j$KVs6FVj5J>VrH})_r+^ZK3mUgu z^IQY8A=sLrEm#Y*BfYgrr#)B)bO7suj$pm?mTvuYyq47ZQ2g>cZiBSew(rt!-=&t` zr5^lRKy9g0`aS6HVR~;R`UvU?nKJ3gUo%qncC1@BA`csb&ZM^qZkuAhk@vM(TJoMw zZu4{}*CqXd+ag`#woHHMx`M4RcT0cdwx&GWfHl)y*o%tGzK+{A{ju8)x@05U6K8kO z1N0>BUijUU7QX|}9l=guXDj0;u6Ozqw@dm{w=3mKA^qPi{h8Z6{khu%`=04GZZFUW z^aZ7$A1DL;iCg^ZfV7t(4a6=v#vsb1weVn`k{#{Ma~~iX(h#1KS(Wn~3Wk9SurC-6 z#4}d%tO6s5ZzSc>dmP1cG}sU94-NnaQm&t=GQ;&HPm<)Xi&j!la2o3{HU~2jcH!c08YffM5rl%LV8PH~? zzjCwEU%T1Fdw9B+JA!aWf}_CEU`|?c!uR1uzF}SPE(8~Wi@_z}Qg9i#94r7=fGfdO;A(J9TKhZSx@$3C$NLhmu@LkB z!1bg*o$}qlQ|pEsq1}YJo?W5>cK2?^ehXMc-c`0+&Fwqthw&+;9i&U$V(Pd<-k0ne zrrmACe|!1|cSrh1cPD-&SGkL@cN51w*ze_eAGjYp03HMnfhFK!@CbMm|BvDKah^|L ze-cQ;>?z{DhcuS)d>XfBz_aP^+;iBU2My$DIeuRNFM^kFe;K?2UInj#*TEa$P4HIw zC-*k~-U08XzjyDYboH9#A%CTI)R!o3~O zwex>LM<9EgQoHo~4DE4W2Xp}If{tK4uztSgP%l&50DC8}A=n6P3_9bk@pO}XjnkQZ zih4NhcbsJOlCl5F{958R%`b7Ak(bRu7qA7`5_APyfo@=HunlF`{I_lXZ^$bB8f81^ z+k@_)2j~fU;ZOZ)2h2Nyoq*&aJM-)fb^*JB-N5c(5ByJ$G-v+KoW?#K`QHol0ex{V z4P_CZ&=0?Fu`}Anc1Qo9O=w)$*OlRKB=4|4&jDZ{7z74`y@_X^{Elu&{-3Tq|1bL1 zUxfNAgryGgGtA;G<54Y!9hTE_N6Ox2j~Ces`LMKhvd6xP2#M+#U}H_fPf%u}=XFpb;Eq@uui6g|3OXr$UEH}-CbW6rEW(_PpL3v{i@AY*b{_Qe!3EgogA2h$;9~q-0xkuY z;eI(-0IneXl{~M)&(+{8@^=mOd@c0r@VgNFk34=ueP56HOP)9IyfJ@ocT;{UYQ-)( zoESSX&fN_C7O)81N?a<>VxDiY%MO=@mpuG2-a^xy)Pb@4c57ehNIEEY5bjRgx*$D` zkl@~yS4eNuGe5eE{M?P(bad+OA?mNt_jFHy#qb7C5_T!{#pJTy6-NbxIT}2L|7GC$lpm)aOqI|E zeVk82e+E38UmQJ0ex4_eYlL~7 z=NmlV1aE=2^I1FOuR%S?ZyV~zhY_E8Y_w*UUHNUhl6|d}?Cs#56yEng>43bJzc%@R z+l2NWcpqqOr7>M{h7ZVt_I*AiA0OqnkF;m-Jb6_5ALI53{_EK%{*-s|8F77{zmD31 z^>4+KyB~)>O7Q9c`ChBU-79dxn44Yxz9CQI& z;JzjFu9&w1-N4ph8?Y_d4!7-jb_YEQ+DAPL)`@x*w2F2pD2a9?>`q{3{Pf0s7qBbX z4eSo~0ELWId-B{1^Z|WADd-2vKz}d*3;{D!{&AIH&|wU<7H8 zTp9p-Uh zJeUCL(XP>+)kNY|8$Fcg2()cPt0&G$U^19eu(A4|YrxzH4g*bKD*mStPcxVfR-`&d zGYU3A)5FI%6ZctQHhvEWM}Q;2QQ&CkbHFj+SnS7vj2g|Ke^a*u~vg(8k?V&?UOL zKzpiNM7I#Xc!ouUdn@#L=`*|&i9gyhx|R067{9j_Y!uyI5JmaX@9qxbxD(t}uz7Sh zZufwD!F}L<@IXP==t1Iph`5*F?_u8iBL!MBN@sAx=u!MURxr*z4xT88`GJ1!$%3t- zr3K>6+PJ3*u64@_x<%XNb#zbT{~6x(v%JISDEIRPTSwbb_T|*W3*bfY5_lQB0$v5L zf!Dzs1tZ*>_xA(yZ;6v~c_!xWwq*L=L&(FZ;Kze6i zP@XTrSKwjl_iLWtfN#MHuoGdvqdk8Qejv<`(0&3xgI~a}(0&8I7i@t~jm3;}*#887 zfxij&5B}6vHzt0KPyb@atBdH&dZ!HGj_FOJ4X2^73p9edLQup{D^LtdKx?oDXam*+ zZNXZg9atN*2kU?ig=jSszGI zf?nVq+T;V|X$Ruik^19q7Ed@1M$%0PcG01PDTATSuedl#xbqr(h+2q=d( z6bu6ug&J?VNBdIl+tJorAI`aFB;Dh7Zg^okR|%@{Hv)_Vqrhn5-4E;!4gd#&gMj#* zgLzhiLqH9v1!G8aET{u3Qagq=-3wkv8iFm=>rTx3t8-)gC7#7-6RxvbKRZO@Np}L6 z2o44HU=rcP+v~kfE-Z0Vcs~uGv9Oan40}^y@2DGEiT@oha+AVcqiMv|T)0~_op@F5 z89Zk~n+0YQ=ixk$07pVUs&IGW-Gg@J(_TzFI=XPrsO^8|f3Ii`Va2x}Lws7R9!uRH zhgtPmPkgtd8CkO0I26wJ#d@?T=M<_=`bO)n*1z0iy&7L{#}obpaAHXRB%Tk`9_R8r z+47)vRT`aw`2osyYGJ=9AMMQ3u*>~)a0WQDus>zjx?kf!+RZB*5b0#WS-71I&H?9= z&Urk~2Nw|kz3fQL=XoKx2wV&UQ7goDFt=mA58O}QBv*KV=Y!xU)};@T))LGQgGa!lU<`RzyMGMxsf2qR z`xCscC&|;kg~Q=Z(BFpk6#ab}cpCFF;92}W$Mbo@O{cXjFRWyYSY2Ih=U%|?i{K^m z?{y(w#{LTSSHWxGb?^pw6TAi92IAG;;rT9ke~)KFdN}R7ihN1VQsUmHzCQpTf{(z* z#HsbyC;0sod{#K(Kl(yd^f~cLFXIdRsvKVyj$~Ao#_velgZPJ0(O0;McmJB_H-)2_ z+g4Xj^_5QUTQG$(KLeds z_yt-yet#|8FZ#{i_x|K>fAY7#@$$o22THGPDrFWQ)E=$mHml7aYd_-CnU3Fy^AF5_ zg1<=nZ}3myf$+AgD;sk;e%Y{cQPDwB=l}30S!i6=R1qs}a8lup9H0~LbTDmKZO)Hj z8aMKBF914!A-xgRbs_emBJ>?m;3_7~v)~RjzLh|~*VU@3_62Nz@}g`usP@gwy<=^()yg+5_4Cu73c=G2HSvbK_}+w?eM=n@pdn& zi*$yr2lSqx7uW&p2zCNHgWg~luq*y|RDRz`kHOd8;JuD$*T6en(;+1xADY!2X~R9_aww z55#;BI2creLqH9v1!KTiPzT0=@n8a&2o44HU=o;2JX4A$MDJ5Jm8$_Xg3c87FrKQz zCZKXp1=Bz?m=0!unP3)}4GsrKfFr?C;Ak)h90QI8#}$o>j^}v-I1!u#=7N*KDd1Fa z8aN%C0nP;Tz**pIa1J;ZoCnSa7l8TTLU0kd7+eA_1($)#!2)mvxDs3it_IhDYr%D3 zA^0D-9^3$K1UG@3!7X4BxD_l0w}IQi9pFxI7q}bT1MUU)f&0M&;6d;ZSOOjfkAO$P zW8iV{1b7lG1y6xx;A!v-cosYdo(Idp3*bfY5_lQB0$v5Lf!Dzs;7#xrcpJO}-UaW0 z_rV9?L+}y!7<>Xg1)qV>!5835@D=zPd;`7(E5LW)d+-DJ5&Q&x2ETw`!EfMq@CW!4 z{0067|A2o1!feOD=up*lc_0n)K>;Xi#W=;Y6(|NJpfy+nv;k{^wqPyL4y+B@gLOa$ zurBBb)&qkWN!I7N0q6ua1RH^kL1(ZD*c5CAHV0k67GO)z6>J5%fvv$dU|X;q*dFMF zeGkwR^a4A89l=guXV4q$0(J$vf!)C#U{A0Y=mYwKQqT{Sf&O3s7zhS|!L263=OKf^ ztUhoSeP46nMx1h?XzuD%J^WNX#(J~goIgI=r`3dL2q*_b!7xw(_65U1C8z=;z(_C( zj0XFG{lNj?K+-*^)uGYBt~Z8?6R^%3G)O6y}O4 z(5D!^7J4VfjWMm-xUsDo2-ARDgSpk=CSJ8uy3y$4u#dO68J8@aPV6*9qEBqql=wLm zdp&uZ#Iu>xJZZp4WN}Kzc5wBGv5{v%syWix#=|f-fvI2`Xa>_; z`TFgg((V~!8DTr6XV`jTCT5kdb803{7g-VMU&_2Yo9E>=|7LjU!=W9~Y8LYz;~wFT z0!M>6;23Z$I1U^SP5_J9;no?*zMvFnEqWsKlfYbXGB^dC3Qhy3gEPRHU>-ONoDI$a z=aTk$l;eDG0hkXigx;BVa1m}7W4;7j3N8beg9Z4x0=Fx{Rp4rH4Y-y%xsK;T@ITDg zgB!q&*lz;A!#~_i_)6B)w-Co7a4Yu3yzAS*?cfe@C%6mT4ekN=g8T4yKmH%!c?jiw zka!=$z63lB9s!Ty_89N-aonE3EMBfJeB6_`Ed@`3W#DP>40x72JqMo0|8o4l0PRKa z5_lQB0$v5L;r2Rs1H1{|0&f%U9m2hf`91u+4?X}NLi-4O3_by$g3s{#Ic{HoFR_2c za~JBMH~58F$9T9C(ynVE3 zF?*%OM@E|$OICLj{qHFH>WbTO$Ya#M z>Ny3Mmy@?+=-=$Ol2$z{ux`c2MOzmik38yl;y9i-PKdTCK9Myb<1>D?qb{}w-9Zn~ z6Z8T*kj9Q74?E#+1$_R_g6QTJ&8C^vTE4aG*iR-6#&P1= z9jJfq!E;Zr7wCgqU!J9)U$ORUPl?KkPi4G1mGGxpeA315kH30OqE}Y!U_e>;l! zMpL%^!2ZQYuwFZYw2vTdtGa^)6RZz51c!i{;&Vv1jjIJ? zz*tZR#sQ^2zWCf|0_|#I@p;jq6%I#dO?ffYwFxsmJ-`eLi{Dnd}R(!>{6R7MNXpk+n6gs}INi63-)w zFXnxrbBp~b`qt544mg2RkommRV=x~Jj>Fxz-%D-WKc4i?DO4KBcF3c2n@{9<5}1qI z$zWFAW$Zg$Mt&|MKmHDeQ;6qOa9Z(&(dqa(zWCB;$Mi+f8RX;4;!C1=#X3`cIsSEq zWC1eM1%zLKy~LeGxwoM_e(%-G{&mK632pss;yfpbn=?L`k6~~8Jf7#1{|mr;a3T4- z2wV*P5^!npWzl8D(v|RgoR=4C%_-TF&XTh)L6|Fw7erTrtH9N~yK9QCh^{3s*WuPL zpM43Q{{z=UyMZ`w1UG@3q20n$XX`%)l3hz5;9K+rhp;DIsyztY*Gyl|d%u$UzLK(D zNm<*tTS;p%ZnqV08Lfr=c1xG}2Kt@U+g;#pa1Va&1^0pb!2`u>y9bM}ik>C!4`E+a ze08*>xRraj_!{0lx<2IT58lU%lQ7m61$W3d-OKI%F7s`l~{eqP2+GL?t%_e$~g=I2%DuNB{5ZTt1&;qDFm zyb0cdel@(y+dSU^TGzkJ^F88JdpnpuuJe4e@@^!aw0j@7v3WPaqufMY-DK^`%kF)< z_<%S+q>er+E{i@czM1xaQ*=w}lIRn{eOi1Aamdb|Z}Flm^R2;Od~SI$@yg$A3H@^` zu27}2(<8u0B^YkH-CQh9!>;r3upza_&Jo4J;vJq7xMEf_ze`% z7k(#iIvFQjv_GKz3H}0qgMYxkK>GI0l!Xly7Xgl4@otgHU{05C?+hpag`fzu0>z*N zv<5mWy9Up%dA1?!nxHLVtJ3#GYn4d1?Ox>7(h$D4g?y7P>9=$SryX%9Z-t;JZ#UYS zud}sDOZC>iL~^wIcwheBl66XS3&0iZK!_J$ed2V6xWsiR*~G0|qWS*gdrG?+V;_`SXjOYSFroxHxEyz9LC1K1zH{s4BJhq;!X>UociN;L0^ zS4g`@NNeMe&kc#YGj-AhpPS%k(-Q6XT@Yw{{_K zTYxP=*AhP#Z-tw5#k)b<8f*i$1=`D#PQrGWALdX3-lqMeL-o-LySu*tIm?6`&!a9Dx;ou!Q3DB0VPYKf%yM{ z5_Mvn6Hn2L`CjLxv{y2SGCTrpaLL2GC!N)lpUl5A0v^7&W3f1&Js214|x{4gv>* z>JsjtDtRK>i&OGQDMI~A$5nOj+gAbp--X=lkq1xr#}me{0W-$eWmMLp?FEF3-$)+jo>iQ1f=sjmFG0j45ot_U?!La zW`qBK@AL`Y-xIvQ5_fpXlhF~FkECvHcb}s3-^LxqdpsK29Lno?Gv?8dcb#oMmh_IJ ze8*FVCx8=)=Oi$fcdo`L;Pwt=aT-q+=6jl$tQ?beE&M1JRAis0CytCmcRMfFN?0SaYlOL%AcQ~Iu<|2*!3KKp2LsV(UjZOCC@W1>Sl%Kp-bO9 zo)eJW5&yNMdm}o4*I`}=G$#Cy{9GT#vKuhpSh5_M@N(i_iExM|BsO$or@Bm)jIDr_#GckZQ~Kk^XpkO_#UIZ0nN7qy;JqU ze)(?(e?Gp&7T;S*T2GMAyNOe2wq{;^(!C9z>+4Bne}?xho>cShllWa~ZO+G~^1hn) ziF?Y@ekaM#{)Aa(w0E;;aXH@$X~*aD(8Z?iyuSbY@Z*_sK0{j1lIC+Dw_cUk58%J# zw~L#AKi%K*JpPu07r=|)CGawM1-uGgv-hR(^h4fDCY=@0M^S!aS3c1_vHX9``dj{# z9(vz|e-rat;BD{@co)0}-UlB5)yapX^%3|Od;&fNpMlT87vM|q75Ex_Q}RhjTWRR* z5bfLY`Kj@&l7C6(N_tWyUFeExs%qZ>rxa{4*<97YtiZMCC%ZWqye z*^m6qg|2g(HQ;;latP0Ap!V|v<$sc!N0^aWcOY-Jwt}7@^q+Z8()IYIk=#~|QRt+n3yp7BXC%D7+n zaW1bloIS_~1)vZV5vCsQVFTkJejqPDM6FtDoI+%T+q%5jt&+09e-fs3>mQ>vaNCtU zwP}qGQ0o%c7W!JC9rU%qGV1sl!ahq~wr|ZHC#`>oI<)>NTDSH0QODLlN8P!_h1w*& zpQH6Gy2uEsTxSkkiu9MpzvftFFv~h&l~&Fc!6@cM z`tH9R*X7|Q+$)gImkH;V$30I)(o~6b#_`svOr2DLs`#sh84J~+2GoRFz6Z2l>cz`YyB z@%c^lnXls>2kCisb&k3#*CPloT@BsvzYEPlT1R*T`|ik*eGHm}^ex|;*lC?5h*lxJ zQ(ttxRS18dV3Qa2SACC+9>f>^rl_Y=Zb35%>FkBPx4G{P`sS}&Qu$?V3&wkrJL&5~ z9DSi56eE58F$cgv!oCZGd?_4RgSj38L*YH#hrw`oA4d36Qg+NIArkFI6b1cBYLjS; z5BRelvnyTKNW!WtM-gTyem}$<4eHy5(k6lhbDE~d$(=~I|OIB8c> zxT*M)K9Xse)3MjPIAPr`1Le+nC&J9YeI|SkU%)J1M$*qZJ7v8btxRf9$7m17lVx`7 zhf*-h(aL0^4{o-vwlT+-)wH-@#CZEl!q0`TU>{J z?WlfqUw}Gt`^s!*Ik`)Tzr|$UEvQ=A`!r zuG^7b&QLnfq}+~y-U-uqNMnd&W@HJ{#z3y=Q#oiK9Fr%j3qnAM&-o$^4CUu?C2r zv)KK@yX05mJI8gLQNhX2d9IfmFH_#q`s*<+_&ml%?D~2u{)=5D$8HF3giH8y{Z=OK zr^9-T%Z~giq$Sq4;;ZVU>8h_9Y4K3M9`fiht`Yt^{D$AXX#G0JNe*w-Rlxc_nAIX8W^saxh(tOaOZoQ`$nKgs`Ja0~wS)iQ6x9k|Q= zJ-F|y!FPPBAL-2G`w`0MA@ANt@ECbd@WX*Bt}^z?GZVs*^g*xmM3G3xlM7UydZVT<8JtSg2+5xj8yb9Ox z_Zs0lL1*r}V7{(;gs#vH-oU;)=9};q^njkw3*Ls_@DB8Wz7Wg1tsi0f!vGiv@4_G$ z3`0QeZYXiR$MrDG;h=BM-p3q)-3OQ>VHDRNVvdF}Fc!waN7#?Y{1_&{MD8cSComa4 zg(=ui#heDyx&91u2Ifro9KL{AFdKV)^EHR-FJUhCdEqOV2VcW{SO5$Cbo79)EJjA*XJ$|!L$9ZS-S6g4u};IFXP$h zZ)|Szzs9&Ineh!9?3-Z=d<$FsO`JaYBl2(!?$a*}BL{j{Z1XpD@+r3~)Yo>>y92J7 z&9IL#cKVx}Y4O)3lCe4VjnQJL@#1dc-2;35EeXlHjO%@{A3q1+dpPL$Z^gKw6|uD< z51OO8I(^-_shgfd{?^E7ji1&bKlflcP;BZL+53Ve)c>G}}?l%%jAo zZ`hTmB&7WZ?v;*XPsOiq{f;~J5n-I*c~iVU`d=}n7q3}@jN z_!Z8bs^txV{O0!V$)?e_`H&zu`9A0qxUh|3+hwyWHP{5y+L^ zg!^1SfQRr1`H$fV@PUot0Ta9s0SWs|?p{(N>>?pCB!Q%m3}qwQgSrh-T>Ap-6)|Ym z_b*THM+NX}K{VJ9gyfI{QbH<74XT$km}wy$q=&53#|y~LfZQ*5qB3%wN%qWVGGk`Z zHDuE@ezRjrXG2(jLk#yh2$PfWIy;<;``nNR@rU!%24y%$iUOxwYAFs}oqjH*gDh(iiZ~Y-`pHv@z=iTAH1s+MD%pZxHBUHiSk2 z&LKdPz!altpqFx-xl2)Ble2wc)&>6a5cf$qTFnR>08CB6(s=aOLt>}qcFHpboD)(v=Z-ex__Qre%`aoak2mN6H41}%t ze;0EQ42Esohjn5M;eIH*2g6`EybmMb0~iUT;6w5&+1~XtLd=6j0ESL>*@b@M0=^KH$+Z(FU1;;p~V)>2kDK%^A4Fbwe0YfK!*B$S!VhpPAiYUZ#&NDs1iG6) z2HvDRdN^~clgKy~=xLq?S~qd`bn<-$`=3Jb{T%3l|6Y_!FWh@M~#$Cj4w5E_fyU( zNr&_yq_N%&$yfT^c-7Bq?d2$YU0M%t*Y4zh(7(tJr-k=2GSh+dHAsGMeoG;hHJCo* zf2XM<M;>jlax17w6uPF~#il-5Vxa*i-EJNX&< zOdTk_st2W!cPZ^kXAZJ(9o7@9IdE3WG#hr=9og^k1V5dYa2)?ETj|YBX>~MXtYJ?3 zNJx9wf4HpN@`*Eso55$~`Y4NM+lgCOYA>9_r=2aN%_QiQrTuuNoAUjCDd%u}YG>}; z-fdg%Ig#|d@8gUSp}hU~HmWlW{op$%e;@oy8~A5Abfn$5@r2vJNNP;w=bi^i=Io)m zdrDE{H`*G-n%T2$B%F4YmHUp(L49bQT5U5Y*SR3K^Ijq6>PixO{##s8D@yv_luIG}mC;p0q%G+I6 zk)MyLCD)I_m#}0vfjV>Lmc)N4*x@`&uAI`ybK_B8AC7AxX>{f2OpyAjGLEcC^cSxE zgphq%8%8%+! zdny&2w0s&Wk7wmQT^>_-e=y!Ao{CTj+_Ea@sccQ9MNTvGpvk?8^%-+k&C6z(RjnCj zHQpVu^a0hO2GoRF*wuzQ))ccYW<9764WOYl(`*Edp$Yd*t%9Cr*5_t(`i~Z{98K^o ziLVv1V~9f<<8|(%H3#O}U{~Hbk6PMz1;1^rS!O$Hu&2G%-_wD3JHo5r?)NaZ#?MeT zT=c$KLi_84TW9Ek{p%2?JTiaiid{Erw)uuN$Lwx>X}(Fi>VVE8zlGVu(%DqLOD7Gz zthw|>b4izWIkl&%bKk^)jNYL6Xb|4vx)1b)e$XE@78!u4b9XVc%z>7))qjPouaGs@ zd>7e+ta8h1z zCiOlOyO|+7_HoG1Nb)_(k)dyjYB4&gMOJFD3LMVQ0y7_Hc0WXJDJPv%%+Z7!W7YDE zwRGk_JPuvR^Rf{63z5Hwby%&ZXl@kVOP798&c5(W>}4L|?t3qGp6PL<;UgFi?ppd1 zXZ)h}{xR)*0!+lsJ;S=x3FGcxY7EW1n|IG+&ob7!a@G=l2=9Vv)@mp2>5g6aJ*aSNC|m7k z^Boy^{){+gP&d-sv7E4a24`Ap@w1j9S?iR4YQlVupD#e|M14hbG+!s7o@Zeo+2EBQp8s-qLvn<`&d@MV=wecU6~5@cZof zhJT)G;Cmp-Vi|F`dIX}3<)L(+LiP&scs#I)^4>&Tn?iA^JoP&giU&w<3Eh zvcvT!9ctUi^Hy^weZ1D`b`fqjvi87)sO{9R++6#;)(+Z4*spsw@;m%%twH;8yYRQq z+Udlz6Z`!zmv$S0dt-i$!IkBX0S;Krc@|hR#7|nr^9M=uP|t405xYs_Zl}x+k+;Ke zgz{R<`@Rh6Q+*sI%n$Ktbk7AxdfS=W*Hapf;eH&n7JUL!=Y!J8G+eOukS48{j^Q`=Mx)nqFYA7L&5N{~OV(WDGE`(u=!%ui zxC+j&|oE`u!X2F$8f- zj{g*plIv8MsUZ!dg>;Y}UVsdc5i;Q~Go+wCv+(n&-AQ9s?z2I5h`~<|$O*Y1H{`)S zFLCF?e}3)@U>3wI1ch-cf>{)bL2>R&KuIVC`kl?v_%FkCS$GjY<)A#g1QpktQBpGWjddzClAw4*AqW96C>AR=p*#MvSW>p`~IGzW-8LY0lyn5H|+~;!u}iBjNKOOv~Kw= z_gi5bY=<4N6L!IF*aLgvJJ<*N;Q(pUd4TV^J_v{4u#+C;?J)22!}RfoDJ%E=eFXQT z@&2?%#CJ&eKZcy+*q?y)+^bxE#5~D;ZT3J;kxuDiJ&kz=`=7A?Iodr7cb_(KHu?u= zeDVu!s|lNmH>nReJrRogu=y))=g4auzv^?GYsH%?v}b*u>toT!o%f2y$QOv`B5_>8 zybM?1DqMr>@EdMZbw-5i2*yY^2>%D%gg#!-vdT8R*Z&{qB_n2#>v-RE#?@w@EfjBhQ@4*== zjb~pV4H+OKWI~?S`zx?lmznD<5dLl@t6kN|M%e7w#em*@IVk6xkPC7{9>@#%AU_m< zf=~zwLlGzn#gOCnZ|Gs*x&)N8H*19?D@|I;K=^EY+vqKnlibwDx@jznoJ6$a zNJtENC%=eY4$@T)v%DQ^yaW}H^D=BAzZHo`&vGT)D?=5iYFFkvxNv_IFshNaSf~!+ zbA9f7;}@siYGAMaOLK^t$g72n+EB;-)p?%ka-EvqFBQLDmB?AsSDo^n#J#@#i@DE# zo;GxzdOA-%x&3Mb zkS4ABkEJ}u!ACG2yHn17)K&9i`x@=w8ey*yR&!bQ&~U$DK47;cU`)in=F*ceHP-xu zI48rW)a4ZWI&I)OVXw!>n*u+YW9m6Ao8&j1@$0NT#u`)Y-)VKa)_EJbtNw1#4?S(i zxe#PeC;m8o<;?Z3u#5v>hJEun|E|6K|H=I3pR!!Hr)B;{UgbyM3Op_MmXiKYC7%Yp*yS|7#ju_i!4YJXPNY zt>EeUkPMIa+4^?#CO0$WU-@&>_@(WAMh0hr?1<-NxNSymiM(DXPUfyo8;Xp-U+;_) z5_{eHXFr$xYF(&2^V2v^qlE2cr+L>rCk;s%B`Xi?`-c2${Zno#_uigl|HnNlKK}Vm zdVKNs3!Hm@{JopLK>Yn$=lQTg^4;=SNE+r7_aayfOYG?QbcfeZ-2GwO>$X?UXwixFrkQ$APC{PFLg=ih7E(^`Sdm841Iyj7U1 zLFrus;Wo0C>vh<#r(fCt8(|ZC1DjzBZr{RI{B7f2XK%v4{d|L#wH>=1uoHH{ZrFqW zy|&JFxWBjX9sSZi*bfKn6yz_3mz6OolsCS&53)j+@Gd<_8R)F-ACO{k^d8zKf+1;$9mlL zbLl`ngs#kMo}WXq zrEf&v>Ya_3m5xy>zZFF}l<=fSUV6f%ck-)opXwt8zr39e&}inY$GYFys*mTaul<5I z4f$A%9_6#ddk#6(Sg(mC|1}w(pC_IRm4{_xQ#YHdRq}@HM&o>Q>4f%}#dmR48;cr}MjTk*Q_|rGr?a^T~ z)cLK74BkBavLYvo$Wuo0q&0bsB{EU3nXt$PMp6<-vyLLwJJv+1aKIQ{EtJmF|$Y*q-4QQ`d zh4acD0xE#Q6ebfEZ44v0Lx7m5j*N`fw)9%#a1LLN@$mM@9_ffSjZ^7ir2J%t2p6 zp8)#yL1puRT7AfvHxKdVC0raQrt<|`ang}9z(H2bk@vut!}~_!9Ns&anwO}Z>O6J9 zU~;2Sa60R?(s8VDB)ZXpF-8$&6@_BRD-P11UxNFR$V$a8YbsBrxLzNXi)-qFnw)Cp z_6FmhcQ+2{HY`oJGQphQvcWvw7YU=^^eGo~e`mQo_wMg0C!9&JB6KDyFXbQZJD!#0 z%4irV8E*L6i4($4V}0O`Cm(G#zxO4@$MaPoSir0ANp$x2W$Y?KCFsE%uqShbILs2B zg0y}1RhWC}H#4

PHw0gB&16YXKQq@u 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