From 1e17989ef28696fe69ab16467a1db8ef9488bad3 Mon Sep 17 00:00:00 2001 From: Doloment Date: Tue, 6 Apr 2021 21:17:02 +0700 Subject: [PATCH 001/136] Prevent opening an ender chest while block above it --- mods/ITEMS/mcl_chests/init.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 1f3f518a4..ac1226171 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -1027,11 +1027,14 @@ minetest.register_node("mcl_chests:ender_chest_small", { sounds = mcl_sounds.node_sound_stone_defaults(), drop = "mcl_core:obsidian 8", on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", formspec_ender_chest) create_entity(pos, "mcl_chests:ender_chest_small", {"mcl_chests_ender.png"}, minetest.get_node(pos).param2, false, "mcl_chests_enderchest", "mcl_chests_chest", "chest") end, on_rightclick = function(pos, node, clicker) + if minetest.registered_nodes[minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name].groups.opaque == 1 then + -- won't open if there is no space from the top + return false + end + minetest.show_formspec(clicker:get_player_name(), "mcl_chests:ender_chest_"..clicker:get_player_name(), formspec_ender_chest) player_chest_open(clicker, pos, "mcl_chests:ender_chest_small", {"mcl_chests_ender.png"}, node.param2, false, "mcl_chests_enderchest", "mcl_chests_chest") end, on_receive_fields = function(pos, formname, fields, sender) From ce0148d9a86463b2a34bce0a145f7fc324015f88 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 14 Apr 2021 15:46:52 +0200 Subject: [PATCH 002/136] Rewrite armor; new damage system --- mods/CORE/mcl_damage/init.lua | 107 +++ mods/CORE/mcl_damage/mod.conf | 3 + mods/CORE/mcl_explosions/init.lua | 38 +- mods/CORE/mcl_util/init.lua | 96 +++ mods/ENTITIES/mcl_burning/api.lua | 8 +- mods/ENTITIES/mcl_mobs/api.lua | 6 +- mods/ENTITIES/mobs_mc/blaze.lua | 4 +- mods/ENTITIES/mobs_mc/ghast.lua | 20 +- mods/HUD/mcl_experience/init.lua | 29 +- mods/HUD/mcl_hbarmor/init.lua | 9 +- mods/HUD/mcl_inventory/creative.lua | 29 +- mods/HUD/mcl_inventory/init.lua | 51 +- mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 7 +- mods/ITEMS/mcl_armor/api.lua | 232 ++++++ mods/ITEMS/mcl_armor/armor.lua | 675 ------------------ mods/ITEMS/mcl_armor/damage.lua | 103 +++ mods/ITEMS/mcl_armor/init.lua | 464 ++---------- mods/ITEMS/mcl_armor/player.lua | 143 ++++ mods/ITEMS/mcl_armor/register.lua | 204 ++++++ mods/ITEMS/mcl_armor_stand/init.lua | 4 +- mods/ITEMS/mcl_bows/arrow.lua | 4 +- mods/ITEMS/mcl_bows/bow.lua | 1 + mods/ITEMS/mcl_core/nodes_liquid.lua | 2 +- mods/ITEMS/mcl_enchanting/enchantments.lua | 151 ---- mods/ITEMS/mcl_enchanting/engine.lua | 3 +- mods/ITEMS/mcl_farming/pumpkin.lua | 6 +- mods/ITEMS/mcl_fire/init.lua | 4 +- mods/ITEMS/mcl_heads/init.lua | 2 +- mods/ITEMS/mcl_potions/functions.lua | 15 +- mods/ITEMS/mcl_torches/api.lua | 2 +- mods/ITEMS/screwdriver/init.lua | 2 +- mods/PLAYER/mcl_death_drop/init.lua | 4 +- mods/PLAYER/mcl_player/init.lua | 47 +- mods/PLAYER/mcl_playerplus/init.lua | 12 +- mods/PLAYER/mcl_skins/init.lua | 7 +- mods/PLAYER/mcl_skins/mod.conf | 2 +- .../{wieldview => mcl_wieldview}/LICENSE.txt | 0 .../{wieldview => mcl_wieldview}/README.txt | 0 mods/PLAYER/mcl_wieldview/init.lua | 122 ++++ .../{wieldview => mcl_wieldview}/mod.conf | 5 +- mods/PLAYER/wieldview/init.lua | 132 ---- mods/PLAYER/wieldview/transform.lua | 10 - 42 files changed, 1203 insertions(+), 1562 deletions(-) create mode 100644 mods/CORE/mcl_damage/init.lua create mode 100644 mods/CORE/mcl_damage/mod.conf create mode 100644 mods/ITEMS/mcl_armor/api.lua delete mode 100644 mods/ITEMS/mcl_armor/armor.lua create mode 100644 mods/ITEMS/mcl_armor/damage.lua create mode 100644 mods/ITEMS/mcl_armor/player.lua create mode 100644 mods/ITEMS/mcl_armor/register.lua rename mods/PLAYER/{wieldview => mcl_wieldview}/LICENSE.txt (100%) rename mods/PLAYER/{wieldview => mcl_wieldview}/README.txt (100%) create mode 100644 mods/PLAYER/mcl_wieldview/init.lua rename mods/PLAYER/{wieldview => mcl_wieldview}/mod.conf (66%) delete mode 100644 mods/PLAYER/wieldview/init.lua delete mode 100644 mods/PLAYER/wieldview/transform.lua diff --git a/mods/CORE/mcl_damage/init.lua b/mods/CORE/mcl_damage/init.lua new file mode 100644 index 000000000..bd640be43 --- /dev/null +++ b/mods/CORE/mcl_damage/init.lua @@ -0,0 +1,107 @@ +mcl_damage = { + modifiers = {}, + types = { + in_fire = {is_fire = true}, + lightning_bolt = {is_lightning = true}, + on_fire = {is_fire = true}, + lava = {is_fire = true}, + hot_floor = {is_fire = true}, + in_wall = {bypasses_armor = true}, + drown = {bypasses_armor = true}, + starve = {bypasses_armor = true, bypasses_magic = true}, + cactus = {}, + fall = {bypasses_armor = true}, + fly_into_wall = {bypasses_armor = true}, -- unused + out_of_world = {bypasses_armor = true, bypasses_invulnerability = true, bypasses_magic = true}, + generic = {bypasses_armor = true}, + magic = {is_magic = true, bypasses_armor = true}, + wither = {bypasses_armor = true}, -- unused + anvil = {}, + falling_node = {}, -- unused + dragon_breath = {bypasses_armor = true}, -- unused + mob = {}, + player = {}, + arrow = {is_projectile = true}, + fireball = {is_projectile = true, is_fire = true}, + thorns = {is_magic = true}, + explosion = {is_explosion = true}, + } +} + +local old_register_hpchange = minetest.register_on_player_hpchange + +function minetest.register_on_player_hpchange(func, modifier) + if modifier then + mcl_damage.register_modifier(func, 0) + else + old_register_hpchange(func, modifier) + end +end + +function mcl_damage.register_modifier(func, priority) + table.insert(mcl_damage, {func = func, priority = priority or 0}) +end + +function mcl_damage.get_mcl_damage_reason(mt_reason) + local mcl_reason = { + type = "generic", + } + + if mt_reason._mcl_type then + mcl_reason.type = mt_reason._mcl_type + elseif mt_reason.type == "fall" then + mcl_reason.type = "fall" + elseif mt_reason.type == "drown" then + mcl_reason.type = "drown" + elseif mt_reason.type == "punch" then + mcl_reason.direct = mt_reason.object + if mcl_reason.direct then + local luaentity = mcl_reason.direct:get_luaentity() + if luaentity then + if luaentity._is_arrow then + mcl_reason.type = "arrow" + elseif luaentity._is_fireball then + mcl_reason.type = "fireball" + elseif luaentity._cmi_is_mob then + mcl_reason.type = "mob" + end + mcl_reason.source = mcl_reason.source or luaentity._source_object + else + mcl_reason.type = "player" + end + end + elseif mt_reason.type == "node_damage" then + if minetest.get_item_group(reason.node or "", "fire_damage") > 0 then + mcl_reason.type = "in_fire" + end + end + + for key, value in pairs(mt_reason) do + if key:find("_mcl_") == 1 then + mcl_reason[key:sub(6, #key)] = value + end + end + + mcl_reason.source = mcl_reason.source or mcl_reason.direct + + mcl_reason.flags = mcl_damage.types[mcl_reason.type] +end + +function mcl_damage.register_type(name, def) + mcl_damage.types[name] = def +end + +old_register_hpchange(function(player, hp_change, mt_reason) + local mcl_reason = mcl_damage.get_mcl_damage_reason(mt_reason) + + for _, modf in ipairs(mcl_damage.modifiers) do + hp_change = modf.func(player, hp_change, mt_reason, mcl_reason) or hp_change + end + + return hp_change +end, true) + +minetest.register_on_mods_loaded(function() + table.sort(mcl_damage.modifiers, function(a, b) return a.priority < b.priority end) +end) + diff --git a/mods/CORE/mcl_damage/mod.conf b/mods/CORE/mcl_damage/mod.conf new file mode 100644 index 000000000..c7d96395e --- /dev/null +++ b/mods/CORE/mcl_damage/mod.conf @@ -0,0 +1,3 @@ +name = mcl_damage +author = Fleckenstein +description = Minecraft-like damage reason system diff --git a/mods/CORE/mcl_explosions/init.lua b/mods/CORE/mcl_explosions/init.lua index 34375248e..bc1970f6b 100644 --- a/mods/CORE/mcl_explosions/init.lua +++ b/mods/CORE/mcl_explosions/init.lua @@ -150,7 +150,8 @@ end -- raydirs - The directions for each ray -- radius - The maximum distance each ray will go -- info - Table containing information about explosion --- puncher - object that punches other objects (optional) +-- direct - direct source object of the damage (optional) +-- source - indirect source object of the damage (optional) -- -- Values in info: -- drop_chance - The chance that destroyed nodes will drop their items @@ -165,7 +166,7 @@ end -- Note that this function has been optimized, it contains code which has been -- inlined to avoid function calls and unnecessary table creation. This was -- measured to give a significant performance increase. -local function trace_explode(pos, strength, raydirs, radius, info, puncher) +local function trace_explode(pos, strength, raydirs, radius, info, direct, source) local vm = get_voxel_manip() local emin, emax = vm:read_from_map(vector.subtract(pos, radius), @@ -247,7 +248,7 @@ local function trace_explode(pos, strength, raydirs, radius, info, puncher) local ent = obj:get_luaentity() -- Ignore items to lower lag - if obj:is_player() or (ent and ent.name ~= '__builtin.item') then + if (obj:is_player() or (ent and ent.name ~= '__builtin.item')) and obj:get_hp() > 0 then local opos = obj:get_pos() local collisionbox = nil @@ -321,7 +322,6 @@ local function trace_explode(pos, strength, raydirs, radius, info, puncher) impact = 0 end local damage = math.floor((impact * impact + impact) * 7 * strength + 1) - local source = puncher or obj local sleep_formspec_doesnt_close_mt53 = false if obj:is_player() then @@ -336,23 +336,22 @@ local function trace_explode(pos, strength, raydirs, radius, info, puncher) if mod_death_messages then mcl_death_messages.player_damage(obj, S("@1 was caught in an explosion.", name)) end - if rawget(_G, "armor") and armor.last_damage_types then - armor.last_damage_types[name] = "explosion" - end end if sleep_formspec_doesnt_close_mt53 then - minetest.after(0.3, function(obj, damage, impact, punch_dir) -- 0.2 is minimum delay for closing old formspec and open died formspec -- TODO: REMOVE THIS IN THE FUTURE - if not obj then return end - obj:punch(obj, 10, { damage_groups = { full_punch_interval = 1, fleshy = damage, knockback = impact * 20.0 } }, punch_dir) - obj:add_velocity(vector.multiply(punch_dir, impact * 20)) - end, obj, damage, impact, vector.new(punch_dir)) - else - obj:punch(source, 10, { damage_groups = { full_punch_interval = 1, fleshy = damage, knockback = impact * 20.0 } }, punch_dir) + minetest.after(0.3, function() -- 0.2 is minimum delay for closing old formspec and open died formspec -- TODO: REMOVE THIS IN THE FUTURE + if not obj:is_player() then + return + end + + mcl_util.deal_damage(obj, damage, {type = "explosion", direct = direct, source = source}) - if obj:is_player() then obj:add_velocity(vector.multiply(punch_dir, impact * 20)) - elseif ent.tnt_knockback then + end) + else + mcl_util.deal_damage(obj, damage, {type = "explosion", direct = direct, source = source}) + + if obj:is_player() or ent.tnt_knockback then obj:add_velocity(vector.multiply(punch_dir, impact * 20)) end end @@ -422,7 +421,8 @@ end -- pos - The position where the explosion originates from -- strength - The blast strength of the explosion (a TNT explosion uses 4) -- info - Table containing information about explosion --- puncher - object that is reported as source of punches/damage (optional) +-- direct - direct source object of the damage (optional) +-- source - indirect source object of the damage (optional) -- -- Values in info: -- drop_chance - If specified becomes the drop chance of all nodes in the @@ -436,7 +436,7 @@ end -- griefing - If true, the explosion will destroy nodes (default: true) -- grief_protected - If true, the explosion will also destroy nodes which have -- been protected (default: false) -function mcl_explosions.explode(pos, strength, info, puncher) +function mcl_explosions.explode(pos, strength, info, direct, source) if info == nil then info = {} end @@ -465,7 +465,7 @@ function mcl_explosions.explode(pos, strength, info, puncher) info.drop_chance = 0 end - trace_explode(pos, strength, shape, radius, info, puncher) + trace_explode(pos, strength, shape, radius, info, direct, source) if info.particles then add_particles(pos, radius) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index ac913de39..55f308602 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -418,3 +418,99 @@ function mcl_util.get_color(colorstr) return colorstr, hex end end + +function mcl_util.call_on_rightclick(itemstack, player, pointed_thing) + -- Call on_rightclick if the pointed node defines it + if pointed_thing and pointed_thing.type == "node" then + local node = minetest.get_node(pointed_thing.under) + if player and not player:get_player_control().sneak then + if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack + end + end + end +end + +function mcl_util.calculate_durability(itemstack) + local unbreaking_level = mcl_enchanting.get_enchantment(itemstack, "unbreaking") + local armor_uses = minetest.get_item_group(itemstack:get_name(), "mcl_armor_uses") + + local uses + + if armor_uses > 0 then + uses = armor_uses + if unbreaking_level > 0 then + uses = uses / (0.6 + 0.4 / (unbreaking_level + 1)) + end + else + local def = itemstack:get_definition() + if def then + local fixed_uses = def._mcl_uses + if fixed_uses then + uses = fixed_uses + if unbreaking_level > 0 then + uses = uses * (unbreaking_level + 1) + end + end + end + if not uses then + local toolcaps = itemstack:get_tool_capabilities() + local groupcaps = toolcaps.groupcaps + for _, v in pairs(groupcaps) do + uses = v.uses + break + end + end + end + + return uses or 0 +end + +function mcl_util.use_item_durability(itemstack, n) + local uses = mcl_util.calculate_durability(itemstack) + itemstack:add_wear(65535 / uses * n) +end + +function mcl_util.deal_damage(target, damage, mcl_reason) + mcl_reason = mcl_reason or {} + + local luaentity = target:get_luaentity() + + if luaentity then + if luaentity.deal_damage then + luaentity:deal_damage(damage, mcl_reason) + return + elseif luaentity._cmi_is_mob then + local puncher = mcl_reason.direct or target + target:punch(puncher, 1.0, {full_punch_interval = 1.0, damage_groups = {fleshy = damage}}, vector.direction(puncher:get_pos(), target:get_pos()), damage) + return + end + end + + local mt_reason + + if target:is_player() then + mt_reason = {} + + for key, value in pairs(mcl_reason) do + mt_reason["_mcl_" .. key] = value + end + end + + target:set_hp(target:get_hp() - damage, mt_reason) +end + +function mcl_util.get_inventory(object, create) + if object:is_player() then + return object:get_inventory() + else + local luaentity = object:get_luaentity() + local inventory = luaentity.inventory + + if create and not inventory and luaentity.create_inventory then + inventory = luaentity:create_inventory() + end + + return inventory + end +end diff --git a/mods/ENTITIES/mcl_burning/api.lua b/mods/ENTITIES/mcl_burning/api.lua index b08a0fb70..98f315ef9 100644 --- a/mods/ENTITIES/mcl_burning/api.lua +++ b/mods/ENTITIES/mcl_burning/api.lua @@ -92,7 +92,6 @@ function mcl_burning.damage(obj) do_damage = false else local name = obj:get_player_name() - armor.last_damage_types[name] = "fire" local deathmsg = S("@1 burned to death.", name) local reason = mcl_burning.get(obj, "string", "reason") if reason ~= "" then @@ -107,12 +106,7 @@ function mcl_burning.damage(obj) end if do_damage then - local new_hp = hp - 1 - if health then - luaentity.health = new_hp - else - obj:set_hp(new_hp) - end + mcl_util.deal_damage(obj, 1, {type = "in_fire"}) end end diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 6c1a0567e..75f42d92a 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -177,7 +177,7 @@ local function object_in_range(self, object) local factor -- Apply view range reduction for special player armor if object:is_player() and mod_armor then - factor = armor:get_mob_view_range_factor(object, self.name) + factor = mcl_armor.get_mob_view_range_factor(object, self.name) end -- Distance check local dist @@ -3906,7 +3906,7 @@ minetest.register_entity(name, { --default built in engine collision detection self.object:set_properties({ collide_with_objects = false, - }) + }) return mob_activate(self, staticdata, def, dtime) end, @@ -4367,4 +4367,4 @@ minetest.register_globalstep(function(dtime) end timer = 0 end) -]]-- \ No newline at end of file +]]-- diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index 847e2f4a5..4595ce5a7 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -147,12 +147,10 @@ mobs:register_arrow("mobs_mc:blaze_fireball", { visual_size = {x = 0.3, y = 0.3}, textures = {"mcl_fire_fire_charge.png"}, velocity = 15, + _is_fireball = true, -- Direct hit, no fire... just plenty of pain hit_player = function(self, player) - if rawget(_G, "armor") and armor.last_damage_types then - armor.last_damage_types[player:get_player_name()] = "fireball" - end mcl_burning.set_on_fire(player, 5, "blaze") player:punch(self.object, 1.0, { full_punch_interval = 1.0, diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index 83a10bfc4..48d71b45e 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -76,18 +76,18 @@ mobs:register_mob("mobs_mc:ghast", { mobs:spawn_specific( -"mobs_mc:ghast", -"nether", +"mobs_mc:ghast", +"nether", "ground", { "Nether" }, -0, -minetest.LIGHT_MAX+1, -30, -18000, -2, -mobs_mc.spawn_height.nether_min, +0, +minetest.LIGHT_MAX+1, +30, +18000, +2, +mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max) -- fireball (projectile) @@ -97,11 +97,9 @@ mobs:register_arrow("mobs_mc:fireball", { textures = {"mcl_fire_fire_charge.png"}, velocity = 15, collisionbox = {-.5, -.5, -.5, .5, .5, .5}, + _is_fireball = true, hit_player = function(self, player) - if rawget(_G, "armor") and armor.last_damage_types then - armor.last_damage_types[player:get_player_name()] = "fireball" - end player:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = 6}, diff --git a/mods/HUD/mcl_experience/init.lua b/mods/HUD/mcl_experience/init.lua index df733e138..47db77bca 100644 --- a/mods/HUD/mcl_experience/init.lua +++ b/mods/HUD/mcl_experience/init.lua @@ -263,34 +263,7 @@ function mcl_experience.add_experience(player, experience) 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 - local armor_uses = minetest.get_item_group(stack:get_name(), "mcl_armor_uses") - if armor_uses > 0 then - uses = armor_uses - if unbreaking_level > 0 then - uses = uses / (0.6 + 0.4 / (unbreaking_level + 1)) - end - else - local def = stack:get_definition() - if def then - local fixed_uses = def._mcl_uses - if fixed_uses then - uses = fixed_uses - if unbreaking_level > 0 then - uses = uses * (unbreaking_level + 1) - end - end - end - if not uses then - local toolcaps = stack:get_tool_capabilities() - local groupcaps = toolcaps.groupcaps - for _, v in pairs(groupcaps) do - uses = v.uses - break - end - end - end - uses = uses or 0 + local uses = mcl_util.calculate_durability(itemstack) local multiplier = 2 * 65535 / uses local repair = experience * multiplier local new_wear = wear - repair diff --git a/mods/HUD/mcl_hbarmor/init.lua b/mods/HUD/mcl_hbarmor/init.lua index 89b2db7a8..9e5aa634b 100644 --- a/mods/HUD/mcl_hbarmor/init.lua +++ b/mods/HUD/mcl_hbarmor/init.lua @@ -1,9 +1,5 @@ local S = minetest.get_translator("mcl_hbarmor") -if (not armor) or (not armor.def) then - minetest.log("error", "[mcl_hbarmor] Outdated mcl_armor version. Please update your version of mcl_armor!") -end - local mcl_hbarmor = {} -- HUD statbar values @@ -60,11 +56,8 @@ end hb.register_hudbar("armor", 0xFFFFFF, S("Armor"), { icon = "hbarmor_icon.png", bgicon = "hbarmor_bgicon.png", bar = "hbarmor_bar.png" }, 0, 0, 20, mcl_hbarmor.autohide) function mcl_hbarmor.get_armor(player) - if not player or not armor.def then - return false - end local name = player:get_player_name() - local pts = armor:get_armor_points(player) + local pts = player:get_meta():get_int("mcl_armor:armor_points") if not pts then return false else diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index a69fcef5b..4f6144d15 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -7,8 +7,7 @@ local players = {} -- Containing all the items for each Creative Mode tab local inventory_lists = {} -local show_armor = minetest.get_modpath("mcl_armor") ~= nil -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"} @@ -334,23 +333,7 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz if minetest.settings:get_bool("3d_player_preview", true) then player_preview = mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "") else - local img, img_player - if mod_player then - img_player = mcl_player.player_get_preview(player) - else - img_player = "player.png" - end - img = img_player - player_preview = "image[3.9,1.4;1.2333,2.4666;"..img.."]" - if show_armor and armor.textures[playername] and armor.textures[playername].preview then - img = armor.textures[playername].preview - local s1 = img:find("character_preview") - if s1 ~= nil then - s1 = img:sub(s1+21) - img = img_player..s1 - end - player_preview = "image[3.9,1.4;1.2333,2.4666;"..img.."]" - end + player_preview = "image[3.9,1.4;1.2333,2.4666;"..mcl_player.player_get_preview(player).."]" end -- Background images for armor slots (hide if occupied) @@ -373,10 +356,10 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz main_list = "list[current_player;main;0,3.75;9,3;9]".. mcl_formspec.get_itemslot_bg(0,3.75,9,3).. -- armor - "list[detached:"..playername.."_armor;armor;2.5,1.3;1,1;1]".. - "list[detached:"..playername.."_armor;armor;2.5,2.75;1,1;2]".. - "list[detached:"..playername.."_armor;armor;5.5,1.3;1,1;3]".. - "list[detached:"..playername.."_armor;armor;5.5,2.75;1,1;4]".. + "list[current_player;armor;2.5,1.3;1,1;1]".. + "list[current_player;armor;2.5,2.75;1,1;2]".. + "list[current_player;armor;5.5,1.3;1,1;3]".. + "list[current_player;armor;5.5,2.75;1,1;4]".. mcl_formspec.get_itemslot_bg(2.5,1.3,1,1).. mcl_formspec.get_itemslot_bg(2.5,2.75,1,1).. mcl_formspec.get_itemslot_bg(5.5,1.3,1,1).. diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index e9da9486e..dccf81bb4 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -3,7 +3,6 @@ local F = minetest.formspec_escape mcl_inventory = {} -local show_armor = minetest.get_modpath("mcl_armor") ~= nil local mod_player = minetest.get_modpath("mcl_player") ~= nil local mod_craftguide = minetest.get_modpath("mcl_craftguide") ~= nil @@ -68,23 +67,7 @@ local function set_inventory(player, armor_change_only) if minetest.settings:get_bool("3d_player_preview", true) then player_preview = mcl_player.get_player_formspec_model(player, 1.0, 0.0, 2.25, 4.5, "") else - local img, img_player - if mod_player then - img_player = mcl_player.player_get_preview(player) - else - img_player = "player.png" - end - img = img_player - player_preview = "image[0.6,0.2;2,4;"..img.."]" - if show_armor and armor.textures[player_name] and armor.textures[player_name].preview then - img = armor.textures[player_name].preview - local s1 = img:find("character_preview") - if s1 ~= nil then - s1 = img:sub(s1+21) - img = img_player..s1 - end - player_preview = "image[1.1,0.2;2,4;"..img.."]" - end + player_preview = "image[1.1,0.2;2,4;"..mcl_player.player_get_preview(player).."]" end local armor_slots = {"helmet", "chestplate", "leggings", "boots"} @@ -99,10 +82,10 @@ local function set_inventory(player, armor_change_only) "background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png]".. player_preview.. --armor - "list[detached:"..player_name.."_armor;armor;0,0;1,1;1]".. - "list[detached:"..player_name.."_armor;armor;0,1;1,1;2]".. - "list[detached:"..player_name.."_armor;armor;0,2;1,1;3]".. - "list[detached:"..player_name.."_armor;armor;0,3;1,1;4]".. + "list[current_player;armor;0,0;1,1;1]".. + "list[current_player;armor;0,1;1,1;2]".. + "list[current_player;armor;0,2;1,1;3]".. + "list[current_player;armor;0,3;1,1;4]".. mcl_formspec.get_itemslot_bg(0,0,1,1).. mcl_formspec.get_itemslot_bg(0,1,1,1).. mcl_formspec.get_itemslot_bg(0,2,1,1).. @@ -133,10 +116,10 @@ local function set_inventory(player, armor_change_only) "tooltip[__mcl_achievements;"..F(S("Achievements")).."]".. -- for shortcuts "listring[current_player;main]".. - "listring[current_player;craft]".. - "listring[current_player;main]".. - "listring[detached:"..player_name.."_armor;armor]" - + "listring[current_player;armor]".. + "listring[current_player;main]" .. + "listring[current_player;craft]" .. + "listring[current_player;main]" player:set_inventory_formspec(form) end @@ -176,18 +159,10 @@ minetest.register_on_joinplayer(function(player) player:hud_set_hotbar_image("mcl_inventory_hotbar.png") player:hud_set_hotbar_selected_image("mcl_inventory_hotbar_selected.png") - if show_armor then - local set_player_armor_original = armor.set_player_armor - local update_inventory_original = armor.update_inventory - armor.set_player_armor = function(self, player) - set_player_armor_original(self, player) - end - armor.update_inventory = function(self, player) - update_inventory_original(self, player) - set_inventory(player, true) - end - armor:set_player_armor(player) - armor:update_inventory(player) + local old_update_player = mcl_armor.update_player + mcl_armor.update_player = function(player, info) + old_update_player(player, info) + set_inventory(player, true) end -- In Creative Mode, the initial inventory setup is handled in creative.lua diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 1fd63cb4d..ace2c6464 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -170,7 +170,7 @@ local dispenserdef = { minetest.registered_nodes["mcl_armor_stand:armor_stand"].on_metadata_inventory_put(standpos) stack:take_item() inv:set_stack("main", stack_id, stack) - armor:play_equip_sound(dropitem, nil, standpos) + mcl_armor.play_equip_sound(dropitem, nil, standpos) armor_dispensed = true end else @@ -202,9 +202,8 @@ local dispenserdef = { if ainv:get_stack("armor", armor_slot):is_empty() and pinv:get_stack("armor", armor_slot):is_empty() then ainv:set_stack("armor", armor_slot, dropitem) pinv:set_stack("armor", armor_slot, dropitem) - armor:set_player_armor(player) - armor:update_inventory(player) - armor:play_equip_sound(dropitem, player) + mcl_armor.update(player) + mcl_armor.play_equip_sound(dropitem, player) stack:take_item() inv:set_stack("main", stack_id, stack) diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua new file mode 100644 index 000000000..3f0641a54 --- /dev/null +++ b/mods/ITEMS/mcl_armor/api.lua @@ -0,0 +1,232 @@ +function mcl_armor.play_equip_sound(stack, obj, pos, unequip) + local def = stack:get_definition() + local estr = "equip" + if unequip then + estr = "unequip" + end + local snd = def.sounds and def.sounds["_mcl_armor_" .. estr] + if not snd then + -- Fallback sound + snd = { name = "mcl_armor_" .. estr .. "_generic" } + end + if snd then + local dist = 8 + if pos then + dist = 16 + end + minetest.sound_play(snd, {object = obj, pos = pos, gain = 0.5, max_hear_distance = dist}, true) + end +end + +function mcl_armor.equip(itemstack, obj) + local def = itemstack:get_definition() + local element = mcl_armor.elements[def._mcl_armor_element or ""] + local inv = mcl_util.get_inventory(obj) + + if element and inv then + if inv:get_stack("armor", element.index):is_empty() then + local equipping_item = itemstack:take_item() + inv:set_stack("armor", element.index, equipping_item) + if def._on_equip then + def._on_equip(equipping_item) + end + mcl_armor.update(obj) + end + end + + return itemstack +end + +function mcl_armor.equip_on_use(itemstack, player, pointed_thing) + if not player or not player:is_player() then + return itemstack + end + + local new_stack = mcl_util.call_on_rightclick(itemstack, player, pointed_thing) + if new_stack then + return new_stack + end + + return mcl_armor.equip(itemstack, player) +end + +function mcl_armor.register_set(def) + local modname = minetest.get_current_modname() + local S = minetest.get_translator(modname) + local descriptions = def.descriptions or {} + local groups = def.groups or {} + for name, element in pairs(mcl_armor.elements) do + local itemname = element.name .. "_" .. def.name + local itemstring = modname .. ":" .. itemname + + local groups = table.copy(groups) + groups["armor_" .. name] = 1 + groups["combat_armor_" .. name] = 1 + groups.armor = 1 + groups.combat_armor = 1 + groups.mcl_armor_points = def.points[name] + groups.mcl_armor_toughness = def.toughness + groups.mcl_armor_uses = math.floor(def.durability * element.durability) + 1 + groups.enchantability = def.enchantability + + minetest.register_tool(itemstring, { + description = S(def.description .. " " .. (descriptions[name] or element.description)), + _doc_items_longdesc = mcl_armor.longdesc, + _doc_items_usagehelp = mcl_armor.usage, + inventory_image = modname .. "_inv_" .. itemname .. ".png", + _repair_material = def.repair_material or def.craft_material, + groups = groups, + sounds = { + _mcl_armor_equip = def.sound_equip or modname .. "_equip_" .. def.name, + _mcl_armor_unequip = def.sound_unequip or modname .. "_unequip_" .. def.name, + }, + on_place = mcl_armor.equip_on_use, + on_secondary_use = mcl_armor.equip_on_use, + _on_equip = def.on_equip, + _on_unequip = def.on_unequip, + _mcl_armor_element = name, + _mcl_armor_texture = modname .. "_" .. itemname .. ".png", + _mcl_armor_preview = modname .. "_" .. itemname .. "_preview.png", + }) + + if def.craft_material then + minetest.register_craft({ + output = itemstring, + recipe = element.craft(def.craft_material), + }) + end + + if def.cook_material then + minetest.register_craft({ + type = "cooking", + output = def.cook_material, + recipe = itemstring, + cooktime = 10, + }) + end + end +end + +mcl_armor.protection_enchantments = { + flags = {}, + types = {}, + wildcard = {}, +} + +function mcl_armor.register_protection_enchantment(def) + local prot_def = {id = def.id, factor = def.factor} + if def.damage_flag then + local tbl = mcl_armor.protection_enchantments.flags[def.damage_flag] or {} + table.insert(tbl, prot_def) + mcl_armor.protection_enchantments.flags = tbl + elseif def.damage_type then + local tbl = mcl_armor.protection_enchantments.types[def.damage_type] or {} + table.insert(tbl, prot_def) + mcl_armor.protection_enchantments.types = tbl + else + table.insert(mcl_armor.protection_enchantments.wildcard, prot_def) + end + mcl_enchanting.enchantments[def.id] = { + name = def.name, + max_level = def.max_level or 4, + primary = def.primary or {combat_armor = true}, + secondary = {}, + disallow = {}, + incompatible = def.incompatible or {}, + weight = def.weight or 5, + description = def.description, + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = def.treasure or false, + power_range_table = def.power_range_table, + inv_combat_tab = true, + inv_tool_tab = false, + } +end + +function mcl_armor.get_armor_points(obj) + local points = 0 + local inv = mcl_util.get_inventory(obj) + if inv then + for i = 2, 5 do + local itemstack = inv:get_stack("armor", i) + if not itemstack:is_empty() then + points = points + minetest.get_item_group(itemstack:get_name(), "mcl_armor_points") + end + end + end + return points +end + +-- Returns a change factor for a mob's view_range for the given object +-- or nil, if there's no change. Certain armors (like mob heads) can +-- affect the view range of mobs. +function mcl_armor.get_mob_view_range_factor(obj, mob) + local inv = mcl_util.get_inventory(obj) + local factor + if inv then + for i = 2, 5 do + local itemstack = inv:get_stack("armor", i) + if not itemstack:is_empty() then + local def = itemstack:get_definition() + if def._mcl_armor_mob_range_mob == mob then + if not factor then + factor = def._mcl_armor_mob_range_factor + elseif factor == 0 then + return 0 + else + factor = factor * def._mcl_armor_mob_range_factor + end + end + end + end + end + return factor +end + +function mcl_armor.update(obj) + local info = {points = 0} + + local inv = mcl_util.get_inventory(obj) + + if inv then + for i = 2, 5 do + local itemstack = inv:get_stack("armor", i) + + local itemname = itemstack:get_name() + if minetest.registered_aliases[itemname] then + itemname = minetest.registered_aliases[itemname] + end + + if not itemstack:is_empty() then + local def = itemstack:get_definition() + + if def._mcl_armor_texture then + info.texture = "(" .. def._mcl_armor_texture .. ")" .. (info.texture and "^" .. info.texture or "") + end + + if obj:is_player() and def._mcl_armor_preview then + info.preview = "(player.png^[opacity:0^" .. def._mcl_armor_preview .. ")" .. (info.preview and "^" .. info.preview or "" ) + end + + info.points = info.points + minetest.get_item_group(itemname, "mcl_armor_points") + end + end + end + + info.texture = info.texture or "blank.png" + + if obj:is_player() then + info.preview = info.preview or "blank.png" + + mcl_armor.update_player(obj, info) + else + local luaentity = obj:get_luaentity() + + if luaentity.update_armor then + luaentity:update_armor(info) + end + end +end + diff --git a/mods/ITEMS/mcl_armor/armor.lua b/mods/ITEMS/mcl_armor/armor.lua deleted file mode 100644 index a35841fe2..000000000 --- a/mods/ITEMS/mcl_armor/armor.lua +++ /dev/null @@ -1,675 +0,0 @@ -local ARMOR_INIT_DELAY = 1 -local ARMOR_INIT_TIMES = 1 -local ARMOR_BONES_DELAY = 1 - -local skin_mod = nil - -local modpath = minetest.get_modpath(minetest.get_current_modname()) - -armor = { - timer = 0, - elements = {"head", "torso", "legs", "feet"}, - physics = {"jump","speed","gravity"}, - formspec = "size[8,8.5]image[2,0.75;2,4;armor_preview]" - .."list[current_player;main;0,4.5;8,4;]" - .."list[current_player;craft;4,1;3,3;]" - .."list[current_player;craftpreview;7,2;1,1;]" - .."listring[current_player;main]" - .."listring[current_player;craft]", - textures = {}, - default_skin = "character", - last_damage_types = {}, -} - -if minetest.get_modpath("mcl_skins") then - skin_mod = "mcl_skins" -elseif minetest.get_modpath("skins") then - skin_mod = "skins" -elseif minetest.get_modpath("simple_skins") then - skin_mod = "simple_skins" -elseif minetest.get_modpath("u_skins") then - skin_mod = "u_skins" -elseif minetest.get_modpath("wardrobe") then - skin_mod = "wardrobe" -end - -function armor.on_armor_use(itemstack, user, pointed_thing) - if not user or user:is_player() == false then - return itemstack - end - - -- Call on_rightclick if the pointed node defines it - if pointed_thing.type == "node" then - local node = minetest.get_node(pointed_thing.under) - if user and not user:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack - end - end - end - - local name, player_inv, armor_inv = armor:get_valid_player(user, "[on_armor_use]") - if not name then - return itemstack - end - - local def = itemstack:get_definition() - local slot - if def.groups and def.groups.armor_head then - slot = 2 - elseif def.groups and def.groups.armor_torso then - slot = 3 - elseif def.groups and def.groups.armor_legs then - slot = 4 - elseif def.groups and def.groups.armor_feet then - slot = 5 - end - - if slot then - local itemstack_single = ItemStack(itemstack) - itemstack_single:set_count(1) - local itemstack_slot = armor_inv:get_stack("armor", slot) - if itemstack_slot:is_empty() then - armor_inv:set_stack("armor", slot, itemstack_single) - player_inv:set_stack("armor", slot, itemstack_single) - armor:set_player_armor(user) - armor:update_inventory(user) - armor:play_equip_sound(itemstack_single, user) - itemstack:take_item() - elseif itemstack:get_count() <= 1 and not mcl_enchanting.has_enchantment(itemstack_slot, "curse_of_binding") then - armor_inv:set_stack("armor", slot, itemstack_single) - player_inv:set_stack("armor", slot, itemstack_single) - armor:set_player_armor(user) - armor:update_inventory(user) - armor:play_equip_sound(itemstack_single, user) - itemstack = ItemStack(itemstack_slot) - end - end - - return itemstack -end - -armor.def = { - count = 0, -} - -armor.update_player_visuals = function(self, player) - if not player then - return - end - - local wielditem = player:get_wielded_item() - local def = wielditem:get_definition() - if def and def._mcl_toollike_wield then - player:set_bone_position("Wield_Item", vector.new(0,3.9,1.3), vector.new(90,0,0)) - elseif string.find(wielditem:get_name(), "mcl_bows:bow") then - player:set_bone_position("Wield_Item", vector.new(.5,4.5,-1.6), vector.new(90,0,20)) - else - player:set_bone_position("Wield_Item", vector.new(-1.5,4.9,1.8), vector.new(135,0,90)) - end - - local name = player:get_player_name() - if self.textures[name] then - mcl_player.player_set_textures(player, { - self.textures[name].skin, - self.textures[name].armor, - self.textures[name].wielditem, - }) - end -end - -armor.set_player_armor = function(self, player) - local name, player_inv = armor:get_valid_player(player, "[set_player_armor]") - if not name then - return - end - local armor_texture = "blank.png" - local armor_level = 0 - local mcl_armor_points = 0 - local items = 0 - local elements = {} - local textures = {} - local physics_o = {speed=1,gravity=1,jump=1} - local material = {type=nil, count=1} - local preview - for _,v in ipairs(self.elements) do - elements[v] = false - end - for i=1, 6 do - local stack = player_inv:get_stack("armor", i) - local item = stack:get_name() - if minetest.registered_aliases[item] then - item = minetest.registered_aliases[item] - end - if stack:get_count() == 1 then - local def = stack:get_definition() - for k, v in pairs(elements) do - if v == false then - local level = def.groups["armor_"..k] - if level then - local texture = def.texture or item:gsub("%:", "_") - local enchanted_addition = (mcl_enchanting.is_enchanted(item) and mcl_enchanting.overlay or "") - table.insert(textures, "("..texture..".png"..enchanted_addition..")") - preview = "(player.png^[opacity:0^"..texture.."_preview.png"..enchanted_addition..")"..(preview and "^"..preview or "") - armor_level = armor_level + level - items = items + 1 - mcl_armor_points = mcl_armor_points + (def.groups["mcl_armor_points"] or 0) - for kk,vv in ipairs(self.physics) do - local o_value = def.groups["physics_"..vv] - if o_value then - physics_o[vv] = physics_o[vv] + o_value - end - end - local mat = string.match(item, "%:.+_(.+)$") - if material.type then - if material.type == mat then - material.count = material.count + 1 - end - else - material.type = mat - end - elements[k] = true - end - end - end - end - end - preview = (armor:get_preview(name) or "character_preview.png")..(preview and "^"..preview or "") - if minetest.get_modpath("shields") then - armor_level = armor_level * 0.9 - end - if material.type and material.count == #self.elements then - armor_level = armor_level * 1.1 - end - if #textures > 0 then - armor_texture = table.concat(textures, "^") - end - local armor_groups = player:get_armor_groups() - armor_groups.fleshy = 100 - armor_groups.level = nil - if armor_level > 0 then - armor_groups.level = math.floor(armor_level / 20) - armor_groups.fleshy = 100 - armor_level - end - player:set_armor_groups(armor_groups) - -- Physics override intentionally removed because of possible conflicts - self.textures[name].armor = armor_texture - self.textures[name].preview = preview - self.def[name].count = items - self.def[name].level = armor_level - self.def[name].heal = mcl_armor_points - self.def[name].jump = physics_o.jump - self.def[name].speed = physics_o.speed - self.def[name].gravity = physics_o.gravity - self:update_player_visuals(player) -end - -armor.update_armor = function(self, player) - -- Legacy support: Called when armor levels are changed - -- Other mods can hook on to this function, see hud mod for example -end - -armor.get_armor_points = function(self, player) - local name, player_inv, armor_inv = armor:get_valid_player(player, "[get_armor_points]") - if not name then - return nil - end - local pts = 0 - for i=1, 6 do - local stack = player_inv:get_stack("armor", i) - if stack:get_count() > 0 then - local p = minetest.get_item_group(stack:get_name(), "mcl_armor_points") - if p then - pts = pts + p - end - end - end - return pts -end - --- Returns a change factor for a mob's view_range for the given player --- or nil, if there's no change. Certain armors (like mob heads) can --- affect the view range of mobs. -armor.get_mob_view_range_factor = function(self, player, mob) - local name, player_inv, armor_inv = armor:get_valid_player(player, "[get_mob_view_range_factor]") - if not name then - return - end - local factor - for i=1, 6 do - local stack = player_inv:get_stack("armor", i) - if stack:get_count() > 0 then - local def = stack:get_definition() - if def._mcl_armor_mob_range_mob == mob then - if not factor then - factor = def._mcl_armor_mob_range_factor - elseif factor == 0 then - return 0 - else - factor = factor * def._mcl_armor_mob_range_factor - end - end - end - end - return factor -end - -armor.get_player_skin = function(self, name) - local skin = nil - if skin_mod == "mcl_skins" then - skin = mcl_skins.skins[name] - elseif skin_mod == "skins" or skin_mod == "simple_skins" then - skin = skins.skins[name] - elseif skin_mod == "u_skins" then - skin = u_skins.u_skins[name] - elseif skin_mod == "wardrobe" then - skin = string.gsub(wardrobe.playerSkins[name], "%.png$","") - end - return skin or armor.default_skin -end - -armor.get_preview = function(self, name) - if skin_mod == "skins" then - return armor:get_player_skin(name).."_preview.png" - end -end - -armor.get_armor_formspec = function(self, name) - if not armor.textures[name] then - minetest.log("error", "mcl_armor: Player texture["..name.."] is nil [get_armor_formspec]") - return "" - end - if not armor.def[name] then - minetest.log("error", "mcl_armor: Armor def["..name.."] is nil [get_armor_formspec]") - return "" - end - local formspec = armor.formspec.."list[detached:"..name.."_armor;armor;0,1;2,3;]" - formspec = formspec:gsub("armor_preview", armor.textures[name].preview) - formspec = formspec:gsub("armor_level", armor.def[name].level) - formspec = formspec:gsub("mcl_armor_points", armor.def[name].heal) - return formspec -end - -armor.update_inventory = function(self, player) -end - -armor.get_valid_player = function(self, player, msg) - msg = msg or "" - if not player then - minetest.log("error", "mcl_armor: Player reference is nil "..msg) - return - end - local name = player:get_player_name() - if not name then - minetest.log("error", "mcl_armor: Player name is nil "..msg) - return - end - local pos = player:get_pos() - local player_inv = player:get_inventory() - local armor_inv = minetest.get_inventory({type="detached", name=name.."_armor"}) - if not pos then - minetest.log("error", "mcl_armor: Player position is nil "..msg) - return - elseif not player_inv then - minetest.log("error", "mcl_armor: Player inventory is nil "..msg) - return - elseif not armor_inv then - minetest.log("error", "mcl_armor: Detached armor inventory is nil "..msg) - return - end - return name, player_inv, armor_inv, pos -end - -armor.play_equip_sound = function(self, stack, player, pos, unequip) - local def = stack:get_definition() - local estr = "equip" - if unequip then - estr = "unequip" - end - local snd = def.sounds and def.sounds["_mcl_armor_"..estr] - if not snd then - -- Fallback sound - snd = { name = "mcl_armor_"..estr.."_generic" } - end - if snd then - local dist = 8 - if pos then - dist = 16 - end - minetest.sound_play(snd, {object=player, pos=pos, gain=0.5, max_hear_distance=dist}, true) - end -end - --- Register Player Model - -mcl_player.player_register_model("mcl_armor_character.b3d", { - animation_speed = 30, - textures = { - armor.default_skin..".png", - "blank.png", - "blank.png", - }, - animations = { - stand = {x=0, y=79}, - lay = {x=162, y=166}, - walk = {x=168, y=187}, - mine = {x=189, y=198}, - walk_mine = {x=200, y=219}, - sit = {x=81, y=160}, - sneak_stand = {x=222, y=302}, - sneak_mine = {x=346, y=365}, - sneak_walk = {x=304, y=323}, - sneak_walk_mine = {x=325, y=344}, - swim_walk = {x=368, y=387}, - swim_walk_mine = {x=389, y=408}, - swim_stand = {x=434, y=434}, - swim_mine = {x=411, y=430}, - run_walk = {x=440, y=459}, - run_walk_mine = {x=461, y=480}, - sit_mount = {x=484, y=484}, - die = {x=498, y=498}, - fly = {x=502, y=581}, - }, -}) - -mcl_player.player_register_model("mcl_armor_character_female.b3d", { - animation_speed = 30, - textures = { - armor.default_skin..".png", - "blank.png", - "blank.png", - }, - animations = { - stand = {x=0, y=79}, - lay = {x=162, y=166}, - walk = {x=168, y=187}, - mine = {x=189, y=198}, - walk_mine = {x=200, y=219}, - sit = {x=81, y=160}, - sneak_stand = {x=222, y=302}, - sneak_mine = {x=346, y=365}, - sneak_walk = {x=304, y=323}, - sneak_walk_mine = {x=325, y=344}, - swim_walk = {x=368, y=387}, - swim_walk_mine = {x=389, y=408}, - swim_stand = {x=434, y=434}, - swim_mine = {x=411, y=430}, - run_walk = {x=440, y=459}, - run_walk_mine = {x=461, y=480}, - sit_mount = {x=484, y=484}, - die = {x=498, y=498}, - fly = {x=502, y=581}, - }, -}) - --- Register Callbacks - -minetest.register_on_player_receive_fields(function(player, formname, fields) - local name = armor:get_valid_player(player, "[on_player_receive_fields]") - if not name then - return - end - if fields.armor then - return - end - for field, _ in pairs(fields) do - if string.find(field, "skins_set") then - minetest.after(0, function(name) - local player = minetest.get_player_by_name(name) - if not player then - return - end - local skin = armor:get_player_skin(name) - armor.textures[name].skin = skin..".png" - armor:set_player_armor(player) - end, player:get_player_name()) - end - end -end) - -minetest.register_on_joinplayer(function(player) - mcl_player.player_set_model(player, "mcl_armor_character.b3d") - local name = player:get_player_name() - local player_inv = player:get_inventory() - local armor_inv = minetest.create_detached_inventory(name.."_armor", { - on_put = function(inv, listname, index, stack, player) - player:get_inventory():set_stack(listname, index, stack) - armor:set_player_armor(player) - armor:update_inventory(player) - armor:play_equip_sound(stack, player) - end, - on_take = function(inv, listname, index, stack, player) - player:get_inventory():set_stack(listname, index, nil) - armor:set_player_armor(player) - armor:update_inventory(player) - armor:play_equip_sound(stack, player, nil, true) - end, - on_move = function(inv, from_list, from_index, to_list, to_index, count, player) - local plaver_inv = player:get_inventory() - local stack = inv:get_stack(to_list, to_index) - player_inv:set_stack(to_list, to_index, stack) - player_inv:set_stack(from_list, from_index, nil) - armor:set_player_armor(player) - armor:update_inventory(player) - armor:play_equip_sound(stack, player) - end, - allow_put = function(inv, listname, index, stack, player) - local iname = stack:get_name() - local g - local groupcheck - if index == 2 then - g = minetest.get_item_group(iname, "armor_head") - elseif index == 3 then - g = minetest.get_item_group(iname, "armor_torso") - elseif index == 4 then - g = minetest.get_item_group(iname, "armor_legs") - elseif index == 5 then - g = minetest.get_item_group(iname, "armor_feet") - end - -- Minor FIXME: If player attempts to place stack into occupied slot, this is rejected. - -- It would be better if 1 item is placed in exchanged for the item in the slot. - if g ~= 0 and g ~= nil and (inv:get_stack(listname, index):is_empty() or (inv:get_stack(listname, index):get_name() ~= stack:get_name()) and stack:get_count() <= 1) then - return 1 - else - return 0 - end - end, - allow_take = function(inv, listname, index, stack, player) - if mcl_enchanting.has_enchantment(stack, "curse_of_binding") and not minetest.settings:get_bool("creative") then - return 0 - end - return stack:get_count() - end, - allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) - return 0 - end, - }, name) - armor_inv:set_size("armor", 6) - player_inv:set_size("armor", 6) - for i=1, 6 do - local stack = player_inv:get_stack("armor", i) - armor_inv:set_stack("armor", i, stack) - end - armor.def[name] = { - count = 0, - level = 0, - heal = 0, - jump = 1, - speed = 1, - gravity = 1, - } - armor.textures[name] = { - skin = armor.default_skin..".png", - armor = "blank.png", - wielditem = "blank.png", - preview = armor.default_skin.."_preview.png", - } - if skin_mod == "mcl_skins" then - local skin = mcl_skins.skins[name] - if skin then - armor.textures[name].skin = skin..".png" - end - elseif skin_mod == "skins" then - local skin = skins.skins[name] - if skin and skins.get_type(skin) == skins.type.MODEL then - armor.textures[name].skin = skin..".png" - end - elseif skin_mod == "simple_skins" then - local skin = skins.skins[name] - if skin then - armor.textures[name].skin = skin..".png" - end - elseif skin_mod == "u_skins" then - local skin = u_skins.u_skins[name] - if skin and u_skins.get_type(skin) == u_skins.type.MODEL then - armor.textures[name].skin = skin..".png" - end - elseif skin_mod == "wardrobe" then - local skin = wardrobe.playerSkins[name] - if skin then - armor.textures[name].skin = skin - end - end - if minetest.get_modpath("player_textures") then - local filename = minetest.get_modpath("player_textures").."/textures/player_"..name - local f = io.open(filename..".png") - if f then - f:close() - armor.textures[name].skin = "player_"..name..".png" - end - end - for i=1, ARMOR_INIT_TIMES do - minetest.after(ARMOR_INIT_DELAY * i, function(name) - local player = minetest.get_player_by_name(name) - if not player then - return - end - armor:set_player_armor(player) - end, player:get_player_name()) - end -end) - -minetest.register_on_player_hpchange(function(player, hp_change, reason) - local name, player_inv, armor_inv = armor:get_valid_player(player, "[on_hpchange]") - if name and hp_change < 0 then - local damage_type = armor.last_damage_types[name] - armor.last_damage_types[name] = nil - - -- Armor doesn't protect from set_hp (commands like /kill), - if reason.type == "set_hp" then - return hp_change - end - - local regular_reduction = reason.type ~= "drown" and reason.type ~= "fall" and reason.other ~= "harming" and reason.other ~= "poison" - - local heal_max = 0 - local items = 0 - local armor_damage = math.max(1, math.floor(math.abs(hp_change)/4)) - - local total_points = 0 - local total_toughness = 0 - local epf = 0 - local thorns_damage = 0 - local thorns_damage_regular = 0 - for i=1, 6 do - local stack = player_inv:get_stack("armor", i) - if stack:get_count() > 0 then - local enchantments = mcl_enchanting.get_enchantments(stack) - local pts = stack:get_definition().groups["mcl_armor_points"] or 0 - local tough = stack:get_definition().groups["mcl_armor_toughness"] or 0 - total_points = total_points + pts - total_toughness = total_toughness + tough - - local protection_level = enchantments.protection or 0 - if protection_level > 0 then - epf = epf + protection_level * 1 - end - local blast_protection_level = enchantments.blast_protection or 0 - if blast_protection_level > 0 and damage_type == "explosion" then - epf = epf + blast_protection_level * 2 - end - local fire_protection_level = enchantments.fire_protection or 0 - if fire_protection_level > 0 and (damage_type == "burning" or damage_type == "fireball" or reason.type == "node_damage" and - (reason.node == "mcl_fire:fire" or reason.node == "mcl_core:lava_source" or reason.node == "mcl_core:lava_flowing")) then - epf = epf + fire_protection_level * 2 - end - local projectile_protection_level = enchantments.projectile_protection or 0 - if projectile_protection_level and (damage_type == "projectile" or damage_type == "fireball") then - epf = epf + projectile_protection_level * 2 - end - local feather_falling_level = enchantments.feather_falling or 0 - if feather_falling_level and reason.type == "fall" then - epf = epf + feather_falling_level * 3 - end - - local did_thorns_damage = false - local thorns_level = enchantments.thorns or 0 - if thorns_level then - if thorns_level > 10 then - thorns_damage = thorns_damage + thorns_level - 10 - did_thorns_damage = true - elseif thorns_damage_regular < 4 and thorns_level * 0.15 > math.random() then - local thorns_damage_regular_new = math.min(4, thorns_damage_regular + math.random(4)) - thorns_damage = thorns_damage + thorns_damage_regular_new - thorns_damage_regular - thorns_damage_regular = thorns_damage_regular_new - did_thorns_damage = true - end - end - - -- Damage armor - local use = stack:get_definition().groups["mcl_armor_uses"] or 0 - if use > 0 and regular_reduction then - local unbreaking_level = enchantments.unbreaking or 0 - if unbreaking_level > 0 then - use = use / (0.6 + 0.4 / (unbreaking_level + 1)) - end - local wear = armor_damage * math.floor(65536/use) - if did_thorns_damage then - wear = wear * 3 - end - stack:add_wear(wear) - end - - local item = stack:get_name() - armor_inv:set_stack("armor", i, stack) - player_inv:set_stack("armor", i, stack) - items = items + 1 - if stack:get_count() == 0 then - armor:set_player_armor(player) - armor:update_inventory(player) - end - end - end - local damage = math.abs(hp_change) - - if regular_reduction then - -- Damage calculation formula (from ) - damage = damage * (1 - math.min(20, math.max((total_points/5), total_points - damage / (2+(total_toughness/4)))) / 25) - end - damage = damage * (1 - (math.min(20, epf) / 25)) - damage = math.floor(damage+0.5) - - if reason.type == "punch" and thorns_damage > 0 then - local obj = reason.object - if obj then - local luaentity = obj:get_luaentity() - if luaentity then - local shooter = obj._shooter - if shooter then - obj = shooter - end - end - obj:punch(player, 1.0, { - full_punch_interval=1.0, - damage_groups = {fleshy = thorns_damage}, - }) - end - end - - hp_change = -math.abs(damage) - - armor.def[name].count = items - armor:update_armor(player) - end - return hp_change -end, true) diff --git a/mods/ITEMS/mcl_armor/damage.lua b/mods/ITEMS/mcl_armor/damage.lua new file mode 100644 index 000000000..9dce824ea --- /dev/null +++ b/mods/ITEMS/mcl_armor/damage.lua @@ -0,0 +1,103 @@ +function mcl_armor.damage_modifier(obj, hp_change, reason) + if hp_change > 0 then + return hp_change + end + + local damage = -hp_change + local flags = reason.flags + + if flags.bypasses_armor and flags.bypasses_magic then + return hp_change + end + + local uses = math.max(1, math.floor(damage / 4)) + + local points = 0 + local toughness = 0 + local enchantment_protection_factor = 0 + + local thorns_damage_regular = 0 + local thorns_damage_irregular = 0 + local thorns_pieces = {} + + local inv = mcl_util.get_inventory(obj) + + if inv then + for name, element in pairs(mcl_armor.elements) do + local itemstack = inventory:get_stack("armor", element.index) + if not stack:is_empty() then + local itemname = stack:get_name() + local enchantments = mcl_enchanting.get_enchantments(itemstack) + + if not flags.bypasses_armor then + points = points + minetest.get_item_group(itemname, "mcl_armor_points") + toughness = toughness + minetest.get_item_group(itemname, "mcl_armor_toughness") + + mcl_util.use_item_durability(itemstack, uses) + inventory:set_stack("armor", element.index, itemstack) + end + + if not flags.bypasses_magic then + local function add_enchantments(tbl) + if tbl then + for _, enchantment in pairs(tbl) do + local level = enchantments[enchantment.id] + + if level > 0 then + enchantment_protection_factor = enchantment_protection_factor + level * enchantment.factor + end + end + end + end + + add_enchantments(mcl_armor.protection_enchantments.wildcard) + add_enchantments(mcl_armor.protection_enchantments.types[reason.type]) + + for flag, value in pairs(flags) do + if value then + add_enchantments(mcl_armor.protection_enchantments.flags[flag]) + end + end + end + + if reason.source and enchantments.thorns > 0 then + local do_irregular_damage = enchantments.thorns > 10 + + 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 + else + thorns_damage_regular = math.min(4, thorns_damage_regular + math.random(4)) + end + end + + table.insert(thorns_pieces, {index = element.index, itemstack = itemstack}) + end + end + end + end + + -- https://minecraft.gamepedia.com/Armor#Damage_protection + damage = damage * (1 - math.min(20, math.max((points / 5), points - damage / (2 + (toughness / 4)))) / 25) + + -- https://minecraft.gamepedia.com/Armor#Enchantments + damage = damage * (1 - math.min(20, enchantment_protection_factor) / 25) + + local thorns_damage = thorns_damage_regular + thorns_damage_irregular + + if thorns_damage > 0 and reason.source ~= obj then + mcl_util.deal_damage(reason.source, {type = "thorns", direct = obj, source = reason.source}) + + local thorns_item = thorns_pieces[math.random(#thorns_pieces)] + mcl_util.use_item_durability(thorns_item.itemstack, 2) + inventory:set_stack("armor", thorns_item.index, thorns_item.itemstack) + end + + mcl_armor.update(obj) + + return -math.floor(damage + 0.5) +end + +mcl_damage.register_modifier(function(player, hp_change, _, reason) + return mcl_armor.damage_modifier(player, hp_change, reason) +end) diff --git a/mods/ITEMS/mcl_armor/init.lua b/mods/ITEMS/mcl_armor/init.lua index bce597b7f..cc8fb2d32 100644 --- a/mods/ITEMS/mcl_armor/init.lua +++ b/mods/ITEMS/mcl_armor/init.lua @@ -1,405 +1,67 @@ local S = minetest.get_translator("mcl_armor") -dofile(minetest.get_modpath(minetest.get_current_modname()).."/armor.lua") -dofile(minetest.get_modpath(minetest.get_current_modname()).."/alias.lua") - --- Regisiter Head Armor - -local longdesc = S("This is a piece of equippable armor which reduces the amount of damage you receive.") -local usage = S("To equip it, put it on the corresponding armor slot in your inventory menu.") - -minetest.register_tool("mcl_armor:elytra", { - description = S("Elytra"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_elytra.png", - groups = {armor_torso=1, mcl_armor_points=0, mcl_armor_uses=10, enchantability=0}, - sounds = { - _mcl_armor_equip = "mcl_armor_equip_leather", - _mcl_armor_unequip = "mcl_armor_unequip_leather", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - -minetest.register_tool("mcl_armor:helmet_leather", { - description = S("Leather Cap"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_helmet_leather.png", - groups = {armor_head=1, mcl_armor_points=1, mcl_armor_uses=56, enchantability=15}, - _repair_material = "mcl_mobitems:leather", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_leather", - _mcl_armor_unequip = "mcl_armor_unequip_leather", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - -minetest.register_tool("mcl_armor:helmet_iron", { - description = S("Iron Helmet"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_helmet_iron.png", - groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=166, enchantability=9 }, - _repair_material = "mcl_core:iron_ingot", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_iron", - _mcl_armor_unequip = "mcl_armor_unequip_iron", - }, - - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - -minetest.register_tool("mcl_armor:helmet_gold", { - description = S("Golden Helmet"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_helmet_gold.png", - groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=78, enchantability=25 }, - _repair_material = "mcl_core:gold_ingot", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_iron", - _mcl_armor_unequip = "mcl_armor_unequip_iron", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - -minetest.register_tool("mcl_armor:helmet_diamond",{ - description = S("Diamond Helmet"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_helmet_diamond.png", - groups = {armor_head=1, mcl_armor_points=3, mcl_armor_uses=364, mcl_armor_toughness=2, enchantability=10 }, - _repair_material = "mcl_core:diamond", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_diamond", - _mcl_armor_unequip = "mcl_armor_unequip_diamond", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - -minetest.register_tool("mcl_armor:helmet_chain", { - description = S("Chain Helmet"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_helmet_chain.png", - groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=166, enchantability=12 }, - _repair_material = "mcl_core:iron_ingot", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_chainmail", - _mcl_armor_unequip = "mcl_armor_unequip_chainmail", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - --- Regisiter Torso Armor - -minetest.register_tool("mcl_armor:chestplate_leather", { - description = S("Leather Tunic"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_chestplate_leather.png", - groups = {armor_torso=1, mcl_armor_points=3, mcl_armor_uses=81, enchantability=15 }, - _repair_material = "mcl_mobitems:leather", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_leather", - _mcl_armor_unequip = "mcl_armor_unequip_leather", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - -minetest.register_tool("mcl_armor:chestplate_iron", { - description = S("Iron Chestplate"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_chestplate_iron.png", - groups = {armor_torso=1, mcl_armor_points=6, mcl_armor_uses=241, enchantability=9 }, - _repair_material = "mcl_core:iron_ingot", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_iron", - _mcl_armor_unequip = "mcl_armor_unequip_iron", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - -minetest.register_tool("mcl_armor:chestplate_gold", { - description = S("Golden Chestplate"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_chestplate_gold.png", - groups = {armor_torso=1, mcl_armor_points=5, mcl_armor_uses=113, enchantability=25 }, - _repair_material = "mcl_core:gold_ingot", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_iron", - _mcl_armor_unequip = "mcl_armor_unequip_iron", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - -minetest.register_tool("mcl_armor:chestplate_diamond",{ - description = S("Diamond Chestplate"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_chestplate_diamond.png", - groups = {armor_torso=1, mcl_armor_points=8, mcl_armor_uses=529, mcl_armor_toughness=2, enchantability=10 }, - _repair_material = "mcl_core:diamond", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_diamond", - _mcl_armor_unequip = "mcl_armor_unequip_diamond", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - -minetest.register_tool("mcl_armor:chestplate_chain", { - description = S("Chain Chestplate"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_chestplate_chain.png", - groups = {armor_torso=1, mcl_armor_points=5, mcl_armor_uses=241, enchantability=12 }, - _repair_material = "mcl_core:iron_ingot", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_chainmail", - _mcl_armor_unequip = "mcl_armor_unequip_chainmail", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - --- Regisiter Leg Armor - -minetest.register_tool("mcl_armor:leggings_leather", { - description = S("Leather Pants"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_leggings_leather.png", - groups = {armor_legs=1, mcl_armor_points=2, mcl_armor_uses=76, enchantability=15 }, - _repair_material = "mcl_mobitems:leather", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_leather", - _mcl_armor_unequip = "mcl_armor_unequip_leather", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - -minetest.register_tool("mcl_armor:leggings_iron", { - description = S("Iron Leggings"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_leggings_iron.png", - groups = {armor_legs=1, mcl_armor_points=5, mcl_armor_uses=226, enchantability=9 }, - _repair_material = "mcl_core:iron_ingot", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_iron", - _mcl_armor_unequip = "mcl_armor_unequip_iron", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - -minetest.register_tool("mcl_armor:leggings_gold", { - description = S("Golden Leggings"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_leggings_gold.png", - groups = {armor_legs=1, mcl_armor_points=3, mcl_armor_uses=106, enchantability=25 }, - _repair_material = "mcl_core:gold_ingot", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_iron", - _mcl_armor_unequip = "mcl_armor_unequip_iron", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - -minetest.register_tool("mcl_armor:leggings_diamond",{ - description = S("Diamond Leggings"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_leggings_diamond.png", - groups = {armor_legs=1, mcl_armor_points=6, mcl_armor_uses=496, mcl_armor_toughness=2, enchantability=10 }, - _repair_material = "mcl_core:diamond", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_diamond", - _mcl_armor_unequip = "mcl_armor_unequip_diamond", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - -minetest.register_tool("mcl_armor:leggings_chain", { - description = S("Chain Leggings"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_leggings_chain.png", - groups = {armor_legs=1, mcl_armor_points=4, mcl_armor_uses=226, enchantability=12 }, - _repair_material = "mcl_core:iron_ingot", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_chainmail", - _mcl_armor_unequip = "mcl_armor_unequip_chainmail", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) --- Regisiter Boots - -minetest.register_tool("mcl_armor:boots_leather", { - description = S("Leather Boots"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_boots_leather.png", - groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=66, enchantability=15 }, - _repair_material = "mcl_mobitems:leather", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_leather", - _mcl_armor_unequip = "mcl_armor_unequip_leather", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - -minetest.register_tool("mcl_armor:boots_iron", { - description = S("Iron Boots"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_boots_iron.png", - groups = {armor_feet=1, mcl_armor_points=2, mcl_armor_uses=196, enchantability=9 }, - _repair_material = "mcl_core:iron_ingot", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_iron", - _mcl_armor_unequip = "mcl_armor_unequip_iron", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - -minetest.register_tool("mcl_armor:boots_gold", { - description = S("Golden Boots"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_boots_gold.png", - groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=92, enchantability=25 }, - _repair_material = "mcl_core:gold_ingot", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_iron", - _mcl_armor_unequip = "mcl_armor_unequip_iron", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - -minetest.register_tool("mcl_armor:boots_diamond",{ - description = S("Diamond Boots"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_boots_diamond.png", - groups = {armor_feet=1, mcl_armor_points=3, mcl_armor_uses=430, mcl_armor_toughness=2, enchantability=10 }, - _repair_material = "mcl_core:diamond", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_diamond", - _mcl_armor_unequip = "mcl_armor_unequip_diamond", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - -minetest.register_tool("mcl_armor:boots_chain", { - description = S("Chain Boots"), - _doc_items_longdesc = longdesc, - _doc_items_usagehelp = usage, - inventory_image = "mcl_armor_inv_boots_chain.png", - groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=196, enchantability=12 }, - _repair_material = "mcl_core:iron_ingot", - sounds = { - _mcl_armor_equip = "mcl_armor_equip_chainmail", - _mcl_armor_unequip = "mcl_armor_unequip_chainmail", - }, - on_place = armor.on_armor_use, - on_secondary_use = armor.on_armor_use, -}) - --- Register Craft Recipies - -local craft_ingreds = { - leather = { "mcl_mobitems:leather" }, - iron = { "mcl_core:iron_ingot", "mcl_core:iron_nugget" }, - gold = { "mcl_core:gold_ingot", "mcl_core:gold_nugget" }, - diamond = { "mcl_core:diamond" }, - chain = { nil, "mcl_core:iron_nugget"} , +mcl_armor = { + longdesc = S("This is a piece of equippable armor which reduces the amount of damage you receive."), + usage = S("To equip it, put it on the corresponding armor slot in your inventory menu."), + elements = { + head = { + name = "helmet", + description = "Helmet", + durability = 0.6857, + index = 2, + craft = function(m) + return { + { m, m, m}, + { m, "", m}, + {"", "", ""}, + } + end, + }, + torso = { + name = "chestplate", + description = "Chestplate", + durability = 1.0, + index = 3, + craft = function(m) + return { + { m, "", m}, + { m, m, m}, + { m, m, m}, + } + end, + }, + legs = { + name = "leggings", + description = "Leggings", + durability = 0.9375, + index = 4, + craft = function(m) + return { + { m, m, m}, + { m, "", m}, + { m, "", m}, + } + end, + }, + feet = { + name = "boots", + description = "Boots", + durability = 0.8125, + index = 5, + craft = function(m) + return { + { m, "", m}, + { m, "", m}, + } + end, + } + } } -for k, v in pairs(craft_ingreds) do - -- material - local m = v[1] - -- cooking result - local c = v[2] - if m ~= nil then - minetest.register_craft({ - output = "mcl_armor:helmet_"..k, - recipe = { - {m, m, m}, - {m, "", m}, - {"", "", ""}, - }, - }) - minetest.register_craft({ - output = "mcl_armor:chestplate_"..k, - recipe = { - {m, "", m}, - {m, m, m}, - {m, m, m}, - }, - }) - minetest.register_craft({ - output = "mcl_armor:leggings_"..k, - recipe = { - {m, m, m}, - {m, "", m}, - {m, "", m}, - }, - }) - minetest.register_craft({ - output = "mcl_armor:boots_"..k, - recipe = { - {m, "", m}, - {m, "", m}, - }, - }) - end - if c ~= nil then - minetest.register_craft({ - type = "cooking", - output = c, - recipe = "mcl_armor:helmet_"..k, - cooktime = 10, - }) - minetest.register_craft({ - type = "cooking", - output = c, - recipe = "mcl_armor:chestplate_"..k, - cooktime = 10, - }) - minetest.register_craft({ - type = "cooking", - output = c, - recipe = "mcl_armor:leggings_"..k, - cooktime = 10, - }) - minetest.register_craft({ - type = "cooking", - output = c, - recipe = "mcl_armor:boots_"..k, - cooktime = 10, - }) - end -end +local modpath = minetest.get_modpath("mcl_armor") + +dofile(modpath .. "/api.lua") +dofile(modpath .. "/player.lua") +dofile(modpath .. "/damage.lua") +dofile(modpath .. "/register.lua") +dofile(modpath .. "/alias.lua") diff --git a/mods/ITEMS/mcl_armor/player.lua b/mods/ITEMS/mcl_armor/player.lua new file mode 100644 index 000000000..a00429040 --- /dev/null +++ b/mods/ITEMS/mcl_armor/player.lua @@ -0,0 +1,143 @@ +mcl_player.player_register_model("mcl_armor_character.b3d", { + animation_speed = 30, + textures = { + "character.png", + "blank.png", + "blank.png", + }, + animations = { + stand = {x=0, y=79}, + lay = {x=162, y=166}, + walk = {x=168, y=187}, + mine = {x=189, y=198}, + walk_mine = {x=200, y=219}, + sit = {x=81, y=160}, + sneak_stand = {x=222, y=302}, + sneak_mine = {x=346, y=365}, + sneak_walk = {x=304, y=323}, + sneak_walk_mine = {x=325, y=344}, + swim_walk = {x=368, y=387}, + swim_walk_mine = {x=389, y=408}, + swim_stand = {x=434, y=434}, + swim_mine = {x=411, y=430}, + run_walk = {x=440, y=459}, + run_walk_mine = {x=461, y=480}, + sit_mount = {x=484, y=484}, + die = {x=498, y=498}, + fly = {x=502, y=581}, + }, +}) + +mcl_player.player_register_model("mcl_armor_character_female.b3d", { + animation_speed = 30, + textures = { + "character.png", + "blank.png", + "blank.png", + }, + animations = { + stand = {x=0, y=79}, + lay = {x=162, y=166}, + walk = {x=168, y=187}, + mine = {x=189, y=198}, + walk_mine = {x=200, y=219}, + sit = {x=81, y=160}, + sneak_stand = {x=222, y=302}, + sneak_mine = {x=346, y=365}, + sneak_walk = {x=304, y=323}, + sneak_walk_mine = {x=325, y=344}, + swim_walk = {x=368, y=387}, + swim_walk_mine = {x=389, y=408}, + swim_stand = {x=434, y=434}, + swim_mine = {x=411, y=430}, + run_walk = {x=440, y=459}, + run_walk_mine = {x=461, y=480}, + sit_mount = {x=484, y=484}, + die = {x=498, y=498}, + fly = {x=502, y=581}, + }, +}) + +function mcl_armor.update_player(player, info) + mcl_player.player_set_armor(player, info.texture, info.preview) + + player:get_meta():set_int("mcl_armor:armor_point", info.points) +end + +local function is_armor_action(inventory_info) + return inventory_info.from_list == "armor" or inventory_info.to_list == "armor" or inventory_info.listname == "armor" +end + +local function limit_put(player, inventory, index, stack, count) + local def = stack:get_definition() + + if not def then + return 0 + end + + local element = def._mcl_armor_element + + if not element then + return 0 + end + + if mcl_armor.elements[element].index ~= index then + return 0 + end + + local old_stack = inventory:get_stack("armor", index) + + if old_stack:is_empty() or old_stack:get_name() ~= stack:get_name() and count <= 1 then + return count + else + return 0 + end +end + +local function limit_take(player, inventory, index, stack, count) + if mcl_enchanting.has_enchantment(stack, "curse_of_binding") and not minetest.is_creative_enabled(player:get_player_name()) then + return 0 + end + + return count +end + +minetest.register_allow_player_inventory_action(function(player, action, inventory, inventory_info) + if not is_armor_action(inventory_info) then + return + end + + if action == "put" then + return limit_put(player, inventory, inventory_info.index, inventory_info.stack, inventory_info.stack:get_count()) + elseif action == "take" then + return limit_take(player, inventory, inventory_info.index, inventory_info.stack, inventory_info.stack:get_count()) + else + if inventory_info.from_list ~= "armor" then + return limit_put(player, inventory, inventory_info.to_index, inventory:get_stack(inventory_info.from_list, inventory_info.from_index), inventory_info.count) + elseif inventory_info.to_list ~= "armor" then + return limit_take(player, inventory, inventory_info.from_index, inventory:get_stack(inventory_info.from_list, inventory_info.from_index), inventory_info.count) + else + return 0 + end + end +end) + +-- ToDo: Call unequip callbacks & play uneqip sound +minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) + if is_armor_action(inventory_info) then + mcl_armor.update(player) + end +end) + +minetest.register_on_joinplayer(function(player) + mcl_player.player_set_model(player, "mcl_armor_character.b3d") + player:get_inventory():set_size("armor", 5) + + minetest.after(1, function() + if player:is_player() then + mcl_armor.update(player) + end + end) +end) + + diff --git a/mods/ITEMS/mcl_armor/register.lua b/mods/ITEMS/mcl_armor/register.lua new file mode 100644 index 000000000..91410f659 --- /dev/null +++ b/mods/ITEMS/mcl_armor/register.lua @@ -0,0 +1,204 @@ +local S = minetest.get_translator("mcl_armor") + +mcl_armor.register_set({ + name = "leather", + description = "Leather", + descriptions = { + head = "Cap", + torso = "Tunic", + legs = "Pants", + }, + durability = 80, + enchantability = 15, + points = { + head = 1, + torso = 3, + legs = 2, + feet = 1, + }, + craft_material = "mcl_mobitems:leather", +}) + +mcl_armor.register_set({ + name = "gold", + description = "Golden", + durability = 112, + enchantability = 25, + points = { + head = 2, + torso = 5, + legs = 3, + feet = 1, + }, + craft_material = "mcl_core:gold_ingot", + cook_material = "mcl_core:gold_nugget", + sound_equip = "mcl_armor_equip_iron", + sound_unequip = "mcl_armor_unequip_iron", +}) + +mcl_armor.register_set({ + name = "chain", + description = "Chain", + durability = 240, + enchantability = 12, + points = { + head = 2, + torso = 5, + legs = 4, + feet = 1, + }, + repair_material = "mcl_core:iron_ingot", + cook_material = "mcl_core:iron_nugget", +}) + +mcl_armor.register_set({ + name = "iron", + description = "Iron", + durability = 240, + enchantability = 9, + points = { + head = 2, + torso = 6, + legs = 5, + feet = 2, + }, + craft_material = "mcl_core:iron_ingot", + cook_material = "mcl_core:iron_nugget", +}) + +mcl_armor.register_set({ + name = "diamond", + description = "Diamond", + durability = 528, + enchantability = 10, + points = { + head = 3, + torso = 8, + legs = 6, + feet = 3, + }, + toughness = 2, + craft_material = "mcl_core:diamond", +}) + +mcl_armor.register_protection_enchantment({ + id = "projectile_protection", + name = S("Projectile Protection"), + description = S("Reduces projectile damage."), + power_range_table = {{1, 16}, {11, 26}, {21, 36}, {31, 46}, {41, 56}}, + incompatible = {blast_protection = true, fire_protection = true, protection = true}, + factor = 2, + damage_flag = "is_projectile", +}) + +mcl_armor.register_protection_enchantment({ + id = "blast_protection", + name = S("Blast Protection"), + description = S("Reduces explosion damage and knockback."), + power_range_table = {{5, 13}, {13, 21}, {21, 29}, {29, 37}}, + weight = 2, + incompatible = {fire_protection = true, protection = true, projectile_protection = true}, + factor = 2, + damage_flag = "is_explosion", +}) + +mcl_armor.register_protection_enchantment({ + id = "fire_protection", + name = S("Fire Protection"), + description = S("Reduces fire damage."), + power_range_table = {{5, 13}, {13, 21}, {21, 29}, {29, 37}}, + incompatible = {blast_protection = true, protection = true, projectile_protection = true}, + factor = 2, + damage_flag = "is_fire", +}) + +mcl_armor.register_protection_enchantment({ + id = "protection", + name = S("Protection"), + description = S("Reduces most types of damage by 4% for each level."), + power_range_table = {{1, 12}, {12, 23}, {23, 34}, {34, 45}}, + incompatible = {blast_protection = true, fire_protection = true, projectile_protection = true}, + factor = 1, +}) + +mcl_armor.register_protection_enchantment({ + id = "feather_falling", + name = S("Feather Falling"), + description = S("Reduces fall damage."), + power_range_table = {{5, 11}, {11, 17}, {17, 23}, {23, 29}}, + factor = 3, + primary = {combat_armor_feet = true}, + damage_type = "fall", +}) + +-- requires engine change +--[[mcl_enchanting.enchantments.aqua_affinity = { + name = S("Aqua Affinity"), + max_level = 1, + primary = {armor_head = true}, + secondary = {}, + disallow = {non_combat_armor = true}, + incompatible = {}, + weight = 2, + description = S("Increases underwater mining speed."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{1, 41}}, + inv_combat_tab = true, + inv_tool_tab = false, +}]]-- + +mcl_enchanting.enchantments.curse_of_binding = { + name = S("Curse of Binding"), + max_level = 1, + primary = {}, + secondary = {armor_head = true, armor_torso = true, armor_legs = true, armor_feet = true}, + disallow = {}, + incompatible = {}, + weight = 1, + description = S("Item cannot be removed from armor slots except due to death, breaking or in Creative Mode."), + curse = true, + on_enchant = function() end, + requires_tool = false, + treasure = true, + power_range_table = {{25, 50}}, + inv_combat_tab = true, + inv_tool_tab = false, +} + +mcl_enchanting.enchantments.thorns = { + name = S("Thorns"), + max_level = 3, + primary = {combat_armor_chestplate = true}, + secondary = {combat_armor = true}, + disallow = {}, + incompatible = {}, + weight = 1, + description = S("Reflects some of the damage taken when hit, at the cost of reducing durability with each proc."), + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{10, 61}, {30, 71}, {50, 81}}, + inv_combat_tab = true, + inv_tool_tab = false, +} + +-- Elytra + +minetest.register_tool("mcl_armor:elytra", { + description = S("Elytra"), + _doc_items_longdesc = mcl_armor.longdesc, + _doc_items_usagehelp = mcl_armor.usage, + inventory_image = "mcl_armor_inv_elytra.png", + groups = {armor = 1, non_combat_armor = 1, armor_torso = 1, non_combat_torso = 1, mcl_armor_uses = 10}, + sounds = { + _mcl_armor_equip = "mcl_armor_equip_leather", + _mcl_armor_unequip = "mcl_armor_unequip_leather", + }, + on_place = mcl_armor.equip_on_use, + on_secondary_use = mcl_armor.equip_on_use, + _mcl_armor_element = "torso", +}) diff --git a/mods/ITEMS/mcl_armor_stand/init.lua b/mods/ITEMS/mcl_armor_stand/init.lua index c451b6de1..5dc427231 100644 --- a/mods/ITEMS/mcl_armor_stand/init.lua +++ b/mods/ITEMS/mcl_armor_stand/init.lua @@ -150,7 +150,7 @@ minetest.register_node("mcl_armor_stand:armor_stand", { single_item:set_count(1) if inv:is_empty(list) then inv:add_item(list, single_item) - armor:play_equip_sound(single_item, nil, pos) + mcl_armor.play_equip_sound(single_item, nil, pos) update_entity(pos) itemstack:take_item() return itemstack @@ -175,7 +175,7 @@ minetest.register_node("mcl_armor_stand:armor_stand", { taken = true end if taken then - armor:play_equip_sound(stand_armor, nil, pos, true) + mcl_armor.play_equip_sound(stand_armor, nil, pos, true) stand_armor:take_item() inv:set_stack("armor_" .. elements[e], 1, stand_armor) end diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index cddae0869..6e68c7c31 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -69,6 +69,7 @@ local ARROW_ENTITY={ _stuckrechecktimer=nil,-- An additional timer for periodically re-checking the stuck status of an arrow _stuckin=nil, --Position of node in which arow is stuck. _shooter=nil, -- ObjectRef of player or mob who shot it + _is_arrow = true, _viscosity=0, -- Viscosity of node the arrow is currently in _deflection_cooloff=0, -- Cooloff timer after an arrow deflection, to prevent many deflections in quick succession @@ -254,9 +255,6 @@ ARROW_ENTITY.on_step = function(self, dtime) -- Punch target object but avoid hurting enderman. if not lua or lua.name ~= "mobs_mc:enderman" then - if obj:is_player() and rawget(_G, "armor") and armor.last_damage_types then - armor.last_damage_types[obj:get_player_name()] = "projectile" - end if self._in_player == false then damage_particles(self.object:get_pos(), self._is_critical) end diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 45912384e..2257fcc5e 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -59,6 +59,7 @@ mcl_bows.shoot_arrow = function(arrow_item, pos, dir, yaw, shooter, power, damag obj:set_yaw(yaw-math.pi/2) local le = obj:get_luaentity() le._shooter = shooter + le._source_object = shooter le._damage = damage le._is_critical = is_critical le._startpos = pos diff --git a/mods/ITEMS/mcl_core/nodes_liquid.lua b/mods/ITEMS/mcl_core/nodes_liquid.lua index 4696a629a..c49b685eb 100644 --- a/mods/ITEMS/mcl_core/nodes_liquid.lua +++ b/mods/ITEMS/mcl_core/nodes_liquid.lua @@ -203,7 +203,7 @@ S("• When lava is directly above water, the water turns into stone."), _mcl_node_death_message = lava_death_messages, post_effect_color = {a=245, r=208, g=73, b=10}, stack_max = 64, - groups = { lava=3, lava_source=1, liquid=2, destroys_items=1, not_in_creative_inventory=1, dig_by_piston=1, set_on_fire=15}, + groups = { lava=3, lava_source=1, liquid=2, destroys_items=1, not_in_creative_inventory=1, dig_by_piston=1, set_on_fire=15, fire_damage=1}, _mcl_blast_resistance = 100, -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode _mcl_hardness = -1, diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index ca936c319..34cc5cf98 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -10,25 +10,6 @@ local function increase_damage(damage_group, factor) end end --- requires engine change ---[[mcl_enchanting.enchantments.aqua_affinity = { - name = S("Aqua Affinity"), - max_level = 1, - primary = {armor_head = true}, - secondary = {}, - disallow = {non_combat_armor = true}, - incompatible = {}, - weight = 2, - description = S("Increases underwater mining speed."), - curse = false, - on_enchant = function() end, - requires_tool = false, - treasure = false, - power_range_table = {{1, 41}}, - inv_combat_tab = true, - inv_tool_tab = false, -}]]-- - -- implemented via on_enchant and additions in mobs_mc; Slowness IV part unimplemented mcl_enchanting.enchantments.bane_of_arthropods = { name = S("Bane of Arthropods"), @@ -48,25 +29,6 @@ mcl_enchanting.enchantments.bane_of_arthropods = { inv_tool_tab = false, } --- implemented in mcl_armor -mcl_enchanting.enchantments.blast_protection = { - name = S("Blast Protection"), - max_level = 4, - primary = {armor_head = true, armor_torso = true, armor_legs = true, armor_feet = true}, - secondary = {}, - disallow = {non_combat_armor = true}, - incompatible = {fire_protection = true, protection = true, projectile_protection = true}, - weight = 2, - description = S("Reduces explosion damage and knockback."), - curse = false, - on_enchant = function() end, - requires_tool = false, - treasure = false, - power_range_table = {{5, 13}, {13, 21}, {21, 29}, {29, 37}}, - inv_combat_tab = true, - inv_tool_tab = false, -} - -- requires missing MineClone2 feature --[[mcl_enchanting.enchantments.channeling = { name = S("Channeling"), @@ -86,25 +48,6 @@ mcl_enchanting.enchantments.blast_protection = { inv_tool_tab = false, }]]-- --- implemented in mcl_armor -mcl_enchanting.enchantments.curse_of_binding = { - name = S("Curse of Binding"), - max_level = 1, - primary = {}, - secondary = {armor_head = true, armor_torso = true, armor_legs = true, armor_feet = true}, - disallow = {}, - incompatible = {}, - weight = 1, - description = S("Item cannot be removed from armor slots except due to death, breaking or in Creative Mode."), - curse = true, - on_enchant = function() end, - requires_tool = false, - treasure = true, - power_range_table = {{25, 50}}, - inv_combat_tab = true, - inv_tool_tab = false, -} - -- implemented in mcl_death_drop mcl_enchanting.enchantments.curse_of_vanishing = { name = S("Curse of Vanishing"), @@ -164,24 +107,6 @@ mcl_enchanting.enchantments.efficiency = { inv_tool_tab = true, } --- implemented in mcl_armor -mcl_enchanting.enchantments.feather_falling = { - name = S("Feather Falling"), - max_level = 4, - primary = {armor_feet = true}, - secondary = {}, - disallow = {non_combat_armor = true}, - incompatible = {}, - weight = 5, - description = S("Reduces fall damage."),curse = false, - on_enchant = function() end, - requires_tool = false, - treasure = false, - power_range_table = {{5, 11}, {11, 17}, {17, 23}, {23, 29}}, - inv_combat_tab = true, - inv_tool_tab = false, -} - -- implemented in mcl_mobs and via register_on_punchplayer callback mcl_enchanting.enchantments.fire_aspect = { name = S("Fire Aspect"), @@ -213,25 +138,6 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, end end) --- implemented in mcl_armor -mcl_enchanting.enchantments.fire_protection = { - name = S("Fire Protection"), - max_level = 4, - primary = {armor_head = true, armor_torso = true, armor_legs = true, armor_feet = true}, - secondary = {}, - disallow = {non_combat_armor = true}, - incompatible = {blast_protection = true, protection = true, projectile_protection = true}, - weight = 5, - description = S("Reduces fire damage."), - curse = false, - on_enchant = function() end, - requires_tool = false, - treasure = false, - power_range_table = {{10, 18}, {18, 26}, {26, 34}, {34, 42}}, - inv_combat_tab = true, - inv_tool_tab = false, -} - mcl_enchanting.enchantments.flame = { name = S("Flame"), max_level = 1, @@ -530,44 +436,6 @@ mcl_enchanting.enchantments.power = { inv_tool_tab = false, } --- implemented in mcl_armor -mcl_enchanting.enchantments.projectile_protection = { - name = S("Projectile Protection"), - max_level = 4, - primary = {armor_head = true, armor_torso = true, armor_legs = true, armor_feet = true}, - secondary = {}, - disallow = {non_combat_armor = true}, - incompatible = {blast_protection = true, fire_protection = true, protection = true}, - weight = 5, - description = S("Reduces projectile damage."), - curse = false, - on_enchant = function() end, - requires_tool = false, - treasure = false, - power_range_table = {{1, 16}, {11, 26}, {21, 36}, {31, 46}, {41, 56}}, - inv_combat_tab = true, - inv_tool_tab = false, -} - --- implemented in mcl_armor -mcl_enchanting.enchantments.protection = { - name = S("Protection"), - max_level = 4, - primary = {armor_head = true, armor_torso = true, armor_legs = true, armor_feet = true}, - secondary = {}, - disallow = {non_combat_armor = true}, - incompatible = {blast_protection = true, fire_protection = true, projectile_protection = true}, - weight = 10, - description = S("Reduces most types of damage by 4% for each level."), - curse = false, - on_enchant = function() end, - requires_tool = false, - treasure = false, - power_range_table = {{1, 12}, {12, 23}, {23, 34}, {34, 45}}, - inv_combat_tab = true, - inv_tool_tab = false, -} - -- implemented via minetest.calculate_knockback (together with the Knockback enchantment) and mcl_bows mcl_enchanting.enchantments.punch = { name = S("Punch"), @@ -739,25 +607,6 @@ mcl_enchanting.enchantments.soul_speed = { inv_tool_tab = false, }]]-- --- implemented in mcl_armor -mcl_enchanting.enchantments.thorns = { - name = S("Thorns"), - max_level = 3, - primary = {armor_head = true}, - secondary = {armor_torso = true, armor_legs = true, armor_feet = true}, - disallow = {non_combat_armor = true}, - incompatible = {}, - weight = 1, - description = S("Reflects some of the damage taken when hit, at the cost of reducing durability with each proc."), - curse = false, - on_enchant = function() end, - requires_tool = false, - treasure = false, - power_range_table = {{10, 61}, {30, 71}, {50, 81}}, - inv_combat_tab = true, - inv_tool_tab = false, -} - -- for tools & weapons implemented via on_enchant; for bows implemented in mcl_bows; for armor implemented in mcl_armor and mcl_tt; for fishing rods implemented in mcl_fishing mcl_enchanting.enchantments.unbreaking = { name = S("Unbreaking"), diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index ea69d1868..db164637b 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -266,7 +266,8 @@ function mcl_enchanting.initialize() new_def.groups.not_in_creative_inventory = 1 new_def.groups.not_in_craft_guide = 1 new_def.groups.enchanted = 1 - new_def.texture = itemdef.texture or itemname:gsub("%:", "_") + new_def._mcl_armor_texture = new_def._mcl_armor_texture and new_def._mcl_armor_texture .. mcl_enchanting.overlay + new_def._mcl_armor_preview = new_def._mcl_armor_preview and new_def._mcl_armor_preview .. mcl_enchanting.overlay new_def._mcl_enchanting_enchanted_tool = new_name new_def.after_use = get_after_use_callback(itemdef) local register_list = register_item_list diff --git a/mods/ITEMS/mcl_farming/pumpkin.lua b/mods/ITEMS/mcl_farming/pumpkin.lua index 72b4e5412..8d234d586 100644 --- a/mods/ITEMS/mcl_farming/pumpkin.lua +++ b/mods/ITEMS/mcl_farming/pumpkin.lua @@ -111,12 +111,16 @@ pumpkin_face_base_def.description = S("Pumpkin") pumpkin_face_base_def._doc_items_longdesc = S("A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.") pumpkin_face_base_def._doc_items_usagehelp = nil pumpkin_face_base_def.tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_face.png"} +pumpkin_face_base_def.groups.armor=1 +pumpkin_face_base_def.groups.non_combat_armor=1 pumpkin_face_base_def.groups.armor_head=1 +pumpkin_face_base_def.groups.non_combat_armor_head=1 pumpkin_face_base_def._mcl_armor_mob_range_factor = 0 pumpkin_face_base_def._mcl_armor_mob_range_mob = "mobs_mc:enderman" +pumpkin_face_base_def._mcl_armor_entry = "head" pumpkin_face_base_def.groups.non_combat_armor=1 if minetest.get_modpath("mcl_armor") then - pumpkin_face_base_def.on_secondary_use = armor.on_armor_use + pumpkin_face_base_def.on_secondary_use = mcl_armor.equip_on_use end -- Register stem growth diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index 95d76c45d..96c6195aa 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -203,7 +203,7 @@ minetest.register_node("mcl_fire:fire", { sunlight_propagates = true, damage_per_second = 1, _mcl_node_death_message = fire_death_messages, - groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston=1, destroys_items=1, set_on_fire=8}, + groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston=1, destroys_items=1, set_on_fire=8, fire_damage=1}, floodable = true, on_flood = function(pos, oldnode, newnode) if get_item_group(newnode.name, "water") ~= 0 then @@ -334,7 +334,7 @@ minetest.register_node("mcl_fire:eternal_fire", { sunlight_propagates = true, damage_per_second = 1, _mcl_node_death_message = fire_death_messages, - groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston = 1, destroys_items = 1, set_on_fire=8}, + groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston = 1, destroys_items = 1, set_on_fire=8, fire_damage=1}, floodable = true, on_flood = function(pos, oldnode, newnode) if get_item_group(newnode.name, "water") ~= 0 then diff --git a/mods/ITEMS/mcl_heads/init.lua b/mods/ITEMS/mcl_heads/init.lua index 2000c7070..27d6ef793 100644 --- a/mods/ITEMS/mcl_heads/init.lua +++ b/mods/ITEMS/mcl_heads/init.lua @@ -5,7 +5,7 @@ local mod_screwdriver = minetest.get_modpath("screwdriver") local equip_armor if minetest.get_modpath("mcl_armor") then - equip_armor = armor.on_armor_use + equip_armor = mcl_armor.equip_on_use end -- Heads system diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua index 996637aa7..2d66611f3 100644 --- a/mods/ITEMS/mcl_potions/functions.lua +++ b/mods/ITEMS/mcl_potions/functions.lua @@ -603,21 +603,18 @@ function mcl_potions.make_invisible(player, toggle) return end - if minetest.get_modpath("mcl_armor") and player:is_player() then - armor.textures[playername].skin = skin_file - armor:update_player_visuals(player) - elseif not player:is_player() and minetest.get_modpath("mcl_armor") or not player:is_player() and not minetest.get_modpath("mcl_armor") then + if player:is_player() then + mcl_player.player_set_skin(player, "mobs_mc_empty.png") + elseif not player: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 minetest.get_modpath("mcl_armor") and player:is_player() then - skin_file = mcl_skins.skins[playername] .. ".png" - armor.textures[playername].skin = skin_file - armor:update_player_visuals(player) - elseif not player:is_player() and minetest.get_modpath("mcl_armor") or not player:is_player() and not minetest.get_modpath("mcl_armor") then + if player:is_player() then + mcl_skins.update_player_skin(player) + elseif not player: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/ITEMS/mcl_torches/api.lua b/mods/ITEMS/mcl_torches/api.lua index ced566bbd..74cde8d51 100644 --- a/mods/ITEMS/mcl_torches/api.lua +++ b/mods/ITEMS/mcl_torches/api.lua @@ -277,7 +277,7 @@ minetest.register_lbm({ nodenames = {"group:torch_particles"}, run_at_every_load = true, action = function(pos, node) - local torch_group = minetest.get_node_group(node.name, "torch") + local torch_group = minetest.get_item_group(node.name, "torch") if torch_group == 1 then spawn_flames_floor(pos) elseif torch_group == 2 then diff --git a/mods/ITEMS/screwdriver/init.lua b/mods/ITEMS/screwdriver/init.lua index e6aedf19c..62a217f8e 100644 --- a/mods/ITEMS/screwdriver/init.lua +++ b/mods/ITEMS/screwdriver/init.lua @@ -157,7 +157,7 @@ screwdriver.handler = function(itemstack, user, pointed_thing, mode, uses) if should_rotate and new_param2 ~= node.param2 then node.param2 = new_param2 minetest.swap_node(pos, node) - + minetest.check_for_falling(pos) if ndef.after_rotate then ndef.after_rotate(vector.new(pos)) diff --git a/mods/PLAYER/mcl_death_drop/init.lua b/mods/PLAYER/mcl_death_drop/init.lua index 7c54334a9..49be58679 100644 --- a/mods/PLAYER/mcl_death_drop/init.lua +++ b/mods/PLAYER/mcl_death_drop/init.lua @@ -11,7 +11,6 @@ end mcl_death_drop.register_dropped_list("PLAYER", "main", true) mcl_death_drop.register_dropped_list("PLAYER", "craft", true) mcl_death_drop.register_dropped_list("PLAYER", "armor", true) -mcl_death_drop.register_dropped_list(function(player) return select(3, armor:get_valid_player(player)) end , "armor", false) minetest.register_on_dieplayer(function(player) local keep = minetest.settings:get_bool("mcl_keepInventory", false) @@ -50,7 +49,6 @@ minetest.register_on_dieplayer(function(player) inv:set_list(listname, {}) end end - armor:set_player_armor(player) - armor:update_inventory(player) + mcl_armor.update(player) end end) diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 210e2d19f..7ff40809b 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -88,22 +88,41 @@ function mcl_player.player_set_model(player, model_name) player_model[name] = model_name end -function mcl_player.player_set_textures(player, textures, preview) - local name = player:get_player_name() - player_textures[name] = textures - player:set_properties({textures = textures,}) - if preview then - player:get_meta():set_string("mcl_player:preview", preview) - end +local function set_texture(player, index, texture) + local textures = player_textures[player:get_player_name()] + textures[index] = texture + player:set_properties({textures = textures}) +end + +local function set_preview(player, field, preview) + player:get_meta():set_string("mcl_player:" .. field .. "_preview", preview) +end + +function mcl_player.player_set_skin(player, texture, preview) + set_texture(player, 1, texture) + set_preview(player, "skin", preview) +end + +function mcl_player.player_set_armor(player, texture, preview) + set_texture(player, 2, texture) + set_preview(player, "armor", preview) +end + +function mcl_player.player_set_wielditem(player, texture) + set_texture(player, 3, texture) end function mcl_player.player_get_preview(player) - local preview = player:get_meta():get_string("mcl_player:preview") - if preview == nil or preview == "" then - return "player.png" - else - return preview + local preview = player:get_meta():get_string("mcl_player:skin_preview") + if preview == "" then + preview = "player.png" end + local armor_preview = player:get_meta():set_string("mcl_player:armor_preview") + if armor_preview ~= "" then + preview = preview .. "^" .. armor_preview + end + return preview + end function mcl_player.get_player_formspec_model(player, x, y, w, h, fsname) @@ -129,8 +148,10 @@ end -- Update appearance when the player joins minetest.register_on_joinplayer(function(player) - mcl_player.player_attached[player:get_player_name()] = false + local name = player:get_player_name() + mcl_player.player_attached[name] = false mcl_player.player_set_model(player, "character.b3d") + player_textures[name] = {"blank.png", "blank.png", "blank.png"} --player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30) player:set_fov(86.1) -- see >>> end) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 5ba73cd60..4177a9d55 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -182,6 +182,8 @@ minetest.register_globalstep(function(dtime) local wielded = player:get_wielded_item() local player_velocity = player:get_velocity() or player:get_player_velocity() + local wielded_def = wielded:get_definition() + -- controls head bone local pitch = - degrees(player:get_look_vertical()) local yaw = degrees(player:get_look_horizontal()) @@ -196,7 +198,7 @@ minetest.register_globalstep(function(dtime) if minetest.get_node_or_nil({x=player:get_pos().x, y=player:get_pos().y - 0.5, z=player:get_pos().z}) then node_stand_return = minetest.get_node_or_nil({x=player:get_pos().x, y=player:get_pos().y - 0.5, z=player:get_pos().z}).name else - minetest.log("action", "somehow player got of loaded areas") + -- minetest.log("action", "somehow player got of loaded areas") end if player:get_inventory():get_stack("armor", 3):get_name() == "mcl_armor:elytra" and player_velocity.y < -6 and elytra[player] ~= true and is_sprinting(name) then @@ -224,6 +226,14 @@ minetest.register_globalstep(function(dtime) playerphysics.remove_physics_factor(player, "gravity", "mcl_playerplus:elytra") end + if wielded_def and wielded_def._mcl_toollike_wield then + player:set_bone_position("Wield_Item", vector.new(0,3.9,1.3), vector.new(90,0,0)) + elseif string.find(wielded:get_name(), "mcl_bows:bow") then + player:set_bone_position("Wield_Item", vector.new(.5,4.5,-1.6), vector.new(90,0,20)) + else + player:set_bone_position("Wield_Item", vector.new(-1.5,4.9,1.8), vector.new(135,0,90)) + end + -- controls right and left arms pitch when shooting a bow if string.find(wielded:get_name(), "mcl_bows:bow") and controls.RMB and not controls.LMB and not controls.up and not controls.down and not controls.left and not controls.right then player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch+90,-30,pitch * -1 * .35)) diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index 5956aab7c..fccc00365 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -7,7 +7,6 @@ mcl_skins = { } local S = minetest.get_translator("mcl_skins") -local has_mcl_armor = minetest.get_modpath("mcl_armor") local has_mcl_inventory = minetest.get_modpath("mcl_inventory") -- load skin list and metadata @@ -115,10 +114,6 @@ mcl_skins.set_player_skin = function(player, skin_id) mcl_skins.previews[playername] = preview player:get_meta():set_string("mcl_skins:skin_id", tostring(skin_id)) mcl_skins.update_player_skin(player) - if has_mcl_armor then - armor.textures[playername].skin = skin_file - armor:update_player_visuals(player) - end if has_mcl_inventory then mcl_inventory.update_inventory_formspec(player) end @@ -134,7 +129,7 @@ mcl_skins.update_player_skin = function(player) return end local playername = player:get_player_name() - mcl_player.player_set_textures(player, { mcl_skins.skins[playername] .. ".png" }, mcl_skins.previews[playername] .. ".png" ) + mcl_player.player_set_skin(player, mcl_skins.skins[playername] .. ".png", mcl_skins.previews[playername] .. ".png") end -- load player skin on join diff --git a/mods/PLAYER/mcl_skins/mod.conf b/mods/PLAYER/mcl_skins/mod.conf index 6ccbe98f1..657d3cc0e 100644 --- a/mods/PLAYER/mcl_skins/mod.conf +++ b/mods/PLAYER/mcl_skins/mod.conf @@ -2,4 +2,4 @@ name = mcl_skins author = TenPlus1 description = Mod that allows players to set their individual skins. depends = mcl_player -optional_depends = mcl_inventory, intllib, mcl_armor +optional_depends = mcl_inventory, intllib diff --git a/mods/PLAYER/wieldview/LICENSE.txt b/mods/PLAYER/mcl_wieldview/LICENSE.txt similarity index 100% rename from mods/PLAYER/wieldview/LICENSE.txt rename to mods/PLAYER/mcl_wieldview/LICENSE.txt diff --git a/mods/PLAYER/wieldview/README.txt b/mods/PLAYER/mcl_wieldview/README.txt similarity index 100% rename from mods/PLAYER/wieldview/README.txt rename to mods/PLAYER/mcl_wieldview/README.txt diff --git a/mods/PLAYER/mcl_wieldview/init.lua b/mods/PLAYER/mcl_wieldview/init.lua new file mode 100644 index 000000000..7be3b83dc --- /dev/null +++ b/mods/PLAYER/mcl_wieldview/init.lua @@ -0,0 +1,122 @@ +mcl_wieldview = { + players = {} +} + +function mcl_wieldview.get_item_texture(itemname) + if itemname == "" then + return + end + + local def = minetest.registered_items[itemname] + if not def then + return + end + + local inv_image = def.inventory_image + if inv_image == "" then + return + end + + local texture = inv_image + + local transform = minetest.get_item_group(itemname, "wieldview_transform") + if transform then + -- This actually works with groups ratings because transform1, transform2, etc. + -- have meaning and transform0 is used for identidy, so it can be ignored + texture = texture .. "^[transform" .. transform + end + + return texture +end + +function mcl_wieldview.update_wielded_item(player) + if not player then + return + end + local name = player:get_player_name() + local itemstack = player:get_wielded_item() + local itemname = itemstack:get_name() + + local def = mcl_wieldview.players[name] + + if def.item == itemname then + return + end + + def.item = itemname + def.texture = mcl_wieldview.get_item_texture(itemname) or "blank.png" + + mcl_player.player_set_wielditem(player, def.texture) +end + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + mcl_wieldview.players[name] = {item = "", texture = "blank.png"} + + minetest.after(0, function() + if not player:is_player() then + return + end + + mcl_wieldview.update_wielded_item(player) + + local itementity = minetest.add_entity(player:get_pos(), "mcl_wieldview:wieldnode") + itementity:set_attach(player, "Hand_Right", vector.new(0, 1, 0), vector.new(90, 0, 45)) + itementity:get_luaentity().wielder = name + end) +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + mcl_wieldview.players[name] = nil +end) + +minetest.register_globalstep(function() + for _, player in pairs(minetest.get_connected_players()) do + mcl_wieldview.update_wielded_item(player) + end +end) + +minetest.register_entity("mcl_wieldview:wieldnode", { + initial_properties = { + hp_max = 1, + visual = "wielditem", + physical = false, + textures = {""}, + automatic_rotate = 1.5, + is_visible = true, + pointable = false, + collide_with_objects = false, + static_save = false, + collisionbox = {-0.21, -0.21, -0.21, 0.21, 0.21, 0.21}, + selectionbox = {-0.21, -0.21, -0.21, 0.21, 0.21, 0.21}, + visual_size = {x = 0.21, y = 0.21}, + }, + + itemstring = "", + + on_step = function(self) + local player = minetest.get_player_by_name(self.wielder) + if player then + local wielded = player:get_wielded_item() + local itemstring = wielded:get_name() + + if self.itemstring ~= itemstring then + local def = minetest.registered_items[itemstring] + self.object:set_properties({glow = def and def.light_source or 0}) + + -- wield item as cubic + if mcl_wieldview.players[self.wielder].texture == "blank.png" then + self.object:set_properties({textures = {itemstring}}) + -- wield item as flat + else + self.object:set_properties({textures = {""}}) + end + + self.itemstring = itemstring + end + else + self.object:remove() + end + end, +}) diff --git a/mods/PLAYER/wieldview/mod.conf b/mods/PLAYER/mcl_wieldview/mod.conf similarity index 66% rename from mods/PLAYER/wieldview/mod.conf rename to mods/PLAYER/mcl_wieldview/mod.conf index 4cd2a6935..4b3097876 100644 --- a/mods/PLAYER/wieldview/mod.conf +++ b/mods/PLAYER/mcl_wieldview/mod.conf @@ -1,5 +1,4 @@ -name = wieldview +name = mcl_wieldview author = stujones11 description = Makes hand wielded items visible to other players. -depends = mcl_armor - +depends = mcl_player diff --git a/mods/PLAYER/wieldview/init.lua b/mods/PLAYER/wieldview/init.lua deleted file mode 100644 index 7a349f2f3..000000000 --- a/mods/PLAYER/wieldview/init.lua +++ /dev/null @@ -1,132 +0,0 @@ -local time = 0 -local update_time = tonumber(minetest.settings:get("wieldview_update_time")) -if not update_time then - update_time = 2 - minetest.settings:set("wieldview_update_time", tostring(update_time)) -end -local node_tiles = minetest.settings:get_bool("wieldview_node_tiles") -if not node_tiles then - node_tiles = false - minetest.settings:set("wieldview_node_tiles", "false") -end - -wieldview = { - wielded_item = {}, - transform = {}, -} - -dofile(minetest.get_modpath(minetest.get_current_modname()).."/transform.lua") - -wieldview.get_item_texture = function(self, item) - local texture = "blank.png" - if item ~= "" then - if minetest.registered_items[item] then - if minetest.registered_items[item].inventory_image ~= "" then - texture = minetest.registered_items[item].inventory_image - elseif node_tiles == true and minetest.registered_items[item].tiles - and type(minetest.registered_items[item].tiles[1]) == "string" - and minetest.registered_items[item].tiles[1] ~= "" then - texture = minetest.inventorycube(minetest.registered_items[item].tiles[1]) - end - end - -- Get item image transformation, first from group, then from transform.lua - local transform = minetest.get_item_group(item, "wieldview_transform") - if transform == 0 then - transform = wieldview.transform[item] - end - if transform then - -- This actually works with groups ratings because transform1, transform2, etc. - -- have meaning and transform0 is used for identidy, so it can be ignored - texture = texture.."^[transform"..tostring(transform) - end - end - return texture -end - -wieldview.update_wielded_item = function(self, player) - if not player then - return - end - local name = player:get_player_name() - local stack = player:get_wielded_item() - local item = stack:get_name() - if not item then - return - end - if self.wielded_item[name] then - if self.wielded_item[name] == item then - return - end - if not armor.textures[name] then - return - end - armor.textures[name].wielditem = self:get_item_texture(item) - armor:update_player_visuals(player) - end - self.wielded_item[name] = item -end - -minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() - wieldview.wielded_item[name] = "" - minetest.after(0, function(player) - -- if the player left :is_player() will return nil - if not player:is_player() then - return - end - wieldview:update_wielded_item(player) - local itementity = minetest.add_entity(player:get_pos(), "wieldview:wieldnode") - itementity:set_attach(player, "Hand_Right", vector.new(0, 1, 0), vector.new(90, 0, 45)) - itementity:get_luaentity().wielder = name - end, player) -end) - -minetest.register_globalstep(function() - for _,player in pairs(minetest.get_connected_players()) do - wieldview:update_wielded_item(player) - end -end) - -minetest.register_entity("wieldview:wieldnode", { - initial_properties = { - hp_max = 1, - visual = "wielditem", - physical = false, - textures = {""}, - automatic_rotate = 1.5, - is_visible = true, - pointable = false, - collide_with_objects = false, - static_save = false, - collisionbox = {-0.21, -0.21, -0.21, 0.21, 0.21, 0.21}, - selectionbox = {-0.21, -0.21, -0.21, 0.21, 0.21, 0.21}, - visual_size = {x = 0.21, y = 0.21}, - }, - - itemstring = "", - - on_step = function(self) - local player = minetest.get_player_by_name(self.wielder) - if player then - local wielded = player:get_wielded_item() - local itemstring = wielded:get_name() - - if self.itemstring ~= itemstring then - local def = minetest.registered_items[itemstring] - self.object:set_properties({glow = def and def.light_source or 0}) - - -- wield item as cubic - if armor.textures[self.wielder].wielditem == "blank.png" then - self.object:set_properties({textures = {itemstring}}) - -- wield item as flat - else - self.object:set_properties({textures = {""}}) - end - - self.itemstring = itemstring - end - else - self.object:remove() - end - end, -}) diff --git a/mods/PLAYER/wieldview/transform.lua b/mods/PLAYER/wieldview/transform.lua deleted file mode 100644 index a19956796..000000000 --- a/mods/PLAYER/wieldview/transform.lua +++ /dev/null @@ -1,10 +0,0 @@ --- Wielded Item Transformations - http://dev.minetest.net/texture - -wieldview.transform = { - ["screwdriver:screwdriver"]="R90", - ["screwdriver:screwdriver1"]="R90", - ["screwdriver:screwdriver2"]="R90", - ["screwdriver:screwdriver3"]="R90", - ["screwdriver:screwdriver4"]="R90", -} - From e74838136d3c42a7768864d301943a02268cc202 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 14 Apr 2021 16:27:21 +0200 Subject: [PATCH 003/136] Use cactus damage type --- mods/PLAYER/mcl_playerplus/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index fa735a5cd..2001ddbd2 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -456,7 +456,7 @@ minetest.register_globalstep(function(dtime) if dist < 1.1 or dist_feet < 1.1 then if player:get_hp() > 0 then mcl_death_messages.player_damage(player, S("@1 was prickled to death by a cactus.", name)) - player:set_hp(player:get_hp() - 1, { type = "punch", from = "mod" }) + player:set_hp(player:get_hp() - 1, { _mcl_type = "cactus" }) end end end From 875bb3db8419d63fbd7295e8147e4d3588d2909a Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 14 Apr 2021 17:20:51 +0200 Subject: [PATCH 004/136] Use fire-like damage types properly --- mods/CORE/mcl_damage/init.lua | 7 +++++-- mods/ENTITIES/mcl_burning/api.lua | 2 +- mods/ITEMS/mcl_fire/init.lua | 4 ++-- mods/ITEMS/mcl_nether/init.lua | 2 +- mods/PLAYER/mcl_playerplus/init.lua | 2 +- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/mods/CORE/mcl_damage/init.lua b/mods/CORE/mcl_damage/init.lua index bd640be43..927ce6771 100644 --- a/mods/CORE/mcl_damage/init.lua +++ b/mods/CORE/mcl_damage/init.lua @@ -70,10 +70,13 @@ function mcl_damage.get_mcl_damage_reason(mt_reason) mcl_reason.type = "player" end end - elseif mt_reason.type == "node_damage" then - if minetest.get_item_group(reason.node or "", "fire_damage") > 0 then + elseif mt_reason.type == "node_damage" and mt_reason.node then + if minetest.get_item_group(mt_reason.node, "fire") > 0 then mcl_reason.type = "in_fire" end + if minetest.get_item_group(mt_reason.node, "lava") > 0 then + mcl_reason.type = "lava" + end end for key, value in pairs(mt_reason) do diff --git a/mods/ENTITIES/mcl_burning/api.lua b/mods/ENTITIES/mcl_burning/api.lua index 98f315ef9..4f4452a57 100644 --- a/mods/ENTITIES/mcl_burning/api.lua +++ b/mods/ENTITIES/mcl_burning/api.lua @@ -106,7 +106,7 @@ function mcl_burning.damage(obj) end if do_damage then - mcl_util.deal_damage(obj, 1, {type = "in_fire"}) + mcl_util.deal_damage(obj, 1, {type = "on_fire"}) end end diff --git a/mods/ITEMS/mcl_fire/init.lua b/mods/ITEMS/mcl_fire/init.lua index 96c6195aa..95d76c45d 100644 --- a/mods/ITEMS/mcl_fire/init.lua +++ b/mods/ITEMS/mcl_fire/init.lua @@ -203,7 +203,7 @@ minetest.register_node("mcl_fire:fire", { sunlight_propagates = true, damage_per_second = 1, _mcl_node_death_message = fire_death_messages, - groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston=1, destroys_items=1, set_on_fire=8, fire_damage=1}, + groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston=1, destroys_items=1, set_on_fire=8}, floodable = true, on_flood = function(pos, oldnode, newnode) if get_item_group(newnode.name, "water") ~= 0 then @@ -334,7 +334,7 @@ minetest.register_node("mcl_fire:eternal_fire", { sunlight_propagates = true, damage_per_second = 1, _mcl_node_death_message = fire_death_messages, - groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston = 1, destroys_items = 1, set_on_fire=8, fire_damage=1}, + groups = {fire = 1, dig_immediate = 3, not_in_creative_inventory = 1, dig_by_piston = 1, destroys_items = 1, set_on_fire=8}, floodable = true, on_flood = function(pos, oldnode, newnode) if get_item_group(newnode.name, "water") ~= 0 then diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index 467054767..b6285ceb4 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -114,7 +114,7 @@ minetest.register_node("mcl_nether:magma", { if mod_death_messages then mcl_death_messages.player_damage(player, S("@1 stood too long on a magma block.", player:get_player_name())) end - player:set_hp(player:get_hp() - 1, { type = "punch", from = "mod" }) + mcl_util.deal_damage(player, 1, {type = "hot_floor"}) end end, _mcl_blast_resistance = 0.5, diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 2001ddbd2..64dbb1088 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -456,7 +456,7 @@ minetest.register_globalstep(function(dtime) if dist < 1.1 or dist_feet < 1.1 then if player:get_hp() > 0 then mcl_death_messages.player_damage(player, S("@1 was prickled to death by a cactus.", name)) - player:set_hp(player:get_hp() - 1, { _mcl_type = "cactus" }) + mcl_util.deal_damage(player, 1, {type = "cactus"}) end end end From 49e7def70aabd18be9d156e538dbd074abf2f9c9 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 14 Apr 2021 18:40:41 +0200 Subject: [PATCH 005/136] Implement lightning_bolt damage reason --- mods/ENVIRONMENT/lightning/init.lua | 74 +++++++++++++---------------- 1 file changed, 34 insertions(+), 40 deletions(-) diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index 345f733d5..64a304dbe 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -139,48 +139,42 @@ lightning.strike = function(pos) for o=1, #objs do local obj = objs[o] local lua = obj:get_luaentity() - if obj:is_player() then - -- Player damage - if has_mcl_death_msg then + -- pig → zombie pigman (no damage) + if lua and lua.name == "mobs_mc:pig" then + local rot = obj:get_yaw() + obj:remove() + obj = add_entity(pos2, "mobs_mc:pigman") + obj:set_yaw(rot) + -- mooshroom: toggle color red/brown (no damage) + elseif lua and lua.name == "mobs_mc:mooshroom" then + if lua.base_texture[1] == "mobs_mc_mooshroom.png" then + lua.base_texture = { "mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } + else + lua.base_texture = { "mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png" } + end + obj:set_properties({textures = lua.base_texture}) + -- villager → witch (no damage) + elseif lua and lua.name == "mobs_mc:villager" then + -- Witches are incomplete, this code is unused + -- TODO: Enable this code when witches are working. + --[[ + local rot = obj:get_yaw() + obj:remove() + obj = minetest.add_entity(pos2, "mobs_mc:witch") + obj:set_yaw(rot) + ]] + -- charged creeper + elseif lua and lua.name == "mobs_mc:creeper" then + local rot = obj:get_yaw() + obj:remove() + obj = add_entity(pos2, "mobs_mc:creeper_charged") + obj:set_yaw(rot) + -- Other objects: Just damage + else + if obj:is_player() and has_mcl_death_msg then mcl_death_messages.player_damage(obj, S("@1 was struck by lightning.", obj:get_player_name())) end - obj:set_hp(obj:get_hp()-5, { type = "punch", from = "mod" }) - -- Mobs - elseif lua and lua._cmi_is_mob then - -- pig → zombie pigman (no damage) - if lua.name == "mobs_mc:pig" then - local rot = obj:get_yaw() - obj:remove() - obj = add_entity(pos2, "mobs_mc:pigman") - obj:set_yaw(rot) - -- mooshroom: toggle color red/brown (no damage) - elseif lua.name == "mobs_mc:mooshroom" then - if lua.base_texture[1] == "mobs_mc_mooshroom.png" then - lua.base_texture = { "mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } - else - lua.base_texture = { "mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png" } - end - obj:set_properties({textures = lua.base_texture}) - -- villager → witch (no damage) - elseif lua.name == "mobs_mc:villager" then - -- Witches are incomplete, this code is unused - -- TODO: Enable this code when witches are working. - --[[ - local rot = obj:get_yaw() - obj:remove() - obj = minetest.add_entity(pos2, "mobs_mc:witch") - obj:set_yaw(rot) - ]] - -- charged creeper - elseif lua.name == "mobs_mc:creeper" then - local rot = obj:get_yaw() - obj:remove() - obj = add_entity(pos2, "mobs_mc:creeper_charged") - obj:set_yaw(rot) - -- Other mobs: Just damage - else - obj:set_hp(obj:get_hp()-5, { type = "punch", from = "mod" }) - end + mcl_util.deal_damage(obj, 5, {type = "lightning_bolt"}) end end From 5d9bb7cacd485f0cd9335758dacdd6196971e8bf Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 14 Apr 2021 19:06:11 +0200 Subject: [PATCH 006/136] Fix armor not actually protecting lol --- mods/CORE/mcl_damage/init.lua | 5 +++-- mods/ITEMS/mcl_armor/damage.lua | 14 +++++--------- mods/ITEMS/mcl_armor/player.lua | 4 +++- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/mods/CORE/mcl_damage/init.lua b/mods/CORE/mcl_damage/init.lua index 927ce6771..83c6d83af 100644 --- a/mods/CORE/mcl_damage/init.lua +++ b/mods/CORE/mcl_damage/init.lua @@ -39,7 +39,7 @@ function minetest.register_on_player_hpchange(func, modifier) end function mcl_damage.register_modifier(func, priority) - table.insert(mcl_damage, {func = func, priority = priority or 0}) + table.insert(mcl_damage.modifiers, {func = func, priority = priority or 0}) end function mcl_damage.get_mcl_damage_reason(mt_reason) @@ -86,8 +86,9 @@ function mcl_damage.get_mcl_damage_reason(mt_reason) end mcl_reason.source = mcl_reason.source or mcl_reason.direct - mcl_reason.flags = mcl_damage.types[mcl_reason.type] + + return mcl_reason end function mcl_damage.register_type(name, def) diff --git a/mods/ITEMS/mcl_armor/damage.lua b/mods/ITEMS/mcl_armor/damage.lua index 9dce824ea..35ae0eb30 100644 --- a/mods/ITEMS/mcl_armor/damage.lua +++ b/mods/ITEMS/mcl_armor/damage.lua @@ -24,9 +24,9 @@ function mcl_armor.damage_modifier(obj, hp_change, reason) if inv then for name, element in pairs(mcl_armor.elements) do - local itemstack = inventory:get_stack("armor", element.index) - if not stack:is_empty() then - local itemname = stack:get_name() + local itemstack = inv:get_stack("armor", element.index) + if not itemstack:is_empty() then + local itemname = itemstack:get_name() local enchantments = mcl_enchanting.get_enchantments(itemstack) if not flags.bypasses_armor then @@ -34,7 +34,7 @@ function mcl_armor.damage_modifier(obj, hp_change, reason) toughness = toughness + minetest.get_item_group(itemname, "mcl_armor_toughness") mcl_util.use_item_durability(itemstack, uses) - inventory:set_stack("armor", element.index, itemstack) + inv:set_stack("armor", element.index, itemstack) end if not flags.bypasses_magic then @@ -90,14 +90,10 @@ function mcl_armor.damage_modifier(obj, hp_change, reason) local thorns_item = thorns_pieces[math.random(#thorns_pieces)] mcl_util.use_item_durability(thorns_item.itemstack, 2) - inventory:set_stack("armor", thorns_item.index, thorns_item.itemstack) + inv:set_stack("armor", thorns_item.index, thorns_item.itemstack) end mcl_armor.update(obj) return -math.floor(damage + 0.5) end - -mcl_damage.register_modifier(function(player, hp_change, _, reason) - return mcl_armor.damage_modifier(player, hp_change, reason) -end) diff --git a/mods/ITEMS/mcl_armor/player.lua b/mods/ITEMS/mcl_armor/player.lua index a00429040..776d22dd6 100644 --- a/mods/ITEMS/mcl_armor/player.lua +++ b/mods/ITEMS/mcl_armor/player.lua @@ -140,4 +140,6 @@ minetest.register_on_joinplayer(function(player) end) end) - +mcl_damage.register_modifier(function(player, hp_change, _, reason) + return mcl_armor.damage_modifier(player, hp_change, reason) +end) From 4e37cc114c8201c22c0b99ed05608e35d5fb6c46 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 14 Apr 2021 19:06:30 +0200 Subject: [PATCH 007/136] Implement out_of_world damage type --- mods/ENVIRONMENT/mcl_void_damage/init.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mods/ENVIRONMENT/mcl_void_damage/init.lua b/mods/ENVIRONMENT/mcl_void_damage/init.lua index ee40ed702..ac39d10ba 100644 --- a/mods/ENVIRONMENT/mcl_void_damage/init.lua +++ b/mods/ENVIRONMENT/mcl_void_damage/init.lua @@ -40,7 +40,6 @@ minetest.register_on_mods_loaded(function() end self._void_timer = 0 - local pos = obj:get_pos() local void, void_deadly = is_in_void(pos) if void_deadly then local ent = obj:get_luaentity() @@ -81,7 +80,7 @@ minetest.register_globalstep(function(dtime) -- Damage enabled, not immortal: Deal void damage (4 HP / 0.5 seconds) if player:get_hp() > 0 then death_msg(player, S("@1 fell into the endless void.", player:get_player_name())) - player:set_hp(player:get_hp() - VOID_DAMAGE) + mcl_util.deal_damage(player, VOID_DAMAGE, {type = "out_of_world"}) end end end From a3af1cdf6e8752c081af5c8f519ef0249fbe4090 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 14 Apr 2021 19:07:58 +0200 Subject: [PATCH 008/136] Implement in_wall damage type --- mods/PLAYER/mcl_playerplus/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 64dbb1088..443e2d741 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -440,7 +440,7 @@ minetest.register_globalstep(function(dtime) and (not check_player_privs(name, {noclip = true})) then if player:get_hp() > 0 then mcl_death_messages.player_damage(player, S("@1 suffocated to death.", name)) - player:set_hp(player:get_hp() - 1) + mcl_util.deal_damage(player, 1, {type = "in_wall"}) end end From 9c75cd1a791be54cad10c42e9471d586b1684022 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 14 Apr 2021 19:09:46 +0200 Subject: [PATCH 009/136] Implement starve damage --- mods/PLAYER/mcl_hunger/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index b640dfdc9..8bc2d9582 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -164,7 +164,7 @@ minetest.register_globalstep(function(dtime) if mod_death_messages then mcl_death_messages.player_damage(player, S("@1 starved to death.", name)) end - player:set_hp(hp-1) + mcl_util.deal_damage(player, 1, {type = "starve"}) end end end From ec6d68322a257606018c1210bf0c8f0d2971c07f Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 14 Apr 2021 20:08:08 +0200 Subject: [PATCH 010/136] Make hbarmor work --- mods/ITEMS/mcl_armor/player.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_armor/player.lua b/mods/ITEMS/mcl_armor/player.lua index 776d22dd6..92494b88f 100644 --- a/mods/ITEMS/mcl_armor/player.lua +++ b/mods/ITEMS/mcl_armor/player.lua @@ -61,7 +61,7 @@ mcl_player.player_register_model("mcl_armor_character_female.b3d", { function mcl_armor.update_player(player, info) mcl_player.player_set_armor(player, info.texture, info.preview) - player:get_meta():set_int("mcl_armor:armor_point", info.points) + player:get_meta():set_int("mcl_armor:armor_points", info.points) end local function is_armor_action(inventory_info) From 727d7be6abfcc9dd663a7c49e14cc26f5d632a70 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 14 Apr 2021 20:39:05 +0200 Subject: [PATCH 011/136] Call on_equip and on_unequip everytime needed --- mods/ITEMS/mcl_armor/api.lua | 23 +++++++++++++++++++---- mods/ITEMS/mcl_armor/player.lua | 13 +++++++++++-- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua index 3f0641a54..a5d1ac0e5 100644 --- a/mods/ITEMS/mcl_armor/api.lua +++ b/mods/ITEMS/mcl_armor/api.lua @@ -18,6 +18,24 @@ function mcl_armor.play_equip_sound(stack, obj, pos, unequip) end end +function mcl_armor.on_equip(itemstack, obj) + local def = itemstack:get_definition() + mcl_armor.play_equip_sound(itemstack, obj) + if def._on_equip then + def._on_equip(obj, itemstack) + end + mcl_armor.update(obj) +end + +function mcl_armor.on_unequip(itemstack, obj) + local def = itemstack:get_definition() + mcl_armor.play_equip_sound(itemstack, obj, nil, true) + if def._on_unequip then + def._on_unequip(obj, itemstack) + end + mcl_armor.update(obj) +end + function mcl_armor.equip(itemstack, obj) local def = itemstack:get_definition() local element = mcl_armor.elements[def._mcl_armor_element or ""] @@ -27,10 +45,7 @@ function mcl_armor.equip(itemstack, obj) if inv:get_stack("armor", element.index):is_empty() then local equipping_item = itemstack:take_item() inv:set_stack("armor", element.index, equipping_item) - if def._on_equip then - def._on_equip(equipping_item) - end - mcl_armor.update(obj) + mcl_armor.on_equip(equipping_item, obj) end end diff --git a/mods/ITEMS/mcl_armor/player.lua b/mods/ITEMS/mcl_armor/player.lua index 92494b88f..651f8f776 100644 --- a/mods/ITEMS/mcl_armor/player.lua +++ b/mods/ITEMS/mcl_armor/player.lua @@ -122,10 +122,19 @@ minetest.register_allow_player_inventory_action(function(player, action, invento end end) --- ToDo: Call unequip callbacks & play uneqip sound minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) if is_armor_action(inventory_info) then - mcl_armor.update(player) + if action == "put" then + mcl_armor.on_equip(inventory_info.stack, player) + elseif action == "take" then + mcl_armor.on_unequip(inventory_info.stack, player) + else + if inventory_info.to_list == "armor" then + mcl_armor.on_equip(inventory:get_stack(inventory_info.to_list, inventory_info.to_index), player) + elseif inventory_info.from_list == "armor" then + mcl_armor.on_unequip(inventory:get_stack(inventory_info.to_list, inventory_info.to_index), player) + end + end end end) From 8931ffb7d32564687418a2590f1406945a8e1dcb Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 14 Apr 2021 20:39:35 +0200 Subject: [PATCH 012/136] Fix crash with armor enchantments --- 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 35ae0eb30..43d39869d 100644 --- a/mods/ITEMS/mcl_armor/damage.lua +++ b/mods/ITEMS/mcl_armor/damage.lua @@ -43,7 +43,7 @@ function mcl_armor.damage_modifier(obj, hp_change, reason) for _, enchantment in pairs(tbl) do local level = enchantments[enchantment.id] - if level > 0 then + if level and level > 0 then enchantment_protection_factor = enchantment_protection_factor + level * enchantment.factor end end From 095f78b78510cf84c42f6aedef9176f0516f5340 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Fri, 16 Apr 2021 18:34:29 +0200 Subject: [PATCH 013/136] Massive mcl_burning performance improvement --- mods/ENTITIES/mcl_mobs/api.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index a4b7e5132..ac96e3334 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -3447,7 +3447,7 @@ end -- main mob function local mob_step = function(self, dtime) - if not self.fire_resistant then + if not self.fire_resistant and self._mcl_burning_burn_time and self._mcl_burning_burn_time > 0 then mcl_burning.tick(self.object, dtime) end @@ -3906,7 +3906,7 @@ minetest.register_entity(name, { --default built in engine collision detection self.object:set_properties({ collide_with_objects = false, - }) + }) return mob_activate(self, staticdata, def, dtime) end, From 01c79c5a18d335e620777bff8e2d1e485c2337bb Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Fri, 16 Apr 2021 18:37:07 +0200 Subject: [PATCH 014/136] Fix mcl_burning.tick not being called at all for mobs --- mods/ENTITIES/mcl_mobs/api.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index ac96e3334..9182b11c6 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -3447,7 +3447,7 @@ end -- main mob function local mob_step = function(self, dtime) - if not self.fire_resistant and self._mcl_burning_burn_time and self._mcl_burning_burn_time > 0 then + if not self.fire_resistant and self.mcl_burning_burn_time and self.mcl_burning_burn_time > 0 then mcl_burning.tick(self.object, dtime) end From 10f81dbf0cfdcf60a9a86888e6ba1ae37e15d752 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Fri, 16 Apr 2021 18:41:10 +0200 Subject: [PATCH 015/136] Change max mcl_bossbars default to 5 (Minecraft value) --- settingtypes.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settingtypes.txt b/settingtypes.txt index bfda9b3ba..c5968a4c0 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -98,7 +98,7 @@ animated_chests (Animated chests) bool true 3d_player_preview (3D Player preview) bool true # The maximum number of boss bars to simultaniously display on the screen -max_bossbars (Maximum Boss bars) int 4 +max_bossbars (Maximum Boss bars) int 5 [Experimental] # Whether ice is translucent. If disabled, ice is fully opaque. From bd3c08d367fc454aecf9ddd6954d0a81cf2a9514 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Fri, 16 Apr 2021 19:50:56 +0200 Subject: [PATCH 016/136] Improve mcl_burning player performance --- mods/ENTITIES/mcl_burning/init.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_burning/init.lua b/mods/ENTITIES/mcl_burning/init.lua index 672036c78..6f1b0ef0d 100644 --- a/mods/ENTITIES/mcl_burning/init.lua +++ b/mods/ENTITIES/mcl_burning/init.lua @@ -15,7 +15,7 @@ minetest.register_entity("mcl_burning:fire", { pointable = false, glow = -1, }, - + animation_frame = 0, animation_timer = 0, on_step = mcl_burning.fire_entity_step, @@ -23,7 +23,9 @@ minetest.register_entity("mcl_burning:fire", { minetest.register_globalstep(function(dtime) for _, player in pairs(minetest.get_connected_players()) do - mcl_burning.tick(player, dtime) + if player:get_meta():get_float("mcl_burning:burn_time") > 0 then + mcl_burning.tick(player, dtime) + end end end) From 5f076d372a74c98d0991d070c12d4d31c71319e2 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 17 Apr 2021 07:42:49 +0200 Subject: [PATCH 017/136] fix many codestyle errors --- .luacheckrc | 3 +- mods/MAPGEN/mcl_villages/buildings.lua | 58 +++++++++++++------------- mods/MAPGEN/mcl_villages/const.lua | 20 ++++----- mods/MAPGEN/tsm_railcorridors/init.lua | 4 +- mods/MISC/findbiome/init.lua | 4 +- mods/PLAYER/mcl_playerplus/init.lua | 4 -- mods/PLAYER/mcl_spawn/init.lua | 6 +-- 7 files changed, 47 insertions(+), 52 deletions(-) diff --git a/.luacheckrc b/.luacheckrc index ce5049d37..f36a4a37b 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -1,6 +1,7 @@ unused_args = false allow_defined_top = true max_line_length = false +redefined = false globals = { "minetest", "core", @@ -11,7 +12,7 @@ read_globals = { "dump", "dump2", "vector", "VoxelManip", "VoxelArea", - "PseudoRandom", "PcgRandom", + "PseudoRandom", "PcgRandom", "PerlinNoise", "ItemStack", "Settings", "unpack", diff --git a/mods/MAPGEN/mcl_villages/buildings.lua b/mods/MAPGEN/mcl_villages/buildings.lua index e43db6d98..e917638db 100644 --- a/mods/MAPGEN/mcl_villages/buildings.lua +++ b/mods/MAPGEN/mcl_villages/buildings.lua @@ -12,19 +12,19 @@ function settlements.build_schematic(vm, data, va, pos, building, replace_wall, -- pick random material local material = wallmaterial[math.random(1,#wallmaterial)] -- schematic conversion to lua - local schem_lua = minetest.serialize_schematic(building, - "lua", + local schem_lua = minetest.serialize_schematic(building, + "lua", {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) end - schem_lua = schem_lua:gsub("mcl_core:dirt_with_grass", + schem_lua = schem_lua:gsub("mcl_core:dirt_with_grass", platform_material) -- Disable special junglewood for now. -- special material for spawning npcs - -- schem_lua = schem_lua:gsub("mcl_core:junglewood", + -- schem_lua = schem_lua:gsub("mcl_core:junglewood", -- "settlements:junglewood") -- @@ -37,25 +37,25 @@ function settlements.build_schematic(vm, data, va, pos, building, replace_wall, local possible_rotations = {"0", "90", "180", "270"} local rotation = possible_rotations[ math.random( #possible_rotations ) ] settlements.foundation( - pos, - width, - depth, - height, + pos, + width, + depth, + height, rotation) vm:set_data(data) -- place schematic minetest.place_schematic_on_vmanip( - vm, - pos, - schematic, - rotation, - nil, + vm, + pos, + schematic, + rotation, + nil, true) vm:write_to_map(true) end]] ------------------------------------------------------------------------------- --- initialize settlement_info +-- initialize settlement_info ------------------------------------------------------------------------------- function settlements.initialize_settlement_info(pr) local count_buildings = {} @@ -81,8 +81,8 @@ function settlements.create_site_plan(maxp, minp, pr) local possible_rotations = {"0", "90", "180", "270"} -- find center of chunk local center = { - x=math.floor((minp.x+maxp.x)/2), - y=maxp.y, + x=math.floor((minp.x+maxp.x)/2), + y=maxp.y, z=math.floor((minp.z+maxp.z)/2) } -- find center_surface of chunk @@ -105,8 +105,8 @@ function settlements.create_site_plan(maxp, minp, pr) -- add to settlement info table local index = 1 settlement_info[index] = { - pos = center_surface, - name = building_all_info["name"], + pos = center_surface, + name = building_all_info["name"], hsize = building_all_info["hsize"], rotat = rotation, surface_mat = surface_material @@ -149,8 +149,8 @@ function settlements.create_site_plan(maxp, minp, pr) rotation = possible_rotations[ pr:next(1, #possible_rotations ) ] number_built = number_built + 1 settlement_info[index] = { - pos = pos_surface, - name = building_all_info["name"], + pos = pos_surface, + name = building_all_info["name"], hsize = building_all_info["hsize"], rotat = rotation, surface_mat = surface_material @@ -215,10 +215,10 @@ function settlements.place_schematics(settlement_info, pr) end end - local pos = settlement_info[i]["pos"] - local rotation = settlement_info[i]["rotat"] + local pos = settlement_info[i]["pos"] + local rotation = settlement_info[i]["rotat"] -- get building node material for better integration to surrounding - local platform_material = settlement_info[i]["surface_mat"] + local platform_material = settlement_info[i]["surface_mat"] --platform_material_name = minetest.get_name_from_content_id(platform_material) -- pick random material --local material = wallmaterial[pr:next(1,#wallmaterial)] @@ -226,8 +226,8 @@ function settlements.place_schematics(settlement_info, pr) local building = building_all_info["mts"] local replace_wall = building_all_info["rplc"] -- schematic conversion to lua - local schem_lua = minetest.serialize_schematic(building, - "lua", + local schem_lua = minetest.serialize_schematic(building, + "lua", {lua_use_comments = false, lua_num_indent_spaces = 0}).." return(schematic)" schem_lua = schem_lua:gsub("mcl_core:stonebrickcarved", "mcl_villages:stonebrickcarved") -- replace material @@ -269,10 +269,10 @@ function settlements.place_schematics(settlement_info, pr) -- build foundation for the building an make room above -- place schematic mcl_structures.place_schematic( - pos, - schematic, - rotation, - nil, + pos, + schematic, + rotation, + nil, true, nil, init_nodes, diff --git a/mods/MAPGEN/mcl_villages/const.lua b/mods/MAPGEN/mcl_villages/const.lua index 4e2b39136..6621dbf3a 100644 --- a/mods/MAPGEN/mcl_villages/const.lua +++ b/mods/MAPGEN/mcl_villages/const.lua @@ -8,15 +8,15 @@ end --[[ Manually set in 'buildings.lua' -- material to replace cobblestone with wallmaterial = { - "mcl_core:junglewood", - "mcl_core:sprucewood", - "mcl_core:wood", - "mcl_core:birchwood", - "mcl_core:acaciawood", - "mcl_core:stonebrick", - "mcl_core:cobble", - "mcl_core:sandstonecarved", - "mcl_core:sandstone", + "mcl_core:junglewood", + "mcl_core:sprucewood", + "mcl_core:wood", + "mcl_core:birchwood", + "mcl_core:acaciawood", + "mcl_core:stonebrick", + "mcl_core:cobble", + "mcl_core:sandstonecarved", + "mcl_core:sandstone", "mcl_core:sandstonesmooth2" } --]] @@ -78,4 +78,4 @@ max_height_difference = 56 -- -- half_map_chunk_size = 40 -quarter_map_chunk_size = 20 +--quarter_map_chunk_size = 20 diff --git a/mods/MAPGEN/tsm_railcorridors/init.lua b/mods/MAPGEN/tsm_railcorridors/init.lua index 893f3d739..2414cc962 100644 --- a/mods/MAPGEN/tsm_railcorridors/init.lua +++ b/mods/MAPGEN/tsm_railcorridors/init.lua @@ -823,7 +823,7 @@ local function create_corridor_line(waypoint, axis, sign, length, wood, post, da local s = sign local ud = false -- Up or down local udn = false -- Up or down is next - local udp = false -- Up or down was previous + local udp -- Up or down was previous local up = false -- true if going up local upp = false -- true if was going up previously for i=1,length do @@ -911,7 +911,7 @@ local function create_corridor_line(waypoint, axis, sign, length, wood, post, da a="z" elseif a=="z" then a="x" - end; + end; s = pr:next(1, 2) == 1 end end diff --git a/mods/MISC/findbiome/init.lua b/mods/MISC/findbiome/init.lua index ce7fd9799..5f55da493 100644 --- a/mods/MISC/findbiome/init.lua +++ b/mods/MISC/findbiome/init.lua @@ -119,7 +119,7 @@ local function find_biome(pos, biomes) local edge_dist = 0 local dir_step = 0 local dir_ind = 1 - local success = false + local success local spawn_pos local biome_ids @@ -166,7 +166,7 @@ local function find_biome(pos, biomes) spawn_pos = {x = spos.x, y = spos.y, z = spos.z} end if spawn_pos then - local adjusted_pos, outside = adjust_pos_to_biome_limits(spawn_pos, biome_id) + local _,outside = adjust_pos_to_biome_limits(spawn_pos, biome_id) if is_in_world(spawn_pos) and not outside then return true end diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 5cca23d32..8dad7b2c5 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -22,7 +22,6 @@ local math = math -- Internal player state local mcl_playerplus_internal = {} -local def = {} local time = 0 local look_pitch = 0 @@ -376,9 +375,6 @@ minetest.register_globalstep(function(dtime) return end - -- set defaults - def.speed = 1 - -- Standing on soul sand? If so, walk slower (unless player wears Soul Speed boots) if node_stand == "mcl_nether:soul_sand" then -- TODO: Tweak walk speed diff --git a/mods/PLAYER/mcl_spawn/init.lua b/mods/PLAYER/mcl_spawn/init.lua index fe88cf3de..441db28b7 100644 --- a/mods/PLAYER/mcl_spawn/init.lua +++ b/mods/PLAYER/mcl_spawn/init.lua @@ -500,10 +500,8 @@ function mcl_spawn.shadow_worker() if success then local wsp_node = minetest.get_node(wsp) - if wsp_node and wsp_node.name == "ignore" then - -- special case - respawn area unloaded from memory - it's okay, skip for now - - elseif ((not good_for_respawn(wsp)) or ((no_trees_area_counter >= 0) and not can_find_tree(wsp))) then + if not (wsp_node and wsp_node.name == "ignore") + and ((not good_for_respawn(wsp)) or ((no_trees_area_counter >= 0) and not can_find_tree(wsp))) then success = false minetest.log("action", "[mcl_spawn] World spawn position isn't safe anymore: "..minetest.pos_to_string(wsp)) mcl_spawn.search() From 22a2fdbf5fca5bee14ac5ee23fa325610853ab37 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 17 Apr 2021 07:46:24 +0200 Subject: [PATCH 018/136] fix more codestyle --- mods/MAPGEN/mcl_structures/init.lua | 13 ++++++------- mods/MAPGEN/mcl_villages/buildings.lua | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/mods/MAPGEN/mcl_structures/init.lua b/mods/MAPGEN/mcl_structures/init.lua index b7afd18bb..e3f6b4829 100644 --- a/mods/MAPGEN/mcl_structures/init.lua +++ b/mods/MAPGEN/mcl_structures/init.lua @@ -110,7 +110,8 @@ mcl_structures.generate_igloo = function(pos, rotation, pr) if r == 1 then -- Select basement depth local dim = mcl_worlds.pos_to_dimension(pos) - local buffer = pos.y - (mcl_vars.mg_lava_overworld_max + 10) + --local buffer = pos.y - (mcl_vars.mg_lava_overworld_max + 10) + local buffer if dim == "nether" then buffer = pos.y - (mcl_vars.mg_lava_nether_max + 10) elseif dim == "end" then @@ -219,7 +220,7 @@ local function igloo_placement_callback(p1, p2, size, orientation, pr) else return end - local size = {x=9,y=5,z=7} + --local size = {x=9,y=5,z=7} local lootitems = mcl_loot.get_multi_loot({ { stacks_min = 1, @@ -335,7 +336,7 @@ local function shrine_placement_callback(p1, p2, size, rotation, pr) -- Find and setup spawner with silverfish local spawners = minetest.find_nodes_in_area(p1, p2, "mcl_mobspawners:spawner") for s=1, #spawners do - local meta = minetest.get_meta(spawners[s]) + --local meta = minetest.get_meta(spawners[s]) mcl_mobspawners.setup_spawner(spawners[s], "mobs_mc:silverfish") end @@ -411,7 +412,7 @@ end mcl_structures.generate_end_portal_shrine = function(pos, rotation, pr) local offset = {x=6, y=4, z=6} - local size = {x=13, y=8, z=13} + --local size = {x=13, y=8, z=13} local newpos = { x = pos.x - offset.x, y = pos.y, z = pos.z - offset.z } local path = minetest.get_modpath("mcl_structures").."/schematics/mcl_structures_end_portal_room_simple.mts" @@ -471,8 +472,6 @@ local function temple_placement_callback(p1, p2, size, rotation, pr) { itemstring = "mcl_mobitems:string", weight = 10, amount_min = 1, amount_max = 8 }, } }}, pr) - - local meta = minetest.get_meta(chests[c]) init_node_construct(chests[c]) local meta = minetest.get_meta(chests[c]) local inv = meta:get_inventory() @@ -498,7 +497,7 @@ mcl_structures.generate_desert_temple = function(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} - local size = {x=22, y=24, z=22} + --local size = {x=22, y=24, z=22} if newpos == nil then return end diff --git a/mods/MAPGEN/mcl_villages/buildings.lua b/mods/MAPGEN/mcl_villages/buildings.lua index e917638db..9d8e7580f 100644 --- a/mods/MAPGEN/mcl_villages/buildings.lua +++ b/mods/MAPGEN/mcl_villages/buildings.lua @@ -84,7 +84,7 @@ function settlements.create_site_plan(maxp, minp, pr) x=math.floor((minp.x+maxp.x)/2), y=maxp.y, z=math.floor((minp.z+maxp.z)/2) - } + } -- find center_surface of chunk local center_surface , surface_material = settlements.find_surface(center, true) local chunks = {} From 02f393998ff6893f958f9a9e5034f74ff35c9bad Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 17 Apr 2021 09:26:37 +0200 Subject: [PATCH 019/136] fix many warnings (644 remaining) --- .luacheckrc | 2 +- mods/ITEMS/mcl_potions/init.lua | 13 ++++--------- mods/ITEMS/mcl_potions/potions.lua | 4 ++-- mods/ITEMS/mcl_potions/splash.lua | 4 ++-- mods/ITEMS/mcl_potions/tipped_arrow.lua | 7 +++---- mods/ITEMS/mcl_signs/init.lua | 6 +++--- mods/ITEMS/mcl_stairs/api.lua | 6 ++++-- mods/ITEMS/mcl_throwing/register.lua | 2 +- mods/ITEMS/mcl_torches/api.lua | 2 +- mods/MAPGEN/mcl_dungeons/init.lua | 12 +++++------- mods/MAPGEN/mcl_mapgen_core/init.lua | 24 ++++++++++++------------ 11 files changed, 38 insertions(+), 44 deletions(-) diff --git a/.luacheckrc b/.luacheckrc index f36a4a37b..556b2e8f0 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -12,7 +12,7 @@ read_globals = { "dump", "dump2", "vector", "VoxelManip", "VoxelArea", - "PseudoRandom", "PcgRandom", "PerlinNoise", + "PseudoRandom", "PcgRandom", "PerlinNoise", "PerlinNoiseMap", "ItemStack", "Settings", "unpack", diff --git a/mods/ITEMS/mcl_potions/init.lua b/mods/ITEMS/mcl_potions/init.lua index 65bb0d4de..6cfa0dc50 100644 --- a/mods/ITEMS/mcl_potions/init.lua +++ b/mods/ITEMS/mcl_potions/init.lua @@ -25,11 +25,9 @@ dofile(modpath .. "/lingering.lua") dofile(modpath .. "/tipped_arrow.lua") dofile(modpath .. "/potions.lua") -local brewhelp = S("Try different combinations to create potions.") - minetest.register_craftitem("mcl_potions:fermented_spider_eye", { description = S("Fermented Spider Eye"), - _doc_items_longdesc = brewhelp, + _doc_items_longdesc = S("Try different combinations to create potions."), wield_image = "mcl_potions_spider_eye_fermented.png", inventory_image = "mcl_potions_spider_eye_fermented.png", groups = { brewitem = 1, }, @@ -65,14 +63,12 @@ minetest.register_craftitem("mcl_potions:glass_bottle", { -- Try to fill glass bottle with water local get_water = false - local from_liquid_source = false + --local from_liquid_source = false local river_water = false - if not def then - -- Unknown node: no-op - elseif def.groups and def.groups.water and def.liquidtype == "source" then + if def and def.groups and def.groups.water and def.liquidtype == "source" then -- Water source get_water = true - from_liquid_source = true + --from_liquid_source = true river_water = node.name == "mclx_core:river_water_source" -- Or reduce water level of cauldron by 1 elseif string.sub(node.name, 1, 14) == "mcl_cauldrons:" then @@ -440,7 +436,6 @@ function mcl_potions.get_alchemy(ingr, pot) if brew_table[ingr] ~= nil then return brew_table[ingr] end - end if mod_table[ingr] ~= nil then diff --git a/mods/ITEMS/mcl_potions/potions.lua b/mods/ITEMS/mcl_potions/potions.lua index 4a82348e5..2d76a217b 100644 --- a/mods/ITEMS/mcl_potions/potions.lua +++ b/mods/ITEMS/mcl_potions/potions.lua @@ -1,5 +1,5 @@ local S = minetest.get_translator("mcl_potions") -local brewhelp = S("Try different combinations to create potions.") +--local brewhelp = S("Try different combinations to create potions.") local potion_image = function(colorstring, opacity) if not opacity then @@ -98,7 +98,7 @@ local function register_potion(def) end elseif def.name == "healing" or def.name == "harming" then _tt = S("@1 HP", effect) - else + else _tt = tt or time_string(dur) or S("No effect") end return _tt diff --git a/mods/ITEMS/mcl_potions/splash.lua b/mods/ITEMS/mcl_potions/splash.lua index bea07b8cf..f986134d6 100644 --- a/mods/ITEMS/mcl_potions/splash.lua +++ b/mods/ITEMS/mcl_potions/splash.lua @@ -123,6 +123,6 @@ function mcl_potions.register_splash(name, descr, color, def) }) end -local function time_string(dur) +--[[local function time_string(dur) return math.floor(dur/60)..string.format(":%02d",math.floor(dur % 60)) -end +end]] diff --git a/mods/ITEMS/mcl_potions/tipped_arrow.lua b/mods/ITEMS/mcl_potions/tipped_arrow.lua index 860019e8a..abeae8106 100644 --- a/mods/ITEMS/mcl_potions/tipped_arrow.lua +++ b/mods/ITEMS/mcl_potions/tipped_arrow.lua @@ -4,12 +4,12 @@ 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 dir2 = vector.normalize(dir) local xz = math.abs(dir.x) + math.abs(dir.z) return -math.atan2(-dir.y, xz) end @@ -197,7 +197,6 @@ function mcl_potions.register_arrow(name, desc, color, def) glow = 1, }) end - -- We just check for any hurtable objects nearby. -- The radius of 3 is fairly liberal, but anything lower than than will cause -- arrow to hilariously go through mobs often. @@ -360,7 +359,7 @@ function mcl_potions.register_arrow(name, desc, color, def) 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_signs/init.lua b/mods/ITEMS/mcl_signs/init.lua index e053c6e82..be9db2fee 100644 --- a/mods/ITEMS/mcl_signs/init.lua +++ b/mods/ITEMS/mcl_signs/init.lua @@ -93,7 +93,7 @@ local generate_line = function(s, ypos) local chars = 0 local printed_char_width = CHAR_WIDTH + 1 while chars < LINE_LENGTH and i <= #s do - local file = nil + local file -- Get and render character if charmap[s:sub(i, i)] ~= nil then file = charmap[s:sub(i, i)] @@ -185,7 +185,7 @@ local function get_wall_signtext_info(param2, nodename) end end -local sign_groups = {handy=1,axey=1, flammable=1, deco_block=1, material_wood=1, attached_node=1, dig_by_piston=1, flammable=-1} +local sign_groups = {handy=1,axey=1, deco_block=1, material_wood=1, attached_node=1, dig_by_piston=1, flammable=-1} local destruct_sign = function(pos) local objects = minetest.get_objects_inside_radius(pos, 0.5) @@ -322,7 +322,7 @@ minetest.register_node("mcl_signs:wall_sign", { local wdir = minetest.dir_to_wallmounted(dir) - local placer_pos = placer:get_pos() + --local placer_pos = placer:get_pos() local fdir = minetest.dir_to_facedir(dir) diff --git a/mods/ITEMS/mcl_stairs/api.lua b/mods/ITEMS/mcl_stairs/api.lua index aecf10836..cca54226f 100644 --- a/mods/ITEMS/mcl_stairs/api.lua +++ b/mods/ITEMS/mcl_stairs/api.lua @@ -20,7 +20,7 @@ local function place_slab_normal(itemstack, placer, pointed_thing) local p0 = pointed_thing.under local p1 = pointed_thing.above - local placer_pos = placer:get_pos() + --local placer_pos = placer:get_pos() local fpos = get_fpos(placer, pointed_thing) @@ -179,7 +179,7 @@ end -- Slab facedir to placement 6d matching table -local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4} +--local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4} -- Register slabs. -- Node will be called mcl_stairs:slab_ @@ -268,6 +268,7 @@ function mcl_stairs.register_slab(subname, recipeitem, groups, images, descripti end end, _mcl_hardness = hardness, + _mcl_blast_resistance = blast_resistance, _mcl_other_slab_half = upper_slab, on_rotate = function(pos, node, user, mode, param2) -- Flip slab @@ -331,6 +332,7 @@ function mcl_stairs.register_slab(subname, recipeitem, groups, images, descripti sounds = sounds, drop = lower_slab .. " 2", _mcl_hardness = hardness, + _mcl_blast_resistance = blast_resistance, }) if recipeitem then diff --git a/mods/ITEMS/mcl_throwing/register.lua b/mods/ITEMS/mcl_throwing/register.lua index 3d8cc94cf..c2af9717f 100644 --- a/mods/ITEMS/mcl_throwing/register.lua +++ b/mods/ITEMS/mcl_throwing/register.lua @@ -224,7 +224,7 @@ local pearl_on_step = function(self, dtime) lv, ld = math.abs(vc.x), "x" end if math.abs(vc.z) > lv then - lv, ld = math.abs(vc.z), "z" + ld = "z" --math.abs(vc.z) end if ld ~= "x" then vc.x = 0 end if ld ~= "y" then vc.y = 0 end diff --git a/mods/ITEMS/mcl_torches/api.lua b/mods/ITEMS/mcl_torches/api.lua index 304488805..c98bda3d9 100644 --- a/mods/ITEMS/mcl_torches/api.lua +++ b/mods/ITEMS/mcl_torches/api.lua @@ -30,7 +30,7 @@ local spawn_flames_floor = function(pos) end local spawn_flames_wall = function(pos) - local minrelpos, maxrelpos + --local minrelpos, maxrelpos local node = minetest.get_node(pos) local dir = minetest.wallmounted_to_dir(node.param2) diff --git a/mods/MAPGEN/mcl_dungeons/init.lua b/mods/MAPGEN/mcl_dungeons/init.lua index 928faaa11..58e23b12e 100644 --- a/mods/MAPGEN/mcl_dungeons/init.lua +++ b/mods/MAPGEN/mcl_dungeons/init.lua @@ -49,12 +49,12 @@ local dungeonsizes = { { x=7, y=4, z=7}, } -local dirs = { +--[[local dirs = { { x= 1, y=0, z= 0 }, { x= 0, y=0, z= 1 }, { x=-1, y=0, z= 0 }, { x= 0, y=0, z=-1 }, -} +}]] local surround_vectors = { { x=-1, y=0, z=0 }, @@ -66,7 +66,7 @@ local surround_vectors = { local function ecb_spawn_dungeon(blockpos, action, calls_remaining, param) if calls_remaining >= 1 then return end - local p1, p2, dim, pr = param.p1, param.p2, param.dim, param.pr + local p1, _, dim, pr = param.p1, param.p2, param.dim, param.pr local x, y, z = p1.x, p1.y, p1.z local check = not (param.dontcheck or false) @@ -404,8 +404,7 @@ local function dungeons_nodes(minp, maxp, blockseed) local p1 = {x=x,y=y,z=z} local p2 = {x = x+dim.x+1, y = y+dim.y+1, z = z+dim.z+1} minetest.log("verbose","[mcl_dungeons] size=" ..minetest.pos_to_string(dim) .. ", emerge from "..minetest.pos_to_string(p1) .. " to " .. minetest.pos_to_string(p2)) - local param = {p1=p1, p2=p2, dim=dim, pr=pr} - emerge_area(p1, p2, ecb_spawn_dungeon, param) + emerge_area(p1, p2, ecb_spawn_dungeon, {p1=p1, p2=p2, dim=dim, pr=pr}) end end @@ -414,8 +413,7 @@ function mcl_dungeons.spawn_dungeon(p1, _, pr) local dim = dungeonsizes[pr:next(1, #dungeonsizes)] local p2 = {x = p1.x+dim.x+1, y = p1.y+dim.y+1, z = p1.z+dim.z+1} minetest.log("verbose","[mcl_dungeons] size=" ..minetest.pos_to_string(dim) .. ", emerge from "..minetest.pos_to_string(p1) .. " to " .. minetest.pos_to_string(p2)) - local param = {p1=p1, p2=p2, dim=dim, pr=pr, dontcheck=true} - emerge_area(p1, p2, ecb_spawn_dungeon, param) + emerge_area(p1, p2, ecb_spawn_dungeon, {p1=p1, p2=p2, dim=dim, pr=pr, dontcheck=true}) end mcl_mapgen_core.register_generator("dungeons", nil, dungeons_nodes, 999999) diff --git a/mods/MAPGEN/mcl_mapgen_core/init.lua b/mods/MAPGEN/mcl_mapgen_core/init.lua index 1ee861e4a..90b272506 100644 --- a/mods/MAPGEN/mcl_mapgen_core/init.lua +++ b/mods/MAPGEN/mcl_mapgen_core/init.lua @@ -65,21 +65,21 @@ local c_dirt = minetest.get_content_id("mcl_core:dirt") local c_dirt_with_grass = minetest.get_content_id("mcl_core:dirt_with_grass") local c_dirt_with_grass_snow = minetest.get_content_id("mcl_core:dirt_with_grass_snow") local c_sand = minetest.get_content_id("mcl_core:sand") -local c_sandstone = minetest.get_content_id("mcl_core:sandstone") +--local c_sandstone = minetest.get_content_id("mcl_core:sandstone") local c_void = minetest.get_content_id("mcl_core:void") local c_lava = minetest.get_content_id("mcl_core:lava_source") local c_water = minetest.get_content_id("mcl_core:water_source") local c_soul_sand = minetest.get_content_id("mcl_nether:soul_sand") local c_netherrack = minetest.get_content_id("mcl_nether:netherrack") local c_nether_lava = minetest.get_content_id("mcl_nether:nether_lava_source") -local c_end_stone = minetest.get_content_id("mcl_end:end_stone") +--local c_end_stone = minetest.get_content_id("mcl_end:end_stone") local c_realm_barrier = minetest.get_content_id("mcl_core:realm_barrier") local c_top_snow = minetest.get_content_id("mcl_core:snow") local c_snow_block = minetest.get_content_id("mcl_core:snowblock") local c_clay = minetest.get_content_id("mcl_core:clay") local c_leaves = minetest.get_content_id("mcl_core:leaves") local c_jungleleaves = minetest.get_content_id("mcl_core:jungleleaves") -local c_jungletree = minetest.get_content_id("mcl_core:jungletree") +--local c_jungletree = minetest.get_content_id("mcl_core:jungletree") local c_cocoa_1 = minetest.get_content_id("mcl_cocoas:cocoa_1") local c_cocoa_2 = minetest.get_content_id("mcl_cocoas:cocoa_2") local c_cocoa_3 = minetest.get_content_id("mcl_cocoas:cocoa_3") @@ -1169,13 +1169,13 @@ 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 biomemap_to_xz = function(index, minp, maxp) local xwidth = maxp.x - minp.x + 1 local zwidth = maxp.z - minp.z + 1 local x = ((index-1) % xwidth) + minp.x local z = ((index-1) / zwidth) + minp.z return x, z -end +end]] -- Takes x and z coordinates and minp and maxp of a generated chunk -- (in on_generated callback) and returns a biomemap index) @@ -1897,7 +1897,7 @@ function mcl_mapgen_core.unregister_generator(id) local rec = registered_generators[id] registered_generators[id] = nil if rec.vf then lvm = lvm - 1 end - if rev.nf then nodes = nodes - 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 end @@ -1979,7 +1979,7 @@ end -- Below the bedrock, generate air/void local function basic(vm, data, data2, emin, emax, area, minp, maxp, blockseed) - local biomemap, ymin, ymax + local biomemap --ymin, ymax local lvm_used = false local pr = PseudoRandom(blockseed) @@ -2077,7 +2077,7 @@ local function basic(vm, data, data2, emin, emax, area, minp, maxp, blockseed) local n = nodes[n] local p_pos = area:index(n.x, n.y, n.z) local p_pos_above = area:index(n.x, n.y+1, n.z) - local p_pos_below = area:index(n.x, n.y-1, n.z) + --local p_pos_below = area:index(n.x, n.y-1, n.z) local b_pos = aream:index(n.x, 0, n.z) local bn = minetest.get_biome_name(biomemap[b_pos]) if bn then @@ -2126,7 +2126,7 @@ local function basic(vm, data, data2, emin, emax, area, minp, maxp, blockseed) -- * Remove stone, sand, dirt in v6 so our End map generator works in v6. -- * Generate spawn platform (End portal destination) elseif minp.y <= mcl_vars.mg_end_max and maxp.y >= mcl_vars.mg_end_min then - local nodes, n + local nodes if mg_name == "v6" then nodes = minetest.find_nodes_in_area(emin, emax, {"mcl_core:water_source", "mcl_core:stone", "mcl_core:sand", "mcl_core:dirt"}) else @@ -2134,7 +2134,7 @@ local function basic(vm, data, data2, emin, emax, area, minp, maxp, blockseed) end if #nodes > 0 then lvm_used = true - for _, n in pairs(nodes) do + for _,n in pairs(nodes) do data[area:index(n.x, n.y, n.z)] = c_air end end @@ -2144,8 +2144,8 @@ local function basic(vm, data, data2, emin, emax, area, minp, maxp, blockseed) minp.x <= mcl_vars.mg_end_platform_pos.x and maxp.x >= mcl_vars.mg_end_platform_pos.z and minp.z <= mcl_vars.mg_end_platform_pos.z and maxp.z >= mcl_vars.mg_end_platform_pos.z then - local pos1 = {x = math.max(minp.x, mcl_vars.mg_end_platform_pos.x-2), y = math.max(minp.y, mcl_vars.mg_end_platform_pos.y), z = math.max(minp.z, mcl_vars.mg_end_platform_pos.z-2)} - local pos2 = {x = math.min(maxp.x, mcl_vars.mg_end_platform_pos.x+2), y = math.min(maxp.y, mcl_vars.mg_end_platform_pos.y+2), z = math.min(maxp.z, mcl_vars.mg_end_platform_pos.z+2)} + --local pos1 = {x = math.max(minp.x, mcl_vars.mg_end_platform_pos.x-2), y = math.max(minp.y, mcl_vars.mg_end_platform_pos.y), z = math.max(minp.z, mcl_vars.mg_end_platform_pos.z-2)} + --local pos2 = {x = math.min(maxp.x, mcl_vars.mg_end_platform_pos.x+2), y = math.min(maxp.y, mcl_vars.mg_end_platform_pos.y+2), z = math.min(maxp.z, mcl_vars.mg_end_platform_pos.z+2)} for x=math.max(minp.x, mcl_vars.mg_end_platform_pos.x-2), math.min(maxp.x, mcl_vars.mg_end_platform_pos.x+2) do for z=math.max(minp.z, mcl_vars.mg_end_platform_pos.z-2), math.min(maxp.z, mcl_vars.mg_end_platform_pos.z+2) do From 4d515e95c6bc5b6e30ed6a5d9ebcca0941731a9f Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 17 Apr 2021 12:58:40 +0200 Subject: [PATCH 020/136] Remove wieldview --- mods/PLAYER/wieldview/init.lua | 131 --------------------------------- 1 file changed, 131 deletions(-) delete mode 100644 mods/PLAYER/wieldview/init.lua diff --git a/mods/PLAYER/wieldview/init.lua b/mods/PLAYER/wieldview/init.lua deleted file mode 100644 index 91b2cd721..000000000 --- a/mods/PLAYER/wieldview/init.lua +++ /dev/null @@ -1,131 +0,0 @@ -local update_time = tonumber(minetest.settings:get("wieldview_update_time")) -if not update_time then - update_time = 2 - minetest.settings:set("wieldview_update_time", tostring(update_time)) -end -local node_tiles = minetest.settings:get_bool("wieldview_node_tiles") -if not node_tiles then - node_tiles = false - minetest.settings:set("wieldview_node_tiles", "false") -end - -wieldview = { - wielded_item = {}, - transform = {}, -} - -dofile(minetest.get_modpath(minetest.get_current_modname()).."/transform.lua") - -wieldview.get_item_texture = function(self, item) - local texture = "blank.png" - if item ~= "" then - if minetest.registered_items[item] then - if minetest.registered_items[item].inventory_image ~= "" then - texture = minetest.registered_items[item].inventory_image - elseif node_tiles == true and minetest.registered_items[item].tiles - and type(minetest.registered_items[item].tiles[1]) == "string" - and minetest.registered_items[item].tiles[1] ~= "" then - texture = minetest.inventorycube(minetest.registered_items[item].tiles[1]) - end - end - -- Get item image transformation, first from group, then from transform.lua - local transform = minetest.get_item_group(item, "wieldview_transform") - if transform == 0 then - transform = wieldview.transform[item] - end - if transform then - -- This actually works with groups ratings because transform1, transform2, etc. - -- have meaning and transform0 is used for identidy, so it can be ignored - texture = texture.."^[transform"..tostring(transform) - end - end - return texture -end - -wieldview.update_wielded_item = function(self, player) - if not player then - return - end - local name = player:get_player_name() - local stack = player:get_wielded_item() - local item = stack:get_name() - if not item then - return - end - if self.wielded_item[name] then - if self.wielded_item[name] == item then - return - end - if not armor.textures[name] then - return - end - armor.textures[name].wielditem = self:get_item_texture(item) - armor:update_player_visuals(player) - end - self.wielded_item[name] = item -end - -minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() - wieldview.wielded_item[name] = "" - minetest.after(0, function(target) - -- if the player left :is_player() will return nil - if not target:is_player() then - return - end - wieldview:update_wielded_item(target) - local itementity = minetest.add_entity(target:get_pos(), "wieldview:wieldnode") - itementity:set_attach(target, "Hand_Right", vector.new(0, 1, 0), vector.new(90, 0, 45)) - itementity:get_luaentity().wielder = name - end, player) -end) - -minetest.register_globalstep(function() - for _,player in pairs(minetest.get_connected_players()) do - wieldview:update_wielded_item(player) - end -end) - -minetest.register_entity("wieldview:wieldnode", { - initial_properties = { - hp_max = 1, - visual = "wielditem", - physical = false, - textures = {""}, - automatic_rotate = 1.5, - is_visible = true, - pointable = false, - collide_with_objects = false, - static_save = false, - collisionbox = {-0.21, -0.21, -0.21, 0.21, 0.21, 0.21}, - selectionbox = {-0.21, -0.21, -0.21, 0.21, 0.21, 0.21}, - visual_size = {x = 0.21, y = 0.21}, - }, - - itemstring = "", - - on_step = function(self) - local player = minetest.get_player_by_name(self.wielder) - if player then - local wielded = player:get_wielded_item() - local itemstring = wielded:get_name() - - if self.itemstring ~= itemstring then - local def = minetest.registered_items[itemstring] - self.object:set_properties({glow = def and def.light_source or 0}) - - -- wield item as cubic - if armor.textures[self.wielder].wielditem == "blank.png" then - self.object:set_properties({textures = {itemstring}}) - -- wield item as flat - else - self.object:set_properties({textures = {""}}) - end - - self.itemstring = itemstring - end - else - self.object:remove() - end - end, -}) From d952423dda778bd675c1a3ffc00fb35136c5894f Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 17 Apr 2021 13:24:30 +0200 Subject: [PATCH 021/136] Improve wielditem performance and fix wielditems sometimes showing duplicate --- mods/PLAYER/mcl_wieldview/init.lua | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/mods/PLAYER/mcl_wieldview/init.lua b/mods/PLAYER/mcl_wieldview/init.lua index 7be3b83dc..fc9ebc074 100644 --- a/mods/PLAYER/mcl_wieldview/init.lua +++ b/mods/PLAYER/mcl_wieldview/init.lua @@ -33,11 +33,10 @@ function mcl_wieldview.update_wielded_item(player) if not player then return end - local name = player:get_player_name() local itemstack = player:get_wielded_item() local itemname = itemstack:get_name() - local def = mcl_wieldview.players[name] + local def = mcl_wieldview.players[player] if def.item == itemname then return @@ -50,8 +49,7 @@ function mcl_wieldview.update_wielded_item(player) end minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() - mcl_wieldview.players[name] = {item = "", texture = "blank.png"} + mcl_wieldview.players[player] = {item = "", texture = "blank.png"} minetest.after(0, function() if not player:is_player() then @@ -62,13 +60,12 @@ minetest.register_on_joinplayer(function(player) local itementity = minetest.add_entity(player:get_pos(), "mcl_wieldview:wieldnode") itementity:set_attach(player, "Hand_Right", vector.new(0, 1, 0), vector.new(90, 0, 45)) - itementity:get_luaentity().wielder = name + itementity:get_luaentity().wielder = player end) end) minetest.register_on_leaveplayer(function(player) - local name = player:get_player_name() - mcl_wieldview.players[name] = nil + mcl_wieldview.players[player] = nil end) minetest.register_globalstep(function() @@ -96,17 +93,16 @@ minetest.register_entity("mcl_wieldview:wieldnode", { itemstring = "", on_step = function(self) - local player = minetest.get_player_by_name(self.wielder) - if player then - local wielded = player:get_wielded_item() - local itemstring = wielded:get_name() + if self.wielder:is_player() then + local def = mcl_wieldview.players[self.wielder] + local itemstring = def.item if self.itemstring ~= itemstring then - local def = minetest.registered_items[itemstring] - self.object:set_properties({glow = def and def.light_source or 0}) + local itemdef = minetest.registered_items[itemstring] + self.object:set_properties({glow = itemdef and itemdef.light_source or 0}) -- wield item as cubic - if mcl_wieldview.players[self.wielder].texture == "blank.png" then + if def.texture == "blank.png" then self.object:set_properties({textures = {itemstring}}) -- wield item as flat else From c7c47c1ca76ef94f78e513414a842e949e607256 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 17 Apr 2021 13:49:40 +0200 Subject: [PATCH 022/136] Increase mob_view_range_factor performance --- mods/ENTITIES/mcl_mobs/api.lua | 3 +- mods/ITEMS/mcl_armor/api.lua | 56 +++++++++------------------------ mods/ITEMS/mcl_armor/init.lua | 3 +- mods/ITEMS/mcl_armor/player.lua | 9 +++++- 4 files changed, 27 insertions(+), 44 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 87aff0d76..d5caee66f 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -177,7 +177,8 @@ local function object_in_range(self, object) local factor -- Apply view range reduction for special player armor if object:is_player() and mod_armor then - factor = mcl_armor.get_mob_view_range_factor(object, self.name) + local factors = mcl_armor.player_view_range_factors[object] + factor = factors and factors[self.name] end -- Distance check local dist diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua index a5d1ac0e5..9f9384c6d 100644 --- a/mods/ITEMS/mcl_armor/api.lua +++ b/mods/ITEMS/mcl_armor/api.lua @@ -160,48 +160,8 @@ function mcl_armor.register_protection_enchantment(def) } end -function mcl_armor.get_armor_points(obj) - local points = 0 - local inv = mcl_util.get_inventory(obj) - if inv then - for i = 2, 5 do - local itemstack = inv:get_stack("armor", i) - if not itemstack:is_empty() then - points = points + minetest.get_item_group(itemstack:get_name(), "mcl_armor_points") - end - end - end - return points -end - --- Returns a change factor for a mob's view_range for the given object --- or nil, if there's no change. Certain armors (like mob heads) can --- affect the view range of mobs. -function mcl_armor.get_mob_view_range_factor(obj, mob) - local inv = mcl_util.get_inventory(obj) - local factor - if inv then - for i = 2, 5 do - local itemstack = inv:get_stack("armor", i) - if not itemstack:is_empty() then - local def = itemstack:get_definition() - if def._mcl_armor_mob_range_mob == mob then - if not factor then - factor = def._mcl_armor_mob_range_factor - elseif factor == 0 then - return 0 - else - factor = factor * def._mcl_armor_mob_range_factor - end - end - end - end - end - return factor -end - function mcl_armor.update(obj) - local info = {points = 0} + local info = {points = 0, view_range_factors = {}} local inv = mcl_util.get_inventory(obj) @@ -226,6 +186,20 @@ function mcl_armor.update(obj) end info.points = info.points + minetest.get_item_group(itemname, "mcl_armor_points") + + local mob_range_mob = def._mcl_armor_mob_range_mob + + if mob_range_mob then + local factor = info.view_range_factors[mob_range_mob] + + if factor then + if factor > 0 then + info.view_range_factors[mob_range_mob] = factor * def._mcl_armor_mob_range_factor + end + else + info.view_range_factors[mob_range_mob] = def._mcl_armor_mob_range_factor + end + end end end end diff --git a/mods/ITEMS/mcl_armor/init.lua b/mods/ITEMS/mcl_armor/init.lua index cc8fb2d32..0f7725010 100644 --- a/mods/ITEMS/mcl_armor/init.lua +++ b/mods/ITEMS/mcl_armor/init.lua @@ -55,7 +55,8 @@ mcl_armor = { } end, } - } + }, + player_view_range_factors = {}, } local modpath = minetest.get_modpath("mcl_armor") diff --git a/mods/ITEMS/mcl_armor/player.lua b/mods/ITEMS/mcl_armor/player.lua index 651f8f776..50828fcea 100644 --- a/mods/ITEMS/mcl_armor/player.lua +++ b/mods/ITEMS/mcl_armor/player.lua @@ -61,7 +61,10 @@ mcl_player.player_register_model("mcl_armor_character_female.b3d", { function mcl_armor.update_player(player, info) mcl_player.player_set_armor(player, info.texture, info.preview) - player:get_meta():set_int("mcl_armor:armor_points", info.points) + local meta = player:get_meta() + meta:set_int("mcl_armor:armor_points", info.points) + + mcl_armor.player_view_range_factors[player] = view_range_factors end local function is_armor_action(inventory_info) @@ -149,6 +152,10 @@ minetest.register_on_joinplayer(function(player) end) end) +minetest.register_on_leaveplayer(function(player) + mcl_armor.player_view_range_factors[player] = nil +end) + mcl_damage.register_modifier(function(player, hp_change, _, reason) return mcl_armor.damage_modifier(player, hp_change, reason) end) From 6bbea11fb83370db2af459caf2bb57e130982efd Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 17 Apr 2021 13:53:41 +0200 Subject: [PATCH 023/136] Fix crash with mcl_heads --- mods/ITEMS/mcl_heads/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_heads/init.lua b/mods/ITEMS/mcl_heads/init.lua index d6ae3dca9..cd8d71faa 100644 --- a/mods/ITEMS/mcl_heads/init.lua +++ b/mods/ITEMS/mcl_heads/init.lua @@ -90,7 +90,7 @@ local function addhead(name, texture, desc, longdesc, rangemob, rangefactor) local wdir = minetest.dir_to_wallmounted(diff) local itemstring = itemstack:get_name() - --local fakestack = ItemStack(itemstack) + local fakestack = ItemStack(itemstack) local idef = fakestack:get_definition() local retval if wdir == 0 or wdir == 1 then From 06699c2cc4b62a0bde7c4d8c1bd09e48c6c85323 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sat, 17 Apr 2021 11:55:50 +0000 Subject: [PATCH 024/136] Fix that an ax wears out if you right-click another block --- mods/ITEMS/mcl_tools/init.lua | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index fa5352c2c..3aebafb7b 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -352,7 +352,14 @@ minetest.register_tool("mcl_tools:shovel_diamond", { }) -- Axes - +local make_stripped_trunk_add_wear = function(itemstack, placer) + if not minetest.is_creative_enabled(placer:get_player_name()) then + -- Add wear (as if digging a axey node) + local toolname = itemstack:get_name() + local wear = mcl_autogroup.get_wear(toolname, "axey") + itemstack:add_wear(wear) + end +end local make_stripped_trunk = function(itemstack, placer, pointed_thing) if pointed_thing.type == "node" then local pos = minetest.get_pointed_thing_position(pointed_thing) @@ -367,36 +374,42 @@ local make_stripped_trunk = function(itemstack, placer, pointed_thing) minetest.record_protection_violation(pointed_thing.under, placer:get_player_name()) return itemstack end - if not minetest.is_creative_enabled(placer:get_player_name()) then - -- Add wear (as if digging a axey node) - local toolname = itemstack:get_name() - local wear = mcl_autogroup.get_wear(toolname, "axey") - itemstack:add_wear(wear) - end if node_name == "mcl_core:tree" then minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_oak"}) + make_stripped_trunk_add_wear(itemstack, placer) elseif node_name == "mcl_core:darktree" then minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_dark_oak"}) + make_stripped_trunk_add_wear(itemstack, placer) elseif node_name == "mcl_core:acaciatree" then minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_acacia"}) + make_stripped_trunk_add_wear(itemstack, placer) elseif node_name == "mcl_core:birchtree" then minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_birch"}) + make_stripped_trunk_add_wear(itemstack, placer) elseif node_name == "mcl_core:sprucetree" then minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_spruce"}) + make_stripped_trunk_add_wear(itemstack, placer) elseif node_name == "mcl_core:jungletree" then minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_jungle"}) + make_stripped_trunk_add_wear(itemstack, placer) elseif node_name == "mcl_core:tree_bark" then minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_oak_bark"}) + make_stripped_trunk_add_wear(itemstack, placer) elseif node_name == "mcl_core:darktree_bark" then minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_dark_oak_bark"}) + make_stripped_trunk_add_wear(itemstack, placer) elseif node_name == "mcl_core:acaciatree_bark" then minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_acacia_bark"}) + make_stripped_trunk_add_wear(itemstack, placer) elseif node_name == "mcl_core:birchtree_bark" then minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_birch_bark"}) + make_stripped_trunk_add_wear(itemstack, placer) elseif node_name == "mcl_core:sprucetree_bark" then minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_spruce_bark"}) + make_stripped_trunk_add_wear(itemstack, placer) elseif node_name == "mcl_core:jungletree_bark" then minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_jungle_bark"}) + make_stripped_trunk_add_wear(itemstack, placer) end end return itemstack From 6724a8d0ed493914c8f406fb8e6463a7609789b2 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 17 Apr 2021 13:59:46 +0200 Subject: [PATCH 025/136] Fix crash in damage handler --- 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 43d39869d..e6d13dfa7 100644 --- a/mods/ITEMS/mcl_armor/damage.lua +++ b/mods/ITEMS/mcl_armor/damage.lua @@ -60,7 +60,7 @@ function mcl_armor.damage_modifier(obj, hp_change, reason) end end - if reason.source and enchantments.thorns > 0 then + if reason.source and enchantments.thorns and enchantments.thorns > 0 then local do_irregular_damage = enchantments.thorns > 10 if do_irregular_damage or thorns_damage_regular < 4 and math.random() < enchantments.thorns * 0.15 then From 8e37b51cac861b87db3dc52ea2143575bd306e1a Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 17 Apr 2021 14:07:47 +0200 Subject: [PATCH 026/136] Equip mob heads with rightclick --- mods/ITEMS/mcl_heads/init.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_heads/init.lua b/mods/ITEMS/mcl_heads/init.lua index cd8d71faa..ec6a5638e 100644 --- a/mods/ITEMS/mcl_heads/init.lua +++ b/mods/ITEMS/mcl_heads/init.lua @@ -42,7 +42,7 @@ local function addhead(name, texture, desc, longdesc, rangemob, rangefactor) { -0.25, -0.5, -0.25, 0.25, 0.0, 0.25, }, }, }, - groups = {handy=1, armor_head=1,non_combat_armor=1, head=1, deco_block=1, dig_by_piston=1 }, + groups = {handy = 1, armor = 1, armor_head = 1, non_combat_armor = 1, non_combat_armor_head = 1, head = 1, deco_block = 1, dig_by_piston = 1}, -- The head textures are based off the textures of an actual mob. tiles = { -- Note: bottom texture is overlaid over top texture to get rid of possible transparency. @@ -111,6 +111,7 @@ local function addhead(name, texture, desc, longdesc, rangemob, rangefactor) _mcl_armor_mob_range_mob = rangemob, _mcl_armor_mob_range_factor = rangefactor, + _mcl_armor_element = "head", _mcl_blast_resistance = 1, _mcl_hardness = 1, }) From 5c928575f87980c20a0403033acae373d3ef7857 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 17 Apr 2021 18:15:45 +0200 Subject: [PATCH 027/136] Fix #1572, server crash during login --- mods/PLAYER/mcl_playerplus/init.lua | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 8dad7b2c5..b14d34824 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -183,10 +183,11 @@ minetest.register_globalstep(function(dtime) player_vel_yaw = limit_vel_yaw(player_vel_yaw, yaw) player_vel_yaws[name] = player_vel_yaw - if minetest.get_node_or_nil({x=player:get_pos().x, y=player:get_pos().y - 0.5, z=player:get_pos().z}) then - node_stand_return = minetest.get_node_or_nil({x=player:get_pos().x, y=player:get_pos().y - 0.1, z=player:get_pos().z}).name - else - minetest.log("action", "somehow player got of loaded areas") + local pos = player:get_pos() + local node = minetest.get_node_or_nil({x = pos.x, y = pos.y - 0.5, z = pos.z}) + + if node then + node_stand_return = node.name end local chestplate = player:get_inventory():get_stack("armor", 3) From bbd115fde011b258f17b201221bc0760175289af Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 17 Apr 2021 18:39:38 +0200 Subject: [PATCH 028/136] Update armor stand --- mods/ITEMS/mcl_armor_stand/init.lua | 44 ++++++++--------------------- 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/mods/ITEMS/mcl_armor_stand/init.lua b/mods/ITEMS/mcl_armor_stand/init.lua index 5dc427231..9a5a6d050 100644 --- a/mods/ITEMS/mcl_armor_stand/init.lua +++ b/mods/ITEMS/mcl_armor_stand/init.lua @@ -21,8 +21,8 @@ local function get_stand_object(pos) return object end -local function update_entity(pos) - local node = minetest.get_node(pos) +local function update_entity(pos, node) + local node = node or minetest.get_node(pos) local object = get_stand_object(pos) if object then if not string.find(node.name, "mcl_armor_stand:") then @@ -33,31 +33,7 @@ local function update_entity(pos) object = minetest.add_entity(pos, "mcl_armor_stand:armor_entity") end if object then - local texture = "blank.png" - local textures = {} - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() local yaw = 0 - if inv then - for _, element in pairs(elements) do - local stack = inv:get_stack("armor_"..element, 1) - if stack:get_count() == 1 then - local item = stack:get_name() or "" - if minetest.registered_aliases[item] then - item = minetest.registered_aliases[item] - end - local def = stack:get_definition() or {} - local groups = def.groups or {} - if groups["armor_"..element] then - local texture = def.texture or item:gsub("%:", "_") - table.insert(textures, texture..".png") - end - end - end - end - if #textures > 0 then - texture = table.concat(textures, "^") - end if node.param2 then local rot = node.param2 % 4 if rot == 1 then @@ -69,7 +45,7 @@ local function update_entity(pos) end end object:set_yaw(yaw) - object:set_properties({textures={texture}}) + mcl_armor.update(object) end end @@ -257,13 +233,15 @@ minetest.register_entity("mcl_armor_stand:armor_entity", { textures = {"blank.png"}, pos = nil, timer = 0, - on_activate = function(self) - local pos = self.object:get_pos() + on_activate = function(self, staticdata) self.object:set_armor_groups({immortal=1}) - if pos then - self.pos = vector.round(pos) - update_entity(pos) - end + local pos = self.object:get_pos() + self.pos = vector.round(pos) + self.inventory = minetest.get_meta(pos):get_inventory() + update_entity(pos) + end, + update_armor = function(self, info) + self.object:set_properties({textures = {info.texture}}) end, on_step = function(self, dtime) if not self.pos then From f8b54db3929206b4c826533aad035f1c71cc7b89 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 17 Apr 2021 18:55:56 +0200 Subject: [PATCH 029/136] Fix controls.register_on_press being called for every player in a globalstep --- mods/PLAYER/mcl_playerplus/init.lua | 51 +++++++++++++---------------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index b14d34824..65c585f52 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -199,22 +199,7 @@ minetest.register_globalstep(function(dtime) end end - - controls.register_on_press(function(player, key) - if key~="jump" and key~="RMB" then return end - if key=="jump" then - if player:get_inventory():get_stack("armor", 3):get_name() == "mcl_armor:elytra" and player_velocity.y < -6 and elytra[player] ~= true then - elytra[player] = true - elseif key=="RMB" then - if wielded:get_name() == "mcl_tools:rocket" then - wielded:take_item() - player:set_wielded_item(wielded) - end - end - end - end) - - if elytra[player] == true and node_stand_return ~= "air" or elytra[player] == true and player:get_inventory():get_stack("armor", 3):get_name() ~= "mcl_armor:elytra" or player:get_attach() ~= nil then + if elytra[player] == true and ~= nil then elytra[player] = false end --[[ @@ -224,21 +209,29 @@ minetest.register_globalstep(function(dtime) elytra[player] = false end]] - if elytra[player] == true then - mcl_player.player_set_animation(player, "fly") - playerphysics.add_physics_factor(player, "gravity", "mcl_playerplus:elytra", 0.1) - if player_velocity.y < -1.5 then - player:add_velocity({x=0, y=0.17, z=0}) - end - if math.abs(player_velocity.x) + math.abs(player_velocity.z) < 20 then - local dir = minetest.yaw_to_dir(player:get_look_horizontal()) - if degrees(player:get_look_vertical()) * -.01 < .1 then - look_pitch = degrees(player:get_look_vertical()) * -.01 - else - look_pitch = .1 + local wearing_elytra = player:get_inventory():get_stack("armor", 3):get_name() == "mcl_armor:elytra" + + if elytra[player] then + if node_stand_return ~= "air" or not wearing_elytra or player:get_attach() then + elytra[player] = false + else + mcl_player.player_set_animation(player, "fly") + playerphysics.add_physics_factor(player, "gravity", "mcl_playerplus:elytra", 0.1) + if player_velocity.y < -1.5 then + player:add_velocity({x=0, y=0.17, z=0}) + end + if math.abs(player_velocity.x) + math.abs(player_velocity.z) < 20 then + local dir = minetest.yaw_to_dir(player:get_look_horizontal()) + if degrees(player:get_look_vertical()) * -.01 < .1 then + look_pitch = degrees(player:get_look_vertical()) * -.01 + else + look_pitch = .1 + end + player:add_velocity({x=dir.x, y=look_pitch, z=dir.z}) end - player:add_velocity({x=dir.x, y=look_pitch, z=dir.z}) end + elseif wearing_elytra and player_velocity.y < -6 and controls.jump then + elytra[player] = true else playerphysics.remove_physics_factor(player, "gravity", "mcl_playerplus:elytra") end From 205572cc693cde98fc7f3bed890d61f449627ee5 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 17 Apr 2021 19:34:23 +0200 Subject: [PATCH 030/136] Fix elytra code style --- mods/ITEMS/mcl_fireworks/register.lua | 85 +++++++-------------------- mods/PLAYER/mcl_playerplus/init.lua | 83 +++++++++++--------------- 2 files changed, 57 insertions(+), 111 deletions(-) diff --git a/mods/ITEMS/mcl_fireworks/register.lua b/mods/ITEMS/mcl_fireworks/register.lua index cce36042a..08f07c5cb 100644 --- a/mods/ITEMS/mcl_fireworks/register.lua +++ b/mods/ITEMS/mcl_fireworks/register.lua @@ -1,69 +1,28 @@ local S = minetest.get_translator("mcl_fireworks") -player_rocketing = {} +local player_rocketing = {} -local help = S("Flight Duration:") +local tt_help = S("Flight Duration:") local description = S("Firework Rocket") -local rocket_sound = function() - minetest.sound_play("mcl_fireworks_rocket") + +local function register_rocket(n, duration, force) + minetest.register_craftitem("mcl_fireworks:rocket_" .. n, { + description = description, + _tt_help = tt_help .. " " .. duration, + inventory_image = "mcl_fireworks_rocket.png", + stack_max = 64, + on_use = function(itemstack, user, pointed_thing) + local elytra = mcl_playerplus.elytra[user] + if elytra.active and elytra.rocketing <= 0 then + elytra.rocketing = duration + itemstack:take_item() + minetest.sound_play("mcl_fireworks_rocket", {pos = user:get_pos()}) + end + return itemstack + end, + }) end -minetest.register_craftitem("mcl_fireworks:rocket_1", { - description = description, - _tt_help = help.." 1", - inventory_image = "mcl_fireworks_rocket.png", - stack_max = 64, - on_use = function(itemstack, user, pointed_thing) - local torso = user:get_inventory():get_stack("armor", 3) - if torso and torso:get_name() == "mcl_armor:elytra" and player_rocketing[user] ~= true then - player_rocketing[user] = true - minetest.after(2.2, function() - player_rocketing[user] = false - end) - itemstack:take_item() - --user:add_player_velocity(vector.multiply(user:get_look_dir(), 20)) - rocket_sound() - end - return itemstack - end, -}) - -minetest.register_craftitem("mcl_fireworks:rocket_2", { - description = description, - _tt_help = help.." 2", - inventory_image = "mcl_fireworks_rocket.png", - stack_max = 64, - on_use = function(itemstack, user, pointed_thing) - local torso = user:get_inventory():get_stack("armor", 3) - if torso and torso:get_name() == "mcl_armor:elytra" and player_rocketing[user] ~= true then - player_rocketing[user] = true - minetest.after(4.5, function() - player_rocketing[user] = false - end) - itemstack:take_item() - --user:add_player_velocity(vector.multiply(user:get_look_dir(), 20)) - rocket_sound() - end - return itemstack - end, -}) - -minetest.register_craftitem("mcl_fireworks:rocket_3", { - description = description, - _tt_help = help.." 3", - inventory_image = "mcl_fireworks_rocket.png", - stack_max = 64, - on_use = function(itemstack, user, pointed_thing) - local torso = user:get_inventory():get_stack("armor", 3) - if torso and torso:get_name() == "mcl_armor:elytra" and player_rocketing[user] ~= true then - player_rocketing[user] = true - minetest.after(6, function() - player_rocketing[user] = false - end) - itemstack:take_item() - --user:add_player_velocity(vector.multiply(user:get_look_dir(), 20)) - rocket_sound() - end - return itemstack - end, -}) +register_rocket(1, 2.2, 10) +register_rocket(2, 4.5, 20) +register_rocket(3, 6, 30) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 65c585f52..38844a1e1 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -1,8 +1,9 @@ local S = minetest.get_translator("mcl_playerplus") -elytra = {} +mcl_playerplus = { + elytra = {}, +} -local node_stand_return = ":air" local get_connected_players = minetest.get_connected_players local dir_to_yaw = minetest.dir_to_yaw local get_item_group = minetest.get_item_group @@ -183,56 +184,40 @@ minetest.register_globalstep(function(dtime) player_vel_yaw = limit_vel_yaw(player_vel_yaw, yaw) player_vel_yaws[name] = player_vel_yaw - local pos = player:get_pos() - local node = minetest.get_node_or_nil({x = pos.x, y = pos.y - 0.5, z = pos.z}) + local fly_pos = player:get_pos() + local fly_node = minetest.get_node({x = fly_pos.x, y = fly_pos.y - 0.5, z = fly_pos.z}).name + local elytra = mcl_playerplus.elytra[player] - if node then - node_stand_return = node.name - end + elytra.active = player:get_inventory():get_stack("armor", 3):get_name() == "mcl_armor:elytra" + and not player:get_attach() + and (elytra.active or control.jump and player_velocity.y < -6) + and (fly_node == "air" or fly_node == "ignore") - local chestplate = player:get_inventory():get_stack("armor", 3) - - if player_rocketing[player] and player_rocketing[player] == true and chestplate:get_name() == "mcl_armor:elytra" then - if math.abs(player_velocity.x) + math.abs(player_velocity.y) + math.abs(player_velocity.z) < 40 then - player:add_player_velocity(vector.multiply(player:get_look_dir(), 4)) - elytra[player] = true + if elytra.active then + mcl_player.player_set_animation(player, "fly") + if player_velocity.y < -1.5 then + player:add_velocity({x=0, y=0.17, z=0}) end - end - - if elytra[player] == true and ~= nil then - elytra[player] = false - end ---[[ - if player:get_inventory():get_stack("armor", 3):get_name() == "mcl_armor:elytra" and player_velocity.y < -6 and elytra[player] ~= true and is_sprinting(name) then - elytra[player] = true - elseif elytra[player] == true and node_stand_return ~= "air" or elytra[player] == true and player:get_inventory():get_stack("armor", 3):get_name() ~= "mcl_armor:elytra" or player:get_attach() ~= nil then - elytra[player] = false - end]] - - local wearing_elytra = player:get_inventory():get_stack("armor", 3):get_name() == "mcl_armor:elytra" - - if elytra[player] then - if node_stand_return ~= "air" or not wearing_elytra or player:get_attach() then - elytra[player] = false - else - mcl_player.player_set_animation(player, "fly") - playerphysics.add_physics_factor(player, "gravity", "mcl_playerplus:elytra", 0.1) - if player_velocity.y < -1.5 then - player:add_velocity({x=0, y=0.17, z=0}) + if math.abs(player_velocity.x) + math.abs(player_velocity.z) < 20 then + local dir = minetest.yaw_to_dir(player:get_look_horizontal()) + if degrees(player:get_look_vertical()) * -.01 < .1 then + look_pitch = degrees(player:get_look_vertical()) * -.01 + else + look_pitch = .1 end - if math.abs(player_velocity.x) + math.abs(player_velocity.z) < 20 then - local dir = minetest.yaw_to_dir(player:get_look_horizontal()) - if degrees(player:get_look_vertical()) * -.01 < .1 then - look_pitch = degrees(player:get_look_vertical()) * -.01 - else - look_pitch = .1 - end - player:add_velocity({x=dir.x, y=look_pitch, z=dir.z}) + player:add_velocity({x=dir.x, y=look_pitch, z=dir.z}) + end + playerphysics.add_physics_factor(player, "gravity", "mcl_playerplus:elytra", 0.1) + + if elytra.rocketing > 0 then + elytra.rocketing = elytra.rocketing - dtime + if vector.length(player_velocity) < 40 then + local add_velocity = player.add_velocity or player.add_player_velocity + add_velocity(player, vector.multiply(player:get_look_dir(), 4)) end end - elseif wearing_elytra and player_velocity.y < -6 and controls.jump then - elytra[player] = true else + elytra.rocketing = 0 playerphysics.remove_physics_factor(player, "gravity", "mcl_playerplus:elytra") end @@ -254,12 +239,12 @@ minetest.register_globalstep(function(dtime) player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(0,0,0)) end - if elytra[player] == true then - -- set head pitch and yaw when swimming + if elytra.active then + -- set head pitch and yaw when flying player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch+90-degrees(dir_to_pitch(player_velocity)),player_vel_yaw - yaw,0)) -- sets eye height, and nametag color accordingly player:set_properties({collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 0.5, nametag_color = { r = 225, b = 225, a = 0, g = 225 }}) - -- control body bone when swimming + -- control body bone when flying player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(degrees(dir_to_pitch(player_velocity)) - 90,-player_vel_yaw + yaw + 180,0)) elseif parent then local parent_yaw = degrees(parent:get_yaw()) @@ -523,6 +508,7 @@ minetest.register_on_joinplayer(function(player) swimDistance = 0, jump_cooldown = -1, -- Cooldown timer for jumping, we need this to prevent the jump exhaustion to increase rapidly } + mcl_playerplus.elytra[player] = {active = false, rocketing = 0} end) -- clear when player leaves @@ -530,4 +516,5 @@ minetest.register_on_leaveplayer(function(player) local name = player:get_player_name() mcl_playerplus_internal[name] = nil + mcl_playerplus.elytra[player] = nil end) From baebe3c2d2b80122ff4c413711213d7c3d19b5c9 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 17 Apr 2021 20:55:08 +0200 Subject: [PATCH 031/136] Fix namtags being invisible --- mods/PLAYER/mcl_playerplus/init.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 38844a1e1..360f4fe5d 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -243,12 +243,12 @@ minetest.register_globalstep(function(dtime) -- set head pitch and yaw when flying player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch+90-degrees(dir_to_pitch(player_velocity)),player_vel_yaw - yaw,0)) -- sets eye height, and nametag color accordingly - player:set_properties({collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 0.5, nametag_color = { r = 225, b = 225, a = 0, g = 225 }}) + player:set_properties({collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 0.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) -- control body bone when flying player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(degrees(dir_to_pitch(player_velocity)) - 90,-player_vel_yaw + yaw + 180,0)) elseif parent then local parent_yaw = degrees(parent:get_yaw()) - player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.5, nametag_color = { r = 225, b = 225, a = 0, g = 225 }}) + player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch, -limit_vel_yaw(yaw, parent_yaw) + parent_yaw, 0)) player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(0,0,0)) elseif control.sneak then @@ -262,12 +262,12 @@ minetest.register_globalstep(function(dtime) -- set head pitch and yaw when swimming player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch+90-degrees(dir_to_pitch(player_velocity)),player_vel_yaw - yaw,0)) -- sets eye height, and nametag color accordingly - player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,0.8,0.312}, eye_height = 0.5, nametag_color = { r = 225, b = 225, a = 0, g = 225 }}) + player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,0.8,0.312}, eye_height = 0.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) -- control body bone when swimming player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(degrees(dir_to_pitch(player_velocity)) - 90,-player_vel_yaw + yaw + 180,0)) else -- sets eye height, and nametag color accordingly - player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.5, nametag_color = { r = 225, b = 225, a = 0, g = 225 }}) + player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch, player_vel_yaw - yaw, 0)) player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(0, -player_vel_yaw + yaw, 0)) From bcd058feb1c1cd4bd24086a99838d3aa8cce8526 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 17 Apr 2021 21:00:32 +0200 Subject: [PATCH 032/136] Fix get_light crash --- mods/ENTITIES/mcl_mobs/api.lua | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 9182b11c6..1b5715b2a 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -1029,6 +1029,14 @@ local node_ok = function(pos, fallback) return minetest.registered_nodes[fallback] end +local function get_light(pos) + if math.abs(pos.x) < 31000 and math.abs(pos.y) < 31000 and math.abs(pos.z) < 31000 then + local lightfunc = minetest.get_natural_light or minetest.get_node_light + return lightfunc(pos) + else + return 0 + end +end -- environmental damage (water, lava, fire, light etc.) local do_env_damage = function(self) @@ -1074,7 +1082,6 @@ local do_env_damage = function(self) -- Use get_node_light for Minetest version 5.3 where get_natural_light -- does not exist yet. - local get_light = minetest.get_natural_light or minetest.get_node_light local sunlight = get_light(pos, self.time_of_day) -- bright light harms mob From a7e102426a49bf1c60381621e65cdaa9e87bb6d5 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 17 Apr 2021 21:01:09 +0200 Subject: [PATCH 033/136] Add time_of_day to get_light crash fix --- mods/ENTITIES/mcl_mobs/api.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 1b5715b2a..8aed37288 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -1029,10 +1029,10 @@ local node_ok = function(pos, fallback) return minetest.registered_nodes[fallback] end -local function get_light(pos) +local function get_light(pos, tod) if math.abs(pos.x) < 31000 and math.abs(pos.y) < 31000 and math.abs(pos.z) < 31000 then local lightfunc = minetest.get_natural_light or minetest.get_node_light - return lightfunc(pos) + return lightfunc(pos, tod) else return 0 end From f967aa3d51c2784ab1ff30a5bb5badd3e6ae5756 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 18 Apr 2021 00:10:11 +0200 Subject: [PATCH 034/136] remove unuseful code --- mods/PLAYER/mcl_spawn/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/PLAYER/mcl_spawn/init.lua b/mods/PLAYER/mcl_spawn/init.lua index 441db28b7..b8c746d1f 100644 --- a/mods/PLAYER/mcl_spawn/init.lua +++ b/mods/PLAYER/mcl_spawn/init.lua @@ -397,9 +397,9 @@ end -- false otherwise. mcl_spawn.get_bed_spawn_pos = function(player) local spawn, custom_spawn = nil, false - if player ~= nil and player:is_player() then + if player and player:is_player() then local attr = player:get_meta():get_string("mcl_beds:spawn") - if attr ~= nil and attr ~= "" then + if attr and attr ~= "" then spawn = minetest.string_to_pos(attr) custom_spawn = true end From 4aa6421faf1bd3dabfaa53454ad06fbd21f596ec Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 18 Apr 2021 00:27:51 +0200 Subject: [PATCH 035/136] performance optimisation --- mods/ITEMS/mcl_beds/functions.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 86f6a6852..545b03be7 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -6,6 +6,8 @@ local player_in_bed = 0 local is_sp = minetest.is_singleplayer() local weather_mod = minetest.get_modpath("mcl_weather") ~= nil local explosions_mod = minetest.get_modpath("mcl_explosions") ~= nil +local spawn_mod = minetest.get_modpath("mcl_spawn") +local worlds_mod = minetest.get_modpath("mcl_worlds") -- Helper functions @@ -76,7 +78,7 @@ local function lay_down(player, pos, bed_pos, state, skip) bed_center = {x = bed_pos.x - dir.x/2, y = bed_pos.y + 0.1, z = bed_pos.z - dir.z/2} -- save respawn position when entering bed - if minetest.get_modpath("mcl_spawn") and mcl_spawn.set_spawn_pos(player, bed_pos, false) then + if spawn_mod and mcl_spawn.set_spawn_pos(player, bed_pos, nil) then minetest.chat_send_player(name, S("New respawn position set!")) end @@ -297,7 +299,7 @@ function mcl_beds.on_rightclick(pos, player, is_top) if player:get_meta():get_string("mcl_beds:sleeping") == "true" then return end - if minetest.get_modpath("mcl_worlds") then + if worlds_mod then local dim = mcl_worlds.pos_to_dimension(pos) if dim == "nether" or dim == "end" then -- Bed goes BOOM in the Nether or End. From 11b66e83a26fa22ceb580d33ddfc5285faaa5dd3 Mon Sep 17 00:00:00 2001 From: kay27 Date: Sun, 18 Apr 2021 04:28:14 +0400 Subject: [PATCH 036/136] [mcl_portals] Better NP search, no more teleports on the roof, fix https://git.minetest.land/MineClone2/MineClone2/issues/1560 --- mods/ITEMS/mcl_portals/portal_nether.lua | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index 1d9fe2efb..a121f719c 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -27,9 +27,8 @@ local DELAY = 3 -- seconds before teleporting in Nether portal in Survival mo local DISTANCE_MAX = 128 local PORTAL = "mcl_portals:portal" local OBSIDIAN = "mcl_core:obsidian" -local O_Y_MIN, O_Y_MAX = max(mcl_vars.mg_overworld_min, -31), min(mcl_vars.mg_overworld_max_official, 2048) -local N_Y_MIN, N_Y_MAX = mcl_vars.mg_bedrock_nether_bottom_min, mcl_vars.mg_bedrock_nether_top_max - H_MIN -local O_DY, N_DY = O_Y_MAX - O_Y_MIN + 1, N_Y_MAX - N_Y_MIN + 1 +local O_Y_MIN, O_Y_MAX = max(mcl_vars.mg_overworld_min, -31), min(mcl_vars.mg_overworld_max, 2048) +local N_Y_MIN, N_Y_MAX = mcl_vars.mg_bedrock_nether_bottom_min, mcl_vars.mg_bedrock_nether_top_min - H_MIN -- Alpha and particles local node_particles_allowed = minetest.settings:get("mcl_node_particles") or "none" @@ -78,6 +77,8 @@ local pos_to_string = minetest.pos_to_string local is_area_protected = minetest.is_area_protected local get_us_time = minetest.get_us_time +local dimension_to_teleport = { nether = "overworld", overworld = "nether" } + local limits = { nether = { pmin = {x=LIM_MIN, y = N_Y_MIN, z = LIM_MIN}, @@ -181,10 +182,10 @@ local function get_target(p) x, o1 = ping_pong(x, TRAVEL_X, LIM_MIN, LIM_MAX) z, o2 = ping_pong(z, TRAVEL_Z, LIM_MIN, LIM_MAX) y = floor(y * TRAVEL_Y + (o1+o2) / 16 * LIM_MAX) - y = min(max(y + mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_min), mcl_vars.mg_overworld_max) + y = min(max(y + O_Y_MIN, O_Y_MIN), O_Y_MAX) elseif d=="overworld" then x, y, z = floor(x / TRAVEL_X + 0.5), floor(y / TRAVEL_Y + 0.5), floor(z / TRAVEL_Z + 0.5) - y = min(max(y + mcl_vars.mg_nether_min, mcl_vars.mg_nether_min), mcl_vars.mg_nether_max) + y = min(max(y + N_Y_MIN, N_Y_MIN), N_Y_MAX) end return {x=x, y=y, z=z}, d end @@ -457,8 +458,8 @@ local function ecb_scan_area_2(blockpos, action, calls_remaining, param) local nodes = find_nodes_in_area_under_air(pos1, pos2, {"group:building_block"}) if nodes then local nc = #nodes + log("action", "[mcl_portals] Area for destination Nether portal emerged! Found " .. tostring(nc) .. " nodes under the air around "..pos_to_string(pos)) if nc > 0 then - log("action", "[mcl_portals] Area for destination Nether portal emerged! Found " .. tostring(nc) .. " nodes under the air around "..pos_to_string(pos)) for i=1,nc do local node = nodes[i] local node1 = {x=node.x, y=node.y+1, z=node.z } @@ -474,7 +475,7 @@ local function ecb_scan_area_2(blockpos, action, calls_remaining, param) return end if not distance or (distance0 < distance) or (distance0 < distance-1 and node.y > lava and pos0.y < lava) then - log("action", "[mcl_portals] found distance "..tostring(distance0).." at pos "..pos_to_string(node)) + log("verbose", "[mcl_portals] found distance "..tostring(distance0).." at pos "..pos_to_string(node)) distance = distance0 pos0 = {x=node1.x, y=node1.y, z=node1.z} end @@ -626,7 +627,7 @@ end -- Pos can be any of the inner part. -- The frame MUST be filled only with air or any fire, which will be replaced with Nether portal blocks. -- If no Nether portal can be lit, nothing happens. --- Returns number of portals created (0, 1 or 2) +-- Returns true if portal created function mcl_portals.light_nether_portal(pos) -- Only allow to make portals in Overworld and Nether local dim = mcl_worlds.pos_to_dimension(pos) @@ -636,11 +637,6 @@ function mcl_portals.light_nether_portal(pos) local orientation = random(0, 1) for orientation_iteration = 1, 2 do if check_and_light_shape(pos, orientation) then - minetest.after(0.2, function(pos) -- generate target map chunk - local pos1 = add(mul(mcl_vars.pos_to_chunk(pos), mcl_vars.chunk_size_in_nodes), mcl_vars.central_chunk_offset_in_nodes) - local pos2 = add(pos1, mcl_vars.chunk_size_in_nodes - 1) - minetest.emerge_area(pos1, pos2) - end, vector.new(pos)) return true end orientation = 1 - orientation @@ -672,6 +668,7 @@ local function teleport_no_delay(obj, pos) if exit then finalize_teleport(obj, exit) else + dim = dimension_to_teleport[dim] -- need to create arrival portal create_portal(target, limits[dim].pmin, limits[dim].pmax, name, obj) end From dd69dcfd9f5fe5c8e481e275536f130853fc9e88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20=C3=85str=C3=B6m?= Date: Sat, 17 Apr 2021 23:03:57 +0200 Subject: [PATCH 037/136] Fix efficiency and unbreaking not working together This commit fixes an issue were tools enchanted with both efficiency and unbreaking would loose the effect of one of the enchantments in some conditions. --- mods/ITEMS/mcl_enchanting/enchantments.lua | 6 +++--- mods/ITEMS/mcl_enchanting/engine.lua | 1 + mods/ITEMS/mcl_enchanting/groupcaps.lua | 12 ++++++++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index ca936c319..df6105d52 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -771,11 +771,11 @@ mcl_enchanting.enchantments.unbreaking = { curse = false, on_enchant = function(itemstack, level) local tool_capabilities = itemstack:get_tool_capabilities() - for group, capability in pairs(tool_capabilities.groupcaps) do - capability.uses = capability.uses * (1 + level) - end tool_capabilities.punch_attack_uses = tool_capabilities.punch_attack_uses * (1 + level) itemstack:get_meta():set_tool_capabilities(tool_capabilities) + + -- Unbreaking for groupcaps is handled in this function. + mcl_enchanting.update_groupcaps(itemstack) end, requires_tool = true, treasure = false, diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index ea69d1868..30e4a9a86 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -17,6 +17,7 @@ function mcl_enchanting.unload_enchantments(itemstack) local meta = itemstack:get_meta() if meta:get_string("name") == "" then meta:set_string("description", "") + meta:set_string("groupcaps_hash", "") end end diff --git a/mods/ITEMS/mcl_enchanting/groupcaps.lua b/mods/ITEMS/mcl_enchanting/groupcaps.lua index 375029547..1a4f8fd14 100644 --- a/mods/ITEMS/mcl_enchanting/groupcaps.lua +++ b/mods/ITEMS/mcl_enchanting/groupcaps.lua @@ -50,13 +50,21 @@ function mcl_enchanting.update_groupcaps(itemstack) end local name = itemstack:get_name() - local level = mcl_enchanting.get_enchantment(itemstack, "efficiency") - local groupcaps = get_efficiency_groupcaps(name, level) + local efficiency = mcl_enchanting.get_enchantment(itemstack, "efficiency") + local groupcaps = get_efficiency_groupcaps(name, efficiency) local hash = itemstack:get_meta():get_string("groupcaps_hash") if not hash or hash ~= groupcaps.hash then local tool_capabilities = itemstack:get_tool_capabilities() tool_capabilities.groupcaps = groupcaps.values + + -- Increase the number of uses depending on the unbreaking level + -- of the tool. + local unbreaking = mcl_enchanting.get_enchantment(itemstack, "unbreaking") + for group, capability in pairs(tool_capabilities.groupcaps) do + capability.uses = capability.uses * (1 + unbreaking) + end + itemstack:get_meta():set_tool_capabilities(tool_capabilities) itemstack:get_meta():set_string("groupcaps_hash", groupcaps.hash) end From 573b1dc44b4376bca3fe4bf4d3ed18f24210723b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20=C3=85str=C3=B6m?= Date: Sat, 17 Apr 2021 23:40:19 +0200 Subject: [PATCH 038/136] Do not include unnecessary tool_capabilities This commit makes enchanted tools which have no use for tool_capabilities to not include it in their metadata. It does this by not including tool_capabilities in the metadata of an enchanted tool if at least one of two cases is true: (1) The tool is not enchanted with unbreaking or efficiency (2) The tool does not have tool_capabilities defined in its definition The first case covers situations like having a pickaxe only being enchanted with silk_touch. The second case covers situations like a piece of armor being enchanted with unbreaking. --- mods/ITEMS/mcl_enchanting/enchantments.lua | 5 +++++ mods/ITEMS/mcl_enchanting/engine.lua | 2 +- mods/ITEMS/mcl_enchanting/groupcaps.lua | 10 +++++++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index df6105d52..fa3bc3ed5 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -770,6 +770,11 @@ mcl_enchanting.enchantments.unbreaking = { description = S("Increases item durability."), curse = false, on_enchant = function(itemstack, level) + local name = itemstack:get_name() + if not minetest.registered_tools[name].tool_capabilities then + return + end + local tool_capabilities = itemstack:get_tool_capabilities() tool_capabilities.punch_attack_uses = tool_capabilities.punch_attack_uses * (1 + level) itemstack:get_meta():set_tool_capabilities(tool_capabilities) diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index 30e4a9a86..037134e4c 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -12,7 +12,7 @@ end function mcl_enchanting.unload_enchantments(itemstack) local itemdef = itemstack:get_definition() if itemdef.tool_capabilities then - itemstack:get_meta():set_tool_capabilities(itemdef.tool_capabilities) + itemstack:get_meta():set_tool_capabilities(nil) end local meta = itemstack:get_meta() if meta:get_string("name") == "" then diff --git a/mods/ITEMS/mcl_enchanting/groupcaps.lua b/mods/ITEMS/mcl_enchanting/groupcaps.lua index 1a4f8fd14..0bc1b8e24 100644 --- a/mods/ITEMS/mcl_enchanting/groupcaps.lua +++ b/mods/ITEMS/mcl_enchanting/groupcaps.lua @@ -45,12 +45,17 @@ end -- To make it more efficient it will first check a hash value to determine if -- the tool needs to be updated. function mcl_enchanting.update_groupcaps(itemstack) - if not itemstack:get_meta():get("tool_capabilities") then + local name = itemstack:get_name() + if not minetest.registered_tools[name].tool_capabilities then return end - local name = itemstack:get_name() local efficiency = mcl_enchanting.get_enchantment(itemstack, "efficiency") + local unbreaking = mcl_enchanting.get_enchantment(itemstack, "unbreaking") + if unbreaking == 0 and efficiency == 0 then + return + end + local groupcaps = get_efficiency_groupcaps(name, efficiency) local hash = itemstack:get_meta():get_string("groupcaps_hash") @@ -60,7 +65,6 @@ function mcl_enchanting.update_groupcaps(itemstack) -- Increase the number of uses depending on the unbreaking level -- of the tool. - local unbreaking = mcl_enchanting.get_enchantment(itemstack, "unbreaking") for group, capability in pairs(tool_capabilities.groupcaps) do capability.uses = capability.uses * (1 + unbreaking) end From 956dab78ceb49aaed98f12b6b88acc3efac81957 Mon Sep 17 00:00:00 2001 From: Doloment Date: Sun, 18 Apr 2021 09:50:02 +0000 Subject: [PATCH 039/136] Added LBM --- mods/ITEMS/mcl_chests/init.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index ac1226171..05a6d1818 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -1409,3 +1409,13 @@ minetest.register_lbm({ meta:set_string("formspec", formspec_shulker_box) end, }) + +minetest.register_lbm({ + label = "Upgrade old ender chest formspec", + name = "mcl_chests:replace_old_ender_form", + nodenames = {"mcl_chests:ender_chest_small"}, + run_at_every_load = false, + action = function(pos, node) + minetest.get_meta(pos):set_string("formspec", "") + end, +}) From 5d9c3cd85bc5f5cd2650f5e982a9ae0626f4d385 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 18 Apr 2021 14:41:44 +0200 Subject: [PATCH 040/136] Fix #1572 --- mods/PLAYER/mcl_playerplus/init.lua | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 360f4fe5d..f7c430509 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -150,13 +150,6 @@ minetest.register_globalstep(function(dtime) for _,player in pairs(get_connected_players()) do - local c_x, c_y = unpack(player_collision(player)) - - if player:get_velocity().x + player:get_velocity().y < .5 and c_x + c_y > 0 then - --minetest.chat_send_player(player:get_player_name(), "pushed at " .. c_x + c_y .. " parsecs.") - player:add_velocity({x=c_x, y=0, z=c_y}) - end - --[[ _ _ _ __ _ _ __ (_)_ __ ___ __ _| |_(_) ___ _ __ ___ @@ -173,6 +166,14 @@ minetest.register_globalstep(function(dtime) local wielded = player:get_wielded_item() local player_velocity = player:get_velocity() or player:get_player_velocity() + local c_x, c_y = unpack(player_collision(player)) + + if player_velocity.x + player_velocity.y < .5 and c_x + c_y > 0 then + local add_velocity = player.add_player_velocity or player.add_velocity + add_velocity(player, {x = c_x, y = 0, z = c_y}) + player_velocity = player:get_velocity() or player:get_player_velocity() + end + -- control head bone local pitch = - degrees(player:get_look_vertical()) local yaw = degrees(player:get_look_horizontal()) From 4f0bb444fed5548ea1c1bb308519c57706a2f5fb Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 18 Apr 2021 16:03:23 +0200 Subject: [PATCH 041/136] Integrate armor stand --- mods/CORE/mcl_util/init.lua | 9 +- mods/ITEMS/mcl_armor/api.lua | 24 ++- mods/ITEMS/mcl_armor_stand/init.lua | 258 +++++++--------------------- 3 files changed, 85 insertions(+), 206 deletions(-) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 55f308602..49d1c82a1 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -422,10 +422,13 @@ end function mcl_util.call_on_rightclick(itemstack, player, pointed_thing) -- Call on_rightclick if the pointed node defines it if pointed_thing and pointed_thing.type == "node" then - local node = minetest.get_node(pointed_thing.under) + local pos = pointed_thing.under + local node = minetest.get_node(pos) if player and not player:get_player_control().sneak then - if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack + local nodedef = minetest.registered_nodes[node.name] + local on_rightclick = nodedef and nodedef.on_rightclick + if on_rightclick then + return on_rightclick(pos, node, player, itemstack, pointed_thing) or itemstack end end end diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua index 9f9384c6d..c3a84f265 100644 --- a/mods/ITEMS/mcl_armor/api.lua +++ b/mods/ITEMS/mcl_armor/api.lua @@ -36,16 +36,30 @@ function mcl_armor.on_unequip(itemstack, obj) mcl_armor.update(obj) end -function mcl_armor.equip(itemstack, obj) +function mcl_armor.equip(itemstack, obj, swap) local def = itemstack:get_definition() + + if not def then + return itemstack + end + local element = mcl_armor.elements[def._mcl_armor_element or ""] local inv = mcl_util.get_inventory(obj) if element and inv then - if inv:get_stack("armor", element.index):is_empty() then - local equipping_item = itemstack:take_item() - inv:set_stack("armor", element.index, equipping_item) - mcl_armor.on_equip(equipping_item, obj) + local old_stack = inv:get_stack("armor", element.index) + local new_stack + + if swap then + new_stack = itemstack + itemstack = old_stack + else + new_stack = itemstack:take_item() + end + + if swap or old_stack:is_empty() then + inv:set_stack("armor", element.index, new_stack) + mcl_armor.on_equip(new_stack, obj) end end diff --git a/mods/ITEMS/mcl_armor_stand/init.lua b/mods/ITEMS/mcl_armor_stand/init.lua index 9a5a6d050..8bcb06134 100644 --- a/mods/ITEMS/mcl_armor_stand/init.lua +++ b/mods/ITEMS/mcl_armor_stand/init.lua @@ -1,60 +1,41 @@ local S = minetest.get_translator("mcl_armor_stand") -local elements = {"head", "torso", "legs", "feet"} - -local function get_stand_object(pos) - local object = nil - local objects = minetest.get_objects_inside_radius(pos, 0.5) or {} - for _, obj in pairs(objects) do - local ent = obj:get_luaentity() - if ent then - if ent.name == "mcl_armor_stand:armor_entity" then - -- Remove duplicates - if object then - obj:remove() - else - object = obj - end - end - end - end - return object +-- Spawn a stand entity +local function spawn_stand_entity(pos, node) + local luaentity = minetest.add_entity(pos, "mcl_armor_stand:armor_entity"):get_luaentity() + luaentity:update_rotation(node or minetest.get_node(pos)) + return luaentity end -local function update_entity(pos, node) - local node = node or minetest.get_node(pos) - local object = get_stand_object(pos) - if object then - if not string.find(node.name, "mcl_armor_stand:") then - object:remove() - return +-- Find a stand entity or spawn one +local function get_stand_entity(pos, node) + for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 0)) do + local luaentity = obj:get_luaentity() + if luaentity and luaentity.name == "mcl_armor_stand:armor_entity" then + return luaentity end - else - object = minetest.add_entity(pos, "mcl_armor_stand:armor_entity") end - if object then - local yaw = 0 - if node.param2 then - local rot = node.param2 % 4 - if rot == 1 then - yaw = 3 * math.pi / 2 - elseif rot == 2 then - yaw = math.pi - elseif rot == 3 then - yaw = math.pi / 2 - end + return spawn_stand_entity(pos, node) +end + +-- Migrate the old inventory format +local function migrate_inventory(inv) + inv:set_size("armor", 5) + local lists = inv:get_lists() + for name, element in pairs(mcl_armor.elements) do + local listname = "armor_" .. name + local list = lists[listname] + if list then + inv:set_stack("armor", element.index, list[1]) + inv:set_size(listname, 0) end - object:set_yaw(yaw) - mcl_armor.update(object) end end --- Drop all armor of the armor stand on the ground -local drop_armor = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - for _, element in pairs(elements) do - local stack = inv:get_stack("armor_"..element, 1) +-- Drop all armor on the ground when it got destroyed +local function drop_inventory(pos) + local inv = minetest.get_meta(pos):get_inventory() + for _, stack in pairs(inv:get_list("armor")) do if not stack:is_empty() then local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} minetest.add_item(p, stack) @@ -87,136 +68,27 @@ minetest.register_node("mcl_armor_stand:armor_stand", { _mcl_hardness = 2, sounds = mcl_sounds.node_sound_wood_defaults(), on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - for _, element in pairs(elements) do - inv:set_size("armor_"..element, 1) - end + spawn_stand_entity(pos) + end, + on_destruct = function(pos) + drop_inventory(pos) end, - -- Drop all armor on the ground when it got destroyed - on_destruct = drop_armor, - -- Put piece of armor on armor stand, or take one away on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + print(pos, node, clicker, itemstack, pointed_thing) local protname = clicker:get_player_name() + if minetest.is_protected(pos, protname) then minetest.record_protection_violation(pos, protname) return itemstack end - local inv = minetest.get_inventory({type = "node", pos = pos}) - if not inv then - return itemstack - end - - -- Check if player wields armor - local name = itemstack:get_name() - local list - for e=1, #elements do - local g = minetest.get_item_group(name, "armor_" .. elements[e]) - if g ~= nil and g ~= 0 then - list = "armor_" .. elements[e] - break - end - end - -- If player wields armor, put it on armor stand - local wielditem = clicker:get_wielded_item() - if list then - -- ... but only if the slot is free - local single_item = ItemStack(itemstack) - single_item:set_count(1) - if inv:is_empty(list) then - inv:add_item(list, single_item) - mcl_armor.play_equip_sound(single_item, nil, pos) - update_entity(pos) - itemstack:take_item() - return itemstack - end - end - - -- Take armor from stand if player has a free hand or wields the same armor type (if stackable) - for e=1, #elements do - local stand_armor = inv:get_stack("armor_" .. elements[e], 1) - if not stand_armor:is_empty() then - local pinv = clicker:get_inventory() - local taken = false - -- Empty hand - if wielditem:get_name() == "" then - pinv:set_stack("main", clicker:get_wield_index(), stand_armor) - taken = true - -- Stackable armor type (if not already full). This is the case for e.g. mob heads. - -- This is done purely for convenience. - elseif (wielditem:get_name() == stand_armor:get_name() and wielditem:get_count() < wielditem:get_stack_max()) then - wielditem:set_count(wielditem:get_count()+1) - pinv:set_stack("main", clicker:get_wield_index(), wielditem) - taken = true - end - if taken then - mcl_armor.play_equip_sound(stand_armor, nil, pos, true) - stand_armor:take_item() - inv:set_stack("armor_" .. elements[e], 1, stand_armor) - end - update_entity(pos) - return clicker:get_wielded_item() - end - end - update_entity(pos) - return itemstack - end, - after_place_node = function(pos) - minetest.add_entity(pos, "mcl_armor_stand:armor_entity") - end, - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - else - return stack:get_count() - end - end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - end - local def = stack:get_definition() or {} - local groups = def.groups or {} - if groups[listname] then - return 1 - end - return 0 - end, - allow_metadata_inventory_move = function() - return 0 - end, - on_metadata_inventory_put = function(pos) - update_entity(pos) - end, - on_metadata_inventory_take = function(pos) - update_entity(pos) - end, - after_destruct = function(pos) - update_entity(pos) - end, - on_blast = function(pos, _, do_drop) - local object = get_stand_object(pos) - if object then - object:remove() - end - minetest.after(1, function(pos) - update_entity(pos) - end, pos) - minetest.remove_node(pos) - if do_drop then - minetest.add_item(pos, "mcl_armor_stand:armor_stand") - end + return mcl_armor.equip(itemstack, get_stand_entity(pos, node).object, true) end, on_rotate = function(pos, node, user, mode) if mode == screwdriver.ROTATE_FACE then node.param2 = (node.param2 + 1) % 4 minetest.swap_node(pos, node) - update_entity(pos) + get_stand_entity(pos, node):update_rotation(node) return true end return false @@ -224,52 +96,43 @@ minetest.register_node("mcl_armor_stand:armor_stand", { }) minetest.register_entity("mcl_armor_stand:armor_entity", { - physical = true, - visual = "mesh", - mesh = "3d_armor_entity.obj", - visual_size = {x=1, y=1}, - collisionbox = {-0.1,-0.4,-0.1, 0.1,1.3,0.1}, - pointable = false, - textures = {"blank.png"}, - pos = nil, - timer = 0, - on_activate = function(self, staticdata) - self.object:set_armor_groups({immortal=1}) - local pos = self.object:get_pos() - self.pos = vector.round(pos) - self.inventory = minetest.get_meta(pos):get_inventory() - update_entity(pos) + initial_properties = { + physical = true, + visual = "mesh", + mesh = "3d_armor_entity.obj", + visual_size = {x=1, y=1}, + collisionbox = {-0.1,-0.4,-0.1, 0.1,1.3,0.1}, + pointable = false, + textures = {"blank.png"}, + timer = 0, + static_save = false, + }, + on_activate = function(self) + self.object:set_armor_groups({immortal = 1}) + self.node_pos = vector.round(self.object:get_pos()) + self.inventory = minetest.get_meta(self.node_pos):get_inventory() + migrate_inventory(self.inventory) + end, + on_step = function(self, dtime) + if minetest.get_node(self.node_pos).name ~= "mcl_armor_stand:armor_stand" then + self.object:remove() + end end, update_armor = function(self, info) self.object:set_properties({textures = {info.texture}}) end, - on_step = function(self, dtime) - if not self.pos then - return - end - self.timer = self.timer + dtime - if self.timer > 1 then - self.timer = 0 - local pos = self.object:get_pos() - if pos then - if vector.equals(vector.round(pos), self.pos) then - return - end - end - update_entity(self.pos) - self.object:remove() - end + update_rotation = function(self, node) + self.object:set_yaw(minetest.dir_to_yaw(minetest.facedir_to_dir(node.param2))) end, }) --- FIXME: Armor helper entity can get destroyed by /clearobjects minetest.register_lbm({ label = "Respawn armor stand entities", name = "mcl_armor_stand:respawn_entities", nodenames = {"mcl_armor_stand:armor_stand"}, run_at_every_load = true, action = function(pos, node) - update_entity(pos, node) + spawn_stand_entity(pos, node) end, }) @@ -282,7 +145,6 @@ minetest.register_craft({ } }) - -- Legacy handling minetest.register_alias("3d_armor_stand:armor_stand", "mcl_armor_stand:armor_stand") minetest.register_entity(":3d_armor_stand:armor_entity", { From d1198e8d740153f648ce885c782a90f0a2253ce6 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 18 Apr 2021 16:19:12 +0200 Subject: [PATCH 042/136] Register elytra texture --- mods/ITEMS/mcl_armor/register.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ITEMS/mcl_armor/register.lua b/mods/ITEMS/mcl_armor/register.lua index 91410f659..de17fd20d 100644 --- a/mods/ITEMS/mcl_armor/register.lua +++ b/mods/ITEMS/mcl_armor/register.lua @@ -201,4 +201,5 @@ minetest.register_tool("mcl_armor:elytra", { on_place = mcl_armor.equip_on_use, on_secondary_use = mcl_armor.equip_on_use, _mcl_armor_element = "torso", + _mcl_armor_texture = "mcl_armor_elytra.png" }) From 1cf53caa7a6b6949d685c1c8140a02ccfd5a9c49 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 18 Apr 2021 16:20:32 +0200 Subject: [PATCH 043/136] Update armor stand entity in on_activate callback, remove debug print --- mods/ITEMS/mcl_armor_stand/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_armor_stand/init.lua b/mods/ITEMS/mcl_armor_stand/init.lua index 8bcb06134..870d567fc 100644 --- a/mods/ITEMS/mcl_armor_stand/init.lua +++ b/mods/ITEMS/mcl_armor_stand/init.lua @@ -74,7 +74,6 @@ minetest.register_node("mcl_armor_stand:armor_stand", { drop_inventory(pos) end, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - print(pos, node, clicker, itemstack, pointed_thing) local protname = clicker:get_player_name() if minetest.is_protected(pos, protname) then @@ -112,6 +111,7 @@ minetest.register_entity("mcl_armor_stand:armor_entity", { self.node_pos = vector.round(self.object:get_pos()) self.inventory = minetest.get_meta(self.node_pos):get_inventory() migrate_inventory(self.inventory) + mcl_armor.update(self.object) end, on_step = function(self, dtime) if minetest.get_node(self.node_pos).name ~= "mcl_armor_stand:armor_stand" then From 3ad5b30ea5d68723b7b0b9a7f84fbe85a7739569 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 18 Apr 2021 17:38:19 +0200 Subject: [PATCH 044/136] Add cramming and fireworks damage types for future use --- mods/CORE/mcl_damage/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/CORE/mcl_damage/init.lua b/mods/CORE/mcl_damage/init.lua index 83c6d83af..3aabbd525 100644 --- a/mods/CORE/mcl_damage/init.lua +++ b/mods/CORE/mcl_damage/init.lua @@ -25,6 +25,8 @@ mcl_damage = { fireball = {is_projectile = true, is_fire = true}, thorns = {is_magic = true}, explosion = {is_explosion = true}, + cramming = {bypasses_armor = true}, + fireworks = {is_explosion = true}, } } From 2827542002662aff9edae7044d3a49974b733ff2 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 18 Apr 2021 18:49:00 +0200 Subject: [PATCH 045/136] Implement food poisoning damage properly~ --- mods/CORE/mcl_damage/init.lua | 6 +++--- mods/PLAYER/mcl_hunger/hunger.lua | 5 +---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/mods/CORE/mcl_damage/init.lua b/mods/CORE/mcl_damage/init.lua index 3aabbd525..18cb6cb13 100644 --- a/mods/CORE/mcl_damage/init.lua +++ b/mods/CORE/mcl_damage/init.lua @@ -12,7 +12,7 @@ mcl_damage = { cactus = {}, fall = {bypasses_armor = true}, fly_into_wall = {bypasses_armor = true}, -- unused - out_of_world = {bypasses_armor = true, bypasses_invulnerability = true, bypasses_magic = true}, + out_of_world = {bypasses_armor = true, bypasses_invulnerability = true}, generic = {bypasses_armor = true}, magic = {is_magic = true, bypasses_armor = true}, wither = {bypasses_armor = true}, -- unused @@ -25,8 +25,8 @@ mcl_damage = { fireball = {is_projectile = true, is_fire = true}, thorns = {is_magic = true}, explosion = {is_explosion = true}, - cramming = {bypasses_armor = true}, - fireworks = {is_explosion = true}, + cramming = {bypasses_armor = true}, -- unused + fireworks = {is_explosion = true}, -- unused } } diff --git a/mods/PLAYER/mcl_hunger/hunger.lua b/mods/PLAYER/mcl_hunger/hunger.lua index 30ad10ac2..2f192357a 100644 --- a/mods/PLAYER/mcl_hunger/hunger.lua +++ b/mods/PLAYER/mcl_hunger/hunger.lua @@ -110,10 +110,7 @@ local function poisonp(tick, time, time_left, damage, exhaustion, name) -- Deal damage and exhaust player -- TODO: Introduce fatal poison at higher difficulties if player:get_hp()-damage > 0 then - if mod_death_messages then - mcl_death_messages.player_damage(player, S("@1 succumbed to the poison.", name)) - end - player:set_hp(player:get_hp()-damage) + mcl_util.deal_damage(player, damage, {type = "hunger"}) end mcl_hunger.exhaust(name, exhaustion) From 9bc2f2d8669b63225de22114d17ad9ced8aefe19 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sun, 18 Apr 2021 17:18:27 +0000 Subject: [PATCH 046/136] Fix lying trunks that stand upright again after debarking --- mods/ITEMS/mcl_tools/init.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index 3aebafb7b..cdc981b2a 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -375,22 +375,22 @@ local make_stripped_trunk = function(itemstack, placer, pointed_thing) return itemstack end if node_name == "mcl_core:tree" then - minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_oak"}) + minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_oak", param2=node.param2}) make_stripped_trunk_add_wear(itemstack, placer) elseif node_name == "mcl_core:darktree" then - minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_dark_oak"}) + minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_dark_oak", param2=node.param2}) make_stripped_trunk_add_wear(itemstack, placer) elseif node_name == "mcl_core:acaciatree" then - minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_acacia"}) + minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_acacia", param2=node.param2}) make_stripped_trunk_add_wear(itemstack, placer) elseif node_name == "mcl_core:birchtree" then - minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_birch"}) + minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_birch", param2=node.param2}) make_stripped_trunk_add_wear(itemstack, placer) elseif node_name == "mcl_core:sprucetree" then - minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_spruce"}) + minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_spruce", param2=node.param2}) make_stripped_trunk_add_wear(itemstack, placer) elseif node_name == "mcl_core:jungletree" then - minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_jungle"}) + minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_jungle", param2=node.param2}) make_stripped_trunk_add_wear(itemstack, placer) elseif node_name == "mcl_core:tree_bark" then minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_oak_bark"}) From d08a226a51ed3001e4714f44fce5b2a35849c79a Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 18 Apr 2021 19:50:48 +0200 Subject: [PATCH 047/136] Integrate critical hits --- mods/CORE/mcl_damage/init.lua | 3 ++ mods/PLAYER/mcl_criticals/init.lua | 38 ++++++++++++++++++ mods/PLAYER/mcl_criticals/mod.conf | 2 + .../sounds/mcl_criticals_hit.0.ogg | Bin 0 -> 10932 bytes .../sounds/mcl_criticals_hit.1.ogg | Bin 0 -> 12936 bytes .../sounds/mcl_criticals_hit.2.ogg | Bin 0 -> 10130 bytes mods/PLAYER/mcl_playerplus/init.lua | 31 -------------- 7 files changed, 43 insertions(+), 31 deletions(-) create mode 100644 mods/PLAYER/mcl_criticals/init.lua create mode 100644 mods/PLAYER/mcl_criticals/mod.conf create mode 100644 mods/PLAYER/mcl_criticals/sounds/mcl_criticals_hit.0.ogg create mode 100644 mods/PLAYER/mcl_criticals/sounds/mcl_criticals_hit.1.ogg create mode 100644 mods/PLAYER/mcl_criticals/sounds/mcl_criticals_hit.2.ogg diff --git a/mods/CORE/mcl_damage/init.lua b/mods/CORE/mcl_damage/init.lua index 18cb6cb13..2018ffc19 100644 --- a/mods/CORE/mcl_damage/init.lua +++ b/mods/CORE/mcl_damage/init.lua @@ -102,6 +102,9 @@ old_register_hpchange(function(player, hp_change, mt_reason) for _, modf in ipairs(mcl_damage.modifiers) do hp_change = modf.func(player, hp_change, mt_reason, mcl_reason) or hp_change + if hp_change == 0 then + return 0 + end end return hp_change diff --git a/mods/PLAYER/mcl_criticals/init.lua b/mods/PLAYER/mcl_criticals/init.lua new file mode 100644 index 000000000..6b420e0b8 --- /dev/null +++ b/mods/PLAYER/mcl_criticals/init.lua @@ -0,0 +1,38 @@ +mcl_criticals = {} + +function mcl_criticals.modifier(obj, hp_change, reason) + local damage = -hp_change + if damage > 0 and reason.type == "player" then + local hitter = reason.direct + if mcl_sprint.is_sprinting(hitter) then + obj:add_velocity(hitter:get_velocity()) + elseif (hitter:get_velocity() or hitter:get_player_velocity()).y < 0 then + local pos = mcl_util.get_object_center(obj) + minetest.add_particlespawner({ + amount = 15, + time = 0.1, + minpos = {x=pos.x-0.5, y=pos.y-0.5, z=pos.z-0.5}, + maxpos = {x=pos.x+0.5, y=pos.y+0.5, z=pos.z+0.5}, + minvel = {x=-0.1, y=-0.1, z=-0.1}, + maxvel = {x=0.1, y=0.1, z=0.1}, + minacc = {x=0, y=0, z=0}, + maxacc = {x=0, y=0, z=0}, + minexptime = 1, + maxexptime = 2, + minsize = 1.5, + maxsize = 1.5, + collisiondetection = false, + vertical = false, + texture = "mcl_particles_crit.png^[colorize:#bc7a57:127", + }) + minetest.sound_play("mcl_criticals_hit", {object = obj}) + -- the minecraft wiki is actually wrong about a crit dealing 150% damage, see minecraft source code + damage = damage + math.random(0, math.floor(damage * 1.5 + 2)) + end + end + return -damage +end + +mcl_damage.register_modifier(function(player, hp_change, _, mcl_reason) + return mcl_criticals.modifier(player, hp_change, mcl_reason) +end, -100) diff --git a/mods/PLAYER/mcl_criticals/mod.conf b/mods/PLAYER/mcl_criticals/mod.conf new file mode 100644 index 000000000..5b0b91330 --- /dev/null +++ b/mods/PLAYER/mcl_criticals/mod.conf @@ -0,0 +1,2 @@ +name = mcl_criticals +depends = mcl_damage diff --git a/mods/PLAYER/mcl_criticals/sounds/mcl_criticals_hit.0.ogg b/mods/PLAYER/mcl_criticals/sounds/mcl_criticals_hit.0.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8184d10768996a9faac5fcf83e29dc0f5c7445b9 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/mods/PLAYER/mcl_criticals/sounds/mcl_criticals_hit.1.ogg b/mods/PLAYER/mcl_criticals/sounds/mcl_criticals_hit.1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..aed998162308c4764cb2998cf700cf4abe1ae2b5 GIT binary patch literal 12936 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 R9JjpLI<;hq0oMP}{tuJDua5u# literal 0 HcmV?d00001 diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 5d74903fb..5cf0253ab 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -113,37 +113,6 @@ end local node_stand, node_stand_below, node_head, node_feet - -minetest.register_on_punchplayer(function(player, hitter, damage) - if hitter:is_player() then - if hitter:get_player_control().aux1 then - player:add_velocity(hitter:get_velocity()) - end - if hitter:get_velocity().y < -6 then - player:set_hp(player:get_hp() - (damage * math.random(0.50 , 0.75))) - local pos = player:get_pos() - minetest.add_particlespawner({ - amount = 15, - time = 0.1, - minpos = {x=pos.x-0.5, y=pos.y-0.5, z=pos.z-0.5}, - maxpos = {x=pos.x+0.5, y=pos.y+0.5, z=pos.z+0.5}, - minvel = {x=-0.1, y=-0.1, z=-0.1}, - maxvel = {x=0.1, y=0.1, z=0.1}, - minacc = {x=0, y=0, z=0}, - maxacc = {x=0, y=0, z=0}, - minexptime = 1, - maxexptime = 2, - minsize = 1.5, - maxsize = 1.5, - collisiondetection = false, - vertical = false, - texture = "mcl_particles_crit.png^[colorize:#bc7a57:127", - }) - end - end -end) - - minetest.register_globalstep(function(dtime) time = time + dtime From 3668b2dee68daf57aa81b5a30941ee48ef5673b9 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sun, 18 Apr 2021 18:02:37 +0000 Subject: [PATCH 048/136] Summarize all debarked types of wood --- mods/ITEMS/mcl_core/nodes_trees.lua | 204 +++++++--------------------- 1 file changed, 46 insertions(+), 158 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_trees.lua b/mods/ITEMS/mcl_core/nodes_trees.lua index 4af3eef34..d2c5443d3 100644 --- a/mods/ITEMS/mcl_core/nodes_trees.lua +++ b/mods/ITEMS/mcl_core/nodes_trees.lua @@ -48,165 +48,46 @@ local register_tree_trunk = function(subname, description_trunk, description_bar }) end --- Register stripped trunk -minetest.register_node("mcl_core:stripped_oak", { - description = "Stripped Oak Log", - _doc_items_longdesc = "Stripped Oak Log is a log that has been stripped of it's bark.", - tiles = {"mcl_core_stripped_oak_top.png", "mcl_core_stripped_oak_top.png", "mcl_core_stripped_oak_side.png"}, - is_ground_content = false, - paramtype2 = "facedir", - on_place = mcl_util.rotate_axis, - groups = {handy=1,axey=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5, tree=1}, - sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 10, - _mcl_hardness = 2, -}) - -minetest.register_node("mcl_core:stripped_acacia", { - description = "Stripped Acacia Log", - _doc_items_longdesc = "Stripped Acacia Log is a log that has been stripped of it's bark.", - tiles = {"mcl_core_stripped_acacia_top.png", "mcl_core_stripped_acacia_top.png", "mcl_core_stripped_acacia_side.png"}, - is_ground_content = false, - paramtype2 = "facedir", - on_place = mcl_util.rotate_axis, - groups = {handy=1,axey=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5, tree=1}, - sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 10, - _mcl_hardness = 2, -}) - -minetest.register_node("mcl_core:stripped_dark_oak", { - description = "Stripped Dark Oak Log", - _doc_items_longdesc = "Stripped Dark Oak Log is a log that has been stripped of it's bark.", - tiles = {"mcl_core_stripped_dark_oak_top.png", "mcl_core_stripped_dark_oak_top.png", "mcl_core_stripped_dark_oak_side.png"}, - is_ground_content = false, - paramtype2 = "facedir", - on_place = mcl_util.rotate_axis, - groups = {handy=1,axey=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5, tree=1}, - sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 10, - _mcl_hardness = 2, -}) - -minetest.register_node("mcl_core:stripped_birch", { - description = "Stripped Birch Log", - _doc_items_longdesc = "Stripped Birch Log is a log that has been stripped of it's bark.", - tiles = {"mcl_core_stripped_birch_top.png", "mcl_core_stripped_birch_top.png", "mcl_core_stripped_birch_side.png"}, - is_ground_content = false, - paramtype2 = "facedir", - on_place = mcl_util.rotate_axis, - groups = {handy=1,axey=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5, tree=1}, - sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 10, - _mcl_hardness = 2, -}) - -minetest.register_node("mcl_core:stripped_spruce", { - description = "Stripped Spruce Log", - _doc_items_longdesc = "Stripped Spruce Log is a log that has been stripped of it's bark.", - tiles = {"mcl_core_stripped_spruce_top.png", "mcl_core_stripped_spruce_top.png", "mcl_core_stripped_spruce_side.png"}, - is_ground_content = false, - paramtype2 = "facedir", - on_place = mcl_util.rotate_axis, - groups = {handy=1,axey=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5, tree=1}, - sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 10, - _mcl_hardness = 2, -}) - -minetest.register_node("mcl_core:stripped_jungle", { - description = "Stripped Jungle Log", - _doc_items_longdesc = "Stripped Jungle Log is a log that has been stripped of it's bark.", - tiles = {"mcl_core_stripped_jungle_top.png", "mcl_core_stripped_jungle_top.png", "mcl_core_stripped_jungle_side.png"}, - is_ground_content = false, - paramtype2 = "facedir", - on_place = mcl_util.rotate_axis, - groups = {handy=1,axey=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5, tree=1}, - sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 10, - _mcl_hardness = 2, -}) - - --- Register stripped bark -minetest.register_node("mcl_core:stripped_oak_bark", { - description = "Stripped Oak Bark", - _doc_items_longdesc = "Stripped Oak Bark is a bark that has been stripped.", - tiles = {"mcl_core_stripped_oak_side.png"}, - is_ground_content = false, - paramtype2 = "facedir", - on_place = mcl_util.rotate_axis, - groups = {handy=1,axey=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, - sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 10, - _mcl_hardness = 2, -}) - -minetest.register_node("mcl_core:stripped_acacia_bark", { - description = "Stripped Acacia Bark", - _doc_items_longdesc = "Stripped Acacia Bark is a bark that has been stripped.", - tiles = {"mcl_core_stripped_acacia_side.png"}, - is_ground_content = false, - paramtype2 = "facedir", - on_place = mcl_util.rotate_axis, - groups = {handy=1,axey=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, - sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 10, - _mcl_hardness = 2, -}) - -minetest.register_node("mcl_core:stripped_dark_oak_bark", { - description = "Stripped Dark Oak Bark", - _doc_items_longdesc = "Stripped Dark Oak Bark is a bark that has been stripped.", - tiles = {"mcl_core_stripped_dark_oak_side.png"}, - is_ground_content = false, - paramtype2 = "facedir", - on_place = mcl_util.rotate_axis, - groups = {handy=1,axey=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, - sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 10, - _mcl_hardness = 2, -}) - -minetest.register_node("mcl_core:stripped_birch_bark", { - description = "Stripped Birch Bark", - _doc_items_longdesc = "Stripped Birch Bark is a bark that has been stripped.", - tiles = {"mcl_core_stripped_birch_side.png"}, - is_ground_content = false, - paramtype2 = "facedir", - on_place = mcl_util.rotate_axis, - groups = {handy=1,axey=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, - sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 10, - _mcl_hardness = 2, -}) - -minetest.register_node("mcl_core:stripped_spruce_bark", { - description = "Stripped Spruce Bark", - _doc_items_longdesc = "Stripped Spruce Bark is a bark that has been stripped.", - tiles = {"mcl_core_stripped_spruce_side.png"}, - is_ground_content = false, - paramtype2 = "facedir", - on_place = mcl_util.rotate_axis, - groups = {handy=1,axey=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, - sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 10, - _mcl_hardness = 2, -}) - -minetest.register_node("mcl_core:stripped_jungle_bark", { - description = "Stripped Jungle Bark", - _doc_items_longdesc = "Stripped Jungles Bark is a bark that has been stripped.", - tiles = {"mcl_core_stripped_jungle_side.png"}, - is_ground_content = false, - paramtype2 = "facedir", - on_place = mcl_util.rotate_axis, - groups = {handy=1,axey=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, - sounds = mcl_sounds.node_sound_wood_defaults(), - _mcl_blast_resistance = 10, - _mcl_hardness = 2, -}) +-- Register stripped trunk and stripped wood +local register_stripped_trunk = function(subname, description_stripped_trunk, description_stripped_bark, longdesc, tile_stripped_inner, tile_stripped_bark) + minetest.register_node("mcl_core:"..subname, { + description = description_stripped_trunk, + _doc_items_longdesc = longdesc, + _doc_items_hidden = false, + tiles = {tile_stripped_inner, tile_stripped_inner, tile_stripped_bark}, + paramtype2 = "facedir", + on_place = mcl_util.rotate_axis, + stack_max = 64, + groups = {handy=1,axey=1, tree=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = mcl_sounds.node_sound_wood_defaults(), + on_rotate = on_rotate, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + }) + minetest.register_node("mcl_core:"..subname.."_bark", { + description = description_stripped_bark, + _doc_items_longdesc = S("This is a decorative block."), + tiles = {tile_stripped_bark}, + paramtype2 = "facedir", + on_place = mcl_util.rotate_axis, + stack_max = 64, + groups = {handy=1,axey=1, bark=1, flammable=2, building_block=1, material_wood=1, fire_encouragement=5, fire_flammability=5}, + sounds = mcl_sounds.node_sound_wood_defaults(), + is_ground_content = false, + on_rotate = on_rotate, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + }) + + minetest.register_craft({ + output = "mcl_core:"..subname.."_bark 3", + recipe = { + { "mcl_core:"..subname, "mcl_core:"..subname }, + { "mcl_core:"..subname, "mcl_core:"..subname }, + } + }) +end local register_wooden_planks = function(subname, description, tiles) minetest.register_node("mcl_core:"..subname, { @@ -340,6 +221,13 @@ register_tree_trunk("sprucetree", S("Spruce Wood"), S("Spruce Bark"), S("The tru register_tree_trunk("birchtree", S("Birch Wood"), S("Birch Bark"), S("The trunk of a birch tree."), "mcl_core_log_birch_top.png", "mcl_core_log_birch.png") register_tree_trunk("jungletree", S("Jungle Wood"), S("Jungle Bark"), S("The trunk of a jungle tree."), "default_jungletree_top.png", "default_jungletree.png") +register_stripped_trunk("stripped_oak", S("Stripped Oak Log"), S("Stripped Oak Wood"), S("The stripped trunk of an oak tree."), "mcl_core_stripped_oak_top.png", "mcl_core_stripped_oak_side.png") +register_stripped_trunk("stripped_acacia", S("Stripped Acacia Log"), S("Stripped Acacia Wood"), S("The stripped trunk of an acacia tree."), "mcl_core_stripped_acacia_top.png", "mcl_core_stripped_acacia_side.png") +register_stripped_trunk("stripped_dark_oak", S("Stripped Dark Oak Log"), S("Stripped Dark Oak Wood"), S("The stripped trunk of an dark oak tree."), "mcl_core_stripped_dark_oak_top.png", "mcl_core_stripped_dark_oak_side.png") +register_stripped_trunk("stripped_birch", S("Stripped Birch Log"), S("Stripped Birch Wood"), S("The stripped trunk of an birch tree."), "mcl_core_stripped_birch_top.png", "mcl_core_stripped_birch_side.png") +register_stripped_trunk("stripped_spruce", S("Stripped Spruce Log"), S("Stripped Spruce Wood"), S("The stripped trunk of an spruce tree."), "mcl_core_stripped_spruce_top.png", "mcl_core_stripped_spruce_side.png") +register_stripped_trunk("stripped_jungle", S("Stripped Jungle Log"), S("Stripped Jungle Wood"), S("The stripped trunk of an jungle tree."),"mcl_core_stripped_jungle_top.png", "mcl_core_stripped_jungle_side.png") + register_wooden_planks("wood", S("Oak Wood Planks"), {"default_wood.png"}) register_wooden_planks("darkwood", S("Dark Oak Wood Planks"), {"mcl_core_planks_big_oak.png"}) register_wooden_planks("junglewood", S("Jungle Wood Planks"), {"default_junglewood.png"}) From 49f6ccaa4adf1cd36bbc56f93968d26fedc5ba6e Mon Sep 17 00:00:00 2001 From: NO11 Date: Sun, 18 Apr 2021 18:02:41 +0000 Subject: [PATCH 049/136] Remove old crafting recipes --- mods/ITEMS/mcl_core/crafting.lua | 50 -------------------------------- 1 file changed, 50 deletions(-) diff --git a/mods/ITEMS/mcl_core/crafting.lua b/mods/ITEMS/mcl_core/crafting.lua index 7a2b6a5c8..a0ad38a77 100644 --- a/mods/ITEMS/mcl_core/crafting.lua +++ b/mods/ITEMS/mcl_core/crafting.lua @@ -46,56 +46,6 @@ minetest.register_craft({ } }) --- Stripped Bark -minetest.register_craft({ - output = "mcl_core:stripped_oak_bark 3", - recipe = { - { "mcl_core:stripped_oak", "mcl_core:stripped_oak" }, - { "mcl_core:stripped_oak", "mcl_core:stripped_oak" }, - } -}) - -minetest.register_craft({ - output = "mcl_core:stripped_acacia_bark 3", - recipe = { - { "mcl_core:stripped_acacia", "mcl_core:stripped_acacia" }, - { "mcl_core:stripped_acacia", "mcl_core:stripped_acacia" }, - } -}) - -minetest.register_craft({ - output = "mcl_core:stripped_dark_oak_bark 3", - recipe = { - { "mcl_core:stripped_dark_oak", "mcl_core:stripped_dark_oak" }, - { "mcl_core:stripped_dark_oak", "mcl_core:stripped_dark_oak" }, - } -}) - -minetest.register_craft({ - output = "mcl_core:stripped_birch_bark 3", - recipe = { - { "mcl_core:stripped_birch", "mcl_core:stripped_birch" }, - { "mcl_core:stripped_birch", "mcl_core:stripped_birch" }, - } -}) - -minetest.register_craft({ - output = "mcl_core:stripped_spruce_bark 3", - recipe = { - { "mcl_core:stripped_spruce", "mcl_core:stripped_spruce" }, - { "mcl_core:stripped_spruce", "mcl_core:stripped_spruce" }, - } -}) - -minetest.register_craft({ - output = "mcl_core:stripped_jungle_bark 3", - recipe = { - { "mcl_core:stripped_jungle", "mcl_core:stripped_jungle" }, - { "mcl_core:stripped_jungle", "mcl_core:stripped_jungle" }, - } -}) - - minetest.register_craft({ type = 'shapeless', output = 'mcl_core:mossycobble', From d9195cc520754e048202c85820511663c2df38b8 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 18 Apr 2021 20:08:08 +0200 Subject: [PATCH 050/136] Redesign damage modifier execution --- mods/CORE/mcl_damage/init.lua | 83 +++++++++++++++--------------- mods/ITEMS/mcl_armor/damage.lua | 13 ++--- mods/ITEMS/mcl_armor/player.lua | 4 -- mods/PLAYER/mcl_criticals/init.lua | 14 ++--- 4 files changed, 48 insertions(+), 66 deletions(-) diff --git a/mods/CORE/mcl_damage/init.lua b/mods/CORE/mcl_damage/init.lua index 2018ffc19..7f8469c3e 100644 --- a/mods/CORE/mcl_damage/init.lua +++ b/mods/CORE/mcl_damage/init.lua @@ -15,7 +15,7 @@ mcl_damage = { out_of_world = {bypasses_armor = true, bypasses_invulnerability = true}, generic = {bypasses_armor = true}, magic = {is_magic = true, bypasses_armor = true}, - wither = {bypasses_armor = true}, -- unused + wither = {bypasses_armor = true}, -- unused anvil = {}, falling_node = {}, -- unused dragon_breath = {bypasses_armor = true}, -- unused @@ -30,24 +30,45 @@ mcl_damage = { } } -local old_register_hpchange = minetest.register_on_player_hpchange - -function minetest.register_on_player_hpchange(func, modifier) - if modifier then - mcl_damage.register_modifier(func, 0) - else - old_register_hpchange(func, modifier) - end -end - function mcl_damage.register_modifier(func, priority) table.insert(mcl_damage.modifiers, {func = func, priority = priority or 0}) end -function mcl_damage.get_mcl_damage_reason(mt_reason) - local mcl_reason = { - type = "generic", - } +function mcl_damage.do_modifiers(player, damage, reason) + for _, modf in ipairs(mcl_damage.modifiers) do + damage = modf.func(player, damage, reason) or damage + if damage == 0 then + return 0 + end + end + + return damage +end + +function mcl_damage.from_punch(mcl_reason, object) + mcl_reason.direct = object + local luaentity = mcl_reason.direct:get_luaentity() + if luaentity then + if luaentity._is_arrow then + mcl_reason.type = "arrow" + elseif luaentity._is_fireball then + mcl_reason.type = "fireball" + elseif luaentity._cmi_is_mob then + mcl_reason.type = "mob" + end + mcl_reason.source = mcl_reason.source or luaentity._source_object + else + mcl_reason.type = "player" + end +end + +function mcl_damage.finish_reason(mcl_reason) + mcl_reason.source = mcl_reason.source or mcl_reason.direct + mcl_reason.flags = mcl_damage.types[mcl_reason.type] +end + +function mcl_damage.from_mt(mt_reason) + local mcl_reason = {type = "generic"} if mt_reason._mcl_type then mcl_reason.type = mt_reason._mcl_type @@ -56,22 +77,7 @@ function mcl_damage.get_mcl_damage_reason(mt_reason) elseif mt_reason.type == "drown" then mcl_reason.type = "drown" elseif mt_reason.type == "punch" then - mcl_reason.direct = mt_reason.object - if mcl_reason.direct then - local luaentity = mcl_reason.direct:get_luaentity() - if luaentity then - if luaentity._is_arrow then - mcl_reason.type = "arrow" - elseif luaentity._is_fireball then - mcl_reason.type = "fireball" - elseif luaentity._cmi_is_mob then - mcl_reason.type = "mob" - end - mcl_reason.source = mcl_reason.source or luaentity._source_object - else - mcl_reason.type = "player" - end - end + mcl_damage.from_punch(mcl_reason, mt_reason.object) elseif mt_reason.type == "node_damage" and mt_reason.node then if minetest.get_item_group(mt_reason.node, "fire") > 0 then mcl_reason.type = "in_fire" @@ -87,8 +93,7 @@ function mcl_damage.get_mcl_damage_reason(mt_reason) end end - mcl_reason.source = mcl_reason.source or mcl_reason.direct - mcl_reason.flags = mcl_damage.types[mcl_reason.type] + mcl_damage.finish_reason(mcl_reason) return mcl_reason end @@ -97,16 +102,10 @@ function mcl_damage.register_type(name, def) mcl_damage.types[name] = def end -old_register_hpchange(function(player, hp_change, mt_reason) - local mcl_reason = mcl_damage.get_mcl_damage_reason(mt_reason) - - for _, modf in ipairs(mcl_damage.modifiers) do - hp_change = modf.func(player, hp_change, mt_reason, mcl_reason) or hp_change - if hp_change == 0 then - return 0 - end +minetest.register_on_player_hpchange(function(player, hp_change, mt_reason) + if hp_change < 0 then + hp_change = -mcl_damage.do_modifiers(player, -hp_change, mcl_damage.from_mt(mt_reason)) end - return hp_change end, true) diff --git a/mods/ITEMS/mcl_armor/damage.lua b/mods/ITEMS/mcl_armor/damage.lua index e6d13dfa7..3715538ec 100644 --- a/mods/ITEMS/mcl_armor/damage.lua +++ b/mods/ITEMS/mcl_armor/damage.lua @@ -1,13 +1,8 @@ -function mcl_armor.damage_modifier(obj, hp_change, reason) - if hp_change > 0 then - return hp_change - end - - local damage = -hp_change +mcl_damage.register_modifier(function(obj, damage, reason) local flags = reason.flags if flags.bypasses_armor and flags.bypasses_magic then - return hp_change + return damage end local uses = math.max(1, math.floor(damage / 4)) @@ -95,5 +90,5 @@ function mcl_armor.damage_modifier(obj, hp_change, reason) mcl_armor.update(obj) - return -math.floor(damage + 0.5) -end + return math.floor(damage + 0.5) +end, 0) diff --git a/mods/ITEMS/mcl_armor/player.lua b/mods/ITEMS/mcl_armor/player.lua index 50828fcea..4d90ec0e2 100644 --- a/mods/ITEMS/mcl_armor/player.lua +++ b/mods/ITEMS/mcl_armor/player.lua @@ -155,7 +155,3 @@ end) minetest.register_on_leaveplayer(function(player) mcl_armor.player_view_range_factors[player] = nil end) - -mcl_damage.register_modifier(function(player, hp_change, _, reason) - return mcl_armor.damage_modifier(player, hp_change, reason) -end) diff --git a/mods/PLAYER/mcl_criticals/init.lua b/mods/PLAYER/mcl_criticals/init.lua index 6b420e0b8..27d09abb2 100644 --- a/mods/PLAYER/mcl_criticals/init.lua +++ b/mods/PLAYER/mcl_criticals/init.lua @@ -1,8 +1,5 @@ -mcl_criticals = {} - -function mcl_criticals.modifier(obj, hp_change, reason) - local damage = -hp_change - if damage > 0 and reason.type == "player" then +mcl_damage.register_modifier(function(obj, damage, reason) + if reason.type == "player" then local hitter = reason.direct if mcl_sprint.is_sprinting(hitter) then obj:add_velocity(hitter:get_velocity()) @@ -27,12 +24,7 @@ function mcl_criticals.modifier(obj, hp_change, reason) }) minetest.sound_play("mcl_criticals_hit", {object = obj}) -- the minecraft wiki is actually wrong about a crit dealing 150% damage, see minecraft source code - damage = damage + math.random(0, math.floor(damage * 1.5 + 2)) + return damage + math.random(0, math.floor(damage * 1.5 + 2)) end end - return -damage -end - -mcl_damage.register_modifier(function(player, hp_change, _, mcl_reason) - return mcl_criticals.modifier(player, hp_change, mcl_reason) end, -100) From 53b0ad734725edf27909a26b93035eee783e666f Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 18 Apr 2021 20:21:11 +0200 Subject: [PATCH 051/136] Implement magic damage --- mods/CORE/mcl_util/init.lua | 10 ++++++++++ mods/ITEMS/mcl_potions/functions.lua | 20 ++++---------------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 49d1c82a1..741dc604e 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -503,6 +503,16 @@ function mcl_util.deal_damage(target, damage, mcl_reason) target:set_hp(target:get_hp() - damage, mt_reason) end +function mcl_util.get_hp(obj) + local luaentity = obj:get_luaentity() + + if luaentity and luaentity._cmi_is_mob then + return luaentity.health + else + return obj:get_hp() + end +end + function mcl_util.get_inventory(object, create) if object:is_player() then return object:get_inventory() diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua index 769e5f5b9..9f0c88782 100644 --- a/mods/ITEMS/mcl_potions/functions.lua +++ b/mods/ITEMS/mcl_potions/functions.lua @@ -132,17 +132,10 @@ minetest.register_globalstep(function(dtime) if player:get_pos() then mcl_potions._add_spawner(player, "#225533") end if EF.poisoned[player].hit_timer >= EF.poisoned[player].step then - - if entity and entity._cmi_is_mob then - entity.health = math.max(entity.health - 1, 1) - EF.poisoned[player].hit_timer = 0 - elseif is_player then - player:set_hp( math.max(player:get_hp() - 1, 1), { type = "punch", other = "poison"}) - EF.poisoned[player].hit_timer = 0 - else -- if not player or mob then remove - EF.poisoned[player] = nil + if mcl_util.get_hp(player) - 1 > 0 then + mcl_util.deal_damage(player, 1, {type = "magic"}) end - + EF.poisoned[player].hit_timer = 0 end if EF.poisoned[player] and EF.poisoned[player].timer >= EF.poisoned[player].dur then @@ -721,12 +714,7 @@ function mcl_potions.healing_func(player, hp) hp = -1 end - if obj and obj._cmi_is_mob then - obj.health = obj.health + hp - elseif player:is_player() then - player:set_hp(player:get_hp() + hp, { type = "punch", other = "harming" }) - end - + mcl_util.deal_damage(obj, -hp, {type = "magic"}) end end From c9b4ddb9237330be28542b90c6ec94f20dc2a1a6 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 18 Apr 2021 20:22:18 +0200 Subject: [PATCH 052/136] Add command damage type (This is Non-MC) --- mods/CORE/mcl_damage/init.lua | 1 + mods/MISC/mcl_commands/kill.lua | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/CORE/mcl_damage/init.lua b/mods/CORE/mcl_damage/init.lua index 7f8469c3e..bc5280841 100644 --- a/mods/CORE/mcl_damage/init.lua +++ b/mods/CORE/mcl_damage/init.lua @@ -27,6 +27,7 @@ mcl_damage = { explosion = {is_explosion = true}, cramming = {bypasses_armor = true}, -- unused fireworks = {is_explosion = true}, -- unused + command = {bypasses_armor = true, bypasses_invulnerability = true, bypasses_magic = true}, } } diff --git a/mods/MISC/mcl_commands/kill.lua b/mods/MISC/mcl_commands/kill.lua index 2de69e6a0..3eac565d6 100644 --- a/mods/MISC/mcl_commands/kill.lua +++ b/mods/MISC/mcl_commands/kill.lua @@ -31,7 +31,7 @@ local function handle_kill_command(suspect, victim) mcl_death_messages.player_damage(victimref, msg) end -- DIE! - victimref:set_hp(0) + victimref:set_hp(0, {_mcl_type = "command"}) -- Log if not suspect == victim then minetest.log("action", string.format("%s killed %s using /kill", suspect, victim)) @@ -56,4 +56,4 @@ minetest.register_chatcommand("kill", { return handle_kill_command(name, param) end end, -}) \ No newline at end of file +}) From aa533edda230403ca1a7daf9a097927fc2c2ac5b Mon Sep 17 00:00:00 2001 From: NO11 Date: Sun, 18 Apr 2021 18:28:39 +0000 Subject: [PATCH 053/136] Simplify debarking --- mods/ITEMS/mcl_tools/init.lua | 88 ++++++++++++++--------------------- 1 file changed, 36 insertions(+), 52 deletions(-) diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index cdc981b2a..bb9a4873c 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -360,59 +360,43 @@ local make_stripped_trunk_add_wear = function(itemstack, placer) itemstack:add_wear(wear) end end + +local stripped_table = { + {"mcl_core:tree", "mcl_core:stripped_oak"}, + {"mcl_core:darktree", "mcl_core:stripped_dark_oak"}, + {"mcl_core:acaciatree", "mcl_core:stripped_acacia"}, + {"mcl_core:birchtree", "mcl_core:stripped_birch"}, + {"mcl_core:sprucetree", "mcl_core:stripped_spruce"}, + {"mcl_core:jungletree", "mcl_core:stripped_jungle"}, + {"mcl_core:tree_bark", "mcl_core:stripped_oak_bark"}, + {"mcl_core:darktree_bark", "mcl_core:stripped_dark_oak_bark"}, + {"mcl_core:acaciatree_bark", "mcl_core:stripped_acacia_bark"}, + {"mcl_core:birchtree_bark", "mcl_core:stripped_birch_bark"}, + {"mcl_core:sprucetree_bark", "mcl_core:stripped_spruce_bark"}, + {"mcl_core:jungletree_bark", "mcl_core:stripped_jungle_bark"}, +} + local make_stripped_trunk = function(itemstack, placer, pointed_thing) - if pointed_thing.type == "node" then - local pos = minetest.get_pointed_thing_position(pointed_thing) - local node = minetest.get_node(pos) - local node_name = node.name - if placer and not placer:get_player_control().sneak then - if minetest.registered_nodes[node_name] and minetest.registered_nodes[node_name].on_rightclick then - return minetest.registered_nodes[node_name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack - end - end - if minetest.is_protected(pointed_thing.under, placer:get_player_name()) then - minetest.record_protection_violation(pointed_thing.under, placer:get_player_name()) - return itemstack - end - if node_name == "mcl_core:tree" then - minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_oak", param2=node.param2}) - make_stripped_trunk_add_wear(itemstack, placer) - elseif node_name == "mcl_core:darktree" then - minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_dark_oak", param2=node.param2}) - make_stripped_trunk_add_wear(itemstack, placer) - elseif node_name == "mcl_core:acaciatree" then - minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_acacia", param2=node.param2}) - make_stripped_trunk_add_wear(itemstack, placer) - elseif node_name == "mcl_core:birchtree" then - minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_birch", param2=node.param2}) - make_stripped_trunk_add_wear(itemstack, placer) - elseif node_name == "mcl_core:sprucetree" then - minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_spruce", param2=node.param2}) - make_stripped_trunk_add_wear(itemstack, placer) - elseif node_name == "mcl_core:jungletree" then - minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_jungle", param2=node.param2}) - make_stripped_trunk_add_wear(itemstack, placer) - elseif node_name == "mcl_core:tree_bark" then - minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_oak_bark"}) - make_stripped_trunk_add_wear(itemstack, placer) - elseif node_name == "mcl_core:darktree_bark" then - minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_dark_oak_bark"}) - make_stripped_trunk_add_wear(itemstack, placer) - elseif node_name == "mcl_core:acaciatree_bark" then - minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_acacia_bark"}) - make_stripped_trunk_add_wear(itemstack, placer) - elseif node_name == "mcl_core:birchtree_bark" then - minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_birch_bark"}) - make_stripped_trunk_add_wear(itemstack, placer) - elseif node_name == "mcl_core:sprucetree_bark" then - minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_spruce_bark"}) - make_stripped_trunk_add_wear(itemstack, placer) - elseif node_name == "mcl_core:jungletree_bark" then - minetest.swap_node(pointed_thing.under, {name="mcl_core:stripped_jungle_bark"}) - make_stripped_trunk_add_wear(itemstack, placer) - end - end - return itemstack + if pointed_thing.type ~= "node" then return end + + local node = minetest.get_node(pointed_thing.under) + local noddef = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name] + + if not placer:get_player_control().sneak and noddef.on_rightclick then + return minetest.item_place(itemstack, placer, pointed_thing) + end + if minetest.is_protected(pointed_thing.under, placer:get_player_name()) then + minetest.record_protection_violation(pointed_thing.under, placer:get_player_name()) + return itemstack + end + + for _, st in pairs(stripped_table) do + if noddef.name == st[1] then + minetest.swap_node(pointed_thing.under, {name=st[2], param2=node.param2}) + make_stripped_trunk_add_wear(itemstack, placer) + end + end + return itemstack end minetest.register_tool("mcl_tools:axe_wood", { From 44a25de12fdd3743db6f84b05d0fa591d8578596 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sun, 18 Apr 2021 23:18:18 -0400 Subject: [PATCH 054/136] Fix crashing with unknown slot description when enchanting --- mods/ITEMS/mcl_enchanting/engine.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index 037134e4c..f3bfea12b 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -502,7 +502,7 @@ function mcl_enchanting.show_enchanting_formspec(player) local hover_ending = (can_enchant and "_hovered" or "_off") formspec = formspec .. "container[3.2," .. y .. "]" - .. (slot and "tooltip[button_" .. i .. ";" .. C(mcl_colors.GRAY) .. F(slot.description) .. " " .. C(mcl_colors.WHITE) .. " . . . ?\n\n" .. (enough_levels and C(enough_lapis and mcl_colors.GRAY or mcl_colors.RED) .. F(S("@1 Lapis Lazuli", i)) .. "\n" .. C(mcl_colors.GRAY) .. F(S("@1 Enchantment Levels", i)) or C(mcl_colors.RED) .. F(S("Level requirement: @1", slot.level_requirement))) .. "]" or "") + .. (slot and "tooltip[button_" .. i .. ";" .. C(mcl_colors.GRAY) .. ((slot.description and F(slot.description)) or "") .. " " .. C(mcl_colors.WHITE) .. " . . . ?\n\n" .. (enough_levels and C(enough_lapis and mcl_colors.GRAY or mcl_colors.RED) .. F(S("@1 Lapis Lazuli", i)) .. "\n" .. C(mcl_colors.GRAY) .. F(S("@1 Enchantment Levels", i)) or C(mcl_colors.RED) .. F(S("Level requirement: @1", slot.level_requirement))) .. "]" or "") .. "style[button_" .. i .. ";bgimg=mcl_enchanting_button" .. ending .. ".png;bgimg_hovered=mcl_enchanting_button" .. hover_ending .. ".png;bgimg_pressed=mcl_enchanting_button" .. hover_ending .. ".png]" .. "button[0,0;7.5,1.3;button_" .. i .. ";]" .. (slot and "image[0,0;1.3,1.3;mcl_enchanting_number_" .. i .. ending .. ".png]" or "") From c03717139b6dfb0f86fd9f0506b545befae7f89d Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sun, 18 Apr 2021 23:23:07 -0400 Subject: [PATCH 055/136] Add mod.conf to mcl_fireworks --- mods/ITEMS/mcl_fireworks/mod.conf | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 mods/ITEMS/mcl_fireworks/mod.conf diff --git a/mods/ITEMS/mcl_fireworks/mod.conf b/mods/ITEMS/mcl_fireworks/mod.conf new file mode 100644 index 000000000..cf9e34e91 --- /dev/null +++ b/mods/ITEMS/mcl_fireworks/mod.conf @@ -0,0 +1,2 @@ +name = mcl_fireworks +description = Adds fun fireworks to the game which players can use. \ No newline at end of file From 0c5ca70187fb4f168f2da5ea76ef2c40e61ebeff Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 19 Apr 2021 07:35:53 +0000 Subject: [PATCH 056/136] remove wrong config --- mods/ITEMS/mcl_fireworks/config.txt | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 mods/ITEMS/mcl_fireworks/config.txt diff --git a/mods/ITEMS/mcl_fireworks/config.txt b/mods/ITEMS/mcl_fireworks/config.txt deleted file mode 100644 index 5a12a1f52..000000000 --- a/mods/ITEMS/mcl_fireworks/config.txt +++ /dev/null @@ -1,2 +0,0 @@ -name = mcl_firework -author = NO11, j45 From 69485f8505a7beccb9d4cec7ab6fc3f31e93eab3 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 19 Apr 2021 09:49:29 +0200 Subject: [PATCH 057/136] Integrate falling nodes damage --- mods/ENTITIES/mcl_falling_nodes/init.lua | 102 ++++++----------------- 1 file changed, 27 insertions(+), 75 deletions(-) diff --git a/mods/ENTITIES/mcl_falling_nodes/init.lua b/mods/ENTITIES/mcl_falling_nodes/init.lua index 6e69f8911..831434d62 100644 --- a/mods/ENTITIES/mcl_falling_nodes/init.lua +++ b/mods/ENTITIES/mcl_falling_nodes/init.lua @@ -2,8 +2,6 @@ local S = minetest.get_translator("mcl_falling_nodes") local dmes = minetest.get_modpath("mcl_death_messages") ~= nil local has_mcl_armor = minetest.get_modpath("mcl_armor") -local is_creative_enabled = minetest.is_creative_enabled - local get_falling_depth = function(self) if not self._startpos then -- Fallback @@ -23,80 +21,34 @@ local deal_falling_damage = function(self, dtime) -- Fallback self._startpos = pos end - local objs = minetest.get_objects_inside_radius(pos, 1) - for _,v in ipairs(objs) do - if v:is_player() then - local hp = v:get_hp() - local name = v:get_player_name() - if hp ~= 0 then - if not self._hit_players then - self._hit_players = {} - end - local hit = false - for _,v in ipairs(self._hit_players) do - if name == v then - hit = true + self._hit = self._hit or {} + for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do + if mcl_util.get_hp(obj) > 0 and not self._hit[obj] then + self._hit[obj] = true + local way = self._startpos.y - pos.y + local damage = (way - 1) * 2 + damage = math.min(40, math.max(0, damage)) + if damage >= 1 then + -- Reduce damage if wearing a helmet + local inv = mcl_util.get_inventory(obj) + if inv then + local helmet = inv:get_stack("armor", 2) + if minetest.get_item_group(helmet:get_name(), "combat_armor") > 0 then + damage = damage / 4 * 3 + mcl_util.use_item_durability(helmet, 1) + inv:set_stack("armor", 2, helmet) end end - if not hit then - table.insert(self._hit_players, name) - local way = self._startpos.y - pos.y - local damage = (way - 1) * 2 - damage = math.min(40, math.max(0, damage)) - if damage >= 1 then - hp = hp - damage - if hp < 0 then - hp = 0 - end - -- Reduce damage if wearing a helmet - local inv = v:get_inventory() - local helmet = inv:get_stack("armor", 2) - if has_mcl_armor and not helmet:is_empty() then - hp = hp/4*3 - if not is_creative_enabled(name) then - helmet:add_wear(65535/helmet:get_definition().groups.mcl_armor_uses) --TODO: be sure damage is exactly like mc (informations are missing in the mc wiki) - inv:set_stack("armor", 2, helmet) - end - end - local msg - if minetest.get_item_group(self.node.name, "anvil") ~= 0 then - msg = S("@1 was smashed by a falling anvil.", v:get_player_name()) - else - msg = S("@1 was smashed by a falling block.", v:get_player_name()) - end - if dmes then - mcl_death_messages.player_damage(v, msg) - end - v:set_hp(hp, { type = "punch", from = "mod" }) - end + local deathmsg, dmg_type + if minetest.get_item_group(self.node.name, "anvil") ~= 0 then + deathmsg, dmg_type = "@1 was smashed by a falling anvil.", "anvil" + else + deathmsg, dmg_type = "@1 was smashed by a falling block.", "falling_node" end - end - else - local hp = v:get_luaentity().health - if hp and hp ~= 0 then - if not self._hit_mobs then - self._hit_mobs = {} - end - local hit = false - for _,mob in ipairs(self._hit_mobs) do - if v == mob then - hit = true - end - end - --TODO: reduce damage for mobs then they will be able to wear armor - if not hit then - table.insert(self._hit_mobs, v) - local way = self._startpos.y - pos.y - local damage = (way - 1) * 2 - damage = math.min(40, math.max(0, damage)) - if damage >= 1 then - hp = hp - damage - if hp < 0 then - hp = 0 - end - v:get_luaentity().health = hp - end + if obj:is_player() then + mcl_death_messages.player_damage(obj, S(deathmsg, obj:get_player_name())) end + mcl_util.deal_damage(obj, damage, {type = dmg_type}) end end end @@ -166,7 +118,7 @@ minetest.register_entity(":__builtin:falling_node", { on_activate = function(self, staticdata) self.object:set_armor_groups({immortal = 1}) - + local ds = minetest.deserialize(staticdata) if ds then self._startpos = ds._startpos @@ -200,7 +152,7 @@ minetest.register_entity(":__builtin:falling_node", { local np = {x = pos.x, y = pos.y + 0.3, z = pos.z} local n2 = minetest.get_node(np) if n2.name == "mcl_portals:portal_end" then - -- TODO: Teleport falling node. + -- TODO: Teleport falling node. self.object:remove() return end @@ -239,7 +191,7 @@ minetest.register_entity(":__builtin:falling_node", { end local nd = minetest.registered_nodes[n2.name] if n2.name == "mcl_portals:portal_end" then - -- TODO: Teleport falling node. + -- TODO: Teleport falling node. elseif (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 From d8d4cb5defcbe1ca1b71100441cc6636557752c8 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 19 Apr 2021 14:44:20 +0200 Subject: [PATCH 058/136] Revert color changes to GUI. The Minecraft colorset (net.minecraft.util.text.TextFormatting) is only used for chat and tooltips. This partically reverts 84819bf9f5164ab208b7be1e94d142906359a1af. --- mods/ENTITIES/mobs_mc/mod.conf | 2 +- mods/ENTITIES/mobs_mc/villager.lua | 18 ++++++++--------- mods/HELP/doc/doc/init.lua | 10 +++++----- mods/HELP/doc/doc/mod.conf | 1 - mods/HELP/mcl_craftguide/init.lua | 2 +- mods/HUD/awards/api.lua | 4 ++-- mods/HUD/mcl_inventory/creative.lua | 2 +- mods/HUD/mcl_inventory/init.lua | 4 ++-- mods/HUD/mcl_inventory/mod.conf | 2 +- mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 4 ++-- mods/ITEMS/REDSTONE/mcl_dispensers/mod.conf | 2 +- mods/ITEMS/REDSTONE/mcl_droppers/init.lua | 4 ++-- mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua | 4 ++-- mods/ITEMS/REDSTONE/mcl_droppers/mod.conf | 2 +- mods/ITEMS/mcl_anvils/init.lua | 4 ++-- mods/ITEMS/mcl_anvils/mod.conf | 2 +- mods/ITEMS/mcl_brewing/init.lua | 8 ++++---- mods/ITEMS/mcl_brewing/mod.conf | 2 +- mods/ITEMS/mcl_chests/init.lua | 20 +++++++++---------- mods/ITEMS/mcl_chests/mod.conf | 2 +- mods/ITEMS/mcl_crafting_table/init.lua | 2 +- mods/ITEMS/mcl_enchanting/engine.lua | 8 ++++---- mods/ITEMS/mcl_furnaces/init.lua | 8 ++++---- mods/ITEMS/mcl_furnaces/mod.conf | 2 +- mods/ITEMS/mcl_hoppers/init.lua | 4 ++-- mods/ITEMS/mcl_hoppers/mod.conf | 2 +- 26 files changed, 62 insertions(+), 63 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/mod.conf b/mods/ENTITIES/mobs_mc/mod.conf index a3057faff..98f48b388 100644 --- a/mods/ENTITIES/mobs_mc/mod.conf +++ b/mods/ENTITIES/mobs_mc/mod.conf @@ -1,6 +1,6 @@ name = mobs_mc author = maikerumine description = Adds Minecraft-like monsters and animals. -depends = mcl_init, mcl_particles, mcl_mobs, mcl_wip, mcl_colors +depends = mcl_init, mcl_particles, mcl_mobs, mcl_wip optional_depends = default, mcl_tnt, mcl_bows, mcl_throwing, mcl_fishing, bones, mesecons_materials, mobs_mc_gameconfig, doc_items diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index d251ba823..ab79edfec 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -516,7 +516,7 @@ local function show_trade_formspec(playername, trader, tradenum) "size[9,8.75]" .."background[-0.19,-0.25;9.41,9.49;mobs_mc_trading_formspec_bg.png]" ..disabled_img - .."label[4,0;"..F(minetest.colorize(mcl_colors.DARK_GRAY, S(profession))).."]" + .."label[4,0;"..F(minetest.colorize("#313131", S(profession))).."]" .."list[current_player;main;0,4.5;9,3;9]" .."list[current_player;main;0,7.74;9,1;]" ..b_prev..b_next @@ -1075,8 +1075,8 @@ mobs:register_mob("mobs_mc:villager", { mobs:spawn_specific( -"mobs_mc:villager", -"overworld", +"mobs_mc:villager", +"overworld", "ground", { "FlowerForest", @@ -1096,12 +1096,12 @@ mobs:spawn_specific( "ExtremeHillsM", "BirchForestM", }, -0, -minetest.LIGHT_MAX+1, -30, -20, -4, -mobs_mc.spawn_height.water+1, +0, +minetest.LIGHT_MAX+1, +30, +20, +4, +mobs_mc.spawn_height.water+1, mobs_mc.spawn_height.overworld_max) -- spawn eggs diff --git a/mods/HELP/doc/doc/init.lua b/mods/HELP/doc/doc/init.lua index 9057cda8e..029914a53 100644 --- a/mods/HELP/doc/doc/init.lua +++ b/mods/HELP/doc/doc/init.lua @@ -35,10 +35,10 @@ doc.FORMSPEC.ENTRY_HEIGHT = doc.FORMSPEC.ENTRY_END_Y - doc.FORMSPEC.ENTRY_START_ -- Internal helper variables local DOC_INTRO = S("This is the help.") -local COLOR_NOT_VIEWED = mcl_colors.AQUA -local COLOR_VIEWED = mcl_colors.WHITE -local COLOR_HIDDEN = mcl_colors.GRAY -local COLOR_ERROR = mcl_colors.RED +local COLOR_NOT_VIEWED = "#00FFFF" -- cyan +local COLOR_VIEWED = "#FFFFFF" -- white +local COLOR_HIDDEN = "#999999" -- gray +local COLOR_ERROR = "#FF0000" -- red local CATEGORYFIELDSIZE = { WIDTH = math.ceil(doc.FORMSPEC.WIDTH / 4), @@ -770,7 +770,7 @@ function doc.generate_entry_list(cid, playername) if name == nil or name == "" then name = S("Nameless entry (@1)", eid) if doc.entry_viewed(playername, cid, eid) then - viewedprefix = mcl_colors.RED + viewedprefix = "#FF4444" else viewedprefix = COLOR_ERROR end diff --git a/mods/HELP/doc/doc/mod.conf b/mods/HELP/doc/doc/mod.conf index 54064551b..0f65ddff7 100644 --- a/mods/HELP/doc/doc/mod.conf +++ b/mods/HELP/doc/doc/mod.conf @@ -2,4 +2,3 @@ name = doc author = Wuzzy description = A simple in-game documentation system which enables mods to add help entries based on templates. optional_depends = unified_inventory, sfinv_buttons, central_message, inventory_plus -depends = mcl_colors diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index e10513bc3..d05d8b3d0 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -667,7 +667,7 @@ local function make_formspec(name) fs[#fs + 1] = fmt("label[%f,%f;%s]", sfinv_only and 6.3 or data.iX - 2.2, 0.22, - ESC(colorize(mcl_colors.DARK_GRAY, fmt("%s / %u", data.pagenum, data.pagemax)))) + ESC(colorize("#383838", fmt("%s / %u", data.pagenum, data.pagemax)))) fs[#fs + 1] = fmt([[ image_button[%f,0.12;0.8,0.8;craftguide_prev_icon.png;prev;] diff --git a/mods/HUD/awards/api.lua b/mods/HUD/awards/api.lua index 6601dd626..d795f0dca 100644 --- a/mods/HUD/awards/api.lua +++ b/mods/HUD/awards/api.lua @@ -447,7 +447,7 @@ function awards.getFormspec(name, to, sid) first = false if def.secret and not award.got then - formspec = formspec .. mcl_colors.DARK_GRAY..minetest.formspec_escape(S("(Secret Award)")) + formspec = formspec .. "#707070" .. minetest.formspec_escape(S("(Secret Award)")) else local title = award.name if def and def.title then @@ -456,7 +456,7 @@ function awards.getFormspec(name, to, sid) if award.got then formspec = formspec .. minetest.formspec_escape(title) else - formspec = formspec .. mcl_colors.GRAY.. minetest.formspec_escape(title) + formspec = formspec .. "#ACACAC" .. minetest.formspec_escape(title) end end end diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index a69fcef5b..b3ee40bf7 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -442,7 +442,7 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz end local caption = "" if name ~= "inv" and filtername[name] then - caption = "label[0,1.2;"..F(minetest.colorize(mcl_colors.DARK_GRAY, filtername[name])).."]" + caption = "label[0,1.2;"..F(minetest.colorize("#313131", filtername[name])).."]" end formspec = "size[10,9.3]".. diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index e9da9486e..054424051 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -109,10 +109,10 @@ local function set_inventory(player, armor_change_only) mcl_formspec.get_itemslot_bg(0,3,1,1).. armor_slot_imgs.. -- craft and inventory - "label[0,4;"..F(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4;"..F(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. - "label[4,0.5;"..F(minetest.colorize(mcl_colors.DARK_GRAY, S("Crafting"))).."]".. + "label[4,0.5;"..F(minetest.colorize("#313131", S("Crafting"))).."]".. "list[current_player;craft;4,1;2,2]".. "list[current_player;craftpreview;7,1.5;1,1;]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. diff --git a/mods/HUD/mcl_inventory/mod.conf b/mods/HUD/mcl_inventory/mod.conf index edd6343c7..fa6b2c2f4 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, mcl_colors +depends = mcl_init, mcl_formspec optional_depends = mcl_player, _mcl_autogroup, mcl_armor, mcl_brewing, mcl_potions, mcl_enchanting diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 1fd63cb4d..b6d0d2ef6 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -13,12 +13,12 @@ local S = minetest.get_translator("mcl_dispensers") local setup_dispenser = function(pos) -- Set formspec and inventory local form = "size[9,8.75]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[3,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Dispenser"))).."]".. + "label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dispenser"))).."]".. "list[current_name;main;3,0.5;3,3;]".. mcl_formspec.get_itemslot_bg(3,0.5,3,3).. "listring[current_name;main]".. diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/mod.conf b/mods/ITEMS/REDSTONE/mcl_dispensers/mod.conf index ac1b56c7d..13cdb5f5a 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/mod.conf +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/mod.conf @@ -1,3 +1,3 @@ name = mcl_dispensers -depends = mcl_init, mcl_formspec, mesecons, mcl_sounds, mcl_tnt, mcl_worlds, mcl_core, mcl_nether, mcl_armor_stand, mcl_armor, mcl_colors +depends = mcl_init, mcl_formspec, mesecons, mcl_sounds, mcl_tnt, mcl_worlds, mcl_core, mcl_nether, mcl_armor_stand, mcl_armor optional_depends = doc, screwdriver diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua index 0d41c3552..715a85f3d 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua @@ -14,12 +14,12 @@ local S = minetest.get_translator("mcl_droppers") local setup_dropper = function(pos) -- Set formspec and inventory local form = "size[9,8.75]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[3,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Dropper"))).."]".. + "label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dropper"))).."]".. "list[current_name;main;3,0.5;3,3;]".. mcl_formspec.get_itemslot_bg(3,0.5,3,3).. "listring[current_name;main]".. diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua index b41d9c2fe..1bf968a82 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init_new.lua @@ -15,10 +15,10 @@ local setup_dropper = function(pos) -- Set formspec and inventory local form = "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;crafting_inventory_9_slots.png]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,7.74;9,1;]".. - "label[3,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Dropper"))).."]".. + "label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dropper"))).."]".. "list[current_name;main;3,0.5;3,3;]".. "listring[current_name;main]".. "listring[current_player;main]" diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/mod.conf b/mods/ITEMS/REDSTONE/mcl_droppers/mod.conf index b5cf8f0b7..bbb1c19f2 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/mod.conf +++ b/mods/ITEMS/REDSTONE/mcl_droppers/mod.conf @@ -1,3 +1,3 @@ name = mcl_droppers -depends = mcl_init, mcl_formspec, mesecons, mcl_util, mcl_colors +depends = mcl_init, mcl_formspec, mesecons, mcl_util optional_depends = doc, screwdriver diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index 1845ed776..c3c238e7f 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -16,7 +16,7 @@ local function get_anvil_formspec(set_name) end return "size[9,8.75]".. "background[-0.19,-0.25;9.41,9.49;mcl_anvils_inventory.png]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. @@ -27,7 +27,7 @@ local function get_anvil_formspec(set_name) mcl_formspec.get_itemslot_bg(4,2.5,1,1).. "list[context;output;8,2.5;1,1;]".. mcl_formspec.get_itemslot_bg(8,2.5,1,1).. - "label[3,0.1;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Repair and Name"))).."]".. + "label[3,0.1;"..minetest.formspec_escape(minetest.colorize("#313131", S("Repair and Name"))).."]".. "field[3.25,1;4,1;name;;"..minetest.formspec_escape(set_name).."]".. "field_close_on_enter[name;false]".. "button[7,0.7;2,1;name_button;"..minetest.formspec_escape(S("Set Name")).."]".. diff --git a/mods/ITEMS/mcl_anvils/mod.conf b/mods/ITEMS/mcl_anvils/mod.conf index cbb5dc223..cd4fa02a8 100644 --- a/mods/ITEMS/mcl_anvils/mod.conf +++ b/mods/ITEMS/mcl_anvils/mod.conf @@ -1,5 +1,5 @@ name = mcl_anvils author = Wuzzy description = Anvils mods for MCL2 -depends = mcl_init, mcl_formspec, mcl_sounds, tt, mcl_enchanting, mcl_colors +depends = mcl_init, mcl_formspec, mcl_sounds, tt, mcl_enchanting optional_depends = mcl_core, screwdriver diff --git a/mods/ITEMS/mcl_brewing/init.lua b/mods/ITEMS/mcl_brewing/init.lua index 78ccd8ed9..617929ff7 100644 --- a/mods/ITEMS/mcl_brewing/init.lua +++ b/mods/ITEMS/mcl_brewing/init.lua @@ -4,8 +4,8 @@ local function active_brewing_formspec(fuel_percent, brew_percent) return "size[9,8.75]".. "background[-0.19,-0.25;9.5,9.5;mcl_brewing_inventory.png]".. - "label[4,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Brewing Stand"))).."]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[4,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Brewing Stand"))).."]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.75;9,1;]".. @@ -35,8 +35,8 @@ end local brewing_formspec = "size[9,8.75]".. "background[-0.19,-0.25;9.5,9.5;mcl_brewing_inventory.png]".. - "label[4,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Brewing Stand"))).."]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[4,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Brewing Stand"))).."]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.75;9,1;]".. diff --git a/mods/ITEMS/mcl_brewing/mod.conf b/mods/ITEMS/mcl_brewing/mod.conf index 160319c93..2c27c979e 100644 --- a/mods/ITEMS/mcl_brewing/mod.conf +++ b/mods/ITEMS/mcl_brewing/mod.conf @@ -1,4 +1,4 @@ name = mcl_brewing author = bzoss -depends = mcl_init, mcl_formspec, mcl_sounds, mcl_potions, mcl_mobitems, mcl_colors +depends = mcl_init, mcl_formspec, mcl_sounds, mcl_potions, mcl_mobitems optional_depends = mcl_core, doc, screwdriver diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 05a6d1818..824530eb3 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -475,10 +475,10 @@ minetest.register_node(small_name, { minetest.show_formspec(clicker:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,8.75]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, name)).."]".. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. @@ -624,12 +624,12 @@ minetest.register_node(left_name, { minetest.show_formspec(clicker:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,11.5]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, name)).."]".. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,3.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,3.5,9,3).. - "label[0,7;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,7;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,7.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,7.5,9,3).. "list[current_player;main;0,10.75;9,1;]".. @@ -773,12 +773,12 @@ minetest.register_node("mcl_chests:"..basename.."_right", { "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,11.5]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, name)).."]".. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,3.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,3.5,9,3).. - "label[0,7;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,7;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,7.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,7.5,9,3).. "list[current_player;main;0,10.75;9,1;]".. @@ -986,10 +986,10 @@ minetest.register_node("mcl_chests:ender_chest", { }) local formspec_ender_chest = "size[9,8.75]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Ender Chest"))).."]".. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Ender Chest"))).."]".. "list[current_player;enderchest;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. @@ -1107,10 +1107,10 @@ local function formspec_shulker_box(name) name = S("Shulker Box") end return "size[9,8.75]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, name)).."]".. + "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. "list[current_name;main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. diff --git a/mods/ITEMS/mcl_chests/mod.conf b/mods/ITEMS/mcl_chests/mod.conf index 609b1fff9..0ff5129ca 100644 --- a/mods/ITEMS/mcl_chests/mod.conf +++ b/mods/ITEMS/mcl_chests/mod.conf @@ -1,3 +1,3 @@ name = mcl_chests -depends = mcl_init, mcl_formspec, mcl_core, mcl_sounds, mcl_end, mesecons, mcl_colors +depends = mcl_init, mcl_formspec, mcl_core, mcl_sounds, mcl_end, mesecons optional_depends = doc, screwdriver diff --git a/mods/ITEMS/mcl_crafting_table/init.lua b/mods/ITEMS/mcl_crafting_table/init.lua index 6df4c2544..cbf1cff34 100644 --- a/mods/ITEMS/mcl_crafting_table/init.lua +++ b/mods/ITEMS/mcl_crafting_table/init.lua @@ -2,7 +2,7 @@ local S = minetest.get_translator("mcl_crafting_table") local formspec_escape = minetest.formspec_escape local show_formspec = minetest.show_formspec local C = minetest.colorize -local text_color = mcl_colors.DARK_GRAY +local text_color = "#313131" local itemslot_bg = mcl_formspec.get_itemslot_bg mcl_crafting_table = {} diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index f3bfea12b..3243b7879 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -469,13 +469,13 @@ function mcl_enchanting.show_enchanting_formspec(player) local formspec = "" .. "size[9.07,8.6;]" .. "formspec_version[3]" - .. "label[0,0;" .. C(mcl_colors.DARK_GRAY) .. F(table_name) .. "]" + .. "label[0,0;" .. C("#313131") .. F(table_name) .. "]" .. mcl_formspec.get_itemslot_bg(0.2, 2.4, 1, 1) .. "list[current_player;enchanting_item;0.2,2.4;1,1]" .. mcl_formspec.get_itemslot_bg(1.1, 2.4, 1, 1) .. "image[1.1,2.4;1,1;mcl_enchanting_lapis_background.png]" .. "list[current_player;enchanting_lapis;1.1,2.4;1,1]" - .. "label[0,4;" .. C(mcl_colors.DARK_GRAY) .. F(S("Inventory")).."]" + .. "label[0,4;" .. C("#313131") .. F(S("Inventory")).."]" .. mcl_formspec.get_itemslot_bg(0, 4.5, 9, 3) .. mcl_formspec.get_itemslot_bg(0, 7.74, 9, 1) .. "list[current_player;main;0,4.5;9,3;9]" @@ -502,11 +502,11 @@ function mcl_enchanting.show_enchanting_formspec(player) local hover_ending = (can_enchant and "_hovered" or "_off") formspec = formspec .. "container[3.2," .. y .. "]" - .. (slot and "tooltip[button_" .. i .. ";" .. C(mcl_colors.GRAY) .. ((slot.description and F(slot.description)) or "") .. " " .. C(mcl_colors.WHITE) .. " . . . ?\n\n" .. (enough_levels and C(enough_lapis and mcl_colors.GRAY or mcl_colors.RED) .. F(S("@1 Lapis Lazuli", i)) .. "\n" .. C(mcl_colors.GRAY) .. F(S("@1 Enchantment Levels", i)) or C(mcl_colors.RED) .. F(S("Level requirement: @1", slot.level_requirement))) .. "]" or "") + .. (slot and "tooltip[button_" .. i .. ";" .. C("#818181") .. ((slot.description and F(slot.description)) or "") .. " " .. C("#FFFFFF") .. " . . . ?\n\n" .. (enough_levels and C(enough_lapis and "#818181" or "#FC5454") .. F(S("@1 Lapis Lazuli", i)) .. "\n" .. C("#818181") .. F(S("@1 Enchantment Levels", i)) or C("#FC5454") .. F(S("Level requirement: @1", slot.level_requirement))) .. "]" or "") .. "style[button_" .. i .. ";bgimg=mcl_enchanting_button" .. ending .. ".png;bgimg_hovered=mcl_enchanting_button" .. hover_ending .. ".png;bgimg_pressed=mcl_enchanting_button" .. hover_ending .. ".png]" .. "button[0,0;7.5,1.3;button_" .. i .. ";]" .. (slot and "image[0,0;1.3,1.3;mcl_enchanting_number_" .. i .. ending .. ".png]" or "") - .. (slot and "label[7.2,1.1;" .. C(can_enchant and mcl_colors.GREEN or mcl_colors.DARK_GREEN) .. slot.level_requirement .. "]" or "") + .. (slot and "label[7.2,1.1;" .. C(can_enchant and "#80FF20" or "#407F10") .. slot.level_requirement .. "]" or "") .. (slot and slot.glyphs or "") .. "container_end[]" y = y + 1.35 diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index 02a104bc5..af2a60952 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -9,12 +9,12 @@ local LIGHT_ACTIVE_FURNACE = 13 local function active_formspec(fuel_percent, item_percent) return "size[9,8.75]".. - "label[0,4;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[2.75,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Furnace"))).."]".. + "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Furnace"))).."]".. "list[current_name;src;2.75,0.5;1,1;]".. mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. "list[current_name;fuel;2.75,2.5;1,1;]".. @@ -38,12 +38,12 @@ local function active_formspec(fuel_percent, item_percent) end local inactive_formspec = "size[9,8.75]".. - "label[0,4;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[2.75,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Furnace"))).."]".. + "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Furnace"))).."]".. "list[current_name;src;2.75,0.5;1,1;]".. mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. "list[current_name;fuel;2.75,2.5;1,1;]".. diff --git a/mods/ITEMS/mcl_furnaces/mod.conf b/mods/ITEMS/mcl_furnaces/mod.conf index 99a1ad0bf..fe0b9c208 100644 --- a/mods/ITEMS/mcl_furnaces/mod.conf +++ b/mods/ITEMS/mcl_furnaces/mod.conf @@ -1,3 +1,3 @@ name = mcl_furnaces -depends = mcl_init, mcl_formspec, mcl_core, mcl_sounds, mcl_craftguide, mcl_achievements, mcl_particles, mcl_colors +depends = mcl_init, mcl_formspec, mcl_core, mcl_sounds, mcl_craftguide, mcl_achievements, mcl_particles optional_depends = doc, screwdriver diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index e9f6ddf92..eaff8f83d 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -4,10 +4,10 @@ local S = minetest.get_translator("mcl_hoppers") local mcl_hoppers_formspec = "size[9,7]".. - "label[2,0;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Hopper"))).."]".. + "label[2,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Hopper"))).."]".. "list[current_name;main;2,0.5;5,1;]".. mcl_formspec.get_itemslot_bg(2,0.5,5,1).. - "label[0,2;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))).."]".. + "label[0,2;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,2.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,2.5,9,3).. "list[current_player;main;0,5.74;9,1;]".. diff --git a/mods/ITEMS/mcl_hoppers/mod.conf b/mods/ITEMS/mcl_hoppers/mod.conf index 53f514f39..c89292f6b 100644 --- a/mods/ITEMS/mcl_hoppers/mod.conf +++ b/mods/ITEMS/mcl_hoppers/mod.conf @@ -1,4 +1,4 @@ name = mcl_hoppers description = It's just a clone of Minecraft hoppers, functions nearly identical to them minus mesecons making them stop and the way they're placed. -depends = mcl_core, mcl_formspec, mcl_sounds, mcl_util, mcl_colors +depends = mcl_core, mcl_formspec, mcl_sounds, mcl_util optional_depends = doc, screwdriver From 7efc177188b1f6dc2d03704ca9a032a7e7ee5480 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 19 Apr 2021 15:16:59 +0200 Subject: [PATCH 059/136] Revert minecraft color set usage in mcl_books and mcl_skins GUI menus. (Follow-up of d8d4cb5defcbe1ca1b71100441cc6636557752c8) Reverts a2fcd28a3dcbf1aaa07c9f2c21ba7cd3872b7cd4 and partially reverts f8a627915e17779bec1a52fe867877036c043f72. --- mods/ITEMS/mcl_books/init.lua | 6 +++--- mods/ITEMS/mcl_books/mod.conf | 2 +- mods/PLAYER/mcl_skins/init.lua | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index 5101994e9..144cce1b4 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -67,7 +67,7 @@ local make_description = function(title, author, generation) else desc = S("Tattered Book") end - desc = desc .. "\n" .. minetest.colorize(mcl_colors.GRAY, S("by @1", author)) + desc = desc .. "\n" .. minetest.colorize("#AAAAAA", S("by @1", author)) return desc end @@ -147,8 +147,8 @@ minetest.register_on_player_receive_fields(function ( player, formname, fields ) local formspec = "size[8,9]".. header.. "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]".. - "field[0.75,1;7.25,1;title;"..minetest.formspec_escape(minetest.colorize(mcl_colors.BLACK, S("Enter book title:")))..";]".. - "label[0.75,1.5;"..minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("by @1", name))).."]".. + "field[0.75,1;7.25,1;title;"..minetest.formspec_escape(minetest.colorize("#000000", S("Enter book title:")))..";]".. + "label[0.75,1.5;"..minetest.formspec_escape(minetest.colorize("#404040", S("by @1", name))).."]".. "button_exit[0.75,7.95;3,1;sign;"..minetest.formspec_escape(S("Sign and Close")).."]".. "tooltip[sign;"..minetest.formspec_escape(S("Note: The book will no longer be editable after signing")).."]".. "button[4.25,7.95;3,1;cancel;"..minetest.formspec_escape(S("Cancel")).."]" diff --git a/mods/ITEMS/mcl_books/mod.conf b/mods/ITEMS/mcl_books/mod.conf index cea9a5dd8..7c4513b00 100644 --- a/mods/ITEMS/mcl_books/mod.conf +++ b/mods/ITEMS/mcl_books/mod.conf @@ -1,4 +1,4 @@ name = mcl_books author = celeron55 description = Books mod for MCL2 -optional_depends = mcl_init, mcl_core, mcl_sounds, mcl_mobitems, mcl_dye, mcl_colors +optional_depends = mcl_init, mcl_core, mcl_sounds, mcl_mobitems, mcl_dye diff --git a/mods/PLAYER/mcl_skins/init.lua b/mods/PLAYER/mcl_skins/init.lua index 297817fac..0b508adc6 100644 --- a/mods/PLAYER/mcl_skins/init.lua +++ b/mods/PLAYER/mcl_skins/init.lua @@ -239,7 +239,7 @@ end) mcl_skins.show_formspec = function(playername) local formspec = "size[7,8.5]" - formspec = formspec .. "label[2,2;" .. minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Select player skin:"))) .. "]" + formspec = formspec .. "label[2,2;" .. minetest.formspec_escape(minetest.colorize("#383838", S("Select player skin:"))) .. "]" .. "textlist[0,2.5;6.8,6;skins_set;" local meta @@ -267,7 +267,7 @@ mcl_skins.show_formspec = function(playername) if meta then if meta.name and meta.name ~= "" then - formspec = formspec .. "label[2,0.5;" .. minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Name: @1", meta.name))) .. "]" + formspec = formspec .. "label[2,0.5;" .. minetest.formspec_escape(minetest.colorize("#383838", S("Name: @1", meta.name))) .. "]" end end From c80b1c5140ad7870f4a2eb5c1dea521e12b74778 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 19 Apr 2021 15:19:59 +0200 Subject: [PATCH 060/136] Re-add usage of mcl_colors.GRAY to book descriptions --- mods/ITEMS/mcl_books/init.lua | 2 +- mods/ITEMS/mcl_books/mod.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index 144cce1b4..95b45e69e 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -67,7 +67,7 @@ local make_description = function(title, author, generation) else desc = S("Tattered Book") end - desc = desc .. "\n" .. minetest.colorize("#AAAAAA", S("by @1", author)) + desc = desc .. "\n" .. minetest.colorize(mcl_colors.GRAY, S("by @1", author)) return desc end diff --git a/mods/ITEMS/mcl_books/mod.conf b/mods/ITEMS/mcl_books/mod.conf index 7c4513b00..cea9a5dd8 100644 --- a/mods/ITEMS/mcl_books/mod.conf +++ b/mods/ITEMS/mcl_books/mod.conf @@ -1,4 +1,4 @@ name = mcl_books author = celeron55 description = Books mod for MCL2 -optional_depends = mcl_init, mcl_core, mcl_sounds, mcl_mobitems, mcl_dye +optional_depends = mcl_init, mcl_core, mcl_sounds, mcl_mobitems, mcl_dye, mcl_colors From 20a4e038f56b374c3a8f348bb2ffce7fdab93923 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 19 Apr 2021 17:40:50 +0200 Subject: [PATCH 061/136] Fix crash when slain by named mob --- mods/HUD/mcl_death_messages/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/HUD/mcl_death_messages/init.lua b/mods/HUD/mcl_death_messages/init.lua index 8ca686701..6fd7e0c93 100644 --- a/mods/HUD/mcl_death_messages/init.lua +++ b/mods/HUD/mcl_death_messages/init.lua @@ -193,7 +193,7 @@ minetest.register_on_dieplayer(function(player, reason) -- Player was slain by potions if not hitter then return end - + local hittername, hittertype, hittersubtype, shooter local hitter_toolname = get_tool_name(hitter:get_wielded_item()) @@ -222,7 +222,7 @@ minetest.register_on_dieplayer(function(player, reason) end hittersubtype = hitter:get_luaentity().name if hittername then - msg = dmsg("murder", name, hittername) + msg = dmsg("murder_hand", name, hittername) elseif hittersubtype ~= nil and hittersubtype ~= "" then msg = mmsg(hittersubtype, name) else @@ -304,4 +304,4 @@ function mcl_death_messages.player_damage(player, message) if dmg_sequence_number >= 65535 then dmg_sequence_number = 0 end -end \ No newline at end of file +end From e8c15867ad805cb994efa24aacb9bc033d830644 Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 19 Apr 2021 16:50:21 +0000 Subject: [PATCH 062/136] Add mcl_stripped_varient node def --- mods/ITEMS/mcl_core/nodes_trees.lua | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_trees.lua b/mods/ITEMS/mcl_core/nodes_trees.lua index d2c5443d3..801810dbd 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) +local register_tree_trunk = function(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, @@ -22,6 +22,7 @@ local register_tree_trunk = function(subname, description_trunk, description_bar on_rotate = on_rotate, _mcl_blast_resistance = 2, _mcl_hardness = 2, + _mcl_stripped_varient = stripped_varient, }) minetest.register_node("mcl_core:"..subname.."_bark", { @@ -37,6 +38,7 @@ local register_tree_trunk = function(subname, description_trunk, description_bar on_rotate = on_rotate, _mcl_blast_resistance = 2, _mcl_hardness = 2, + _mcl_stripped_varient = stripped_varient.."_bark", }) minetest.register_craft({ @@ -214,12 +216,12 @@ end --------------------- -register_tree_trunk("tree", S("Oak Wood"), S("Oak Bark"), S("The trunk of an oak tree."), "default_tree_top.png", "default_tree.png") -register_tree_trunk("darktree", S("Dark Oak Wood"), S("Dark Oak Bark"), S("The trunk of a dark oak tree."), "mcl_core_log_big_oak_top.png", "mcl_core_log_big_oak.png") -register_tree_trunk("acaciatree", S("Acacia Wood"), S("Acacia Bark"), S("The trunk of an acacia."), "default_acacia_tree_top.png", "default_acacia_tree.png") -register_tree_trunk("sprucetree", S("Spruce Wood"), S("Spruce Bark"), S("The trunk of a spruce tree."), "mcl_core_log_spruce_top.png", "mcl_core_log_spruce.png") -register_tree_trunk("birchtree", S("Birch Wood"), S("Birch Bark"), S("The trunk of a birch tree."), "mcl_core_log_birch_top.png", "mcl_core_log_birch.png") -register_tree_trunk("jungletree", S("Jungle Wood"), S("Jungle Bark"), S("The trunk of a jungle tree."), "default_jungletree_top.png", "default_jungletree.png") +register_tree_trunk("tree", S("Oak Wood"), S("Oak Bark"), S("The trunk of an oak tree."), "default_tree_top.png", "default_tree.png", "mcl_core:stripped_oak") +register_tree_trunk("darktree", S("Dark Oak Wood"), S("Dark Oak Bark"), S("The trunk of a dark oak tree."), "mcl_core_log_big_oak_top.png", "mcl_core_log_big_oak.png", "mcl_core:stripped_dark_oak") +register_tree_trunk("acaciatree", S("Acacia Wood"), S("Acacia Bark"), S("The trunk of an acacia."), "default_acacia_tree_top.png", "default_acacia_tree.png", "mcl_core:stripped_acacia") +register_tree_trunk("sprucetree", S("Spruce Wood"), S("Spruce Bark"), S("The trunk of a spruce tree."), "mcl_core_log_spruce_top.png", "mcl_core_log_spruce.png", "mcl_core:stripped_spruce") +register_tree_trunk("birchtree", S("Birch Wood"), S("Birch Bark"), S("The trunk of a birch tree."), "mcl_core_log_birch_top.png", "mcl_core_log_birch.png", "mcl_core:stripped_birch") +register_tree_trunk("jungletree", S("Jungle Wood"), S("Jungle Bark"), S("The trunk of a jungle tree."), "default_jungletree_top.png", "default_jungletree.png", "mcl_core:stripped_jungle") register_stripped_trunk("stripped_oak", S("Stripped Oak Log"), S("Stripped Oak Wood"), S("The stripped trunk of an oak tree."), "mcl_core_stripped_oak_top.png", "mcl_core_stripped_oak_side.png") register_stripped_trunk("stripped_acacia", S("Stripped Acacia Log"), S("Stripped Acacia Wood"), S("The stripped trunk of an acacia tree."), "mcl_core_stripped_acacia_top.png", "mcl_core_stripped_acacia_side.png") From 7a5ce1c7172fa21c007ce8d45eddaf88c91debf0 Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 19 Apr 2021 16:53:48 +0000 Subject: [PATCH 063/136] Simplify debarking again --- mods/ITEMS/mcl_tools/init.lua | 41 ++++++++++------------------------- 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index bb9a4873c..809a49279 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -352,30 +352,6 @@ minetest.register_tool("mcl_tools:shovel_diamond", { }) -- Axes -local make_stripped_trunk_add_wear = function(itemstack, placer) - if not minetest.is_creative_enabled(placer:get_player_name()) then - -- Add wear (as if digging a axey node) - local toolname = itemstack:get_name() - local wear = mcl_autogroup.get_wear(toolname, "axey") - itemstack:add_wear(wear) - end -end - -local stripped_table = { - {"mcl_core:tree", "mcl_core:stripped_oak"}, - {"mcl_core:darktree", "mcl_core:stripped_dark_oak"}, - {"mcl_core:acaciatree", "mcl_core:stripped_acacia"}, - {"mcl_core:birchtree", "mcl_core:stripped_birch"}, - {"mcl_core:sprucetree", "mcl_core:stripped_spruce"}, - {"mcl_core:jungletree", "mcl_core:stripped_jungle"}, - {"mcl_core:tree_bark", "mcl_core:stripped_oak_bark"}, - {"mcl_core:darktree_bark", "mcl_core:stripped_dark_oak_bark"}, - {"mcl_core:acaciatree_bark", "mcl_core:stripped_acacia_bark"}, - {"mcl_core:birchtree_bark", "mcl_core:stripped_birch_bark"}, - {"mcl_core:sprucetree_bark", "mcl_core:stripped_spruce_bark"}, - {"mcl_core:jungletree_bark", "mcl_core:stripped_jungle_bark"}, -} - local make_stripped_trunk = function(itemstack, placer, pointed_thing) if pointed_thing.type ~= "node" then return end @@ -390,12 +366,17 @@ local make_stripped_trunk = function(itemstack, placer, pointed_thing) return itemstack end - for _, st in pairs(stripped_table) do - if noddef.name == st[1] then - minetest.swap_node(pointed_thing.under, {name=st[2], param2=node.param2}) - make_stripped_trunk_add_wear(itemstack, placer) - end - end + if noddef._mcl_stripped_varient == nil then + return itemstack + else + minetest.swap_node(pointed_thing.under, {name=noddef._mcl_stripped_varient, param2=node.param2}) + if not minetest.is_creative_enabled(placer:get_player_name()) then + -- Add wear (as if digging a axey node) + local toolname = itemstack:get_name() + local wear = mcl_autogroup.get_wear(toolname, "axey") + itemstack:add_wear(wear) + end + end return itemstack end From 4c250914309da4226aa36efad50ab0a2757fa0d6 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 19 Apr 2021 19:12:32 +0200 Subject: [PATCH 064/136] Fix syntax error in mcl_inventory --- mods/HUD/mcl_inventory/creative.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 43a818f6a..61ba39b10 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"} From 9c3fcae9e13acdce172fe7768e26765312929c8c Mon Sep 17 00:00:00 2001 From: epCode Date: Mon, 19 Apr 2021 13:02:12 -0700 Subject: [PATCH 065/136] Fix many things with player animation and update alex --- .../mcl_armor/models/mcl_armor_character.b3d | Bin 453135 -> 493300 bytes .../models/mcl_armor_character.blend | Bin 1208948 -> 1210268 bytes .../models/mcl_armor_character_female.b3d | Bin 453135 -> 493300 bytes .../models/mcl_armor_character_female.blend | Bin 1210620 -> 1210092 bytes mods/PLAYER/mcl_playerplus/init.lua | 12 ++++++------ 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_armor/models/mcl_armor_character.b3d b/mods/ITEMS/mcl_armor/models/mcl_armor_character.b3d index c8dce36a80df34cae8d810f3454d6e39b059bdcc..95f763eab25205397a85236cb0f610212481e585 100644 GIT binary patch literal 493300 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
Eo&XH{5;ds4fqsH)cS!0t^eq4ob%Nawz)(*MK^ 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 _@%^c`?a1T9`lek~p^tIb>;>O8- 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
}7HxN$Yz@$lV*If*r& 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 C+gEb{ diff --git a/mods/ITEMS/mcl_armor/models/mcl_armor_character.blend b/mods/ITEMS/mcl_armor/models/mcl_armor_character.blend index c2b330c6c960b5cc84ed3a81421383e25787795f..a5626aaccb7fefd5eed3164226a0dc78c9a3f317 100644 GIT binary patch delta 122374 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%0DeQKyGKJ=Sbcm4 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 diff --git a/mods/ITEMS/mcl_armor/models/mcl_armor_character_female.b3d b/mods/ITEMS/mcl_armor/models/mcl_armor_character_female.b3d index 59b867574058fb8df8952ec7fa6b10ff6c84aed6..1b4205344e2ca724be8fa876718a321e7ea83139 100644 GIT binary patch literal 493300 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
  • Uwr+$UEpyD*AF4$f_B3Qb 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

    jf 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 z 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 delta 145468 zcmc${33wD$xAX$NNS^*^jiX$kvMg;{039=*zYAYbb zC?_fiC`epT5Vga|s;KQc;5Jcl!DWoQ=%`Ua{_k4pZn*c(d~@&f#RpHHQ}6HH&U=vz-h};(x*-zGwE=pkNzz9KmN-J_v^@9XcIwQ1H1 zqpaEYmzLQzrRVmlnOIh^dF|L0mNoDG(sTSZrDLIJ?6A#`oO_35%>jzOH4{e{)NGt! zZ{B#`GOMQKya8CSdES7jB-jq{*UO$F#I|o98TTvfMdy=Y1Cl1pJ%lR5w}n^cmOf-CR*~(6Xs2W?}93_V@|s*J_Dd6T16rd*m5s-mE1+v*LTZ?5wkH z)e_L_-raW1h&6p{E?DGjuDXAx)vD@-8xGH3un_;%ocUm0&8P+T=Bjlm=h;|sch*|z zslgi>TFinPbi03X5~h(GYLjN&`Jy$_8F~3tmkbSewyci>c7aKnWh}>9YR#+8>-?v- zUD8@2vHpeb>qAWbs}v%F{@foQwhS3j0N;846D!#$bEi*J9>J}9|@t2cknO*H#rkKJctA(&AZPluynV4kRscL9D z&=8fZoec(>1E*W5=C&lObq3{uk6sU5v(S%x31_w>S)DVqNJ+9amyRMGBdAZLRi&+OpE64zz_GwGJQ<)x+dBGpVhW zo$Y^=8c^Nn`>DHWI>Zf1)5ykM+%r7^DTaCkz&9wXJnrs*-dOB|?uQX-+$9 zUy9Al-D}UH4uVoseWf)tx$b0WYM@bhJ~lbv+s%p09qP_9YqqvL+3Y#rcG8gzP$=6V zY5;i>XTCYcdedWngRsYx*}ID_r2ZjvHJHQf8$I^R=h==;_N948#6dO-zR5cL28Qal1&f!a7QG1iw!JlmI>S(=^Vo3#r zz9-+gn6if&OYfyV&mHJhKx1W$g$@Zfd7Z4mPUzQ_FwjlwWGzME*%@^|XHku6TJbnH zGfI&J9CECc?$C8JKg&wDtDuiHWnHWhHqsiav(>qWcErjCJ5~HUXEY4FkZ~JPY-wi@ zJ9E3$#_YJ;>5~2ni*_YV6Va5S=)NYHZlySM-Aqac(f5o3fqP4jDq7hbA^H~--7W)$ z_W3Zh=Tw;vF++RfPppQfkJ@sE$$YsvVACbpTh^buxlQ){}@XR?R^7wM(gD(U1725F&vHREUcZ$P+8G{25?6sWWSyB*U`BN+ zXi_f-q8qC7`eX#9*=RcM2@V=cx!FMP>Y9yrwX)6REbLJb!BMAC3bDId<4bzAj&UZzWXN1pWhec--z<- zaEgbmK+^n;ET2-YfmQD&IOfJ&tD{3iEc}H(^-$D<()JY%wMBoC8;U?`y8+g4hc2N3 z?UNN1T!C(!Kj5g{jS{IL+C(Fwg|==N^QN>nbT^T+xDmM5cA*J`LWm@)y9wSeh7k0N zfzaKACNfkNSE!Pzw9tJFWvLII1klK&qeGQcp%HW&XhAHwXK^nQg|CZMm`Kh3t}x3b zE~a-rbXviSnL5IFI#LN9=Jn(9-ba}l+(Fg0sZ zp>v^M&7BKnsUNzK*_LC<{Sf_9(rX{<&AOD`U0f<@L0doKp)cpYdM%ZS zVj7F`(HQf3D!d6Z)g>S|gpH--f!M|ploqRLNO}%RWx!qVJl$`FR$+MFQVNqwqULcH z?>cdu9qup$wekj9<*Hg~EQW-o29!(f5F`Jj(7N|Yn!6}AkccEY@>g>VGAr|27i*!} zKGaGW7`lY3*qs&2ASeKpN#+1UmW}bB5xJD1@lA&iO`%s8ywr9dT z0|RtnQpI9khFLK*X;ygta0oGzxze)zIe~D8kycT1a`|s>@g2(VkeW$zMZELbKf$^um6nU3&NOu^ zF}iUMxc-szEyoenTeO^sJ(QCARF`At*(yz(x#6x>RZIc3YmO)S)J%-gU9n zIkhp4y73phbl_rZK?eN0)+WYRwse z-UIMUqE)1OorC#$(~Eo;K?5MKfA#J8dQ*<1gE_6pgVfw|nKd}s-7WWY&!OYM*MrT@ zw*qZ@xCKpI9XEi3fn|d7lr;1L(1%OQtt2Z+*5};Ura;}Ed$~2(8rfKxLiJr&noVpl z;L8E38b1TS(XZ~sXVdl28eXu{>&ECmY z_Qk>>3{d3aR;}e2tdsN(PE`~2S-d8ZgS|U)Oi51_ zeqAIzOUiwcAH`KX#l2S;ZI$$PVR#i2xD}EHnE}?+M6g?}o=;2n+`{7E%6NLhF_C9K`O)W__eVWml) zYNPH4P%b>_AjT;EH1lUdZ8Tv6G@I~eXeU+TOwf{l5-e*SR^qPj5&(uj36@Ch6&m3# z78`uV6FcU55X*TMdmrLiEdDgRzDUTnv5lM3IT$24F!{zV^<*n?4EU4sX8&C4GABYk zK-Xn0&U0Lxk_%OLprX9_rqVh&PaF0VGWCUo{zAwYRCKq0N9!C??6XYQYFLVxQ)Rgh z(U@DRzJp9F=UwgBl>e%SM(?T#QN(sDHrHn>7lR= zv6u3Ct}KbamXba%VRx+5t%M)SotgwV8KO>r7{f4Yi+LO``h+Jgu!2dcIzl}L7by;D zq}sOBx~Hp)Kf!vv1QhhAkZa7E1BrvHOKelW%o-)5RB|;|$OBkQAf=mGR&8ZE!Pyv` z&3X4ARE3vMFg3XNtXP}ZQG$>=1+I9r=O%JN13az_Z+#u4AfWGTN zl~kb>a~P^DkAM!r2V9_V_5h(&q}GXYJOWvg1$BX@Iz(#njMY9vR4g3sxd&egzGg4z0YqVV=Z45!K3_&kqTK)O79SWSGno{VuJYWI`L| zIp3PQVY+#1b>86Q^82B+0WV6iRdqIZ++&p_YWbf`yAJ-2ot5bbTm*&S3yIeEf+=Mq z{W+#!g*Dzs^i3K=Z-9&>&9w zCh@Gq#b83#ALv_bGpRf0#@>9T(a=FEugDE#o2euH7bjI!$n`$ z{4K@Gs4i)Ty+a!Que*8e0jsU~<8QDo*X4L8(e(BEdzmhK;D%w!)zB<6FSJ_Y)ogRs z)mB1O_IcNTj2UyE^{f5ISD+aT9AD82s+oF;WjmtoM3_RO;^5c_8PKj3-2c+A{cEk7 zR8k!-mPk8}RHC-PYm)hLoz*HOQcaaIQaWBY-|G^yAAsI6)VCVq7|2J4!HSN4`=6uM z74n?Fp>asMKH{aMf~5^YNw|q!gN~9)-zAv8PPQr&e0!;*V!To`(FBTvk;ajgO}Xe&E5X9l#HGuqVMyPai&f zPO0!Tz2>y2Y<8$#ZTvVl|F26%oAsZ8L$h-?NYLQws+l~}zc4Cj#5JC)CabG3D9Sd# z0?&YG|3H}h$+Ujd8dK@3d;Q(~6Hzbt%MyM1Vy5BU{6`_+;WyijWi8e=LImI+mQ@vJ zZ+p7`TY{JLv4apbNCDS2NAttq8bMMHeO~W5E#{)-#qHxRC*0RKz-)XBR+IXAmcvt- zBP+iIPCTH9xT zr%w6PVJ>wxqmFm-QQOte{=TL3L%aU4cG6Gm9{ke%*3-U^w*D0x4O;Sh(A}c=dri(Z ztDF1Z8#L&|l9J^=WSPF(trDO-3>)(emwA0t&lmg#Jr~Y+&!x;r= z7nZMT>2CS9FXL|o{0C5WiQuo#{e4ULc)R{R!T+O2NlD+go(m4%DkBcM07jh2NySGR|EzWP6s?c= z`dkI|SpxNm^+t9>efsLGr_b4P^!oe+;sNXaOo@jTfG@tlu7^&Q@V&s2v8H;r^|$1) zLq0Da5NIq}ms?VDwwdxA7?h|Tg1kp(Okc;JdcgC^#7Mex$~$o z?3F^J+$oK6hU1>#89MO+Cwc~z`;wK=neFoIw8c)epY5Fd64)6TB6dPNR| z%iQzokp?A+L0ExoP||DA)eJjYy`5khUbDJaR(70M>{~b^f7S9|w^1DWMr}TXG1Y-5 zhg+BbTIkFCZ41!>L5_KShp)VBurKwsLUh8=*RL<$x%#C+%fB5_g!t#4IIZZJeJ5?t zd+|EzW#8G?w(#zcXBS^z*dLd<=uZa|z?*J!S}dSpJ_Ro6g`098Do*Ql?9K(IY!58Y zdzHF8=ugE_Zgz9<+Gw-M`vjiwV|B9CkL-nN44!&)vnyT)v#ZeTjWg=kqIvXJ)sM_h zVYBPd9Vh;_WggPOUxsx&Dz4FA{7p8DEjJF>uRn9jWcX7}-8xvDNYmV563h4cpL44o*;y@o3>(Ae$a zQt-w(R+OijAwV*gWz@+ z@4H?O+h19e{PyA4yQGbuTMm_lfun8NwD>^xefNH6on;O_VY`X9ftuxq^}f%UIFBBq zpoH8~_c*M_S&m!3ishV_5y_VA0|#Ui&L?~e*oZ0KzYK1dg$taOFhIZa2Hlhe%(V6X zuHMaHyYP1htQ{8ICVqFHb-q3A+n5`>QFo!rsLrN~U;&_R&#k zWXgIcbmK^y_%qxTl2nsd=5L=t+ZRONm0%`Rf-g%J3VmkNYi-XYTvw#ia-|FY$o7%F zCixd@bcPlwNu7`o)XYT^Em9KqpUj1z<{Ko@A|)vo5`vluO+cbWN)q}(e2t{$RV2|O zC5Z?Zf||l#fkcaxq+C2fP_qF^v`9%@ty~h6@f(n6k&*=aaQze1EI|@2Qj$6$A*eZo zBwC~-jbaf&&6MAPM2nOpA^}EF^FESjk&-~Q(H}w0$b;4xjwWh8BMw>PQ(cM9%YhDS zpQCi!A?r$bVz+6g|1u7M2E7DPtE9vk{zoj#lYdwjnW>K@w8hPjuyLPOP$1feo2tWB zqD@P4)Ucj8Z2iSrify%RC$FvQ9DA|j_JHmVTkPKO+m?THz^0WsLSE?j|6+z+=kHKm zlHima=%@|7864{Bfv;1+6yss^Y zeRBhg-MR88U^m+XKYon=?0^%boqU^?*#pgx4j{J%b_wL9$*zE=i+FcH*0r3D`?Uiv zbjZ`B;NAFGdfGYmd8rD~oySeI{f+MUukYw@ok4l1620Ci5Bv#dMqUE@ptVRz8dM8n zRo%zwoS{WZ5)=}Gnir8oi#d&kJTb2sS^@~YPk3kw!x!2%iC$Lbc)N` z#;l2-*_H-2XpxeXZ($OGng>C8h88JFMLm-c)Z}#XgMw0|Bz2NkXtRRH(_n-vgqcvN zbczcKj`*3Cz&b;Vlq4csrU+{0UIrvuq$DBPRYp*ge5^lxjFc!v#Z7F2B2~Yxfz{Yj zJqIeC;xxWUf|(1PZHzeDojy{Dm06}AYlE4=>WEK+(%XjJx+4Xr(rayUB+}+^p-_bD zJC+d2Nu!JFv#hn1k}VX9s8}F%C7e_SS1)Z27YaoLuV;kH(%54}bsLZ&6pCn?&j^*J zT5){rMTAf&qOOV&DofiMBR1idb)is%yO0qoOCy^RWVui%A}Cd?vb3>MNE)(3C=^lK zB%OtD(x7JV($;&SP(;Y$`cPSlU>WVua-mQ}a2ng8veI-r69ztOB@~J%7vHHYihJmn zSjIGbu_4a85y`78Z9&|q^6;gDI7F?yLZh-YO1J@$UsA{U(k$YHeHHQKeoT42_Y=wW5?Jr0lB~RBS4ZX#>hW4qh z^h!yJ6sxkqzvE??$1MuOgS#{;HooxCQ&N#`xHDIH0Ca=w~M|L&X@u^gGIB5eu$Co;ZcKm6AK8O!34W-GO|_Xw!D2KhvZQ^EWvxntXz=aL%8A zg+q#(S5Ni7$r}N|Q|G}-LvEoOtxli`Ch%70Xv0@$knyM=_WNc^5S-wymq?d1=&%W) zmZ+ZR1SwS`+!mpguw}EU@D0v2Oz|N z12V!Fp5dPdtp+uW^Mctk-=FL7yqexTk|@y5+G{N`W#!KM#xiI%XG^P*G?*k>w@0yJ zcLHXjOmkb~MQt;ktaQvrU5~WkJTVJ@Gn!17GSBpOOvAiJ4zbh2yTust z3;Z2yel3XZW4^oy?qlx2`zW*goY zX_1oD$%K)hbVrk+MM~0C!CVMxaxR5?3N2ESe9=XrI#Bu&@?vg!lumJV;ydDJRw8RH zQj$iwO;o7I+P9N_>g|fsDX!^vo;?shlZ^KwTBIbkZMfzL%6Bwcq$KrMud;==wXb|ZPrdI9|l!?X#`<`Zdad#1sWS;FQC#?dm zP?}K+h03UC!w8k7A;FbE_Z>o^i2N2ZqZCeB{Upoe;XGF;6j6S)#Efv#+GDL~W-Jtn zsFzn{RhC*#NHY!QZt<_ml0^WjU5Ef z*Ok30!bI@0b4r2qygJZFYPl!YMx+jn2@tR6gvo73vtqKpNBXrgXV)~9$D&Xg4kq55 zT}pKzigbXh;hZTnXUE@BBOW0k?;<7)b9S7r5H}jbk=l%WBajh(W-5$vHp-nR z_7A$-3oM(dX~K@A1}5wo;bX4D`3FhBS^F5PK$KLagNCa^jnT1CV^C|I+Z4~c9+G*N zq>&8Kx0~u~a(Bb*Q;JpL&~b1XCtmRG68?;;ieOjH6DOQ^t+3LiNYO4b2MBSAo_5g% zoL9h&3Sz>C=HV?C>UOjlSD_lL4xkwUhJiRnBRHnn!gY@5!W&@z)kn0|v^(eB6CkDf zV*907EeQ2Q?LNB!?Z=IGoEpMX)XJ1u z&dUy;`Elc|{%0MY_rN@}eGhej*035(27(0c3vXNmhCVETscDX=*$+ivVDjym6sxMi zzNk#jVl)(gMj7hnaXy5Q@Hb1)P$^P$1epVbxbQ5IZZd+){J+{Hc-M3or4bdLP>lwo zcJWo6dk0Rg>77ZMDc*et%oOj$nPO08H5EED{FFQ2aalayh}_8y!p(+P`J-lvlkbF? zqJq8Y1@(Y5Q-sG131;<60XHK}I4e<;Ea(uJj^-GvMM_c;ka>bYwR80OzVKE;GoeuF z6xSdlIPs%1M#gH9N0P{_6{@WJCE!!x<`vrpp;KJbL>|D2pLrjSFBz*vN)kMdC))~b zW<5AYYo$|Mnygn5KQq$6>`#l7q~Rc+XF*W2x5kDi0#c+T`PZ<51U1`$%UCT^k~DFT zLRG=;R;=wxr?@7WN)bPkQ;XA6DN+&*AA*`qci5dBDl%3Mto0zVSqZqDkc5|x!xf9$ z#H?MDdm-E@XbjEoghCPdli5z?q!meC=h=Z!C}P~zdug+dWc0Y<1SjXw#BHdbmM zCQyKTB_G_QqO`ekJ<{T;P$*)YOb}I+x{49xs<4A!=o^sj}3$ zjG)_w_=&CDR;ettgF~GrYeJ!RL}bFQvOKM@sqw@%Zc1PN5%+ub!bt<1wW6Br3 zw{n%MEJd)d_M+uNp@?#+K$WEku>)^SghCNb-MJT5S?VipTO>m$6rugL%F-HS1lFL9 zJv&cRJ@(R?nTXEh(SBd&1+I((+Gi-=m>_I!xYxk>Es>S}-s!Vto+@c*01szwKBQ4& zrWEU_7d(l^vwLyO#Glb)CL$qEoXmmqVZ~(7YX6?3=^_YIGijy0)}~+86YbyOomYHB zo@ldBnjs)p^Vxm=uajm7aFzm7q$HIdF~U^nI=lj-T4%Fyt$%+yWl43h5thd~Uq24ygq*l_%Ao2QO^c&4}GFv$Dt7;*- z3X||mGxuJ9fq8Y4eWscE2+UOI0^CTX;)-ne#tk@8LDo16KiM+lH~P~HRaI3z_i!=?D})F=Ixl`a>Rm=pp2#8>9-VSgvfW(9Fc5D}(q zw+$<%^?0|1ri6E$>J03Sv3%lp_8Eoh9nV{Rc$8Bwl2@XDEt}asL*MgcM%d!{RcWqiWE(}(RSkU>gN~-EDp^^ z;_!`MU?J*6)Ar=hC_ZS1-#R<=m4ASpeJ5NT__cpQVNk4AFVHj<_^WqxBIOMLIzyx> zN!I|}PA7fi@17Cd%UiTGjhq4UfsZ=|^`Lk!IpxTB9|c##E5AWs;Lj*u1kd6;F$z!k z4t*g->I>oxkPt#mX$yGqs^02!Z|#KqWW+bT%^v{2N|BO8P$S?RL?}I`3b%CvmSvNsbi0HIZl)U( z0$TTLfUq9W6G~7TM!zCu4YjcjrCWqQ?hb;r=0iyTD(p z<*;w5aN-@YFPues@%WvkGZ;VLeYifJsYO1Y$h~tFzS{`o~YQ&>|(Nm4!U!H2-!W(IO>j$a#n6;siC-$VH2k zq)tc(YLeRrU=3V~lq6U#H%d~j6Ndf?U&h`A37z6DLWldYB`gqLFaCp2SlGfqfqROeq=GTT*ptx58v zp&Nm?`EcDKo_Q)Ksv&HG=s-g^0z#oO%BNpPr-`X7t!s82%~gd$5owi-P+3~_j5vU| zKtiF2^84rTk)*;&BY}KxNQO`-B28{cJy{X}j3608p@?yR@LjFSQmv?-XbVKPP$(iI z2MVez^_3v-HcKcJ5$rpHwu`7NjRDrG8fWQ3p@<5}t1PbuF%tNeG!9WGd6lL0LGj8p z7>8((yvowZr+yMyGKKs^R!+%933wssh5#^G+bk< z8G=yV#ofl5MbJg2qy^gM;p^aT=wS*G#kzSiP)iy*pZj6=LhNnvh1}%ei+l{Pd*aV< z3{L4LJ3U2+wDS&5MB89-x2hK#i6$G1U&)Uys z5IN|naFPXil5O6<7a;SG4cyOlB@Ijr@HlgP6IyH!~K42D6YM>SG~wLRc5HKYPlJl z5!eKZ@LyjmN|9Td6`3cB=(EVDyg9x6bJ?6e+w3_mkeDKr-i<>gs!n$)%dVDqP?IzF2@NM zx^j z!6Hw_ezOIzcL+B7lqjswde~aQB2UI1`YT}P2)1Bw6jo?G>|KIIo{UZ23fPMoYjsCs zr>+jP?96l??ry;$KgMNj1KbF~_3)e|gdT8(08ualbG8F;fB<`XKq2&iD+P!Q8CbXj zfazl8k5{#6S6$MLYer~2?7f0To{Sy26R@^m7nenONN7FmD#0R8QFwy{W=2e4LUcv{ zwf8I$4j#un!Vx8jC67Xw=17!|40TVU?;G^FGka+?Cguny5DF9@|fGL~6YoAF~b@U7rLJ#N;U9uUlPYQP7Dr*4yLkK;_2CjSp%uDJGef_=x zQ4)pF1HLanWXM2>NY_+n1@5tq^=uR>5A}hdkXsaLO>aPT_E19Qp*|E8a*IN3Iw5e6 z*|@@XtMjwTy6!^g0ryO%fz(y8S5lw8+FlCFJWzk5&J5UQSau-IM6R-P2CQx#Ihr7n zTtR!>_6j#u=kw!X46^P6ZrI5^?k)9)j_Bye>RcvoDcHyZh~>R%m}BpA30Waqbls9?N~g5=Aw$ zd~O4{cjwvY-fqaH-)mE2{3|Gr%lpCwxpNbru*EZ-?VRj*#|pq>@S!k3#>`;uv(C-QePQ}|Gjs%$nnCHX*1Yv@r)&0xIDG`} zvDdMk}8K7F8F4JDxvjLyRkh*26v{ zSmY`0*aRoz+`2Y!w{-%GKQ~UiKs*-D3JYY-k+y6dOhxCsX+c#!9vA3B?16U+7@0D7 z^#cG-Z$NN-D-mK3{G5Q1DTAB31Qupq1*1Gx!`V_Dm`4AZ`FX8?`{+2kgqz3xdEt&y znY)`ASm-~S`nWFUU=Iw{E9005$Yb(?FhSKyeP>*t3$=%SSl*d0bu-F36p^WUl}&AB_Vp2kWe)WcO8}z?3Lb-Tteuk7+`5 zsohFvv-$p9XkpvqB3xv6GXEwVQ5Tju;$GOkavq4BJP`(y_#hX055GrNZILhI$FBmN z+l~hYb0z_U`0haf9)rEY02wob$*X}u<^Y zT=p@%j=J-1CnGz)qY#wGN?c0Ok0dZg<_P`ASMh&7QAAAnMtC!yO zkLdZ05PRTv1dL3hB(Hc8!B5A5h1dhXD_~^G;H~Q%I6z7!v?*r9I=_oY0?7S?(0lmz z1dn_f|H=c-LjP{)e@+XW?yVLGnFre^Fl5KDee0ct?f(7;ck^#S-;Uk=Tc)re(7fg# zD38ng!UefAm#^!bg{eD)3l0#-1^-gaq@uvdo<4%~IDH_TPy%y0_@J{8&Pte292oAQ zgvvvGC@AE{sHBGhwbV>0i9!jLhr(4Ps81KUF)IBLK)qh_9-bLOW zRXtqP#Zg@>b@3?;=%!C?^f?5r+Cq8E`ZeU~&pf!uX=OHE34_em@<3|#*85`?O+$~$ zrb0<07xAKL=n`+yv_1zGOMzWhwk(=9O+7&=6os8;dOkRg7Ku^s_Uuw=Hn^hDqNS7(V5!v zRl0bBi1<5@00ekMh~x=?Cx1lc^@(yKiEE~B8JEZBRfHFQc(QJ69&=WuC(!m`ur)KZ z>2q+=c{}d96PHhj$%8!3TN#dgoXmO;1l~5EK%{`5$@mX`BWwZi#7$@W*Ojw|o zCzt!^uui(}_ksPOp+|sU;ET?S%f0L3axX6~_wr()mv`g%CC24jqW#eVTgBy*;_}Hc z`DC?FJi>?E1HYI&^x=}X;eA7r=LKb@Xyg@et!XQ;;oSUKfGFhAi$aobO$s#&Y)$Cs zyx$jqhbXF0>q?69r~)6lJUWjqkItjZqx0zU=sa2&oks(s^JrjmzOpr0*j&)shZaWX z(Zc3Do^XwATVn>*A&aEW6Q~(SU&ok=&WnLeUkOKMi-jHovCzwlg)H7xTUVu>ugA>k6OgI+)&wp+m2sLFL zoZab22#P5%as}s!p&2+c@TUDB(!#^Q-RW{oX+x+IU|ATxlx(KX3Y6Io2>@OLV5MPz z>>^k^;>}mpW|+@6^%>MQbfoi||iPpA_`f%$sjwj*&Am_hD|-+d3S zwx*gTa|7u%ZS$blTcsj&OM^Z#)~N(lg!ybPRKSkd34?o~%mgJ3UL{t}gp}rBg$+Hq z0>)tlfCKcaX6R=8!{}HI8HK9D+^NXo{U=~Oe#5-Lda#$nET(FP;<`3f4N^x}%{0yv zSF`ddSn38Y1?IuN{vPJ}s=%p7R5j}34nuxaeS%kQLf0}s)@pA`LMPMZhQQPIkmiS_ z{UjDK<)^mvYg&f{+Vk0VvA<>KSS5oqI3Gb_=GBD|Kc&hq!|gBp25_1s2Ru=V+l8() zB{v0nrwExh%SLj3^15e1pq1(Ih%?YkUf~Qg={E-^*mRZV)`)}8mDm~P@tXs0JIr=T zC~$GQXr-pRSeM{ha)Bx9l(4`oy9N9SM>X4tYr$*y^y$ayy!IKZeQD@KUkj)z{*CPk zO8%r)CA$N~DooLeYn|G;>)`1IyqMpMC(CpNpLILm&Vbf#Ub{7Lx*6X&p|$CDpM8?q z^Qn_&c6M_L1G=aBN!Oq8YGktL&GpfP-+WgeL1T`Zy8jIl=E>k+c zRXS`Kh2h@3HZRb@j9&sb17_9SsbIgq5uY0cB zdi|;zI`i&=OFw#Y{KU%Q#rtmChSx9qJ*Rkb?zy|3y#7jP##P0L{~9oV6n_ZkCHtyA z240^7{x5*Rd8>09*`X9JR~DZUdbMa=+f$3~xoP?iP-4g9 zaBSfG?5nrA>uZWYiK0<&b$+VXSNSFTKDn(Blqmf3+G)j;hGjhS{gx|+fD%K-cN$xi zG9$Nm{M%1Ix#j)^eSIHqEjYKsr%(4edt;H4a$LX7XWsVgML$12$!|0o!eZ&$7^K`Zzl=nH@UsYm`TgW4a(B9r%Z!uO_RS)eLActTR~A7^yf zQ9R_s?Z@Qp+3tT}<`CA>=i9n($|<*3CYAWUDJd*$J${$T?V6Bg?CL;{jU8C?wmJjb z>Sl#o-yXQohWk$X^cL=|duTcAtuy$hQa zDMUAdl_Lw@MyKy5C8i5orKy!XVa>UCvX&MpNkmAP9i7jmMM}~nBn0L2xwJ@0vP6G^ z^4siMq$D9BA*dOIhiGY$lBhQbYNi2+Lq&X)lu~PL3~ABP+k}U=Ta6+>_dcb`DTE{fI}O=F zp@<5H5h{zc0j)x4FYnIqp=JYQ^rS9dbgUGRCDbLS?D1 z7(sRjg(B+Y)i9Ms`fD5Don>){9cgP&S@|)6Nc+UFz3}@V%3j^W4yD(Wr7?LE$1|Z( zfnfbpM2tdkolL@)c?;4{l3_>ENCl5+!8tfkH18LdVjcQI*TZEwR)~HBQ@ut|$P+8? zSfMJ*W|pvn{CGrrYTiB+zCZ*0KmQ%BynX25!-LGTYXZH^*His&c;Y~3q-CRieEQG{ z<$>0w>Y;#ZzVGSJDvXHD>I3RnfVp-wYCCxi)e=`r`-?t@s7HD!dm|*NJC7BORH`@V zj3p^mgZXOIF+^NITbPj)Pa%T6^2n19A#%9$qpjVleoO>_nyM~UAs!vmvDH@S6zKEy z33cY`O#iXzVG&G;J4c@BS@|&(wtm+0A;AI%vPV=Xjo!2_AWGhO!L~asoP#kdQzllS9J4<$(`svPM{6^5m zp^j~mhB-|cO0Muwh+)JwJn1?($0Z;TZ+16Zz)>x_42J*Oa11!U4c%8ZZA_5 zO3NxPn4P}$>y>8H6Y~aaKf(8CVRf4qi_jSl53PCTjSl`Hh2t`x`SSNwJAYYUJ*4}? zzGr?hU4|TM4xQ&8Zg%bpB>gJ_!{6-+tg`~ko|$3Zo9CQmV?glfGX_qdNerhy7f7<5 z2!B);$LkAUgz>r-$Lm@dm&Z-w4dL~YHeSa0$XVQ_xMOj=rj3iuXV55Ehq(xKT5)d{ zQz6un5;e+EY6Rw?TZ@#WHiNrh=0^w7XpxdcgoL1c5RDcoNrh|*C#ae7GHip_A|)x8 z_k|UT^+JCM?|UO~CKM>0;?!Hj&%6(;9V+7ST&bBA{6AqlO!xVqP8`qG$2xvAT*$sw zdi5A-WoT3r3Pl7jiLEX54(mhXxlkygLh>q0EoKD0!W)OElf24Ot=OHk<2?@HUdmdj zEUi|SL30M7P_6PMud+0t*z!Dl*D?-KD|wZrzUFA!bQDBLB3WfAf+MFL?&1~-)v8|d zDl4|Or{PQ{4xz0@WhsK~*o*tV5h2Hp2v`;2$l;CO(%N(|3yqE)&|_*1+LYEiHxxQ| zWZ2&VJQC-u;+?j@!Vh`xOGbW|loko`6RXBI#VN*x-(GDfYo;;$qsBP4v06*kl*WGbh*})eUO*ZL#>fu?1?hVZ@}6i( zgSDdaD%8ibSxQxF_ioXaMtV3t4fD~4-y>WQ7k+X-8ZJf3BD9i8h*fyXCrBbiN)kjJ zfNKPy;U1r1?Xy}q<|1+U{eNH~>TV7^XZLs9JI0{E#=z*_PKZCXz6@3{h8|;|Yu$yT zQkuS=B*%>fXL8R{{suqZil7rgX0RVDb;OTK3f9iL0-43$Pr4aY2pp8CK_n6wN2T=i zxL2RbFPGkp*wLV*MaraBNQfB^N?N2OjdJ`KLHWFAEmD$(D_M|2by)Dhprpe{CKM{2 z;#@gVf%utiDR$?vTBIc9LZVP*J)}jK*zr#26qhxHRU&>SCly$0k&=uP5*5+R`V2q* z#^uaRNR>`;`SOZC@iQxtwH7H!t&k`bxX@pwKX#N>I>j{!j`*464!~NAl%!5i=oQjt z)>p=8t#pcOkiaBR0anDO-tesP4ifWCrcuk5qoi{ z6$+J+RVi8tCyjZr178&r3Pm*DzzCJ42#Py{Lv6NDD5CyGMtHJBD@M?8E)Y@M&lcI(x9ZWh&R~LLh^*gVB|B6W=?_|QXG1Tl3WaK=L!>85`ei}D z1lh(xl&7M~UOOx%;;E<%u{vD~o)bG2)mVy&ThOe6hDVx;cF(YTr02_QP17|nApo+_ zT1cCxqEf1JipYI`V-`SqnZS^D5yneQ)yLVe#6(PKDu#$~PFEY|9Vj_^ zDmth@Oi|M!hiYjyp|c7d9W|6=J3cxCFS8fyiO=qCch3k7V*@n}KES%Vb*P&+HIq`c zfUia!gvZo$S^$#rL3nrfwDBN3lpx1ftE#Gc@Gz^cwG$JA;329|NV&yt=xxI>%<>g! zO(PGo!l8#%VLk~?idAE}93Fduy%r8HLrQWp5`|NYo-WA)PmeeeJnfz;p(JT=11s)6ri#;%AyTS()79|%C!*d=NKQto z@XB0J+#$XOjyU-g*MHzBl>T;Rp=zp{hw@l+wJ4_30taiXP_r?<1m1cn_yp&P6W@ivQ@kSc^GWu5>2ghJU6cY?Vn?)L zIJX#%FJbBA1B8Uv4T3hJI(|iU7lw~VR{0CnWOV^ewt=O(Mtd*qjq_y=MSYaXDFPQ< zB`cJYM#5sic1WphunVMEbq{U9%d|o{u^4nt$9%LOo)$KUGjQy4T6jZ=z0gXRa^>T0 zV>;p&hNGY1=0%E>B!Zd%>mWk;6pGcuY&eC2G^8b5M6k0U8()7x{h20;<=fc+eX_R%p;?)SNXH_Dw^&TJ)c2s zuvg)=T`5*`f_OPxScbvQlz0z@MBzhcVIvLh=NqW+&4DYdj`W40jPk$p$Fp?yi8FQF zL`UWHc`Nh%75)y@~m-*{G&G$u0r#SVI@@vL5KOD@2 zLZuTN9*2=QQkf~}h$o7olujDbZeoWiy(%l-rs*qFC?Y6`#%K>f6_C2}!IfA$@s{Ku^OzGNWn*ngJhW2bT@Zhp%=94qK9Zwsy$caIqanF%5(5T zCHNb7>NP?_-bIY}L=it!LM(A2(q15>W)(bAEa|%2WDayv%)Uu>_vim_)5L5^gD7i(t_4F_RAArpCr=?Gq(OJ^SE39$oE!CJu zXDL>dL$BfG=Fzz)=0TQT5ANZ-vg0Zl_&+>8RFraYUuP~P4Y>0kJU;Xl9_{g=k}Ev& z2E&Q1JU-Mir6D_kHDS%U3+jP%{?W2F${^hB^Z14O+UU6B(U;J6_*~Q=WIJ@}1>+js0_>ZKL&9^Sx{?&qo z+gIIM)UWuKy8hv^{Uwth`MjiL^>M`q%j%0d-=4Yolk@uI%wAT$?fCK+3&$L6DEh6} z>6`Q3S+r};pdU)jC#k!BgXfBcfl%q=cYL+0+Y9YVPq0^)!2YE0;gH?QPtOZGFS5_F zF#vGp@=o~l#Ww8hiQG^G1u%FoweG)l2>Fi=Yp7JU8Pf8 zt>8$4nRc$-(QK@-?Xg;}bP=Ibyz=+?p2od~-U6)BDK1MYk@(S(#2H$oB;$mHpr#bg z4bIRaB?$=$LCq{6Dbyk*X%rHLs)F6ESOtkrc18(AN&6){4Lcy3pQLKw>DU~MJE&O0 zh-;-97a-#fDz1~fa?*Nt(VM(18i#O~aL}tPjUcWcnlT84YLzc}l|{TExEYa$<9{5Y zT=FVQwJImAXpRwwsFl3RQp*`ZbBs7dMDi+&v;nOcL7!uYLo`WVWl>`U1lKt&K*k}) z-NwFBS?ViB(4v}9sITfJud;&DWGQI)qaAUGw52RVWvO==L5qVzp)!J!S6ONYw*ZQg zI7EfyRhDYS2zq)Rhp3ah%F>_@VMKFW#UUCbud>KT;9W+PVeG~sYNfkXS)`4JpgNB` z4LKrtm8HIFB(12<;}F`Vd$P2bB?Q*FjR=`n3Yb&|MVRfHTqmVKMg*N|xhL@mp$%ID zBPIxu1C0yT-F9|%{5fVbWxge8@b5D1co#=$IxnoE-v|e1CgtzLYf5;IS?5%x(m8

    15>v|$j?^)>n|G_M)`9pHBwyaD`mgX_T`G^Y#Axdl7yyRNahvDb!bh zn5h}iooMuDf}dsZJn;DjZ-M1^#=aH&3xg|BKHb=?fNrJHe+~YP!M}q4rc-4=0*tvk3ad#%3${&jz!v`x={1q5I6}r$Be0(O(e7th&$$ zpM;F2LU)+a{{{MYO=Zrh0Y={wyqCe9!MhmD`SOslPeI3t$&5aZ&(;1kAK%pK4OL%% z@okANeyT3fF}(|9Tm3DVz0De^@)15iCIrSClQA3{cJfuA=OIEhCXM?=8(HaH31!C+2e8|W>-zF)gM(PaYX zaJexl1-J3Hz~p`7o|BAooPFe69b|Av@SXkPSYm$NUC7Y~u=vo_xfR?unCt2kQ)eY~ zcN@J2oel3>=)O1luFx|FY_9^GbBXvSeBMk5JQuoijs7(7)1z{z!i5Jyp((hL75w3M zp`Wpk`tMNNIJs!%7<1-fyuno=Jr~gTeiZ2{Y6JWah#_!y`jbDu4(hXEeU7P#B@@}^ z7eRg6FN7dkb8(L`CX>NA$*JdF_Gdz1uG;gAo{Pk`#J%q>n!si?KA$icn`orOAAScm ziN8Yij!|=c9%tOV0iAWvt@2@G!+r2ogZ}_--4~%A=Q^9>GAc2cduV%uSE2MVn!twh z`dK|E42WC<;aY#=?Z`Lx&}%`oc?F-gEl$~WR72kb{(dS@ z+w6Y8`x}!NVDh5B1w)eN3cA>+xucIXxS1v(djCB>IU|X=gWCndUEGfN4Jch^Y>tQi z1mkBTbX@VQidm~9)r2p+e^&8z;-6B;8oljagEs=CV;v8>F7#)B2vM;IGk_vM}pg+H=*=BW5bJs z?R_nDTzB-t3lY~QF)t>c6Y?&W7l8%}z*vYu&n|~%iP0B8&$UULW5MkNT?CD_;YH>v z5N!^D&7sEr8ECBk<-oVm1U6i9X}b$t0Kv`!E|4dU5pNW@3Rr;`4V!9SO#W%~-1x2i zoxofXwC7^9*?J9{KN>wR8YZ~3TngDERyYv+AcL_iBF~u$yyf6Bpbf7?TxP`F39LOY z6V{$rG%jh{L}9~qK>QItHxmN$3eY5nUkJQk;qqevuU&mi1zrw#-$Fg_OK$L2uEZ?} zuOvTG3pKZW-l`CDX*Ll8^HR0ZUyt3h4{td*i>T&p1J?)fdVId%Z^i{P&5e4JQFAlr zod->Ljphs|=0$}QjhGuaw@qS>`PYQNyeM$;5>Er?Bqip>g{y;@oAa4Q&q??%Ju%~+ z9ZDMnH-FAvR#=QrPDbJwY&aQ-xt(vtpU*XW^{>=IU4!CFjS2Z>29u`^CZ`?kyWw-O z!Hd8zH+Tv70)tt8g+Koxr0Oa_7P0CT;JXq67vqy<#2N5w489Kh27_+|zscZRz;89! z2fx=2 z=vCm?jD8qO|7h^*;AvK}QQJrvB_pJsQA?!249Et-aa?9>t_SCM(w;hwKQYIhWyD$V zHw-R;#te5lvJuL+O##Q6QLzGbe>RxW|J7jX{$wyY>(jmzpKlrbE;xHl{X5`82!ZK? zWyG7n-?tCv-iPovQ$YTq!Q?b#g)#WtZ16|m|1kJt@DB`T`9BT*1pHHjKLe*7{jhvr zLf}!H|16~NIrzT}ZUz6+;IF{HHuxLxFAUxS{++=;f`4!DzrlYn_*?Lw45ok9VOzAJ zU$j3!9NNls#73y!3jQC1e*yo^;AlJC2!VKJkAa^^2>U|dgy;uEI)HaFcxUh;gK5*n z;I8e^KA#4#G7tDY4DJ=eeSrBefHwWXO9Yohb_XA1^m~H$HJEkzz<~Bc!C8la(q?a? z9}d2g;Pik<0l-L8FdBS};F1WRBG8bI#)9u}^z6wvqaP1mY%rf(O%z-rPZ}p1Js*Sc zsS|@>z=s(9Vc=8JMmQY&P=om-$>PDlM;SdIeH=wU2xuFIg2O|61U{J!Vg`Av;F8F6 za6XNq{seG4lqUjrHv07ODCScq8qEUda}-AUE1aKf^n3uwGV0I5=Nv-VPk`s7MoMG&{ zfuCvc9Pnud&jq(OQ-JMrxN}1`efZpMzNx@8TSrF%b9@-YOnjb72+Su^)}Gn1^M+23 zG4>aNA7tz=2EI^mNrZY13H@+B$#b|gQd$AkB^Yvq z=i&2wLimvffX2QH_}Rv05;!wSn@jL{DIxF#=+dK20msqK{9S+#5u*XJo~@&H(Ax)k zN2A<6hwBUd`5*?w3CkfNW=1$9#CwBVo1wt$9D+#8CUJ@}Ivji&^{BvydlL=56!;Pl z^$Wlk8cd!J>1#r`+FN!_;lx~TpZW3& zynFi7hP3bN-|=u_Lh(FR(fFgjcxg(LhAj^##zc#MES)hPw;|APxK!IVC-3^AF#HC7b0Qo z4_ciVid!@)?N81?ooGdRzI1h>|IV)R;nj)dJBLFA_78s~(Z93p7abG(`#hG|)gSg) zqGQATPb40V4LW!ic2YZ|Slep&iopk1+VyPYe%b0o@14UT!(2M;X+0#etszmd^C7$B zQVi^Ocp_2apY=o{x%0*@EYTlesq7a&k?6kjurG5h1N-P)NvB*w&?+<5zdg&C`axPj zyP#vEVZYTSH-5kkXRJva(=I*Y^OwrcfA^U2oN2`OH6JgSoeg7abH~tU0{b_1eJ&55 zF#a&9OB;)4zx7&Rb z4m%2C8+3jHxj^aD+6VsANP9R%;Y@@Z3kMM%f^e#L*nk<<|0%ffw#RJ1;&2awNa2V$ zYy;fz@8=Wubx1Gi)@j^1pLLbNycziNc{;GSeEV4Wq7a^IY{K@mvHGxm*w3X?b{{w7 zr_03u#lY(h87lbIZ!aX)#{LAs8qNIm^Rc4`cw*G<)+fqGhH&Y&T}4luAqLat!-V>o znfTY(%_027ka>Zh&kg?Jpr-PU*A|NY+k?_g<fVo2zfcO&!!8F2K%td^LPzcZ-ggsf532;95cpkJA zl!ROjPMd|`9l);yZwB!}2c0hf=E-{rhzH%PKs@YT0crv*2JxiM=PUf-gA$(B_vSt9 zfe_w=z^I3UMu1*{JO!N5js-FLoj?q(48)*1ff)S$AU;{)X`D}2_JhnIaaoD<12M?{ zAojW=h(WM!chF88e?~*&eL#1^0Z++yfEdjE;C;Y%0qq9r4C)Ko9n=%F3g!L4yMX$G zia-NEd@#b(GarDIK)x5eH~2%~eBi-{B0LMa`dIZEH zIIi#VZ6rQD;mMng?G56C4W5qg1o1Hd9|Q4$#b3ZDgYO064GNF*Jc}~8gLsBr0WcoQ z4dCOzZv*FW+ymlCnrUJs21zIEHJ=ys05J$=V=#!lV^)|g2FYyg31SdDne)lXL}1z; z0Aks2jz7~g62!+bJo7IHF__yyJW=!M2an`@0#X4xKB)Kw#2_YsE(Kl#x(xIzC=GfJ zR0HBOqz6E(^B{;1M)*LBS-B6ik;W@Qbbc3z&l5P2_?&=g!_>kdx5T7ah z9`qV$J&4a0xTHP-v6rLZ;3@ErK^sAQP{H1{fjEJG2GQq#Ku?3d1Tiar2Qe#rit-HC z|KA|^pzlD-K;MFH264Qu1u^{%psztp^G6`A>90WCBR&LiVr~O*0{;qPmiWYk!EXh< z2bzioxwH=hai#qZG@9doFaVt%4$gUS1ZX&jhZ&}eM>_WUNXRYVhk~;gM}c#`@F57Z zaR`VjCJvcdNq}=WJAiX#6oNC`eCopVr$GCnefcuS`zVN_fZ1pV&R(?#-vrJrj+@Le zAZ|v-g18AC2jXUPG>9|062uiW9mJ(}JZL=V1Q65T34XYuWEcrp zE|rrYb2#{*f%Ab+Ntk{tjU#eGVD2FcZSS)!ZRdS4xhGg9`W%|DQG_I zCV-ki7eKzB>%S799*PRkOki%qSAe)_%mGaSodY@$v=YRx(%cI^5p*#y&zjEx^Jxj6 zGfW5Zp$L!cGeFp6CW0UDv(4ZNfs^4|x5r`4|1kvf!DCY!Y7C7;E>?hHN z&Iz4fjE{j(ECFZl8^AfymV-Fa7$7Iw0uY}WoD1TFI~&9mFqSgtS>Qq7qd*LLA!M$k z{egEk#7>O?9Ra!nWmsWp`GyjE!-o^o4DrDO$BDyo0!SJK=M0|(;tXE};H1#uI)9Gn-L9}8;nK{G)ovU|N?z%_Y36r4B}ATFINLEOa-f;<9r zH{_AvgF)OAW`VfbOawm}#9+ADbO-0I$9civIZwDb?FZfybT0hN0xbfa!t~w+;zU^i z&WUp-=rqtJpwmIOgE;Z(K%h6xZUEw9b^x6U zIskMl%1;5m5L5)>+TIy-Fo-ss`P>`!2F-)*MIdfQ*K+*1={!Ou_@m$#fM~>}b{{zB z#c9Co&D9`QUJDum-2@Ql!6XpJcPaGD3VY2?Jpf|XxP-Y`vDZxhL(ns;2c+?_KWG?; zONkSSQIwabxdFKm$SCOll0>2p)lMH5ixP6X0B`mx4G?9tTZ?o>{E`U2n=b ztejuzQ}DsH`V0jSd%rIVxk?bMXv-DDiO1}m z1>yu`w#Iyj|l`91YH;IRgAP@WtTVHD3U6cRK(wm-ZBJF3GFG?*xAtv;uTCOqqrbH$7Y=Y-k{dJyy~Xcg#S=pO?= z5}Xrz8;BGAk08zq-Y=#(o=X8ZamImjBK-&S6sQ_<1Nb6v&W}>?r@{XPY6S5%?KyDX zwml1e2srnW0&uPnAG`_tF7S2Whl6uTcLZ++Kc4r0F9IA31=Dsf_GSje0Y6T#mAzXJSqaQb=^6z4m{w*jIk zcnf?c_(t#*;G8Hwg5CxF24dPPp#Lj4Z^c`{yMi;=UBKT1KOcM(_=DgdfcFCb5PUCi zPTVuW{|5dj_($OF(f}U=bO!$iIHTGOx)t&#;NOEj1APnn6ogx5nIBhyw?by!FAQ;5 z9*6#O@QcB}1gFh6AlCgF^f2^XVGF_OGu;n>jSK_-4xB-30X+cu2k;Ky{|5KKe*$NE znUy;sw}I~i&iS%G_|M>MgcI>;$iIN^3(ko*3Y=MFXMP1WK#p+yQvmHjM}yjdeh=bs za9m^Hdx8o!{O4q_RD*$MnKP$$rRpw1kB z_M!^}L?h#PAUM~4EvOj8@#+Rnr@MmsgE;ONf#{q;a-5l^p5RA-dVuZ#aqnPn86+n< zm-tjrAJB48KaPJnh?~$spaCGJnT@Om9|%sTgFp;|S>OcQ9h@tGOOinj1~H4AXq=$T z+8;neKyBX8NrNyN(3Ve*Ax!@d6PN>n~obhGg zr-L~D$AI<&vG-#^TshnYPXvtzF&K81+2&q@6_=JJbw32|W~)J5tDLzLz?qH7pqoI< z&JCagL7bpdz}YzG&vl?fLChvMp=OjH49*ET75qxj;h-we??CmS!$3c9|L1s}3OWjO z9_UEWBcN#@uJNP68O(8@1)yU=*MrzwF11SV3qU7;P6izhx(CFpatSl-b3iQPUUL#S z=Ml5=A=;NshmA3ab3mtnI6-ECxNC7(&M;I1&UAD9PXlq2VXuaQ*a+vrS)h-gKNI{h z5QmNP=v>g{AhyBbJ{y#N2p{u6^Fil>t^qL%97pOl!x4M81avWoz2(d=1YHQ?p0S{v zQZ@Kxh8BX?fG!0Q^G4?q5N)Vi1cDCNf1|WcScw&=XQjm;ma!7cE(h5%+lXzH&S}qj zY=Cu^fUHm2QKp`@@(z&>mx3}NR=OH=1?Uqm=nulP9lq|Lzqh{7T1Owp8Pa%dHWdS<$sD@($25whW`}X z?@oTq!3TcJ{XqZAFB4wETYRqkt&x;pv}?P){UKi^W<=kq9p0;8<`3PHHU5@@XqQfz zy=x2EapC@i#T|ObMndCnIV4)_|N2#;Z-JKd|2i?aQ);*x3-|l{96iv#>+8gQy+8VK z!1xIM%kJwNHjLZw$k+f zuBLI1O(KZYf#m)leu_@%x(MBkz*#dne|lbVWrg3bUAsN}+X|B1{fE9zB>l=*vZG&p zNPHK6;TO?P{-AFXeR_M5mLM4HP7=&p8-|R(efje8{9r!#F44c(G|jCO|03B@434QO z&|VVyy$g~lf5EzFl7kRgq;a%gG`_EYXF>8^{cp+59TEjYSQ{O&-ZJ~DY&*!>{0X_f zV@sl9^7}g<+{^?bUU2>pAHP0_v3))N+>?}l*_Li1w=!&-BK>eDS@m6_w|~HQ39k=| zM$#nw6IAnOeV4d>sEy1l!IBqRvGYG>ORl zr@l|@^S=ZZ{ULG35EF-u%iB-mvhmVCe?oD6@Pmn~XxXtNSa#d;<>M8%G!xsnhM5d% z%(&1quA_fUw2rf_1g%ccR&7@3l|RxdvXkB4WQ*Lt{^#hV-tWl}R#aH$kqB{FGipWr zvL6$>`+dGkbn=t`PW0?^X8!>^J2*cWM*N)VPxyD@j+i)J|4m|GPn&>oCZzGoC!BY- zU-U+FT=Y!;#I{69QC0r|qga32wzLdFm0#PI_@ZmZRI@!xvAWK0>4dj*%U83>*CON#Sn{-zjClZ5*gj%BiCQ1?)` z$>a04j5~fw^dDk6Ydf#I7Ooj4DS4fjKz@Hfa`M>l?3^>Yu;Re#*O~|K-m_xj)8~z! z_|Dzsk>X$195H@H`FXFN(^PisnDXwYoiXmgwxR2G{r#Hc;N4L=R;=KiROV-@k_?< z;y(!U&UQoIgbjJqhE>jnJR_d$SCBd40bG<9$CK$>XC^x*c!TVHevO^9i*DMLm##yi z-TYKxa$NC{-^*XWU{m~Qxu}?yheQYY&4tM!1zL0UsnI!|>ggnn8(VRHx32Flf>6L~==i!j%JfjgSf(6UhZJM&d^wPcDnL)DG_* zyHMi9#Ut*GUV*>h?U#Sq?#SKyeYfwVecBx}(Ho|5dp|9g_%qAykxR9==zMg(wnK7l zv9aK_pY40!!P1{~TJmAPW2a>2PF_lvROV1l_u4tpDgHU9Ctoc#Y90YuEqk!6hC`yg zZoR)<1!!_@Ma*9{B%X*pa}R!>?ds0SgZzq}lV`^mfxmKXa*V&vOR<99tcPq_Khg|j zY1XejEmrLJ>72aLI5{)K-*kjl)N|g{H17P{r<@*{-bk}g|SEZE5tUB zPu^2dC2&@kM)Hcd%p6_g(1!%AMHO{oP4FLwX>0X zhr^ELz5IK-CTn9)vD=$_q1%ggO~wjR-+su9&xxK|pvgxH_BYz$^O6I5vwA2I*&|ez zW;DF1y^=})hHlBLVo$TX6LwD?Tv#%xN*!O1EC?z(56()*0bZMqOqnM&4)cdR;* z=+w!OKFFN(Zv92p$?(C}$@+D0Vk%iD+2c%}=v}#E@>}#ED>1&-xeoQ6nBr{!| zNJQ%7%YN3$;{M4)3%o5HK6tsuz@i?>l0LSc^^-b5{YX&iXTt#Nr|2~Vvvm)wE^(6* zIQ=qo$<(r5yc5-ncvmm023ju|^+OA)q;4(8T#zKj)UsZ(C#e^SNxfXRhxO8b5WHk^ z!6=l}m}=HdW~NCE-K(3qrPfV!Pq?Yq5IEF=G&81}b(1O^8vCqsrm_@ddXbRSOUGf>%gSN!;{6%3%#-ln>BmpMn>Np$LN?iib*Xc^pP#T`d|vT?WATu^XL z!H?ePM+RPSFi*@YP-cDFHd6Dn4GCS_m^#+>eDhee(JF1o&YQItpZ$$ia%ntRkKTDE zmyBLL4%r_b?KKAT<5v!>Y>^75eS$60RI_gE^+N(wH<)Hgf46biz{OW>9il7E`BJ#j zPY#Lk+T-IQR~(~Pt^G^64Wf2DDyFnz9hRM-mF3C71#+?Si$=$L)mC)&KdC?sx%|!_ z7N6p;n~;1g#;cw`e`2yYCKq}+c1~?gt{9!VSi5bxSEF+F66HD|xH4ysmT~v~I-fft zu6G@V9n$z>kFl3e!s9D{**@{JOR1P~i#%qXparZw0|xpt?2so>o_w)(ct8Kf0qqho zwjG4Mbh7OzuIQ6G(HUNHOsL9bN@3A~$-!N1m_gbZu3m=c9tb}&b&E#CCv{>#J;u(O zlo3DNgA)Sn9PZ{nUV~7izNDTBFf%FzPqMJLj5MA`jy!Zyy?BzvKmw^J8v`cDJK!mzV2M?^)LWE?Inl3C-S8 z2BDexV(*LO5e7nGNEP6E%UpDLvTtG}zTD$gjKm*gklUr$9m%2?MLuYnl<*1*3m1|6 zS%oR!sw!%aq zEu?o<-DBN5RU`-XP4_zZ&~4pDPTJO~=YVY;cj_q7%qwPpI_xzd-C?hRP03xlFG3F% z`NO}AZ}ls_jKA9HunGDQ*gH~=GAAd~epSZ~ofCX3QTk=>EOT-GS>|WG5w`vFYI0|p znaQCssfeS@+>T%AX{CzXpVkv68A0=V;w1C6mZiR7nVe)iqp~L%Es~Rr!lKio#W5QB za*$ydeo<+BS@gZy;UmMx7k}>TWTN+P8m9N{?Xt8|JhEU43)iEIu?X(yY00C@bDc5^ zbkp+Y-Gt`!)Y1v37NfSCMQWklEdJZ6r3$AOIWO_la_d4IT38LCSU1uNR~OxHcWCL1 zLyLs5_!I29(xQ82*(Dh-$mX^;g*>#xq)W10v$MJzt(}WwN_IYa#&pyv_ihVut}7f< z&c-pt+Syn$=QAUEOgYEykGW$?tKA&URb_ZL+-$H)sJp2PRTkG~gWTcK#QQC{0a7TJ zTT|NxZoGx+MuJi| z&H<%f+{l4T5zk7dmi3ZNs}~7Mz2uH3vr3Setkjjea6!`t!i%Y8y<`@v7l}!| z{%8{;CoXZKi7~aTm(&vVA~C5K=Xm06%gr8vk{DCXy78_siJ^OS;~Y;)rS9Taai1he z?t4uw>m_@odXb>iOWx@O_r2fliRGu~St3b{sb#%nGU`QQQZMfDq+l2qG0&ocG&81} zb(6YA-AGXC#yOv4;>OKA1qzq%jbSp?tQ+q-bt6%!8|QqI6*n^2f@+4ti>YP3WUn`w zp?CG-98X$pF!#m;$sy9zvR*RF)QiNVUUJ8iEt@c93fUtWBte=OQ_Ffu)v6bXNxkGw zCmY{~mt!|+dhbc32(f3`(@77UPE2*{&bwLNNpR{ecRIm+9!_53k1Kq#areKSPOMMc zM)nqMLqgX!rrv~IR~~U}z6mR?{y4@g6HAb!&(yMBGPj!aF=F)+I+5JMbt`pcV^qk~ zKp$Jr`mxsviAw!AM-tp{V|%P*NSk@G5CmUCV!X`wxJ(zv7>rg9ok)0;sn>dZ?52>% zq8P7B!L7Y}BDoDG61lX_zdhNzx4F`L_R4QAX?j_WjzQaUtFr#~o#*c+s_ zh50u~T5)D_Zbu?avaD!|I^YIL5FYi;=~VTd7JA>ao#-ja-o-{^Z;-TP_$kSyF|m;+ zy;4nYkQj#EAbsH6AmyI#{-B|HZOSv|CdpeIJl{1I!A;Un^qPCVo4p<5!~2N4I8OFX z3HJ>~Z|6?tP8s(9!vo&nR>^!0WBl2r{oKPrVl6p*tsQXETt!n-S}s(+(c+md;>I z`hZumFAsQCi@T_jK2krFiOjv)uC$}^{SQxg)ia;=3DV8c)V9&3?pJRn%Kvg3RiIw5 zSr~t~i5lF;*0=t=di5t!2GQm2qNc`9Vt?gPrY8_LQ6+tBHR~q(pt=$F>c+W?S|Mp; z=LE_AXDV4InTJiL7?V12Zlda?uI!@fMV`)@YSvBa5p^RmshiME)FrrnNL{%+TQ389 zn@ZM+_n117nAC}L59O`QB}O3b6_6NH&-%$eu6`sa^^?1cl83ydQdzEvf+RDhmi3Z( zLcNH0_2S$`rE<|I)Y)U|SwE?#Ols&~{W!N#S@9z`3mOfdLYi9E%m1tGTHvFou6{N< zyF0rxvpXRPNysJy2$FY#p%Ud4Si!WS2E~fh2UKlot2R7TsMZ8QU945`!Npcfu(i_G zYOvNp1QYN2#|-Xw}% z@$M&CtdfotWGrtI6)BVQ60dC=$0O@FUdAj+KOL>YL@|{}0Q|qEQ4&-t(I4YVNI6%M z@{$*)QB|abzvPtz&^U2-#UAW`0zyLeKQ6q9_H)RLIaM1$(lm%Dd@&mrQW8auA%xCR zvdyUGaVQ+GILTku;sAtidEu)}#O3lCld7aA%1N4y;gI#YlPY}8i(?;u%}e9G_nKFK z8bqN9x;u_TWHtRp2uuZVRY4R2;ijJpes7IC0n&8|8C2>S_vf>$66d?kxD z!dJ4d`dQBlOj!>V)i88n)Zup#+fTbXZ^ue~J@)LKi2+pam> zaD$a$R~r&=wUU4vtbkXpM@8Mp$e0@&YP*AqEVrlx`0^sX0ZZ>f>Em064A1M0)!FXg zO53%{BW|EdcePn^$PMni(XN@og1# zg>Jasa%00yH(DBTLr3XupaDL0@TmdB;XyZ86LIxA(+$@|U45kG>gASe4}lsLT5euG z*ba8B8a<}Hu-bNmR=^Dm4!Y5};fC|UnhLlEoFINGz_KBLH#FpihKF6f3NR6`!g9ky z!NS4tTDrh+^9sOwgABl|n`IZ8y`dQJ=LOwxq3%YZre-|s1`C32ARl~H2zdB`>mcYu zzK{)c6g~#{(+qWn!TX^Ckjsy_NNbT`*Q(K#b9~TR#vrg`5XZNNnQk7~W0Yabg` zaz~UFxVZs;>#EVk^ECLkpgiWzHYs3<_6a9PMThUxefMOkrfL?duiP!KgcCpFc$!%GUlQ2-hac3PlJ zf?`7;s5xAKmIhq|I%23e;F=@DuH8W2kyM*OP3xW1SnZY<*aT!jG)0S`_N5r*(5leS zbhK_n#5EwYBg1sps)H674*x>$u^Ty%5e^1>8-|znex-Uinp@Ir6zFbDAeqqr5Ge|6 zXV+P7w8n7FDlqqG=oi&t*Qy1YBaO8E@C^r|)enpJMk6{lP&1lS5RbVQbiODCb2W5q z=w#7qxULmo&EQo0jE0W@GlK!GGZG5Axjr8N#hcCYNUsgi6dejomGC(VXbIE+bR$Gt zHlT1Q*c%Q)NWu3s2&5N=I%8FkE=KW>1*tAp1JyYSssa`e5L6Grq76_ct2e5l#vN5t zLqJ$ntRBQrYxHP{^=e=q2_O&)2o?d4$C@BcMulCo4*EHKkd8GP=;UEBBWAYNH;;CQ zloY!b|1N7-W1t|=Y1ISDNZ`hH8v$8&sO}oj@J1DUAQKv+bTxEkmJ?_0bIbAsJD1$mnD}0mJtF85YC` zyY7Z>;yT$+Ok;Td1s5(^v|w&S$Hm{yxnN=AN#D8nf&?q|`AVI+`Nk%{RrU7I_&n{5 zke^;Fe1kPj*5k}>&#m)6@!(>%Hey_C&VQd?c_i^)nhzCj#9!2eIR?HB)1f+a%_bYL z;GUS~8pd)B=XPk@vH1(X_nnIuo_pTBxeMl=x9EZe=ZF&eCE_s8!tNV!gEQqanS{f7hSRdYM^dqLBp>r-%0=9tJeDWcn#Z% z@!cFu-Lus2B1>Put4ROyD)whok*=|d@WW}y&8UvIU>!#XjIXd8N{rdQy{dgO40+6& zcTPFEy6t56m(4FXP7ECWKECqXT5c?~lEMJ`mmBa(iUF!#5w|2u)k&O%MA?}~1B$#QS(1W< z(Abm6B5z3+axIukqU_jaKkL+=zAUBd0I)v*Q?UM z&aN@WSukHmmeI!;aT8y&0caBcb{2ig5dpktO{1&4! zQ$ljK2_!uToPeN5P+}`cR0@oL2p#%AIi{4CsYr_J_BTR`M|*fhGAg-NJRUT`sid!A`>*Dfy3s zCmxJ^eG!+JJ|$t=HdNOF-b&GQ0~f$Z3+KEW?Z^bgSPlB)({>z4|cB8B|-J8cly(huv7bkR1l3fK|v5}yu8wx08rMOO}L&MI%x;5Fc zM_qN>1o2%TC5hrgXf}1j3~c=e!fa_inZ0+-=bAnLtgh7(8iSyXps5!MC}p;|PNqTQ zhQ_+CU#10^bP1UKbBT@rE+%a1g&ElT<-%-fKKC|Y+dJ2$rSfK0pM+pok5Cz%PGBf| z#dR_Z=5=YAw3%%|%vThq>SGy@`W3=VX|88xA0LsiqU!*2p2GCHl)zASitFS+%s-}g z(|Yz9U}!nF|`^&BCtj1$+%G`P{f0^`zOJ!8k2 zz~y1f5Oc^DvlLKLHfLYv( z8vy38f>Avp14Z`Op5IS{+;#;m^i{R2zXn1?!& zgiReH16vOWyQTfg?t($kY>+eMUjq;|Y}I66ez+f-(MzW^YZExiW^tVyh}(2?7FLU5!1b2RrC=kEgpNZ?3Zy-?r^eJQvrv*Gftqj0?-5;zh! zDRG6q6x?5A!v%L1X#c=CqPa~5nm(9YDXryb8yisBnkd>)Cz3~R(l$uH%TLSC97Y5{LU{3t&87a+cdYX@?qWS8Q4sjyy};aPtZ z%I`w?!z6zMDMDHCoSh@-(QmM#4y;3O4}7p6i^;v~hjw2Rk=9^qi3&GPPs>TIOyP+!cD z*2_h0q&5AR)AJtn#kHNdI%pk;>;0I>pf+s&)Ic%o*zXTiK{l46$`Ao14N4Le=3MQ0 zgc`jbp!939K_!K#gwlr!t0W{rtt*G6;s1kBTM?=)E0h$KP)PwLRdA~g-3L~^h)^?r z1yISXP*PMv>0Lu;#wt~CDDu_I2(=fWLd7{n*z#=EDqo4`Dj_M6lHyuwNO9F4q^m-0 z*^s29MADZEn48DJhYX0!eB}l1(`9`SDA`rT2lKk{l=_B}hq$ zq+cU!l8CZ)94W5{kovPCNlA&66i8A7w~3O=TWHiegwm5)lZz0QQ2MpPCn zal3Ge_X$GH-waUwS)rt;gh~o1sUpR!s=v|>#4UiO|0t`wgsjBUw+XW(rsuACe?u(p zuB=#6R$?Uuma@;oT7TGcS5_=3tFUl22{xm|BrJ;4Bc8hkK;bgDBrQbo^%}4cB~2Rl z^TDxEo``;3Ot zW_1sa>{j$WXB?a8W|KcPYuO8r8q-VeR2WkdlHT-DB5@}>w8N-p&t7TWR3x$Clx&5w z>7$d`2Rn?$(sm^VXJspT(?_QXh?3Kl3>=!R=uIEZB6;W8$6xfKif{Lkw-c-Tj5@Zn(9*oB zcfG6Z-o4~Ku-n&X)G~X5rKO-8NI^NkQ4TJ&i`kx)(J{`>XN^(0?A(`(Le_D%sX6v8 zqtX}P>wkv5X^dq(b7BDvm-et#o1$V_ zXky}5Ywq1h>MEw0t%>o!K6(q5z|rf9#(=>4tZ$cD!zRwOZYmk~>!bPi!VnXZhL}i< zV_QEo>dV`eEJlUI#Hdg>rKc-F3=9usmH-LPrkkv5m|39RdfF(9DjU*YQy@3q%mTUW*9LgK#ArXi+72}h?&4< zykL~Fox@F=UH_>u-Rb@$cG&0ae^>Z>x`z$UmDuQ9!bazM*x+1=jm{O=T`kri-6Sw zO~qMMvz4WwjCAiBZ`OwK2L*LpFh{ys_hI8rCtPN}oXd4H(EXb8#&GirIHP@c^kjDB znfA1J`$Od-=JqBez558K*~*ArQ~r8l&-3EAJ@AyI(NLt7rx?V}iR_$8yN#9mV{PmJ zP|n0E^Y>m)2|CeQbGR=+tMwS#oJTf`1$fwAttX0x7h(2Xr-p?~+1w>aQ_#f0fd3P3u-VgP(c-NRg@%9p&y#ot%A zFb%2VBL_&_d9lUZ}Pa`z3qj!&WutYM}(tyC7lN|Y&*-g(EhNVDEW(OMRL&AiE3ImbNgEAggd>C-+w zt*f}cIDO`)JqC$E3{Bvdr|lEA8ni9RG3_XJ2gg_=@+%zA_2g4-!P~@si%utR2r*e&4K%Pn#Z4 zcXL`pir&;5RvZy^H>cH9^rq&h;)tocIjwn$-qf5=97U}6QJ6{gb=g`NzboJiSSK$t z$A&BLK>*jLvZW=~8O5`X9kYdO&FP*jX^gJb3(Y##9kiww$-5X>l7_%y?gF!(HBE%M z>Z}E3GB-YUXxBX)sXifT95Iom#7lA2^}-WPoNH`C(im4r^HKA{OUzruq~Y*orXJD& zppI3HgINuS!Vyy{z@#Z@33EJ87Y8flm*y~lE!9CVTz~%Y)OwP>M@m1kEsG|OphraX?DsQ zyV`3?zFydC%6nu}#&211|7O{glE$V)8WTlb@!!5}2#$&=@0RXbhurJNO`5{GuQux{ z&V8(X3h<8S7#)hnEQ0rO+EWv}eab)P+#O*}4bUEqZ(Y5D&zV}w%%Jo4<>tiP5}31! zLAoC2uS8=UjQ1vn6bWmeC=!u3HX&(@1f;!4h=Vn_{|5f1z#NU!m|>7sPZM9a@9bS2 zMy5?4eKoOY=<5+Nl{4Te&6|IJ&V$BfOMfIPeQKhrb;i#*&S?p_FP<1$;fWy*IKp6h z)*u=lLUA&_h4l=z8`zb@%xO;hbr`e{9Ch(#9<)G>r)i$&83I#K?C8G-Zzg3xgh6wS%OJa(%1o!Rvl0lUI~EDwzCE~oUuM3Y3yD|duev} z&;N!~2>2VDkTiBKq|-as-JFd&7tx|~-K{#;P4U8$zd4$-os^I?KB^N3gPp46 z1$*&b80^}A}wTd0?=!j#ev>FSc-Ca5cjxu=_|KYh7;+&OOq~y4ORfR>V!MIPb=n?&q!E zJz3J!5r_plLXo_klT$H8(l8dWwd-M8(E}hU936@Sx`YE9g?@VIy73-*=#t_%L`WK< zm|?N=m*1Ed2k80d-1~rgzv94zC%N(Y=ec{K_#Jf%AAeLaJpPdM`|1`pzA8R)z*)P& zyepSs3TLN30L~)n4n@8BfO&MvoD4@b+V;XWJO}Sl`_8rkjXU{9mQ>H4^lo=4cO$$w z6*PFf6=~Kn946uI8?8X8;_99(xzO313&#Dpyo-ek(LKse<>*ixn0|-@$9*UA zp!t_v9pCoRz1HPvxKrpZ+KTCeOTn8yXZSr<`%}YgltlBEu;}41&wrxOr(3T;uJ!-`+pw#wQ z@%ptQUBZv+2^!mj?c8QIlq4q0d+>X&iiVb8&uxR4#;9NYC}c>Qae+h~g?X_j)Gem}*zEW|jMG{!j;H{@RP4s)NT z_X6+XjmDDq6%YE<<3B+B&eR>|Wx}1$JS*K<_?)E9er|v}`F1G`@4WT+&@XmEp*!pG zq5n62R`HHGhd=o{@Z{g%cY0>q^L$RnG_%_mpgmHs4bv=V-*^?Cya_~XefqaSXj4=s zh}i4&Z-ek%P|6Z|PS>D@~nC7RiPFl)*mPc#KXzvDdH z75&n0`iZ6yWoXUJClhzJ{g`X)dP>o6obWW#q!H$jPXlZd{R~=8*AAub$c7!aHd!b(7bOY*c#1h6qkq0W=?e%TNUPK8uyGo;phl@V#DJ z16HfHUQU*rvx3&gk)i0kQ}^u=-r1sPa30cRYemfqk0i>w3ityVxNzt#V~Iu=KK0j= z`3s5sc+1wr+Q;R~l5L68KJH}SUu2Dj+3@NeVB`8l*6~B9UH^FE;<>K~-)vVjdJygl zec-?adxTNoz(YSQ;`+dWgRdRU^_8Iq4~rj=;~wPiLcoLk{l_Ref8sbxbEfB8_oe!= zpjf(V=iaF2M?rxLn}zorE1=OvB5>X@?1MThqT#MJ2cF$eG~nBohZAiL7xYp%54O@qJuV0s8Hw*-wZd-jP6! ztl~qflE>T=M_Fkxx3V^?uiytf>tsQS!!X?V?mf?AdvGNlzU^>k)W8J< zI{&9)9Mb5vP}1l?q`jVd@7C{$=zJ<6Y3#W`Q*@I5wm*8K@*k>j%;T)LQX|ZqB%PBM zVH&$#6{LABBg_Ic+tcRY7skU*u^KFu1cD6Si`Vl@54tHB8xXvEPR6cJTS!-(ZH>|9 zz+S{J21a`r8G+%B#4iFC&}btgU^TMtZSd8^e%M^-%)iij!cbKeHR@2Q4r&=>SDqlN zpONaCE`-jCI};g%-f;HQCDtGfw=8}!)ShbwqT&w5FNR8O!?!<5W39Yd75H+VZx6)L zaiO#7L-Rhrv!7Y;M(pt4zB-Bbg{g^x$Ic}BjqOttqo$wF6Qc9lZB}I}UwaB)yT`}u zUdYC6Keb*-!JM7KJ3EE9sSncUyxXlmM_BKtMp4vDUNAQWb^T|9jM>fn$bijpHpV zHkVS%vZc=(r#Le=T6Q4*&Cw6?gp)Hh@uy=>B^n!c_wJV<$-%3BXZ;pzSdXtgg|FS? z!-jn=g>7~U+iZ``fi~U8o3s4kM9!0^igzYyGpEF*Km8cS9?(vSIHKK5BMJNzdqUEf zh>@n$8N$*3eR~A!ecCG2ay}{t(_!FxaEDc=dnQ2(${Jz|${JR)`7c;^>+jxrAaSuX z3IYTdJQTijAfc+<^+Af@2c94_*&koTCfieFr8HUmq`gP+`5-*dOBx^Ok!J9OUCeq0 zMQ!FKP?$vxNT5A9`qO4duMx%WUEV!+y=oN&;%~lci}st6sNH@64OlPLCK4NG->f{C zNE~zdt-^y-6^*To_o>3HH2{kt7Vm{_=^>t!f_Sor$mRrLm4pY`o&w2f?!$P?jKrYN z>crIe)Wj3_oG#2eE%Ewyr%mK9iVgx8tJ-I^r6@ilMe(c@#a*E^#j{fsbD9)8pYBTu zu}5F!<9iNFktB^718Ht2PLVEu?=xX%pQ16u@IG-BV2CXkfA?md1-B(WdGhLq*_=H_ zlbm6$ft4iA8y{FZLMb(QTh#=zN=i-oN>ghBktyAYkx8vmQ5dZr8h_XGAUq69558OY zUWy0X9Nt`J#el0jfp3@|+V<6{T_RL1s zgW`YBzZyaUmsdgPPUpC-p)_2IQx6x0H(}!&+c{0RPJbxsrNU_`Q+Y{aoFYx^lnPts z59#F**q3Ph=Ht|XxI-uFm z!e~thf{toy$J1&HVKzObNe-wc!OW?AIutXfgvAJxG)9~D3tRYCjB(PlW1md&jU6tRPMV@y*9U$-+lj_tWQ8qn~71-`JZ z^_FN0oJT&@GHqBSD!!GSn7BlKD_bTOiHej>i$saWSI6UN^(U?n{kn73ZP9O}+PU+W zQDJA=yh&qo?v@3=xI5EMe!PQcC!XBE?X>5{T63KjejRPih4=9lck!f(UxaZQ%|Tjy z5q67n;J48-VNu1y^2JStF-?nN!pgLC17jX-#rG`1LmwPi%=@wyKR>ukd`mVZA!$^P zv{HYQ)4DCa;TAt9>z!ePzEc*Y*$~jA39TBQ5#bzq9kkiCZ`TtK6+ z-1;#zJf0Ep-@?@bbgl#=U_2$_zX!}umH^=9ymtJ#C2?p3_Tb|%eLbT&*PU)dd^D8D z@^s~v|1e)s#-NiY*wRt4My^VnCGlmbq5~;XREZ-dz6@3ToC>T}_;5Zr5Rah1O!RWf zviN_IgZd`K{vSE0n7wggtTZDLQA`h;9&6QF!3OHv406y5&dQTw=lhvm{sj_IaB5;i zk7KZkqv0#yQ$D)sI-2%5{WD_U`wufy#hh412G!|&3NZW_<}QjwG&~tYWu`9e-_1$i z{Z{M?y zNgB`DV55H;8>8W29RC$u>fh@gcBb2;VeBEJJEvQ9minU^;xV*!=pRI zT{^pi-^G(S#9e+A2k_R0yATFX*>J298)AwdvjIir?5AVwa&0*ju`OflGo10G?D3X3 zN5d<}6EYkq2T^`RhF64#Utm#D$hqgM_7y>K1_m*l*bdlux`lI5yS>i{(D4>*{ye)$ z!?P;HT{^6S-<<<5am8JJ_5|?OhI`=9o;EyI!r8jWeiYVaQ=i*)m0ii6`GH+Q$3!@L z7u%2dG~7GSsATsQP=cpEIEQ|aUh>;Zp#%?caCTjaaCC|T7uvEIittbd$M-`lqEi{L zs6KY;QtaMnijHS32nITA0U4TCFSTKEiH9eMB04<*i(2R)1jkxt@5>F)NeFE83cFpS zGYz(04^HpC#=br`KqnjUB08ghie6iRMRZaD7ENUbZnT5pop92fj;9Yez=WuH{D3Mq zG(1hf$-CdaLU;ruN3(lZ*@FT}JRSgxF82lKd;pZ9vM}qs*^X$q>0gx7u76%W@m9M4 zckw%?-)b-P2WT5V%e%)uiv96MyO14(udnjv_+h8tK421k-DESau}^U>yv>gL1GHT~ zn}m-0@KYsbI1P8$Lty70?h(%>k;LuxsS>9+?{(W{el3eYcs&@UI(r$O)J=6K+J@z;K0owD9Ma`_W#|~(?hh6w5NeWl}&OTnl4e7$+ z@@68C#NFl6*SPDJ0q>-61;kK4?iY8~{oZbdAj1vg?9fBdxaE#*Xt@8|sduo5Hh`<5 zNT3Zjbc-_D(T!#88t%=O61X`V@17W*hp~!#t({#DV{_AHYc^wxJvNZUjnm>b?VQHj z_3XG_I}*@wE3_!1z0g?J5Op#9$#mS{jHWmGSkD#U5vm#RRI>H2S_P~O>JVtdt;=W< zFm+w}IZQfkN)}8j7k>^@KW;Y`Ox-^KCftyVCVA>Y;gvA`<$H+(+wGqRXfHADekfv( zZMW+Jd~5J0SVUWcdC>#?P?V&tzHjzJ5pDHVQuP{b+3+vSz=1);_OZvPhAn5Rp*o&}TfTmQ8pLL?nw8(eVg5&?2GanYMJwDSHM* zB#RVD3K0pVjtRv>4cXZ{QHx-aB08Rdgj%GiIRB7NievAih-8r>bW9P5NGN$u9i8OG zez*&@2vjA4XWO6_abF&TrQ_K}%zEBFzfN#S2|5D>l}HJB$`PKH!|p%{JZJ+rqy!z8 zff7=eJQW8|Rblo2Gf;v~X+Wz4k~~d?4(4E6Py%=Fr|J;bN|!vc0}pFpC%rIGg0`Wf z4k4+IcfcL`Y&S~aChk-n;+nSm!+o{S9yg=2i(VWkA>&Z$Qd`Y&&-b;Ty=Xh1y_okw G_x}PxmBPjV diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index f7c430509..43f636498 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -242,7 +242,7 @@ minetest.register_globalstep(function(dtime) if elytra.active then -- set head pitch and yaw when flying - player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch+90-degrees(dir_to_pitch(player_velocity)),player_vel_yaw - yaw,0)) + player:set_bone_position("Head_Control", vector.new(0,6.3,0), vector.new(pitch-degrees(dir_to_pitch(player_velocity)),player_vel_yaw - yaw,0)) -- sets eye height, and nametag color accordingly player:set_properties({collisionbox = {-0.35,0,-0.35,0.35,0.8,0.35}, eye_height = 0.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) -- control body bone when flying @@ -250,18 +250,18 @@ minetest.register_globalstep(function(dtime) elseif parent then local parent_yaw = degrees(parent:get_yaw()) player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) - player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch, -limit_vel_yaw(yaw, parent_yaw) + parent_yaw, 0)) + player:set_bone_position("Head_Control", vector.new(0,6.3,0), vector.new(pitch, -limit_vel_yaw(yaw, parent_yaw) + parent_yaw, 0)) player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(0,0,0)) elseif control.sneak then -- controls head pitch when sneaking - player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch+36,0,0)) + player:set_bone_position("Head_Control", vector.new(0,6.3,0), vector.new(pitch, player_vel_yaw - yaw, player_vel_yaw - yaw)) -- sets eye height, and nametag color accordingly player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.35, nametag_color = { r = 225, b = 225, a = 0, g = 225 }}) -- sneaking body conrols - player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(0,0,0)) + player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(0, -player_vel_yaw + yaw, 0)) elseif get_item_group(mcl_playerinfo[name].node_head, "water") ~= 0 and is_sprinting(name) == true then -- set head pitch and yaw when swimming - player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch+90-degrees(dir_to_pitch(player_velocity)),player_vel_yaw - yaw,0)) + player:set_bone_position("Head_Control", vector.new(0,6.3,0), vector.new(pitch-degrees(dir_to_pitch(player_velocity)),player_vel_yaw - yaw,0)) -- sets eye height, and nametag color accordingly player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,0.8,0.312}, eye_height = 0.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) -- control body bone when swimming @@ -270,7 +270,7 @@ minetest.register_globalstep(function(dtime) -- sets eye height, and nametag color accordingly player:set_properties({collisionbox = {-0.312,0,-0.312,0.312,1.8,0.312}, eye_height = 1.5, nametag_color = { r = 225, b = 225, a = 225, g = 225 }}) - player:set_bone_position("Head", vector.new(0,6.3,0), vector.new(pitch, player_vel_yaw - yaw, 0)) + player:set_bone_position("Head_Control", vector.new(0,6.3,0), vector.new(pitch, player_vel_yaw - yaw, 0)) player:set_bone_position("Body_Control", vector.new(0,6.3,0), vector.new(0, -player_vel_yaw + yaw, 0)) end From c7d91baadf60910c93689779564fa3b867cdd6f2 Mon Sep 17 00:00:00 2001 From: epCode Date: Mon, 19 Apr 2021 14:29:12 -0700 Subject: [PATCH 066/136] rid some mobs of bouncing animation --- mods/ENTITIES/mobs_mc/models/mobs_mc_cat.b3d | Bin 54146 -> 50977 bytes mods/ENTITIES/mobs_mc/models/mobs_mc_cow.b3d | Bin 75074 -> 71850 bytes .../mobs_mc/models/mobs_mc_creeper.b3d | Bin 44319 -> 139359 bytes .../mobs_mc/models/mobs_mc_mooshroom.b3d | Bin 54175 -> 71850 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_cat.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_cat.b3d index 9ab4fc10ccbda15e9210e2702e858b35a1d76ff6..1a6ecbbe82a74536be40bd5a427822847acd00f0 100644 GIT binary patch literal 50977 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 literal 54146 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 bLehWdeBH6GwauP_;>vq{d9HGOx!?XDEjuxb diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_cow.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_cow.b3d index 2f13ba9c465a28ec5b289e0ae3cb02730ace6023..c009839191e272db590eb0e08be0c90356b4acf6 100644 GIT binary patch literal 71850 zcmeI52bdK_y7v!JkRUlL2N)Po;yHqV&h(IT&Y$Ac?%iE=uUEeJ-~I17XWH(e>fXKI=RQ02JTN#N znl=qK-%=)rFNe?P>)5Gzi{SvHxMGr3ZYz!Q+O$5X&{U;&;Gy zEOcnmt#ye~KHq%_J-c@A_EizjSq64$L+W7KU{CS^$4@1s87y<~j&Qpu|$c_Y$( zFJ&R`UNZ7lReC*Tq?xzG%)`E`C2z2~FY-c0=Dca<$z++mD$kkcwy#?qxYbqW^TlWQk~1H3=Zw7A z=OXW3a^~`^W6peTR(YB057)zIUJvIrayyT0KTbD_6nH)5SpRA%KHm{@U*t7Q-WZ>k zw4Hh1EG;X#{m_|t*f%aO8M;{B4YRz=`_S5mWMo? zn{^(@3mIN{C@+3rw>ogEE7VKud~qH=$1&q`eJ-EtH|sf8_t@82FV?=9>mJw0=X#CY z>Y&8X^b`1u0vXpbWFQac`*22{-zdPm)*08*%EP&}%g76vx>#PwtkcZ@ogEE1X;Gd~qH=$1&qrd@i5sH!_zO ztAp6NS^GNb&%C~F$LCfD$NqXTIrZVPDP1m?mFw0WZEw;g$xD;GldrAZ&^)QbGdA_8~dBe@T%=;p5 zU^4P>%+B&~ZqD*zd9d|-NtyRWo^`&lI&ln; z+^l^w*ZpMkm@{7^Gtb;Na~=46^2`{x$N!M=teVe^fqUqW8F}WjVCKc1RVxqo?k922 zuiQgMEH5PYuKCQw?Tb9Wv8U0=WPFCz9$5D-@-jaQAyem;=iGN2%d^@X-1mM1d9k($ zc_Gg{lo!7*>cv?HZgrLUd~qH=$1&q`eJ-DCwqbE~kA0o>V(p91z_D0$Z@qurj?b+Q z)?aELg^l@soc)YE*k*BgN$Z&RRh<2dJnS2nmz+7zvY#{WYuV3Nf1GZ9hPAI{cOoxV zo|%{Im51Yt-}f5JvyS;B>NE*?v2!!?lD+a`=WFfjRtIi%mHB)<&%@{PxxUQhS)ZG^ zUd%jS=K8bjXSd^XtAj)7?Tw|q+ohcPtC8aKos_oyUNZ7t{%m#1$&9>|;;* zzh`+T%wryCmWMo?TQno@Ub0sn%8TFEtq$Dk3iT2@-~IBrJ|E64cFZ^ypYP|Nn_|{; ztnRU|vtF!yGuJ(?kll_(NlZix>ujqQge z=9idHVgaVHU07lvi3KG-!ZfyvNh~T6T`a|!#m*e)lrti&=B%QKDb z$0R-~v4X^kOk=yU#7YwV601l=8r#(*R+X3_F_CF(KQ6I`#Oe~CU>e)CCDxKyQ(_&a zu^o_DPhwq(L8h_YKw^D~PfC1>X>2!^*hpeSiBB_)ZCr3%q-P}JVL=+(O(iywm?E*6 zM5M9ZQeq2<%_X*C8ry9pwvpIcVmqd>-BDr(iR~qJVjA0BC3cb6Sz2c( zxK!d2iOZSB_DYE>B)%ze71P*WD{+m))e_e+jqSH2ZjiWM;zp*iy+z_?iJK&Dm54O9 zcSzhWaht@qna1``iSJ5$N8&D~vAtK~9*Mgp?qeF;VTlJM?w1&08rz2?9+dc=#KTNu z`>4eCB_5IZ0n^w%A@R7xV-llGWBatkQxZ=~JR=clY@e5SPU2aK7nsKOWr>$0UX*x+ zX>4DUcvWJ$#Oq9B`}Nc>3RhY~+#8rw}ew&_q%h)~`9JH9D8nQO|$ zFguyk7gm3=@Rwaus(ko`oJYvGe}B3e|B}1DAu(D#^}AqV>UWW*ojSHSnb#~q{)CJi z=4QyqN#-JRlX*yMmyq!g)A`8!v85kLDnQ|k+sP>WL>fz z86bn?lVp9e0r?c!kZeRYCZ8ssA(O~t(jZgFCS+5x8QGj{LAE4Yk*&!#WLvTw*`Dk` zb|gEIoyjg_SF#(~o$NvOBzuv)$v$LXvLE>@`5f7w96$~v2a$uxA>>dpl}satk;BOm zY zhc&bXG_(aZw1qUZg*CK~XlRRQXp3rSi)mKIEAI9Q5&5) ztajSOabqXf9-W#t+1K}Khv?1z?NheoN;Ba0*>UK}+(C&ExQK|E-NRTP9A29UcqJm> zb%%gg83JBY2zUh{;PrxlR|f)K3kYcP5zw3?ps7YcGmL;H76HvC0-8nyG1U%LVcw`aqI3nOtL%?H%fJX$uZ~nFV@UV&776G>;0&X`1 z+)4 z>`C?_dy{?0zGOf0S@JouKRJLLXwvFK#O7e8hmb?bR5FbmMh+)OkR!=avWB&}wk>+W2oy6!6gE+%C_l792EiPqM63THFBofNm70<8RJnI?4?pIjwU765VzuDpD|^Eu z<(b$Z&qhTTt$n-$2JQ)@yaD$g38Ilqh6F88TIy8~ShCq}NyGyJ7I%ayXw9{0Ty z*xKxg$fwdappB^Pp+(vE8*dKG|FUl6u(UbXrR}NWqP35APJz{dFN!sc+>y3yzqDxy zS!mOf7X`XrHX_BOjjS$hWz{US;j%LV=km9TtdX{NnzX^yve0fUIX-YUM~4X7bhPb> zE?S%y;xn%e4CHLxCGxerE7r?9qq>XMKDXj`dj@{G&@Hl0-a*ynT~s3rt@C+u zHMoa^2Mrk&^A30KC~ahWhfgn%am!EgS}_70n{9-5NP$mV1VvL)Gy zY)!Ty+mh|b_GAaLBiV`UOm-o=lHJJeWDl|@*^BH=_96R{{m5s@=g9u#0CJ$okTHlH zOb#K3lBr}GIgA`mjvz;pqsYr$InAUsBL$l;GW`N-iUplW&qM$d%+O zay6Ol9aqrMdA-(+lt7Og;qSn;Ecmxh2a^(L(J=<#WA4lJ!z$brSkqZY+F4KWuZMEsSrGM z=~~#frt)Q>-CUqjP&~x2ZKdVULYq4wAt)YV_%5wK+dGV}U;B7Zep@xzXZ60YZB^Rd zVZ7F^GpDs`dx!B_yW9(_b_X^$NsNpTD|nq)!M1nkrXB9z8R$8qM&w1Yu748iS`4Y5 z-4AxTL+)%3G;UohGM`qv?H#(68;EQSj2Ie-*xrEc9lB}9eX%M~b5g^I?Pb{BVZ7F^ zhp#?a9Ju#oa>VvtZ12!bd$-o?fOv=z+bgoYLpN=Q@23RBLyXwomhBz7X}_N{H1K)j z&KX{u?H#&loz|-D9lB}7GYn44nLlECowj%AroG(qZ-Lu~3Po&h*7gqFwBi{CX6`H& zvAty5J9N{YUwAhl9%2NZ;Q{dwZST;j#XZq$#f^Y?h!NYXx4lEB7S}Fm`PqPYh!J>( z=q<3l!+0$w_(8jP{?UMVh!J>(3*}z3y+b$crJ9j|c!-f7<=(|T47=8?J;U*izp^(V z9%2N~1fGqGS!kWTG5##H9S-YcHruf;=5$U-ZgVeoqLqOjeIRy7Ol+5D}7 z2g}X~+r4wuveM@05ZqC6eE6z(hHb?|O!Uy2?Mdq{!6vT_46hZ>@Eh?Et9xj1ZsHjR z%iZl6wtFdSWTACFZ}1MwNTU`TJe)XU*zn1|i_um_$w3`ba{sBHdC%c<5C_ZX;Sd=; z{B!o`q15s(%|8qo^~|FR838g#K1tRm8<0+HYZzBj)kUT^lCXbNslmF`eq5b~L^?>&u{6jA-{KMZk{6nV}?|MY| zhkYIXp;K$WgW(^xbohr}TKI>v9R8tGYuX!f4Db(2JN!eZ);n*L$B*p#p>;U9Ww-TXtR)~*LP|In$mk0Fiz;Y)G; zp_kUpKXhvCI)i^W+~FTOwe~TLrGHqLqfqb*gPNY2Exo zFRjzwgn#Izb@LCsw3l4`Loe+j7yr;pd(Oo_bZYHu4F9l!_=j6L>I?tSskN`gGxQJb z(Pa3CUfM-*{^0`phhAFvhn2-YMBfJPVfcq`S{(DZIR6kMi0}`+v~K>Pm)6Zcbkm|P z-26kQ)~;VS|In$m>(|Xc^wPTdhhADY|IkZ&PW;2S#Xn3J|F9kXLoaO(@eiAce`wD( zfq&?wb@LCsw9e-(esZZfdKhyL>+ULRl)pbD+dY)3$K!~At{4P7MhJLB5d7xf?BPSp zJ+!`Djw-R-L+i`sNL%iq^` E%(s+k~z|C@JB+nduY|eC=2G7)v;*}A6j2xN7@=b zw7#^C^aT8oFwuhfMRsgXX8L(@3OSXWM!rD4Nd9vTAIgtsn#Ub7mXX%*VaRxs=@sNk zauvCnTtluU*OBYV4dh$oMsgFmnY7%)kYTxp@>*lQ9k+;bY$&bi8h&+!28d358brCa+zG} zRc>#W$)#S}<}$f-p-e8d&4@g54qjSJF8!@cE}bGnhwC`G)J+SMN`?*t`#HI^Bqx`8 zX)(FJ*UXjVA zLu7JkRhj74gOf|Ww3u9ag_BFih#8FGLoaRo4p>9;buw5|+qg*my@ON+^+zjI73_0m?B$)$Z{ za_Ppn$)#S}-^t|CT#m`5URtNQYP*MS&l@I}KH->L>Qyc#m!>-=m%3?j|H{x|a0w@u zHsRz_H!bRSJSUg#le!IXa;Z~`GNFBvlS^yMHQUa~rB1Ewz6|8#(&jRBn3t1F-Lx1& z+$57rm&)YQx#Aj*;^a~L zX_vUkrC!?loLqWEo?$%8m0X@7yWC?kxl~-l$Zz5%mwJ`^lT0pM=$KsU)Y|ns+hua8 zm-ezuF6}OpON+)$E_G^gyomc{a_JeFT)Ily-WNEz)TyY$;%=Dq4Ayiz7DrE_Yz(3a59mekO~ zDO9cB(i++_8rrfN+Hx9Nj2Wt)8wM#3!sW@&FkoBjkJJLGloJm^?ySlSxB{HJLPIe8Bu;*V;>*u(!X*q`0&vGMeIfmBHawBayhStw>BW*c`*3WYzZ8?V4&vYYgIfmBH zbR%s!hStw@BW*c`*3We#{XZQowBLUVAMpNzW2mZyW2mZyW2mZyW2mZyW2mZyW2mZy zW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZy zW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mZyW2mb2YiQvZs+J4K zP*n@ZP*n@ZP*n@ZP*n@ZP*n@ZP*n@ZP*n@ZP*n@ZuoxXfYaZ#C)@jDy&j*bIH%t8s zd4?eaPdzLhJkcPYRuE4jh^Gw169nSv0R1HHYNT<;g18$&+-V^0A`o{7h^r6c%7VCR z;N#>IWKFUbS(~gw)-`D@M1;)%(?Rk{vOd{>e2SEzVly-%8AXP9dj~)5sUd7s;2% zm&sSiSIOyQhgpuah^(o8&F>Hu)j>5qXFFm~;*q+V8)}1Kxi*Wq(y|E)8vN4Q(C`ZC(xSLmJwA z8ru9C+J`l?1vIn;HME5^w1qXak7#I%XlRRSXp3oRi)(00XlP4nXiI5mOKWJ$XlTo7 zXv=A6%WG&WXlNhR&_1T2t*D{(YiKKJXe(=It7vEwG_+MUwAD1Ui5lAK8rm8fT6l)V zrBRzSeB!uqW6as4>G#K<7_z2;QGU%hdHY*aqCtDm@IPeGP-6C=p;R-1-~5|BXxN1H z(3EUOHYZz_&DcdyqZJUSw~w580ROM?OnF zNA@QNkORp<7Wk{m^jCdZIt$#LX(asoM#oJ3A0pC_k~Q^{%M z3*?LBOXSPsE99%>bTUM~M$RB-lC#L! zNvwoC$oI*kgpuah^(o8&F>Hu)j>5qXFFm~^^^_WQ5&1Kxi*Wq(y|E)8vN4Q(C`ZC(xS zLmJwA8ru9C+J`l?1vIn;HME5^w1qXak7#I%XlRRSXp3oRi)(00XlP4nXiI5mOKWJ$ zXlTo7Xv=A6%WG&WXlNhR&_1T2t*D{(YiKKJXe(=It7vEwG_+MUwAD1Ui5lAK8rm8f zTDXSzg;KbNV`@J?ethc0!Q+O$;5*bhpRxOgA}P(rtPvC7=l=awj^7Tt;sfITe2P5p6oz&Bs-Cv$u4A9vK!f*>_PS+2FOV;iFOe^kuaK{j)5#F|8aacUNzNi?lXJ+qRBHiXxJGp~=n|z0Sm)uG2 zB6pK}$i3t~azA;143iP^J@O!Vh&)UlA>SvDk{^)A$m8S*QeF;bI7yx&Pm^cJv*bDQ zJb8hJq;xiqx7 zHMDs&w0SkO4{2!gX=w9nXdl+l7SPZZ)X)~v&=%IvKBA#5qMwAKzasCO~HY5MziF#Xl4uG21_sx<>Gu zf3y9=Caj01WHYik*@A3Iwjx`TZOFD{JF-35f$T_jB0G~^$gX5JvOC#>>`C?_dy{?0 zzGOf0S@JouKRJLLNDd+glS9a%WGb0P4kL$?Bgm2DC~`D8h8#8}+@)KkK>(HWG>)i5kx-X$;*Y4fY@dA{PLn7Xr zN8cQ1+BrT6gRDUy^RU&ZTnAd0+%I{OUU?@W-qW>xOT<@tO^WMAaP_LUztV0llN z`&#AIV0k^v&#;cQy5u#LePem@BM2-nwy)1uDu3^2)hi2AZY*zm5~bmI9(yKe<{inE zBgsC#3X->=-k(!uXXN>OWn|xlk{8?8=Sx`B&8Q{i-9LSkW>d&m@m}eZ$eaCaRPwCj zTPbu*!eT6rkWxAyZ2QRFRY^#qUE=UXj#*mr40UdTAY@@ATO*i(MYg5}N1$n*KO zvb^KwXP^#zz8x$tmM1@Jma}Wz+;Xy0_;uLr?6*XPa=(N*mbZ2VK>5VLmJz#pI~pnK7)OPG`3-< zz^;KE1Um$2Y{MRa{Q!Fd?|Y=NjrT6z(|E7ry^1up@qWYm5bw{5Ok*4G5xjT&67ilu z8rx{E(Z1t-fc6+^Y(Fj$?I_yaCz!@|ZHcuc)|6O>X>2#?*ro%{0|7c&RHP}|*3pA} zKC8oRVf7~qf7vCa%76_0?6fPl(Iz(qj71wg>XK(G%M7Xtwo0s$8V0hNz{i-Ld)f`E&IfQx{Di-Uj* zgMf>KfQx~Ei-dp+gn)~MfQy2Fi-mv-hk%QQ;5YyN|Lbu3nZqd8Z*rHm54?W3PU(tT zTuW6g9x7EW?g>>b?i*Dt?k!a~hoM+?*@S!n|>6p+m%yU6;9J z*Jv);<<#2GbNrHB)461qm$soS*_Gy4vdgKpk71ZB*;U`MWS3KmV}Kq@c1@5ayS8y< zV3;>v+D~Q4u5VO=?KZXAVqK1hj^Tw&gHADT@=aOA@xDq$a8>iO3&jxYHt`@RnR~|0e<)z&$OLi@hCA;Ry zl3gRYWS5t=k}TPEMV9QED);Vx$*RsUZ=72DcrSCwF0AIfflGEdwf6BkS5Wt7QSMV* zvg@im!(VdAE@!#+F&vjAySB=bUG|FaFmK$n(BGFOyXHHV>~d=D^*6vgR&@T*nVo!dE=!$AE^*Lb?I98 zj#xJP#lo?zoA_g}%iUa{Qcx_M@L{oRuCM85E=cNCZtjGHpjbHJyIgP(oi|?EliyYi z_F26zY`2Q&ym4ynI&-$RwsqrnycbsO4s33c7#Sh0_&RCD(Rt%6*FLx5{+)rIGipR$ zO2Mv4nVtj{?UL~I1yMj3*}xz=Z%;4 zQq4#}ES$)XV%gvxwyhiIG2nQ|U)dWF3nzkS0?$T8mvZs>&^o;de-_$~hZBR13hfTV zOTn{@&Ku|P+V`X^MjAZrdnerS)_~~e(ni?Ujoa}q__A&=_tTrhSEbFtLdfX6@hbO= zVhw`}3ak#>3oN7a#!D-fP4Ig1qHyA*j!}4l=)CdLp3UDXc(Ck@u*HL|G`sgkE{p`f`S+L8dt+a} zTo1T@uy4Gyuy20juy34N+^dMNZ~8jy8>iO3hhX2dbl5juTG%(U9QKV46tuX zJM0^$);%PI|$Mvi5fa_s}>&;?J@GJ6X?G2(qeGx3J0ggNHdP^8!v7A z;MA+~dO-J$m-ZZpx(#q}%Be+}&_2n* zsoHYQw#&7%%^SCK8_2<_=F)YOmxEKza#1F_a5l-{)KVFonk%NwC=O0}Y5g)dl`ex* zQ)r&s=1u%D*vET`gHyxgnOM)kDQCI1_Su1Z0_k(AMY_ndR!yEcze}Cj+WH)vx+2do zo@I33c$Irh2B*ZtiTsA$yXe00(*7iaQwtq~Q%)`F3~{#0;FOp4vJ6gjm%*u`af4G% zEzS*bzYI>Dk-@1|()PZvM^MpcV3DOD}Tq*S#qYE-o_YE-r8vr*Ne&qh@X zqefK=qefK=qefMWF)39o#-voWFltn_7?V=fVoXX^i!muxEyko&wJ>T_wHT99)nZIa zRSTm=Rf{nxRV|DfRV|!ERV~J(RJAZ_RJ9c~w0;dOj2hKrfKj8W#h8?;7GqMXT8v4l zYB46Is)bRbs>PU;sup8Xs#+K|H>Gh;9W>FJN^Gx}IsXCcL1!B_Qp*zj=HFkAVPjvv z?Df1;qmQT6Hy%_EFl#G~3>#G~3>#G~3>#G~3>#G~3>#G~3>#G~3>#G~44YdtZ1mUj z4&{)KVz4*S6@UOY9|0~r0^D;1xZVhGs}b;KLBLxB0dE8ZwDt&S$q~>>BcKIFK)#3P^xRp;yS5naV=G~ zxZbK-+!Lx=+&8LP+*_(z+<&TC+@q>m+{da~-0P}ZJP)c`JTt0VJXfk(JbS8IJfEss zJj1G5Jm;!fv<0eKv=^#cv?;1uv^%O=v`wm7v|p-Pv~j9hw1cWzw3Vt_w5O_CST?F! zST?F!ST?F!zlIi;jcU2DY*e+dY*e+dY*e+dY*e+dY*e+dY*e+dY*e+dY*e+dY;H^A z{@+}WHfGvjSPmg%Sf)+LuuL17S;>6Mvto&6-TtB5RX% z$e;bZ4c8OSUQf|lSNTEpfcsB%T}hZWs#=&fs#=&fs#=&fs#=&fs#=&fs#=&fs#=&f zs#-k5s#-kfs#>%Ks#>%cs#=&fs#=&fs#=&fs#=&fs#=&fs#=&fs#=&fs#=&fs#=&f zs#=&fs#=&fs#?E>7ViMna`B!})#6>Es>S<8Rf~6$suu4pRW06as#?7NRJC|Vs%l}{ z;2To^ll2s1_D$?J6D|AZm)3O?GOVr}nQkg|1iQoPx{=@AWZLSw2^m(`O~|miZbHUC zrt2nTSoTfGu7O~->7O~->7QwPEyt4y``$fyG>P#_n)d3??_c`ynXZET@UOZXWxVj zygOib;JpB%%?Ht*gJ`Qkw8J3USn&VN&{W94vxd*Za|GfU0sSWbwYxdtLYR&!|MXlL?qo_6eZxpp=|Ba&7 z?7vaen*BG5TC@K~QET?!C~D3A8%3?zf1{}NYdrI2|BYg~uy0h`60`qCv0StNMp0|_ a-zaL${u@QD*?*&`g?*!153p}kwf`5<-Z2;e literal 75074 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 RwK41)rPcK_*f*xy{{jnz_mltt diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_creeper.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_creeper.b3d index 54341579c7a4b4b9e9cde54d30469dad7c312f4d..e04ffc7b07334a928c0494deca10668e3c46db65 100644 GIT binary patch literal 139359 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 diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_mooshroom.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_mooshroom.b3d index 725268ea9838cc579f732c857b0b31eb72b80fb7..c009839191e272db590eb0e08be0c90356b4acf6 100644 GIT binary patch literal 71850 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 a-zaL${u@QD*?*&`g?*!153p}kwf`5<-Z2;e literal 54175 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 From 1e5ae0bbac08dfd2013ba72c8c149509505589fa Mon Sep 17 00:00:00 2001 From: kay27 Date: Wed, 21 Apr 2021 00:36:07 +0400 Subject: [PATCH 067/136] [mcl_beds] Fix screwdriver/bed duplication glitch, https://git.minetest.land/MineClone2/MineClone2/issues/1149 --- mods/ITEMS/mcl_beds/api.lua | 147 +++++++++++++++++++++++------------- 1 file changed, 94 insertions(+), 53 deletions(-) diff --git a/mods/ITEMS/mcl_beds/api.lua b/mods/ITEMS/mcl_beds/api.lua index a2df1bdf3..c0b25b1c5 100644 --- a/mods/ITEMS/mcl_beds/api.lua +++ b/mods/ITEMS/mcl_beds/api.lua @@ -1,23 +1,95 @@ local S = minetest.get_translator("mcl_beds") -local function destruct_bed(pos, oldnode) - local node = oldnode or minetest.get_node(pos) +local minetest_get_node = minetest.get_node +local minetest_get_node_or_nil = minetest.get_node_or_nil +local minetest_remove_node = minetest.remove_node +local minetest_facedir_to_dir = minetest.facedir_to_dir +local minetest_add_item = minetest.add_item +local vector_add = vector.add +local vector_subtract = vector.subtract + +local function get_bed_next_node(pos, node) + local node = node or minetest_get_node_or_nil(pos) if not node then return end - local dir = minetest.facedir_to_dir(node.param2) - local pos2, node2 + + local dir = minetest_facedir_to_dir(node.param2) + + local pos2, bottom if string.sub(node.name, -4) == "_top" then - pos2 = vector.subtract(pos, dir) - node2 = minetest.get_node(pos2) - if node2 and string.sub(node2.name, -7) == "_bottom" then - minetest.remove_node(pos2) - end - minetest.check_for_falling(pos) - elseif string.sub(node.name, -7) == "_bottom" then - minetest.add_item(pos, node.name) - pos2 = vector.add(pos, dir) - node2 = minetest.get_node(pos2) + pos2 = vector_subtract(pos, dir) + else + pos2 = vector_add(pos, dir) + bottom = true + end + + local node2 = minetest_get_node(pos2) + return pos2, node2, bottom, dir +end + +local function rotate(pos, node, user, mode, new_param2) + if mode ~= screwdriver.ROTATE_FACE then + return false + end + + local p, node2, bottom = get_bed_next_node(pos, node) + if not node2 then return end + + local name = node2.name + if not minetest.get_item_group(name, "bed") == 2 or not node.param2 == node2.param2 then return false end + + if bottom then + name = string.sub(name, 1, -5) + else + name = string.sub(name, 1, -8) + end + + if minetest.is_protected(p, user:get_player_name()) then + minetest.record_protection_violation(p, user:get_player_name()) + return false + end + + local new_dir, newp = minetest_facedir_to_dir(new_param2) + if bottom then + newp = vector_add(pos, new_dir) + else + newp = vector_subtract(pos, new_dir) + end + + local node3 = minetest_get_node_or_nil(newp) + if not node3 then return false end + + local node_def = minetest.registered_nodes[node3.name] + if not node_def or not node_def.buildable_to then return false end + + if minetest.is_protected(newp, user:get_player_name()) then + minetest.record_protection_violation(newp, user:get_player_name()) + return false + end + + node.param2 = new_param2 + -- do not remove_node here - it will trigger destroy_bed() + minetest.swap_node(p, {name = "air"}) + minetest.swap_node(pos, node) + minetest.swap_node(newp, {name = name .. (bottom and "_top" or "_bottom"), param2 = new_param2}) + + return true +end + + +local function destruct_bed(pos, oldnode) + local node = oldnode or minetest_get_node_or_nil(pos) + if not node then return end + + local pos2, node2, bottom = get_bed_next_node(pos, oldnode) + + if bottom then + minetest_add_item(pos, node.name) if node2 and string.sub(node2.name, -4) == "_top" then - minetest.remove_node(pos2) + minetest_remove_node(pos2) + end + else + if node2 and string.sub(node2.name, -7) == "_bottom" then + minetest_remove_node(pos2) end end end @@ -94,7 +166,7 @@ function mcl_beds.register_bed(name, def) local under = pointed_thing.under -- Use pointed node's on_rightclick function first, if present - local node = minetest.get_node(under) + local node = minetest_get_node(under) if placer and not placer:get_player_control().sneak then if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack @@ -102,7 +174,7 @@ function mcl_beds.register_bed(name, def) end local pos - local undername = minetest.get_node(under).name + local undername = minetest_get_node(under).name if minetest.registered_items[undername] and minetest.registered_items[undername].buildable_to then pos = under else @@ -115,13 +187,13 @@ function mcl_beds.register_bed(name, def) return itemstack end - local node_def = minetest.registered_nodes[minetest.get_node(pos).name] + local node_def = minetest.registered_nodes[minetest_get_node(pos).name] if not node_def or not node_def.buildable_to then return itemstack end local dir = minetest.dir_to_facedir(placer:get_look_dir()) - local botpos = vector.add(pos, minetest.facedir_to_dir(dir)) + local botpos = vector_add(pos, minetest_facedir_to_dir(dir)) if minetest.is_protected(botpos, placer:get_player_name()) and not minetest.check_player_privs(placer, "protection_bypass") then @@ -129,7 +201,7 @@ function mcl_beds.register_bed(name, def) return itemstack end - local botdef = minetest.registered_nodes[minetest.get_node(botpos).name] + local botdef = minetest.registered_nodes[minetest_get_node(botpos).name] if not botdef or not botdef.buildable_to then return itemstack end @@ -152,38 +224,7 @@ function mcl_beds.register_bed(name, def) return itemstack end, - on_rotate = function(pos, node, user, mode, new_param2) - local dir = minetest.facedir_to_dir(node.param2) - local p = vector.add(pos, dir) - local node2 = minetest.get_node_or_nil(p) - if not node2 or not minetest.get_item_group(node2.name, "bed") == 2 or - not node.param2 == node2.param2 then - return false - end - if minetest.is_protected(p, user:get_player_name()) then - minetest.record_protection_violation(p, user:get_player_name()) - return false - end - if mode ~= screwdriver.ROTATE_FACE then - return false - end - local newp = vector.add(pos, minetest.facedir_to_dir(new_param2)) - local node3 = minetest.get_node_or_nil(newp) - local node_def = node3 and minetest.registered_nodes[node3.name] - if not node_def or not node_def.buildable_to then - return false - end - if minetest.is_protected(newp, user:get_player_name()) then - minetest.record_protection_violation(newp, user:get_player_name()) - return false - end - node.param2 = new_param2 - -- do not remove_node here - it will trigger destroy_bed() - minetest.set_node(p, {name = "air"}) - minetest.set_node(pos, node) - minetest.set_node(newp, {name = name .. "_top", param2 = new_param2}) - return true - end, + on_rotate = rotate, }) local node_box_top, selection_box_top, collision_box_top @@ -217,7 +258,7 @@ function mcl_beds.register_bed(name, def) mcl_beds.on_rightclick(pos, clicker, true) return itemstack end, - on_rotate = false, + on_rotate = rotate, after_destruct = destruct_bed, }) From dccb71e2fb91600779a7d3db4ad588ce948ea2a3 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 21 Apr 2021 11:34:22 +0200 Subject: [PATCH 068/136] Fix view_range_factors warning --- mods/ITEMS/mcl_armor/player.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_armor/player.lua b/mods/ITEMS/mcl_armor/player.lua index 4d90ec0e2..e5471e7e1 100644 --- a/mods/ITEMS/mcl_armor/player.lua +++ b/mods/ITEMS/mcl_armor/player.lua @@ -64,7 +64,7 @@ function mcl_armor.update_player(player, info) local meta = player:get_meta() meta:set_int("mcl_armor:armor_points", info.points) - mcl_armor.player_view_range_factors[player] = view_range_factors + mcl_armor.player_view_range_factors[player] = info.view_range_factors end local function is_armor_action(inventory_info) From 74a3b2654f5e45783c8d9b6c243f3855fc697a0a Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 21 Apr 2021 13:28:22 +0200 Subject: [PATCH 069/136] Create inventory if not present in mcl_armor.equip --- mods/ITEMS/mcl_armor/api.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua index c3a84f265..4f2b2593a 100644 --- a/mods/ITEMS/mcl_armor/api.lua +++ b/mods/ITEMS/mcl_armor/api.lua @@ -44,7 +44,7 @@ function mcl_armor.equip(itemstack, obj, swap) end local element = mcl_armor.elements[def._mcl_armor_element or ""] - local inv = mcl_util.get_inventory(obj) + local inv = mcl_util.get_inventory(obj, true) if element and inv then local old_stack = inv:get_stack("armor", element.index) From acbdc937b42b1870d5322567a92172db7341db7f Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 22 Apr 2021 13:19:26 +0200 Subject: [PATCH 070/136] Fix crash when trying to explode an unknown node --- mods/CORE/mcl_explosions/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/CORE/mcl_explosions/init.lua b/mods/CORE/mcl_explosions/init.lua index 34375248e..cd16aa879 100644 --- a/mods/CORE/mcl_explosions/init.lua +++ b/mods/CORE/mcl_explosions/init.lua @@ -212,7 +212,7 @@ local function trace_explode(pos, strength, raydirs, radius, info, puncher) npos_x - emin_x + 1 local cid = data[idx] - local br = node_blastres[cid] + local br = node_blastres[cid] or INDESTRUCT_BLASTRES if br < INDESTRUCT_BLASTRES and br > max_blast_resistance then br = max_blast_resistance end From 8b23388d63ed377eabb93ac50a4c94ec3d3d8921 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 22 Apr 2021 13:22:20 +0200 Subject: [PATCH 071/136] Fix #1590 (Bed drops itself when gets exploded) --- mods/ITEMS/mcl_beds/functions.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 86f6a6852..f3824a6f3 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -301,7 +301,11 @@ function mcl_beds.on_rightclick(pos, player, is_top) local dim = mcl_worlds.pos_to_dimension(pos) if dim == "nether" or dim == "end" then -- Bed goes BOOM in the Nether or End. + local node = minetest.get_node(pos) + local dir = minetest.facedir_to_dir(node.param2) + minetest.remove_node(pos) + minetest.remove_node(string.sub(node.name, -4) == "_top" and vector.subtract(pos, dir) or vector.add(pos, dir)) if explosions_mod then mcl_explosions.explode(pos, 5, {drop_chance = 1.0, fire = true}) end From 222104b3cbe419b04c209ff2257a2030df6ec2d4 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 22 Apr 2021 13:51:36 +0200 Subject: [PATCH 072/136] Integrate dispensers --- mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 91 ++++----------------- 1 file changed, 15 insertions(+), 76 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index faf2ff742..02ed70aed 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -136,93 +136,32 @@ local dispenserdef = { -- Hardcoded dispensions -- -- Armor, mob heads and pumpkins - if igroups.armor_head or igroups.armor_torso or igroups.armor_legs or igroups.armor_feet then - local armor_type, armor_slot - local armor_dispensed = false - if igroups.armor_head then - armor_type = "armor_head" - armor_slot = 2 - elseif igroups.armor_torso then - armor_type = "armor_torso" - armor_slot = 3 - elseif igroups.armor_legs then - armor_type = "armor_legs" - armor_slot = 4 - elseif igroups.armor_feet then - armor_type = "armor_feet" - armor_slot = 5 - end + if igroups.armor then + local droppos_below = {x = droppos.x, y = droppos.y - 1, z = droppos.z} - local droppos_below = {x=droppos.x, y=droppos.y-1, z=droppos.z} - local dropnode_below = minetest.get_node(droppos_below) - -- Put armor on player or armor stand - local standpos - if dropnode.name == "mcl_armor_stand:armor_stand" then - standpos = droppos - elseif dropnode_below.name == "mcl_armor_stand:armor_stand" then - standpos = droppos_below - end - if standpos then - local dropmeta = minetest.get_meta(standpos) - local dropinv = dropmeta:get_inventory() - if dropinv:room_for_item(armor_type, dropitem) then - dropinv:add_item(armor_type, dropitem) - minetest.registered_nodes["mcl_armor_stand:armor_stand"].on_metadata_inventory_put(standpos) - stack:take_item() - inv:set_stack("main", stack_id, stack) - mcl_armor.play_equip_sound(dropitem, nil, standpos) - armor_dispensed = true - end - else - -- Put armor on nearby player - -- First search for player in front of dispenser (check 2 nodes) - local objs1 = minetest.get_objects_inside_radius(droppos, 1) - local objs2 = minetest.get_objects_inside_radius(droppos_below, 1) - local objs_table = {objs1, objs2} - local player - for oi=1, #objs_table do - local objs_inner = objs_table[oi] - for o=1, #objs_inner do - --[[ First player in list is the lucky one. The other player get nothing :-( - If multiple players are close to the dispenser, it can be a bit - -- unpredictable on who gets the armor. ]] - if objs_inner[o]:is_player() then - player = objs_inner[o] - break - end - end - if player then + 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 player found, add armor - if player then - local ainv = minetest.get_inventory({type="detached", name=player:get_player_name().."_armor"}) - local pinv = player:get_inventory() - if ainv:get_stack("armor", armor_slot):is_empty() and pinv:get_stack("armor", armor_slot):is_empty() then - ainv:set_stack("armor", armor_slot, dropitem) - pinv:set_stack("armor", armor_slot, dropitem) - mcl_armor.update(player) - mcl_armor.play_equip_sound(dropitem, player) - - stack:take_item() - inv:set_stack("main", stack_id, stack) - armor_dispensed = true - end + if stack:is_empty() then + break end + end -- Place head or pumpkin as node, if equipping it as armor has failed - if not armor_dispensed 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() - inv:set_stack("main", stack_id, stack) - end + 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 + inv:set_stack("main", stack_id, stack) -- Spawn Egg elseif igroups.spawn_egg then -- Spawn mob From f9c2d710e2196d078ec8a7f2323d618a7af22be5 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 22 Apr 2021 13:52:02 +0200 Subject: [PATCH 073/136] Fix armor being taken even if it cannot be equipped --- mods/ITEMS/mcl_armor/api.lua | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua index 4f2b2593a..d56e3188d 100644 --- a/mods/ITEMS/mcl_armor/api.lua +++ b/mods/ITEMS/mcl_armor/api.lua @@ -43,22 +43,25 @@ function mcl_armor.equip(itemstack, obj, swap) return itemstack end - local element = mcl_armor.elements[def._mcl_armor_element or ""] local inv = mcl_util.get_inventory(obj, true) - if element and inv then + if not inv or inv:get_size("armor") == 0 then + return itemstack + end + + local element = mcl_armor.elements[def._mcl_armor_element or ""] + + if element then local old_stack = inv:get_stack("armor", element.index) local new_stack if swap then new_stack = itemstack itemstack = old_stack - else - new_stack = itemstack:take_item() end if swap or old_stack:is_empty() then - inv:set_stack("armor", element.index, new_stack) + inv:set_stack("armor", element.index, new_stack or itemstack:take_item()) mcl_armor.on_equip(new_stack, obj) end end From 62adbb96258da7ef49871996585dfff50e491730 Mon Sep 17 00:00:00 2001 From: epCode Date: Thu, 22 Apr 2021 10:39:21 -0700 Subject: [PATCH 074/136] Fix #1587 --- .../models/3d_armor_entity.obj | 488 ++++++++++++++---- 1 file changed, 377 insertions(+), 111 deletions(-) diff --git a/mods/ITEMS/mcl_armor_stand/models/3d_armor_entity.obj b/mods/ITEMS/mcl_armor_stand/models/3d_armor_entity.obj index 052f69255..37bc521e9 100644 --- a/mods/ITEMS/mcl_armor_stand/models/3d_armor_entity.obj +++ b/mods/ITEMS/mcl_armor_stand/models/3d_armor_entity.obj @@ -1,79 +1,132 @@ -# Blender v2.73 (sub 0) OBJ File: '3d_armor_entity_3.blend' +# Blender v2.92.0 OBJ File: '' # www.blender.org mtllib 3d_armor_entity.mtl +o Cube +v 1.000000 1.000000 -1.000000 +v 1.000000 -1.000000 -1.000000 +v 1.000000 1.000000 1.000000 +v 1.000000 -1.000000 1.000000 +v -1.000000 1.000000 -1.000000 +v -1.000000 -1.000000 -1.000000 +v -1.000000 1.000000 1.000000 +v -1.000000 -1.000000 1.000000 +vt 0.625000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 0.750000 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.125000 0.500000 +vt 0.375000 0.500000 +vt 0.125000 0.750000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +usemtl Material +s off +f 1/1/1 5/2/1 7/3/1 3/4/1 +f 4/5/2 3/4/2 7/6/2 8/7/2 +f 8/8/3 7/9/3 5/10/3 6/11/3 +f 6/12/4 2/13/4 4/5/4 8/14/4 +f 2/13/5 1/1/5 3/4/5 4/5/5 +f 6/11/6 5/10/6 1/1/6 2/13/6 o Player_Cube -v 2.200000 9.763893 1.200000 -v 2.200000 9.763893 -1.200000 +v 2.200000 9.763893 1.200001 v 2.200000 2.663871 1.200000 v 2.200000 2.663871 -1.200000 +v 2.200000 9.763893 -1.200000 v -2.200000 9.763893 -1.200000 -v -2.200000 9.763893 1.200000 -v -2.200000 2.663871 -1.200000 +v -2.200000 9.763893 1.200001 v -2.200000 2.663871 1.200000 -v 2.300000 13.863962 2.300000 -v 2.300000 13.863962 -2.300000 +v -2.200000 2.663871 -1.200000 +v 2.300000 13.863962 2.300001 v 2.300000 9.263885 2.300000 -v 2.300000 9.263885 -2.300000 -v -2.300000 13.863962 -2.300000 -v -2.300000 13.863962 2.300000 -v -2.300000 9.263885 -2.300000 +v 2.300000 9.263885 -2.299999 +v 2.300000 13.863962 -2.299999 +v -2.300000 13.863962 -2.299999 +v -2.300000 13.863962 2.300001 v -2.300000 9.263885 2.300000 +v -2.300000 9.263885 -2.299999 v -2.322686 2.473175 -1.300000 v -2.322686 2.473175 1.300000 v -4.713554 2.682348 1.300000 v -4.713554 2.682348 -1.300000 -v -1.686446 9.745432 -1.300000 -v -1.686446 9.745432 1.300000 +v -4.077313 9.954605 -1.299999 v -4.077313 9.954605 1.300000 -v -4.077313 9.954605 -1.300000 -v 4.077313 9.954605 -1.300000 -v 4.077313 9.954605 1.300000 +v -1.686446 9.745432 1.300000 +v -1.686446 9.745432 -1.299999 v 1.686446 9.745432 1.300000 -v 1.686446 9.745432 -1.300000 -v 4.713554 2.682348 -1.300000 -v 4.713554 2.682348 1.300000 v 2.322686 2.473175 1.300000 +v 4.713554 2.682348 1.300000 +v 4.077313 9.954605 1.300000 +v 1.686446 9.745432 -1.299999 v 2.322686 2.473175 -1.300000 +v 4.077313 9.954605 -1.299999 +v 4.713554 2.682348 -1.300000 +v 2.538733 2.980834 -1.210000 v 0.139099 2.938947 -1.200000 v 0.139099 2.938947 1.200000 -v 0.261266 -4.059988 1.200000 -v 0.261266 -4.059988 -1.200000 -v 2.660901 -4.018101 1.190000 -v 2.660901 -4.018101 -1.210000 v 2.538733 2.980834 1.190000 -v 2.538733 2.980834 -1.210000 -v -0.139099 2.938947 -1.200000 -v -0.139099 2.938947 1.200000 -v -0.261266 -4.059988 1.200000 -v -0.261266 -4.059988 -1.200000 +v 0.261266 -4.059988 -1.200000 +v 2.660901 -4.018101 -1.210000 +v 2.660901 -4.018101 1.190000 +v 0.261266 -4.059988 1.200000 v -2.538734 2.980834 -1.210000 v -2.538734 2.980834 1.190000 +v -0.139099 2.938947 1.200000 +v -0.139099 2.938947 -1.200000 +v -0.261266 -4.059988 1.200000 +v -0.261266 -4.059988 -1.200000 v -2.660901 -4.018101 -1.210000 v -2.660901 -4.018101 1.190000 +v 0.000000 -4.387500 -1.400000 +v 0.000000 -4.387500 1.400000 v -2.799999 -4.387500 1.390000 v -2.799999 -4.387500 -1.410000 v -2.800000 -0.812499 1.390000 v -2.800000 -0.812499 -1.410000 -v -0.000000 -4.387500 -1.400000 -v -0.000000 -4.387500 1.400000 -v -0.000000 -0.812499 1.400000 -v -0.000000 -0.812499 -1.400000 -v 2.800000 -0.812499 -1.410000 -v 2.800000 -0.812499 1.390000 -v 2.799999 -4.387500 -1.410000 -v 2.799999 -4.387500 1.390000 +v 0.000000 -0.812499 1.400000 +v 0.000000 -0.812499 -1.400000 +v 0.000000 -0.812499 -1.400000 v 0.000000 -4.387500 -1.400000 v 0.000000 -4.387500 1.400000 v 0.000000 -0.812499 1.400000 -v 0.000000 -0.812499 -1.400000 -v 2.267006 13.830965 2.267006 -v 2.267006 13.830965 -2.267006 +v 2.800000 -0.812499 -1.410000 +v 2.799999 -4.387500 -1.410000 +v 2.799999 -4.387500 1.390000 +v 2.800000 -0.812499 1.390000 +v 2.267006 13.830965 2.267007 +v 2.267006 13.830965 -2.267005 +v 2.267006 9.296881 -2.267005 v 2.267006 9.296881 2.267006 -v 2.267006 9.296881 -2.267006 -v -2.267006 13.830965 -2.267006 -v -2.267006 13.830965 2.267006 -v -2.267006 9.296881 -2.267006 +v -2.267006 13.830965 -2.267005 +v -2.267006 13.830965 2.267007 +v -2.267006 9.296881 -2.267005 v -2.267006 9.296881 2.267006 +v -4.168111 10.060661 1.681621 +v 1.741822 -5.305762 4.169018 +v 1.718504 -5.438008 3.407457 +v -6.641035 -3.963995 3.407457 +v 4.191429 8.586647 1.681621 +v -6.617718 -3.831752 4.169018 +v 4.168111 8.454401 0.920061 +v -4.191429 9.928415 0.920061 +v -4.191429 8.586648 1.681620 +v 6.617716 -3.831752 4.169018 +v 6.641035 -3.963997 3.407457 +v -1.718504 -5.438006 3.407457 +v 4.168111 10.060658 1.681621 +v -1.741822 -5.305762 4.169018 +v 4.191429 9.928414 0.920061 +v -4.168111 8.454404 0.920061 vt 0.250000 0.375000 vt 0.250000 0.000000 vt 0.312500 0.000000 @@ -81,6 +134,8 @@ vt 0.312500 0.375000 vt 0.437500 0.375000 vt 0.437500 0.500000 vt 0.312500 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.375000 vt 0.562500 0.375000 vt 0.562500 0.500000 vt 0.437500 0.000000 @@ -97,97 +152,308 @@ vt 0.750000 1.000000 vt 0.625000 1.000000 vt 0.875000 0.750000 vt 0.875000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.750000 vt 0.750000 0.500000 +vt 0.875000 0.750000 vt 0.875000 0.500000 vt 1.000000 0.750000 vt 1.000000 0.500000 vt 0.750000 0.375000 +vt 0.750000 0.500000 vt 0.812500 0.500000 vt 0.812500 0.375000 vt 0.687500 0.375000 vt 0.687500 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.375000 +vt 0.687500 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.000000 vt 0.687500 0.000000 vt 0.750000 0.000000 +vt 0.687500 0.000000 +vt 0.812500 0.375000 vt 0.812500 0.000000 vt 0.875000 0.375000 vt 0.875000 0.000000 +vt 0.812500 0.375000 +vt 0.812500 0.000000 +vt 0.875000 0.000000 +vt 0.875000 0.375000 +vt 0.750000 0.375000 +vt 0.750000 0.000000 +vt 0.687500 0.375000 +vt 0.687500 0.000000 +vt 0.687500 0.375000 +vt 0.687500 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.375000 +vt 0.750000 0.500000 +vt 0.687500 0.500000 +vt 0.750000 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.500000 +vt 0.750000 0.500000 vt 0.125000 0.375000 vt 0.062500 0.375000 vt 0.062500 0.500000 vt 0.125000 0.500000 vt 0.187500 0.375000 +vt 0.125000 0.375000 +vt 0.125000 0.500000 vt 0.187500 0.500000 vt 0.000000 0.375000 vt 0.000000 0.000000 vt 0.062500 0.000000 +vt 0.062500 0.375000 +vt 0.250000 0.375000 +vt 0.250000 0.000000 +vt 0.187500 0.000000 +vt 0.187500 0.375000 +vt 0.125000 0.000000 +vt 0.062500 0.000000 +vt 0.187500 0.375000 vt 0.187500 0.000000 vt 0.125000 0.000000 -vt 0.437500 0.875000 -vt 0.437500 1.000000 -vt 0.375000 1.000000 -vt 0.375000 0.875000 -vt 0.250000 0.875000 -vt 0.312500 0.875000 -vt 0.312500 0.656250 -vt 0.250000 0.656250 -vt 0.500000 0.875000 -vt 0.437500 0.656250 -vt 0.500000 0.656250 -vt 0.375000 0.656250 -vt 0.312500 1.000000 -usemtl Armor +vt 0.125000 0.375000 +vt 0.125000 0.375000 +vt 0.125000 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.375000 +vt 0.187500 0.375000 +vt 0.125000 0.375000 +vt 0.125000 0.000000 +vt 0.187500 0.000000 +vt 0.062500 0.000000 +vt 0.125000 0.000000 +vt 0.250000 0.375000 +vt 0.187500 0.375000 +vt 0.187500 0.000000 +vt 0.250000 0.000000 +vt 0.000000 0.375000 +vt 0.062500 0.375000 +vt 0.062500 0.000000 +vt 0.000000 0.000000 +vt 0.187500 0.375000 +vt 0.187500 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.375000 +vt 0.381250 0.832812 +vt 0.381250 0.845312 +vt 0.375000 0.845312 +vt 0.375000 0.832812 +vt 0.362500 0.832812 +vt 0.368750 0.832812 +vt 0.368750 0.810938 +vt 0.362500 0.810938 +vt 0.387500 0.832812 +vt 0.381250 0.832812 +vt 0.381250 0.810938 +vt 0.387500 0.810938 +vt 0.375000 0.832812 +vt 0.368750 0.832812 +vt 0.368750 0.810938 +vt 0.375000 0.810938 +vt 0.381250 0.832812 +vt 0.375000 0.832812 +vt 0.375000 0.810938 +vt 0.381250 0.810938 +vt 0.375000 0.845312 +vt 0.368750 0.845312 +vt 0.381250 0.832812 +vt 0.381250 0.810938 +vt 0.375000 0.810938 +vt 0.375000 0.832812 +vt 0.375000 0.832812 +vt 0.375000 0.810938 +vt 0.368750 0.810938 +vt 0.368750 0.832812 +vt 0.387500 0.832812 +vt 0.387500 0.810938 +vt 0.381250 0.810938 +vt 0.381250 0.832812 +vt 0.362500 0.832812 +vt 0.362500 0.810938 +vt 0.368750 0.810938 +vt 0.368750 0.832812 +vt 0.381250 0.832812 +vt 0.375000 0.832812 +vt 0.375000 0.845312 +vt 0.381250 0.845312 +vt 0.368750 0.845312 +vt 0.375000 0.845312 +vt 0.500000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.500000 +vt 0.500000 0.500000 +vt 0.750000 0.750000 +vt 0.625000 1.000000 +vt 0.750000 1.000000 +vt 0.875000 0.750000 +vt 0.750000 0.750000 +vt 0.750000 1.000000 +vt 0.875000 1.000000 +vt 0.750000 0.500000 +vt 0.875000 0.750000 +vt 0.875000 0.500000 +vt 1.000000 0.750000 +vt 1.000000 0.500000 +vt 0.032859 0.558649 +vt 0.032859 0.998468 +vt 0.362724 0.998468 +vt 0.362724 0.558649 +vt 0.032859 0.558649 +vt 0.362724 0.558649 +vt 0.362724 0.998468 +vt 0.032859 0.998468 +vt 0.039157 0.992309 +vt 0.039157 0.656118 +vt 0.060169 0.656118 +vt 0.060169 0.992309 +vt -0.003415 0.501261 +vt 0.368238 0.501261 +vt 0.368238 0.563203 +vt -0.003415 0.563203 +vt 0.368238 0.996797 +vt -0.003415 0.996797 +vt -0.003415 0.934855 +vt 0.368238 0.934855 +vt 0.394691 0.498800 +vt 0.394691 0.994336 +vt 0.363720 0.994336 +vt 0.363720 0.498800 +vt 0.032859 0.998468 +vt 0.032859 0.558649 +vt 0.362724 0.558649 +vt 0.362724 0.998468 +vt 0.032859 0.998468 +vt 0.362724 0.998468 +vt 0.362724 0.558649 +vt 0.032859 0.558649 +vt 0.039157 0.656118 +vt 0.039157 0.992309 +vt 0.060169 0.992309 +vt 0.060169 0.656118 +vt -0.003415 0.996797 +vt 0.368238 0.996797 +vt 0.368238 0.934855 +vt -0.003415 0.934855 +vt 0.368238 0.501261 +vt -0.003415 0.501261 +vt -0.003415 0.563203 +vt 0.368238 0.563203 +vt 0.394691 0.994336 +vt 0.394691 0.498800 +vt 0.363720 0.498800 +vt 0.363720 0.994336 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -0.0000 1.0000 +vn -0.0872 -0.9962 0.0000 +vn 0.0872 0.9962 0.0000 +vn -0.9962 0.0872 0.0000 +vn 0.9962 -0.0872 0.0000 +vn -0.9962 -0.0872 0.0000 +vn 0.9962 0.0872 0.0000 +vn -0.0872 0.9962 0.0000 +vn 0.0872 -0.9962 0.0000 +vn -0.0175 0.9998 0.0000 +vn 0.0175 -0.9998 0.0000 +vn 0.9998 0.0175 0.0000 +vn 0.0042 0.0001 1.0000 +vn -0.0042 -0.0001 -1.0000 +vn -0.9998 -0.0175 0.0000 +vn 0.0175 0.9998 0.0000 +vn 0.9998 -0.0175 0.0000 +vn 0.0042 -0.0001 -1.0000 +vn -0.0042 0.0001 1.0000 +vn -0.9998 0.0175 0.0000 +vn -0.0175 -0.9998 0.0000 +vn -0.0036 -0.0000 1.0000 +vn 0.0036 0.0000 -1.0000 +vn -0.0036 0.0000 -1.0000 +vn 0.0036 -0.0000 1.0000 +vn 0.0302 0.1710 0.9848 +vn -0.0302 -0.1710 -0.9848 +vn 0.1710 0.9698 -0.1737 +vn 0.9848 -0.1736 0.0000 +vn -0.9848 0.1736 -0.0000 +vn -0.1710 -0.9698 0.1736 +vn -0.0302 0.1710 0.9848 +vn 0.0302 -0.1710 -0.9848 +vn -0.1710 0.9698 -0.1736 +vn 0.9848 0.1736 0.0000 +vn -0.9848 -0.1736 -0.0000 +vn 0.1710 -0.9698 0.1736 +usemtl None s off -f 1/1 3/2 4/3 2/4 -f 5/5 6/6 1/7 2/4 -f 8/6 7/5 4/8 3/9 -f 5/5 2/4 4/3 7/10 -f 7/10 8/11 6/12 5/5 -f 8/11 3/13 1/14 6/12 -f 9/15 11/16 12/17 10/18 -f 13/19 14/20 9/21 10/18 -f 12/22 11/23 16/20 15/19 -f 13/19 10/18 12/17 15/24 -f 14/22 13/19 15/24 16/25 -f 9/26 14/22 16/25 11/27 -f 17/28 18/24 19/29 20/30 -f 24/31 23/32 22/24 21/28 -f 23/31 24/14 20/13 19/33 -f 24/31 21/28 17/34 20/33 -f 21/28 22/30 18/35 17/34 -f 22/30 23/36 19/37 18/35 -f 27/30 31/35 30/37 26/36 -f 28/28 32/34 31/35 27/30 -f 25/31 29/33 32/34 28/28 -f 26/31 30/33 29/13 25/14 -f 25/31 28/28 27/24 26/32 -f 32/28 29/30 30/29 31/24 -f 40/38 33/39 34/40 39/41 -f 36/42 38/38 37/41 35/43 -f 39/44 37/45 38/46 40/39 -f 34/1 35/2 37/47 39/42 -f 40/38 38/48 36/46 33/39 -f 33/42 36/47 35/48 34/38 -f 45/38 46/41 42/40 41/39 -f 41/42 42/38 43/48 44/47 -f 45/38 41/39 44/46 47/48 -f 42/1 46/42 48/47 43/2 -f 46/44 45/39 47/46 48/45 -f 44/42 43/43 48/41 47/38 -f 53/49 54/50 49/51 50/52 -f 51/53 52/54 50/55 49/56 -f 55/57 51/49 49/58 54/59 -f 52/52 56/54 53/55 50/60 -f 56/49 55/52 54/60 53/58 -f 52/52 51/51 55/61 56/54 -f 64/49 61/58 62/60 63/52 -f 57/52 59/60 61/55 64/54 -f 63/57 62/59 60/58 58/49 -f 58/53 60/56 59/55 57/54 -f 61/49 59/52 60/51 62/50 -f 57/52 64/54 63/61 58/51 -f 65/15 66/18 68/17 67/16 -f 69/19 66/18 65/21 70/20 -f 68/22 71/19 72/20 67/23 -f 69/19 71/24 68/17 66/18 -f 70/22 72/25 71/24 69/19 -f 65/26 67/27 72/25 70/22 +f 9/15/7 10/16/7 11/17/7 12/18/7 +f 13/19/8 14/20/8 9/21/8 12/18/8 +f 15/22/9 16/23/9 11/24/9 10/25/9 +f 13/19/10 12/18/10 11/17/10 16/26/10 +f 16/26/11 15/27/11 14/28/11 13/19/11 +f 15/27/12 10/29/12 9/30/12 14/28/12 +f 17/31/7 18/32/7 19/33/7 20/34/7 +f 21/35/8 22/36/8 17/37/8 20/34/8 +f 19/38/9 18/39/9 23/40/9 24/41/9 +f 21/35/10 20/34/10 19/33/10 24/42/10 +f 22/43/11 21/35/11 24/42/11 23/44/11 +f 17/45/12 22/43/12 23/44/12 18/46/12 +f 25/47/13 26/48/13 27/49/13 28/50/13 +f 29/51/14 30/52/14 31/53/14 32/54/14 +f 30/55/15 29/56/15 28/57/15 27/58/15 +f 29/51/10 32/54/10 25/59/10 28/60/10 +f 32/54/16 31/61/16 26/62/16 25/59/16 +f 31/61/12 30/63/12 27/64/12 26/62/12 +f 33/65/12 34/66/12 35/67/12 36/68/12 +f 37/69/17 38/70/17 34/66/17 33/65/17 +f 39/71/10 40/72/10 38/70/10 37/69/10 +f 36/73/18 35/74/18 40/75/18 39/76/18 +f 39/71/19 37/69/19 33/77/19 36/78/19 +f 38/79/20 40/80/20 35/81/20 34/82/20 +f 41/83/21 42/84/21 43/85/21 44/86/21 +f 45/87/22 46/88/22 47/89/22 48/90/22 +f 44/91/23 47/92/23 46/93/23 41/94/23 +f 43/95/24 48/96/24 47/97/24 44/98/24 +f 41/83/25 46/99/25 45/100/25 42/84/25 +f 42/101/26 45/102/26 48/103/26 43/104/26 +f 49/105/27 50/106/27 51/107/27 52/108/27 +f 52/109/28 51/110/28 53/111/28 54/112/28 +f 49/105/29 52/108/29 54/113/29 55/114/29 +f 51/115/30 50/116/30 56/117/30 53/118/30 +f 50/119/31 49/120/31 55/121/31 56/122/31 +f 54/123/32 53/124/32 56/125/32 55/126/32 +f 57/127/9 58/128/9 59/129/9 60/130/9 +f 61/131/11 62/132/11 60/133/11 59/134/11 +f 63/135/33 61/136/33 59/137/33 58/138/33 +f 62/139/34 64/140/34 57/141/34 60/142/34 +f 64/143/7 63/144/7 58/145/7 57/146/7 +f 62/139/8 61/147/8 63/148/8 64/140/8 +f 65/149/11 66/150/11 67/151/11 68/152/11 +f 69/153/35 70/154/35 66/155/35 65/156/35 +f 68/157/36 67/158/36 71/159/36 72/160/36 +f 72/161/7 71/162/7 70/163/7 69/164/7 +f 66/165/9 70/166/9 71/167/9 67/168/9 +f 69/153/8 65/156/8 68/169/8 72/170/8 +f 73/171/11 74/172/11 75/173/11 76/174/11 +f 77/175/9 74/172/9 73/176/9 78/177/9 +f 75/178/8 79/179/8 80/180/8 76/181/8 +f 77/175/12 79/182/12 75/173/12 74/172/12 +f 78/183/7 80/184/7 79/182/7 77/175/7 +f 73/185/10 76/186/10 80/184/10 78/183/10 +f 85/187/37 81/188/37 86/189/37 82/190/37 +f 87/191/38 83/192/38 84/193/38 88/194/38 +f 81/195/39 85/196/39 87/197/39 88/198/39 +f 85/199/40 82/200/40 83/201/40 87/202/40 +f 86/203/41 81/204/41 88/205/41 84/206/41 +f 82/207/42 86/208/42 84/209/42 83/210/42 +f 93/211/43 89/212/43 94/213/43 90/214/43 +f 95/215/44 91/216/44 92/217/44 96/218/44 +f 89/219/45 93/220/45 95/221/45 96/222/45 +f 93/223/46 90/224/46 91/225/46 95/226/46 +f 94/227/47 89/228/47 96/229/47 92/230/47 +f 90/231/48 94/232/48 92/233/48 91/234/48 From c46c07f8361f2239b91cb81190e0c5493a04809d Mon Sep 17 00:00:00 2001 From: NO11 Date: Thu, 22 Apr 2021 19:18:05 +0000 Subject: [PATCH 075/136] Makes fireworks rockets infinite in creative mode --- mods/ITEMS/mcl_fireworks/register.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_fireworks/register.lua b/mods/ITEMS/mcl_fireworks/register.lua index 08f07c5cb..6ab55442c 100644 --- a/mods/ITEMS/mcl_fireworks/register.lua +++ b/mods/ITEMS/mcl_fireworks/register.lua @@ -15,7 +15,9 @@ local function register_rocket(n, duration, force) local elytra = mcl_playerplus.elytra[user] if elytra.active and elytra.rocketing <= 0 then elytra.rocketing = duration - itemstack:take_item() + if not minetest.is_creative_enabled(user:get_player_name()) then + itemstack:take_item() + end minetest.sound_play("mcl_fireworks_rocket", {pos = user:get_pos()}) end return itemstack From 038066f0c551d7ad4d929c92ca5f71f7d6544032 Mon Sep 17 00:00:00 2001 From: Sven792 Date: Fri, 23 Apr 2021 09:52:09 +0200 Subject: [PATCH 076/136] Mirrored foodbar icons to fit the right-to-left change --- .../mcl_hunger/textures/hbhunger_bgicon.png | Bin 114 -> 170 bytes .../mcl_hunger/textures/hbhunger_icon.png | Bin 142 -> 209 bytes .../textures/mcl_hunger_icon_foodpoison.png | Bin 141 -> 218 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/PLAYER/mcl_hunger/textures/hbhunger_bgicon.png b/mods/PLAYER/mcl_hunger/textures/hbhunger_bgicon.png index e02778a2702183d3a01039d42258c0cc956608b8..d21b1684786017be48a478eb8b15f6dd09153ea5 100644 GIT binary patch delta 141 zcmV;80CN9wssWHBe+h6%S#tmY3ljhU3ljkVnw%H_003M`L_t&-(~XeJ3cw%?1jpjh z()Is8vMG8`FIue7#~hd4fg}J(*=d;Vfr$wCnlxrU7o(Kfl;-iRxBwhhc_X%k18hp8 v^|CEJDb*g0ak|J$HGU&y@2?48MSv6Oh9~4Jahr_*0000<2SrXqu0mjf;Egy( delta 84 zcmZ3*STsS!&(hPyF{FYq`2ZUW3(Nn*27auYjJgVVM1J*$Hum-D$uJ-NpvAP=G08>q nKuAkKL#$w2e4>XySOX`6;dbM$1x|I*3_#%N>gTe~DWM4f%^Vz6 diff --git a/mods/PLAYER/mcl_hunger/textures/hbhunger_icon.png b/mods/PLAYER/mcl_hunger/textures/hbhunger_icon.png index 9c1bb63e48bb6b84c273202e9b4c8688a6aa1c70..3830fdfc3cf99855334cccf433ebcdb0859ac689 100644 GIT binary patch delta 192 zcmeBUyvR5~vYw5Bf#JbKHUS{TS>O>_%)r1c48n{Iv*t(u1)Dux977~7C#NJNB)sU` z@b^3e>r!n#W1|I()8291{y)v^7LU=YB7=?pUvSO5P}-_iwP?nf13+*Hh(A1eD7}MW zQfI*dj^fE{)>t(6?BQVcx%~LJ{=;|8(cgc3^cJxcHuPy?Oxb><^ov1<_6%dA2h8Gq qI{*HEI(YKGgj!;-hUVg93=FDKx?dB+w>|;7hr!d;&t;ucLK6VU%upWy delta 124 zcmcb}*vB|QvXqH|fg%6%M0X&?RubeF45Wb|ZyEbUAm!}o;uuoFnC!rOS8$s^i|eC< z=gbtWj8vIVxJ^Hx$u7vcNOY;9gPs%9iQ`ioP8?JXcoJu4(fQ1&O>_%)r1c48n{Iv*t(u1$#VQ977~7C#NJNByfBX z{C%E*ReIZ=q!b5c9Y(vP|DsoyN~&CqNJ#pBQPgPR>rJ1gx*N`H1cFu|et7pYKMxNN z6A<&9P&>q^e8%@r%^e=6Ndm3!=hY|t`0-NP=}v9IYrDE%T&5ElcY7K%yqUI1LY-}O xhiDJaj{~bX?f&<#?fB83C}h@ZBxJ+GaJWu1qNLJLp=fS?83{1OV&@BHI7} From 50b6f039776fe7e885dc608afb1cd001fdc26346 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Fri, 23 Apr 2021 12:34:24 +0200 Subject: [PATCH 077/136] Integrate no fall damage in water & end portal --- mods/PLAYER/mcl_player/init.lua | 59 ----------------------------- mods/PLAYER/mcl_playerplus/init.lua | 58 ++++++++++++++++++++++++++++ mods/PLAYER/mcl_playerplus/mod.conf | 2 +- 3 files changed, 59 insertions(+), 60 deletions(-) diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 3c0151737..6cf2f0014 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -243,62 +243,3 @@ minetest.register_globalstep(function(dtime) end end end) - --- Don't change HP if the player falls in the water or through End Portal: -minetest.register_on_player_hpchange(function(player, hp_change, reason) - if reason and reason.type == "fall" and player then - local pos = player:get_pos() - local node = minetest.get_node(pos) - local velocity = player:get_velocity() or player:get_player_velocity() or {x=0,y=-10,z=0} - local v_axis_max = math.max(math.abs(velocity.x), math.abs(velocity.y), math.abs(velocity.z)) - local step = {x = velocity.x / v_axis_max, y = velocity.y / v_axis_max, z = velocity.z / v_axis_max} - for i = 1, math.ceil(v_axis_max/5)+1 do -- trace at least 1/5 of the way per second - if not node or node.name == "ignore" then - minetest.get_voxel_manip():read_from_map(pos, pos) - node = minetest.get_node(pos) - end - if node then - if minetest.registered_nodes[node.name].walkable then - return hp_change - end - if minetest.get_item_group(node.name, "water") ~= 0 then - return 0 - end - if node.name == "mcl_portals:portal_end" then - if mcl_portals and mcl_portals.end_teleport then - mcl_portals.end_teleport(player) - end - return 0 - end - end - pos = vector.add(pos, step) - node = minetest.get_node(pos) - end - end - return hp_change -end, true) - -minetest.register_on_respawnplayer(function(player) - local pos = player:get_pos() - minetest.add_particlespawner({ - amount = 50, - time = 0.001, - minpos = vector.add(pos, 0), - maxpos = vector.add(pos, 0), - minvel = vector.new(-5,-5,-5), - maxvel = vector.new(5,5,5), - minexptime = 1.1, - maxexptime = 1.5, - minsize = 1, - maxsize = 2, - collisiondetection = false, - vertical = false, - texture = "mcl_particles_mob_death.png^[colorize:#000000:255", - }) - - minetest.sound_play("mcl_mobs_mob_poof", { - pos = pos, - gain = 1.0, - max_hear_distance = 8, - }, true) -end) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index e74c36829..a748abaac 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -497,3 +497,61 @@ minetest.register_on_leaveplayer(function(player) mcl_playerplus_internal[name] = nil mcl_playerplus.elytra[player] = nil end) + +-- Don't change HP if the player falls in the water or through End Portal: +mcl_damage.register_modifier(function(obj, damage, reason) + if reason.type == "fall" then + local pos = obj:get_pos() + local node = minetest.get_node(pos) + local velocity = obj:get_velocity() or obj:get_player_velocity() or {x=0,y=-10,z=0} + local v_axis_max = math.max(math.abs(velocity.x), math.abs(velocity.y), math.abs(velocity.z)) + local step = {x = velocity.x / v_axis_max, y = velocity.y / v_axis_max, z = velocity.z / v_axis_max} + for i = 1, math.ceil(v_axis_max/5)+1 do -- trace at least 1/5 of the way per second + if not node or node.name == "ignore" then + minetest.get_voxel_manip():read_from_map(pos, pos) + node = minetest.get_node(pos) + end + if node then + if minetest.registered_nodes[node.name].walkable then + return + end + if minetest.get_item_group(node.name, "water") ~= 0 then + return 0 + end + if node.name == "mcl_portals:portal_end" then + if mcl_portals and mcl_portals.end_teleport then + mcl_portals.end_teleport(obj) + end + return 0 + end + end + pos = vector.add(pos, step) + node = minetest.get_node(pos) + end + end +end, -200) + +minetest.register_on_respawnplayer(function(player) + local pos = player:get_pos() + minetest.add_particlespawner({ + amount = 50, + time = 0.001, + minpos = vector.add(pos, 0), + maxpos = vector.add(pos, 0), + minvel = vector.new(-5,-5,-5), + maxvel = vector.new(5,5,5), + minexptime = 1.1, + maxexptime = 1.5, + minsize = 1, + maxsize = 2, + collisiondetection = false, + vertical = false, + texture = "mcl_particles_mob_death.png^[colorize:#000000:255", + }) + + minetest.sound_play("mcl_mobs_mob_poof", { + pos = pos, + gain = 1.0, + max_hear_distance = 8, + }, true) +end) diff --git a/mods/PLAYER/mcl_playerplus/mod.conf b/mods/PLAYER/mcl_playerplus/mod.conf index 95121f8ea..6cc9c68db 100644 --- a/mods/PLAYER/mcl_playerplus/mod.conf +++ b/mods/PLAYER/mcl_playerplus/mod.conf @@ -1,5 +1,5 @@ name = mcl_playerplus author = TenPlus1 description = Adds some simple player-related gameplay effects: Hurt by touching a cactus, suffocation and more. -depends = mcl_init, mcl_core, mcl_particles, mcl_hunger, mcl_death_messages, playerphysics, mcl_playerinfo, mcl_weather, mcl_spawn, mcl_enchanting +depends = mcl_init, mcl_core, mcl_particles, mcl_hunger, mcl_death_messages, playerphysics, mcl_playerinfo, mcl_weather, mcl_spawn, mcl_enchanting, mcl_damage From 78355c5c578a89fac2b1fc2b455fd9395f276a7b Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Fri, 23 Apr 2021 13:40:51 +0200 Subject: [PATCH 078/136] Integrate totems --- mods/ENTITIES/mobs_mc/1_items_default.lua | 62 +---------------------- mods/ITEMS/mcl_totems/init.lua | 61 ++++++++++++++++++++-- mods/ITEMS/mcl_totems/mod.conf | 2 +- 3 files changed, 59 insertions(+), 66 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/1_items_default.lua b/mods/ENTITIES/mobs_mc/1_items_default.lua index b4abd4f9c..bdadbfdc5 100644 --- a/mods/ENTITIES/mobs_mc/1_items_default.lua +++ b/mods/ENTITIES/mobs_mc/1_items_default.lua @@ -516,8 +516,6 @@ end -- Evoker if c("totem") then - local hud_totem = {} - -- Totem of Undying minetest.register_craftitem("mobs_mc:totem", { description = S("Totem of Undying"), @@ -527,66 +525,8 @@ if c("totem") then inventory_image = "mcl_totems_totem.png", wield_image = "mcl_totems_totem.png", stack_max = 1, + groups = {combat_item=1}, }) - - minetest.register_on_leaveplayer(function(player) - hud_totem[player:get_player_name()] = nil - end) - - -- Save the player from death when holding totem of undying in hand - minetest.register_on_player_hpchange(function(player, hp_change) - local hp = player:get_hp() - -- Fatal damage? - if hp + hp_change <= 0 then - local wield = player:get_wielded_item() - if wield:get_name() == "mobs_mc:totem" then - local ppos = player:get_pos() - local pnname = minetest.get_node(ppos).name - -- Some exceptions when _not_ to save the player - for n=1, #mobs_mc.misc.totem_fail_nodes do - if pnname == mobs_mc.misc.totem_fail_nodes[n] then - return hp_change - end - end - -- Reset breath as well - if player:get_breath() < 11 then - player:set_breath(10) - end - if not minetest.is_creative_enabled(player:get_player_name()) then - wield:take_item() - player:set_wielded_item(wield) - end - -- Effects - minetest.sound_play({name = "mcl_totems_totem", gain=1}, {pos=ppos, max_hear_distance=16}, true) - - -- Big totem overlay - if not hud_totem[player:get_player_name()] then - hud_totem[player:get_player_name()] = player:hud_add({ - hud_elem_type = "image", - text = "mcl_totems_totem.png", - position = { x=0.5, y=1 }, - scale = { x=17, y=17 }, - offset = { x=0, y=-178 }, - z_index = 100, - }) - minetest.after(3, function(name) - local player = minetest.get_player_by_name(name) - if player and player:is_player() then - local name = player:get_player_name() - if hud_totem[name] then - player:hud_remove(hud_totem[name]) - hud_totem[name] = nil - end - end - end, player:get_player_name()) - end - - -- Set HP to exactly 1 - return -hp + 1 - end - end - return hp_change - end, true) end -- Rotten flesh diff --git a/mods/ITEMS/mcl_totems/init.lua b/mods/ITEMS/mcl_totems/init.lua index b4ec3eb8d..499d7362d 100644 --- a/mods/ITEMS/mcl_totems/init.lua +++ b/mods/ITEMS/mcl_totems/init.lua @@ -1,5 +1,58 @@ --- Node is currently defined in mobs_mc. --- TODO: Add full item definition here when status effects become a thing. +local hud_totem = {} --- Add group for Creative Mode. -minetest.override_item("mobs_mc:totem", {groups = { combat_item=1}}) +minetest.register_on_leaveplayer(function(player) + hud_totem[player] = nil +end) + +-- Save the player from death when holding totem of undying in hand +mcl_damage.register_modifier(function(obj, damage, reason) + if obj:is_player() then + local hp = obj:get_hp() + if hp - damage <= 0 then + local wield = obj:get_wielded_item() + if wield:get_name() == "mobs_mc:totem" then + local ppos = obj:get_pos() + local pnname = minetest.get_node(ppos).name + -- Some exceptions when _not_ to save the player + for n=1, #mobs_mc.misc.totem_fail_nodes do + if pnname == mobs_mc.misc.totem_fail_nodes[n] then + return + end + end + -- Reset breath as well + if obj:get_breath() < 11 then + obj:set_breath(10) + end + + if not minetest.is_creative_enabled(obj:get_player_name()) then + wield:take_item() + obj:set_wielded_item(wield) + end + + -- Effects + minetest.sound_play({name = "mcl_totems_totem", gain=1}, {pos=ppos, max_hear_distance=16}, true) + + -- Big totem overlay + if not hud_totem[obj] then + hud_totem[obj] = obj:hud_add({ + hud_elem_type = "image", + text = "mcl_totems_totem.png", + position = { x=0.5, y=1 }, + scale = { x=17, y=17 }, + offset = { x=0, y=-178 }, + z_index = 100, + }) + minetest.after(3, function() + if obj:is_player() then + obj:hud_remove(hud_totem[obj]) + hud_totem[obj] = nil + end + end) + end + + -- Set HP to exactly 1 + return hp - 1 + end + end + end +end, 1000) diff --git a/mods/ITEMS/mcl_totems/mod.conf b/mods/ITEMS/mcl_totems/mod.conf index 70c5844c6..4ba94defc 100644 --- a/mods/ITEMS/mcl_totems/mod.conf +++ b/mods/ITEMS/mcl_totems/mod.conf @@ -1,2 +1,2 @@ name = mcl_totems -depends = mobs_mc +depends = mobs_mc, mcl_damage From 827cd2d7b1d4d6980eaa564956b6ea7d467133a5 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Fri, 23 Apr 2021 13:42:42 +0200 Subject: [PATCH 079/136] Fix heads crash --- mods/ITEMS/mcl_heads/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_heads/init.lua b/mods/ITEMS/mcl_heads/init.lua index e7340242d..55b2bf616 100644 --- a/mods/ITEMS/mcl_heads/init.lua +++ b/mods/ITEMS/mcl_heads/init.lua @@ -90,7 +90,7 @@ local function addhead(name, texture, desc, longdesc, rangemob, rangefactor) local wdir = minetest.dir_to_wallmounted(diff) local itemstring = itemstack:get_name() - --local fakestack = ItemStack(itemstack) + local fakestack = ItemStack(itemstack) local idef = fakestack:get_definition() local retval if wdir == 0 or wdir == 1 then From a03e7f6f3a69ba1131f793e82854a51666c59d44 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Fri, 23 Apr 2021 13:46:20 +0200 Subject: [PATCH 080/136] Re-enable player ignition from lava --- mods/ENTITIES/mcl_burning/init.lua | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mods/ENTITIES/mcl_burning/init.lua b/mods/ENTITIES/mcl_burning/init.lua index 6f1b0ef0d..7c9b74251 100644 --- a/mods/ENTITIES/mcl_burning/init.lua +++ b/mods/ENTITIES/mcl_burning/init.lua @@ -23,9 +23,7 @@ minetest.register_entity("mcl_burning:fire", { minetest.register_globalstep(function(dtime) for _, player in pairs(minetest.get_connected_players()) do - if player:get_meta():get_float("mcl_burning:burn_time") > 0 then - mcl_burning.tick(player, dtime) - end + mcl_burning.tick(player, dtime) end end) From 7f3e5bda7e3e612414d545ce98ba1dec4b4b442a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20=C3=85str=C3=B6m?= Date: Fri, 23 Apr 2021 15:49:37 +0200 Subject: [PATCH 081/136] Duplicate groupcaps before applying unbreaking --- mods/ITEMS/mcl_enchanting/groupcaps.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/groupcaps.lua b/mods/ITEMS/mcl_enchanting/groupcaps.lua index 0bc1b8e24..a445b73f2 100644 --- a/mods/ITEMS/mcl_enchanting/groupcaps.lua +++ b/mods/ITEMS/mcl_enchanting/groupcaps.lua @@ -61,7 +61,7 @@ function mcl_enchanting.update_groupcaps(itemstack) if not hash or hash ~= groupcaps.hash then local tool_capabilities = itemstack:get_tool_capabilities() - tool_capabilities.groupcaps = groupcaps.values + tool_capabilities.groupcaps = table.copy(groupcaps.values) -- Increase the number of uses depending on the unbreaking level -- of the tool. From 414adff8fb3dd7374db94c9d63ddd78851089791 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Fri, 23 Apr 2021 13:59:37 +0000 Subject: [PATCH 082/136] Fix bad API documentation od mcl_death_drop --- mods/PLAYER/mcl_death_drop/API.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/PLAYER/mcl_death_drop/API.md b/mods/PLAYER/mcl_death_drop/API.md index b19e2fd7c..3fc5163e5 100644 --- a/mods/PLAYER/mcl_death_drop/API.md +++ b/mods/PLAYER/mcl_death_drop/API.md @@ -7,8 +7,8 @@ Drop registered inventories on player death. * function(player): must return inventory * listname: string * drop: bool - * true: the entire list will be dropped - * false: items with curse_of_vanishing enchantement will be broken. + * true: the list will be dropped + * false: the list will only be cleared ## mcl_death_drop.registered_dropped_lists Table containing dropped list inventory, name and drop state. \ No newline at end of file From 642351a1d254cfbcb2bd32744ebdafdb3b3cd529 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sat, 24 Apr 2021 19:35:23 +0000 Subject: [PATCH 083/136] Add #1553 fireworks rocket now makes particles when used for flying --- mods/PLAYER/mcl_playerplus/init.lua | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 43f636498..13d136ecf 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -215,6 +215,24 @@ minetest.register_globalstep(function(dtime) if vector.length(player_velocity) < 40 then local add_velocity = player.add_velocity or player.add_player_velocity add_velocity(player, vector.multiply(player:get_look_dir(), 4)) + minetest.add_particlespawner({ + amount = 1, + time = 0.1, + minpos = fly_pos, + maxpos = fly_pos, + minvel = {x = 0, y = 0, z = 0}, + maxvel = {x = 0, y = 0, z = 0}, + minacc = {x = 0, y = 0, z = 0}, + maxacc = {x = 0, y = 0, z = 0}, + minexptime = 0.3, + maxexptime = 0.5, + minsize = 1, + maxsize = 2.5, + collisiondetection = false, + vertical = false, + texture = "mcl_particles_crit.png^[colorize:#bc7a57:127", + glow = 5, + }) end end else From 9eba2add3fba56467629eaffd52a51259aaf7e53 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 25 Apr 2021 13:09:20 +0200 Subject: [PATCH 084/136] Rewrite burning API --- mods/ENTITIES/mcl_boats/init.lua | 2 +- mods/ENTITIES/mcl_burning/api.lua | 307 +++++++++-------------------- mods/ENTITIES/mcl_burning/init.lua | 110 +++++++++-- mods/ENTITIES/mcl_mobs/api.lua | 4 +- mods/ITEMS/mcl_bows/arrow.lua | 2 +- 5 files changed, 190 insertions(+), 235 deletions(-) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index 38e73565b..c2ce94c00 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -188,7 +188,7 @@ function boat.on_punch(self, puncher, time_from_last_punch, tool_capabilities, d end function boat.on_step(self, dtime, moveresult) - mcl_burning.tick(self.object, dtime) + mcl_burning.tick(self.object, dtime, self) self._v = get_v(self.object:get_velocity()) * get_sign(self._v) local v_factor = 1 diff --git a/mods/ENTITIES/mcl_burning/api.lua b/mods/ENTITIES/mcl_burning/api.lua index b08a0fb70..d2567f6b2 100644 --- a/mods/ENTITIES/mcl_burning/api.lua +++ b/mods/ENTITIES/mcl_burning/api.lua @@ -1,132 +1,52 @@ local S = minetest.get_translator("mcl_burning") -function mcl_burning.get_default(datatype) - local default_table = {string = "", float = 0.0, int = 0, bool = false} - return default_table[datatype] -end - -function mcl_burning.get(obj, datatype, name) - local key - if obj:is_player() then - local meta = obj:get_meta() - return meta["get_" .. datatype](meta, "mcl_burning:" .. name) - else - local luaentity = obj:get_luaentity() - return luaentity and luaentity["mcl_burning_" .. name] or mcl_burning.get_default(datatype) - end -end - -function mcl_burning.set(obj, datatype, name, value) - if obj:is_player() then - local meta = obj:get_meta() - meta["set_" .. datatype](meta, "mcl_burning:" .. name, value or mcl_burning.get_default(datatype)) - else - local luaentity = obj:get_luaentity() - if mcl_burning.get_default(datatype) == value then - value = nil - end - luaentity["mcl_burning_" .. name] = value - end +function mcl_burning.get_storage(obj) + return obj:is_player() and mcl_burning.storage[obj] or obj:get_luaentity() end function mcl_burning.is_burning(obj) - return mcl_burning.get(obj, "float", "burn_time") > 0 + return mcl_burning.get_storage(obj).burn_time end function mcl_burning.is_affected_by_rain(obj) - return mcl_weather and mcl_weather.get_weather() == "rain" and mcl_weather.is_outdoor(obj:get_pos()) + return mcl_weather.get_weather() == "rain" and mcl_weather.is_outdoor(obj:get_pos()) end -function mcl_burning.get_collisionbox(obj, smaller) - local box = obj:get_properties().collisionbox - local minp, maxp = vector.new(box[1], box[2], box[3]), vector.new(box[4], box[5], box[6]) - if smaller then +function mcl_burning.get_collisionbox(obj, smaller, storage) + local cache = storage.collisionbox_cache + if cache then + local box = cache[smaller and 2 or 1] + return box[1], box[2] + else + local box = obj:get_properties().collisionbox + local minp, maxp = vector.new(box[1], box[2], box[3]), vector.new(box[4], box[5], box[6]) local s_vec = vector.new(0.1, 0.1, 0.1) - minp = vector.add(minp, s_vec) - maxp = vector.subtract(maxp, s_vec) + local s_minp = vector.add(minp, s_vec) + local s_maxp = vector.subtract(maxp, s_vec) + storage.collisionbox_cache = {{minp, maxp}, {s_minp, s_maxp}} + return minp, maxp end - return minp, maxp end -function mcl_burning.get_touching_nodes(obj, nodenames) +function mcl_burning.get_touching_nodes(obj, nodenames, storage) local pos = obj:get_pos() - local box = obj:get_properties().collisionbox - local minp, maxp = mcl_burning.get_collisionbox(obj, true) + local minp, maxp = mcl_burning.get_collisionbox(obj, true, storage) local nodes = minetest.find_nodes_in_area(vector.add(pos, minp), vector.add(pos, maxp), nodenames) return nodes end -function mcl_burning.get_highest_group_value(obj, groupname) - local nodes = mcl_burning.get_touching_nodes(obj, "group:" .. groupname, true) - local highest_group_value = 0 - - for _, pos in pairs(nodes) do - local node = minetest.get_node(pos) - local group_value = minetest.get_item_group(node.name, groupname) - if group_value > highest_group_value then - highest_group_value = group_value - end - end - - return highest_group_value -end - -function mcl_burning.damage(obj) - local luaentity = obj:get_luaentity() - local health - - if luaentity then - health = luaentity.health - end - - local hp = health or obj:get_hp() - - if hp <= 0 then - return - end - - local do_damage = true - - if obj:is_player() then - if mcl_potions.player_has_effect(obj, "fire_proof") then - do_damage = false - else - local name = obj:get_player_name() - armor.last_damage_types[name] = "fire" - local deathmsg = S("@1 burned to death.", name) - local reason = mcl_burning.get(obj, "string", "reason") - if reason ~= "" then - deathmsg = S("@1 was burned by @2.", name, reason) - end - mcl_death_messages.player_damage(obj, deathmsg) - end - else - if luaentity.fire_damage_resistant then - do_damage = false - end - end - - if do_damage then - local new_hp = hp - 1 - if health then - luaentity.health = new_hp - else - obj:set_hp(new_hp) - end - end -end - function mcl_burning.set_on_fire(obj, burn_time, reason) if obj:get_hp() < 0 then return end + local storage = mcl_burning.get_storage(obj) + local luaentity = obj:get_luaentity() if luaentity and luaentity.fire_resistant then return end - local old_burn_time = mcl_burning.get(obj, "float", "burn_time") local max_fire_prot_lvl = 0 if obj:is_player() then @@ -148,37 +68,22 @@ function mcl_burning.set_on_fire(obj, burn_time, reason) burn_time = burn_time - math.floor(burn_time * max_fire_prot_lvl * 0.15) end - if old_burn_time <= burn_time then - --[[local sound_id = mcl_burning.get(obj, "int", "sound_id") - if sound_id == 0 then - sound_id = minetest.sound_play("fire_fire", { - object = obj, - gain = 0.18, - max_hear_distance = 16, - loop = true, - }) + 1 - end]]-- - - local hud_id - if obj:is_player() then - hud_id = mcl_burning.get(obj, "int", "hud_id") - if hud_id == 0 then - hud_id = obj:hud_add({ - hud_elem_type = "image", - position = {x = 0.5, y = 0.5}, - scale = {x = -100, y = -100}, - text = "mcl_burning_entity_flame_animated.png^[opacity:180^[verticalframe:" .. mcl_burning.animation_frames .. ":" .. 1, - z_index = 1000, - }) + 1 - end + if not storage.burn_time or burn_time >= storage.burn_time then + if obj:is_player() and not storage.fire_hud_id then + storage.fire_hud_id = obj:hud_add({ + hud_elem_type = "image", + position = {x = 0.5, y = 0.5}, + scale = {x = -100, y = -100}, + text = "mcl_burning_entity_flame_animated.png^[opacity:180^[verticalframe:" .. mcl_burning.animation_frames .. ":" .. 1, + z_index = 1000, + }) end - mcl_burning.set(obj, "float", "burn_time", burn_time) - mcl_burning.set(obj, "string", "reason", reason) - mcl_burning.set(obj, "int", "hud_id", hud_id) - --mcl_burning.set(obj, "int", "sound_id", sound_id) + storage.burn_time = burn_time + storage.burn_reason = reason + storage.fire_damage_timer = 0 local fire_entity = minetest.add_entity(obj:get_pos(), "mcl_burning:fire") - local minp, maxp = mcl_burning.get_collisionbox(obj) + local minp, maxp = mcl_burning.get_collisionbox(obj, false, storage) local obj_size = obj:get_properties().visual_size local vertical_grow_factor = 1.2 @@ -192,111 +97,81 @@ function mcl_burning.set_on_fire(obj, burn_time, reason) fire_entity:set_properties({visual_size = size}) fire_entity:set_attach(obj, "", offset, {x = 0, y = 0, z = 0}) - mcl_burning.update_animation_frame(obj, fire_entity, 0) + local fire_luaentity = fire_entity:get_luaentity() + fire_luaentity:update_frame(obj, storage) + + for _, other in pairs(minetest.get_objects_inside_radius(fire_entity:get_pos(), 0)) do + local other_luaentity = other:get_luaentity() + if other_luaentity and other_luaentity.name == "mcl_burning:fire" and other_luaentity ~= fire_luaentity then + other:remove() + break + end + end end end function mcl_burning.extinguish(obj) if mcl_burning.is_burning(obj) then - --local sound_id = mcl_burning.get(obj, "int", "sound_id") - 1 - --minetest.sound_stop(sound_id) - + local storage = mcl_burning.get_storage(obj) if obj:is_player() then - local hud_id = mcl_burning.get(obj, "int", "hud_id") - 1 - obj:hud_remove(hud_id) - end - - mcl_burning.set(obj, "string", "reason") - mcl_burning.set(obj, "float", "burn_time") - mcl_burning.set(obj, "float", "damage_timer") - mcl_burning.set(obj, "int", "hud_id") - --mcl_burning.set(obj, "int", "sound_id") - end -end - -function mcl_burning.catch_fire_tick(obj, dtime) - if mcl_burning.is_affected_by_rain(obj) or #mcl_burning.get_touching_nodes(obj, "group:puts_out_fire") > 0 then - mcl_burning.extinguish(obj) - else - local set_on_fire_value = mcl_burning.get_highest_group_value(obj, "set_on_fire") - - if set_on_fire_value > 0 then - mcl_burning.set_on_fire(obj, set_on_fire_value) + if storage.fire_hud_id then + obj:hud_remove(storage.fire_hud_id) + end + mcl_burning.storage[obj] = {} + else + storage.burn_time = nil + storage.burn_reason = nil + storage.fire_damage_timer = nil end end end -function mcl_burning.tick(obj, dtime) - local burn_time = mcl_burning.get(obj, "float", "burn_time") - dtime +function mcl_burning.tick(obj, dtime, storage) + if storage.burn_time then + storage.burn_time = storage.burn_time - dtime - if burn_time <= 0 then - mcl_burning.extinguish(obj) - else - mcl_burning.set(obj, "float", "burn_time", burn_time) + if storage.burn_time <= 0 or mcl_burning.is_affected_by_rain(obj) or #mcl_burning.get_touching_nodes(obj, "group:puts_out_fire", storage) > 0 then + mcl_burning.extinguish(obj) + return true + else + storage.fire_damage_timer = storage.fire_damage_timer + dtime - local damage_timer = mcl_burning.get(obj, "float", "damage_timer") + dtime + if storage.fire_damage_timer >= 1 then + storage.fire_damage_timer = 0 - if damage_timer >= 1 then - damage_timer = 0 - mcl_burning.damage(obj) - end + local luaentity = obj:get_luaentity() + local is_mob = luaentity and luaentity._cmi_is_mob + local hp = is_mob and luaentity.health or obj:get_hp() - mcl_burning.set(obj, "float", "damage_timer", damage_timer) - end + if hp > 0 then + local do_damage = true - mcl_burning.catch_fire_tick(obj, dtime) -end + if obj:is_player() then + if mcl_potions.player_has_effect(obj, "fire_proof") then + do_damage = false + else + local name = obj:get_player_name() + armor.last_damage_types[name] = "fire" + local deathmsg = S("@1 burned to death.", name) + if storage.reason then + deathmsg = S("@1 was burned by @2.", name, storage.reason) + end + mcl_death_messages.player_damage(obj, deathmsg) + end + elseif luaentity.fire_damage_resistant then + do_damage = false + end -function mcl_burning.update_animation_frame(obj, fire_entity, animation_frame) - local fire_texture = "mcl_burning_entity_flame_animated.png^[opacity:180^[verticalframe:" .. mcl_burning.animation_frames .. ":" .. animation_frame - local fire_HUD_texture = "mcl_burning_hud_flame_animated.png^[opacity:180^[verticalframe:" .. mcl_burning.animation_frames .. ":" .. animation_frame - fire_entity:set_properties({textures = {"blank.png", "blank.png", fire_texture, fire_texture, fire_texture, fire_texture}}) - if obj:is_player() then - local hud_id = mcl_burning.get(obj, "int", "hud_id") - 1 - obj:hud_change(hud_id, "text", fire_HUD_texture) - end -end - -function mcl_burning.fire_entity_step(self, dtime) - if self.removed then - return - end - - local obj = self.object - local parent = obj:get_attach() - local do_remove - - self.doing_step = true - - if not parent or not mcl_burning.is_burning(parent) then - do_remove = true - else - for _, other in pairs(minetest.get_objects_inside_radius(obj:get_pos(), 0)) do - local luaentity = obj:get_luaentity() - if luaentity and luaentity.name == "mcl_burning:fire" and not luaentity.doing_step and not luaentity.removed then - do_remove = true - break + if do_damage then + local new_hp = hp - 1 + if is_mob then + luaentity.health = new_hp + else + obj:set_hp(new_hp) + end + end + end end end end - - self.doing_step = false - - if do_remove then - self.removed = true - obj:remove() - return - end - - local animation_timer = self.animation_timer + dtime - if animation_timer >= 0.015 then - animation_timer = 0 - local animation_frame = self.animation_frame + 1 - if animation_frame > mcl_burning.animation_frames - 1 then - animation_frame = 0 - end - mcl_burning.update_animation_frame(parent, obj, animation_frame) - self.animation_frame = animation_frame - end - self.animation_timer = animation_timer end diff --git a/mods/ENTITIES/mcl_burning/init.lua b/mods/ENTITIES/mcl_burning/init.lua index 7c9b74251..e223b3566 100644 --- a/mods/ENTITIES/mcl_burning/init.lua +++ b/mods/ENTITIES/mcl_burning/init.lua @@ -2,11 +2,65 @@ local S = minetest.get_translator("mcl_burning") local modpath = minetest.get_modpath("mcl_burning") mcl_burning = { + storage = {}, animation_frames = tonumber(minetest.settings:get("fire_animation_frames")) or 8 } dofile(modpath .. "/api.lua") +minetest.register_globalstep(function(dtime) + for _, player in pairs(minetest.get_connected_players()) do + local storage = mcl_burning.storage[player] + if not mcl_burning.tick(player, dtime, storage) and not mcl_burning.is_affected_by_rain(player) then + local nodes = mcl_burning.get_touching_nodes(player, {"group:puts_out_fire", "group:set_on_fire"}, storage) + local burn_time = 0 + + for _, pos in pairs(nodes) do + local node = minetest.get_node(pos) + if minetest.get_item_group(node.name, "puts_out_fire") > 0 then + burn_time = 0 + break + end + + local value = minetest.get_item_group(node.name, "set_on_fire") + if value > burn_time then + burn_time = value + end + end + + if burn_time > 0 then + mcl_burning.set_on_fire(player, burn_time) + end + end + end +end) + +minetest.register_on_respawnplayer(function(player) + mcl_burning.extinguish(player) +end) + +minetest.register_on_joinplayer(function(player) + local storage + + local burn_data = player:get_meta():get_string("mcl_burning:data") + if burn_data == "" then + storage = {} + else + storage = minetest.deserialize(burn_data) + end + + mcl_burning.storage[player] = storage +end) + +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) + + minetest.register_entity("mcl_burning:fire", { initial_properties = { physical = false, @@ -18,19 +72,45 @@ minetest.register_entity("mcl_burning:fire", { animation_frame = 0, animation_timer = 0, - on_step = mcl_burning.fire_entity_step, + + on_step = function(self, dtime) + local parent, storage = self:sanity_check() + + if parent then + self.animation_timer = self.animation_timer + dtime + if self.animation_timer >= 0.1 then + self.animation_timer = 0 + self.animation_frame = self.animation_frame + 1 + if self.animation_frame > mcl_burning.animation_frames - 1 then + self.animation_frame = 0 + end + self:update_frame(parent, storage) + end + else + self.object:remove() + end + end, + sanity_check = function(self) + local parent = self.object:get_attach() + + if not parent then + return + end + + local storage = mcl_burning.get_storage(parent) + + if not storage or not storage.burn_time then + return + end + + return parent, storage + end, + update_frame = function(self, parent, storage) + local frame_overlay = "^[opacity:180^[verticalframe:" .. mcl_burning.animation_frames .. ":" .. self.animation_frame + local fire_texture = "mcl_burning_entity_flame_animated.png" .. frame_overlay + self.object:set_properties({textures = {"blank.png", "blank.png", fire_texture, fire_texture, fire_texture, fire_texture}}) + if parent:is_player() then + parent:hud_change(storage.fire_hud_id, "text", "mcl_burning_hud_flame_animated.png" .. frame_overlay) + end + end, }) - -minetest.register_globalstep(function(dtime) - for _, player in pairs(minetest.get_connected_players()) do - mcl_burning.tick(player, dtime) - end -end) - -minetest.register_on_respawnplayer(function(player) - mcl_burning.extinguish(player) -end) - -minetest.register_on_leaveplayer(function(player) - mcl_burning.set(player, "int", "hud_id") -end) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 8aed37288..f34312972 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -3454,8 +3454,8 @@ end -- main mob function local mob_step = function(self, dtime) - if not self.fire_resistant and self.mcl_burning_burn_time and self.mcl_burning_burn_time > 0 then - mcl_burning.tick(self.object, dtime) + if not self.fire_resistant then + mcl_burning.tick(self.object, dtime, self) end if use_cmi then diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index cddae0869..cb92593f8 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -108,7 +108,7 @@ local damage_particles = function(pos, is_critical) end ARROW_ENTITY.on_step = function(self, dtime) - mcl_burning.tick(self.object, dtime) + mcl_burning.tick(self.object, dtime, self) self._time_in_air = self._time_in_air + .001 From 939229cb213de3e031cabaebc43e7bcfd6c4a88e Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 25 Apr 2021 13:29:22 +0200 Subject: [PATCH 085/136] Fix on_equip crash --- mods/ITEMS/mcl_armor/api.lua | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua index d56e3188d..4d6686807 100644 --- a/mods/ITEMS/mcl_armor/api.lua +++ b/mods/ITEMS/mcl_armor/api.lua @@ -53,15 +53,18 @@ function mcl_armor.equip(itemstack, obj, swap) if element then local old_stack = inv:get_stack("armor", element.index) - local new_stack - - if swap then - new_stack = itemstack - itemstack = old_stack - end if swap or old_stack:is_empty() then - inv:set_stack("armor", element.index, new_stack or itemstack:take_item()) + local new_stack + + if swap then + new_stack = itemstack + itemstack = old_stack + else + new_stack = itemstack:take_item() + end + + inv:set_stack("armor", element.index, new_stack) mcl_armor.on_equip(new_stack, obj) end end From 6aecae6eea436849b9a80dbfa99bb0aa42c31d84 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 25 Apr 2021 13:50:07 +0200 Subject: [PATCH 086/136] Simplify damage pipeline; Add on_death and on_damage callbacks --- mods/CORE/mcl_damage/init.lua | 48 ++++++++++++++++++++++++++++++++--- mods/CORE/mcl_util/init.lua | 21 ++++----------- 2 files changed, 50 insertions(+), 19 deletions(-) diff --git a/mods/CORE/mcl_damage/init.lua b/mods/CORE/mcl_damage/init.lua index bc5280841..24c5fb42c 100644 --- a/mods/CORE/mcl_damage/init.lua +++ b/mods/CORE/mcl_damage/init.lua @@ -1,5 +1,7 @@ mcl_damage = { modifiers = {}, + damage_callbacks = {}, + death_callbacks = {}, types = { in_fire = {is_fire = true}, lightning_bolt = {is_lightning = true}, @@ -35,9 +37,17 @@ function mcl_damage.register_modifier(func, priority) table.insert(mcl_damage.modifiers, {func = func, priority = priority or 0}) end -function mcl_damage.do_modifiers(player, damage, reason) +function mcl_damage.register_on_damage(func) + table.insert(mcl_damage.damage_callbacks, func) +end + +function mcl_damage.register_on_death(func) + table.insert(mcl_damage.death_callbacks, func) +end + +function mcl_damage.run_modifiers(obj, damage, reason) for _, modf in ipairs(mcl_damage.modifiers) do - damage = modf.func(player, damage, reason) or damage + damage = modf.func(obj, damage, reason) or damage if damage == 0 then return 0 end @@ -46,6 +56,20 @@ function mcl_damage.do_modifiers(player, damage, reason) return damage end +local function run_callbacks(funcs, ...) + for _, func in pairs(funcs) do + func(...) + end +end + +function mcl_damage.run_damage_callbacks(obj, damage, reason) + run_callbacks(mcl_damage.damage_callbacks, obj, damage, reason) +end + +function mcl_damage.run_death_callbacks(obj, reason) + run_callbacks(mcl_damage.death_callbacks, obj, reason) +end + function mcl_damage.from_punch(mcl_reason, object) mcl_reason.direct = object local luaentity = mcl_reason.direct:get_luaentity() @@ -69,6 +93,10 @@ function mcl_damage.finish_reason(mcl_reason) end function mcl_damage.from_mt(mt_reason) + if mt_reason._mcl_reason then + return mt_reason._mcl_reason + end + local mcl_reason = {type = "generic"} if mt_reason._mcl_type then @@ -95,6 +123,7 @@ function mcl_damage.from_mt(mt_reason) end mcl_damage.finish_reason(mcl_reason) + mt_reason._mcl_reason = mcl_reason return mcl_reason end @@ -105,11 +134,24 @@ end minetest.register_on_player_hpchange(function(player, hp_change, mt_reason) if hp_change < 0 then - hp_change = -mcl_damage.do_modifiers(player, -hp_change, mcl_damage.from_mt(mt_reason)) + if player:get_hp() <= 0 then + return 0 + end + hp_change = -mcl_damage.run_modifiers(player, -hp_change, mcl_damage.from_mt(mt_reason)) end return hp_change end, true) +minetest.register_on_player_hpchange(function(player, hp_change, mt_reason) + if hp_change < 0 then + mcl_damage.run_damage_callbacks(player, -hp_change, mcl_damage.from_mt(mt_reason)) + end +end, false) + +minetest.register_on_dieplayer(function(player, mt_reason) + mcl_damage.run_death_callbacks(player, mcl_damage.from_mt(mt_reason)) +end) + minetest.register_on_mods_loaded(function() table.sort(mcl_damage.modifiers, function(a, b) return a.priority < b.priority end) end) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 741dc604e..a2a1ea816 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -475,32 +475,21 @@ function mcl_util.use_item_durability(itemstack, n) end function mcl_util.deal_damage(target, damage, mcl_reason) - mcl_reason = mcl_reason or {} - local luaentity = target:get_luaentity() if luaentity then if luaentity.deal_damage then - luaentity:deal_damage(damage, mcl_reason) + luaentity:deal_damage(damage, mcl_reason or {type = "generic"}) return elseif luaentity._cmi_is_mob then - local puncher = mcl_reason.direct or target - target:punch(puncher, 1.0, {full_punch_interval = 1.0, damage_groups = {fleshy = damage}}, vector.direction(puncher:get_pos(), target:get_pos()), damage) + -- local puncher = mcl_reason and mcl_reason.direct or target + -- target:punch(puncher, 1.0, {full_punch_interval = 1.0, damage_groups = {fleshy = damage}}, vector.direction(puncher:get_pos(), target:get_pos()), damage) + luaentity.health = luaentity.health - damage return end end - local mt_reason - - if target:is_player() then - mt_reason = {} - - for key, value in pairs(mcl_reason) do - mt_reason["_mcl_" .. key] = value - end - end - - target:set_hp(target:get_hp() - damage, mt_reason) + target:set_hp(target:get_hp() - damage, {_mcl_reason = mcl_reason}) end function mcl_util.get_hp(obj) From 302175691ae3634dda3a2c998705b0316b73757f Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 25 Apr 2021 16:42:38 +0200 Subject: [PATCH 087/136] Integrate death messages --- mods/CORE/mcl_damage/init.lua | 8 +- mods/CORE/mcl_explosions/init.lua | 4 - mods/CORE/mcl_util/init.lua | 19 + mods/ENTITIES/mcl_burning/api.lua | 15 +- mods/ENTITIES/mcl_falling_nodes/init.lua | 8 +- mods/ENTITIES/mobs_mc/blaze.lua | 2 +- mods/ENVIRONMENT/lightning/init.lua | 4 - mods/ENVIRONMENT/lightning/mod.conf | 1 - mods/ENVIRONMENT/mcl_void_damage/init.lua | 2 - mods/ENVIRONMENT/mcl_void_damage/mod.conf | 2 +- mods/HUD/mcl_death_messages/init.lua | 459 ++++++++++----------- mods/ITEMS/mcl_armor/damage.lua | 4 +- mods/ITEMS/mcl_enchanting/enchantments.lua | 2 +- mods/ITEMS/mcl_nether/init.lua | 4 - mods/ITEMS/mcl_nether/mod.conf | 2 +- mods/ITEMS/mcl_tnt/mod.conf | 2 +- mods/MISC/mcl_commands/kill.lua | 12 +- mods/MISC/mcl_commands/mod.conf | 1 - mods/PLAYER/mcl_hunger/hunger.lua | 1 - mods/PLAYER/mcl_hunger/init.lua | 4 - mods/PLAYER/mcl_hunger/mod.conf | 1 - mods/PLAYER/mcl_playerinfo/mod.conf | 2 +- mods/PLAYER/mcl_playerplus/init.lua | 2 - mods/PLAYER/mcl_playerplus/mod.conf | 2 +- 24 files changed, 247 insertions(+), 316 deletions(-) diff --git a/mods/CORE/mcl_damage/init.lua b/mods/CORE/mcl_damage/init.lua index 24c5fb42c..6b343c4c2 100644 --- a/mods/CORE/mcl_damage/init.lua +++ b/mods/CORE/mcl_damage/init.lua @@ -14,13 +14,14 @@ mcl_damage = { cactus = {}, fall = {bypasses_armor = true}, fly_into_wall = {bypasses_armor = true}, -- unused - out_of_world = {bypasses_armor = true, bypasses_invulnerability = true}, + out_of_world = {bypasses_armor = true, bypasses_magic = true, bypasses_invulnerability = true}, generic = {bypasses_armor = true}, magic = {is_magic = true, bypasses_armor = true}, + dragon_breath = {is_magic = true, bypasses_armor = true}, -- this is only used for dragon fireball; dragon fireball does not actually deal impact damage tho, so this is unreachable wither = {bypasses_armor = true}, -- unused + wither_skull = {is_magic = true, is_explosion = true}, -- this is non-MC but a workaround to get the proper death message anvil = {}, - falling_node = {}, -- unused - dragon_breath = {bypasses_armor = true}, -- unused + falling_node = {}, -- this is falling_block in MC mob = {}, player = {}, arrow = {is_projectile = true}, @@ -29,7 +30,6 @@ mcl_damage = { explosion = {is_explosion = true}, cramming = {bypasses_armor = true}, -- unused fireworks = {is_explosion = true}, -- unused - command = {bypasses_armor = true, bypasses_invulnerability = true, bypasses_magic = true}, } } diff --git a/mods/CORE/mcl_explosions/init.lua b/mods/CORE/mcl_explosions/init.lua index 52499215e..e59e3ea12 100644 --- a/mods/CORE/mcl_explosions/init.lua +++ b/mods/CORE/mcl_explosions/init.lua @@ -12,7 +12,6 @@ under the LGPLv2.1 license. mcl_explosions = {} -local mod_death_messages = minetest.get_modpath("mcl_death_messages") ~= nil local mod_fire = minetest.get_modpath("mcl_fire") ~= nil local CONTENT_FIRE = minetest.get_content_id("mcl_fire:fire") @@ -333,9 +332,6 @@ local function trace_explode(pos, strength, raydirs, radius, info, direct, sourc sleep_formspec_doesnt_close_mt53 = true end end - if mod_death_messages then - mcl_death_messages.player_damage(obj, S("@1 was caught in an explosion.", name)) - end end if sleep_formspec_doesnt_close_mt53 then diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index a2a1ea816..f619b5465 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -516,3 +516,22 @@ function mcl_util.get_inventory(object, create) return inventory end end + +function mcl_util.get_wielded_item(object) + if object:is_player() then + return object:get_wielded_item() + else + -- ToDo: implement getting wielditems from mobs as soon as mobs have wielditems + return ItemStack() + end +end + +function mcl_util.get_object_name(object) + if object:is_player() then + return object:get_player_name() + else + local luaentity = object:get_luaentity() + + return luaentity.nametag and luaentity.nametag ~= "" and luaentity.nametag or luaentity.description or luaentity.name + end +end diff --git a/mods/ENTITIES/mcl_burning/api.lua b/mods/ENTITIES/mcl_burning/api.lua index 21875619c..0d299cc69 100644 --- a/mods/ENTITIES/mcl_burning/api.lua +++ b/mods/ENTITIES/mcl_burning/api.lua @@ -35,7 +35,7 @@ function mcl_burning.get_touching_nodes(obj, nodenames, storage) return nodes end -function mcl_burning.set_on_fire(obj, burn_time, reason) +function mcl_burning.set_on_fire(obj, burn_time) if obj:get_hp() < 0 then return end @@ -52,7 +52,7 @@ function mcl_burning.set_on_fire(obj, burn_time, reason) else local max_fire_prot_lvl = 0 local inv = mcl_util.get_inventory(obj) - local armor_list = inv and inv:get_list("armor") + local armor_list = inv and inv:get_list("armor") if armor_list then for _, stack in pairs(armor_list) do @@ -79,7 +79,6 @@ function mcl_burning.set_on_fire(obj, burn_time, reason) }) end storage.burn_time = burn_time - storage.burn_reason = reason storage.fire_damage_timer = 0 local fire_entity = minetest.add_entity(obj:get_pos(), "mcl_burning:fire") @@ -120,7 +119,6 @@ function mcl_burning.extinguish(obj) mcl_burning.storage[obj] = {} else storage.burn_time = nil - storage.burn_reason = nil storage.fire_damage_timer = nil end end @@ -140,20 +138,13 @@ function mcl_burning.tick(obj, dtime, storage) storage.fire_damage_timer = 0 local hp = mcl_util.get_hp(obj) - + if hp > 0 then local do_damage = true if obj:is_player() then if mcl_potions.player_has_effect(obj, "fire_proof") then do_damage = false - else - local name = obj:get_player_name() - local deathmsg = S("@1 burned to death.", name) - if storage.reason then - deathmsg = S("@1 was burned by @2.", name, storage.reason) - end - mcl_death_messages.player_damage(obj, deathmsg) end elseif obj:get_luaentity().fire_damage_resistant then do_damage = false diff --git a/mods/ENTITIES/mcl_falling_nodes/init.lua b/mods/ENTITIES/mcl_falling_nodes/init.lua index 831434d62..af2c06703 100644 --- a/mods/ENTITIES/mcl_falling_nodes/init.lua +++ b/mods/ENTITIES/mcl_falling_nodes/init.lua @@ -1,5 +1,4 @@ local S = minetest.get_translator("mcl_falling_nodes") -local dmes = minetest.get_modpath("mcl_death_messages") ~= nil local has_mcl_armor = minetest.get_modpath("mcl_armor") local get_falling_depth = function(self) @@ -41,12 +40,9 @@ local deal_falling_damage = function(self, dtime) end local deathmsg, dmg_type if minetest.get_item_group(self.node.name, "anvil") ~= 0 then - deathmsg, dmg_type = "@1 was smashed by a falling anvil.", "anvil" + dmg_type = "anvil" else - deathmsg, dmg_type = "@1 was smashed by a falling block.", "falling_node" - end - if obj:is_player() then - mcl_death_messages.player_damage(obj, S(deathmsg, obj:get_player_name())) + dmg_type = "falling_node" end mcl_util.deal_damage(obj, damage, {type = dmg_type}) end diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index 4595ce5a7..876237f19 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -151,7 +151,7 @@ mobs:register_arrow("mobs_mc:blaze_fireball", { -- Direct hit, no fire... just plenty of pain hit_player = function(self, player) - mcl_burning.set_on_fire(player, 5, "blaze") + mcl_burning.set_on_fire(player, 5) player:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = 5}, diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index 64a304dbe..4a58866f9 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -11,7 +11,6 @@ of the license, or (at your option) any later version. local S = minetest.get_translator("lightning") -local has_mcl_death_msg = minetest.get_modpath("mcl_death_messages") local get_connected_players = minetest.get_connected_players local line_of_sight = minetest.line_of_sight local get_node = minetest.get_node @@ -171,9 +170,6 @@ lightning.strike = function(pos) obj:set_yaw(rot) -- Other objects: Just damage else - if obj:is_player() and has_mcl_death_msg then - mcl_death_messages.player_damage(obj, S("@1 was struck by lightning.", obj:get_player_name())) - end mcl_util.deal_damage(obj, 5, {type = "lightning_bolt"}) end end diff --git a/mods/ENVIRONMENT/lightning/mod.conf b/mods/ENVIRONMENT/lightning/mod.conf index b0d756318..346a4a0b9 100644 --- a/mods/ENVIRONMENT/lightning/mod.conf +++ b/mods/ENVIRONMENT/lightning/mod.conf @@ -2,5 +2,4 @@ name = lightning author = sofar description = A mod that adds thunder and lightning effects. depends = mcl_fire -optional_depends = mcl_death_messages diff --git a/mods/ENVIRONMENT/mcl_void_damage/init.lua b/mods/ENVIRONMENT/mcl_void_damage/init.lua index ac39d10ba..24f7d0e4b 100644 --- a/mods/ENVIRONMENT/mcl_void_damage/init.lua +++ b/mods/ENVIRONMENT/mcl_void_damage/init.lua @@ -5,7 +5,6 @@ local pos_to_dim = mcl_worlds.pos_to_dimension local dim_change = mcl_worlds.dimension_change local is_in_void = mcl_worlds.is_in_void local get_spawn_pos = mcl_spawn.get_player_spawn_pos -local death_msg = mcl_death_messages.player_damage local send_chat = minetest.chat_send_player local get_connected = minetest.get_connected_players @@ -79,7 +78,6 @@ minetest.register_globalstep(function(dtime) elseif enable_damage and not is_immortal then -- Damage enabled, not immortal: Deal void damage (4 HP / 0.5 seconds) if player:get_hp() > 0 then - death_msg(player, S("@1 fell into the endless void.", player:get_player_name())) mcl_util.deal_damage(player, VOID_DAMAGE, {type = "out_of_world"}) end end diff --git a/mods/ENVIRONMENT/mcl_void_damage/mod.conf b/mods/ENVIRONMENT/mcl_void_damage/mod.conf index 3f34fa5a1..1358e5217 100644 --- a/mods/ENVIRONMENT/mcl_void_damage/mod.conf +++ b/mods/ENVIRONMENT/mcl_void_damage/mod.conf @@ -1,4 +1,4 @@ name = mcl_void_damage author = Wuzzy description = Deal damage to entities stuck in the deep void -depends = mcl_worlds, mcl_death_messages +depends = mcl_worlds diff --git a/mods/HUD/mcl_death_messages/init.lua b/mods/HUD/mcl_death_messages/init.lua index 6fd7e0c93..874af7754 100644 --- a/mods/HUD/mcl_death_messages/init.lua +++ b/mods/HUD/mcl_death_messages/init.lua @@ -1,81 +1,157 @@ local S = minetest.get_translator("mcl_death_messages") -local N = function(s) return s end -local C = minetest.colorize -local color_skyblue = mcl_colors.AQUA - -local function get_tool_name(item) - local name = item:get_meta():get_string("name") - if name ~= "" then - return name - end - local def = item:get_definition() - return def._tt_original_description or def.description - end - -mcl_death_messages = {} - --- Death messages -local msgs = { - ["arrow"] = { - N("@1 was fatally hit by an arrow."), - N("@1 has been killed by an arrow."), +mcl_death_messages = { + messages = { + in_fire = { + _translator = S, + plain = "@1 went up in flames", + escape = "@1 walked into fire whilst fighting @2", + }, + lightning_bolt = { + _translator = S, + plain = "@1 was struck by lightning", + escape = "@1 was struck by lightning whilst fighting @2", + }, + on_fire = { + _translator = S, + plain = "@1 burned to death", + escape = "@1 was burnt to a crisp whilst fighting @2", + }, + lava = { + _translator = S, + plain = "@1 tried to swim in lava", + escape = "@1 tried to swim in lava to escape @2" + }, + hot_floor = { + _translator = S, + plain = "@1 discovered the floor was lava", + escape = "@1 walked into danger zone due to @2", + }, + in_wall = { + _translator = S, + plain = "@1 suffocated in a wall", + escape = "@1 suffocated in a wall whilst fighting @2", + }, + drown = { + _translator = S, + plain = "@1 drowned", + escape = "@1 drowned whilst trying to escape @2", + }, + starve = { + _translator = S, + plain = "@1 starved to death", + escape = "@1 starved to death whilst fighting @2", + }, + cactus = { + _translator = S, + plain = "@1 was pricked to death", + escape = "@1 walked into a cactus whilst trying to escape @2", + }, + fall = { + _translator = S, + plain = "@1 hit the ground too hard", + escape = "@1 hit the ground too hard whilst trying to escape @2", + -- "@1 fell from a high place" -- for fall distance > 5 blocks + -- "@1 fell while climbing" + -- "@1 fell off some twisting vines" + -- "@1 fell off some weeping vines" + -- "@1 fell off some vines" + -- "@1 fell off scaffolding" + -- "@1 fell off a ladder" + }, + fly_into_wall = { + _translator = S, + plain = "@1 experienced kinetic energy", + escape = "@1 experienced kinetic energy whilst trying to escape @2", + }, + out_of_world = { + _translator = S, + plain = "@1 fell out of the world", + escape = "@1 didn't want to live in the same world as @2", + }, + generic = { + _translator = S, + plain = "@1 died", + escape = "@1 died because of @2", + }, + magic = { + _translator = S, + plain = "@1 was killed by magic", + escape = "@1 was killed by magic whilst trying to escape @2", + killer = "@1 was killed by @2 using magic", + item = "@1 was killed by @2 using @3", + }, + dragon_breath = { + _translator = S, + plain = "@1 was roasted in dragon breath", + killer = "@1 was roasted in dragon breath by @2", + }, + wither = { + _translator = S, + plain = "@1 withered away", + escape = "@1 withered away whilst fighting @2", + }, + wither_skull = { + _translator = S, + plain = "@1 was killed by magic", + killer = "@1 was shot by a skull from @2", + }, + anvil = { + _translator = S, + plain = "@1 was squashed by a falling anvil", + escape = "@1 was squashed by a falling anvil whilst fighting @2", + }, + falling_node = { + _translator = S, + plain = "@1 was squashed by a falling block", + escape = "@1 was squashed by a falling block whilst fighting @2", + }, + mob = { + _translator = S, + killer = "@1 was slain by @2", + item = "@1 was slain by @2 using @3", + }, + player = { + _translator = S, + killer = "@1 was slain by @2", + item = "@1 was slain by @2 using @3" + }, + arrow = { + _translator = S, + killer = "@1 was shot by @2", + item = "@1 was shot by @2 using @3", + }, + fireball = { + _translator = S, + killer = "@1 was fireballed by @2", + item = "@1 was fireballed by @2 using @3", + }, + thorns = { + _translator = S, + killer = "@1 was killed trying to hurt @2", + item = "@1 was killed by @3 trying to hurt @2", -- yes, the order is intentional: @1 @3 @2 + }, + explosion = { + _translator = S, + plain = "@1 blew up", + killer = "@1 was blown up by @2", + item = "@1 was blown up by @2 using @3", + -- "@1 was killed by [Intentional Game Design]" -- for exploding bed in nether or end + }, + cramming = { + _translator = S, + plain = "@1 was squished too much", + escape = "@1 was squashed by @2", -- surprisingly "escape" is actually the correct subtype + }, + fireworks = { + _translator = S, + plain = "@1 went off with a bang", + item = "@1 went off with a bang due to a firework fired from @3 by @2", -- order is intentional + }, + -- Missing snowballs: The Minecraft wiki mentions them but the MC source code does not. }, - ["arrow_name"] = { - N("@1 was shot by @2 using [@3]"), - }, - ["arrow_skeleton"] = { - N("@1 was shot by Skeleton."), - }, - ["arrow_stray"] = { - N("@1 was shot by Stray."), - }, - ["arrow_illusioner"] = { - N("@1 was shot by Illusioner."), - }, - ["arrow_mob"] = { - N("@1 was shot."), - }, - ["drown"] = { - N("@1 forgot to breathe."), - N("@1 drowned."), - N("@1 ran out of oxygen."), - }, - ["murder"] = { - N("@1 was slain by @2 using [@3]"), - }, - ["murder_hand"] = { - N("@1 was slain by @2"), - }, - ["murder_any"] = { - N("@1 was killed."), - }, - ["mob_kill"] = { - N("@1 was slain by a mob."), - }, - ["blaze_fireball"] = { - N("@1 was burned to death by a Blaze's fireball."), - N("@1 was fireballed by a Blaze"), - }, - ["fire_charge"] = { - N("@1 was burned by a fire charge."), - }, - ["ghast_fireball"] = { - N("A Ghast scared @1 to death."), - N("@1 has been fireballed by a Ghast."), - }, - ["fall"] = { - N("@1 fell from a high cliff."), - N("@1 took fatal fall damage."), - N("@1 fell victim to gravity."), - N("@1 hit the ground too hard.") - }, - - ["other"] = { - N("@1 died."), - } } - +--[[ local mobkills = { ["mobs_mc:zombie"] = N("@1 was slain by Zombie."), ["mobs_mc:baby_zombie"] = N("@1 was slain by Baby Zombie."), @@ -117,191 +193,74 @@ local mobkills = { ["mobs_mc:pigman"] = N("@1 was slain by Zombie Pigman."), ["mobs_mc:baby_pigman"] = N("@1 was slain by Baby Zombie Pigman."), } +]]-- --- Select death message -local dmsg = function(mtype, ...) - local r = math.random(1, #msgs[mtype]) - return S(msgs[mtype][r], ...) -end - --- Select death message for death by mob -local mmsg = function(mtype, ...) - if mobkills[mtype] then - return S(mobkills[mtype], ...) - else - return dmsg("mob_kill", ...) +local function get_item_killer_message(obj, messages, reason) + if messages.item then + local wielded = mcl_util.get_wielded_item(reason.source) + local itemname = wielded:get_meta():get_string("name") + if itemname ~= "" then + itemname = "[" .. itemname .. "]" + if mcl_enchanting.is_enchanted(wielded:get_name()) then + itemname = minetest.colorize(mcl_colors.AQUA, itemname) + end + return messages._translator(messages.item, mcl_util.get_object_name(obj), mcl_util.get_object_name(reason.source), itemname) + end end end -local last_damages = { } +local function get_plain_killer_message(obj, messages, reason) + return messages.killer and messages._translator(messages.killer, mcl_util.get_object_name(obj), mcl_util.get_object_name(reason.source)) +end -minetest.register_on_dieplayer(function(player, reason) - -- Death message - local message = minetest.settings:get_bool("mcl_showDeathMessages") --Maybe cache the setting? - if message == nil then - message = true +local function get_killer_message(obj, messages, reason) + return reason.source and (get_item_killer_message(obj, messages, reason) or get_plain_killer_message(obj, messages, reason)) +end + +local function get_escaped_message(obj, messages, reason) + return nil -- ToDo +end + +local function get_plain_message(obj, messages, reason) + if messages.plain then + return messages._translator(messages.plain, mcl_util.get_object_name(obj)) end - if message then - local name = player:get_player_name() - if not name then - return - end - local msg - if last_damages[name] then - -- custom message - msg = last_damages[name].message - elseif reason.type == "node_damage" then - local pos = player:get_pos() - -- Check multiple nodes because players occupy multiple nodes - -- (we add one additional node because the check may fail if the player was - -- just barely touching the node with the head) - local posses = { pos, {x=pos.x,y=pos.y+1,z=pos.z}, {x=pos.x,y=pos.y+2,z=pos.z}} - local highest_damage = 0 - local highest_damage_def = nil - -- Show message for node that dealt the most damage - for p=1, #posses do - local def = minetest.registered_nodes[minetest.get_node(posses[p]).name] - local dmg = def.damage_per_second - if dmg and dmg > highest_damage then - highest_damage = dmg - highest_damage_def = def - end - end - if highest_damage_def and highest_damage_def._mcl_node_death_message then - local field = highest_damage_def._mcl_node_death_message - local field_msg - if type(field) == "table" then - field_msg = field[math.random(1, #field)] - else - field_msg = field - end - local textdomain - if highest_damage_def.mod_origin then - textdomain = highest_damage_def.mod_origin - else - textdomain = "mcl_death_messages" - end - -- We assume the textdomain of the death message in the node definition - -- equals the modname. - msg = minetest.translate(textdomain, field_msg, name) - end - elseif reason.type == "drown" then - msg = dmsg("drown", name) - elseif reason.type == "punch" then - -- Punches - local hitter = reason.object +end - -- Player was slain by potions - if not hitter then return end +local function get_fallback_message(obj, messages, reason) + return "mcl_death_messages.messages." .. reason.type .. " " .. mcl_util.get_object_name(obj) +end - local hittername, hittertype, hittersubtype, shooter - local hitter_toolname = get_tool_name(hitter:get_wielded_item()) +local function fallback_translator(s) + return s +end - -- Custom message - if last_damages[name] then - msg = last_damages[name].message - -- Unknown hitter - elseif hitter == nil then - msg = dmsg("murder_any", name) - -- Player - elseif hitter:is_player() then - hittername = hitter:get_player_name() - if hittername ~= nil then - if hitter_toolname == "" then - msg = dmsg("murder_hand", name, hittername) - else - msg = dmsg("murder", name, hittername, C(color_skyblue, hitter_toolname)) - end - else - msg = dmsg("murder_any", name) - end - -- Mob (according to Common Mob Interface) - elseif hitter:get_luaentity()._cmi_is_mob then - if hitter:get_luaentity().nametag and hitter:get_luaentity().nametag ~= "" then - hittername = hitter:get_luaentity().nametag - end - hittersubtype = hitter:get_luaentity().name - if hittername then - msg = dmsg("murder_hand", name, hittername) - elseif hittersubtype ~= nil and hittersubtype ~= "" then - msg = mmsg(hittersubtype, name) - else - msg = dmsg("murder_any", name) - end - -- Arrow - elseif hitter:get_luaentity().name == "mcl_bows:arrow_entity" or hitter:get_luaentity().name == "mobs_mc:arrow_entity" and not killed_by_potion then - local shooter - if hitter:get_luaentity()._shooter then - shooter = hitter:get_luaentity()._shooter - end - local is_mob = false - local s_ent = shooter and shooter:get_luaentity() - if shooter == nil then - msg = dmsg("arrow", name) - elseif shooter:is_player() then - msg = dmsg("arrow_name", name, shooter:get_player_name(), C(color_skyblue, get_tool_name(shooter:get_wielded_item()))) - elseif s_ent and s_ent._cmi_is_mob then - if s_ent.nametag ~= "" then - msg = dmsg("arrow_name", name, shooter:get_player_name(), get_tool_name(shooter:get_wielded_item())) - elseif s_ent.name == "mobs_mc:skeleton" then - msg = dmsg("arrow_skeleton", name) - elseif s_ent.name == "mobs_mc:stray" then - msg = dmsg("arrow_stray", name) - elseif s_ent.name == "mobs_mc:illusioner" then - msg = dmsg("arrow_illusioner", name) - else - msg = dmsg("arrow_mob", name) - end - else - msg = dmsg("arrow", name) - end - -- Blaze fireball - elseif hitter:get_luaentity().name == "mobs_mc:blaze_fireball" then - if hitter:get_luaentity()._shot_from_dispenser then - msg = dmsg("fire_charge", name) - else - msg = dmsg("blaze_fireball", name) - end - -- Ghast fireball - elseif hitter:get_luaentity().name == "mobs_monster:fireball" then - msg = dmsg("ghast_fireball", name) - end - -- Falling - elseif reason.type == "fall" then - msg = dmsg("fall", name) - -- Other - elseif reason.type == "set_hp" then - if last_damages[name] then - msg = last_damages[name].message - end +mcl_damage.register_on_death(function(obj, reason) + if not minetest.settings:get_bool("mcl_showDeathMessages", true) then + return + end + + local send_to + + if obj:is_player() then + send_to = true + end -- ToDo: add mob death messages for owned mobs, only send to owner (sent_to = "player name") + + + if send_to then + local messages = mcl_death_messages.messages[reason.type] or {} + messages._translator = messages._translator or fallback_translator + + local message = + get_killer_message(obj, messages, reason) or + get_escaped_message(obj, messages, reason) or + get_plain_message(obj, messages, reason) or + get_fallback_message(obj, messages, reason) + + if send_to == true then + minetest.chat_send_all(message) + else + minetest.chat_send_player(send_to, message) end - if not msg then - msg = dmsg("other", name) - end - minetest.chat_send_all(msg) - last_damages[name] = nil end end) - --- dmg_sequence_number is used to discard old damage events -local dmg_sequence_number = 0 -local start_damage_reset_countdown = function (player, sequence_number) - minetest.after(1, function(playername, sequence_number) - if last_damages[playername] and last_damages[playername].sequence_number == sequence_number then - last_damages[playername] = nil - end - end, player:get_player_name(), sequence_number) -end - --- Send a custom death mesage when damaging a player via set_hp or punch. --- To be called directly BEFORE damaging a player via set_hp or punch. --- The next time the player dies due to a set_hp, the message will be shown. --- The player must die via set_hp within 0.1 seconds, otherwise the message will be discarded. -function mcl_death_messages.player_damage(player, message) - last_damages[player:get_player_name()] = { message = message, sequence_number = dmg_sequence_number } - start_damage_reset_countdown(player, dmg_sequence_number) - dmg_sequence_number = dmg_sequence_number + 1 - if dmg_sequence_number >= 65535 then - dmg_sequence_number = 0 - end -end diff --git a/mods/ITEMS/mcl_armor/damage.lua b/mods/ITEMS/mcl_armor/damage.lua index 3715538ec..c5023deb5 100644 --- a/mods/ITEMS/mcl_armor/damage.lua +++ b/mods/ITEMS/mcl_armor/damage.lua @@ -80,8 +80,8 @@ mcl_damage.register_modifier(function(obj, damage, reason) local thorns_damage = thorns_damage_regular + thorns_damage_irregular - if thorns_damage > 0 and reason.source ~= obj then - mcl_util.deal_damage(reason.source, {type = "thorns", direct = obj, source = reason.source}) + if thorns_damage > 0 and reason.type ~= "thorns" and reason.source ~= obj then + mcl_util.deal_damage(reason.source, {type = "thorns", direct = obj}) local thorns_item = thorns_pieces[math.random(#thorns_pieces)] mcl_util.use_item_durability(thorns_item.itemstack, 2) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 6fb1d079a..84327e3f6 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -132,7 +132,7 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, if wielditem then local fire_aspect_level = mcl_enchanting.get_enchantment(wielditem, "fire_aspect") if fire_aspect_level > 0 then - mcl_burning.set_on_fire(player, fire_aspect_level * 4, hitter:get_player_name()) + mcl_burning.set_on_fire(player, fire_aspect_level * 4) end end end diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index b6285ceb4..0a0e2b183 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -1,6 +1,5 @@ local S = minetest.get_translator("mcl_nether") -local mod_death_messages = minetest.get_modpath("mcl_death_messages") local mod_screwdriver = minetest.get_modpath("screwdriver") ~= nil local on_rotate if mod_screwdriver then @@ -111,9 +110,6 @@ minetest.register_node("mcl_nether:magma", { end -- Hurt players standing on top of this block if player:get_hp() > 0 then - if mod_death_messages then - mcl_death_messages.player_damage(player, S("@1 stood too long on a magma block.", player:get_player_name())) - end mcl_util.deal_damage(player, 1, {type = "hot_floor"}) end end, diff --git a/mods/ITEMS/mcl_nether/mod.conf b/mods/ITEMS/mcl_nether/mod.conf index 8bef6c6c9..f5ffa61ac 100644 --- a/mods/ITEMS/mcl_nether/mod.conf +++ b/mods/ITEMS/mcl_nether/mod.conf @@ -1,3 +1,3 @@ name = mcl_nether depends = mcl_core, mcl_sounds, mcl_util, walkover, doc_items, mcl_colors -optional_depends = mcl_death_messages, doc, screwdriver +optional_depends = doc, screwdriver diff --git a/mods/ITEMS/mcl_tnt/mod.conf b/mods/ITEMS/mcl_tnt/mod.conf index 9d75a788c..2e90ddb80 100644 --- a/mods/ITEMS/mcl_tnt/mod.conf +++ b/mods/ITEMS/mcl_tnt/mod.conf @@ -1,3 +1,3 @@ name = mcl_tnt depends = mcl_explosions, mcl_particles -optional_depends = mcl_sounds, mcl_mobitems, mcl_death_messages, doc_identifier, mesecons +optional_depends = mcl_sounds, mcl_mobitems, doc_identifier, mesecons diff --git a/mods/MISC/mcl_commands/kill.lua b/mods/MISC/mcl_commands/kill.lua index 3eac565d6..85754a0ec 100644 --- a/mods/MISC/mcl_commands/kill.lua +++ b/mods/MISC/mcl_commands/kill.lua @@ -1,5 +1,4 @@ local S = minetest.get_translator("mcl_commands") -local mod_death_messages = minetest.get_modpath("mcl_death_messages") local function handle_kill_command(suspect, victim) if minetest.settings:get_bool("enable_damage") == false then @@ -21,17 +20,8 @@ local function handle_kill_command(suspect, victim) if wield:get_name() == "mobs_mc:totem" then victimref:set_wielded_item("") end - if mod_death_messages then - local msg - if suspect == victim then - msg = S("@1 committed suicide.", victim) - else - msg = S("@1 was killed by @2.", victim, suspect) - end - mcl_death_messages.player_damage(victimref, msg) - end -- DIE! - victimref:set_hp(0, {_mcl_type = "command"}) + victimref:set_hp(0, {_mcl_type = "out_of_world"}) -- Log if not suspect == victim then minetest.log("action", string.format("%s killed %s using /kill", suspect, victim)) diff --git a/mods/MISC/mcl_commands/mod.conf b/mods/MISC/mcl_commands/mod.conf index d651fad7b..00d707098 100644 --- a/mods/MISC/mcl_commands/mod.conf +++ b/mods/MISC/mcl_commands/mod.conf @@ -1,4 +1,3 @@ name = mcl_commands author = Wuzzy description = MCL2 commands -optional_depends = mcl_death_messages diff --git a/mods/PLAYER/mcl_hunger/hunger.lua b/mods/PLAYER/mcl_hunger/hunger.lua index 2f192357a..51d7fdaeb 100644 --- a/mods/PLAYER/mcl_hunger/hunger.lua +++ b/mods/PLAYER/mcl_hunger/hunger.lua @@ -1,5 +1,4 @@ local S = minetest.get_translator("mcl_hunger") -local mod_death_messages = minetest.get_modpath("mcl_death_messages") -- 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_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index 84eff255c..6b9998574 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -1,5 +1,4 @@ local S = minetest.get_translator("mcl_hunger") -local mod_death_messages = minetest.get_modpath("mcl_death_messages") mcl_hunger = {} @@ -159,9 +158,6 @@ minetest.register_globalstep(function(dtime) -- Damage hungry player down to 1 HP -- TODO: Allow starvation at higher difficulty levels if hp-1 > 0 then - if mod_death_messages then - mcl_death_messages.player_damage(player, S("@1 starved to death.", name)) - end mcl_util.deal_damage(player, 1, {type = "starve"}) end end diff --git a/mods/PLAYER/mcl_hunger/mod.conf b/mods/PLAYER/mcl_hunger/mod.conf index 7795da7a2..99ab71ff3 100644 --- a/mods/PLAYER/mcl_hunger/mod.conf +++ b/mods/PLAYER/mcl_hunger/mod.conf @@ -2,4 +2,3 @@ name = mcl_hunger author = BlockMen description = Adds a simple hunger meachanic with satiation, food poisoning and different healing. depends = hudbars -optional_depends = mcl_death_messages diff --git a/mods/PLAYER/mcl_playerinfo/mod.conf b/mods/PLAYER/mcl_playerinfo/mod.conf index 9f2b0c4a5..25c05f03e 100644 --- a/mods/PLAYER/mcl_playerinfo/mod.conf +++ b/mods/PLAYER/mcl_playerinfo/mod.conf @@ -1,4 +1,4 @@ name = mcl_playerinfo author = TenPlus1 description = This is a helper mod for other mod to query the nodes around the player. -depends = mcl_init, mcl_core, mcl_particles, mcl_death_messages +depends = mcl_init, mcl_core, mcl_particles diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 7dbb93215..a483a027a 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -391,7 +391,6 @@ minetest.register_globalstep(function(dtime) -- Check privilege, too and (not check_player_privs(name, {noclip = true})) then if player:get_hp() > 0 then - mcl_death_messages.player_damage(player, S("@1 suffocated to death.", name)) mcl_util.deal_damage(player, 1, {type = "in_wall"}) end end @@ -407,7 +406,6 @@ minetest.register_globalstep(function(dtime) local dist_feet = vector.distance({x=pos.x, y=pos.y-1, z=pos.z}, near) if dist < 1.1 or dist_feet < 1.1 then if player:get_hp() > 0 then - mcl_death_messages.player_damage(player, S("@1 was prickled to death by a cactus.", name)) mcl_util.deal_damage(player, 1, {type = "cactus"}) end end diff --git a/mods/PLAYER/mcl_playerplus/mod.conf b/mods/PLAYER/mcl_playerplus/mod.conf index 6cc9c68db..6989957d7 100644 --- a/mods/PLAYER/mcl_playerplus/mod.conf +++ b/mods/PLAYER/mcl_playerplus/mod.conf @@ -1,5 +1,5 @@ name = mcl_playerplus author = TenPlus1 description = Adds some simple player-related gameplay effects: Hurt by touching a cactus, suffocation and more. -depends = mcl_init, mcl_core, mcl_particles, mcl_hunger, mcl_death_messages, playerphysics, mcl_playerinfo, mcl_weather, mcl_spawn, mcl_enchanting, mcl_damage +depends = mcl_init, mcl_core, mcl_particles, mcl_hunger, playerphysics, mcl_playerinfo, mcl_weather, mcl_spawn, mcl_enchanting, mcl_damage From aeaec68c1be199dcac2a039798b1ce1b9aed1736 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 25 Apr 2021 17:11:47 +0200 Subject: [PATCH 088/136] Update german translations for mcl_death_messages --- .../locale/mcl_death_messages.de.tr | 115 +++++++++--------- .../mcl_death_messages/locale/template.txt | 115 +++++++++--------- 2 files changed, 114 insertions(+), 116 deletions(-) diff --git a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr index ffb567b8b..39235dff7 100644 --- a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr +++ b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.de.tr @@ -1,59 +1,58 @@ # textdomain: mcl_death_messages -@1 was fatally hit by an arrow.=@1 wurde tödlich von einem Pfeil getroffen. -@1 has been killed by an arrow.=@1 wurde von einem Pfeil getötet. -@1 was shot by an arrow from @2.=@1 wurde mit einem Pfeil von @2 abgeschossen. -@1 was shot by an arrow from a skeleton.=@1 wurde von einem Skelett mit Pfeil und Bogen abgeschossen. -@1 was shot by an arrow from a stray.=@1 wurde von einem Eiswanderer mit Pfeil und Bogen abgeschossen. -@1 was shot by an arrow from an illusioner.=@1 wurde von einem Illusionisten mit Pfeil und Bogen abgeschossen. -@1 was shot by an arrow.=@1 wurde mit einem Pfeil abgeschossen. -@1 forgot to breathe.=@1 vergaß, zu atmen. -@1 drowned.=@1 ertrank. -@1 ran out of oxygen.=@1 ging die Luft aus. -@1 was killed by @2.=@1 wurde von @2 getötet. -@1 was killed.=@1 wurde getötet. -@1 was killed by a mob.=@1 wurde von einem Mob getötet. -@1 was burned to death by a blaze's fireball.=@1 wurde von einem Feuerball einer Lohe zu Tode verbrannt. -@1 was killed by a fireball from a blaze.=@1 wurde von einem Feuerball einer Lohe getötet. -@1 was burned by a fire charge.=@1 wurde von einer Feuerkugel verbrannt. -A ghast scared @1 to death.=Ein Ghast hat @1 zu Tode erschrocken. -@1 has been fireballed by a ghast.=@1 wurde von einem Ghast mit einer Feuerkugel abgeschossen. -@1 fell from a high cliff.=@1 stürzte von einer hohen Klippe. -@1 took fatal fall damage.=@1 nahm tödlichen Fallschaden. -@1 fell victim to gravity.=@1 fiel der Schwerkraft zum Opfer. -@1 died.=@1 starb. -@1 was killed by a zombie.=@1 wurde von einem Zombie getötet. -@1 was killed by a baby zombie.=@1 wurde von einem Zombiebaby getötet. -@1 was killed by a blaze.=@1 wurde von einer Lohe getötet. -@1 was killed by a slime.=@1 wurde von einem Schleim getötet. -@1 was killed by a witch.=@1 wurde von einer Hexe getötet. -@1 was killed by a magma cube.=@1 wurde von einem Magmakubus getötet. -@1 was killed by a wolf.=@1 wurde von einem Wolf getötet. -@1 was killed by a cat.=@1 wurde von einer Katze getötet. -@1 was killed by an ocelot.=@1 wurde von einem Ozelot getötet. -@1 was killed by an ender dragon.=@1 wurde von einem Enderdrachen getötet. -@1 was killed by a wither.=@1 wurde von einem Wither getötet. -@1 was killed by an enderman.=@1 wurde von einem Enderman getötet. -@1 was killed by an endermite.=@1 wurde von einer Endermilbe getötet. -@1 was killed by a ghast.=@1 wurde von einem Ghast getötet. -@1 was killed by an elder guardian.=@1 wurde von einem Großen Wächter getötet. -@1 was killed by a guardian.=@1 wurde von einem Wächter getötet. -@1 was killed by an iron golem.=@1 wurde von einem Eisengolem getötet. -@1 was killed by a polar_bear.=@1 wurde von einem Eisbären getötet. -@1 was killed by a killer bunny.=@1 wurde von einem Killerkaninchen getötet. -@1 was killed by a shulker.=@1 wurde von einem Schulker getötet. -@1 was killed by a silverfish.=@1 wurde von einem Silberfischchen getötet. -@1 was killed by a skeleton.=@1 wurde von einem Skelett getötet. -@1 was killed by a stray.=@1 wurde von einem Eiswanderer getötet. -@1 was killed by a slime.=@1 wurde von einem Schleim getötet. -@1 was killed by a spider.=@1 wurde von einer Spinne getötet. -@1 was killed by a cave spider.=@1 wurde von einer Höhlenspinne getötet. -@1 was killed by a vex.=@1 wurde von einem Plagegeist getötet. -@1 was killed by an evoker.=@1 wurde von einem Magier getötet. -@1 was killed by an illusioner.=@1 wurde von einem Illusionisten getötet. -@1 was killed by a vindicator.=@1 wurde von einem Diener getötet. -@1 was killed by a zombie villager.=@1 wurde von einem Dorfbewohnerzombie getötet. -@1 was killed by a husk.=@1 wurde von einem Wüstenzombie getötet. -@1 was killed by a baby husk.=@1 wurde von einem Wüstenzombiebaby getötet. -@1 was killed by a zombie pigman.=@1 wurde von einem Schweinezombie getötet. -@1 was killed by a baby zombie pigman.=@1 wurde von einem Schweinezombiebaby getötet. -@1 was slain by @2.= +@1 went up in flames=@1 ging in Flammen auf +@1 walked into fire whilst fighting @2=@1 ist während eines Kampfes mit @2 in ein Feuer gelaufen +@1 was struck by lightning=@1 wurde von einem Blitz erschlagen +@1 was struck by lightning whilst fighting @2=@1 wurde während eines Kampfes mit @2 von einem Blitz erschlagen +@1 burned to death=@1 ist verbrannt +@1 was burnt to a crisp whilst fighting @2=@1 ist während eines Kampfes mit @2 verbrannt +@1 tried to swim in lava=@1 hat versucht, in Lava zu schwimmen +@1 tried to swim in lava to escape @2=@1 hat versucht, in Lava zu schwimmen, um @2 zu entkommen +@1 discovered the floor was lava=@1 hat festgestellt, dass der Boden Lava ist +@1 walked into danger zone due to @2=@1 ist wegen @2 in eine Gefahrenzone gelaufen +@1 suffocated in a wall=@1 ist in einer Mauer erstickt +@1 suffocated in a wall whilst fighting @2=@1 ist während eines Kampfes mit @2 in einer Mauer erstickt +@1 drowned=@1 ist ertrunken +@1 drowned whilst trying to escape @2=@1 ist während dem Versuch, @2 zu entkommen, ertrunken +@1 starved to death=@1 ist verhungert +@1 starved to death whilst fighting @2=@1 ist während eines Kampfes mit @2 verhungert +@1 was pricked to death=@1 wurde zu Tode gestochen +@1 walked into a cactus whilst trying to escape @2=@1 ist während dem Versuch, @2 zu entkommen, in einen Kaktus gelaufen +@1 hit the ground too hard=@1 ist zu hart auf dem Boden aufgetroffen +@1 hit the ground too hard whilst trying to escape @2=@1 ist während dem Versuch, @2 zu entkommen, zu hart auf dem Boden aufgetroffen +@1 experienced kinetic energy=@1 hat kinetische Energie erfahren +@1 experienced kinetic energy whilst trying to escape @2=@1 hat während dem Versuch, @2 zu entkommen, kinetische Energie erfahren +@1 fell out of the world=@1 ist aus der Welt gefallen +@1 didn't want to live in the same world as @2=@1 wollte nicht in der gleichen Welt wie @2 leben +@1 died=@1 ist gestorben +@1 died because of @2=@1 ist wegen @2 gestorben +@1 was killed by magic=@1 wurde von Magie getötet +@1 was killed by magic whilst trying to escape @2=@1 wurde während dem Versuch, @2 zu entkommen, von Magie getötet +@1 was killed by @2 using magic=@1 wurde von @2 mit Magie getötet +@1 was killed by @2 using @3=@1 wurde von @2 mit @3 getötet +@1 was roasted in dragon breath=@1 wurde in Drachenatem geröstet +@1 was roasted in dragon breath by @2=@1 wurde in Drachenatem von @2 geröstet +@1 withered away=@1 ist davon gewithert +@1 withered away whilst fighting @2=@1 ist während einem Kampf mit @2 davon gewithert +@1 was killed by magic=@1 wurde von Magie getötet +@1 was shot by a skull from @2=@1 wurde von einem Schädel von @2 erschossen +@1 was squashed by a falling anvil=@1 wurde von einem fallenden Amboss erquetscht +@1 was squashed by a falling anvil whilst fighting @2=@1 wurde während einem Kampf mit @2 von einem fallenden Amboss erquetscht +@1 was squashed by a falling block=@1 wurde von einem fallenden Block erquetscht +@1 was squashed by a falling block whilst fighting @2=@1 wurde während einem Kampf mit @2 von einem fallenden Block erquetscht +@1 was slain by @2=@1 wurde von @2 erschlagen +@1 was slain by @2 using @3=@1 wurde von @2 mit @3 erschlagen +@1 was slain by @2=@1 wurde von @2 erschlagen +@1 was slain by @2 using @3=@1 wurde von @2 mit @3 erschlagen +@1 was shot by @2=@1 wurde von @2 erschossen +@1 was shot by @2 using @3=@1 wurde von @2 mit @3 erschossen +@1 was fireballed by @2=@1 wurde von @2 gefeuerballt +@1 was fireballed by @2 using @3=@1 wurde von @2 mit @3 gefeuerballt +@1 was killed trying to hurt @2=@1 ist bei dem Versuch, @2 zu verletzten gestorben +@1 was killed by @3 trying to hurt @2=@1 ist bei dem Versuch, @2 zu verletzten, von @3 getötet worden +@1 blew up=@1 ist gesprengt worden +@1 was blown up by @2=@1 wurde von @2 gesprengt +@1 was blown up by @2 using @3=@1 wurde von @2 mit @3 gesprengt +@1 was squished too much=@1 war zu gequetscht +@1 was squashed by @2=@1 wurde von @2 erquetscht +@1 went off with a bang=@1 ging mit einem Knall ab +@1 went off with a bang due to a firework fired from @3 by @2=@1 ging mit einem Knall wegen eines Feuerwerks, das mit @3 von @2 gefeuert wurde, ab diff --git a/mods/HUD/mcl_death_messages/locale/template.txt b/mods/HUD/mcl_death_messages/locale/template.txt index d1e3b832b..67ba9fd1c 100644 --- a/mods/HUD/mcl_death_messages/locale/template.txt +++ b/mods/HUD/mcl_death_messages/locale/template.txt @@ -1,59 +1,58 @@ # textdomain: mcl_death_messages -@1 was fatally hit by an arrow.= -@1 has been killed with an arrow.= -@1 was shot by an arrow from @2.= -@1 was shot by an arrow from a skeleton.= -@1 was shot by an arrow from a stray.= -@1 was shot by an arrow from an illusioner.= -@1 was shot by an arrow.= -@1 forgot to breathe.= -@1 drowned.= -@1 ran out of oxygen.= -@1 was killed by @2.= -@1 was killed.= -@1 was killed by a mob.= -@1 was burned to death by a blaze's fireball.= -@1 was killed by a fireball from a blaze.= -@1 was burned by a fire charge.= -A ghast scared @1 to death.= -@1 has been fireballed by a ghast.= -@1 fell from a high cliff.= -@1 took fatal fall damage.= -@1 fell victim to gravity.= -@1 died.= -@1 was killed by a zombie.= -@1 was killed by a baby zombie.= -@1 was killed by a blaze.= -@1 was killed by a slime.= -@1 was killed by a witch.= -@1 was killed by a magma cube.= -@1 was killed by a wolf.= -@1 was killed by a cat.= -@1 was killed by an ocelot.= -@1 was killed by an ender dragon.= -@1 was killed by a wither.= -@1 was killed by an enderman.= -@1 was killed by an endermite.= -@1 was killed by a ghast.= -@1 was killed by an elder guardian.= -@1 was killed by a guardian.= -@1 was killed by an iron golem.= -@1 was killed by a polar_bear.= -@1 was killed by a killer bunny.= -@1 was killed by a shulker.= -@1 was killed by a silverfish.= -@1 was killed by a skeleton.= -@1 was killed by a stray.= -@1 was killed by a slime.= -@1 was killed by a spider.= -@1 was killed by a cave spider.= -@1 was killed by a vex.= -@1 was killed by an evoker.= -@1 was killed by an illusioner.= -@1 was killed by a vindicator.= -@1 was killed by a zombie villager.= -@1 was killed by a husk.= -@1 was killed by a baby husk.= -@1 was killed by a zombie pigman.= -@1 was killed by a baby zombie pigman.= -@1 was slain by @2.= +@1 went up in flames= +@1 walked into fire whilst fighting @2= +@1 was struck by lightning= +@1 was struck by lightning whilst fighting @2= +@1 burned to death= +@1 was burnt to a crisp whilst fighting @2= +@1 tried to swim in lava= +@1 tried to swim in lava to escape @2= +@1 discovered the floor was lava= +@1 walked into danger zone due to @2= +@1 suffocated in a wall= +@1 suffocated in a wall whilst fighting @2= +@1 drowned= +@1 drowned whilst trying to escape @2= +@1 starved to death= +@1 starved to death whilst fighting @2= +@1 was pricked to death= +@1 walked into a cactus whilst trying to escape @2= +@1 hit the ground too hard= +@1 hit the ground too hard whilst trying to escape @2= +@1 experienced kinetic energy= +@1 experienced kinetic energy whilst trying to escape @2= +@1 fell out of the world= +@1 didn't want to live in the same world as @2= +@1 died= +@1 died because of @2= +@1 was killed by magic= +@1 was killed by magic whilst trying to escape @2= +@1 was killed by @2 using magic= +@1 was killed by @2 using @3= +@1 was roasted in dragon breath= +@1 was roasted in dragon breath by @2= +@1 withered away= +@1 withered away whilst fighting @2= +@1 was killed by magic= +@1 was shot by a skull from @2= +@1 was squashed by a falling anvil= +@1 was squashed by a falling anvil whilst fighting @2= +@1 was squashed by a falling block= +@1 was squashed by a falling block whilst fighting @2= +@1 was slain by @2= +@1 was slain by @2 using @3= +@1 was slain by @2= +@1 was slain by @2 using @3= +@1 was shot by @2= +@1 was shot by @2 using @3= +@1 was fireballed by @2= +@1 was fireballed by @2 using @3= +@1 was killed trying to hurt @2= +@1 was killed by @3 trying to hurt @2= +@1 blew up= +@1 was blown up by @2= +@1 was blown up by @2 using @3= +@1 was squished too much= +@1 was squashed by @2= +@1 went off with a bang= +@1 went off with a bang due to a firework fired from @3 by @2= From b2407e407a4ee3ca26719b63ba4257c9f2387c86 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 25 Apr 2021 17:30:15 +0200 Subject: [PATCH 089/136] Add mob descriptions --- mods/ENTITIES/mcl_mobs/api.lua | 1 + mods/ENTITIES/mobs_mc/bat.lua | 1 + mods/ENTITIES/mobs_mc/blaze.lua | 1 + mods/ENTITIES/mobs_mc/chicken.lua | 17 +-- mods/ENTITIES/mobs_mc/cow+mooshroom.lua | 35 +++--- mods/ENTITIES/mobs_mc/creeper.lua | 19 ++-- mods/ENTITIES/mobs_mc/ender_dragon.lua | 1 + mods/ENTITIES/mobs_mc/enderman.lua | 55 ++++----- mods/ENTITIES/mobs_mc/endermite.lua | 1 + mods/ENTITIES/mobs_mc/ghast.lua | 1 + mods/ENTITIES/mobs_mc/guardian.lua | 1 + mods/ENTITIES/mobs_mc/guardian_elder.lua | 1 + mods/ENTITIES/mobs_mc/horse.lua | 33 +++--- mods/ENTITIES/mobs_mc/iron_golem.lua | 1 + mods/ENTITIES/mobs_mc/llama.lua | 13 ++- mods/ENTITIES/mobs_mc/ocelot.lua | 20 ++-- mods/ENTITIES/mobs_mc/parrot.lua | 15 +-- mods/ENTITIES/mobs_mc/pig.lua | 17 +-- mods/ENTITIES/mobs_mc/polar_bear.lua | 3 +- mods/ENTITIES/mobs_mc/rabbit.lua | 18 +-- mods/ENTITIES/mobs_mc/sheep.lua | 13 ++- mods/ENTITIES/mobs_mc/shulker.lua | 19 ++-- mods/ENTITIES/mobs_mc/silverfish.lua | 1 + mods/ENTITIES/mobs_mc/skeleton+stray.lua | 2 + mods/ENTITIES/mobs_mc/skeleton_wither.lua | 1 + mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 104 +++++++++--------- mods/ENTITIES/mobs_mc/snowman.lua | 1 + mods/ENTITIES/mobs_mc/spider.lua | 18 +-- mods/ENTITIES/mobs_mc/squid.lua | 1 + mods/ENTITIES/mobs_mc/vex.lua | 1 + mods/ENTITIES/mobs_mc/villager.lua | 1 + mods/ENTITIES/mobs_mc/villager_evoker.lua | 1 + mods/ENTITIES/mobs_mc/villager_illusioner.lua | 1 + mods/ENTITIES/mobs_mc/villager_vindicator.lua | 1 + mods/ENTITIES/mobs_mc/villager_zombie.lua | 1 + mods/ENTITIES/mobs_mc/witch.lua | 1 + mods/ENTITIES/mobs_mc/wither.lua | 1 + mods/ENTITIES/mobs_mc/wolf.lua | 15 +-- mods/ENTITIES/mobs_mc/zombie.lua | 4 + mods/ENTITIES/mobs_mc/zombiepig.lua | 34 +++--- 40 files changed, 264 insertions(+), 211 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 61077f688..25d11da16 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -3771,6 +3771,7 @@ minetest.register_entity(name, { use_texture_alpha = def.use_texture_alpha, stepheight = def.stepheight or 0.6, name = name, + description = def.description, type = def.type, attack_type = def.attack_type, fly = def.fly, diff --git a/mods/ENTITIES/mobs_mc/bat.lua b/mods/ENTITIES/mobs_mc/bat.lua index 677b96aad..e9e1c1a16 100644 --- a/mods/ENTITIES/mobs_mc/bat.lua +++ b/mods/ENTITIES/mobs_mc/bat.lua @@ -3,6 +3,7 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:bat", { + description = S("Bat"), type = "animal", spawn_class = "ambient", can_despawn = true, diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index 876237f19..5340b804e 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -11,6 +11,7 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:blaze", { + description = S("Blaze"), type = "monster", spawn_class = "hostile", hp_min = 20, diff --git a/mods/ENTITIES/mobs_mc/chicken.lua b/mods/ENTITIES/mobs_mc/chicken.lua index 246bf216a..615ec86e7 100644 --- a/mods/ENTITIES/mobs_mc/chicken.lua +++ b/mods/ENTITIES/mobs_mc/chicken.lua @@ -9,6 +9,7 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:chicken", { + description = S("Chicken"), type = "animal", spawn_class = "passive", @@ -95,14 +96,14 @@ mobs:register_mob("mobs_mc:chicken", { gain = 1.0, max_hear_distance = 16, }, true) - end, - + end, + }) --spawn mobs:spawn_specific( -"mobs_mc:chicken", -"overworld", +"mobs_mc:chicken", +"overworld", "ground", { "FlowerForest", @@ -122,10 +123,10 @@ mobs:spawn_specific( "ExtremeHillsM", "BirchForestM", }, -9, -minetest.LIGHT_MAX+1, -30, 17000, -3, +9, +minetest.LIGHT_MAX+1, +30, 17000, +3, mobs_mc.spawn_height.water, mobs_mc.spawn_height.overworld_max) diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua index 48fcc8197..62e124463 100644 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua @@ -3,6 +3,7 @@ local S = minetest.get_translator("mobs_mc") local cow_def = { + description = S("Cow"), type = "animal", spawn_class = "passive", hp_min = 10, @@ -43,7 +44,7 @@ local cow_def = { stand_speed = 25, walk_speed = 40, run_speed = 60, stand_start = 0, stand_end = 0, walk_start = 0, - walk_end = 40, run_start = 0, + walk_end = 40, run_start = 0, run_end = 40, }, follow = mobs_mc.follow.cow, @@ -81,7 +82,7 @@ mobs:register_mob("mobs_mc:cow", cow_def) -- Mooshroom local mooshroom_def = table.copy(cow_def) - +mooshroom_def.description = S("Mooshroom") mooshroom_def.mesh = "mobs_mc_cow.b3d" mooshroom_def.textures = { {"mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png"}, {"mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } } mooshroom_def.on_rightclick = function(self, clicker) @@ -147,7 +148,7 @@ mobs:register_mob("mobs_mc:mooshroom", mooshroom_def) -- Spawning mobs:spawn_specific( "mobs_mc:cow", -"overworld", +"overworld", "ground", { "FlowerForest", @@ -167,30 +168,30 @@ mobs:spawn_specific( "ExtremeHillsM", "BirchForestM", }, -9, -minetest.LIGHT_MAX+1, -30, -17000, -10, -mobs_mc.spawn_height.water, +9, +minetest.LIGHT_MAX+1, +30, +17000, +10, +mobs_mc.spawn_height.water, mobs_mc.spawn_height.overworld_max) mobs:spawn_specific( -"mobs_mc:mooshroom", -"overworld", +"mobs_mc:mooshroom", +"overworld", "ground", { "MushroomIslandShore", "MushroomIsland" }, -9, -minetest.LIGHT_MAX+1, -30, -17000, -5, -mobs_mc.spawn_height.overworld_min, +9, +minetest.LIGHT_MAX+1, +30, +17000, +5, +mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- spawn egg diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 0c884d569..827d08aab 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -130,6 +130,7 @@ mobs:register_mob("mobs_mc:creeper", { }) mobs:register_mob("mobs_mc:creeper_charged", { + description = S("Creeper"), type = "monster", spawn_class = "hostile", hp_min = 20, @@ -142,7 +143,7 @@ mobs:register_mob("mobs_mc:creeper_charged", { mesh = "mobs_mc_creeper.b3d", --BOOM - + textures = { {"mobs_mc_creeper.png", "mobs_mc_creeper_charge.png"}, @@ -254,8 +255,8 @@ mobs:register_mob("mobs_mc:creeper_charged", { }) mobs:spawn_specific( -"mobs_mc:creeper", -"overworld", +"mobs_mc:creeper", +"overworld", "ground", { "Mesa", @@ -398,12 +399,12 @@ mobs:spawn_specific( "ExtremeHillsM_underground", "JungleEdgeM_underground", }, -0, -7, -20, -16500, -2, -mobs_mc.spawn_height.overworld_min, +0, +7, +20, +16500, +2, +mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- spawn eggs diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index a6f404275..8b0b1977b 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -5,6 +5,7 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:enderdragon", { + description = S("Ender Dragon"), type = "monster", spawn_class = "hostile", pathfinding = 1, diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua index 9c47e98fc..7c55b34d6 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mobs_mc/enderman.lua @@ -190,6 +190,7 @@ end local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false mobs:register_mob("mobs_mc:enderman", { + description = S("Enderman"), type = "monster", spawn_class = "passive", passive = true, @@ -330,7 +331,7 @@ mobs:register_mob("mobs_mc:enderman", { end -- Check to see if people are near by enough to look at us. for _,obj in pairs(minetest.get_connected_players()) do - + --check if they are within radius local player_pos = obj:get_pos() if player_pos then -- prevent crashing in 1 in a million scenario @@ -355,7 +356,7 @@ mobs:register_mob("mobs_mc:enderman", { local ender_eye_pos = vector.new(enderpos.x, enderpos.y + 2.75, enderpos.z) local eye_distance_from_player = vector.distance(ender_eye_pos, look_pos) look_pos = vector.add(look_pos, vector.multiply(look_dir, eye_distance_from_player)) - + --if looking in general head position, turn hostile if minetest.line_of_sight(ender_eye_pos, look_pos_base) and vector.distance(look_pos, ender_eye_pos) <= 0.4 then self.provoked = "staring" @@ -364,7 +365,7 @@ mobs:register_mob("mobs_mc:enderman", { else -- I'm not sure what this part does, but I don't want to break anything - jordan4ibanez if self.provoked == "staring" then self.provoked = "broke_contact" - end + end end end @@ -562,23 +563,23 @@ mobs:register_mob("mobs_mc:enderman", { -- End spawn mobs:spawn_specific( -"mobs_mc:enderman", -"end", +"mobs_mc:enderman", +"end", "ground", { "End" }, -0, -minetest.LIGHT_MAX+1, -30, -3000, -12, -mobs_mc.spawn_height.end_min, +0, +minetest.LIGHT_MAX+1, +30, +3000, +12, +mobs_mc.spawn_height.end_min, mobs_mc.spawn_height.end_max) -- Overworld spawn mobs:spawn_specific( -"mobs_mc:enderman", -"overworld", +"mobs_mc:enderman", +"overworld", "ground", { "Mesa", @@ -721,28 +722,28 @@ mobs:spawn_specific( "ExtremeHillsM_underground", "JungleEdgeM_underground", }, -0, -7, -30, -19000, -2, -mobs_mc.spawn_height.overworld_min, +0, +7, +30, +19000, +2, +mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- Nether spawn (rare) mobs:spawn_specific( -"mobs_mc:enderman", -"nether", +"mobs_mc:enderman", +"nether", "ground", { "Nether" }, -0, -7, -30, -27500, -4, -mobs_mc.spawn_height.nether_min, +0, +7, +30, +27500, +4, +mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max) -- spawn eggs diff --git a/mods/ENTITIES/mobs_mc/endermite.lua b/mods/ENTITIES/mobs_mc/endermite.lua index da3922a10..2bffa8304 100644 --- a/mods/ENTITIES/mobs_mc/endermite.lua +++ b/mods/ENTITIES/mobs_mc/endermite.lua @@ -5,6 +5,7 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:endermite", { + description = S("Endermite"), type = "monster", spawn_class = "hostile", passive = false, diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index 48d71b45e..1d7179162 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -11,6 +11,7 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:ghast", { + description = S("Ghast"), type = "monster", spawn_class = "hostile", pathfinding = 1, diff --git a/mods/ENTITIES/mobs_mc/guardian.lua b/mods/ENTITIES/mobs_mc/guardian.lua index 13c857ea3..06a2ba2e2 100644 --- a/mods/ENTITIES/mobs_mc/guardian.lua +++ b/mods/ENTITIES/mobs_mc/guardian.lua @@ -5,6 +5,7 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:guardian", { + description = S("Guardian"), type = "monster", spawn_class = "hostile", hp_min = 30, diff --git a/mods/ENTITIES/mobs_mc/guardian_elder.lua b/mods/ENTITIES/mobs_mc/guardian_elder.lua index 089f6e38f..5b8150dd4 100644 --- a/mods/ENTITIES/mobs_mc/guardian_elder.lua +++ b/mods/ENTITIES/mobs_mc/guardian_elder.lua @@ -7,6 +7,7 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:guardian_elder", { + description = S("Elder Guardian"), type = "monster", spawn_class = "hostile", hp_min = 80, diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 938a6b6ac..ac631f205 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -83,6 +83,7 @@ end -- Horse local horse = { + description = S("Horse"), type = "animal", spawn_class = "passive", visual = "mesh", @@ -418,6 +419,7 @@ mobs:register_mob("mobs_mc:horse", horse) -- Skeleton horse local skeleton_horse = table.copy(horse) +skeleton_horse.description = S("Skeleton Horse") skeleton_horse.breath_max = -1 skeleton_horse.armor = {undead = 100, fleshy = 100} skeleton_horse.textures = {{"blank.png", "mobs_mc_horse_skeleton.png", "blank.png"}} @@ -440,6 +442,7 @@ mobs:register_mob("mobs_mc:skeleton_horse", skeleton_horse) -- Zombie horse local zombie_horse = table.copy(horse) +zombie_horse.description = S("Zombie Horse") zombie_horse.breath_max = -1 zombie_horse.armor = {undead = 100, fleshy = 100} zombie_horse.textures = {{"blank.png", "mobs_mc_horse_zombie.png", "blank.png"}} @@ -464,6 +467,7 @@ mobs:register_mob("mobs_mc:zombie_horse", zombie_horse) -- Donkey local d = 0.86 -- donkey scale local donkey = table.copy(horse) +donkey.description = S("Donkey") donkey.textures = {{"blank.png", "mobs_mc_donkey.png", "blank.png"}} donkey.animation = { speed_normal = 25, @@ -494,6 +498,7 @@ mobs:register_mob("mobs_mc:donkey", donkey) -- Mule local m = 0.94 local mule = table.copy(donkey) +mule.description = S("Mule") mule.textures = {{"blank.png", "mobs_mc_mule.png", "blank.png"}} mule.visual_size = { x=horse.visual_size.x*m, y=horse.visual_size.y*m } mule.sounds = table.copy(donkey.sounds) @@ -532,18 +537,18 @@ mobs:spawn_specific( "ExtremeHillsM", "BirchForestM", }, -0, -minetest.LIGHT_MAX+1, -30, -15000, -4, -mobs_mc.spawn_height.water+3, +0, +minetest.LIGHT_MAX+1, +30, +15000, +4, +mobs_mc.spawn_height.water+3, mobs_mc.spawn_height.overworld_max) mobs:spawn_specific( -"mobs_mc:donkey", -"overworld", +"mobs_mc:donkey", +"overworld", "ground", { "Mesa", @@ -553,12 +558,12 @@ mobs:spawn_specific( "MesaPlateauF_grasstop", "MesaBryce", }, -0, -minetest.LIGHT_MAX+1, -30, -15000, -4, -mobs_mc.spawn_height.water+3, +0, +minetest.LIGHT_MAX+1, +30, +15000, +4, +mobs_mc.spawn_height.water+3, mobs_mc.spawn_height.overworld_max) -- spawn eggs diff --git a/mods/ENTITIES/mobs_mc/iron_golem.lua b/mods/ENTITIES/mobs_mc/iron_golem.lua index 2ccee2d0a..0d3e74645 100644 --- a/mods/ENTITIES/mobs_mc/iron_golem.lua +++ b/mods/ENTITIES/mobs_mc/iron_golem.lua @@ -12,6 +12,7 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:iron_golem", { + description = S("Iron Golem"), type = "npc", spawn_class = "passive", passive = true, diff --git a/mods/ENTITIES/mobs_mc/llama.lua b/mods/ENTITIES/mobs_mc/llama.lua index 8ff82b502..655cddfb6 100644 --- a/mods/ENTITIES/mobs_mc/llama.lua +++ b/mods/ENTITIES/mobs_mc/llama.lua @@ -25,6 +25,7 @@ local carpets = { } mobs:register_mob("mobs_mc:llama", { + description = S("Llama"), type = "animal", spawn_class = "passive", hp_min = 15, @@ -229,12 +230,12 @@ mobs:spawn_specific( "MesaPlateauF_grasstop", "MesaBryce", }, -0, -minetest.LIGHT_MAX+1, -30, -15000, -5, -mobs_mc.spawn_height.water+15, +0, +minetest.LIGHT_MAX+1, +30, +15000, +5, +mobs_mc.spawn_height.water+15, mobs_mc.spawn_height.overworld_max) -- spawn eggs diff --git a/mods/ENTITIES/mobs_mc/ocelot.lua b/mods/ENTITIES/mobs_mc/ocelot.lua index f3c8c87ae..5a3f135a1 100644 --- a/mods/ENTITIES/mobs_mc/ocelot.lua +++ b/mods/ENTITIES/mobs_mc/ocelot.lua @@ -27,6 +27,7 @@ end -- Ocelot local ocelot = { + description = S("Ocelot"), type = "animal", spawn_class = "passive", can_despawn = true, @@ -102,6 +103,7 @@ mobs:register_mob("mobs_mc:ocelot", ocelot) -- Cat local cat = table.copy(ocelot) +cat.description = S("Cat") cat.textures = {{"mobs_mc_cat_black.png"}, {"mobs_mc_cat_red.png"}, {"mobs_mc_cat_siamese.png"}} cat.can_despawn = false cat.owner = "" @@ -154,8 +156,8 @@ 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 mobs:spawn_specific( -"mobs_mc:ocelot", -"overworld", +"mobs_mc:ocelot", +"overworld", "ground", { "Jungle", @@ -163,12 +165,12 @@ mobs:spawn_specific( "JungleM", "JungleEdge", }, -0, -minetest.LIGHT_MAX+1, -30, -15000, -5, -mobs_mc.spawn_height.water+15, +0, +minetest.LIGHT_MAX+1, +30, +15000, +5, +mobs_mc.spawn_height.water+15, mobs_mc.spawn_height.overworld_max) --[[ mobs:spawn({ @@ -183,7 +185,7 @@ mobs:spawn({ max_height = mobs_mc.spawn_height.overworld_max, on_spawn = function(self, pos) Note: Minecraft has a 1/3 spawn failure rate. - In this mod it is emulated by reducing the spawn rate accordingly (see above). + In this mod it is emulated by reducing the spawn rate accordingly (see above). -- 1/7 chance to spawn 2 ocelot kittens if pr:next(1,7) == 1 then diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mobs_mc/parrot.lua index 5efcb191b..c04ea77c6 100644 --- a/mods/ENTITIES/mobs_mc/parrot.lua +++ b/mods/ENTITIES/mobs_mc/parrot.lua @@ -12,6 +12,7 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:parrot", { + description = S("Parrot"), type = "npc", spawn_class = "passive", pathfinding = 1, @@ -93,7 +94,7 @@ mobs:register_mob("mobs_mc:parrot", { -- Parrots spawn rarely in jungles. TODO: Also check for jungle *biome* <- I'll get to this eventually -j4i mobs:spawn_specific( "mobs_mc:parrot", -"overworld", +"overworld", "ground", { "Jungle", @@ -101,12 +102,12 @@ mobs:spawn_specific( "JungleM", "JungleEdge", }, -0, -minetest.LIGHT_MAX+1, -7, -30000, -1, -mobs_mc.spawn_height.water+7, +0, +minetest.LIGHT_MAX+1, +7, +30000, +1, +mobs_mc.spawn_height.water+7, mobs_mc.spawn_height.overworld_max) -- spawn eggs diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index b7cdf1afe..b7d919cff 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -3,6 +3,7 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:pig", { + description = S("Pig"), type = "animal", spawn_class = "passive", runaway = true, @@ -183,8 +184,8 @@ mobs:register_mob("mobs_mc:pig", { }) mobs:spawn_specific( -"mobs_mc:pig", -"overworld", +"mobs_mc:pig", +"overworld", "ground", { "FlowerForest", @@ -204,12 +205,12 @@ mobs:spawn_specific( "ExtremeHillsM", "BirchForestM", }, -9, -minetest.LIGHT_MAX+1, -30, -15000, -8, -mobs_mc.spawn_height.overworld_min, +9, +minetest.LIGHT_MAX+1, +30, +15000, +8, +mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- spawn eggs diff --git a/mods/ENTITIES/mobs_mc/polar_bear.lua b/mods/ENTITIES/mobs_mc/polar_bear.lua index 5d2853f6d..98268961b 100644 --- a/mods/ENTITIES/mobs_mc/polar_bear.lua +++ b/mods/ENTITIES/mobs_mc/polar_bear.lua @@ -8,6 +8,7 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:polar_bear", { + description = S("Polar Bear"), type = "animal", spawn_class = "passive", runaway = false, @@ -37,7 +38,7 @@ mobs:register_mob("mobs_mc:polar_bear", { chance = 2, min = 0, max = 2, - looting = "common",}, + looting = "common",}, -- 1/4 to drop raw salmon {name = mobs_mc.items.salmon_raw, chance = 4, diff --git a/mods/ENTITIES/mobs_mc/rabbit.lua b/mods/ENTITIES/mobs_mc/rabbit.lua index 74bdffcd8..6b47fec70 100644 --- a/mods/ENTITIES/mobs_mc/rabbit.lua +++ b/mods/ENTITIES/mobs_mc/rabbit.lua @@ -3,6 +3,7 @@ local S = minetest.get_translator("mobs_mc") local rabbit = { + description = S("Rabbit"), type = "animal", spawn_class = "passive", passive = true, @@ -83,6 +84,7 @@ mobs:register_mob("mobs_mc:rabbit", rabbit) -- The killer bunny (Only with spawn egg) local killer_bunny = table.copy(rabbit) +killer_bunny.description = S("Killer Bunny") killer_bunny.type = "monster" killer_bunny.spawn_class = "hostile" killer_bunny.attack_type = "dogfight" @@ -110,8 +112,8 @@ mobs:register_mob("mobs_mc:killer_bunny", killer_bunny) -- Different skins depending on spawn location <- we'll get to this when the spawning algorithm is fleshed out mobs:spawn_specific( -"mobs_mc:rabbit", -"overworld", +"mobs_mc:rabbit", +"overworld", "ground", { "FlowerForest", @@ -131,12 +133,12 @@ mobs:spawn_specific( "ExtremeHillsM", "BirchForestM", }, -9, -minetest.LIGHT_MAX+1, -30, -15000, -8, -mobs_mc.spawn_height.overworld_min, +9, +minetest.LIGHT_MAX+1, +30, +15000, +8, +mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) --[[ diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index d82df8cf9..9ddc0adee 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -56,6 +56,7 @@ local gotten_texture = { "blank.png", "mobs_mc_sheep.png" } --mcsheep mobs:register_mob("mobs_mc:sheep", { + description = S("Sheep"), type = "animal", spawn_class = "passive", hp_min = 8, @@ -325,12 +326,12 @@ mobs:spawn_specific( "ExtremeHillsM", "BirchForestM", }, -0, -minetest.LIGHT_MAX+1, -30, -15000, -3, -mobs_mc.spawn_height.overworld_min, +0, +minetest.LIGHT_MAX+1, +30, +15000, +3, +mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- spawn eggs diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 8000d0937..0d5ad880a 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -10,8 +10,9 @@ local S = minetest.get_translator("mobs_mc") --################### -- animation 45-80 is transition between passive and attack stance - + mobs:register_mob("mobs_mc:shulker", { + description = S("Shulker"), type = "monster", spawn_class = "hostile", attack_type = "shoot", @@ -82,16 +83,16 @@ mobs:register_arrow("mobs_mc:shulkerbullet", { mobs:register_egg("mobs_mc:shulker", S("Shulker"), "mobs_mc_spawn_icon_shulker.png", 0) mobs:spawn_specific( -"mobs_mc:shulker", -"end", +"mobs_mc:shulker", +"end", "ground", { "End" }, -0, -minetest.LIGHT_MAX+1, -30, -5000, -2, -mobs_mc.spawn_height.end_min, +0, +minetest.LIGHT_MAX+1, +30, +5000, +2, +mobs_mc.spawn_height.end_min, mobs_mc.spawn_height.end_max) diff --git a/mods/ENTITIES/mobs_mc/silverfish.lua b/mods/ENTITIES/mobs_mc/silverfish.lua index 433211503..5af3c8aa0 100644 --- a/mods/ENTITIES/mobs_mc/silverfish.lua +++ b/mods/ENTITIES/mobs_mc/silverfish.lua @@ -5,6 +5,7 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:silverfish", { + description = S("Silverfish"), type = "monster", spawn_class = "hostile", passive = false, diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index 05b829bcd..61e1c6eb2 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -13,6 +13,7 @@ local mod_bows = minetest.get_modpath("mcl_bows") ~= nil local skeleton = { + description = S("Skeleton"), type = "monster", spawn_class = "hostile", hp_min = 20, @@ -109,6 +110,7 @@ mobs:register_mob("mobs_mc:skeleton", skeleton) --################### local stray = table.copy(skeleton) +stray.description = S("Stray") stray.mesh = "mobs_mc_skeleton.b3d" stray.textures = { { diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mobs_mc/skeleton_wither.lua index c089850f4..1c0bdbea1 100644 --- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua +++ b/mods/ENTITIES/mobs_mc/skeleton_wither.lua @@ -10,6 +10,7 @@ local S = minetest.get_translator("mobs_mc") --################### mobs:register_mob("mobs_mc:witherskeleton", { + description = S("Wither Skeleton"), type = "monster", spawn_class = "hostile", hp_min = 20, diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 6c8000a50..28621ee6f 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -56,6 +56,7 @@ end -- Slime local slime_big = { + description = S("Slime"), type = "monster", spawn_class = "hostile", pathfinding = 1, @@ -158,8 +159,8 @@ local smin = mobs_mc.spawn_height.overworld_min local smax = mobs_mc.spawn_height.water - 23 mobs:spawn_specific( -"mobs_mc:slime_tiny", -"overworld", +"mobs_mc:slime_tiny", +"overworld", "ground", { "FlowerForest_underground", @@ -193,17 +194,17 @@ mobs:spawn_specific( "ExtremeHillsM_underground", "JungleEdgeM_underground", }, -0, -minetest.LIGHT_MAX+1, -30, -12000, -4, -smin, +0, +minetest.LIGHT_MAX+1, +30, +12000, +4, +smin, smax) mobs:spawn_specific( -"mobs_mc:slime_small", -"overworld", +"mobs_mc:slime_small", +"overworld", "ground", { "FlowerForest_underground", @@ -236,19 +237,19 @@ mobs:spawn_specific( "JungleM_underground", "ExtremeHillsM_underground", "JungleEdgeM_underground", -}, -0, -minetest.LIGHT_MAX+1, -30, -8500, -4, -smin, +}, +0, +minetest.LIGHT_MAX+1, +30, +8500, +4, +smin, smax) mobs:spawn_specific( -"mobs_mc:slime_big", -"overworld", -"ground", +"mobs_mc:slime_big", +"overworld", +"ground", { "FlowerForest_underground", "JungleEdge_underground", @@ -281,16 +282,17 @@ mobs:spawn_specific( "ExtremeHillsM_underground", "JungleEdgeM_underground", }, -0, -minetest.LIGHT_MAX+1, -30, -10000, -4, -smin, +0, +minetest.LIGHT_MAX+1, +30, +10000, +4, +smin, smax) -- Magma cube local magma_cube_big = { + description = S("Magma Cube"), type = "monster", spawn_class = "hostile", hp_min = 16, @@ -401,49 +403,49 @@ local mmin = mobs_mc.spawn_height.nether_min local mmax = mobs_mc.spawn_height.nether_max mobs:spawn_specific( -"mobs_mc:magma_cube_tiny", -"nether", +"mobs_mc:magma_cube_tiny", +"nether", "ground", { "Nether" }, -0, -minetest.LIGHT_MAX+1, -30, -15000, -4, -mmin, +0, +minetest.LIGHT_MAX+1, +30, +15000, +4, +mmin, mmax) mobs:spawn_specific( -"mobs_mc:magma_cube_small", -"nether", +"mobs_mc:magma_cube_small", +"nether", "ground", { "Nether" }, -0, -minetest.LIGHT_MAX+1, -30, -15500, -4, -mmin, +0, +minetest.LIGHT_MAX+1, +30, +15500, +4, +mmin, mmax) mobs:spawn_specific( -"mobs_mc:magma_cube_big", -"nether", +"mobs_mc:magma_cube_big", +"nether", "ground", { "Nether" -}, -0, -minetest.LIGHT_MAX+1, -30, -16000, -4, -mmin, +}, +0, +minetest.LIGHT_MAX+1, +30, +16000, +4, +mmin, mmax) --mobs:spawn_specific("mobs_mc:magma_cube_tiny", mobs_mc.spawn.nether_fortress, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11000, 4, mmin, mmax) diff --git a/mods/ENTITIES/mobs_mc/snowman.lua b/mods/ENTITIES/mobs_mc/snowman.lua index 1ee88b362..93f91c330 100644 --- a/mods/ENTITIES/mobs_mc/snowman.lua +++ b/mods/ENTITIES/mobs_mc/snowman.lua @@ -21,6 +21,7 @@ local gotten_texture = { } mobs:register_mob("mobs_mc:snowman", { + description = S("Snow Golem"), type = "npc", spawn_class = "passive", passive = true, diff --git a/mods/ENTITIES/mobs_mc/spider.lua b/mods/ENTITIES/mobs_mc/spider.lua index bb5e29eb1..c1cb5be4b 100644 --- a/mods/ENTITIES/mobs_mc/spider.lua +++ b/mods/ENTITIES/mobs_mc/spider.lua @@ -13,6 +13,7 @@ local S = minetest.get_translator("mobs_mc") -- Spider by AspireMint (fishyWET (CC-BY-SA 3.0 license for texture) local spider = { + description = S("Spider"), type = "monster", spawn_class = "hostile", passive = false, @@ -72,6 +73,7 @@ mobs:register_mob("mobs_mc:spider", spider) -- Cave spider local cave_spider = table.copy(spider) +cave_spider.description = S("Cave Spider") cave_spider.textures = { {"mobs_mc_cave_spider.png^(mobs_mc_spider_eyes.png^[makealpha:0,0,0)"} } -- TODO: Poison damage -- TODO: Revert damage to 2 @@ -88,8 +90,8 @@ mobs:register_mob("mobs_mc:cave_spider", cave_spider) mobs:spawn_specific( -"mobs_mc:spider", -"overworld", +"mobs_mc:spider", +"overworld", "ground", { "Mesa", @@ -232,12 +234,12 @@ mobs:spawn_specific( "ExtremeHillsM_underground", "JungleEdgeM_underground", }, -0, -7, -30, -17000, -2, -mobs_mc.spawn_height.overworld_min, +0, +7, +30, +17000, +2, +mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- spawn eggs diff --git a/mods/ENTITIES/mobs_mc/squid.lua b/mods/ENTITIES/mobs_mc/squid.lua index cf794ea5b..0c425bb51 100644 --- a/mods/ENTITIES/mobs_mc/squid.lua +++ b/mods/ENTITIES/mobs_mc/squid.lua @@ -7,6 +7,7 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:squid", { + description = S("Squid"), type = "animal", spawn_class = "water", can_despawn = true, diff --git a/mods/ENTITIES/mobs_mc/vex.lua b/mods/ENTITIES/mobs_mc/vex.lua index cccdebe7a..a72827d5d 100644 --- a/mods/ENTITIES/mobs_mc/vex.lua +++ b/mods/ENTITIES/mobs_mc/vex.lua @@ -10,6 +10,7 @@ local S = minetest.get_translator("mobs_mc") --################### mobs:register_mob("mobs_mc:vex", { + description = S("Vex"), type = "monster", spawn_class = "hostile", pathfinding = 1, diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index ab79edfec..db9cf3b19 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -927,6 +927,7 @@ end) --[=======[ MOB REGISTRATION AND SPAWNING ]=======] mobs:register_mob("mobs_mc:villager", { + description = S("Villager"), type = "npc", spawn_class = "passive", hp_min = 20, diff --git a/mods/ENTITIES/mobs_mc/villager_evoker.lua b/mods/ENTITIES/mobs_mc/villager_evoker.lua index abe0e9ca2..04c95b88f 100644 --- a/mods/ENTITIES/mobs_mc/villager_evoker.lua +++ b/mods/ENTITIES/mobs_mc/villager_evoker.lua @@ -12,6 +12,7 @@ local S = minetest.get_translator("mobs_mc") local pr = PseudoRandom(os.time()*666) mobs:register_mob("mobs_mc:evoker", { + description = S("Evoker"), type = "monster", spawn_class = "hostile", physical = true, diff --git a/mods/ENTITIES/mobs_mc/villager_illusioner.lua b/mods/ENTITIES/mobs_mc/villager_illusioner.lua index 0bbe2a5f6..496f08fc6 100644 --- a/mods/ENTITIES/mobs_mc/villager_illusioner.lua +++ b/mods/ENTITIES/mobs_mc/villager_illusioner.lua @@ -7,6 +7,7 @@ local S = minetest.get_translator("mobs_mc") local mod_bows = minetest.get_modpath("mcl_bows") ~= nil mobs:register_mob("mobs_mc:illusioner", { + description = S("Illusioner"), type = "monster", spawn_class = "hostile", attack_type = "shoot", diff --git a/mods/ENTITIES/mobs_mc/villager_vindicator.lua b/mods/ENTITIES/mobs_mc/villager_vindicator.lua index 56b295066..276f80011 100644 --- a/mods/ENTITIES/mobs_mc/villager_vindicator.lua +++ b/mods/ENTITIES/mobs_mc/villager_vindicator.lua @@ -11,6 +11,7 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:vindicator", { + description = S("Vindicator"), type = "monster", spawn_class = "hostile", physical = false, diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mobs_mc/villager_zombie.lua index b90823629..1948b693d 100644 --- a/mods/ENTITIES/mobs_mc/villager_zombie.lua +++ b/mods/ENTITIES/mobs_mc/villager_zombie.lua @@ -26,6 +26,7 @@ local professions = { } mobs:register_mob("mobs_mc:villager_zombie", { + description = S("Zombie Villager"), type = "monster", spawn_class = "hostile", hp_min = 20, diff --git a/mods/ENTITIES/mobs_mc/witch.lua b/mods/ENTITIES/mobs_mc/witch.lua index f9f9b8d1f..8ebe71fc0 100644 --- a/mods/ENTITIES/mobs_mc/witch.lua +++ b/mods/ENTITIES/mobs_mc/witch.lua @@ -13,6 +13,7 @@ local S = minetest.get_translator("mobs_mc") mobs:register_mob("mobs_mc:witch", { + description = S("Witch"), type = "monster", spawn_class = "hostile", hp_min = 26, diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 2d53cc547..72459a354 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -10,6 +10,7 @@ local S = minetest.get_translator("mobs_mc") --################### mobs:register_mob("mobs_mc:wither", { + description = S("Wither"), type = "monster", spawn_class = "hostile", hp_max = 300, diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua index b1c077d46..7f14ac6b0 100644 --- a/mods/ENTITIES/mobs_mc/wolf.lua +++ b/mods/ENTITIES/mobs_mc/wolf.lua @@ -19,6 +19,7 @@ end -- Wolf local wolf = { + description = S("Wolf"), type = "animal", spawn_class = "passive", can_despawn = true, @@ -138,7 +139,7 @@ dog.owner = "" -- TODO: Start sitting by default dog.order = "roam" dog.owner_loyal = true -dog.follow_velocity = 3.2 +dog.follow_velocity = 3.2 -- Automatically teleport dog to owner dog.do_custom = mobs_mc.make_owner_teleport_function(12) dog.follow = mobs_mc.follow.dog @@ -254,12 +255,12 @@ mobs:spawn_specific( "ExtremeHillsM", "BirchForestM", }, -0, -minetest.LIGHT_MAX+1, -30, -9000, -7, -mobs_mc.spawn_height.water+3, +0, +minetest.LIGHT_MAX+1, +30, +9000, +7, +mobs_mc.spawn_height.water+3, mobs_mc.spawn_height.overworld_max) mobs:register_egg("mobs_mc:wolf", S("Wolf"), "mobs_mc_spawn_icon_wolf.png", 0) diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index 1be47848b..4ae5796b3 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -46,6 +46,7 @@ table.insert(drops_zombie, { }) local zombie = { + description = S("Zombie"), type = "monster", spawn_class = "hostile", hp_min = 20, @@ -102,6 +103,7 @@ mobs:register_mob("mobs_mc:zombie", zombie) -- A smaller and more dangerous variant of the zombie local baby_zombie = table.copy(zombie) +baby_zombie.description = S("Baby Zombie") baby_zombie.collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.94, 0.25} baby_zombie.xp_min = 12 baby_zombie.xp_max = 12 @@ -115,6 +117,7 @@ mobs:register_mob("mobs_mc:baby_zombie", baby_zombie) -- Husk. -- Desert variant of the zombie local husk = table.copy(zombie) +husk.description = S("Husk") husk.textures = { { "mobs_mc_empty.png", -- armor @@ -132,6 +135,7 @@ mobs:register_mob("mobs_mc:husk", husk) -- Baby husk. -- A smaller and more dangerous variant of the husk local baby_husk = table.copy(husk) +baby_husk.description = S("Baby Husk") baby_husk.collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.94, 0.25} baby_husk.xp_min = 12 baby_husk.xp_max = 12 diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mobs_mc/zombiepig.lua index ebd8ce485..1ea4197c1 100644 --- a/mods/ENTITIES/mobs_mc/zombiepig.lua +++ b/mods/ENTITIES/mobs_mc/zombiepig.lua @@ -11,6 +11,7 @@ local S = minetest.get_translator("mobs_mc") local pigman = { + description = S("Zombie Pigman"), -- type="animal", passive=false: This combination is needed for a neutral mob which becomes hostile, if attacked type = "animal", passive = false, @@ -94,6 +95,7 @@ mobs:register_mob("mobs_mc:pigman", pigman) -- A smaller and more dangerous variant of the pigman local baby_pigman = table.copy(pigman) +baby_pigman.description = S("Baby Zombie Pigman") baby_pigman.collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.94, 0.25} baby_pigman.xp_min = 13 baby_pigman.xp_max = 13 @@ -112,33 +114,33 @@ mobs:register_mob("mobs_mc:baby_pigman", baby_pigman) -- Regular spawning in the Nether mobs:spawn_specific( -"mobs_mc:pigman", -"nether", +"mobs_mc:pigman", +"nether", "ground", { "Nether" }, -0, +0, minetest.LIGHT_MAX+1, -30, -6000, -3, -mobs_mc.spawn_height.nether_min, +30, +6000, +3, +mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max) -- Baby zombie is 20 times less likely than regular zombies mobs:spawn_specific( -"mobs_mc:baby_pigman", -"nether", +"mobs_mc:baby_pigman", +"nether", "ground", { "Nether" -}, -0, -minetest.LIGHT_MAX+1, -30, -100000, -4, -mobs_mc.spawn_height.nether_min, +}, +0, +minetest.LIGHT_MAX+1, +30, +100000, +4, +mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max) -- Spawning in Nether portals in the Overworld From 97e69e04aacd6a1f93e585d7ff20be6babed435a Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 25 Apr 2021 17:49:27 +0200 Subject: [PATCH 090/136] Implement assist death messages --- mods/HUD/mcl_death_messages/init.lua | 105 +++++++++++---------------- 1 file changed, 43 insertions(+), 62 deletions(-) diff --git a/mods/HUD/mcl_death_messages/init.lua b/mods/HUD/mcl_death_messages/init.lua index 874af7754..9087c41e9 100644 --- a/mods/HUD/mcl_death_messages/init.lua +++ b/mods/HUD/mcl_death_messages/init.lua @@ -1,56 +1,57 @@ local S = minetest.get_translator("mcl_death_messages") mcl_death_messages = { + assist = {}, messages = { in_fire = { _translator = S, plain = "@1 went up in flames", - escape = "@1 walked into fire whilst fighting @2", + assist = "@1 walked into fire whilst fighting @2", }, lightning_bolt = { _translator = S, plain = "@1 was struck by lightning", - escape = "@1 was struck by lightning whilst fighting @2", + assist = "@1 was struck by lightning whilst fighting @2", }, on_fire = { _translator = S, plain = "@1 burned to death", - escape = "@1 was burnt to a crisp whilst fighting @2", + assist = "@1 was burnt to a crisp whilst fighting @2", }, lava = { _translator = S, plain = "@1 tried to swim in lava", - escape = "@1 tried to swim in lava to escape @2" + assist = "@1 tried to swim in lava to escape @2" }, hot_floor = { _translator = S, plain = "@1 discovered the floor was lava", - escape = "@1 walked into danger zone due to @2", + assist = "@1 walked into danger zone due to @2", }, in_wall = { _translator = S, plain = "@1 suffocated in a wall", - escape = "@1 suffocated in a wall whilst fighting @2", + assist = "@1 suffocated in a wall whilst fighting @2", }, drown = { _translator = S, plain = "@1 drowned", - escape = "@1 drowned whilst trying to escape @2", + assist = "@1 drowned whilst trying to escape @2", }, starve = { _translator = S, plain = "@1 starved to death", - escape = "@1 starved to death whilst fighting @2", + assist = "@1 starved to death whilst fighting @2", }, cactus = { _translator = S, plain = "@1 was pricked to death", - escape = "@1 walked into a cactus whilst trying to escape @2", + assist = "@1 walked into a cactus whilst trying to escape @2", }, fall = { _translator = S, plain = "@1 hit the ground too hard", - escape = "@1 hit the ground too hard whilst trying to escape @2", + assist = "@1 hit the ground too hard whilst trying to escape @2", -- "@1 fell from a high place" -- for fall distance > 5 blocks -- "@1 fell while climbing" -- "@1 fell off some twisting vines" @@ -62,22 +63,22 @@ mcl_death_messages = { fly_into_wall = { _translator = S, plain = "@1 experienced kinetic energy", - escape = "@1 experienced kinetic energy whilst trying to escape @2", + assist = "@1 experienced kinetic energy whilst trying to escape @2", }, out_of_world = { _translator = S, plain = "@1 fell out of the world", - escape = "@1 didn't want to live in the same world as @2", + assist = "@1 didn't want to live in the same world as @2", }, generic = { _translator = S, plain = "@1 died", - escape = "@1 died because of @2", + assist = "@1 died because of @2", }, magic = { _translator = S, plain = "@1 was killed by magic", - escape = "@1 was killed by magic whilst trying to escape @2", + assist = "@1 was killed by magic whilst trying to escape @2", killer = "@1 was killed by @2 using magic", item = "@1 was killed by @2 using @3", }, @@ -104,7 +105,7 @@ mcl_death_messages = { falling_node = { _translator = S, plain = "@1 was squashed by a falling block", - escape = "@1 was squashed by a falling block whilst fighting @2", + assist = "@1 was squashed by a falling block whilst fighting @2", }, mob = { _translator = S, @@ -141,7 +142,7 @@ mcl_death_messages = { cramming = { _translator = S, plain = "@1 was squished too much", - escape = "@1 was squashed by @2", -- surprisingly "escape" is actually the correct subtype + assist = "@1 was squashed by @2", -- surprisingly "escape" is actually the correct subtype }, fireworks = { _translator = S, @@ -151,49 +152,6 @@ mcl_death_messages = { -- Missing snowballs: The Minecraft wiki mentions them but the MC source code does not. }, } ---[[ -local mobkills = { - ["mobs_mc:zombie"] = N("@1 was slain by Zombie."), - ["mobs_mc:baby_zombie"] = N("@1 was slain by Baby Zombie."), - ["mobs_mc:blaze"] = N("@1 was burnt to a crisp while fighting Blaze."), - ["mobs_mc:slime"] = N("@1 was slain by Slime."), - ["mobs_mc:witch"] = N("@1 was slain by Witch using magic."), - ["mobs_mc:magma_cube_tiny"] = N("@1 was slain by Magma Cube."), - ["mobs_mc:magma_cube_small"] = N("@1 was slain by Magma Cube."), - ["mobs_mc:magma_cube_big"] = N("@1 was slain by Magma Cube."), - ["mobs_mc:wolf"] = N("@1 was slain by Wolf."), - ["mobs_mc:cat"] = N("@1 was slain by Cat."), - ["mobs_mc:ocelot"] = N("@1 was slain by Ocelot."), - ["mobs_mc:enderdragon"] = N("@1 was slain by Enderdragon."), - ["mobs_mc:wither"] = N("@1 was slain by Wither."), - ["mobs_mc:enderman"] = N("@1 was slain by Enderman."), - ["mobs_mc:endermite"] = N("@1 was slain by Endermite."), - ["mobs_mc:ghast"] = N("@1 was fireballed by a Ghast."), - ["mobs_mc:guardian_elder"] = N("@1 was slain by Elder Guardian."), - ["mobs_mc:guardian"] = N("@1 was slain by Guardian."), - ["mobs_mc:iron_golem"] = N("@1 was slain by Iron Golem."), - ["mobs_mc:polar_bear"] = N("@1 was slain by Polar Bear."), - ["mobs_mc:killer_bunny"] = N("@1 was slain by Killer Bunny."), - ["mobs_mc:shulker"] = N("@1 was slain by Shulker."), - ["mobs_mc:silverfish"] = N("@1 was slain by Silverfish."), - ["mobs_mc:skeleton"] = N("@1 was shot by Skeleton."), - ["mobs_mc:stray"] = N("@1 was shot by Stray."), - ["mobs_mc:slime_tiny"] = N("@1 was slain by Slime."), - ["mobs_mc:slime_small"] = N("@1 was slain by Slime."), - ["mobs_mc:slime_big"] = N("@1 was slain by Slime."), - ["mobs_mc:spider"] = N("@1 was slain by Spider."), - ["mobs_mc:cave_spider"] = N("@1 was slain by Cave Spider."), - ["mobs_mc:vex"] = N("@1 was slain by Vex."), - ["mobs_mc:evoker"] = N("@1 was slain by Evoker."), - ["mobs_mc:illusioner"] = N("@1 was slain by Illusioner."), - ["mobs_mc:vindicator"] = N("@1 was slain by Vindicator."), - ["mobs_mc:villager_zombie"] = N("@1 was slain by Zombie Villager."), - ["mobs_mc:husk"] = N("@1 was slain by Husk."), - ["mobs_mc:baby_husk"] = N("@1 was slain by Baby Husk."), - ["mobs_mc:pigman"] = N("@1 was slain by Zombie Pigman."), - ["mobs_mc:baby_pigman"] = N("@1 was slain by Baby Zombie Pigman."), -} -]]-- local function get_item_killer_message(obj, messages, reason) if messages.item then @@ -217,8 +175,10 @@ local function get_killer_message(obj, messages, reason) return reason.source and (get_item_killer_message(obj, messages, reason) or get_plain_killer_message(obj, messages, reason)) end -local function get_escaped_message(obj, messages, reason) - return nil -- ToDo +local function get_assist_message(obj, messages, reason) + if messages.assist and mcl_death_messages.assist[obj] then + return messages._translator(messages.assist, mcl_util.get_object_name(obj), mcl_death_messages.assist[obj].name) + end end local function get_plain_message(obj, messages, reason) @@ -253,7 +213,7 @@ mcl_damage.register_on_death(function(obj, reason) local message = get_killer_message(obj, messages, reason) or - get_escaped_message(obj, messages, reason) or + get_assist_message(obj, messages, reason) or get_plain_message(obj, messages, reason) or get_fallback_message(obj, messages, reason) @@ -264,3 +224,24 @@ mcl_damage.register_on_death(function(obj, reason) end end end) + +mcl_damage.register_on_damage(function(obj, damage, reason) + if obj:get_hp() - damage > 0 then + if reason.source then + mcl_death_messages.assist[obj] = {name = mcl_util.get_object_name(reason.source), timeout = 5} + else + mcl_death_messages.assist[obj] = nil + end + end +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 + end + end +end) From 3e3f53efbdbc35c9d0f466593ac7926efcc26cff Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 25 Apr 2021 19:59:08 +0200 Subject: [PATCH 091/136] New attempt to fix #1392 --- mods/ENTITIES/mcl_mobs/api.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index f34312972..3f635ece0 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -1030,7 +1030,7 @@ local node_ok = function(pos, fallback) end local function get_light(pos, tod) - if math.abs(pos.x) < 31000 and math.abs(pos.y) < 31000 and math.abs(pos.z) < 31000 then + if minetest.get_node_or_nil(pos) then local lightfunc = minetest.get_natural_light or minetest.get_node_light return lightfunc(pos, tod) else From fede04eaa6ac596e9f1dc3e3af4b1dc968816e79 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 25 Apr 2021 20:20:26 +0200 Subject: [PATCH 092/136] Make armor listring work --- mods/ITEMS/mcl_armor/player.lua | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_armor/player.lua b/mods/ITEMS/mcl_armor/player.lua index e5471e7e1..9dba0773c 100644 --- a/mods/ITEMS/mcl_armor/player.lua +++ b/mods/ITEMS/mcl_armor/player.lua @@ -84,13 +84,15 @@ local function limit_put(player, inventory, index, stack, count) return 0 end - if mcl_armor.elements[element].index ~= index then + local element_index = mcl_armor.elements[element].index + + if index ~= 1 and index ~= element_index then return 0 end - local old_stack = inventory:get_stack("armor", index) + local old_stack = inventory:get_stack("armor", element_index) - if old_stack:is_empty() or old_stack:get_name() ~= stack:get_name() and count <= 1 then + if old_stack:is_empty() or index ~= 1 and old_stack:get_name() ~= stack:get_name() and count <= 1 then return count else return 0 @@ -125,17 +127,27 @@ minetest.register_allow_player_inventory_action(function(player, action, invento end end) +local function on_put(player, inventory, index, stack) + if index == 1 then + mcl_armor.equip(stack, player) + inventory:set_stack("armor", 1, nil) + else + mcl_armor.on_equip(stack, player) + end +end + minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) if is_armor_action(inventory_info) then if action == "put" then - mcl_armor.on_equip(inventory_info.stack, player) + on_put(player, inventory, inventory_info.index, inventory_info.stack) elseif action == "take" then mcl_armor.on_unequip(inventory_info.stack, player) else + local stack = inventory:get_stack(inventory_info.to_list, inventory_info.to_index) if inventory_info.to_list == "armor" then - mcl_armor.on_equip(inventory:get_stack(inventory_info.to_list, inventory_info.to_index), player) + on_put(player, inventory, inventory_info.to_index, stack) elseif inventory_info.from_list == "armor" then - mcl_armor.on_unequip(inventory:get_stack(inventory_info.to_list, inventory_info.to_index), player) + mcl_armor.on_unequip(stack, player) end end end From edc89898bbab670784b9be8ba1243a1a24baeb9d Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 25 Apr 2021 20:51:13 +0200 Subject: [PATCH 093/136] Integrate fire resistance --- mods/CORE/mcl_damage/init.lua | 54 +++++++++++++++------------- mods/ENTITIES/mcl_burning/api.lua | 18 ++-------- mods/ITEMS/mcl_potions/functions.lua | 33 +++-------------- 3 files changed, 37 insertions(+), 68 deletions(-) diff --git a/mods/CORE/mcl_damage/init.lua b/mods/CORE/mcl_damage/init.lua index 6b343c4c2..983b82b49 100644 --- a/mods/CORE/mcl_damage/init.lua +++ b/mods/CORE/mcl_damage/init.lua @@ -5,7 +5,7 @@ mcl_damage = { types = { in_fire = {is_fire = true}, lightning_bolt = {is_lightning = true}, - on_fire = {is_fire = true}, + on_fire = {is_fire = true, bypasses_armor = true}, lava = {is_fire = true}, hot_floor = {is_fire = true}, in_wall = {bypasses_armor = true}, @@ -93,37 +93,43 @@ function mcl_damage.finish_reason(mcl_reason) end function mcl_damage.from_mt(mt_reason) + if mt_reason._mcl_chached_reason then + return mt_reason._mcl_chached_reason + end + + local mcl_reason + if mt_reason._mcl_reason then - return mt_reason._mcl_reason - end + mcl_reason = mt_reason._mcl_reason + else + mcl_reason = {type = "generic"} - local mcl_reason = {type = "generic"} - - if mt_reason._mcl_type then - mcl_reason.type = mt_reason._mcl_type - elseif mt_reason.type == "fall" then - mcl_reason.type = "fall" - elseif mt_reason.type == "drown" then - mcl_reason.type = "drown" - elseif mt_reason.type == "punch" then - mcl_damage.from_punch(mcl_reason, mt_reason.object) - elseif mt_reason.type == "node_damage" and mt_reason.node then - if minetest.get_item_group(mt_reason.node, "fire") > 0 then - mcl_reason.type = "in_fire" + if mt_reason._mcl_type then + mcl_reason.type = mt_reason._mcl_type + elseif mt_reason.type == "fall" then + mcl_reason.type = "fall" + elseif mt_reason.type == "drown" then + mcl_reason.type = "drown" + elseif mt_reason.type == "punch" then + mcl_damage.from_punch(mcl_reason, mt_reason.object) + elseif mt_reason.type == "node_damage" and mt_reason.node then + if minetest.get_item_group(mt_reason.node, "fire") > 0 then + mcl_reason.type = "in_fire" + end + if minetest.get_item_group(mt_reason.node, "lava") > 0 then + mcl_reason.type = "lava" + end end - if minetest.get_item_group(mt_reason.node, "lava") > 0 then - mcl_reason.type = "lava" - end - end - for key, value in pairs(mt_reason) do - if key:find("_mcl_") == 1 then - mcl_reason[key:sub(6, #key)] = value + for key, value in pairs(mt_reason) do + if key:find("_mcl_") == 1 then + mcl_reason[key:sub(6, #key)] = value + end end end mcl_damage.finish_reason(mcl_reason) - mt_reason._mcl_reason = mcl_reason + mt_reason._mcl_cached_reason = mcl_reason return mcl_reason end diff --git a/mods/ENTITIES/mcl_burning/api.lua b/mods/ENTITIES/mcl_burning/api.lua index 0d299cc69..78814a2c7 100644 --- a/mods/ENTITIES/mcl_burning/api.lua +++ b/mods/ENTITIES/mcl_burning/api.lua @@ -137,22 +137,10 @@ function mcl_burning.tick(obj, dtime, storage) if storage.fire_damage_timer >= 1 then storage.fire_damage_timer = 0 - local hp = mcl_util.get_hp(obj) + local luaentity = obj:get_luaentity() - if hp > 0 then - local do_damage = true - - if obj:is_player() then - if mcl_potions.player_has_effect(obj, "fire_proof") then - do_damage = false - end - elseif obj:get_luaentity().fire_damage_resistant then - do_damage = false - end - - if do_damage then - mcl_util.deal_damage(obj, 1, {reason = "on_fire"}) - end + if not luaentity or not luaentity.fire_damage_resistant then + mcl_util.deal_damage(obj, 1, {type = "on_fire"}) end end end diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua index 9f0c88782..9a1e38d99 100644 --- a/mods/ITEMS/mcl_potions/functions.lua +++ b/mods/ITEMS/mcl_potions/functions.lua @@ -344,37 +344,12 @@ minetest.register_globalstep(function(dtime) end) - -local is_fire_node = { ["mcl_core:lava_flowing"]=true, - ["mcl_core:lava_source"]=true, - ["mcl_fire:eternal_fire"]=true, - ["mcl_fire:fire"]=true, - ["mcl_nether:magma"]=true, - ["mcl_nether:nether_lava_source"]=true, - ["mcl_nether:nether_lava_flowing"]=true, - ["mcl_nether:nether_lava_source"]=true -} - -- Prevent damage to player with Fire Resistance enabled -minetest.register_on_player_hpchange(function(player, hp_change, reason) - - if EF.fire_proof[player] and hp_change < 0 then - -- This is a bit forced, but it assumes damage is taken by fire and avoids it - -- also assumes any change in hp happens between calls to this function - -- it's worth noting that you don't take damage from players in this case... - local player_info = mcl_playerinfo[player:get_player_name()] - - if is_fire_node[player_info.node_head] or is_fire_node[player_info.node_feet] or is_fire_node[player_info.node_stand] then - return 0 - else - return hp_change - end - - else - return hp_change +mcl_damage.register_modifier(function(obj, damage, reason) + if EF.fire_proof[obj] and not reason.flags.bypasses_magic and reason.flags.is_fire then + return 0 end - -end, true) +end, -50) From 8a78b1f8ef486eb2569bff71bda36e6df128405b Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Sun, 25 Apr 2021 20:27:50 +0000 Subject: [PATCH 094/136] Update my name --- CREDITS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index bae665e7c..c6ca7d0fb 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -9,7 +9,7 @@ ## Maintainers * Fleckenstein * kay27 -* oilboi +* jordan4ibanez ## Developers * bzoss @@ -74,7 +74,7 @@ * Rochambeau * rubenwardy * stu -* oilboi +* jordan4ibanez * 4aiman * Kahrl * Krock From dada1e98156a0fb4d70bbfa41d6ec15ffea34296 Mon Sep 17 00:00:00 2001 From: NO11 Date: Sun, 25 Apr 2021 21:47:12 +0000 Subject: [PATCH 095/136] Add template for stripped wood translation --- mods/ITEMS/mcl_core/locale/template.txt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/mods/ITEMS/mcl_core/locale/template.txt b/mods/ITEMS/mcl_core/locale/template.txt index f988435a3..31320c1c7 100644 --- a/mods/ITEMS/mcl_core/locale/template.txt +++ b/mods/ITEMS/mcl_core/locale/template.txt @@ -202,12 +202,30 @@ Stained glass is a decorative and mostly transparent block which comes in variou Stick= Sticks are a very versatile crafting material; used in countless crafting recipes.= Stone= +Stripped Acacia Log= +Stripped Acacia Wood= +Stripped Birch Log= +Stripped Birch Wood= +Stripped Dark Oak Log= +Stripped Dark Oak Wood= +Stripped Jungle Log= +Stripped Jungle Wood= +Stripped Oak Log= +Stripped Oak Wood= +Stripped Spruce Log= +Stripped Spruce Wood= Stone Bricks= Sugar= Sugar Canes= Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well.= Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.= Sugar comes from sugar canes and is used to make sweet foods.= +The stripped trunk of an acacia tree.= +The stripped trunk of an birch tree.= +The stripped trunk of an dark oak tree.= +The stripped trunk of an jungle tree.= +The stripped trunk of an oak tree.= +The stripped trunk of an spruce tree.= The trunk of a birch tree.= The trunk of a dark oak tree.= The trunk of a jungle tree.= @@ -216,6 +234,7 @@ The trunk of an acacia.= The trunk of an oak tree.= This block consists of a couple of loose stones and can't support itself.= This is a decorative block surrounded by the bark of a tree trunk.= +This is a decorative block.= This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold.= This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.= This stone contains pure gold, a rare metal.= From aac9d6a105b93c83fc90b54a93ade0a4936a0eb9 Mon Sep 17 00:00:00 2001 From: epCode Date: Sun, 25 Apr 2021 15:49:15 -0700 Subject: [PATCH 096/136] impliment crash damage for elytra --- mods/PLAYER/mcl_playerplus/init.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 13d136ecf..ee2426713 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -4,6 +4,7 @@ mcl_playerplus = { elytra = {}, } +local player_velocity_old = {x=0, y=0, z=0} local get_connected_players = minetest.get_connected_players local dir_to_yaw = minetest.dir_to_yaw local get_item_group = minetest.get_item_group @@ -195,6 +196,12 @@ minetest.register_globalstep(function(dtime) and (fly_node == "air" or fly_node == "ignore") if elytra.active then + if player_velocity.x < (player_velocity_old.x - 10) or player_velocity.x > (player_velocity_old.x + 10) then + player:set_hp(player:get_hp() - (math.abs(player_velocity_old.x) * 0.2)) + end + if player_velocity.z < (player_velocity_old.z - 10) or player_velocity.z > (player_velocity_old.z + 10) then + player:set_hp(player:get_hp() - (math.abs(player_velocity_old.z) * 0.2)) + end mcl_player.player_set_animation(player, "fly") if player_velocity.y < -1.5 then player:add_velocity({x=0, y=0.17, z=0}) @@ -240,6 +247,7 @@ minetest.register_globalstep(function(dtime) playerphysics.remove_physics_factor(player, "gravity", "mcl_playerplus:elytra") end + player_velocity_old = player:get_velocity() or player:get_player_velocity() -- controls right and left arms pitch when shooting a bow if string.find(wielded:get_name(), "mcl_bows:bow") and control.RMB and not control.LMB and not control.up and not control.down and not control.left and not control.right then player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch+90,-30,pitch * -1 * .35)) From e5a44dcb7567eda9b08d8333c638310e7c671b69 Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 26 Apr 2021 07:45:26 +0000 Subject: [PATCH 097/136] Add template for fireworks translation --- mods/ITEMS/mcl_fireworks/locale/template.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/ITEMS/mcl_fireworks/locale/template.txt diff --git a/mods/ITEMS/mcl_fireworks/locale/template.txt b/mods/ITEMS/mcl_fireworks/locale/template.txt new file mode 100644 index 000000000..67365d790 --- /dev/null +++ b/mods/ITEMS/mcl_fireworks/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mcl_nether_gold +Nether Gold Ore= +Nether gold ore is an ore containing gold nuggets. It is commonly found around netherrack in the Nether.= \ No newline at end of file From 749f1a4a62a498a48e155923bf9dfade478797db Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 26 Apr 2021 07:50:25 +0000 Subject: [PATCH 098/136] Fix wrong template, sry --- mods/ITEMS/mcl_fireworks/locale/template.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_fireworks/locale/template.txt b/mods/ITEMS/mcl_fireworks/locale/template.txt index 67365d790..e66eb06a5 100644 --- a/mods/ITEMS/mcl_fireworks/locale/template.txt +++ b/mods/ITEMS/mcl_fireworks/locale/template.txt @@ -1,3 +1,3 @@ -# textdomain: mcl_nether_gold -Nether Gold Ore= -Nether gold ore is an ore containing gold nuggets. It is commonly found around netherrack in the Nether.= \ No newline at end of file +# textdomain: mcl_fireworks +Firework Rocket= +Flight Duration:= \ No newline at end of file From 4d2210c4e5205b3ebe1e08348f6a2cb447971519 Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 26 Apr 2021 08:03:20 +0000 Subject: [PATCH 099/136] Fix german translation mistake --- mods/ITEMS/mcl_core/locale/mcl_core.de.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index 57ef530a0..2d36525db 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -214,7 +214,7 @@ The trunk of a jungle tree.=Der Baumstamm eines Dschungelbaums. The trunk of a spruce tree.=Der Baumstamm einer Fichte. The trunk of an acacia.=Der Baumstamm einer Akazie. The trunk of an oak tree.=Der Baumstamm einer Eiche. -This block consists of a couple of loose stones and can't support itself.=Diser Block besteht aus ein paar losen Steinchen und kann sich nicht selbst tragen. +This block consists of a couple of loose stones and can't support itself.=Dieser Block besteht aus ein paar losen Steinchen und kann sich nicht selbst tragen. This is a decorative block surrounded by the bark of a tree trunk.=Dies ist ein dekorativer Block, der von der Rinde eines Baumstamms umgeben ist. This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold.=Ein ganzer Block aus Schnee. Schnee von dieser Dicke wird üblicherweise in Gebieten extremer Kälte gefunden. This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.=Dies ist ein Teil eines Kaktus, der für gewöhnlich in trockenen Gebieten wächst, vorallem Wüsten. Im Laufe der Zeit werden Kakteen auf bis zu 3 Blöcke hoch auf Sand oder rotem Sand wachsen. Ein Kaktus verletzt Lebewesen, die ihn berühren, er richtet jede halbe Sekunden 1 Schaden an. Wenn ein Kaktusblock bricht, werden alle Kaktusblöcke darüber auch abbrechen. From a2983e1fdabe450beb278cb6706f6ddc299c32d2 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 26 Apr 2021 10:17:07 +0200 Subject: [PATCH 100/136] Update boats translation --- mods/ENTITIES/mcl_boats/init.lua | 2 +- mods/ENTITIES/mcl_boats/locale/mcl_boats.de.tr | 3 ++- mods/ENTITIES/mcl_boats/locale/template.txt | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index c2ce94c00..5facec28a 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -394,7 +394,7 @@ for b=1, #boat_ids do if b == 1 then help = true longdesc = S("Boats are used to travel on the surface of water.") - usagehelp = S("Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Rightclick the boat again to leave it, punch the boat to make it drop as an item.") + usagehelp = S("Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Use [Sneak] to leave the boat, punch the boat to make it drop as an item.") helpname = S("Boat") end tt_help = S("Water vehicle") diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.de.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.de.tr index 95066b530..c1864a871 100644 --- a/mods/ENTITIES/mcl_boats/locale/mcl_boats.de.tr +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.de.tr @@ -6,6 +6,7 @@ Boats are used to travel on the surface of water.=Boote werden benutzt, um sich Dark Oak Boat=Schwarzeichenboot Jungle Boat=Dschungelboot Oak Boat=Eichenboot -Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Rightclick the boat again to leave it, punch the boat to make it drop as an item.=Rechtsklicken Sie auf eine Wasserquelle, um das Boot zu platzieren. Rechtsklicken Sie auf das Boot, um es zu betreten. Mit [Links] und [Rechts] lenken, mit [Vorwärts] und [Rückwärts] Geschwindigkeit regeln oder rückwärts fahren. Rechtsklicken Sie erneut auf das Boot, um es zu verlassen, schlagen Sie das Boot, um es als Gegenstand fallen zu lassen. +Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Use [Sneak] to leave the boat, punch the boat to make it drop as an item.=Rechtsklicken Sie auf eine Wasserquelle, um das Boot zu platzieren. Rechtsklicken Sie auf das Boot, um es zu betreten. Mit [Links] und [Rechts] lenken, mit [Vorwärts] und [Rückwärts] Geschwindigkeit regeln oder rückwärts fahren. Nutzen sie [Schleichen], um das Boot zu verlassen, schlagen Sie das Boot, um es als Gegenstand fallen zu lassen. Spruce Boat=Fichtenboot Water vehicle=Wasserfahrzeug +Sneak to dismount=Zum Aussteigen schleichen diff --git a/mods/ENTITIES/mcl_boats/locale/template.txt b/mods/ENTITIES/mcl_boats/locale/template.txt index 54f1fd646..ac52bc19f 100644 --- a/mods/ENTITIES/mcl_boats/locale/template.txt +++ b/mods/ENTITIES/mcl_boats/locale/template.txt @@ -6,6 +6,7 @@ Boats are used to travel on the surface of water.= Dark Oak Boat= Jungle Boat= Oak Boat= -Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Rightclick the boat again to leave it, punch the boat to make it drop as an item.= +Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Use [Sneak] to leave the boat, punch the boat to make it drop as an item.= Spruce Boat= Water vehicle= +Sneak to dismount= From 8df9fe76d8c8eefa8327da571c815b9b1cee8e7d Mon Sep 17 00:00:00 2001 From: NO11 Date: Mon, 26 Apr 2021 08:23:26 +0000 Subject: [PATCH 101/136] Add german translation for stripped wood --- mods/ITEMS/mcl_core/locale/mcl_core.de.tr | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index 2d36525db..8fbd79722 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -202,12 +202,30 @@ Stained glass is a decorative and mostly transparent block which comes in variou Stick=Stock Sticks are a very versatile crafting material; used in countless crafting recipes.=Stöcke sind ein vielseitiges Material, sie werden in zahllosen Fertigungsrezepten gebraucht. Stone=Stein +Stripped Acacia Log=Entrindeter Akazienstamm +Stripped Acacia Wood=Entrindetes Akazienholz +Stripped Birch Log=Entrindeter Birkenstamm +Stripped Birch Wood=Entrindetes Birkenholz +Stripped Dark Oak Log=Entrindeter Schwarzeichenstamm +Stripped Dark Oak Wood=Entrindetes Schwarzeichenholz +Stripped Jungle Log=Entrindeter Dschungelbaumstamm +Stripped Jungle Wood=Entrindetes Dschungelholz +Stripped Oak Log=Entrindeter Eichenstamm +Stripped Oak Wood=Entrindetes Eichenholz +Stripped Spruce Log=Entrindeter Fichtenstamm +Stripped Spruce Wood=Entrindetes Fichtenholz Stone Bricks=Steinziegel Sugar=Zucker Sugar Canes=Zuckerrohr Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well.=Zuckerrohr ist eine Pflanze, die in der Herstellung gebraucht wird. Zuckerrohr wird in der Nähe von Wasser bis zu 3 zusätzliche Blöcke wachsen lassen, wenn sie sich neben Wasser befinden und auf einem Grasblock, auf Erde, Sand, roten Sand, Podsol oder grobe Erde platziert wurden. Wird ein Zuckerrohr abgebrochen, werden alle verbundenen Zuckerrohrblöcke ebenfalls abbrechen. Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.=Zuckerrohr kann nur auf Zuckerrohr platziert werden und auf Blöcken, auf denen Zuckerrohr wachsen würde. Sugar comes from sugar canes and is used to make sweet foods.=Zucker kommt von Zuckerrohr und wird benutzt, um süße Lebensmittel zu machen. +The stripped trunk of an acacia tree.=Der entrindete Stamm einer Akazie. +The stripped trunk of an birch tree.=Der entrindete Stamm einer Birke. +The stripped trunk of an dark oak tree.=Der entrindete Stamm einer Schwarzeiche. +The stripped trunk of an jungle tree.=Der entrindete Stamm eines Dschungelbaums. +The stripped trunk of an oak tree.=Der entrindete Stamm einer Eiche. +The stripped trunk of an spruce tree.=Der entrindete Stamm einer Fichte. The trunk of a birch tree.=Der Baumstamm einer Birke. The trunk of a dark oak tree.=Der Baumstamm einer Schwarzeiche. The trunk of a jungle tree.=Der Baumstamm eines Dschungelbaums. @@ -216,6 +234,7 @@ The trunk of an acacia.=Der Baumstamm einer Akazie. The trunk of an oak tree.=Der Baumstamm einer Eiche. This block consists of a couple of loose stones and can't support itself.=Dieser Block besteht aus ein paar losen Steinchen und kann sich nicht selbst tragen. This is a decorative block surrounded by the bark of a tree trunk.=Dies ist ein dekorativer Block, der von der Rinde eines Baumstamms umgeben ist. +This is a decorative block.=Dies ist ein dekorativer Block. This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold.=Ein ganzer Block aus Schnee. Schnee von dieser Dicke wird üblicherweise in Gebieten extremer Kälte gefunden. This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.=Dies ist ein Teil eines Kaktus, der für gewöhnlich in trockenen Gebieten wächst, vorallem Wüsten. Im Laufe der Zeit werden Kakteen auf bis zu 3 Blöcke hoch auf Sand oder rotem Sand wachsen. Ein Kaktus verletzt Lebewesen, die ihn berühren, er richtet jede halbe Sekunden 1 Schaden an. Wenn ein Kaktusblock bricht, werden alle Kaktusblöcke darüber auch abbrechen. This stone contains pure gold, a rare metal.=Dieser Stein enthält pures Gold, ein seltenes Metall. From f6d34db76ec9145d81a107e91d41ec5b0ef0d748 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 26 Apr 2021 10:36:22 +0200 Subject: [PATCH 102/136] Update german Minecart translation --- mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr index 4d9b6c2ff..1d270ee6c 100644 --- a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr +++ b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.de.tr @@ -33,3 +33,4 @@ Activates minecarts when powered=Aktiviert Loren, wenn bestromt Emits redstone power when a minecart is detected=Gibt ein Redstonesignal aus, wenn eine Lore erfasst wird Vehicle for fast travel on rails=Fahrzeug zum schnellen Transport auf Schienen Can be ignited by tools or powered activator rail=Kann mit Werkzeugen oder bestromten Aktivierungsschienen angezündet werden +Sneak to dismount=Zum Aussteigen schleichen From a77a916cc2ffcccfa75c4a7295f5bd4e0fad1da3 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 26 Apr 2021 10:50:23 +0200 Subject: [PATCH 103/136] Update cauldron translations --- mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr | 2 +- mods/ITEMS/mcl_cauldrons/locale/template.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr index 72432b04c..93c63fabb 100644 --- a/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr +++ b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr @@ -1,7 +1,7 @@ # textdomain: mcl_cauldron Cauldron=Kessel Cauldrons are used to store water and slowly fill up under rain.=Kessel werden benutzt, um Wasser zu lagern, im Regen werden sie langsam aufgefüllt. -Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water.=Platzieren Sie einen Wassereinmer in den Kessel, um ihn mit Wasser zu füllen. Platzieren Sie einen leeren Eimer auf einen vollen Kessel, um das Wasser aufzusammeln. Platzieren Sie eine Wasserflasche in den Kessel, um ihn zu einem Drittel mit Wasser zu füllen. +Place a water bucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.=Platzieren Sie einen Wassereinmer in den Kessel, um ihn mit Wasser zu füllen. Platzieren Sie einen leeren Eimer auf einen vollen Kessel, um das Wasser aufzusammeln. Platzieren Sie eine Wasserflasche in den Kessel, um ihn zu einem Drittel mit Wasser zu füllen. Benutzen Sie ein bemaltes Banner auf den Kessel, um die oberste Schicht abzuwaschen. Cauldron (1/3 Water)=Kessel (1/3 Wasser) Cauldron (2/3 Water)=Kessel (2/3 Wasser) Cauldron (3/3 Water)=Kessel (3/3 Wasser) diff --git a/mods/ITEMS/mcl_cauldrons/locale/template.txt b/mods/ITEMS/mcl_cauldrons/locale/template.txt index b4385631a..5e18f3283 100644 --- a/mods/ITEMS/mcl_cauldrons/locale/template.txt +++ b/mods/ITEMS/mcl_cauldrons/locale/template.txt @@ -1,7 +1,7 @@ # textdomain: mcl_cauldron Cauldron= Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners.= -Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.= +Place a water bucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.= Cauldron (1/3 Water)= Cauldron (2/3 Water)= Cauldron (3/3 Water)= From fed4596cb4faf36b2340ff95b5829912a8c22d3e Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 26 Apr 2021 10:52:07 +0200 Subject: [PATCH 104/136] Update german cauldron translation fully --- mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr index 93c63fabb..fe1d9aa81 100644 --- a/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr +++ b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.de.tr @@ -1,6 +1,6 @@ # textdomain: mcl_cauldron Cauldron=Kessel -Cauldrons are used to store water and slowly fill up under rain.=Kessel werden benutzt, um Wasser zu lagern, im Regen werden sie langsam aufgefüllt. +Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners.=Kessel werden benutzt, um Wasser zu lagern, im Regen werden sie langsam aufgefüllt. Kessel können auch verwendet werden, um Banner abzuwaschen. Place a water bucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.=Platzieren Sie einen Wassereinmer in den Kessel, um ihn mit Wasser zu füllen. Platzieren Sie einen leeren Eimer auf einen vollen Kessel, um das Wasser aufzusammeln. Platzieren Sie eine Wasserflasche in den Kessel, um ihn zu einem Drittel mit Wasser zu füllen. Benutzen Sie ein bemaltes Banner auf den Kessel, um die oberste Schicht abzuwaschen. Cauldron (1/3 Water)=Kessel (1/3 Wasser) Cauldron (2/3 Water)=Kessel (2/3 Wasser) From 5df1df8e21e34342dd5028c582618cda62923d82 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 26 Apr 2021 10:52:50 +0200 Subject: [PATCH 105/136] Update cauldron code to use the corrected translation template string --- mods/ITEMS/mcl_cauldrons/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_cauldrons/init.lua b/mods/ITEMS/mcl_cauldrons/init.lua index f4356d27b..62c45170c 100644 --- a/mods/ITEMS/mcl_cauldrons/init.lua +++ b/mods/ITEMS/mcl_cauldrons/init.lua @@ -47,7 +47,7 @@ minetest.register_node("mcl_cauldrons:cauldron", { description = S("Cauldron"), _tt_help = S("Stores water"), _doc_items_longdesc = S("Cauldrons are used to store water and slowly fill up under rain."), - _doc_items_usagehelp = S("Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water."), + _doc_items_usagehelp = S("Place a water bucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water."), wield_image = "mcl_cauldrons_cauldron.png", inventory_image = "mcl_cauldrons_cauldron.png", use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, From 05be20fcb8b43cc27ad05d3089d6d82a567c777a Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 26 Apr 2021 11:00:53 +0200 Subject: [PATCH 106/136] Update mcl_enchanting translations --- .../locale/mcl_enchanting.fr.tr | 52 +++++++++---------- .../locale/mcl_enchanting.ru.tr | 6 +-- mods/ITEMS/mcl_enchanting/locale/template.txt | 4 +- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr index 582f0e59b..73a8f64b7 100644 --- a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr +++ b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr @@ -1,18 +1,18 @@ # textdomain: mcl_enchanting Aqua Affinity=Affinité aquatique -Increases underwater mining speed.=Augmente la vitesse de minage sous-marine. +Increases underwater mining speed.=Augmente la vitesse de minage sous-marine. Bane of Arthropods=Fléau des arthropodes -Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Augmente les dégâts et applique la lenteur IV aux mobs arthropodes (araignées, araignées des cavernes, lépismes argentés et endermites). +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Augmente les dégâts et applique la lenteur IV aux mobs arthropodes (araignées, araignées des cavernes, lépismes argentés et endermites). Blast Protection=Protection contre les explosions -Reduces explosion damage and knockback.=Réduit les dégâts d'explosion et de recul. +Reduces explosion damage and knockback.=Réduit les dégâts d'explosion et de recul. Channeling=Canalisation -Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.=Canalise un éclair vers une cible. Fonctionne uniquement pendant les orages et si la cible n'est pas obstruée par des blocs opaques. +Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.=Canalise un éclair vers une cible. Fonctionne uniquement pendant les orages et si la cible n'est pas obstruée par des blocs opaques. Curse of Binding=Malédiction du lien éterne Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.=L'objet ne peut pas être retiré des emplacements d'armure sauf en cas de mort, de rupture ou en mode créatif. Curse of Vanishing=Malédiction de disparition Item destroyed on death.=Objet détruit à la mort. Depth Strider=Agilité aquatique -Increases underwater movement speed.=Augmente la vitesse de déplacement sous l'eau. +Increases underwater movement speed.=Augmente la vitesse de déplacement sous l'eau. Efficiency=Efficacité Increases mining speed.=Augmente la vitesse de minage. Feather Falling=Chute amortie @@ -22,21 +22,21 @@ Sets target on fire.=Définit la cible en feu. Fire Protection=Protection contre le feu Reduces fire damage.=Reduit les dégats de feu. Flame=Flamme -Arrows set target on fire.=Les flèches mettent le feu à la cible. +Arrows set target on fire.=Les flèches mettent le feu à la cible. Fortune=Fortune Increases certain block drops.=Multiplie les items droppés Frost Walker=Semelles givrantes -Turns water beneath the player into frosted ice and prevents the damage from magma blocks.=Transforme l'eau sous le joueur en glace givrée et empêche les dommages causés par les blocs de magma. +Turns water beneath the player into frosted ice and prevents the damage from magma blocks.=Transforme l'eau sous le joueur en glace givrée et empêche les dommages causés par les blocs de magma. Impaling=Empalement -Trident deals additional damage to ocean mobs.=Trident inflige des dégâts supplémentaires aux mobs océaniques. +Trident deals additional damage to ocean mobs.=Trident inflige des dégâts supplémentaires aux mobs océaniques. Infinity=Infinité -Shooting consumes no regular arrows.=Le tir ne consomme pas de flèches standard. +Shooting consumes no regular arrows.=Le tir ne consomme pas de flèches standard. Knockback=Recul Increases knockback.=Augmente le recul. Looting=Butin -Increases mob loot.=Augmente le butin des mobs. +Increases mob loot.=Augmente le butin des mobs. Loyalty=Loyauté -Trident returns after being thrown. Higher levels reduce return time.=Trident revient après avoir été jeté. Des niveaux plus élevés réduisent le temps de retour. +Trident returns after being thrown. Higher levels reduce return time.=Trident revient après avoir été jeté. Des niveaux plus élevés réduisent le temps de retour. Luck of the Sea=Chance de la mer Increases rate of good loot (enchanting books, etc.)=Augmente le taux de bon butin (livres enchanteurs, etc.) Lure=Appât @@ -44,17 +44,17 @@ Decreases time until rod catches something.=Diminue le temps jusqu'à ce qu'un p Mending=Raccommodage Repair the item while gaining XP orbs.=Réparez l'objet tout en gagnant des points d'XP. Multishot=Tir multiple -Shoot 3 arrows at the cost of one.=Tirez sur 3 flèches au prix d'une. +Shoot 3 arrows at the cost of one.=Tirez sur 3 flèches au prix d'une. Piercing=Perforation -Arrows passes through multiple objects.=Les flèches traversent plusieurs objets. +Arrows passes through multiple objects.=Les flèches traversent plusieurs objets. Power=Puissance -Increases arrow damage.=Augmente les dégâts des flèches. +Increases arrow damage.=Augmente les dégâts des flèches. Projectile Protection=Protection contre les projectiles -Reduces projectile damage.=Réduit les dommages causés par les projectiles. +Reduces projectile damage.=Réduit les dommages causés par les projectiles. Protection=Protection -Reduces most types of damage by 4% for each level.=éduit la plupart des types de dégâts de 4% pour chaque niveau. +Reduces most types of damage by 4% for each level.=éduit la plupart des types de dégâts de 4% pour chaque niveau. Punch=Frappe -Increases arrow knockback.=Augmente le recul de la flèche. +Increases arrow knockback.=Augmente le recul de la flèche. Quick Charge=Charge rapide Decreases crossbow charging time.=Diminue le temps de chargement de l'arbalète. Respiration=Apnée @@ -66,18 +66,18 @@ Increases damage.=Augmente les dégâts. Silk Touch=Toucher de soie Mined blocks drop themselves.=Les blocs minés tombent d'eux-mêmes. Smite=Châtiment -Increases damage to undead mobs.=Augmente les dégâts infligés aux monstres morts-vivants. +Increases damage to undead mobs.=Augmente les dégâts infligés aux monstres morts-vivants. Soul Speed=Agilité des âmes -Increases walking speed on soul sand.=Augmente la vitesse de marche sur le sable de l'âme. +Increases walking speed on soul sand.=Augmente la vitesse de marche sur le sable de l'âme. Sweeping Edge=Affilage -Increases sweeping attack damage.=Augmente les dégâts de l'épée +Increases sweeping attack damage.=Augmente les dégâts de l'épée Thorns=Épines Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.=Reflète une partie des dégâts subis lors de la frappe, au prix d'une réduction de la durabilité à chaque déclenchement. Unbreaking=Solidité Increases item durability.=Augmente la durabilité des objets. Inventory=Inventaire -@1 × Lapis Lazuli=@1 × Lapis Lazuli -Enchantment levels: @1=Niveaux d'enchantement: @1 +@1 Lapis Lazuli=@1 Lapis Lazuli +@1 Enchantment levels=@1 Niveaux d'enchantement Level requirement: @1=Niveau requis: @1 Enchant an item=Enchanter un objet []= [] @@ -85,16 +85,16 @@ Usage: /enchant []=Usage: /enchant []=Usage: /forceenchant [] The target item is not enchantable.=L'objet cible n'est pas enchantable. '@1' is not a valid number.='@1' n'est pas un nombre valide. -Enchanted Book=Livre enchanté +Enchanted Book=Livre enchanté Enchanting Table=Table d'enchantement Enchant=Enchantement diff --git a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.ru.tr b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.ru.tr index 6ea2038be..64a9d89f8 100644 --- a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.ru.tr +++ b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.ru.tr @@ -2,7 +2,7 @@ Aqua Affinity=Родство с водой Increases underwater mining speed.=Увеличивает скорость добычи под водой. Bane of Arthropods=Бич членистоногих -Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Увеличивает урон и применяет Замедление IV к насекомым и членистоногим (паукам, пещерным паукам, чешуйницам и чешуйницам края). +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Увеличивает урон и применяет Замедление IV к насекомым и членистоногим (паукам, пещерным паукам, чешуйницам и чешуйницам края). Blast Protection=Взрывоустойчивость Reduces explosion damage and knockback.=Уменьшает урон и отдачу от взрывов. Channeling=Громовержец @@ -76,8 +76,8 @@ Reflects some of the damage taken when hit, at the cost of reducing durability w Unbreaking=Нерушимость Increases item durability.=Увеличивает прочность предмета. Inventory=Инвентарь -@1 × Lapis Lazuli=@1 × Ляпис-лазурь -Enchantment levels: @1=Уровень зачаровывания: @1 +@1 Lapis Lazuli=@1 Ляпис-лазурь +@1 Enchantment levels=@1 Уровень зачаровывания Level requirement: @1=Требуемый уровень: @1 Enchant an item=Зачаровать предмет []=<игрок> <зачарование> [<уровень>] diff --git a/mods/ITEMS/mcl_enchanting/locale/template.txt b/mods/ITEMS/mcl_enchanting/locale/template.txt index f186ef37b..094ba70db 100644 --- a/mods/ITEMS/mcl_enchanting/locale/template.txt +++ b/mods/ITEMS/mcl_enchanting/locale/template.txt @@ -76,8 +76,8 @@ Reflects some of the damage taken when hit, at the cost of reducing durability w Unbreaking= Increases item durability.= Inventory= -@1 × Lapis Lazuli= -Enchantment levels: @1= +@1 Lapis Lazuli= +@1 Enchantment levels= Level requirement: @1= Enchant an item= []= From 3b1d71382f142f65ea1a3b9c50669d0062597292 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 26 Apr 2021 11:01:52 +0200 Subject: [PATCH 107/136] Update es, fr and ru cauldron translations to use the new template --- mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.es.tr | 4 ++-- mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.fr.tr | 2 +- mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.ru.tr | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.es.tr b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.es.tr index 5f7f9fc31..9748e61b4 100644 --- a/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.es.tr +++ b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.es.tr @@ -1,10 +1,10 @@ # textdomain: mcl_cauldron Cauldron=Caldera Cauldrons are used to store water and slowly fill up under rain.=Los calderos se usan para almacenar agua y llenarse lentamente bajo la lluvia. -Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water.=Coloque un cubo de agua en el caldero para llenarlo con agua. Coloque un cubo vacío en un caldero lleno para recuperar el agua. Coloque una botella de agua en el caldero para llenar el caldero hasta un tercio con agua. Coloque una botella de vidrio en un caldero con agua para recuperar un tercio del agua. +Place a water bucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water.=Coloque un cubo de agua en el caldero para llenarlo con agua. Coloque un cubo vacío en un caldero lleno para recuperar el agua. Coloque una botella de agua en el caldero para llenar el caldero hasta un tercio con agua. Coloque una botella de vidrio en un caldero con agua para recuperar un tercio del agua. Cauldron (1/3 Water)=Caldera (1/3 de agua) Cauldron (2/3 Water)=Caldera (2/3 de agua) Cauldron (3/3 Water)=Caldera (3/3 de agua) Cauldron (1/3 River Water)=Caldera (1/3 de agua de río) Cauldron (2/3 River Water)=Caldera (2/3 de agua de río) -Cauldron (3/3 River Water)=Caldera (3/3 de agua de río) \ No newline at end of file +Cauldron (3/3 River Water)=Caldera (3/3 de agua de río) diff --git a/mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.fr.tr b/mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.fr.tr index 03b0e9be8..a241c5cb0 100644 --- a/mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.fr.tr +++ b/mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.fr.tr @@ -1,7 +1,7 @@ # textdomain: mcl_cauldron Cauldron=Chaudrons Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners.=Les chaudrons sont utilisés pour stocker l'eau et se remplissent lentement sous la pluie. Ils peuvent également être utilisés pour laver les bannières. -Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.=Placez une marmite d'eau dans le chaudron pour le remplir d'eau. Placez un seau vide sur un chaudron plein pour récupérer l'eau. Placez une bouteille d'eau dans le chaudron pour remplir le chaudron au tiers avec de l'eau. Placez une bouteille en verre dans un chaudron avec de l'eau pour récupérer un tiers de l'eau. Utilisez une bannière blasonnée sur un chaudron avec de l'eau pour laver sa couche supérieure. +Place a water bucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.=Placez une marmite d'eau dans le chaudron pour le remplir d'eau. Placez un seau vide sur un chaudron plein pour récupérer l'eau. Placez une bouteille d'eau dans le chaudron pour remplir le chaudron au tiers avec de l'eau. Placez une bouteille en verre dans un chaudron avec de l'eau pour récupérer un tiers de l'eau. Utilisez une bannière blasonnée sur un chaudron avec de l'eau pour laver sa couche supérieure. Cauldron (1/3 Water)=Chaudron (1/3 d'eau) Cauldron (2/3 Water)=Chaudron (2/3 d'eau) Cauldron (3/3 Water)=Chaudron (3/3 d'eau) diff --git a/mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.ru.tr b/mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.ru.tr index ff43a5775..6ecae1025 100644 --- a/mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.ru.tr +++ b/mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.ru.tr @@ -1,7 +1,7 @@ # textdomain: mcl_cauldron Cauldron=Котёл Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners.=Котлы используются для хранения воды и медленного наполнения под дождём. Они также могут использоваться для промывания флагов. -Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.=Попытайтесь поместить ведро воды в котёл, чтобы наполнить его водой. Попытка поместить пустое ведро приведёт к освобождению котла. Поместите в котёл бутылку воды, чтобы наполнить его на треть. +Place a water bucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.=Попытайтесь поместить ведро воды в котёл, чтобы наполнить его водой. Попытка поместить пустое ведро приведёт к освобождению котла. Поместите в котёл бутылку воды, чтобы наполнить его на треть. Cauldron (1/3 Water)=Котёл (1/3 воды) Cauldron (2/3 Water)=Котёл (2/3 воды) Cauldron (3/3 Water)=Котёл (3/3 воды) From b43f59332a4163eb81e704aaa75db76723fb030d Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 26 Apr 2021 11:03:53 +0200 Subject: [PATCH 108/136] Update mcl_enchanting translations to new template --- mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr | 2 +- mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.ru.tr | 2 +- mods/ITEMS/mcl_enchanting/locale/template.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr index 73a8f64b7..e1178e782 100644 --- a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr +++ b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.fr.tr @@ -77,7 +77,7 @@ Unbreaking=Solidité Increases item durability.=Augmente la durabilité des objets. Inventory=Inventaire @1 Lapis Lazuli=@1 Lapis Lazuli -@1 Enchantment levels=@1 Niveaux d'enchantement +@1 Enchantment Levels=@1 Niveaux d'enchantement Level requirement: @1=Niveau requis: @1 Enchant an item=Enchanter un objet []= [] diff --git a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.ru.tr b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.ru.tr index 64a9d89f8..6cd1e1db6 100644 --- a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.ru.tr +++ b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.ru.tr @@ -77,7 +77,7 @@ Unbreaking=Нерушимость Increases item durability.=Увеличивает прочность предмета. Inventory=Инвентарь @1 Lapis Lazuli=@1 Ляпис-лазурь -@1 Enchantment levels=@1 Уровень зачаровывания +@1 Enchantment Levels=@1 Уровень зачаровывания Level requirement: @1=Требуемый уровень: @1 Enchant an item=Зачаровать предмет []=<игрок> <зачарование> [<уровень>] diff --git a/mods/ITEMS/mcl_enchanting/locale/template.txt b/mods/ITEMS/mcl_enchanting/locale/template.txt index 094ba70db..08fa82097 100644 --- a/mods/ITEMS/mcl_enchanting/locale/template.txt +++ b/mods/ITEMS/mcl_enchanting/locale/template.txt @@ -77,7 +77,7 @@ Unbreaking= Increases item durability.= Inventory= @1 Lapis Lazuli= -@1 Enchantment levels= +@1 Enchantment Levels= Level requirement: @1= Enchant an item= []= From 6dc6fc8ec32741d844e33066038a0c62142f90fe Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 26 Apr 2021 11:05:27 +0200 Subject: [PATCH 109/136] Update mcl_flowerpots translations to new template --- mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr | 2 +- mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.es.tr | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr index 3031e38d8..a110d5ffc 100644 --- a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr +++ b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.de.tr @@ -1,6 +1,6 @@ # textdomain: mcl_flowerpots Dandelion Flower Pot=Blumentopf mit Löwenzahn -Poppy Floer Pot=Blumentopf mit Mohn +Poppy Flower Pot=Blumentopf mit Mohn Blue Orchid Flower Pot=Blumentopf mit blauer Orchidee Allium Flower Pot=Blumentopf mit Sternlauch Azure Bluet Flower Pot=Blumentopf mit Porzellansternchen diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.es.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.es.tr index b303194b5..fd12b1b4f 100644 --- a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.es.tr +++ b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.es.tr @@ -1,6 +1,6 @@ # textdomain: mcl_flowerpots Dandelion Flower Pot=Maceta con diente de león -Poppy Floer Pot=Maceta con amapola +Poppy Flower Pot=Maceta con amapola Blue Orchid Flower Pot=Maceta con orquídeas azules Allium Flower Pot=Maceta con puerro Azure Bluet Flower Pot=Maceta con flor azul celeste @@ -22,4 +22,4 @@ Fern Flower Pot=Maceta con helecho Cactus Flower Pot=Maceta con cactus Flower Pot=Maceta Flower pots are decorative blocks in which flowers and other small plants can be placed.=Las macetas son bloques decorativos en los que se pueden colocar flores y otras plantas pequeñas. -Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Simplemente coloque una planta en la maceta. Las macetas pueden contener flores pequeñas (no más de 1 bloque), árboles jóvenes, helechos, arbustos muertos, hongos y cactus. Haga clic derecho en una planta en maceta para recuperar la planta. \ No newline at end of file +Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Simplemente coloque una planta en la maceta. Las macetas pueden contener flores pequeñas (no más de 1 bloque), árboles jóvenes, helechos, arbustos muertos, hongos y cactus. Haga clic derecho en una planta en maceta para recuperar la planta. From 347cc7ee7c83f667e0e0f4993128688123fb05e3 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 26 Apr 2021 11:13:36 +0200 Subject: [PATCH 110/136] Update mcl_banner translations to new template --- mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr | 4 ++-- mods/ITEMS/mcl_banners/locale/mcl_banners.ru.tr | 2 +- mods/ITEMS/mcl_banners/locale/template.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr b/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr index ee8772728..cadf37c37 100644 --- a/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr +++ b/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr @@ -46,7 +46,7 @@ You can copy the pattern of a banner by placing two banners of the same color in @1 Per Bend Sinister=Division oblique (@1) @1 Flower Charge=Figure Fleur (@1) @1 Gradient=Dégradé (@1) -@1 Base Gradient=Dégradé de couleurs (@1) +@1 Base Gradient=Dégradé de couleurs (@1) @1 Per Fess Inverted=Division inverse (@1) @1 Per Fess=Division (@1) @1 Per Pale=Division (@1) @@ -73,5 +73,5 @@ You can copy the pattern of a banner by placing two banners of the same color in @1 Base Indented=Pied dentelé (@1)t @1 Chief Indented=Tête dentelée (@1) And one additional layer=Et une couche supplémentaire -And @1 additional layer(s)=Et @1 couche(s) supplémentaire(s) +And @1 additional layers=Et @1 couches supplémentaires Paintable decoration=Décoration à peindre diff --git a/mods/ITEMS/mcl_banners/locale/mcl_banners.ru.tr b/mods/ITEMS/mcl_banners/locale/mcl_banners.ru.tr index 01993ae2f..a6cee5a67 100644 --- a/mods/ITEMS/mcl_banners/locale/mcl_banners.ru.tr +++ b/mods/ITEMS/mcl_banners/locale/mcl_banners.ru.tr @@ -73,5 +73,5 @@ You can copy the pattern of a banner by placing two banners of the same color in @1 Base Indented=@1 Инвертированный основной @1 Chief Indented=@1 Инвертированный главный And one additional layer=И один индивидуальный слой -And @1 additional layer(s)=И @1 дополнительный(х) слой(я,ёв) +And @1 additional layers=И @1 дополнительныйх слойёв Paintable decoration=Художественное украшение diff --git a/mods/ITEMS/mcl_banners/locale/template.txt b/mods/ITEMS/mcl_banners/locale/template.txt index 944a1a7ac..cb8ec0b0c 100644 --- a/mods/ITEMS/mcl_banners/locale/template.txt +++ b/mods/ITEMS/mcl_banners/locale/template.txt @@ -73,5 +73,5 @@ You can copy the pattern of a banner by placing two banners of the same color in @1 Base Indented= @1 Chief Indented= And one additional layer= -And @1 additional layer(s)= +And @1 additional layers= Paintable decoration= From 0867d6e4063249d930dedb62d63ccf3fd4024656 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 26 Apr 2021 11:15:36 +0200 Subject: [PATCH 111/136] Update german mcl_banners translations --- mods/ITEMS/mcl_banners/locale/mcl_banners.de.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_banners/locale/mcl_banners.de.tr b/mods/ITEMS/mcl_banners/locale/mcl_banners.de.tr index 3bf65629b..d5077dc75 100644 --- a/mods/ITEMS/mcl_banners/locale/mcl_banners.de.tr +++ b/mods/ITEMS/mcl_banners/locale/mcl_banners.de.tr @@ -22,7 +22,7 @@ Magenta=magenta Orange Banner=Orange Banner Orange=orange Purple Banner=Violettes Banner -Purple=violett +Violet=violett Brown Banner=Braunes Banner Brown=braun Pink Banner=Rosa Banner From 9f015f2c581d2d7e7abc08e6d40f4e5bbe56639b Mon Sep 17 00:00:00 2001 From: epCode Date: Mon, 26 Apr 2021 17:45:28 -0700 Subject: [PATCH 112/136] Make the slime anims/texutres Much better --- .../ENTITIES/mobs_mc/models/mobs_mc_slime.b3d | Bin 4732 -> 6346 bytes .../mobs_mc/textures/mobs_mc_slime.png | Bin 2040 -> 2052 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_slime.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_slime.b3d index 18cc3d6294d8911689a88435d94eb4d5cf94adb8..b426ee23da764a0c2e45caafa5105f7781b743eb 100644 GIT binary patch literal 6346 zcmeI0U5Hgx6vwwVm6n-~Q(9T6sacuLXdkBDd-OVEjyiYj&Zv#1`3VMtscA%D-5{z5 zLjyx7AJT`2-h2rm><)tXPzDj?!-Ty=rYJrY_0qI{d#`=(IoEZ22!a9+{O7;cI&1B{ z_PT4GbC^P5PW!0|&JAJBoWS)6S?o5;32t+ z-R&LwWRX&LcQ3Zog>xFUTLk?)#<|6NH*c$1y_60JyG4htj-I7IjSRc4F7@{8zd76? z<>7*(7n&>0mp(~8zR)ZiFU&jFitKIN3pSUCoT#7J267VWW3X{A*nDi#|K5gt&9>3> z%dSUGt$rP1*&mB@8|!QXl3%c;axro~ShZ;`vK}^{OC@Xb`+8fb0e<0ZwR2FHP=i{2 zp;mH^R4g{1pH)*|zgk@y)~YVQkh9iV&k=Ig8c6LM=W_9jVHG$3?PSEOGm~jYzR8_9 zb1e6Z+Gc;yRJCn=^Ylslunlf`-}`M>8?kBI_d_%Mdf28O8J)NMto5)F8}}f#k*z)# zD`#wRJ+3oTDE(M_W9Hm5UW?)zqqiwTG3TbvA1cE0^+>FLUwt?VP*b|8DQ9 zjXFnL|3#O?n(jDodI5b9ZT!AzTdWHI|ajjr0h zD*ced58L3DP2Mlsh)vs;{9egNTT3y?H}bRABR1|4V=Y^Ktd%pi7|YpM&$3a2m~-?a z=V;?>jdHPKt(rEfLH!<9e%9HnJ*-@MOPxLKyolw3crSC^AW*ZrN#q*^O#)uu=*YJS zg*!6?D)sv|cG#tP&c!i`fM`A)$df)>Ge)sgQO+$E3?6?c#7$oC2E z6-*S|uR8J+!DPWC!2<$x?4X7R(jQR~?y`IUg_!1oHCqI&wjc~YwmtcjUTXp1;;90>+L67Rls|BkBy@EBWBd-*s^uEoIm}+8012CvBP(uU!I?aon zMuur(c!Dxbj7~$tG&4L=nPx_(v0<7To}@fkd5SX4&3&2}rnzAn9j3`)ni;0aVHzH$ z+2NVWG&?$t57YE8%?;D^FarS7{4h-p)BG@l05b$I%?>jJFarTI3@}X(GYl|;0W%cv zLS=>moq>QE4wxZ;84j31ff*8*VSpJDn1O*A7MP)c85Wqqff*W@;eZ($m;r(r9+)A4 z86KEHf*B&1VSyPUn1O;BCYYgt877#)f*C4!c}HK*9%**^In017b0=KVf7$sd6T`hQ zCt2TD&b=)6soj$bB^lf5sS;YVKf6B>;Gy6^7Fq2u|*A9PX`i8m9`j&Q{ zHGRWuXMK;hoi}~M{AYc~76(n=@Qld%<~Dz4`iAF7*0+EE8PhjBYqGuaF^*Do{w4IwyS-nZ+M1gecu|t z%=8V<*{tvOmF=c)cot`U^J~|czTtVD^=&jmytvj%v+>^!|38&l(<3oRY1HoWACE&a zf&8C^|9D*1$%Poq-o0Iw*N>e_*6i(K4SD93^CEj2_kzv)CF)m^IR9)U2AlXvEH)pT zd_Hp7yqeAVwd?)3AJ+@nmh;$%W&dDve(jWveY`CdE4KQa2VyQ2%|+J3=5wjqhK4HM zPxke;Py_GhkZb2C6HBeUjr{%`dc%nIe&pxt7uLfT>QY~W>>iFis8uz;bj}*9=kT?< zW{>PSG#B}zK1A|z@q6pf|DX7xZuEt=tLYznp$%|CfBk>I(5}B>ul*vp{)P=Tx&DR? Kb@;d5uzvxzrA2T6 literal 4732 zcma)=$#axd6vdyKC_)efRGfnY5{DST0f%(QkZ90^U^;*^D4;|^lq9%qsgiXpSh!Lw z{S(|-l`lKXDsf@C@{iDkR=E;A=MJxLC++vqRj2yi@Auxh_YLV(_wew}k+}^iU6oQA zp4#8&$GgO*=Vy=i4-9Na-mJGvM*yUM@!C5%GP(l}jT18`j~zNSKQ}vb^cZ0}^7RB} zrgZ72@w#jLkN(H_OdV627;TLGb)z~Rn3`_%tW$UPa5ePZ?u)gwbmseCE`L^RyRzM&8_TxfXbx?vYd@ecrf|S!gaE>#s{+)R*#Ce zE=>J5XCC~?tv-2E=2!75|FAz^zes6)TYcL+Amd{R!v8{;+oPRIXTc2Js-}m;#K}(f4qL7_p6!f+x~fdBQqkTT)`w{vx zPXFd$8d|+;;fqwP`}VB#)%W?PVrw@)U%J5YzXAOG_D>i8{8>3zonw?Q2v6sli@jft z`usY_=>1pz!*D7Njwz=%<{MZ4&Yb-z@9a;$P@C#%)&gg5R=+3n;7?}t$uG+MDqiIu z_D5>#{_uRXzp%fuckDsWN9$MdGXE<%pWx567h1n{zG3~s^nAEK&654$`jiL%W$V-P z4?NUwoloceRe!E8aL$)K*87LEuehJQAEo=3nm7xU{q4&==4Y>chLdxx@|>To9H$)h zbuPI)H;$aI%rQQ5`WTo05oDb>$3V)$eAaQs`Wz$j+RB&6oEJ7f_m~p7_;YR*uksg< zP@jIw>&v<^hVRDP>X-2{e|kC39$1^#Cl`5btxqoXo!0}0pX?8Ys5jrieGE9)$5-aL zw)&Hc+@Cy4{e{y@Wd5uX{W;&c*Fc`UzH|5Hd^{s>^UrgY3&WTpj8*Zu3;hkIbQpDn z$-6Q0Cm)Dho?{H(@tm*B3-~xMT0HxA;7jN&bJp?s=1(sE!i)=3e|+||xcg@hem0vw z=T~v5;cM&QFCKx@Z+ZQ~INy!S`eZJ9DB)%P^m3j(^!(cPU+S{9)^9ss@o>gIbbk_k z#hdSZZe#ci>uclmbzUehtKW7$Qpe^?o#0O|=UxLj`hVFT!~7jo*v;x(2ex=~~3yP#1I^#GLVJ=z3@sw8nDAH$ZEl9tdBzC1;E;@d;nW z(|Ty5<&1BJZh|&Jw^+{jHt1GpGjzM2bRYD9 z<%}PM`k-ylLzXk#oLO2}B84p9xK||1Ph&kiup;2fAdcktWFG72uG3X`B8SjNApmAu@a>i58%g{ck zVL9Ui(0*tdI%qlL*PvISSD@D|XZ#lQCiDh$$a2Q-KyO2bp(7A;#_vM>#pWpVp5=_+ phi0JT&BFRo9Qxac#bwSN&IGT}2 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 O0000 Date: Tue, 27 Apr 2021 20:56:53 +0200 Subject: [PATCH 113/136] Use fly_into_wall damage type for elytra damage --- mods/PLAYER/mcl_playerplus/init.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 08cecd615..9436ae94d 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -166,11 +166,11 @@ minetest.register_globalstep(function(dtime) and (fly_node == "air" or fly_node == "ignore") if elytra.active then - if player_velocity.x < (player_velocity_old.x - 10) or player_velocity.x > (player_velocity_old.x + 10) then - player:set_hp(player:get_hp() - (math.abs(player_velocity_old.x) * 0.2)) + if player_velocity.x < (player_velocity_old.x - 10) or player_velocity.x > (player_velocity_old.x + 10) and fly_node ~= "ignore" then + mcl_util.deal_damage(player, math.abs(player_velocity_old.x) * 0.2, {type = "fly_into_wall"}) end - if player_velocity.z < (player_velocity_old.z - 10) or player_velocity.z > (player_velocity_old.z + 10) then - player:set_hp(player:get_hp() - (math.abs(player_velocity_old.z) * 0.2)) + if player_velocity.z < (player_velocity_old.z - 10) or player_velocity.z > (player_velocity_old.z + 10) and fly_node ~= "ignore" then + mcl_util.deal_damage(player, math.abs(player_velocity_old.z) * 0.2, {type = "fly_into_wall"}) end mcl_player.player_set_animation(player, "fly") if player_velocity.y < -1.5 then From ae83e441499a5b6dbb9151c6fac1da104ab93ca8 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 27 Apr 2021 23:50:18 +0200 Subject: [PATCH 114/136] remove duplicated line --- mods/ITEMS/REDSTONE/mesecons_walllever/init.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/init.lua b/mods/ITEMS/REDSTONE/mesecons_walllever/init.lua index a0ecf354d..92c809785 100644 --- a/mods/ITEMS/REDSTONE/mesecons_walllever/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/init.lua @@ -37,7 +37,6 @@ minetest.register_node("mesecons_walllever:wall_lever_off", { wield_image = "jeija_wall_lever.png", paramtype = "light", paramtype2 = "facedir", - drawtype = "mesh", mesh = "jeija_wall_lever_off.obj", sunlight_propagates = true, walkable = false, From 61e4db6bcf8cb7ca86e252d7c5b6bc5f9329b198 Mon Sep 17 00:00:00 2001 From: epCode Date: Tue, 27 Apr 2021 19:57:22 -0700 Subject: [PATCH 115/136] Fix magma cubes and remove pathfinding from slimes --- mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 47 +++++++++------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 28621ee6f..0c5fe24ac 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -59,7 +59,6 @@ local slime_big = { description = S("Slime"), type = "monster", spawn_class = "hostile", - pathfinding = 1, group_attack = { "mobs_mc:slime_big", "mobs_mc:slime_small", "mobs_mc:slime_tiny" }, hp_min = 16, hp_max = 16, @@ -67,7 +66,7 @@ local slime_big = { xp_max = 4, collisionbox = {-1.02, -0.01, -1.02, 1.02, 2.03, 1.02}, visual_size = {x=12.5, y=12.5}, - textures = {{"mobs_mc_slime.png"}}, + textures = {{"mobs_mc_slime.png", "mobs_mc_slime.png"}}, visual = "mesh", mesh = "mobs_mc_slime.b3d", makes_footstep_sound = true, @@ -84,18 +83,15 @@ local slime_big = { drops = {}, -- TODO: Fix animations animation = { - speed_normal = 24, - speed_run = 48, - stand_start = 0, - stand_end = 23, - walk_start = 24, - walk_end = 47, - run_start = 48, - run_end = 62, - hurt_start = 64, - hurt_end = 86, - death_start = 88, - death_end = 118, + jump_speed = 17, + stand_speed = 17, + walk_speed = 17, + jump_start = 1, + jump_end = 20, + stand_start = 1, + stand_end = 20, + walk_start = 1, + walk_end = 20, }, fall_damage = 0, view_range = 16, @@ -301,7 +297,7 @@ local magma_cube_big = { xp_max = 4, collisionbox = {-1.02, -0.01, -1.02, 1.02, 2.03, 1.02}, visual_size = {x=12.5, y=12.5}, - textures = {{ "mobs_mc_magmacube.png" }}, + textures = {{ "mobs_mc_magmacube.png", "mobs_mc_magmacube.png" }}, visual = "mesh", mesh = "mobs_mc_magmacube.b3d", makes_footstep_sound = true, @@ -324,18 +320,15 @@ local magma_cube_big = { }, -- TODO: Fix animations animation = { - speed_normal = 24, - speed_run = 48, - stand_start = 0, - stand_end = 23, - walk_start = 24, - walk_end = 47, - run_start = 48, - run_end = 62, - hurt_start = 64, - hurt_end = 86, - death_start = 88, - death_end = 118, + jump_speed = 20, + stand_speed = 20, + walk_speed = 20, + jump_start = 1, + jump_end = 40, + stand_start = 1, + stand_end = 1, + walk_start = 1, + walk_end = 40, }, water_damage = 0, lava_damage = 0, From 61c6d6e2764ad154194896fd4e6337c05f792b9a Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 28 Apr 2021 12:00:44 +0200 Subject: [PATCH 116/136] Add per element (un)equip callbacks --- mods/ITEMS/mcl_armor/api.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua index 4d6686807..b1645ae3e 100644 --- a/mods/ITEMS/mcl_armor/api.lua +++ b/mods/ITEMS/mcl_armor/api.lua @@ -90,6 +90,8 @@ function mcl_armor.register_set(def) local S = minetest.get_translator(modname) local descriptions = def.descriptions or {} local groups = def.groups or {} + local on_equip_callbacks = def.on_equip_callbacks or {} + local on_unequip_callbacks = def.on_unequip_callbacks or {} for name, element in pairs(mcl_armor.elements) do local itemname = element.name .. "_" .. def.name local itemstring = modname .. ":" .. itemname @@ -117,8 +119,8 @@ function mcl_armor.register_set(def) }, on_place = mcl_armor.equip_on_use, on_secondary_use = mcl_armor.equip_on_use, - _on_equip = def.on_equip, - _on_unequip = def.on_unequip, + _on_equip = on_equip_callbacks[name] or def.on_equip, + _on_unequip = on_unequip_callbacks[name] or def.on_unequip, _mcl_armor_element = name, _mcl_armor_texture = modname .. "_" .. itemname .. ".png", _mcl_armor_preview = modname .. "_" .. itemname .. "_preview.png", From 13a0fa231459631aab137457b81c0f2aa5861bf7 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 28 Apr 2021 12:16:01 +0200 Subject: [PATCH 117/136] Implement #1665 --- mods/ITEMS/mcl_armor/api.lua | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua index b1645ae3e..2e5ba1112 100644 --- a/mods/ITEMS/mcl_armor/api.lua +++ b/mods/ITEMS/mcl_armor/api.lua @@ -92,6 +92,10 @@ function mcl_armor.register_set(def) local groups = def.groups or {} local on_equip_callbacks = def.on_equip_callbacks or {} local on_unequip_callbacks = def.on_unequip_callbacks or {} + local textures = def.textures or {} + local previews = def.previews or {} + local durabilities = def.durabilities or {} + for name, element in pairs(mcl_armor.elements) do local itemname = element.name .. "_" .. def.name local itemstring = modname .. ":" .. itemname @@ -103,7 +107,7 @@ function mcl_armor.register_set(def) groups.combat_armor = 1 groups.mcl_armor_points = def.points[name] groups.mcl_armor_toughness = def.toughness - groups.mcl_armor_uses = math.floor(def.durability * element.durability) + 1 + groups.mcl_armor_uses = (durabilities[name] or math.floor(def.durability * element.durability)) + 1 groups.enchantability = def.enchantability minetest.register_tool(itemstring, { @@ -122,8 +126,8 @@ function mcl_armor.register_set(def) _on_equip = on_equip_callbacks[name] or def.on_equip, _on_unequip = on_unequip_callbacks[name] or def.on_unequip, _mcl_armor_element = name, - _mcl_armor_texture = modname .. "_" .. itemname .. ".png", - _mcl_armor_preview = modname .. "_" .. itemname .. "_preview.png", + _mcl_armor_texture = textures[name] or modname .. "_" .. itemname .. ".png", + _mcl_armor_preview = previews[name] or modname .. "_" .. itemname .. "_preview.png", }) if def.craft_material then From 7a00e8acf77f8daedc8b64378df2199ec03a18a6 Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 28 Apr 2021 14:32:40 +0000 Subject: [PATCH 118/136] New particle textures for sponge --- .../textures/mcl_particles_sponge1.png | Bin 0 -> 1174 bytes .../textures/mcl_particles_sponge2.png | Bin 0 -> 1149 bytes .../textures/mcl_particles_sponge3.png | Bin 0 -> 1128 bytes .../textures/mcl_particles_sponge4.png | Bin 0 -> 1150 bytes .../textures/mcl_particles_sponge5.png | Bin 0 -> 1170 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 mods/CORE/mcl_particles/textures/mcl_particles_sponge1.png create mode 100644 mods/CORE/mcl_particles/textures/mcl_particles_sponge2.png create mode 100644 mods/CORE/mcl_particles/textures/mcl_particles_sponge3.png create mode 100644 mods/CORE/mcl_particles/textures/mcl_particles_sponge4.png create mode 100644 mods/CORE/mcl_particles/textures/mcl_particles_sponge5.png diff --git a/mods/CORE/mcl_particles/textures/mcl_particles_sponge1.png b/mods/CORE/mcl_particles/textures/mcl_particles_sponge1.png new file mode 100644 index 0000000000000000000000000000000000000000..e8099a41a910f1895983574686a6a052c6033967 GIT binary patch literal 1174 zcmV;H1Zn$;P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3vrlH)22h5u_6vjimZ5X-?Bs_qW%^5@`SchX5` z(uqw4unf{cAJ9$h|NlDu!6PmU`H(E;7#$v;eU^fbxyw_wnw{V3`QrA@jh&7U0+XWE z%d5p{Z?Fr-%e2?&r@$Vr9OX7YEVm!ZbR;$d>=9=me44w{-~ZRq~h@mg(r*JMBXSnxrYKLv2H$ zjvs45>rsosG2VIW2h?8kMJZ?rxrBb+^ZNXGrkr-^6Zs9&qsKqkuSnCD(EWpcBNUJJ zp`F8*ovx8?+^!`q3c6&RG^iNln8`7Qfe81R z)UYLZFW;ZRRY5RpX*MjdxMg?%{w46&=F$zcVqidfIl!FO=>RE$f&ei%DxO_r4IJ4e z5lYNRqybQYbWtx0uy6>nLZo=r2sk(eh>bakx1kc`V#Y-X5J4kp0-LM_u)Gi0Kgk>R zPzf4*2qA_PEaXt4#&N=8OmW<(C28_0q?l5&lv5#7^A;>xGP7(YOIF;tA>%w|%Q=^V zpaq@_W)}=7WsyY}zl0?&X|W|Qr3zK8zJ?lWs#bF?tE{@>9ItUrtF3u0jT^R7^DVU4 zQnQv@>DX#ryYHdLp1So+y&Tjg*1PfxYCNgQMrsU92Q^qz+FkItPQqXYV&WOV(;&b~ zB7>PT_Fe|L!3=+hS~`eBMtA(lyluPT{x5|7YJj+z-TN&){-CYBDrG96kEP6( zK9({kk~>Kf{YuIcX_QZrMDIztmqzz#duuBQy(!@?OZ2If-4i`p)H`XThr8 zo0fjq@xS&+pCJ3Eqh}I-l1g%tB>Gs&bU@`KN%XOllg`?a6na6*OA<*=l0?6`;GboS z+)0w?V<~eYxsxQ(DcgEpBd18(?j!tTlj$#nTI!kzyWHCV000JJOGiWizW`(aO0om* z$N&HU32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Rg1RMz&F`ym%+W-In8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b09#2!K~y-)WBmB;(SHU6VB{B)V;}`E zF;EC7Hh>Y$3vj?MB*#dM0W7#AKE8VdGYG3V^}K*)IzjJH-vwwU{wL&8^e|z;qY0P6 ojDsv8;fV#tA(9txC1GL#03<*mBJyKFr2qf`07*qoM6N<$f_Rz|!2kdN literal 0 HcmV?d00001 diff --git a/mods/CORE/mcl_particles/textures/mcl_particles_sponge2.png b/mods/CORE/mcl_particles/textures/mcl_particles_sponge2.png new file mode 100644 index 0000000000000000000000000000000000000000..0004ce4db521864ca990ae99a2abe1da0dae5258 GIT binary patch literal 1149 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 Qg8%>k07*qoM6N<$f;cw~MF0Q* literal 0 HcmV?d00001 diff --git a/mods/CORE/mcl_particles/textures/mcl_particles_sponge5.png b/mods/CORE/mcl_particles/textures/mcl_particles_sponge5.png new file mode 100644 index 0000000000000000000000000000000000000000..5278caff34222b7aadf4a25610dfff2e1c1ba03f GIT binary patch literal 1170 zcmV;D1a13?P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1YumfRo={MRXR1SB?b9L(}wZjj@rz}VA0nZ=W~ zc}7^4r9vgqP3_O`PQP%8Nr9Y?8d3-bmrE{5#zM`0x0s;>(XcfmMu=O0+L=lS2 zNTh@Z=U~I=un=MxCu)v1y69twF=|XPlUjA^HE2}Tq&Z2lIB|VKKPF8n<&2;i zo-@AAFvxk6&2Db=dODM5uNhMdQwxW+~sIh8IH8*Z3rRJJ%p~a>x zwcJr^-FDY~4?TA6iF!U+TeSW&e!v08VfC4Fk}Lx}V}lxz8?S3Mk(uB7LRN4k{Y3!cc_0Av74vIFnP z00009a7bBm001r{001r{0eGc9b^rhX2XskIMF-^s90?m1Hz6xB0000PbVXQnLvL+u zWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbNSV=@dR5;6H{P^zCe+C3#V0_M}Ngxsg=;?$7O&%pt k4UvRID4qwu7brFW00eUtCx Date: Wed, 28 Apr 2021 14:37:16 +0000 Subject: [PATCH 119/136] Add #1488 (sponge drying in nether makes now particles) --- mods/ITEMS/mcl_sponges/init.lua | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/mods/ITEMS/mcl_sponges/init.lua b/mods/ITEMS/mcl_sponges/init.lua index 75a99b0f1..147db6cc5 100644 --- a/mods/ITEMS/mcl_sponges/init.lua +++ b/mods/ITEMS/mcl_sponges/init.lua @@ -114,6 +114,19 @@ function place_wet_sponge(itemstack, placer, pointed_thing) if mcl_worlds.pos_to_dimension(pointed_thing.above) == "nether" then minetest.item_place_node(ItemStack("mcl_sponges:sponge"), placer, pointed_thing) + local pos = pointed_thing.above + for n = 0, 25 do + minetest.add_particle({ + pos = {x = pos.x + math.random(-1, 1)*math.random()/2, y = pos.y + 0.6, z = pos.z + math.random(-1, 1)*math.random()/2}, + velocity = {x = 0, y = math.random(), z = 0}, + acceleration = {x=0, y=0, z=0}, + expirationtime = math.random(), + collisiondetection = false, + vertical = false, + size = math.random(2, 5), + texture = "mcl_particles_sponge"..math.random(1, 5)..".png", + }) + end if not minetest.is_creative_enabled(name) then itemstack:take_item() end From 3195df3864f65489c2e120c0a2aea9e29e750eaa Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 28 Apr 2021 17:53:40 +0000 Subject: [PATCH 120/136] remove object crosshair --- .../textures/object_crosshair.png | Bin 150 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mods/HUD/mcl_base_textures/textures/object_crosshair.png diff --git a/mods/HUD/mcl_base_textures/textures/object_crosshair.png b/mods/HUD/mcl_base_textures/textures/object_crosshair.png deleted file mode 100644 index e5a400e951b3fc543b6e2baf007c24f0949229cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^HXzIhBp8I+pWFvhOeH~n!3+##lh0ZJdH$X*jv*C{ z$r3>gt&NVrF-;(b vWgXi(?mWIbDLY~dZa;k2xLe@ivxS@t;avh+c8nGmKo)ws`njxgN@xNA{9!K; From 32c03dc27eb835fb60fdc2e396f6c3d5e5fc010d Mon Sep 17 00:00:00 2001 From: NO11 Date: Wed, 28 Apr 2021 17:55:03 +0000 Subject: [PATCH 121/136] new object overlay --- .../textures/object_crosshair.png | Bin 0 -> 144 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 mods/HUD/mcl_base_textures/textures/object_crosshair.png diff --git a/mods/HUD/mcl_base_textures/textures/object_crosshair.png b/mods/HUD/mcl_base_textures/textures/object_crosshair.png new file mode 100644 index 0000000000000000000000000000000000000000..8e94dcc6bef47196a2f5cd93226eec0e8a8c3a24 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw3=&b&bO2I}#X;^)4C~IxyaaOC0(?STf%O0X z|CipJe-|WO666=m;PC858jz#y>EamTas2JYjl2v7Jcl>@_`kf^@w<{*x$i7SEfvA; k^G7OwTYihYBfxAcmUfh3mZZ_ebf7i{Pgg&ebxsLQ0Dz7xGXMYp literal 0 HcmV?d00001 From a6ac6f5c766deb0f97e876af74fe213deb092f96 Mon Sep 17 00:00:00 2001 From: kay27 Date: Thu, 29 Apr 2021 04:11:33 +0400 Subject: [PATCH 122/136] Merge NEW MOBS by @jordan4ibanez from `mineclone5` branch commit cd472337985d6e885eef019185f0965d13148e7f Author: jordan4ibanez Date: Sun Apr 25 22:02:20 2021 -0400 Fix rabbit rotation commit 0f4628db09d68f69a997f98dcd462f29e7ecbe06 Author: jordan4ibanez Date: Sun Apr 25 20:48:42 2021 -0400 Bring mob spawning variable to the top of the spawning.lua file so it's easier to find commit ddb33acf0d85f29dddb8bdab7a3a7030f9f595be Author: jordan4ibanez Date: Sun Apr 25 20:46:45 2021 -0400 Add in unused head code elements commit e52aab45c07c22605993126c4a8ba39c8318d904 Author: jordan4ibanez Date: Sun Apr 25 20:23:46 2021 -0400 Implement no-op head operations for enderman commit ac852309388e1f9a7dec294440975c7dc89e498c Author: jordan4ibanez Date: Sun Apr 25 20:08:45 2021 -0400 Add in chicken head code with additional pitch modifier commit f57c4709ac74d1e2b0b683bebc706a1a3e59db73 Author: jordan4ibanez Date: Sun Apr 25 19:54:11 2021 -0400 Comment out code that causes mobs to glitch push players in mcl_playerplus commit b6c9a1c423a9831cb3684e6a7e1b57163d6d4ab4 Author: jordan4ibanez Date: Sun Apr 25 19:51:11 2021 -0400 Fix creeper head commit a8152760b96ca3a9f142b006d2d888da0ebeff6a Author: jordan4ibanez Date: Sun Apr 25 19:44:15 2021 -0400 Integrate more switches into internal api elements of head code commit 6a38198e97fd0b573b3b9e590177977d900d5b14 Author: jordan4ibanez Date: Sun Apr 25 18:24:10 2021 -0400 Add in swap_y_with_x and reverse_head_yaw to flesh out head code api element commit d28e81bc9fc1f11b10da524d6874e8e1ee4a956d Author: jordan4ibanez Date: Sun Apr 25 17:54:14 2021 -0400 Add in mobs look pitch commit 5a2773ea1abb6c8706c477802aae2fa60704714c Author: jordan4ibanez Date: Sun Apr 25 17:48:41 2021 -0400 Add in basics of head code yaw commit 555935ff3d35d4ac28dad42f5facac0bbfe9b1c9 Author: jordan4ibanez Date: Sun Apr 25 16:43:23 2021 -0400 Implement basic fall damage commit 7e3b69348e405425712cf8196907a913be10b62e Author: jordan4ibanez Date: Sun Apr 25 16:11:45 2021 -0400 Add secondary existence check after main logic has been executed to prevent future crashes commit c898e1e4db3b866ddc4ff391ff89798397775fbf Author: jordan4ibanez Date: Sun Apr 25 15:59:00 2021 -0400 Update sheep.lua commit 9b5c9dc8ae9d1221340d1c72e4f48f3212a07fb7 Author: jordan4ibanez Date: Sun Apr 25 04:31:48 2021 -0400 Make farmable mobs/food mobs a lot less rare commit 5e6653ff651a65e6bfc4057cb5de39f09e9b9cca Author: jordan4ibanez Date: Sun Apr 25 04:19:02 2021 -0400 Implement mob cramming commit 1616cb7538141cd38485b4bf59a7b8b049ddd3f0 Author: jordan4ibanez Date: Sun Apr 25 04:09:35 2021 -0400 Fix nametags commit a3ff108cd4b71cd823518eae0186cbf1d819267e Author: jordan4ibanez Date: Sun Apr 25 04:03:06 2021 -0400 Make mobs walk up stairs/slabs properly, yet not glitch out when jumping over solid nodes commit df364eed286fced64f3c4bff897fcfe91a9dd540 Author: jordan4ibanez Date: Sun Apr 25 01:45:35 2021 -0400 Implement basics of head movement and fix walking mobs flying away after floating commit bac191293bc23405bfc02ef0795f0296fdaeb95a Author: jordan4ibanez Date: Sun Apr 25 01:45:03 2021 -0400 Fix clientside guessing making floating go crazy client side commit b7c7c2627beba086c922df0a20939b67ae1eb464 Author: jordan4ibanez Date: Sun Apr 25 01:44:46 2021 -0400 Fix parrots not drowning commit 38c22f277db652226ce9911e8bffbb8e8b8bc398 Author: jordan4ibanez Date: Sun Apr 25 01:24:19 2021 -0400 Add pop sound when baby mob is born commit f83ccdb2ed5974486a030196f9b31d0490dcdff3 Author: jordan4ibanez Date: Sun Apr 25 01:22:43 2021 -0400 Add in breeding and feeding baby mob sounds commit 7733e05a120cb07ed37c351956c1f451da3658b1 Author: jordan4ibanez Date: Sun Apr 25 01:14:48 2021 -0400 Add in random sounds/hurt/death sounds and stop mobs from reviving on server restart again commit 0a380265c888c64386406187b34914438cdff161 Author: jordan4ibanez Date: Sun Apr 25 00:16:54 2021 -0400 Fix dead-alive mobs and add in hurt/die sound commit 8d3eff0c16abeff9fbce2f9d4af2b64931765696 Author: jordan4ibanez Date: Sun Apr 25 00:06:12 2021 -0400 Enable mob drowning commit 56086bf02be689ba83ba3ccf4858429ad4d6a10b Author: jordan4ibanez Date: Sat Apr 24 23:33:46 2021 -0400 Fix villager commit 079811984cd952714e6cf85297c91830c0790a1d Author: jordan4ibanez Date: Sat Apr 24 23:29:56 2021 -0400 Make every mob besides spiders get slowed down by cobwebs like players commit 7e8e63b0e37300b16a4556aa45758d737514316e Author: jordan4ibanez Date: Sat Apr 24 23:15:40 2021 -0400 If mob is in daylight and ignites_in_daylight = true, make mob burn commit 49b01dca4fcea165314c1548f6c3e673a5de0bd3 Author: jordan4ibanez Date: Sat Apr 24 22:28:26 2021 -0400 Make mobs drop xp on death commit 3d5cceab76768e360e3ea958c71bcf79e9cc2eec Author: jordan4ibanez Date: Sat Apr 24 22:21:58 2021 -0400 Fix ghast strange behavior in the nether commit a73e5b57c02275a37b98dc9c80cf35a8c782d9f7 Author: jordan4ibanez Date: Sat Apr 24 22:14:25 2021 -0400 Make pitch movement for fly/swim mobs more dynamic and make ghasts randomly fly around when attacking commit b401b50c045830386c1c06c22be2232bda3e5b61 Author: jordan4ibanez Date: Sat Apr 24 21:15:42 2021 -0400 Give mobs 6 seconds of memory to prevent strange behavior when player hides behind something commit 807fb6966d747550da276b264e8e3bf376b332ab Author: jordan4ibanez Date: Sat Apr 24 20:27:37 2021 -0400 Make spiders climb up walls, fix problems with mob following freaking out when under, fix spider collisionbox commit 11b5684a90a7779986b5685d899a55a606922a0f Author: jordan4ibanez Date: Sat Apr 24 20:05:14 2021 -0400 Remove wolf-dog shift click breeding, and implement better logic commit 41bfaae370729b7409d5dea2cc65a6f5c83979ac Author: jordan4ibanez Date: Sat Apr 24 20:02:59 2021 -0400 Allow putting chest on carpeted llama by owner, enable swapping carpets commit 8c855f5b0955ebce15a1aaf4c17e407b5cad7ae8 Author: jordan4ibanez Date: Sat Apr 24 19:29:37 2021 -0400 Add in llama carpets commit e0185a93113136862b24ad06bea75f1b2e24901f Author: jordan4ibanez Date: Sat Apr 24 18:43:17 2021 -0400 Fix pig logic issue commit c2cb15a47f75674afaac721217384c8d7ead1c57 Author: jordan4ibanez Date: Sat Apr 24 18:36:22 2021 -0400 Fix horse breeding commit 39f7d0cf3cc7d33d786761376a035a31e434434f Author: jordan4ibanez Date: Sat Apr 24 18:18:53 2021 -0400 Update api.txt commit 3e9bbca91400e0f587aef13df1ece7d8071b188a Author: jordan4ibanez Date: Sat Apr 24 18:06:24 2021 -0400 Fix enderman crashing commit 81713a342d8038c2b51140dbd4bc00f1440b73e8 Author: jordan4ibanez Date: Sat Apr 24 00:38:50 2021 -0400 Allow tamed wolves to be shift click bred commit a27e6731cd97a1e41861d8a2acbdd4d2d530c220 Author: jordan4ibanez Date: Sat Apr 24 00:29:30 2021 -0400 Make sheep breedable commit efce97c1723ac25e9dabdfd9572781a6d50f0821 Author: jordan4ibanez Date: Sat Apr 24 00:27:17 2021 -0400 Make llamas shift click breedable commit 53c96cae2d28c3a6f4642b8a6d5b72365d32267d Author: jordan4ibanez Date: Sat Apr 24 00:26:45 2021 -0400 Make pigs shift click breedable commit dbe712bc17cc875c5e9b4b1a919880b0f6893ea1 Author: jordan4ibanez Date: Sat Apr 24 00:23:33 2021 -0400 Make llama breedable commit 0d4d85bac6b3412a2fec3f01ebc5b3ff6c294173 Author: jordan4ibanez Date: Sat Apr 24 00:19:41 2021 -0400 Fix horse literally blinding you following you commit 6f2e2ab4c57fe651dd90b4897e4f10673da1de3a Author: jordan4ibanez Date: Sat Apr 24 00:17:22 2021 -0400 Make chicken breedable commit 3649e5f6f50c917e3c29bbd0b95327e3667ae1ef Author: jordan4ibanez Date: Sat Apr 24 00:17:09 2021 -0400 Make horse breedable commit 2dab0773dffd40cb166c8a14ad79035ac898d4dc Author: jordan4ibanez Date: Sat Apr 24 00:00:21 2021 -0400 Remove unused breedable api call commit 0568c14a435e663dccc1a42ae999a76d0936f153 Author: jordan4ibanez Date: Fri Apr 23 23:59:35 2021 -0400 Fix timer and make mooshroom breedable commit 531253008a13559cdab63f420e9d35c78b382c95 Author: jordan4ibanez Date: Fri Apr 23 23:56:59 2021 -0400 Complete mob breeding, make cows breedable commit 79cb6ddc4923ea8a009b2810efe785cf3720c63f Author: jordan4ibanez Date: Fri Apr 23 22:35:35 2021 -0400 Fix lua locals in environment.lua commit 6eb3eef21561ddf2091682f3703fa9a23e35915e Author: jordan4ibanez Date: Fri Apr 23 22:34:40 2021 -0400 Fix typo in function commit c37a82d4a2589d372f88b5101918858c2d210e57 Author: jordan4ibanez Date: Fri Apr 23 22:03:29 2021 -0400 Add comments commit ed9d629b99a9f873cebfa8e45239271a81a8025c Author: jordan4ibanez Date: Fri Apr 23 21:59:42 2021 -0400 Add in mob following for cows commit fcfd6b9d19bbc1e894b8dafed490e04102c87878 Author: jordan4ibanez Date: Fri Apr 23 21:14:23 2021 -0400 Set up basics for breeding mechanics commit 5ee6cf6c9b3b9da36830c8a58f105d289dfbe54c Author: jordan4ibanez Date: Fri Apr 23 19:49:35 2021 -0400 Implement mob despawner/mob limiter commit 19c8dd1dd48532bfb07eac133cd11b702ad74de7 Author: jordan4ibanez Date: Fri Apr 23 18:41:41 2021 -0400 Stop hostile mobs from falling through water when stunned commit 31ded5e40fc97a7afd252fd74154183afaf1f568 Author: jordan4ibanez Date: Fri Apr 23 18:34:20 2021 -0400 Re-implement neutral mob switch commit 13c321e8f2c8cb43460093852d44ddae7edec0c1 Author: jordan4ibanez Date: Fri Apr 23 18:03:01 2021 -0400 Re-enable mob spawning commit ea6912c980952bed2a0b5e62009e0a2639d75d75 Author: jordan4ibanez Date: Fri Apr 23 17:44:49 2021 -0400 Don't do knockback effect for mobs when hurt by a rider commit 8dafac50a865f189074272303b83f37391c11c3c Author: jordan4ibanez Date: Fri Apr 23 17:37:20 2021 -0400 Make mobs run away slightly faster commit 3560bda4a5a8be026c5d50eb8ddeca9ed45e0b8e Author: jordan4ibanez Date: Fri Apr 23 17:29:23 2021 -0400 Remove unused code and variables from mob punch commit 9720986c4d30bf8fcd2cf1117d80eea06da5332a Author: jordan4ibanez Date: Fri Apr 23 17:27:08 2021 -0400 Fix punching a mob breaking it's velocity commit dc7592528cf948556e4e925310e830648b52dff1 Author: jordan4ibanez Date: Fri Apr 23 17:23:00 2021 -0400 Add red tint hurt effect commit 304cbed447adbcccff246f242d18d51fc010df35 Author: jordan4ibanez Date: Fri Apr 23 17:12:02 2021 -0400 Make mobs that should be skittish, skittish commit af4c42fea7112ada76fd9b273f771611532bdcf9 Author: jordan4ibanez Date: Fri Apr 23 17:10:44 2021 -0400 Add skittish behavior (runaway from punch) and fix ocelot commit 8daf197fb899a0bee8f61aad4ccedec1108f5f92 Author: jordan4ibanez Date: Fri Apr 23 16:52:07 2021 -0400 Fix iron golem rotation commit c138050e0b877f5dc987959efe4acbe17ffd86f2 Author: jordan4ibanez Date: Fri Apr 23 16:45:12 2021 -0400 Make iron golem neutral and protective, fix rotation commit 36d5af1d15b432d84e24e161b78d4b41ce2731bd Author: jordan4ibanez Date: Fri Apr 23 16:35:16 2021 -0400 Stop dead mobs from getting in the way of fighting other mobs commit 73b4d3c1d2c74cb5bd5bb23604ce1d74e183cb0d Author: jordan4ibanez Date: Fri Apr 23 16:31:13 2021 -0400 stop projectile mobs from being completely disabled while stunned commit eb7ae5e10e731fc949a9a4184e02a39103f83a1e Author: jordan4ibanez Date: Fri Apr 23 16:28:30 2021 -0400 Fix random crash commit c831da2c02253450df965930cbfcd539b820f3b9 Author: jordan4ibanez Date: Fri Apr 23 16:22:34 2021 -0400 Fix mobs not making hit sound when hit by node commit d5a38fef58c1862490c9f32238ec83cf1a2c2d5c Author: jordan4ibanez Date: Fri Apr 23 16:19:37 2021 -0400 Add in new mob punched sounds commit 8e7ce5a72ae3e7cedf985a414c64ca259bcd6136 Author: jordan4ibanez Date: Fri Apr 23 16:04:01 2021 -0400 Add in a visual for horse taming (hearts) commit 189c0ad157a8871d51045effcded0662aff7b1af Author: jordan4ibanez Date: Fri Apr 23 15:53:01 2021 -0400 Half finish horse (riding logic, etc) commit f64f8e31e3ba8e7a14b22d084be5ef584895242d Author: jordan4ibanez Date: Fri Apr 23 14:50:38 2021 -0400 Fix llama blaze and ghast projectile sprites commit 58bee2a2dd1b4d6d3d1873d3ac566be9e0aa7930 Author: jordan4ibanez Date: Fri Apr 23 14:43:00 2021 -0400 Fix projectile tails clipping through sprite commit 16cc7e37d2fc83e50d4e2c380cef05224dbbed38 Author: jordan4ibanez Date: Fri Apr 23 14:34:59 2021 -0400 Randomize projectile cooldown timer commit 8eb9ba12cef918cb116aea8eaea5a1e757123b01 Author: jordan4ibanez Date: Fri Apr 23 14:33:40 2021 -0400 Fix crash when mob collides with nil entity commit 5d59583583462563f7d65747a198b0d6d8ed34fc Author: jordan4ibanez Date: Fri Apr 23 14:10:12 2021 -0400 Massive overhaul to projectile mobs with custom projectile function, make llamas spit commit f6fa90096dfdb9d21b6f52968daa60943a07470e Author: jordan4ibanez Date: Fri Apr 23 13:35:30 2021 -0400 Fix enderman teleport attack commit 4fb9e69e41a8c2ee91c659acb0b11fc76a6a97fe Author: jordan4ibanez Date: Fri Apr 23 13:27:17 2021 -0400 Make enderman become hostile when stared at, freeze when attacking when stared at commit 99f13f84b563c1962c285b2e9973aec8a5d079d7 Author: jordan4ibanez Date: Fri Apr 23 13:13:23 2021 -0400 Half-fix enderman commit dd76b15c501a1a458f2fa112b29784e26c3140bd Author: jordan4ibanez Date: Fri Apr 23 13:06:57 2021 -0400 Make ghasts not insta-kill commit b6f19699e9059a382421f55ac9ee5b642e7751a6 Author: jordan4ibanez Date: Fri Apr 23 13:06:17 2021 -0400 Make enderdragon half work commit 4efec1ef58ba4afe4692a22a361079b5026a7de3 Author: jordan4ibanez Date: Fri Apr 23 12:55:11 2021 -0400 Add in chicken slow falling commit 08956664073078fd896add1e57ff0a524de2a32f Author: jordan4ibanez Date: Thu Apr 22 23:36:58 2021 -0400 Fix random crash with mixed mob ally data types commit 408296140a4fe0c785f5fb4760899fdb3851fe00 Author: jordan4ibanez Date: Thu Apr 22 23:30:32 2021 -0400 Fix and overhaul wolves commit aac1e1933677d119b52c25a64b3ee6c77e16e770 Author: jordan4ibanez Date: Thu Apr 22 23:18:33 2021 -0400 Implement rotation locking when standing, fix rotation unlock/lock for fly/swim mobs commit fa059b5df245e81d71d73bbc87b51c59cd47a876 Author: jordan4ibanez Date: Thu Apr 22 22:59:03 2021 -0400 Fix ghast's eyeheight commit 2e3e92e39337e5c4ecba13855f134af1bd672ae6 Author: jordan4ibanez Date: Thu Apr 22 22:58:32 2021 -0400 Fix ghast's insane difficulty commit 11bcf3aa34e85dcc19142258ca2c4abaf963b806 Author: jordan4ibanez Date: Thu Apr 22 22:51:13 2021 -0400 Add attributes to epCode commit 2099be43ea25740a402587f40b3004f6ef2d8c1d Author: jordan4ibanez Date: Thu Apr 22 22:50:14 2021 -0400 Update to epCode's fixed version of ghast model commit 5037ec3736a564157408df12699c91df17c934b6 Author: jordan4ibanez Date: Thu Apr 22 22:40:16 2021 -0400 Fix ghasts horrible collisionbox commit 0a8fff65249610aba7fef7e9675bf28469265f29 Author: jordan4ibanez Date: Thu Apr 22 22:08:54 2021 -0400 Add in mob criticals when falling commit afdcada1fd6f7c8cbe68b0fd1486d6d92f3d12f7 Author: jordan4ibanez Date: Thu Apr 22 21:46:13 2021 -0400 Fix endermite commit 5d876725c599b060c5150b0508f21b6a83001f9a Author: jordan4ibanez Date: Thu Apr 22 21:45:00 2021 -0400 Fix bats commit ef0d52a2df9a3d2d2c1e59b12084017c405bc398 Author: jordan4ibanez Date: Thu Apr 22 21:41:54 2021 -0400 Update backup_code_api.lua commit 8142f7e51214672292d3bffe3fa8119eb8a1cf1c Author: jordan4ibanez Date: Thu Apr 22 21:36:42 2021 -0400 Add in mob death commit ebf27866ca3bb02c726d4729c0666ee28e20a3dd Author: jordan4ibanez Date: Thu Apr 22 21:12:08 2021 -0400 Fix typo and error in animation.lua commit 3fe8d2d3c59ca6c173817a9d2d6b48e3549acd57 Author: jordan4ibanez Date: Thu Apr 22 20:30:50 2021 -0400 Add file death_logic.lua commit b73ab976a1115044bc336f9e3f181ecf6e75cc06 Author: jordan4ibanez Date: Thu Apr 22 20:25:58 2021 -0400 Implement framework for mob death commit 8530e6ee368f510581c618666613432f25266ce5 Author: jordan4ibanez Date: Thu Apr 22 20:20:56 2021 -0400 Make mob punching time based commit e1812b2cdba132afec9ed6cdc45ee9f078806264 Author: jordan4ibanez Date: Thu Apr 22 20:12:02 2021 -0400 Reset pause timer to 0 commit 991bba0a1d611cf545020c9129fdcbc4806e73c6 Author: jordan4ibanez Date: Thu Apr 22 20:10:01 2021 -0400 Add comments into ai.lua commit f9a7144b658f747be895bb6a8b69c8a0124fdd2a Author: jordan4ibanez Date: Thu Apr 22 20:07:30 2021 -0400 Implement ability to hurt mobs commit 45790c0be0eec380e281a687a1ff03ea1f114143 Author: jordan4ibanez Date: Thu Apr 22 19:12:02 2021 -0400 Re-enable mob punching (broken) commit 31a791c33b19d76350993d844747a0c51a77382c Author: jordan4ibanez Date: Thu Apr 22 18:20:58 2021 -0400 Undo debug.txt spam from mob spawning commit d0d128c1d8f84e8de590e34adfe0265556ccd3e1 Author: jordan4ibanez Date: Thu Apr 22 18:18:57 2021 -0400 Break infinite loop if unable to find any mob to spawn commit ee905642c2cdfaa3be3eb5c2af7ec75599ffd41e Author: jordan4ibanez Date: Thu Apr 22 17:56:38 2021 -0400 Add temporary warning debug to spawning algorithm output commit 2cef9e7cca2e70e544eb3068a0e3e36487cab669 Author: jordan4ibanez Date: Thu Apr 22 00:39:32 2021 -0400 Optimize mob spawning even further with additional lua locals commit edb1939649c62a2b486e1c04c5af27458f978388 Author: jordan4ibanez Date: Thu Apr 22 00:27:35 2021 -0400 Fix mob_counter in mob spawning limiter commit 7c1adeab459d452ac016108b588957082c1347c1 Author: jordan4ibanez Date: Thu Apr 22 00:20:57 2021 -0400 Hyper-optimize mob spawning commit fbe3ccc5c05b5d5141737d3a73df3e4d14a33a33 Author: jordan4ibanez Date: Wed Apr 21 23:28:38 2021 -0400 Delete current state of things comment commit 5e15af260bed13b07b295f558f5cb05bedaa7eae Author: jordan4ibanez Date: Wed Apr 21 23:25:19 2021 -0400 Fix pig rotation commit 6aa636449211b1bbec1297723281f72b4c76c4da Author: jordan4ibanez Date: Wed Apr 21 23:25:10 2021 -0400 Fix sheep rotation commit 29305f548db88b0b895ec747ebfbc092c51c4762 Author: jordan4ibanez Date: Wed Apr 21 15:08:35 2021 -0400 Overhaul arrow register, implement basic blaze, break parts of arrow register for now, remove fallback for detecting players commit 08c90c34e83c498ee2cc883a2cad9b98a269a850 Author: jordan4ibanez Date: Wed Apr 21 13:05:46 2021 -0400 Make parrots and squids work with tilt fly/swim commit 91099c3be93689c2569f838a63e75e38ca382162 Author: jordan4ibanez Date: Wed Apr 21 13:01:14 2021 -0400 Fix auto-true statement for tilt fly/swim commit 71c34823bc87b0892d4450b877fb1c78cd6ad416 Author: jordan4ibanez Date: Wed Apr 21 12:56:36 2021 -0400 Make tilt flying/swimming dynamic commit 20886f54bb8887fb88ce0e0e0c6f28a789868740 Author: jordan4ibanez Date: Wed Apr 21 12:48:23 2021 -0400 Make shooty mobs jump commit ebd995fbd2eb089a37b659e9ae87c86562e3ed69 Author: jordan4ibanez Date: Wed Apr 21 12:45:02 2021 -0400 Simplify skeleton arrow damage calculation commit c9f71d66f52f2e80fea6cd01fcb2db30ae399c39 Author: jordan4ibanez Date: Wed Apr 21 12:42:34 2021 -0400 Implement skeletons/strays commit 99e808296b81f37a9e01d4b4beb02120526bb4e9 Author: jordan4ibanez Date: Wed Apr 21 12:17:51 2021 -0400 Add missing skeleton/stray run animation commit 74094938bb0918df12ffa778c95b966d7bd6c9f3 Author: jordan4ibanez Date: Wed Apr 21 12:10:29 2021 -0400 Fix crash with non-punch attack mobs in collision commit 6bd279255c7e4b5623afa39caae8f988127f7ac3 Author: jordan4ibanez Date: Wed Apr 21 11:50:22 2021 -0400 Fully implement zombie pigmen commit 964ce9ccf7101aef387bdd5ec2213ba4ac361a51 Author: jordan4ibanez Date: Wed Apr 21 11:42:01 2021 -0400 Temporarily disable spawn eggs from setting owner commit 5062d56a5d89346234f6125848799f32915b31a4 Author: jordan4ibanez Date: Wed Apr 21 11:00:02 2021 -0400 Implement neutral mob mechanics and partial implement of zombie pigmen commit b0b1ec9436776fdc89edaf3046499a9e2cfaed0f Author: jordan4ibanez Date: Wed Apr 21 10:53:20 2021 -0400 Implement zombie pigmen and make them turn hostile when punched commit f1dc2864425bab2eed2f5bec7b7ccd0307145b1f Author: jordan4ibanez Date: Wed Apr 21 10:23:51 2021 -0400 Dump mob_punch from backup_code_api.lua back into interaction.lua commit cc2a0ae52cefc388d18c9d106ef70fc0718f5e40 Author: jordan4ibanez Date: Wed Apr 21 10:21:11 2021 -0400 Complete charged creeper commit 486959515ca13ba0d5756ba5d930ff43e9d135b5 Author: jordan4ibanez Date: Wed Apr 21 10:20:31 2021 -0400 Make creepers even more dangerous commit 576621169b468f317cf32d6d0be391252a033d3a Author: jordan4ibanez Date: Tue Apr 20 23:26:18 2021 -0400 Make creepers and zombies even harder commit 2c87bd19f3c6a4a5a1a3b88a45cd673ecccb838b Author: jordan4ibanez Date: Tue Apr 20 23:14:53 2021 -0400 Overhaul zombie villager commit 1ed3377559c4690fa19488f526bcaf97d5ff94b1 Author: jordan4ibanez Date: Tue Apr 20 23:11:18 2021 -0400 Add punch mobs knockback to players when hit commit 8c9356a18cb60cd28691e3782723df763b75a1fa Author: jordan4ibanez Date: Tue Apr 20 22:58:39 2021 -0400 Implement eye_height and viewing range for hostile mobs, along with making punchy mobs jump over nodes commit a05ebd7cc29c96b622dbc043529513b07d5cf47b Author: jordan4ibanez Date: Tue Apr 20 22:44:34 2021 -0400 Add informative text art commit 60ac3058ce1e3e05caa87c18bdf95c78a71ed750 Author: jordan4ibanez Date: Tue Apr 20 22:42:51 2021 -0400 Make zombies more difficult commit 751c4c2d995a011a3298d374c77b9c4567ed2fa1 Author: jordan4ibanez Date: Tue Apr 20 22:41:13 2021 -0400 Integrate mob punching into collision detection commit 6b52b945165a8501e09ca70c18514049df194c05 Author: jordan4ibanez Date: Tue Apr 20 22:30:34 2021 -0400 Start setting up hostile punch attack type commit d371d6fdc9cb85e140399eafb89f15195f72d09f Author: jordan4ibanez Date: Tue Apr 20 22:04:54 2021 -0400 Adjust creeper explosion settings commit fabd4d64e6745b9ea8c4bb1a76c190c2d66576be Author: jordan4ibanez Date: Tue Apr 20 21:35:19 2021 -0400 Slow down creeper type mobs explosion buildup commit bf367fffd054fe180dbc6d7f46e20e286d68bb09 Author: jordan4ibanez Date: Tue Apr 20 21:34:18 2021 -0400 Add in sound_handling and make explosion type mobs make their attack sound before explosion animation commit 0b763f54b55ea47b7889816612759447bfb50422 Author: jordan4ibanez Date: Tue Apr 20 21:00:36 2021 -0400 Finish creeper movement ai and move jump_check into environment commit cd6f07537f64bdbe7573642982ec24ac3fb19ec1 Author: jordan4ibanez Date: Tue Apr 20 20:43:45 2021 -0400 Make creepers even more deadly commit 9678b556e17b124f841b0019b3a31880a415bd11 Author: jordan4ibanez Date: Tue Apr 20 20:33:30 2021 -0400 Fix crashes when trying to collision detect a removed mob commit cdb840609dc2586b31a1e44c8c1004379ef37979 Author: jordan4ibanez Date: Tue Apr 20 20:19:55 2021 -0400 Add in creeper basic prototype commit 008d670ed9006d918b1ed1698a5b644de27191b1 Author: jordan4ibanez Date: Tue Apr 20 17:10:51 2021 -0400 Remove wandering from ai commit 491ef6c8f818e43ef0545963eb27b5476c95ea28 Author: jordan4ibanez Date: Tue Apr 20 16:48:20 2021 -0400 Add in auto mob removal if something goes horribly wrong commit 348df0fcecc2709fe088493d5665112827f08129 Author: jordan4ibanez Date: Tue Apr 20 16:46:10 2021 -0400 Rename detect_players_in_area to detect_closest_player_within_radius commit ac08c6991c0ce7f9bb8d9de5880ec64a7882c3e7 Author: jordan4ibanez Date: Tue Apr 20 16:39:05 2021 -0400 Add in detect_players_in_area commit 3d776138e97b904c9b299119ae9b9a8a2811ae7a Author: jordan4ibanez Date: Tue Apr 20 14:55:22 2021 -0400 Start implementing creeper ai commit 85e531bf106df326b2ca470b5a94aeb06f92d4d6 Author: jordan4ibanez Date: Sun Apr 18 21:24:31 2021 -0400 Remove unneeded mobs:protect from code commit 4d589dfb2aa10cb664b4d3b3471960e6d648b92c Author: jordan4ibanez Date: Sun Apr 18 21:22:39 2021 -0400 Remove literally unneeded mobs:capture_mob commit 39985aa558d9f43a6a2e82fb6d59ad0ca8b6324d Author: jordan4ibanez Date: Sun Apr 18 21:22:21 2021 -0400 Up fallback max xp to 3 commit 1920ddf91530a7c033c8288cd3a752f3ee7ba850 Author: jordan4ibanez Date: Sun Apr 18 21:02:03 2021 -0400 Change all enemy attack info to more workable and understandable attacks commit 719bb2a3c96ca020f8f828959e377831f47cd27b Author: jordan4ibanez Date: Sat Apr 17 18:21:33 2021 -0400 Add in prototype jump-only mobs api commit db87b8e0a37cd15ef7931a76d21bbb190a158205 Author: jordan4ibanez Date: Sat Apr 17 17:09:57 2021 -0400 fix chicken rotation commit e2987245fd6c6ee75383ea92da30e9fc5e10ad1e Author: jordan4ibanez Date: Sat Apr 17 17:00:34 2021 -0400 Balance out collision forces for mobs commit 3cf263d292f9fc5a7a18fafa2aa1fbc8e1840a0a Author: jordan4ibanez Date: Sat Apr 17 16:23:38 2021 -0400 Add in dynamic pitch in flying/swimming mobs commit 5ade34115cff228994ff3fd680aa15c8225ab6e7 Author: jordan4ibanez Date: Sat Apr 17 13:17:29 2021 -0400 Remove random state initialization in set_up.lua commit d9729fc8651d06566e61bcfcb2e7df0484f25f48 Author: jordan4ibanez Date: Sat Apr 17 13:13:45 2021 -0400 Fix parrot's rotation commit 58d9670e777c3798c676924023375a2579450142 Author: jordan4ibanez Date: Sat Apr 17 13:11:39 2021 -0400 Remove collisionbox addition for y position for fly mobs commit a20f272e08f0170b2761eeba2a12aeaf88efad7b Author: jordan4ibanez Date: Sat Apr 17 13:05:53 2021 -0400 re-adjust logic gate for mobs floating in water and lava commit 0794bc54372c6aaa9c653693da3a18194adf5c95 Author: jordan4ibanez Date: Sat Apr 17 13:04:55 2021 -0400 Make flying mobs float in water and lava commit 8783912938aed1f5566f3e2f5056213f0cefe4a6 Author: jordan4ibanez Date: Sat Apr 17 12:48:57 2021 -0400 Add in mobs api swimming animation commit f2e909ab8d182febabbdacd9de50a65f27137761 Author: jordan4ibanez Date: Sat Apr 17 12:41:14 2021 -0400 Add in fly logic gate commit 07841c89632626f1c3bb4790f8db0c2adddfb2eb Author: jordan4ibanez Date: Sat Apr 17 12:38:48 2021 -0400 Swap name of quick_rotate_45 to quick_rotate commit 240d6ea21155f2044d3b728a210811821540013a Author: jordan4ibanez Date: Sat Apr 17 12:37:04 2021 -0400 Add note about quick_rotate_45 actually rotating 11.25 degrees commit e8148f81ab7641554096bc03ecda8927d9ad9491 Author: jordan4ibanez Date: Sat Apr 17 12:36:19 2021 -0400 Make underwater mobs try to continuously swim around with quick_rotate_45 commit 061602d9d46d4e4607e407c064070709ef99f9b7 Author: jordan4ibanez Date: Sat Apr 17 12:28:07 2021 -0400 Overhaul separation of swimming and flying for ease of use with writing mobs api commit 5365dec19a8a088263916a3686f27859be51e870 Author: jordan4ibanez Date: Sat Apr 17 12:01:27 2021 -0400 Adjust "flying" vector checks for mobs commit dda7839d8c4c2292e9c8d6472faf38372654d886 Author: jordan4ibanez Date: Fri Apr 16 21:43:02 2021 -0400 Add in prototype swimming commit f1141aed9fa52bf57e8867fdb3ffb520793dab07 Author: jordan4ibanez Date: Fri Apr 16 21:08:54 2021 -0400 Make mobs flop when outside of flying node commit 84ca7681fc9ee3e9945488865678b2b82eb0a22d Author: jordan4ibanez Date: Fri Apr 16 20:47:16 2021 -0400 Make squids fly in water flowing and water source commit 52c3db041e602ebd0861a0b86c55b35662c8c33a Author: jordan4ibanez Date: Fri Apr 16 20:32:05 2021 -0400 Add in fly state prep for mobs commit 6db4511dd5b038cd95c7ea196559bb25a53246e9 Author: jordan4ibanez Date: Fri Apr 16 20:06:55 2021 -0400 Add notes commit 15ea9c1c71f3e4d4dd24ce145d385f8457e4905e Author: jordan4ibanez Date: Fri Apr 16 19:59:20 2021 -0400 Implement self walking velocity for walking state commit 9d6d042ee325a010d97abdff7efc37f3dcf46b5e Author: jordan4ibanez Date: Fri Apr 16 19:37:01 2021 -0400 Fix formatting in ai.lua commit ce7f4918b061fa9a4d46045a389497cb0da1a5ee Author: jordan4ibanez Date: Fri Apr 16 19:35:19 2021 -0400 Re-organize comments commit 05d06a4c8f0128ac5edd21b8096bb75553c1f89e Author: jordan4ibanez Date: Fri Apr 16 18:36:23 2021 -0400 Add comment to state_execution commit c761db86c7e67aab27d3806a76b7a58504a7d5c6 Author: jordan4ibanez Date: Fri Apr 16 18:29:42 2021 -0400 re-arrange mob logic for random wandering commit ed456ecb47d788efe9aa526849110015e9c04e9a Author: jordan4ibanez Date: Fri Apr 16 18:17:51 2021 -0400 Make mobs not fear cliffs if fear_height is 0 commit 8ca5f221ec9ce534e91f7094193b4ec951e743b1 Author: jordan4ibanez Date: Fri Apr 16 18:13:54 2021 -0400 clean up ai.lua commit cadd53c103f4047069f581abdc033d2def4ed2dd Author: jordan4ibanez Date: Fri Apr 16 16:39:03 2021 -0400 Adjust mob jumping default to account for higher gravity commit 57b293de2b02be81ff3e17e620807c653fe9b625 Author: jordan4ibanez Date: Fri Apr 16 16:37:15 2021 -0400 Make mobs gravity equal to player's commit fb9a55e562c3e4102fa4e02603f93d1c78e397ad Author: jordan4ibanez Date: Fri Apr 16 15:55:11 2021 -0400 Make jump_check more modular and allow mobs to turn if at a wall commit a6a54b34140c279d7a9ff3db5b21f1be0ead15f8 Author: jordan4ibanez Date: Fri Apr 16 15:49:03 2021 -0400 Make mobs not jump if against a wall commit 6c5393427f72c082a5c85514cb3b54aa4a9ce45f Author: jordan4ibanez Date: Fri Apr 16 15:39:39 2021 -0400 Smooth out mob cliff check and check if falling before cliff check commit 2486ffef11113a40b43a2548bde57e9cca186da9 Author: jordan4ibanez Date: Fri Apr 16 15:30:44 2021 -0400 Make wandering mobs avoid cliffs commit adc683c6a7cd56c33bebc22ce1363671db4f4846 Author: jordan4ibanez Date: Fri Apr 16 14:19:22 2021 -0400 Clear mob animation on activate commit d0695e7929460728f7da2e01cc809cb343481e1a Author: jordan4ibanez Date: Fri Apr 16 13:58:08 2021 -0400 Fix mob animation "memory leak" commit 024cf46307abb6fefbfe8be04941205026561177 Author: jordan4ibanez Date: Fri Apr 16 11:52:29 2021 -0400 Adjust spacing in animation.lua commit f38492bcb031b7fcc2ee8299f66fcd3cd3a68398 Author: jordan4ibanez Date: Fri Apr 16 11:50:29 2021 -0400 Re-implement animation check gate for mobs commit a934a59f3b64e8adef64676daaf81b574a6ceecd Author: jordan4ibanez Date: Fri Apr 16 11:50:13 2021 -0400 Implement mob random walk directions commit 94ca7e8b89bd39144d85bc6a622778babb226d47 Author: jordan4ibanez Date: Fri Apr 16 11:31:18 2021 -0400 Add in state switch and state execution for mobs commit 626c30de6d4191cd4a18b0f11cb4805c425f9648 Author: jordan4ibanez Date: Fri Apr 16 11:30:55 2021 -0400 Create todo.txt commit c2bac87a6d03364193aedf67c780fdea9f545cac Author: jordan4ibanez Date: Thu Apr 15 21:46:33 2021 -0400 Update set_up.lua commit 375d683d08266586d024491dcba2268c66583989 Author: jordan4ibanez Date: Thu Apr 15 16:18:42 2021 -0400 Fix forgotten localization in collision.lua commit 246bdf9707c98f787cb5264dc7ff638e340d768b Author: jordan4ibanez Date: Thu Apr 15 15:55:10 2021 -0400 Implement basic mob walking animation test commit d07d0ae31c0d39c526c8418e725b5dce1d120793 Author: jordan4ibanez Date: Thu Apr 15 15:34:07 2021 -0400 Make mobs jump properly commit 6cb6d714c9bcf55213a9449416bec37c0fe318af Author: jordan4ibanez Date: Thu Apr 15 15:04:55 2021 -0400 Reorganize all mob sections into multiple files commit 5155d12d05c5b563a78923b3fc02a885cd23fe85 Author: jordan4ibanez Date: Thu Apr 15 14:09:54 2021 -0400 Reformat mobs_mcl to api folder for ease of use commit bbcfb3fdb171053e3142854f658860e7693f31d1 Author: jordan4ibanez Date: Thu Apr 15 11:33:09 2021 -0400 Randomize walking or standing on spawn in commit 9e4bf6e130195b4f2176658581ad17646a48ce3a Author: jordan4ibanez Date: Thu Apr 15 11:29:18 2021 -0400 Move old set_yaw and add node on set_velocity commit e53a193c4fe61e88e6501a2a863e22d533132ae4 Author: jordan4ibanez Date: Thu Apr 15 11:25:55 2021 -0400 Fix get_velocity (mobs internal) commit 14207dd96aa60652c0ad1f4351441659c33d3ff6 Author: jordan4ibanez Date: Thu Apr 15 11:23:52 2021 -0400 Smooth out mob movement set_velocity more commit a0ed1a0b2004baeb3d0f64c5eb02bbf0b21bf823 Author: jordan4ibanez Date: Thu Apr 15 10:05:24 2021 -0400 Add automatic rotation lock commit ba46e7fa42bbd25175d3505ca9699a11912d491f Author: jordan4ibanez Date: Thu Apr 15 09:28:58 2021 -0400 Remove old debug of colliding with objects commit 61124905f3d862d00f00674067003d8da7722405 Author: jordan4ibanez Date: Thu Apr 15 09:28:22 2021 -0400 Add in mob auto rotation (implementation 1) commit 8b200c7352cb9fdd01f1b073308acacd36b2672a Author: jordan4ibanez Date: Wed Apr 14 19:38:14 2021 -0400 Add in basic movement rotation testing commit 67259891a85e54f56dc543087bd98cfe12feb6f4 Author: jordan4ibanez Date: Wed Apr 14 18:01:29 2021 -0400 Remove unneeded comments commit d063db751c1657c367f2277b24a5aa51a8d90fa3 Author: jordan4ibanez Date: Wed Apr 14 17:26:20 2021 -0400 Disable mcl_playerplus random check that moves players randomly commit d4db27f0e1edd439f65821b814146a237ebea799 Author: jordan4ibanez Date: Wed Apr 14 17:25:39 2021 -0400 Update backup_code_api.lua commit 755533beeb6c708603096cce4f99bea558c8b6ce Author: jordan4ibanez Date: Wed Apr 14 11:50:22 2021 -0400 Disable literally everything in mobs api commit 3f6312a631c6726c3bc4b09d9ec3e64b3ae810e5 Author: jordan4ibanez Date: Tue Apr 13 20:24:46 2021 -0400 Make mobs magnetic collision more jello-y commit aa4d34c10e4bc367fc6ad7d898cd145d9f58ed0c Author: jordan4ibanez Date: Tue Apr 13 20:00:38 2021 -0400 Improve mob to mob collision commit 1210bc463adb949496fc521e3169fb88e49fc4e9 Author: jordan4ibanez Date: Tue Apr 13 19:44:24 2021 -0400 prevent mob collision detection shootout commit ed6026671381c99723eccbf2089d99748e19bfe2 Author: jordan4ibanez Date: Tue Apr 13 19:17:48 2021 -0400 Gut even more elements of the api commit 220d30df5f159d69be22663733feb1fbf51c45f8 Author: jordan4ibanez Date: Tue Apr 13 19:13:29 2021 -0400 Completely gut do_states commit 9758bbf2e7e382948b4ad1ab8c360519270fec14 Author: jordan4ibanez Date: Tue Apr 13 08:21:04 2021 -0400 Finish gutting mob api commit f29ad4b8b78689ed0d759c18178a6b2dbc9a1e25 Author: jordan4ibanez Date: Tue Apr 13 08:20:11 2021 -0400 Reorganize more settings to the top of file commit 54f5bee8a379bf910c1cc6ea3d33bd32b819f3dd Author: jordan4ibanez Date: Tue Apr 13 08:08:29 2021 -0400 reorganize load settings commit 02515f0778bbe9cd962acc514b084c9dedf55074 Author: jordan4ibanez Date: Tue Apr 13 08:07:32 2021 -0400 Move a large chunk of code to backup_code_api.lua commit 3fc0184182f70be0c2fd9b3be1c5d78fa7f00503 Author: jordan4ibanez Date: Tue Apr 13 07:39:57 2021 -0400 Disable entire mob ai to work on vanilla walking commit 6fff719322ee250fc7c074d2362edbf0c4090406 Author: jordan4ibanez Date: Mon Apr 12 08:47:07 2021 -0400 Localize minetest library commit adaf74fc5c6354cf2fb1a9f784e5a37a4fb31caa Author: jordan4ibanez Date: Mon Apr 12 08:13:11 2021 -0400 Remove spacing and delete old collision comments commit a564009e4aeda08372b80fb1a5fc2d16f5dfd364 Author: jordan4ibanez Date: Mon Apr 12 08:11:55 2021 -0400 Change HORNY_TIMER to BREED_TIMER commit 00759da39d621b36be6200fa365c51be86dbb99f Author: jordan4ibanez Date: Sun Apr 11 18:29:32 2021 -0400 Unlimit mob ai commit 9aafc28a2009998017753d0aa4d013e3cd8795b6 Author: jordan4ibanez Date: Sun Apr 11 14:47:56 2021 -0400 Fix mobs nil check during mob_step commit 67c40885ef62b4e4e8dcaba3b65c58502c558f7e Author: jordan4ibanez Date: Sun Apr 11 14:21:19 2021 -0400 Fix mobs collision system only running during movement - major overhaul with ai disabled commit 2456e3cd1ef6954415e4a771bb704a12364895eb Author: jordan4ibanez Date: Sun Apr 11 12:52:31 2021 -0400 Adjust math localizations in api.lua commit 725dc731ddc2a6f1cf1a20832e06883613d5974a Author: jordan4ibanez Date: Sun Apr 11 11:58:33 2021 -0400 Adjust mob collision detection - this breaks a lot of things and will be fixed later commit e15fd2f4b60fafcae3b765d345914032b4a52668 Author: jordan4ibanez Date: Fri Apr 9 01:38:34 2021 -0400 Add lua locals into mcl_dungeons for performance commit c937b2a97338097700cd3836811ce46366e88027 Author: jordan4ibanez Date: Thu Apr 8 14:19:42 2021 -0400 test commit 8c10fe4057d5a973d448e32addbc07617f9b8edc Author: jordan4ibanez Date: Thu Apr 8 12:48:02 2021 -0400 Adjust spawning to be closer and more frequent commit bd7866d7983aae52aef426bc7a305ae166817ed7 Author: jordan4ibanez Date: Thu Apr 8 12:07:20 2021 -0400 Finish mob limiter commit 9369c9cab8f25d5fa34fe0cdaeee4f9570db4551 Author: jordan4ibanez Date: Thu Apr 8 10:01:15 2021 -0400 Fix spawn timer reset debug commit 28823298e1536d4ce34d67ada624dcb5aaf377e0 Author: jordan4ibanez Date: Thu Apr 8 10:00:04 2021 -0400 Fix forgotten biome check commit 9d48549ec5901de887eb9fb2d75fd07f08edb39b Author: jordan4ibanez Date: Thu Apr 8 09:52:50 2021 -0400 Complete prototype of biome generated mobs commit 518252679f642d00057889b462eb8c87b0992de7 Author: jordan4ibanez Date: Thu Apr 8 08:42:57 2021 -0400 Fix a lot of things commit bb078b0c4c48ac6932d2953561ac03bea3bde51a Author: jordan4ibanez Date: Thu Apr 8 08:33:50 2021 -0400 Fix silverfish typo commit adab48ff0c95c2fad11e4d58824d635ae6945875 Author: jordan4ibanez Date: Thu Apr 8 08:29:16 2021 -0400 Readjust mobs internal settings to not cause insane memory usage commit 47c59edb511fde5db934fca519b9d8aa1fc68838 Author: jordan4ibanez Date: Thu Apr 8 08:13:46 2021 -0400 Fix typo commit 5ca30fa8eec24a1f9bee879bb49d3dfce82484fb Author: jordan4ibanez Date: Thu Apr 8 08:12:43 2021 -0400 Combine air and ground type spawning into ground commit aacb8fc7b95013e42c832927088708b8c9889201 Author: jordan4ibanez Date: Thu Apr 8 08:09:43 2021 -0400 Add in extra_mobs information commit f900b24b53a802fd5db1bf1a633d7f89e42bcce5 Author: jordan4ibanez Date: Thu Apr 8 07:39:18 2021 -0400 Add in all biome information to mobs commit 0ad833c046095d83a789705aa15dd7f30fd8f3ed Author: jordan4ibanez Date: Thu Apr 8 06:57:24 2021 -0400 Add bats, chicken, and blaze spawn info commit f4a6bdc6b89b2d605cfd06f0b7baa6170a19314c Author: jordan4ibanez Date: Thu Apr 8 06:48:25 2021 -0400 Make reference list copy-pastable commit bf4bf9a0cc60a1a15f1ddbfed314ec5a9c75561c Author: jordan4ibanez Date: Thu Apr 8 06:10:07 2021 -0400 Ignore default or void dimensions commit 8e1e02d1fbc189680dbd004bdd905446467a4e29 Author: jordan4ibanez Date: Thu Apr 8 06:04:36 2021 -0400 Add biome list commit da045c207d3bd5931e3cf73c5459b45d86596c12 Author: jordan4ibanez Date: Thu Apr 8 02:07:15 2021 -0400 Refactor spawning into it's own file commit 6ec66ef6f666007e411e23689e0d4eccd5a5fbfe Author: jordan4ibanez Date: Wed Apr 7 23:16:03 2021 -0400 Fix mobs colliding with other mobs/players commit 6bd249547a888493af6c5cfc65d3e206e1467c19 Author: jordan4ibanez Date: Wed Apr 7 23:07:04 2021 -0400 Fix mobs colliding with objects commit c4d030d111ea6e21ca6343f76fb98b8aa9d29f6c Author: jordan4ibanez Date: Thu Apr 1 23:48:00 2021 -0400 Fix item drop on laggy servers --- mods/ENTITIES/mcl_mobs/api.txt | 32 +- mods/ENTITIES/mcl_mobs/api/api.lua | 761 +++ .../mcl_mobs/api/mob_functions/ai.lua | 1153 +++++ .../mcl_mobs/api/mob_functions/animation.lua | 259 + .../attack_type_instructions.lua | 351 ++ .../mob_functions/backup_code_api.lua} | 4342 ++++++----------- .../mcl_mobs/api/mob_functions/breeding.lua | 184 + .../mcl_mobs/api/mob_functions/collision.lua | 140 + .../api/mob_functions/death_logic.lua | 154 + .../api/mob_functions/environment.lua | 260 + .../mcl_mobs/api/mob_functions/head_logic.lua | 112 + .../api/mob_functions/interaction.lua | 291 ++ .../api/mob_functions/mob_effects.lua | 152 + .../mcl_mobs/api/mob_functions/movement.lua | 391 ++ .../api/mob_functions/projectile_handling.lua | 44 + .../mcl_mobs/api/mob_functions/set_up.lua | 226 + .../api/mob_functions/sound_handling.lua | 59 + mods/ENTITIES/mcl_mobs/{ => api}/mount.lua | 55 +- mods/ENTITIES/mcl_mobs/{ => api}/spawning.lua | 314 +- mods/ENTITIES/mcl_mobs/init.lua | 8 +- mods/ENTITIES/mcl_mobs/lucky_block.lua | 8 - mods/ENTITIES/mcl_mobs/sounds/attributes.txt | 4 + .../mcl_mobs/sounds/default_punch.1.ogg | Bin 0 -> 12658 bytes .../mcl_mobs/sounds/default_punch.2.ogg | Bin 0 -> 12801 bytes .../mcl_mobs/sounds/default_punch.3.ogg | Bin 0 -> 12943 bytes .../mcl_mobs/sounds/default_punch.ogg | Bin 5946 -> 0 bytes mods/ENTITIES/mcl_mobs/todo.txt | 1 + mods/ENTITIES/mobs_mc/0_gameconfig.lua | 2 + mods/ENTITIES/mobs_mc/bat.lua | 5 +- mods/ENTITIES/mobs_mc/blaze.lua | 33 +- mods/ENTITIES/mobs_mc/chicken.lua | 103 +- mods/ENTITIES/mobs_mc/cow+mooshroom.lua | 115 +- mods/ENTITIES/mobs_mc/creeper.lua | 50 +- mods/ENTITIES/mobs_mc/ender_dragon.lua | 20 +- mods/ENTITIES/mobs_mc/enderman.lua | 44 +- mods/ENTITIES/mobs_mc/endermite.lua | 3 + mods/ENTITIES/mobs_mc/ghast.lua | 52 +- mods/ENTITIES/mobs_mc/guardian.lua | 2 +- mods/ENTITIES/mobs_mc/guardian_elder.lua | 2 +- mods/ENTITIES/mobs_mc/horse.lua | 105 +- mods/ENTITIES/mobs_mc/iron_golem.lua | 7 +- mods/ENTITIES/mobs_mc/llama.lua | 131 +- mods/ENTITIES/mobs_mc/models/attributes.txt | 1 + .../ENTITIES/mobs_mc/models/mobs_mc_ghast.b3d | Bin 75657 -> 69843 bytes mods/ENTITIES/mobs_mc/ocelot.lua | 8 +- mods/ENTITIES/mobs_mc/parrot.lua | 7 +- mods/ENTITIES/mobs_mc/pig.lua | 108 +- mods/ENTITIES/mobs_mc/polar_bear.lua | 2 +- mods/ENTITIES/mobs_mc/rabbit.lua | 67 +- mods/ENTITIES/mobs_mc/sheep.lua | 102 +- mods/ENTITIES/mobs_mc/shulker.lua | 2 +- mods/ENTITIES/mobs_mc/silverfish.lua | 2 +- mods/ENTITIES/mobs_mc/skeleton+stray.lua | 30 +- mods/ENTITIES/mobs_mc/skeleton_wither.lua | 2 +- mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 10 +- .../mobs_mc/sounds/mobs_mc_villager.4.ogg | Bin 10341 -> 14731 bytes .../mobs_mc/sounds/mobs_mc_villager.5.ogg | Bin 14731 -> 11187 bytes .../mobs_mc/sounds/mobs_mc_villager.6.ogg | Bin 11187 -> 11068 bytes .../mobs_mc/sounds/mobs_mc_villager.7.ogg | Bin 11068 -> 0 bytes .../sounds/mobs_mc_villager_hurt.1.ogg | Bin 0 -> 10341 bytes mods/ENTITIES/mobs_mc/spider.lua | 13 +- mods/ENTITIES/mobs_mc/squid.lua | 5 +- .../mobs_mc/textures/mobs_mc_llama_chest.png | Bin 0 -> 20594 bytes .../textures/mobs_mc_llama_decor_black.png | Bin 0 -> 4602 bytes .../textures/mobs_mc_llama_decor_blue.png | Bin 0 -> 6585 bytes .../textures/mobs_mc_llama_decor_brown.png | Bin 0 -> 6231 bytes .../textures/mobs_mc_llama_decor_cyan.png | Bin 0 -> 7612 bytes .../textures/mobs_mc_llama_decor_gray.png | Bin 0 -> 5236 bytes .../textures/mobs_mc_llama_decor_green.png | Bin 0 -> 5809 bytes .../mobs_mc_llama_decor_light_blue.png | Bin 0 -> 7643 bytes .../mobs_mc_llama_decor_light_gray.png | Bin 0 -> 6354 bytes .../textures/mobs_mc_llama_decor_lime.png | Bin 0 -> 7388 bytes .../textures/mobs_mc_llama_decor_magenta.png | Bin 0 -> 7352 bytes .../textures/mobs_mc_llama_decor_orange.png | Bin 0 -> 7396 bytes .../textures/mobs_mc_llama_decor_pink.png | Bin 0 -> 7732 bytes .../textures/mobs_mc_llama_decor_purple.png | Bin 0 -> 5790 bytes .../textures/mobs_mc_llama_decor_red.png | Bin 0 -> 6659 bytes .../textures/mobs_mc_llama_decor_white.png | Bin 0 -> 6866 bytes .../textures/mobs_mc_llama_decor_yellow.png | Bin 0 -> 7571 bytes .../mobs_mc/textures/mobs_mc_spit.png | Bin 0 -> 677 bytes mods/ENTITIES/mobs_mc/vex.lua | 2 +- mods/ENTITIES/mobs_mc/villager.lua | 6 +- mods/ENTITIES/mobs_mc/villager_evoker.lua | 2 +- mods/ENTITIES/mobs_mc/villager_illusioner.lua | 4 +- mods/ENTITIES/mobs_mc/villager_vindicator.lua | 2 +- mods/ENTITIES/mobs_mc/villager_zombie.lua | 7 +- mods/ENTITIES/mobs_mc/witch.lua | 2 +- mods/ENTITIES/mobs_mc/wither.lua | 2 +- mods/ENTITIES/mobs_mc/wolf.lua | 43 +- mods/ENTITIES/mobs_mc/zombie.lua | 26 +- mods/ENTITIES/mobs_mc/zombiepig.lua | 21 +- 91 files changed, 7120 insertions(+), 3331 deletions(-) create mode 100644 mods/ENTITIES/mcl_mobs/api/api.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/attack_type_instructions.lua rename mods/ENTITIES/mcl_mobs/{api.lua => api/mob_functions/backup_code_api.lua} (55%) create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/projectile_handling.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua create mode 100644 mods/ENTITIES/mcl_mobs/api/mob_functions/sound_handling.lua rename mods/ENTITIES/mcl_mobs/{ => api}/mount.lua (92%) rename mods/ENTITIES/mcl_mobs/{ => api}/spawning.lua (67%) delete mode 100644 mods/ENTITIES/mcl_mobs/lucky_block.lua create mode 100644 mods/ENTITIES/mcl_mobs/sounds/attributes.txt create mode 100644 mods/ENTITIES/mcl_mobs/sounds/default_punch.1.ogg create mode 100644 mods/ENTITIES/mcl_mobs/sounds/default_punch.2.ogg create mode 100644 mods/ENTITIES/mcl_mobs/sounds/default_punch.3.ogg delete mode 100644 mods/ENTITIES/mcl_mobs/sounds/default_punch.ogg create mode 100644 mods/ENTITIES/mcl_mobs/todo.txt create mode 100644 mods/ENTITIES/mobs_mc/models/attributes.txt delete mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.7.ogg create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_hurt.1.ogg create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_chest.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_black.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_blue.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_brown.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_cyan.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_gray.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_green.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_blue.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_gray.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_lime.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_magenta.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_orange.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_pink.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_purple.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_red.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_white.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_yellow.png create mode 100644 mods/ENTITIES/mobs_mc/textures/mobs_mc_spit.png diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index eda74aeb4..2d8cef5b0 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -502,20 +502,6 @@ and damages any entity caught inside the blast radius. Protection will limit node destruction but not entity damage. -mobs:capture_mob ----------------- - -mobs:capture_mob(...) - -Does nothing and returns false. - -This function is provided for compability with Mobs Redo for an attempt to -capture a mob. -Mobs cannot be captured in MineClone 2. - -In Mobs Redo, this is generally called inside the on_rightclick section of the mob -api code, it provides a chance of capturing the mob. See Mobs Redo documentation -of parameters. Feeding and Taming/Breeding --------------------------- @@ -535,19 +521,6 @@ Will return true when mob is fed with item it likes. them up -Protecting Mobs ---------------- - -mobs:protect(self, clicker) - -This function can be used to right-click any tamed mob with mobs:protector item, -this will protect the mob from harm inside of a protected area from other -players. Will return true when mob right-clicked with mobs:protector item. - - 'self' mob information - 'clicker' player information - - Riding Mobs ----------- @@ -605,7 +578,7 @@ Note: animation names above are from the pre-defined animation lists inside mob registry without extensions. -mobs:set_animation(self, name) +mobs.set_mob_animation(self, name) This function sets the current animation for mob, defaulting to "stand" if not found. @@ -781,8 +754,5 @@ mobs:register_mob("mob_horse:horse", { inv:remove_item("main", "mobs:saddle") end end - - -- used to capture horse with magic lasso - mobs:capture_mob(self, clicker, 0, 0, 80, false, nil) end }) diff --git a/mods/ENTITIES/mcl_mobs/api/api.lua b/mods/ENTITIES/mcl_mobs/api/api.lua new file mode 100644 index 000000000..d413bae72 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/api.lua @@ -0,0 +1,761 @@ +-- API for Mobs Redo: MineClone 2 Delux 2.0 DRM Free Early Access Super Extreme Edition + +-- mobs library +mobs = {} + +-- lua locals - can grab from this to easily plop them into the api lua files + +--localize minetest functions +local minetest_settings = minetest.settings +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_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_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_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_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 + +-- 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 + +-- 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 + +-- mob constants +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 GRAVITY = minetest_settings:get("movement_gravity")-- + 9.81 + + +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 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) + +-- 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 + +-- default nodes +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") ~= 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 + + +-- random locals I found +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 + + +-- creative check +function mobs.is_creative(name) + return minetest_is_creative_enabled(name) +end + + +local atan = function(x) + if not x or x ~= x then + return 0 + else + return math_atan(x) + end +end + + + + +-- Shows helpful debug info above each mob +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 + minetest.register_on_joinplayer(function(player) + minetest.chat_send_player(player:get_player_name(), + S("Peaceful mode active! No monsters will spawn.")) + end) +end + + +local api_path = minetest.get_modpath(minetest.get_current_modname()).."/api/mob_functions/" + +--ignite all parts of the api +dofile(api_path .. "ai.lua") +dofile(api_path .. "animation.lua") +dofile(api_path .. "collision.lua") +dofile(api_path .. "environment.lua") +dofile(api_path .. "interaction.lua") +dofile(api_path .. "movement.lua") +dofile(api_path .. "set_up.lua") +dofile(api_path .. "attack_type_instructions.lua") +dofile(api_path .. "sound_handling.lua") +dofile(api_path .. "death_logic.lua") +dofile(api_path .. "mob_effects.lua") +dofile(api_path .. "projectile_handling.lua") +dofile(api_path .. "breeding.lua") +dofile(api_path .. "head_logic.lua") + + +mobs.spawning_mobs = {} + + + + +-- register mob entity +function mobs:register_mob(name, def) + + local collisionbox = def.collisionbox or {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25} + + -- Workaround for : + -- Increase upper Y limit to avoid mobs glitching through solid nodes. + -- FIXME: Remove workaround if it's no longer needed. + + if collisionbox[5] < 0.79 then + collisionbox[5] = 0.79 + end + + mobs.spawning_mobs[name] = true + + local function scale_difficulty(value, default, min, special) + if (not value) or (value == default) or (value == special) then + return default + else + return math_max(min, value * difficulty) + end + end + + minetest.register_entity(name, { + description = def.description, + use_texture_alpha = def.use_texture_alpha, + stepheight = def.stepheight or 0.6, + stepheight_backup = def.stepheight or 0.6, + name = name, + type = def.type, + attack_type = def.attack_type, + fly = def.fly, + fly_in = def.fly_in or {"air", "__airlike"}, + owner = def.owner or "", + order = def.order or "", + on_die = def.on_die, + spawn_small_alternative = def.spawn_small_alternative, + do_custom = def.do_custom, + jump_height = def.jump_height or 4, -- was 6 + rotate = def.rotate or 0, -- 0=front, 90=side, 180=back, 270=side2 + hp_min = scale_difficulty(def.hp_min, 5, 1), + hp_max = scale_difficulty(def.hp_max, 10, 1), + xp_min = def.xp_min or 1, + xp_max = def.xp_max or 5, + breath_max = def.breath_max or 6, + breathes_in_water = def.breathes_in_water or false, + physical = true, + collisionbox = collisionbox, + collide_with_objects = def.collide_with_objects or false, + selectionbox = def.selectionbox or def.collisionbox, + visual = def.visual, + visual_size = def.visual_size or {x = 1, y = 1}, + mesh = def.mesh, + makes_footstep_sound = def.makes_footstep_sound or false, + view_range = def.view_range or 16, + walk_velocity = def.walk_velocity or 1, + run_velocity = def.run_velocity or 2, + damage = scale_difficulty(def.damage, 0, 0), + light_damage = def.light_damage or 0, + sunlight_damage = def.sunlight_damage or 0, + water_damage = def.water_damage or 0, + lava_damage = def.lava_damage or 8, + fire_damage = def.fire_damage or 1, + suffocation = def.suffocation or true, + fall_damage = def.fall_damage or 1, + fall_speed = def.fall_speed or DEFAULT_FALL_SPEED, -- must be lower than -2 + drops = def.drops or {}, + armor = def.armor or 100, + on_rightclick = mobs.create_mob_on_rightclick(def.on_rightclick), + arrow = def.arrow, + shoot_interval = def.shoot_interval, + sounds = def.sounds or {}, + animation = def.animation, + jump = def.jump ~= false, + walk_chance = def.walk_chance or 50, + attacks_monsters = def.attacks_monsters or false, + group_attack = def.group_attack or false, + passive = def.passive or false, + knock_back = def.knock_back ~= false, + shoot_offset = def.shoot_offset or 0, + floats = def.floats or 1, -- floats in water by default + floats_on_lava = def.floats_on_lava or 0, + replace_rate = def.replace_rate, + replace_what = def.replace_what, + replace_with = def.replace_with, + replace_offset = def.replace_offset or 0, + on_replace = def.on_replace, + timer = 0, + state_timer = 0, + env_damage_timer = 0, + tamed = false, + pause_timer = 0, + gotten = false, + reach = def.reach or 3, + htimer = 0, + texture_list = def.textures, + child_texture = def.child_texture, + docile_by_day = def.docile_by_day or false, + time_of_day = 0.5, + fear_height = def.fear_height or 0, + runaway = def.runaway, + runaway_timer = 0, + pathfinding = def.pathfinding, + immune_to = def.immune_to or {}, + explosion_radius = def.explosion_radius, -- LEGACY + explosion_damage_radius = def.explosion_damage_radius, -- LEGACY + explosiontimer_reset_radius = def.explosiontimer_reset_radius, + explosion_timer = def.explosion_timer or 3, + allow_fuse_reset = def.allow_fuse_reset ~= false, + stop_to_explode = def.stop_to_explode ~= false, + custom_attack = def.custom_attack, + double_melee_attack = def.double_melee_attack, + dogshoot_switch = def.dogshoot_switch, + dogshoot_count = 0, + dogshoot_count_max = def.dogshoot_count_max or 5, + dogshoot_count2_max = def.dogshoot_count2_max or (def.dogshoot_count_max or 5), + attack_animals = def.attack_animals or false, + specific_attack = def.specific_attack, + runaway_from = def.runaway_from, + owner_loyal = def.owner_loyal, + facing_fence = false, + + _cmi_is_mob = true, + + pushable = def.pushable or true, + + --j4i stuff + yaw = 0, + automatic_face_movement_dir = def.rotate or 0, -- 0=front, 90=side, 180=back, 270=side2 + automatic_face_movement_max_rotation_per_sec = 360, --degrees + backface_culling = true, + walk_timer = 0, + stand_timer = 0, + current_animation = "", + gravity = GRAVITY, + swim = def.swim, + swim_in = def.swim_in or {mobs_mc.items.water_source, "mcl_core:water_flowing", mobs_mc.items.river_water_source}, + pitch_switch = "static", + jump_only = def.jump_only, + hostile = def.hostile, + neutral = def.neutral, + attacking = nil, + visual_size_origin = def.visual_size or {x = 1, y = 1, z = 1}, + punch_timer_cooloff = def.punch_timer_cooloff or 0.5, + death_animation_timer = 0, + hostile_cooldown = def.hostile_cooldown or 15, + tilt_fly = def.tilt_fly, + tilt_swim = def.tilt_swim, + fall_slow = def.fall_slow, + projectile_cooldown_min = def.projectile_cooldown_min or 2, + projectile_cooldown_max = def.projectile_cooldown_max or 6, + skittish = def.skittish, + + minimum_follow_distance = def.minimum_follow_distance or 0.5, --make mobs not freak out when underneath + + memory = 0, -- memory timer if chasing/following + fly_random_while_attack = def.fly_random_while_attack, + + --for spiders + always_climb = def.always_climb, + + --despawn mechanic variables + lifetimer_reset = 30, --30 seconds + lifetimer = 30, --30 seconds + + --breeding stuff + breed_timer = 0, + breed_lookout_timer = 0, + breed_distance = def.breed_distance or 1.5, --how far away mobs have to be to begin actual breeding + breed_lookout_timer_goal = 30, --30 seconds (this timer is for how long the mob looks for a mate) + breed_timer_cooloff = 5*60, -- 5 minutes (this timer is for how long the mob has to wait before being bred again) + bred = false, + follow = def.follow, --this item is also used for the breeding mechanism + follow_distance = def.follow_distance or 2, + baby_size = def.baby_size or 0.5, + baby = false, + grow_up_timer = 0, + grow_up_goal = 20*60, --in 20 minutes the mob grows up + special_breed_timer = 0, --this is used for the AHEM AHEM part of breeding + + backup_visual_size = def.visual_size, + backup_collisionbox = collisionbox, + backup_selectionbox = def.selectionbox or def.collisionbox, + + + --fire timer + burn_timer = 0, + + ignores_cobwebs = def.ignores_cobwebs, + breath = def.breath_max or 6, + + 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) + has_head = def.has_head or false, + --head_bone is the actual bone in the model which the head + --is attached to for animation + head_bone = def.head_bone or "head", + + --this part controls the base position of the head calculations + --localized to the mob's visual yaw when gotten (self.object:get_yaw()) + --you can enable the debug in /mob_functions/head_logic.lua by uncommenting the + --particle spawner code + head_height_offset = def.head_height_offset or 1.0525, + head_direction_offset = def.head_direction_offset or 0.5, + + --this part controls the visual of the head + head_bone_pos_y = def.head_bone_pos_y or 3.6, + head_bone_pos_z = def.head_bone_pos_z or -0.6, + head_pitch_modifier = def.head_pitch_modifier or 0, + + --these variables are switches in case the model + --moves the wrong way + swap_y_with_x = def.swap_y_with_x or false, + reverse_head_yaw = def.reverse_head_yaw or false, + + --END HEAD CODE VARIABLES + + --end j4i stuff + + -- MCL2 extensions + teleport = mobs.teleport, + do_teleport = def.do_teleport, + spawn_class = def.spawn_class, + ignores_nametag = def.ignores_nametag or false, + rain_damage = def.rain_damage or 0, + glow = def.glow, + --can_despawn = can_despawn, + child = def.child or false, + texture_mods = {}, + shoot_arrow = def.shoot_arrow, + sounds_child = def.sounds_child, + explosion_strength = def.explosion_strength, + suffocation_timer = 0, + follow_velocity = def.follow_velocity or 2.4, + instant_death = def.instant_death or false, + fire_resistant = def.fire_resistant or false, + fire_damage_resistant = def.fire_damage_resistant or false, + ignited_by_sunlight = def.ignited_by_sunlight or false, + eye_height = def.eye_height or 1.5, + defuse_reach = def.defuse_reach or 4, + -- End of MCL2 extensions + + on_spawn = def.on_spawn, + + --on_blast = def.on_blast or do_tnt, + + on_step = mobs.mob_step, + + --do_punch = def.do_punch, + + on_punch = mobs.mob_punch, + + --on_breed = def.on_breed, + + --on_grown = def.on_grown, + + --on_detach_child = mob_detach_child, + + on_activate = function(self, staticdata, dtime) + self.object:set_acceleration(vector_new(0,-GRAVITY, 0)) + return mobs.mob_activate(self, staticdata, def, dtime) + end, + + get_staticdata = function(self) + return mobs.mob_staticdata(self) + end, + + --harmed_by_heal = def.harmed_by_heal, + }) + + if minetest_get_modpath("doc_identifier") ~= nil then + doc.sub.identifier.register_object(name, "basics", "mobs") + end + +end -- END mobs:register_mob function + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +-- register arrow for shoot attack +function mobs:register_arrow(name, def) + + -- errorcheck + if not name or not def then + print("failed to register arrow entity") + return + end + + minetest.register_entity(name.."_entity", { + + physical = false, + visual = def.visual, + visual_size = def.visual_size, + textures = def.textures, + velocity = def.velocity, + hit_player = def.hit_player, + hit_node = def.hit_node, + hit_mob = def.hit_mob, + hit_object = def.hit_object, + drop = def.drop or false, -- drops arrow as registered item when true + collisionbox = {0, 0, 0, 0, 0, 0}, -- remove box around arrows + timer = 0, + switch = 0, + owner_id = def.owner_id, + rotate = def.rotate, + speed = def.speed or nil, + on_step = function(self) + + local vel = self.object:get_velocity() + + local pos = self.object:get_pos() + + if self.timer > 150 + or not mobs.within_limits(pos, 0) then + mcl_burning.extinguish(self.object) + self.object:remove(); + return + end + + -- does arrow have a tail (fireball) + if def.tail + and def.tail == 1 + and def.tail_texture then + + --do this to prevent clipping through main entity sprite + 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) + minetest.add_particle({ + pos = new_pos, + velocity = {x = 0, y = 0, z = 0}, + acceleration = {x = 0, y = 0, z = 0}, + expirationtime = def.expire or 0.25, + collisiondetection = false, + texture = def.tail_texture, + size = def.tail_size or 5, + glow = def.glow or 0, + }) + end + + if self.hit_node then + + local node = minetest_get_node(pos).name + + if minetest_registered_nodes[node].walkable then + + self.hit_node(self, pos, node) + + if self.drop == true then + + pos.y = pos.y + 1 + + self.lastpos = (self.lastpos or pos) + + minetest_add_item(self.lastpos, self.object:get_luaentity().name) + end + + self.object:remove(); + + return + end + end + + if self.hit_player or self.hit_mob or self.hit_object then + + for _,player in pairs(minetest_get_objects_inside_radius(pos, 1.5)) do + + if self.hit_player + and player:is_player() then + + if self.hit_player then + self.hit_player(self, player) + else + mobs.arrow_hit(self, player) + end + + self.object:remove(); + return + end + + --[[ + local entity = player:get_luaentity() + + if entity + and self.hit_mob + and entity._cmi_is_mob == true + and tostring(player) ~= self.owner_id + and entity.name ~= self.object:get_luaentity().name + and (self._shooter and entity.name ~= self._shooter:get_luaentity().name) then + + --self.hit_mob(self, player) + self.object:remove(); + return + end + ]]-- + + --[[ + if entity + and self.hit_object + and (not entity._cmi_is_mob) + and tostring(player) ~= self.owner_id + and entity.name ~= self.object:get_luaentity().name + and (self._shooter and entity.name ~= self._shooter:get_luaentity().name) then + + --self.hit_object(self, player) + self.object:remove(); + return + end + ]]-- + end + end + + self.lastpos = pos + end + }) +end + +-- Register spawn eggs + +-- Note: This also introduces the “spawn_egg” group: +-- * spawn_egg=1: Spawn egg (generic mob, no metadata) +-- * spawn_egg=2: Spawn egg (captured/tamed mob, metadata) +function mobs:register_egg(mob, desc, background, addegg, no_creative) + + local grp = {spawn_egg = 1} + + -- do NOT add this egg to creative inventory (e.g. dungeon master) + if no_creative == true then + grp.not_in_creative_inventory = 1 + end + + local invimg = background + + if addegg == 1 then + invimg = "mobs_chicken_egg.png^(" .. invimg .. + "^[mask:mobs_chicken_egg_overlay.png)" + end + + -- register old stackable mob egg + minetest.register_craftitem(mob, { + + description = desc, + inventory_image = invimg, + groups = grp, + + _doc_items_longdesc = S("This allows you to place a single mob."), + _doc_items_usagehelp = S("Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns."), + + on_place = function(itemstack, placer, pointed_thing) + + local pos = pointed_thing.above + + -- am I clicking on something with existing on_rightclick function? + local under = minetest_get_node(pointed_thing.under) + local def = minetest_registered_nodes[under.name] + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, under, placer, itemstack) + end + + if pos + --and within_limits(pos, 0) + and not minetest_is_protected(pos, placer:get_player_name()) then + + local name = placer:get_player_name() + local privs = minetest.get_player_privs(name) + if mod_mobspawners and under.name == "mcl_mobspawners:spawner" then + if minetest_is_protected(pointed_thing.under, name) then + minetest.record_protection_violation(pointed_thing.under, name) + return itemstack + end + if not privs.maphack then + minetest.chat_send_player(name, S("You need the “maphack” privilege to change the mob spawner.")) + return itemstack + end + mcl_mobspawners.setup_spawner(pointed_thing.under, itemstack:get_name()) + if not mobs.is_creative(name) then + itemstack:take_item() + end + return itemstack + end + + if not minetest_registered_entities[mob] then + return itemstack + end + + if minetest_settings:get_bool("only_peaceful_mobs", false) + and minetest_registered_entities[mob].type == "monster" then + minetest.chat_send_player(name, S("Only peaceful mobs allowed!")) + return itemstack + end + + local mob = minetest_add_entity(pos, mob) + minetest.log("action", "Mob spawned: "..name.." at "..minetest.pos_to_string(pos)) + local ent = mob:get_luaentity() + + -- don't set owner if monster or sneak pressed + --[[ + if ent.type ~= "monster" + and not placer:get_player_control().sneak then + ent.owner = placer:get_player_name() + ent.tamed = true + end + ]]-- + + -- set nametag + local nametag = itemstack:get_meta():get_string("name") + if nametag ~= "" then + if string.len(nametag) > MAX_MOB_NAME_LENGTH then + nametag = string.sub(nametag, 1, MAX_MOB_NAME_LENGTH) + end + ent.nametag = nametag + update_tag(ent) + end + + -- if not in creative then take item + if not mobs.is_creative(placer:get_player_name()) then + itemstack:take_item() + end + end + + return itemstack + end, + }) + +end + + diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua new file mode 100644 index 000000000..eda7e8871 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/ai.lua @@ -0,0 +1,1153 @@ +local math_random = math.random +local math_pi = math.pi +local math_floor = math.floor +local math_round = math.round + +local vector_multiply = vector.multiply +local vector_add = vector.add +local vector_new = vector.new +local vector_distance = vector.distance + +local minetest_yaw_to_dir = minetest.yaw_to_dir +local minetest_get_item_group = minetest.get_item_group +local minetest_get_node = minetest.get_node +local minetest_line_of_sight = minetest.line_of_sight +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) + self.yaw = self.yaw + THIRTY_SECONDTH_PI + if self.yaw > DOUBLE_PI then + self.yaw = self.yaw - DOUBLE_PI + end +end + +--a simple helper function for rounding +--http://lua-users.org/wiki/SimpleRound +function round2(num, numDecimalPlaces) + return tonumber(string.format("%." .. (numDecimalPlaces or 0) .. "f", num)) +end + + +--[[ + _ _ +| | | | +| | __ _ _ __ __| | +| | / _` | '_ \ / _` | +| |___| (_| | | | | (_| | +\_____/\__,_|_| |_|\__,_| +]]-- + +--this is basically reverse jump_check +local cliff_check = function(self,dtime) + --mobs will flip out if they are falling without this + if self.object:get_velocity().y ~= 0 then + return false + end + + local pos = self.object:get_pos() + 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) + + local free_fall, blocker = 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) + + --do math before sure not attacking, following, or running away so continue + --doing random walking for mobs if all states are not met + self.state_timer = self.state_timer - dtime + + --only run away + if self.skittish and self.state == "run" then + self.run_timer = self.run_timer - dtime + if self.run_timer > 0 then + return + end + --continue + end + + --ignore everything else if breeding + if self.breed_lookout_timer and self.breed_lookout_timer > 0 then + self.state = "breed" + return + --reset the state timer to get the mob out of + --the breed state + elseif self.state == "breed" then + self.state_timer = 0 + 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 + (not self.breed_timer or (self.breed_timer and self.breed_timer == 0)) then + self.state = "follow" + return + --reset the state timer to get the mob out of + --the follow state - not the cleanest option + --but the easiest + elseif self.state == "follow" then + self.state_timer = 0 + end + + --only attack + if self.hostile and self.attacking then + self.state = "attack" + return + end + + --if finally reached here then do random wander + if self.state_timer <= 0 then + self.state_timer = math.random(4,10) + math.random() + self.state = land_state_list_wandering[math.random(1,#land_state_list_wandering)] + end + +end + +-- states are executed here +local land_state_execution = function(self,dtime) + + --[[ -- this is a debug which shows the timer and makes mobs breed 100 times faster + print(self.breed_timer) + if self.breed_timer > 0 then + self.breed_timer = self.breed_timer - (dtime * 100) + if self.breed_timer <= 0 then + self.breed_timer = 0 + end + end + ]]-- + + --no collisionbox exception + 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 + self.breed_lookout_timer = self.breed_lookout_timer - dtime + --looking for mate failed + if self.breed_lookout_timer <= 0 then + self.breed_lookout_timer = 0 + end + end + + --cool off after breeding + if self.breed_timer and self.breed_timer > 0 then + self.breed_timer = self.breed_timer - dtime + --do this to skip the first check, using as switch + if self.breed_timer <= 0 then + self.breed_timer = 0 + end + end + + + local pos = self.object:get_pos() + local collisionbox = self.object:get_properties().collisionbox + --get the center of the mob + pos.y = pos.y + (collisionbox[2] + collisionbox[5] / 2) + local current_node = minetest_get_node(pos).name + local float_now = false + + --recheck if in water or lava + if minetest_get_item_group(current_node, "water") ~= 0 or minetest_get_item_group(current_node, "lava") ~= 0 then + float_now = true + end + + --make slow falling mobs fall slow + if self.fall_slow then + local velocity = self.object:get_velocity() + if velocity then + 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)) + 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)) + end + end + end + end + + --calculate fall damage + if self.fall_damage then + mobs.calculate_fall_damage(self) + end + + if self.state == "stand" then + + --do animation + mobs.set_mob_animation(self, "stand") + + --set the velocity of the mob + mobs.set_velocity(self,0) + + --animation fixes for explosive mobs + if self.attack_type == "explode" then + mobs.reverse_explosion_animation(self,dtime) + end + + mobs.lock_yaw(self) + 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_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 + mobs.set_mob_animation(self, "run") + mobs.set_velocity(self,self.run_velocity) + + if mobs.jump_check(self) == 1 then + mobs.jump(self) + end + else + mobs.set_mob_animation(self, "stand") + mobs.set_velocity(self,0) + end + + elseif self.state == "walk" 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)) + end + + --do animation + mobs.set_mob_animation(self, "walk") + + --enable rotation locking + mobs.movement_rotation_lock(self) + + --check for nodes to jump over + 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) + 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) + --stop the mob so it doesn't fall off + mobs.set_velocity(self,0) + end + + --only move forward if path is clear + if node_in_front_of == 0 or node_in_front_of == 1 then + --set the velocity of the mob + mobs.set_velocity(self,self.walk_velocity) + end + + --animation fixes for explosive mobs + if self.attack_type == "explode" then + mobs.reverse_explosion_animation(self,dtime) + end + + elseif self.state == "run" then + + --do animation + mobs.set_mob_animation(self, "run") + + --enable rotation locking + mobs.movement_rotation_lock(self) + + --check for nodes to jump over + 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) + 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) + --stop the mob so it doesn't fall off + mobs.set_velocity(self,0) + end + + --only move forward if path is clear + if node_in_front_of == 0 or node_in_front_of == 1 then + --set the velocity of the mob + mobs.set_velocity(self,self.run_velocity) + end + + elseif self.state == "attack" then + + --execute mob attack type + if self.attack_type == "explode" then + + mobs.explode_attack_walk(self, dtime) + + elseif self.attack_type == "punch" then + + mobs.punch_attack_walk(self,dtime) + + elseif self.attack_type == "projectile" then + + mobs.projectile_attack_walk(self,dtime) + + end + elseif self.state == "breed" then + + mobs.breeding_effect(self) + + local mate = mobs.look_for_mate(self) + + --found a mate + if mate then + mobs.set_yaw_while_breeding(self,mate) + mobs.set_velocity(self, self.walk_velocity) + + --smoosh together basically + 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 + end + + self.special_breed_timer = self.special_breed_timer - dtime + if self.special_breed_timer <= 0 then + + --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})) + + mobs.play_sound_specific(self,"item_drop_pickup") + + self.special_breed_timer = 0 + self.breed_lookout_timer = 0 + self.breed_timer = self.breed_timer_cooloff + + mate:get_luaentity().special_breed_timer = 0 + mate:get_luaentity().breed_lookout_timer = 0 + mate:get_luaentity().breed_timer = self.breed_timer_cooloff -- can reuse because it's the same mob + end + else + mobs.set_mob_animation(self, "walk") + end + --couldn't find a mate, just stand there until the player pushes it towards one + --or the timer runs out + else + mobs.set_mob_animation(self, "stand") + mobs.set_velocity(self,0) + 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)) + end + end +end + + + + +--[[ + _____ _ +/ ___| (_) +\ `--.__ ___ _ __ ___ + `--. \ \ /\ / / | '_ ` _ \ +/\__/ /\ V V /| | | | | | | +\____/ \_/\_/ |_|_| |_| |_| +]]-- + + + +-- state switching logic (stand, walk, run, attacks) +local swim_state_list_wandering = {"stand", "swim"} + +local swim_state_switch = function(self, dtime) + self.state_timer = self.state_timer - dtime + if self.state_timer <= 0 then + self.state_timer = math.random(4,10) + math.random() + self.state = swim_state_list_wandering[math.random(1,#swim_state_list_wandering)] + end +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 collisionbox = self.object:get_properties().collisionbox + local radius = collisionbox[4] + 0.5 + + vector_multiply(dir, radius) + + 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 + +--this is to swap the built in engine acceleration modifier +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)) + --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)) + end +end + + +local random_pitch_multiplier = {-1,1} +-- states are executed here +local swim_state_execution = function(self,dtime) + + local pos = self.object:get_pos() + + pos.y = pos.y + self.object:get_properties().collisionbox[5] + local current_node = minetest_get_node(pos).name + local inside_swim_node = false + + --quick scan everything to see if inside swim node + for _,id in pairs(self.swim_in) do + if id == current_node then + inside_swim_node = true + break + end + end + + --turn gravity on or off + swim_physics_swapper(self,inside_swim_node) + + --swim properly if inside swim node + if inside_swim_node then + + if self.state == "stand" then + + --do animation + mobs.set_mob_animation(self, "stand") + + mobs.set_swim_velocity(self,0) + + if self.tilt_swim then + mobs.set_static_pitch(self) + 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)) + + --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)] + end + + --do animation + mobs.set_mob_animation(self, "walk") + + --do a quick turn to make mob continuously move + --if in a fish tank or something + if swim_turn_check(self,dtime) then + quick_rotate(self,dtime) + end + + mobs.set_swim_velocity(self,self.walk_velocity) + + --only enable tilt swimming if enabled + if self.tilt_swim then + mobs.set_dynamic_pitch(self) + end + + --enable rotation locking + mobs.movement_rotation_lock(self) + end + --flop around if not inside swim node + else + --do animation + mobs.set_mob_animation(self, "stand") + + mobs.flop(self) + + if self.tilt_swim then + mobs.set_static_pitch(self) + end + end + +end + + +--[[ +______ _ +| ___| | +| |_ | |_ _ +| _| | | | | | +| | | | |_| | +\_| |_|\__, | + __/ | + |___/ +]]-- + +-- state switching logic (stand, walk, run, attacks) +local fly_state_list_wandering = {"stand", "fly"} + +local fly_state_switch = function(self, dtime) + + if self.hostile and self.attacking then + self.state = "attack" + return + end + + self.state_timer = self.state_timer - dtime + if self.state_timer <= 0 then + self.state_timer = math.random(4,10) + math.random() + self.state = fly_state_list_wandering[math.random(1,#fly_state_list_wandering)] + end +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 collisionbox = self.object:get_properties().collisionbox + local radius = collisionbox[4] + 0.5 + + vector_multiply(dir, radius) + + 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 + +--this is to swap the built in engine acceleration modifier +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)) + --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)) + end +end + + +local random_pitch_multiplier = {-1,1} +-- states are executed here +local fly_state_execution = function(self,dtime) + local pos = self.object:get_pos() + pos.y = pos.y + 0.1 + local current_node = minetest_get_node(pos).name + local inside_fly_node = minetest_get_item_group(current_node, "solid") == 0 + + local float_now = false + --recheck if in water or lava + if minetest_get_item_group(current_node, "water") ~= 0 or minetest_get_item_group(current_node, "lava") ~= 0 then + inside_fly_node = false + float_now = true + end + + --turn gravity on or off + fly_physics_swapper(self,inside_fly_node) + + --fly properly if inside fly node + if inside_fly_node then + if self.state == "stand" then + + --do animation + mobs.set_mob_animation(self, "stand") + + mobs.set_fly_velocity(self,0) + + if self.tilt_fly then + mobs.set_static_pitch(self) + end + + mobs.lock_yaw(self) + + elseif self.state == "fly" 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)) + + --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)] + end + + --do animation + mobs.set_mob_animation(self, "walk") + + --do a quick turn to make mob continuously move + --if in a bird cage or something + if fly_turn_check(self,dtime) then + quick_rotate(self,dtime) + end + + if self.tilt_fly then + mobs.set_dynamic_pitch(self) + end + + mobs.set_fly_velocity(self,self.walk_velocity) + + --enable rotation locking + mobs.movement_rotation_lock(self) + + elseif self.state == "attack" then + + --execute mob attack type + --if self.attack_type == "explode" then + + --mobs.explode_attack_fly(self, dtime) + + --elseif self.attack_type == "punch" then + + --mobs.punch_attack_fly(self,dtime) + + if self.attack_type == "projectile" then + + mobs.projectile_attack_fly(self,dtime) + + end + end + else + --make the mob float + if self.floats and float_now then + mobs.set_velocity(self, 0) + + mobs.float(self) + + if self.tilt_fly then + mobs.set_static_pitch(self) + end + end + end +end + + +--[[ + ___ + |_ | + | |_ _ _ __ ___ _ __ + | | | | | '_ ` _ \| '_ \ +/\__/ / |_| | | | | | | |_) | +\____/ \__,_|_| |_| |_| .__/ + | | + |_| +]]-- + + +--check if a mob needs to turn while jumping +local jump_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 collisionbox = self.object:get_properties().collisionbox + local radius = collisionbox[4] + 0.5 + + vector_multiply(dir, radius) + + 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 + +-- state switching logic (stand, jump, run, attacks) +local jump_state_list_wandering = {"stand", "jump"} + +local jump_state_switch = function(self, dtime) + self.state_timer = self.state_timer - dtime + if self.state_timer <= 0 then + self.state_timer = math.random(4,10) + math.random() + self.state = jump_state_list_wandering[math.random(1,#jump_state_list_wandering)] + end +end + +-- states are executed here +local jump_state_execution = function(self,dtime) + + local pos = self.object:get_pos() + local collisionbox = self.object:get_properties().collisionbox + --get the center of the mob + pos.y = pos.y + (collisionbox[2] + collisionbox[5] / 2) + local current_node = minetest_get_node(pos).name + + local float_now = false + + --recheck if in water or lava + if minetest_get_item_group(current_node, "water") ~= 0 or minetest_get_item_group(current_node, "lava") ~= 0 then + float_now = true + end + + if self.state == "stand" then + + --do animation + mobs.set_mob_animation(self, "stand") + + --set the velocity of the mob + mobs.set_velocity(self,0) + + mobs.lock_yaw(self) + + elseif self.state == "jump" then + + self.walk_timer = self.walk_timer - dtime + + --reset the jump timer + if self.walk_timer <= 0 then + + --re-randomize the jump timer + self.walk_timer = math.random(1,6) + math.random() + + --set the mob into a random direction + self.yaw = (math_random() * (math.pi * 2)) + end + + --do animation + mobs.set_mob_animation(self, "walk") + + --enable rotation locking + mobs.movement_rotation_lock(self) + + --jumping mobs are more loosey goosey + if node_in_front_of == 1 then + quick_rotate(self,dtime) + end + + --only move forward if path is clear + mobs.jump_move(self,self.walk_velocity) + + elseif self.state == "run" then + + print("run") + + elseif self.state == "attack" then + + print("attack") + + end + + if float_now then + mobs.float(self) + end +end + + + + +--[[ +___ ___ _ _ _ +| \/ | (_) | | (_) +| . . | __ _ _ _ __ | | ___ __ _ _ ___ +| |\/| |/ _` | | '_ \ | | / _ \ / _` | |/ __| +| | | | (_| | | | | | | |___| (_) | (_| | | (__ +\_| |_/\__,_|_|_| |_| \_____/\___/ \__, |_|\___| + __/ | + |___/ +]]-- + +--the main loop +mobs.mob_step = function(self, dtime) + + --do not continue if non-existent + if not self or not self.object or not self.object:get_luaentity() then + self.object:remove() + return false + end + + + --DEBUG TIME! + --REMEMBER TO MOVE THIS AFTER DEATH CHECK + + --if self.has_head then + -- mobs.do_head_logic(self,dtime) + --end + + + + --if true then--DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG + -- return + --end + + --despawn mechanism + --don't despawned tamed or bred mobs + if not self.tamed and not self.bred then + self.lifetimer = self.lifetimer - dtime + if self.lifetimer <= 0 then + self.lifetimer = self.lifetimer_reset + if not mobs.check_for_player_within_area(self, 64) then + --print("removing in MAIN LOGIC!") + self.object:remove() + return + end + end + end + + --color modifier which coincides with the pause_timer + 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 + self.old_health = self.health + + --do death logic (animation, poof, explosion, etc) + if self.health <= 0 or self.dead then + --play death sound once + if not self.played_death_sound then + self.dead = true + mobs.play_sound(self,"death") + self.played_death_sound = true + end + + mobs.death_logic(self, dtime) + + --this is here because the mob must continue to move + --while stunned before coming to a complete halt even during + --the death tilt + if self.pause_timer > 0 then + self.pause_timer = self.pause_timer - dtime + --perfectly reset pause_timer + if self.pause_timer < 0 then + self.pause_timer = 0 + end + end + + return + end + + mobs.random_sound_handling(self,dtime) + + --mobs drowning mechanic + if not self.breathes_in_water then + + local pos = self.object:get_pos() + + pos.y = pos.y + self.eye_height + + local node = minetest_get_node(pos).name + + if minetest_get_item_group(node, "water") ~= 0 then + self.breath = self.breath - dtime + + --reset breath when drowning + if self.breath <= 0 then + self.health = self.health - 4 + self.breath = 1 + self.pause_timer = 0.5 + end + + 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 + end + end + end + + --set mobs on fire when burned by sunlight + if self.ignited_by_sunlight then + local pos = self.object:get_pos() + pos.y = pos.y + 0.1 + + if self.burn_timer > 0 then + self.burn_timer = self.burn_timer - dtime + + if self.burn_timer <= 0 then + self.health = self.health - 4 + self.burn_timer = 0 + end + end + + if self.burn_timer == 0 and minetest_get_node_light(pos) > 12 and minetest_get_node_light(pos, 0.5) == 15 then + mcl_burning.set_on_fire(self.object, 1) + self.burn_timer = 1 --1.7 seconds + self.pause_timer = 0.4 + end + end + + + + + + --baby grows up + if self.baby then + --print(self.grow_up_timer) + --catch missing timer + if not self.grow_up_timer then + self.grow_up_timer = self.grow_up_goal + end + + self.grow_up_timer = self.grow_up_timer - dtime + + --baby grows up! + if self.grow_up_timer <= 0 then + self.grow_up_timer = 0 + mobs.baby_grow_up(self) + end + end + + + + --do custom mob instructions + if self.do_custom then + -- when false skip going any further + if self.do_custom(self, dtime) == false then + --this needs to be here or the mob becomes immortal + if self.pause_timer > 0 then + self.pause_timer = self.pause_timer - dtime + --perfectly reset pause_timer + if self.pause_timer <= 0 then + self.pause_timer = 0 + self.object:set_texture_mod("") + end + end + --this overrides internal lua collision detection + return + end + end + + local attacking = nil + + --scan for players within eyesight + if self.hostile then + --true for line_of_sight is debug + attacking = mobs.detect_closest_player_within_radius(self,true,self.view_range,self.eye_height) + + --go get the closest player + if attacking then + + self.memory = 6 --6 seconds of memory + + --set initial punch timer + if self.attacking == nil then + if self.attack_type == "punch" then + self.punch_timer = -1 + end + end + self.attacking = attacking + + --no player in area + elseif self.memory > 0 then + --try to remember + 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()) + if distance > self.view_range then + self.memory = 0 + end + --out of viewing range, forget em + else + self.memory = 0 + end + + if self.memory <= 0 then + + --reset states when coming out of hostile state + if self.attacking ~= nil then + self.state_timer = -1 + end + + self.attacking = nil + self.memory = 0 + end + end + end + + --count down hostile cooldown timer when no players in range + if self.neutral and self.hostile and not attacking and self.hostile_cooldown_timer then + + self.hostile_cooldown_timer = self.hostile_cooldown_timer - dtime + + if self.hostile_cooldown_timer <= 0 then + self.hostile = false + self.hostile_cooldown_timer = 0 + end + end + + --mob is stunned after being hit + if self.pause_timer > 0 then + self.pause_timer = self.pause_timer - dtime + --don't break eye contact + if self.hostile and self.attacking then + mobs.set_yaw_while_attacking(self) + end + + --perfectly reset pause_timer + if self.pause_timer <= 0 then + self.pause_timer = 0 + self.object:set_texture_mod("") + end + + --stop walking mobs from falling through the water + if not self.jump_only and not self.swim and not self.fly then + local pos = self.object:get_pos() + local collisionbox = self.object:get_properties().collisionbox + --get the center of the mob + pos.y = pos.y + (collisionbox[2] + collisionbox[5] / 2) + local current_node = minetest_get_node(pos).name + + --recheck if in water or lava + if minetest_get_item_group(current_node, "water") ~= 0 or minetest_get_item_group(current_node, "lava") ~= 0 then + mobs.float(self) + end + end + + --stop projectile mobs from being completely disabled while stunned + if self.projectile_timer and self.projectile_timer > 0.01 then + self.projectile_timer = self.projectile_timer - dtime + if self.projectile_timer < 0.01 then + self.projectile_timer = 0.01 + end + end + + return -- don't allow collision detection + --do normal ai + else + --jump only (like slimes) + if self.jump_only then + jump_state_switch(self, dtime) + jump_state_execution(self, dtime) + --swimming + elseif self.swim then + swim_state_switch(self, dtime) + swim_state_execution(self, dtime) + --flying + elseif self.fly then + fly_state_switch(self, dtime) + fly_state_execution(self,dtime) + --regular mobs that walk around + else + land_state_switch(self, dtime) + land_state_execution(self,dtime) + end + end + + --do not continue if non-existent + if not self or not self.object or not self.object:get_luaentity() then + self.object:remove() + return false + end + + --make it so mobs do not glitch out when walking around/jumping + mobs.swap_auto_step_height_adjust(self) + + + -- can mob be pushed, if so calculate direction -- do this last (overrides everything) + if self.pushable then + mobs.collision(self) + end + + --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)) + 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)) + end + end + end + end + + self.old_velocity = self.object:get_velocity() + self.old_pos = self.object:get_pos() +end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua new file mode 100644 index 000000000..c26d33089 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/animation.lua @@ -0,0 +1,259 @@ +local math_pi = math.pi +local math_floor = math.floor +local math_random = math.random +local HALF_PI = math_pi/2 + + +local vector_direction = vector.direction +local vector_distance = vector.distance +local vector_new = vector.new + +local minetest_dir_to_yaw = minetest.dir_to_yaw + +-- set defined animation +mobs.set_mob_animation = function(self, anim, fixed_frame) + + if not self.animation or not anim then + return + end + + if self.state == "die" and anim ~= "die" and anim ~= "stand" then + return + end + + + if (not self.animation[anim .. "_start"] or not self.animation[anim .. "_end"]) then + return + end + + --animations break if they are constantly set + --so we put this return gate to check if it is + --already at the animation we are trying to implement + if self.current_animation == anim then + return + end + + local a_start = self.animation[anim .. "_start"] + local a_end + + if fixed_frame then + a_end = a_start + else + a_end = self.animation[anim .. "_end"] + end + + self.object:set_animation({ + x = a_start, + y = a_end}, + self.animation[anim .. "_speed"] or self.animation.speed_normal or 15, + 0, self.animation[anim .. "_loop"] ~= false) + + + self.current_animation = anim +end + + + + +mobs.death_effect = function(pos, yaw, collisionbox, rotate) + local min, max + if collisionbox then + min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} + max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} + else + min = { x = -0.5, y = 0, z = -0.5 } + max = { x = 0.5, y = 0.5, z = 0.5 } + end + if rotate then + min = vector.rotate(min, {x=0, y=yaw, z=math_pi/2}) + max = vector.rotate(max, {x=0, y=yaw, z=math_pi/2}) + min, max = vector.sort(min, max) + min = vector.multiply(min, 0.5) + max = vector.multiply(max, 0.5) + end + + minetest_add_particlespawner({ + amount = 50, + time = 0.001, + minpos = vector.add(pos, min), + maxpos = vector.add(pos, max), + minvel = vector_new(-5,-5,-5), + maxvel = vector_new(5,5,5), + minexptime = 1.1, + maxexptime = 1.5, + minsize = 1, + maxsize = 2, + collisiondetection = false, + vertical = false, + texture = "mcl_particles_mob_death.png^[colorize:#000000:255", + }) + + minetest_sound_play("mcl_mobs_mob_poof", { + pos = pos, + gain = 1.0, + max_hear_distance = 8, + }, true) +end + + +--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 + + if current_engine_yaw > math.pi * 2 then + current_engine_yaw = current_engine_yaw - (math.pi * 2) + end + + if math.abs(current_engine_yaw - current_lua_yaw) <= 0.05 and self.object:get_properties().automatic_face_movement_dir then + self.object:set_properties{automatic_face_movement_dir = false} + elseif math.abs(current_engine_yaw - current_lua_yaw) > 0.05 and self.object:get_properties().automatic_face_movement_dir == false then + self.object:set_properties{automatic_face_movement_dir = self.rotate} + end +end + + +--this is used when a mob is chasing a player +mobs.set_yaw_while_attacking = function(self) + + if self.object:get_properties().automatic_face_movement_dir then + self.object:set_properties{automatic_face_movement_dir = false} + end + + --turn positions into pseudo 2d vectors + local pos1 = self.object:get_pos() + pos1.y = 0 + + local pos2 = self.attacking:get_pos() + pos2.y = 0 + + local new_direction = vector_direction(pos1,pos2) + local new_yaw = minetest_dir_to_yaw(new_direction) + + self.object:set_yaw(new_yaw) + self.yaw = new_yaw +end + +--this is used to unlock a mob's yaw after attacking +mobs.unlock_yaw = function(self) + if self.object:get_properties().automatic_face_movement_dir == false then + self.object:set_properties{automatic_face_movement_dir = self.rotate} + end +end + +--this is used to lock a mob's yaw when they're standing +mobs.lock_yaw = function(self) + if self.object:get_properties().automatic_face_movement_dir then + self.object:set_properties{automatic_face_movement_dir = false} + end +end + + +local calculate_pitch = function(self) + local pos = self.object:get_pos() + local pos2 = self.old_pos + + if pos == nil or pos2 == nil then + 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) +end + +--this is a helper function used to make mobs pitch rotation dynamically flow when flying/swimming +mobs.set_dynamic_pitch = function(self) + local pitch = calculate_pitch(self) + + if not pitch then + return + end + + local current_rotation = self.object:get_rotation() + + current_rotation.x = pitch + + self.object:set_rotation(current_rotation) + + self.pitch_switch = "dynamic" +end + +--this is a helper function used to make mobs pitch rotation reset when flying/swimming +mobs.set_static_pitch = function(self) + + if self.pitch_switch == "static" then + return + end + + local current_rotation = self.object:get_rotation() + + current_rotation.x = 0 + + self.object:set_rotation(current_rotation) + self.pitch_switch = "static" +end + +--this is a helper function for mobs explosion animation +mobs.handle_explosion_animation = function(self) + + --secondary catch-all + if not self.explosion_animation then + self.explosion_animation = 0 + end + + --the timer works from 0 for sense of a 0 based counting + --but this just bumps it up so it's usable in here + local explosion_timer_adjust = self.explosion_animation + 1 + + + local visual_size_modified = table.copy(self.visual_size_origin) + + visual_size_modified.x = visual_size_modified.x * (explosion_timer_adjust ^ 3) + visual_size_modified.y = visual_size_modified.y * explosion_timer_adjust + + self.object:set_properties({visual_size = visual_size_modified}) +end + + +--this is used when a mob is following player +mobs.set_yaw_while_following = function(self) + + if self.object:get_properties().automatic_face_movement_dir then + self.object:set_properties{automatic_face_movement_dir = false} + end + + --turn positions into pseudo 2d vectors + local pos1 = self.object:get_pos() + pos1.y = 0 + + local pos2 = self.following_person:get_pos() + pos2.y = 0 + + local new_direction = vector_direction(pos1,pos2) + local new_yaw = minetest_dir_to_yaw(new_direction) + + self.object:set_yaw(new_yaw) + self.yaw = new_yaw +end + +--this is used for when mobs breed +mobs.set_yaw_while_breeding = function(self, mate) + + if self.object:get_properties().automatic_face_movement_dir then + self.object:set_properties{automatic_face_movement_dir = false} + end + + --turn positions into pseudo 2d vectors + local pos1 = self.object:get_pos() + pos1.y = 0 + + local pos2 = mate:get_pos() + pos2.y = 0 + + local new_direction = vector_direction(pos1,pos2) + local new_yaw = minetest_dir_to_yaw(new_direction) + + self.object:set_yaw(new_yaw) + self.yaw = new_yaw +end \ No newline at end of file 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 new file mode 100644 index 000000000..c973f3d1b --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/attack_type_instructions.lua @@ -0,0 +1,351 @@ +local vector_direction = vector.direction +local minetest_dir_to_yaw = minetest.dir_to_yaw +local vector_distance = vector.distance +local vector_multiply = vector.multiply +local math_random = math.random + +--[[ + _ _ _ _ +| | | | | | | | +| | | | __ _ _ __ __| | | | +| | | | / _` | '_ \ / _` | | | +|_| | |___| (_| | | | | (_| | |_| +(_) \_____/\__,_|_| |_|\__,_| (_) +]]-- + + + +--[[ + _____ _ _ +| ___| | | | | +| |____ ___ __ | | ___ __| | ___ +| __\ \/ / '_ \| |/ _ \ / _` |/ _ \ +| |___> <| |_) | | (_) | (_| | __/ +\____/_/\_\ .__/|_|\___/ \__,_|\___| + | | + |_| +]]-- + +mobs.explode_attack_walk = function(self,dtime) + + --this needs an exception + if self.attacking == nil or not self.attacking:is_player() then + self.attacking = nil + return + end + + mobs.set_yaw_while_attacking(self) + + local distance_from_attacking = vector_distance(self.object:get_pos(), self.attacking:get_pos()) + + --make mob walk up to player within 2 nodes distance then start exploding + if distance_from_attacking >= self.reach and + --don't allow explosion to cancel unless out of the reach boundary + not (self.explosion_animation ~= nil and self.explosion_animation > 0 and distance_from_attacking <= self.defuse_reach) then + + mobs.set_velocity(self, self.run_velocity) + mobs.set_mob_animation(self,"run") + + mobs.reverse_explosion_animation(self,dtime) + else + mobs.set_velocity(self,0) + + --this is the only way I can reference this without dumping extra data on all mobs + if not self.explosion_animation then + self.explosion_animation = 0 + end + + --play ignite sound + if self.explosion_animation == 0 then + mobs.play_sound(self,"attack") + end + + mobs.set_mob_animation(self,"stand") + + mobs.handle_explosion_animation(self) + + self.explosion_animation = self.explosion_animation + (dtime/2.5) + end + + --make explosive mobs jump + --check for nodes to jump over + --explosive mobs will just ride against walls for now + local node_in_front_of = mobs.jump_check(self) + 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 + mcl_explosions.explode(self.object:get_pos(), self.explosion_strength,{ drop_chance = 1.0 }) + self.object:remove() + end +end + + +--this is a small helper function to make working with explosion animations easier +mobs.reverse_explosion_animation = function(self,dtime) + + --if explosion animation was greater than 0 then reverse it + if self.explosion_animation ~= nil and self.explosion_animation > 0 then + self.explosion_animation = self.explosion_animation - dtime + if self.explosion_animation < 0 then + self.explosion_animation = 0 + end + end + + mobs.handle_explosion_animation(self) +end + + + + +--[[ +______ _ +| ___ \ | | +| |_/ / _ _ __ ___| |__ +| __/ | | | '_ \ / __| '_ \ +| | | |_| | | | | (__| | | | +\_| \__,_|_| |_|\___|_| |_| +]]-- + + + +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 + return + end + + local distance_from_attacking = mobs.get_2d_distance(self.object:get_pos(), self.attacking:get_pos()) + + if distance_from_attacking >= self.minimum_follow_distance then + mobs.set_velocity(self, self.run_velocity) + mobs.set_mob_animation(self, "run") + else + mobs.set_velocity(self, 0) + mobs.set_mob_animation(self, "stand") + end + + mobs.set_yaw_while_attacking(self) + + --make punchy mobs jump + --check for nodes to jump over + --explosive mobs will just ride against walls for now + local node_in_front_of = mobs.jump_check(self) + + if node_in_front_of == 1 then + mobs.jump(self) + end + + --mobs that can climb over stuff + if self.always_climb and node_in_front_of > 0 then + mobs.climb(self) + end + + + --auto reset punch_timer + if not self.punch_timer then + self.punch_timer = 0 + end + + if self.punch_timer > 0 then + self.punch_timer = self.punch_timer - dtime + end +end + +mobs.punch_attack = function(self) + + self.attacking:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = self.damage} + }, nil) + + self.punch_timer = self.punch_timer_cooloff + + + --knockback + local pos1 = self.object:get_pos() + pos1.y = 0 + local pos2 = self.attacking:get_pos() + pos2.y = 0 + local dir = vector_direction(pos1,pos2) + + dir = vector_multiply(dir,3) + + if self.attacking:get_velocity().y <= 1 then + dir.y = 5 + end + + self.attacking:add_velocity(dir) +end + + + + +--[[ +______ _ _ _ _ +| ___ \ (_) | | (_) | +| |_/ / __ ___ _ ___ ___| |_ _| | ___ +| __/ '__/ _ \| |/ _ \/ __| __| | |/ _ \ +| | | | | (_) | | __/ (__| |_| | | __/ +\_| |_| \___/| |\___|\___|\__|_|_|\___| + _/ | + |__/ +]]-- + + +mobs.projectile_attack_walk = function(self,dtime) + + --this needs an exception + if self.attacking == nil or not self.attacking:is_player() then + self.attacking = nil + return + end + + mobs.set_yaw_while_attacking(self) + + local distance_from_attacking = vector_distance(self.object:get_pos(), self.attacking:get_pos()) + + + if distance_from_attacking >= self.reach then + mobs.set_velocity(self, self.run_velocity) + mobs.set_mob_animation(self,"run") + else + mobs.set_velocity(self,0) + mobs.set_mob_animation(self,"stand") + end + + --do this to not load data into other mobs + if not self.projectile_timer then + self.projectile_timer = math_random(self.projectile_cooldown_min, self.projectile_cooldown_max) + end + + --run projectile timer + if self.projectile_timer > 0 then + self.projectile_timer = self.projectile_timer - dtime + + --shoot + if self.projectile_timer <= 0 then + --reset timer + self.projectile_timer = math_random(self.projectile_cooldown_min, self.projectile_cooldown_max) + mobs.shoot_projectile(self) + end + end + + --make shooty mobs jump + --check for nodes to jump over + --explosive mobs will just ride against walls for now + local node_in_front_of = mobs.jump_check(self) + if node_in_front_of == 1 then + mobs.jump(self) + end + +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 + + --enable rotation locking + mobs.movement_rotation_lock(self) + + 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)) + --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)] + end + + mobs.set_fly_velocity(self, self.run_velocity) + + else + + mobs.set_yaw_while_attacking(self) + + local distance_from_attacking = vector_distance(self.object:get_pos(), self.attacking:get_pos()) + + 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") + else + mobs.set_pitch_while_attacking(self) + mobs.set_fly_velocity(self, 0) + mobs.set_mob_animation(self,"stand") + end + end + + + --do this to not load data into other mobs + if not self.projectile_timer then + self.projectile_timer = math_random(self.projectile_cooldown_min, self.projectile_cooldown_max) + end + + --run projectile timer + if self.projectile_timer > 0 then + self.projectile_timer = self.projectile_timer - dtime + + --shoot + if self.projectile_timer <= 0 then + + if self.fly_random_while_attack then + mobs.set_yaw_while_attacking(self) + self.walk_timer = 0 + end + --reset timer + self.projectile_timer = math_random(self.projectile_cooldown_min, self.projectile_cooldown_max) + mobs.shoot_projectile(self) + end + end +end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua similarity index 55% rename from mods/ENTITIES/mcl_mobs/api.lua rename to mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua index bc4d3067d..d5b644f73 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua @@ -1,118 +1,3 @@ - --- API for Mobs Redo: MineClone 2 Edition (MRM) - -mobs = {} -mobs.mod = "mrm" -mobs.version = "20210106" -- don't rely too much on this, rarely updated, if ever - -local MAX_MOB_NAME_LENGTH = 30 -local HORNY_TIME = 30 -local HORNY_AGAIN_TIME = 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 MOB_CAP = {} -MOB_CAP.hostile = 70 -MOB_CAP.passive = 10 -MOB_CAP.ambient = 15 -MOB_CAP.water = 15 - --- Localize -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 - - --- creative check -function mobs.is_creative(name) - return minetest.is_creative_enabled(name) -end - - --- localize math functions -local pi = math.pi -local sin = math.sin -local cos = math.cos -local abs = math.abs -local min = math.min -local max = math.max -local atann = math.atan -local random = math.random -local floor = math.floor -local atan = function(x) - if not x or x ~= x then - return 0 - else - return atann(x) - end -end - - --- Load 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 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) - --- Shows helpful debug info above each mob -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 - minetest.register_on_joinplayer(function(player) - minetest.chat_send_player(player:get_player_name(), - S("Peaceful mode active! No monsters will spawn.")) - end) -end - --- 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 - --- default nodes -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") ~= 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 - -----For Water Flowing: -local enable_physics = function(object, luaentity, ignore_check) - if luaentity.physical_state == false or ignore_check == true then - luaentity.physical_state = true - object:set_properties({ - physical = true - }) - object:set_velocity({x=0,y=0,z=0}) - object:set_acceleration({x=0,y=-9.81,z=0}) - end -end - local disable_physics = function(object, luaentity, ignore_check, reset_movement) if luaentity.physical_state == true or ignore_check == true then luaentity.physical_state = false @@ -126,630 +11,912 @@ local disable_physics = function(object, luaentity, ignore_check, reset_movement end end - --- play sound -local mob_sound = function(self, soundname, is_opinion, fixed_pitch) - - local soundinfo - if self.sounds_child and self.child then - soundinfo = self.sounds_child - elseif self.sounds then - soundinfo = self.sounds +----For Water Flowing: +local enable_physics = function(object, luaentity, ignore_check) + if luaentity.physical_state == false or ignore_check == true then + luaentity.physical_state = true + object:set_properties({ + physical = true + }) + object:set_velocity({x=0,y=0,z=0}) + object:set_acceleration({x=0,y=-9.81,z=0}) end - if not soundinfo then - return - end - local sound = soundinfo[soundname] - if sound then - if is_opinion and self.opinion_sound_cooloff > 0 then - return - end - local pitch - if not fixed_pitch then - local base_pitch = soundinfo.base_pitch - if not base_pitch then - base_pitch = 1 +end + +--[[ +local timer = 0 +minetest.register_globalstep(function(dtime) + timer = timer + dtime + if timer < 1 then return end + for _, player in pairs(minetest.get_connected_players()) do + local pos = player:get_pos() + for _, obj in pairs(minetest_get_objects_inside_radius(pos, 47)) do + local lua = obj:get_luaentity() + if lua and lua._cmi_is_mob then + lua.lifetimer = math.max(20, lua.lifetimer) + lua.despawn_immediately = false end - if self.child and (not self.sounds_child) then - -- Children have higher pitch - pitch = base_pitch * 1.5 - else - pitch = base_pitch + end + end + timer = 0 +end) +]]-- + +-- compatibility function for old entities to new modpack entities +function mobs:alias_mob(old_name, new_name) + + -- spawn egg + minetest.register_alias(old_name, new_name) + + -- entity + minetest.register_entity(":" .. old_name, { + + physical = false, + + on_step = function(self) + + if minetest_registered_entities[new_name] then + minetest_add_entity(self.object:get_pos(), new_name) end - -- randomize the pitch a bit - pitch = pitch + math.random(-10, 10) * 0.005 + + self.object:remove() end - minetest.sound_play(sound, { - object = self.object, - gain = 1.0, - max_hear_distance = self.sounds.distance, - pitch = pitch, - }, true) - self.opinion_sound_cooloff = 1 - end -end - --- Return true if object is in view_range -local function object_in_range(self, object) - if not object then - return false - end - local factor - -- Apply view range reduction for special player armor - if object:is_player() and mod_armor then - local factors = mcl_armor.player_view_range_factors[object] - factor = factors and factors[self.name] - end - -- Distance check - local dist - if factor and factor == 0 then - return false - elseif factor then - dist = self.view_range * factor - else - dist = self.view_range - end - - local p1, p2 = self.object:get_pos(), object:get_pos() - return p1 and p2 and (vector.distance(p1, p2) <= dist) -end - --- attack player/mob -local do_attack = function(self, player) - - if self.state == "attack" or self.state == "die" then - return - end - - self.attack = player - self.state = "attack" - - -- TODO: Implement war_cry sound without being annoying - --if random(0, 100) < 90 then - --mob_sound(self, "war_cry", true) - --end -end - - --- collision function borrowed amended from jordan4ibanez open_ai mod -local collision = function(self) - - local pos = self.object:get_pos() - local vel = self.object:get_velocity() - local x = 0 - local z = 0 - local width = -self.collisionbox[1] + self.collisionbox[4] + 0.5 - - for _,object in pairs(minetest.get_objects_inside_radius(pos, width)) do - - if object:is_player() - or (object:get_luaentity()._cmi_is_mob == true and object ~= self.object) then - - local pos2 = object:get_pos() - local vec = {x = pos.x - pos2.x, z = pos.z - pos2.z} - local force = (width + 0.5) - vector.distance( - {x = pos.x, y = 0, z = pos.z}, - {x = pos2.x, y = 0, z = pos2.z}) - - x = x + (vec.x * force) - z = z + (vec.z * force) - end - end - - return({x,z}) -end - --- move mob in facing direction -local set_velocity = function(self, v) - - local c_x, c_y = 0, 0 - - -- can mob be pushed, if so calculate direction - if self.pushable then - c_x, c_y = unpack(collision(self)) - end - - -- halt mob if it has been ordered to stay - if self.order == "stand" then - self.object:set_velocity({x = 0, y = 0, z = 0}) - return - end - - local yaw = (self.object:get_yaw() or 0) + self.rotate - - self.object:set_velocity({ - x = (sin(yaw) * -v) + c_x, - y = self.object:get_velocity().y, - z = (cos(yaw) * v) + c_y, }) end - - --- calculate mob velocity -local get_velocity = function(self) - - local v = self.object:get_velocity() - if v then - return (v.x * v.x + v.z * v.z) ^ 0.5 - end - - return 0 -end - -local function update_roll(self) - local is_Fleckenstein = self.nametag == "Fleckenstein" - local was_Fleckenstein = false - - local rot = self.object:get_rotation() - rot.z = is_Fleckenstein and pi or 0 - self.object:set_rotation(rot) - - local cbox = table.copy(self.collisionbox) - local acbox = self.object:get_properties().collisionbox - - if math.abs(cbox[2] - acbox[2]) > 0.1 then - was_Fleckenstein = true - end - - if is_Fleckenstein ~= was_Fleckenstein then - local pos = self.object:get_pos() - pos.y = pos.y + (acbox[2] + acbox[5]) - self.object:set_pos(pos) - end - - if is_Fleckenstein then - cbox[2], cbox[5] = -cbox[5], -cbox[2] - end - - self.object:set_properties({collisionbox = cbox}) -end - --- set and return valid yaw -local set_yaw = function(self, yaw, delay, dtime) - - if not yaw or yaw ~= yaw then - yaw = 0 - end - - delay = delay or 0 - - if delay == 0 then - if self.shaking and dtime then - yaw = yaw + (math.random() * 2 - 1) * 5 * dtime - end - self.object:set_yaw(yaw) - update_roll(self) - return yaw - end - - self.target_yaw = yaw - self.delay = delay - - return self.target_yaw -end - --- global function to set mob yaw -function mobs:yaw(self, yaw, delay, dtime) - set_yaw(self, yaw, delay, dtime) -end - -local add_texture_mod = function(self, mod) - local full_mod = "" - local already_added = false - for i=1, #self.texture_mods do - if mod == self.texture_mods[i] then - already_added = true - end - full_mod = full_mod .. self.texture_mods[i] - end - if not already_added then - full_mod = full_mod .. mod - table.insert(self.texture_mods, mod) - end - self.object:set_texture_mod(full_mod) -end -local remove_texture_mod = function(self, mod) - local full_mod = "" - local remove = {} - for i=1, #self.texture_mods do - if self.texture_mods[i] ~= mod then - full_mod = full_mod .. self.texture_mods[i] - else - table.insert(remove, i) - end - end - for i=#remove, 1 do - table.remove(self.texture_mods, remove[i]) - end - self.object:set_texture_mod(full_mod) -end - --- set defined animation -local set_animation = function(self, anim, fixed_frame) - if not self.animation or not anim then - return - end - if self.state == "die" and anim ~= "die" and anim ~= "stand" then +-- Spawn a child +function mobs:spawn_child(pos, mob_type) + local child = minetest_add_entity(pos, mob_type) + if not child then return end - self.animation.current = self.animation.current or "" + local ent = child:get_luaentity() + effect(pos, 15, "mcl_particles_smoke.png", 1, 2, 2, 15, 5) - if (anim == self.animation.current - or not self.animation[anim .. "_start"] - or not self.animation[anim .. "_end"]) and self.state ~= "die" then - return + ent.child = true + + local textures + -- using specific child texture (if found) + if ent.child_texture then + textures = ent.child_texture[1] end - self.animation.current = anim + -- and resize to half height + child:set_properties({ + textures = textures, + visual_size = { + x = ent.base_size.x * .5, + y = ent.base_size.y * .5, + }, + collisionbox = { + ent.base_colbox[1] * .5, + ent.base_colbox[2] * .5, + ent.base_colbox[3] * .5, + ent.base_colbox[4] * .5, + ent.base_colbox[5] * .5, + ent.base_colbox[6] * .5, + }, + selectionbox = { + ent.base_selbox[1] * .5, + ent.base_selbox[2] * .5, + ent.base_selbox[3] * .5, + ent.base_selbox[4] * .5, + ent.base_selbox[5] * .5, + ent.base_selbox[6] * .5, + }, + }) - local a_start = self.animation[anim .. "_start"] - local a_end - if fixed_frame then - a_end = a_start - else - a_end = self.animation[anim .. "_end"] - end - - self.object:set_animation({ - x = a_start, - y = a_end}, - self.animation[anim .. "_speed"] or self.animation.speed_normal or 15, - 0, self.animation[anim .. "_loop"] ~= false) + return child end --- above function exported for mount.lua -function mobs:set_animation(self, anim) - set_animation(self, anim) -end --- Returns true is node can deal damage to self -local is_node_dangerous = function(self, nodename) - local nn = nodename - if self.lava_damage > 0 then - if minetest.get_item_group(nn, "lava") ~= 0 then - return true - end - end - if self.fire_damage > 0 then - if minetest.get_item_group(nn, "fire") ~= 0 then - return true - end - end - if minetest.registered_nodes[nn] and minetest.registered_nodes[nn].damage_per_second and minetest.registered_nodes[nn].damage_per_second > 0 then - return true - end - return false -end - - --- Returns true if node is a water hazard -local is_node_waterhazard = function(self, nodename) - local nn = nodename - if self.water_damage > 0 then - if minetest.get_item_group(nn, "water") ~= 0 then - return true - end - end - if minetest.registered_nodes[nn] and minetest.registered_nodes[nn].drowning and minetest.registered_nodes[nn].drowning > 0 then - if self.breath_max ~= -1 then - -- check if the mob is water-breathing _and_ the block is water; only return true if neither is the case - -- this will prevent water-breathing mobs to classify water or e.g. sand below them as dangerous - if not self.breathes_in_water and minetest.get_item_group(nn, "water") ~= 0 then - return true - end - end - end - return false -end - - --- check line of sight (BrunoMine) -local line_of_sight = function(self, pos1, pos2, stepsize) - - stepsize = stepsize or 1 - - local s, pos = minetest.line_of_sight(pos1, pos2, stepsize) - - -- normal walking and flying mobs can see you through air - if s == true then - return true - end - - -- New pos1 to be analyzed - local npos1 = {x = pos1.x, y = pos1.y, z = pos1.z} - - local r, pos = minetest.line_of_sight(npos1, pos2, stepsize) - - -- Checks the return - if r == true then return true end - - -- Nodename found - local nn = minetest.get_node(pos).name - - -- Target Distance (td) to travel - local td = vector.distance(pos1, pos2) - - -- Actual Distance (ad) traveled - local ad = 0 - - -- It continues to advance in the line of sight in search of a real - -- obstruction which counts as 'normal' nodebox. - while minetest.registered_nodes[nn] - and minetest.registered_nodes[nn].walkable == false do - - -- Check if you can still move forward - if td < ad + stepsize then - return true -- Reached the target - end - - -- Moves the analyzed pos - local d = vector.distance(pos1, pos2) - - npos1.x = ((pos2.x - pos1.x) / d * stepsize) + pos1.x - npos1.y = ((pos2.y - pos1.y) / d * stepsize) + pos1.y - npos1.z = ((pos2.z - pos1.z) / d * stepsize) + pos1.z - - -- NaN checks - if d == 0 - or npos1.x ~= npos1.x - or npos1.y ~= npos1.y - or npos1.z ~= npos1.z then - return false - end - - ad = ad + stepsize - - -- scan again - r, pos = minetest.line_of_sight(npos1, pos2, stepsize) - - if r == true then return true end - - -- New Nodename found - nn = minetest.get_node(pos).name - - end - - return false -end - - --- are we flying in what we are suppose to? (taikedz) -local flight_check = function(self) - - local nod = self.standing_in - local def = minetest.registered_nodes[nod] - - if not def then return false end -- nil check - - local fly_in - if type(self.fly_in) == "string" then - fly_in = { self.fly_in } - elseif type(self.fly_in) == "table" then - fly_in = self.fly_in - else +-- feeding, taming and breeding (thanks blert2112) +function mobs:feed_tame(self, clicker, feed_count, breed, tame) + if not self.follow then return false end - for _,checknode in pairs(fly_in) do - if nod == checknode then - return true - elseif checknode == "__airlike" and def.walkable == false and - (def.liquidtype == "none" or minetest.get_item_group(nod, "fake_liquid") == 1) then - return true + -- can eat/tame with item in hand + if follow_holding(self, clicker) then + + -- if not in creative then take item + if not mobs.is_creative(clicker:get_player_name()) then + + local item = clicker:get_wielded_item() + + item:take_item() + + clicker:set_wielded_item(item) end - end - return false -end + mob_sound(self, "eat", nil, true) + -- increase health + self.health = self.health + 4 --- custom particle effects -local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow, go_down) + if self.health >= self.hp_max then - radius = radius or 2 - min_size = min_size or 0.5 - max_size = max_size or 1 - gravity = gravity or -10 - glow = glow or 0 - go_down = go_down or false + self.health = self.hp_max - local ym - if go_down then - ym = 0 - else - ym = -radius - end - - minetest.add_particlespawner({ - amount = amount, - time = 0.25, - minpos = pos, - maxpos = pos, - minvel = {x = -radius, y = ym, z = -radius}, - maxvel = {x = radius, y = radius, z = radius}, - minacc = {x = 0, y = gravity, z = 0}, - maxacc = {x = 0, y = gravity, z = 0}, - minexptime = 0.1, - maxexptime = 1, - minsize = min_size, - maxsize = max_size, - texture = texture, - glow = glow, - }) -end - -local damage_effect = function(self, damage) - -- damage particles - if (not disable_blood) and damage > 0 then - - local amount_large = math.floor(damage / 2) - local amount_small = damage % 2 - - local pos = self.object:get_pos() - - pos.y = pos.y + (self.collisionbox[5] - self.collisionbox[2]) * .5 - - local texture = "mobs_blood.png" - -- full heart damage (one particle for each 2 HP damage) - if amount_large > 0 then - effect(pos, amount_large, texture, 2, 2, 1.75, 0, nil, true) - end - -- half heart damage (one additional particle if damage is an odd number) - if amount_small > 0 then - -- TODO: Use "half heart" - effect(pos, amount_small, texture, 1, 1, 1.75, 0, nil, true) - end - end -end - -mobs.death_effect = function(pos, yaw, collisionbox, rotate) - local min, max - if collisionbox then - min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} - max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} - else - min = { x = -0.5, y = 0, z = -0.5 } - max = { x = 0.5, y = 0.5, z = 0.5 } - end - if rotate then - min = vector.rotate(min, {x=0, y=yaw, z=pi/2}) - max = vector.rotate(max, {x=0, y=yaw, z=pi/2}) - min, max = vector.sort(min, max) - min = vector.multiply(min, 0.5) - max = vector.multiply(max, 0.5) - end - - minetest.add_particlespawner({ - amount = 50, - time = 0.001, - minpos = vector.add(pos, min), - maxpos = vector.add(pos, max), - minvel = vector.new(-5,-5,-5), - maxvel = vector.new(5,5,5), - minexptime = 1.1, - maxexptime = 1.5, - minsize = 1, - maxsize = 2, - collisiondetection = false, - vertical = false, - texture = "mcl_particles_mob_death.png^[colorize:#000000:255", - }) - - minetest.sound_play("mcl_mobs_mob_poof", { - pos = pos, - gain = 1.0, - max_hear_distance = 8, - }, true) -end - -local update_tag = function(self) - local tag - if mobs_debug then - tag = "nametag = '"..tostring(self.nametag).."'\n".. - "state = '"..tostring(self.state).."'\n".. - "order = '"..tostring(self.order).."'\n".. - "attack = "..tostring(self.attack).."\n".. - "health = "..tostring(self.health).."\n".. - "breath = "..tostring(self.breath).."\n".. - "gotten = "..tostring(self.gotten).."\n".. - "tamed = "..tostring(self.tamed).."\n".. - "horny = "..tostring(self.horny).."\n".. - "hornytimer = "..tostring(self.hornytimer).."\n".. - "runaway_timer = "..tostring(self.runaway_timer).."\n".. - "following = "..tostring(self.following) - else - tag = self.nametag - end - self.object:set_properties({ - nametag = tag, - }) - - update_roll(self) -end - --- drop items -local item_drop = function(self, cooked, looting_level) - - -- no drops if disabled by setting - if not mobs_drop_items then return end - - looting_level = looting_level or 0 - - -- no drops for child mobs (except monster) - if (self.child and self.type ~= "monster") then - return - end - - local obj, item, num - local pos = self.object:get_pos() - - self.drops = self.drops or {} -- nil check - - for n = 1, #self.drops do - local dropdef = self.drops[n] - local chance = 1 / dropdef.chance - local looting_type = dropdef.looting - - if looting_level > 0 then - local chance_function = dropdef.looting_chance_function - if chance_function then - chance = chance_function(looting_level) - elseif looting_type == "rare" then - chance = chance + (dropdef.looting_factor or 0.01) * looting_level + if self.htimer < 1 then + self.htimer = 5 end end - local num = 0 - local do_common_looting = (looting_level > 0 and looting_type == "common") - if random() < chance then - num = random(dropdef.min or 1, dropdef.max or 1) - elseif not dropdef.looting_ignore_chance then - do_common_looting = false + self.object:set_hp(self.health) + + update_tag(self) + + -- make children grow quicker + if self.child == true then + + -- deduct 10% of the time to adulthood + self.hornytimer = self.hornytimer + ((CHILD_GROW_TIME - self.hornytimer) * 0.1) + + return true end - if do_common_looting then - num = num + math.floor(math.random(0, looting_level) + 0.5) - end + -- feed and tame + self.food = (self.food or 0) + 1 + if self.food >= feed_count then - if num > 0 then - item = dropdef.name + self.food = 0 - -- cook items when true - if cooked then + if breed and self.hornytimer == 0 then + self.horny = true + end - local output = minetest.get_craft_result({ - method = "cooking", width = 1, items = {item}}) + if tame then - if output and output.item and not output.item:is_empty() then - item = output.item:get_name() + self.tamed = true + + if not self.owner or self.owner == "" then + self.owner = clicker:get_player_name() end end - -- add item if it exists - for x = 1, num do - obj = minetest.add_item(pos, ItemStack(item .. " " .. 1)) + -- make sound when fed so many times + mob_sound(self, "random", true) + end + + return true + end + + return false +end + +-- no damage to nodes explosion +function mobs:safe_boom(self, pos, strength) + minetest_sound_play(self.sounds and self.sounds.explode or "tnt_explode", { + pos = pos, + gain = 1.0, + max_hear_distance = self.sounds and self.sounds.distance or 32 + }, true) + local radius = strength + entity_physics(pos, radius) + effect(pos, 32, "mcl_particles_smoke.png", radius * 3, radius * 5, radius, 1, 0) +end + + +-- make explosion with protection and tnt mod check +function mobs:boom(self, pos, strength, fire) + self.object:remove() + if mod_explosions then + if mobs_griefing and not minetest_is_protected(pos, "") then + mcl_explosions.explode(pos, strength, { drop_chance = 1.0, fire = fire }, self.object) + else + mobs:safe_boom(self, pos, strength) + end + else + mobs:safe_boom(self, pos, strength) + end +end + +-- falling and fall damage +-- returns true if mob died +local falling = function(self, pos) + + if self.fly and self.state ~= "die" then + return + end + + if mcl_portals ~= nil then + if mcl_portals.nether_portal_cooloff(self.object) then + return false -- mob has teleported through Nether portal - it's 99% not falling + end + end + + -- floating in water (or falling) + local v = self.object:get_velocity() + + if v.y > 0 then + + -- apply gravity when moving up + self.object:set_acceleration({ + x = 0, + y = -10, + z = 0 + }) + + elseif v.y <= 0 and v.y > self.fall_speed then + + -- fall downwards at set speed + self.object:set_acceleration({ + x = 0, + y = self.fall_speed, + z = 0 + }) + else + -- stop accelerating once max fall speed hit + self.object:set_acceleration({x = 0, y = 0, z = 0}) + end + + if minetest_registered_nodes[node_ok(pos).name].groups.lava then + + if self.floats_on_lava == 1 then + + self.object:set_acceleration({ + x = 0, + y = -self.fall_speed / (max(1, v.y) ^ 2), + z = 0 + }) + end + end + + -- in water then float up + if minetest_registered_nodes[node_ok(pos).name].groups.water then + + if self.floats == 1 then + + self.object:set_acceleration({ + x = 0, + y = -self.fall_speed / (math_max(1, v.y) ^ 2), + z = 0 + }) + end + else + + end +end + + + + +-- find someone to runaway from +local runaway_from = function(self) + + if not self.runaway_from and self.state ~= "flop" then + return + end + + local s = self.object:get_pos() + local p, sp, dist + local player, obj, min_player + local type, name = "", "" + local min_dist = self.view_range + 1 + local objs = minetest_get_objects_inside_radius(s, self.view_range) + + for n = 1, #objs do + + if objs[n]:is_player() then + + if mobs.invis[ objs[n]:get_player_name() ] + or self.owner == objs[n]:get_player_name() + or (not object_in_range(self, objs[n])) then + type = "" + else + player = objs[n] + type = "player" + name = "player" end + else + obj = objs[n]:get_luaentity() - if obj and obj:get_luaentity() then + if obj then + player = obj.object + type = obj.type + name = obj.name or "" + end + end - obj:set_velocity({ - x = random(-10, 10) / 9, - y = 6, - z = random(-10, 10) / 9, - }) - elseif obj then - obj:remove() -- item does not exist + -- find specific mob to runaway from + if name ~= "" and name ~= self.name + and specific_runaway(self.runaway_from, name) then + + p = player:get_pos() + sp = s + + -- aim higher to make looking up hills more realistic + p.y = p.y + 1 + sp.y = sp.y + 1 + + dist = vector.distance(p, s) + + + -- choose closest player/mpb to runaway from + if dist < min_dist + and line_of_sight(self, sp, p, 2) == true then + min_dist = dist + min_player = player end end end - self.drops = {} + if min_player then + + local lp = player:get_pos() + local vec = { + x = lp.x - s.x, + y = lp.y - s.y, + z = lp.z - s.z + } + + local yaw = (atan(vec.z / vec.x) + 3 * math_pi / 2) - self.rotate + + if lp.x > s.x then + yaw = yaw + math_pi + end + + yaw = set_yaw(self, yaw, 4) + self.state = "runaway" + self.runaway_timer = 3 + self.following = nil + end end +-- specific runaway +local specific_runaway = function(list, what) + + -- no list so do not run + if list == nil then + return false + end + + -- found entity on list to attack? + for no = 1, #list do + + if list[no] == what then + return true + end + end + + return false +end + + +-- follow player if owner or holding item, if fish outta water then flop +local follow_flop = function(self) + + -- find player to follow + if (self.follow ~= "" + or self.order == "follow") + and not self.following + and self.state ~= "attack" + and self.order ~= "sit" + and self.state ~= "runaway" then + + local s = self.object:get_pos() + local players = minetest.get_connected_players() + + for n = 1, #players do + + if (object_in_range(self, players[n])) + and not mobs.invis[ players[n]:get_player_name() ] then + + self.following = players[n] + + break + end + end + end + + if self.type == "npc" + and self.order == "follow" + and self.state ~= "attack" + and self.order ~= "sit" + and self.owner ~= "" then + + -- npc stop following player if not owner + if self.following + and self.owner + and self.owner ~= self.following:get_player_name() then + self.following = nil + end + else + -- stop following player if not holding specific item, + -- mob is horny, fleeing or attacking + if self.following + and self.following:is_player() + and (follow_holding(self, self.following) == false or + self.horny or self.state == "runaway") then + self.following = nil + end + + end + + -- follow that thing + if self.following then + + local s = self.object:get_pos() + local p + + if self.following:is_player() then + + p = self.following:get_pos() + + elseif self.following.object then + + p = self.following.object:get_pos() + end + + if p then + + local dist = vector.distance(p, s) + + -- dont follow if out of range + if (not object_in_range(self, self.following)) then + self.following = nil + else + local vec = { + x = p.x - s.x, + z = p.z - s.z + } + + local yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate + + if p.x > s.x then yaw = yaw + math_pi end + + set_yaw(self, yaw, 2.35) + + -- anyone but standing npc's can move along + if dist > 3 + and self.order ~= "stand" then + + set_velocity(self, self.follow_velocity) + + if self.walk_chance ~= 0 then + set_animation(self, "run") + end + else + set_velocity(self, 0) + set_animation(self, "stand") + end + + return + end + end + end + + -- swimmers flop when out of their element, and swim again when back in + if self.fly then + local s = self.object:get_pos() + if not flight_check(self, s) then + + self.state = "flop" + self.object:set_acceleration({x = 0, y = DEFAULT_FALL_SPEED, z = 0}) + + local sdef = minetest_registered_nodes[self.standing_on] + -- Flop on ground + if sdef and sdef.walkable then + mob_sound(self, "flop") + self.object:set_velocity({ + x = math_random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), + y = FLOP_HEIGHT, + z = math_random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), + }) + end + + set_animation(self, "stand", true) + + return + elseif self.state == "flop" then + self.state = "stand" + self.object:set_acceleration({x = 0, y = 0, z = 0}) + set_velocity(self, 0) + end + end +end + + +-- npc, find closest monster to attack +local npc_attack = function(self) + + if self.type ~= "npc" + or not self.attacks_monsters + or self.state == "attack" then + return + end + + local p, sp, obj, min_player + local s = self.object:get_pos() + local min_dist = self.view_range + 1 + local objs = minetest_get_objects_inside_radius(s, self.view_range) + + for n = 1, #objs do + + obj = objs[n]:get_luaentity() + + if obj and obj.type == "monster" then + + p = obj.object:get_pos() + sp = s + + local dist = vector.distance(p, s) + + -- aim higher to make looking up hills more realistic + p.y = p.y + 1 + sp.y = sp.y + 1 + + if dist < min_dist + and line_of_sight(self, sp, p, 2) == true then + min_dist = dist + min_player = obj.object + end + end + end + + if min_player then + do_attack(self, min_player) + end +end + + +-- monster find someone to attack +local monster_attack = function(self) + + if self.type ~= "monster" + or not damage_enabled + or minetest_is_creative_enabled("") + or self.passive + or self.state == "attack" + or day_docile(self) then + return + end + + local s = self.object:get_pos() + local p, sp, dist + local player, obj, min_player + local type, name = "", "" + local min_dist = self.view_range + 1 + local objs = minetest_get_objects_inside_radius(s, self.view_range) + + for n = 1, #objs do + + if objs[n]:is_player() then + + if mobs.invis[ objs[n]:get_player_name() ] or (not object_in_range(self, objs[n])) then + type = "" + else + player = objs[n] + type = "player" + name = "player" + end + else + obj = objs[n]:get_luaentity() + + if obj then + player = obj.object + type = obj.type + name = obj.name or "" + end + end + + -- find specific mob to attack, failing that attack player/npc/animal + if specific_attack(self.specific_attack, name) + and (type == "player" or type == "npc" + or (type == "animal" and self.attack_animals == true)) then + + p = player:get_pos() + sp = s + + dist = vector.distance(p, s) + + -- aim higher to make looking up hills more realistic + p.y = p.y + 1 + sp.y = sp.y + 1 + + + -- choose closest player to attack + if dist < min_dist + and line_of_sight(self, sp, p, 2) == true then + min_dist = dist + min_player = player + end + end + end + + -- attack player + if min_player then + do_attack(self, min_player) + end +end + + +-- specific attacks +local specific_attack = function(list, what) + + -- no list so attack default (player, animals etc.) + if list == nil then + return true + end + + -- found entity on list to attack? + for no = 1, #list do + + if list[no] == what then + return true + end + end + + return false +end + + +-- dogfight attack switch and counter function +local dogswitch = function(self, dtime) + + -- switch mode not activated + if not self.dogshoot_switch + or not dtime then + return 0 + end + + self.dogshoot_count = self.dogshoot_count + dtime + + if (self.dogshoot_switch == 1 + and self.dogshoot_count > self.dogshoot_count_max) + or (self.dogshoot_switch == 2 + and self.dogshoot_count > self.dogshoot_count2_max) then + + self.dogshoot_count = 0 + + if self.dogshoot_switch == 1 then + self.dogshoot_switch = 2 + else + self.dogshoot_switch = 1 + end + end + + return self.dogshoot_switch +end + +-- path finding and smart mob routine by rnd, line_of_sight and other edits by Elkien3 +local smart_mobs = function(self, s, p, dist, dtime) + + local s1 = self.path.lastpos + + local target_pos = self.attack:get_pos() + + -- is it becoming stuck? + if math_abs(s1.x - s.x) + math_abs(s1.z - s.z) < .5 then + self.path.stuck_timer = self.path.stuck_timer + dtime + else + self.path.stuck_timer = 0 + end + + self.path.lastpos = {x = s.x, y = s.y, z = s.z} + + local use_pathfind = false + local has_lineofsight = minetest_line_of_sight( + {x = s.x, y = (s.y) + .5, z = s.z}, + {x = target_pos.x, y = (target_pos.y) + 1.5, z = target_pos.z}, .2) + + -- im stuck, search for path + if not has_lineofsight then + + if los_switcher == true then + use_pathfind = true + los_switcher = false + end -- cannot see target! + else + if los_switcher == false then + + los_switcher = true + use_pathfind = false + + minetest_after(1, function(self) + if not self.object:get_luaentity() then + return + end + if has_lineofsight then self.path.following = false end + end, self) + end -- can see target! + end + + if (self.path.stuck_timer > stuck_timeout and not self.path.following) then + + use_pathfind = true + self.path.stuck_timer = 0 + + minetest_after(1, function(self) + if not self.object:get_luaentity() then + return + end + if has_lineofsight then self.path.following = false end + end, self) + end + + if (self.path.stuck_timer > stuck_path_timeout and self.path.following) then + + use_pathfind = true + self.path.stuck_timer = 0 + + minetest_after(1, function(self) + if not self.object:get_luaentity() then + return + end + if has_lineofsight then self.path.following = false end + end, self) + end + + if math_abs(vector.subtract(s,target_pos).y) > self.stepheight then + + if height_switcher then + use_pathfind = true + height_switcher = false + end + else + if not height_switcher then + use_pathfind = false + height_switcher = true + end + end + + if use_pathfind then + -- lets try find a path, first take care of positions + -- since pathfinder is very sensitive + local sheight = self.collisionbox[5] - self.collisionbox[2] + + -- round position to center of node to avoid stuck in walls + -- also adjust height for player models! + s.x = math_floor(s.x + 0.5) + s.z = math_floor(s.z + 0.5) + + local ssight, sground = minetest_line_of_sight(s, { + x = s.x, y = s.y - 4, z = s.z}, 1) + + -- determine node above ground + if not ssight then + s.y = sground.y + 1 + end + + local p1 = self.attack:get_pos() + + p1.x = math_floor(p1.x + 0.5) + p1.y = math_floor(p1.y + 0.5) + p1.z = math_floor(p1.z + 0.5) + + local dropheight = 12 + if self.fear_height ~= 0 then dropheight = self.fear_height end + local jumpheight = 0 + if self.jump and self.jump_height >= 4 then + jumpheight = math.min(math.ceil(self.jump_height / 4), 4) + elseif self.stepheight > 0.5 then + jumpheight = 1 + end + self.path.way = minetest_find_path(s, p1, 16, jumpheight, dropheight, "A*_noprefetch") + + self.state = "" + do_attack(self, self.attack) + + -- no path found, try something else + if not self.path.way then + + self.path.following = false + + -- lets make way by digging/building if not accessible + if self.pathfinding == 2 and mobs_griefing then + + -- is player higher than mob? + if s.y < p1.y then + + -- build upwards + if not minetest_is_protected(s, "") then + + local ndef1 = minetest_registered_nodes[self.standing_in] + + if ndef1 and (ndef1.buildable_to or ndef1.groups.liquid) then + + minetest_set_node(s, {name = mobs.fallback_node}) + end + end + + local sheight = math.ceil(self.collisionbox[5]) + 1 + + -- assume mob is 2 blocks high so it digs above its head + s.y = s.y + sheight + + -- remove one block above to make room to jump + if not minetest_is_protected(s, "") then + + local node1 = node_ok(s, "air").name + local ndef1 = minetest_registered_nodes[node1] + + if node1 ~= "air" + and node1 ~= "ignore" + and ndef1 + and not ndef1.groups.level + and not ndef1.groups.unbreakable + and not ndef1.groups.liquid then + + minetest_set_node(s, {name = "air"}) + minetest_add_item(s, ItemStack(node1)) + + end + end + + s.y = s.y - sheight + self.object:set_pos({x = s.x, y = s.y + 2, z = s.z}) + + else -- dig 2 blocks to make door toward player direction + + local yaw1 = self.object:get_yaw() + math_pi / 2 + local p1 = { + x = s.x + math_cos(yaw1), + y = s.y, + z = s.z + math_sin(yaw1) + } + + if not minetest_is_protected(p1, "") then + + local node1 = node_ok(p1, "air").name + local ndef1 = minetest_registered_nodes[node1] + + if node1 ~= "air" + and node1 ~= "ignore" + and ndef1 + and not ndef1.groups.level + and not ndef1.groups.unbreakable + and not ndef1.groups.liquid then + + minetest_add_item(p1, ItemStack(node1)) + minetest_set_node(p1, {name = "air"}) + end + + p1.y = p1.y + 1 + node1 = node_ok(p1, "air").name + ndef1 = minetest_registered_nodes[node1] + + if node1 ~= "air" + and node1 ~= "ignore" + and ndef1 + and not ndef1.groups.level + and not ndef1.groups.unbreakable + and not ndef1.groups.liquid then + + minetest_add_item(p1, ItemStack(node1)) + minetest_set_node(p1, {name = "air"}) + end + + end + end + end + + -- will try again in 2 seconds + self.path.stuck_timer = stuck_timeout - 2 + elseif s.y < p1.y and (not self.fly) then + do_jump(self) --add jump to pathfinding + self.path.following = true + -- Yay, I found path! + -- TODO: Implement war_cry sound without being annoying + --mob_sound(self, "war_cry", true) + else + set_velocity(self, self.walk_velocity) + + -- follow path now that it has it + self.path.following = true + end + end +end + + + + + + -- check if mob is dead or only hurt local check_for_death = function(self, cause, cmi_cause) @@ -776,7 +943,7 @@ local check_for_death = function(self, cause, cmi_cause) -- play damage sound if health was reduced and make mob flash red. if damaged then add_texture_mod(self, "^[colorize:red:130") - minetest.after(.2, function(self) + minetest_after(.2, function(self) if self and self.object then remove_texture_mod(self, "^[colorize:red:130") end @@ -819,8 +986,8 @@ local check_for_death = function(self, cause, cmi_cause) local looting = mcl_enchanting.get_enchantment(wielditem, "looting") 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)) + 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)) end end end @@ -885,7 +1052,7 @@ local check_for_death = function(self, cause, cmi_cause) set_animation(self, "die") else local rot = self.object:get_rotation() - rot.z = pi/2 + rot.z = math_pi/2 self.object:set_rotation(rot) length = 1 + DEATH_DELAY set_animation(self, "stand", true) @@ -912,34 +1079,366 @@ local check_for_death = function(self, cause, cmi_cause) if length <= 0 then kill(self) else - minetest.after(length, kill, self) + minetest_after(length, kill, self) end return true end +local damage_effect = function(self, damage) + -- damage particles + if (not disable_blood) and damage > 0 then --- check if within physical map limits (-30911 to 30927) -local within_limits, wmin, wmax = nil, -30913, 30928 -within_limits = function(pos, radius) - 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 + local amount_large = math_floor(damage / 2) + local amount_small = damage % 2 + + local pos = self.object:get_pos() + + pos.y = pos.y + (self.collisionbox[5] - self.collisionbox[2]) * .5 + + local texture = "mobs_blood.png" + -- full heart damage (one particle for each 2 HP damage) + if amount_large > 0 then + effect(pos, amount_large, texture, 2, 2, 1.75, 0, nil, true) + end + -- half heart damage (one additional particle if damage is an odd number) + if amount_small > 0 then + -- TODO: Use "half heart" + effect(pos, amount_small, texture, 1, 1, 1.75, 0, nil, true) + end + end +end + + +-- custom particle effects +local effect = function(pos, amount, texture, min_size, max_size, radius, gravity, glow, go_down) + + radius = radius or 2 + min_size = min_size or 0.5 + max_size = max_size or 1 + gravity = gravity or -10 + glow = glow or 0 + go_down = go_down or false + + local ym + if go_down then + ym = 0 + else + ym = -radius + end + + minetest_add_particlespawner({ + amount = amount, + time = 0.25, + minpos = pos, + maxpos = pos, + minvel = {x = -radius, y = ym, z = -radius}, + maxvel = {x = radius, y = radius, z = radius}, + minacc = {x = 0, y = gravity, z = 0}, + maxacc = {x = 0, y = gravity, z = 0}, + minexptime = 0.1, + maxexptime = 1, + minsize = min_size, + maxsize = max_size, + texture = texture, + glow = glow, + }) +end + + +-- are we flying in what we are suppose to? (taikedz) +local flight_check = function(self) + + local nod = self.standing_in + local def = minetest_registered_nodes[nod] + + if not def then return false end -- nil check + + local fly_in + if type(self.fly_in) == "string" then + fly_in = { self.fly_in } + elseif type(self.fly_in) == "table" then + fly_in = self.fly_in + else + return false + end + + for _,checknode in pairs(fly_in) do + if nod == checknode then + return true + elseif checknode == "__airlike" and def.walkable == false and + (def.liquidtype == "none" or minetest_get_item_group(nod, "fake_liquid") == 1) then + return true + end + end + + return false +end + + +-- check line of sight (BrunoMine) +local line_of_sight = function(self, pos1, pos2, stepsize) + + stepsize = stepsize or 1 + + local s, pos = minetest_line_of_sight(pos1, pos2, stepsize) + + -- normal walking and flying mobs can see you through air + if s == true then + return true + end + + -- New pos1 to be analyzed + local npos1 = {x = pos1.x, y = pos1.y, z = pos1.z} + + local r, pos = minetest_line_of_sight(npos1, pos2, stepsize) + + -- Checks the return + if r == true then return true end + + -- Nodename found + local nn = minetest_get_node(pos).name + + -- Target Distance (td) to travel + local td = vector.distance(pos1, pos2) + + -- Actual Distance (ad) traveled + local ad = 0 + + -- It continues to advance in the line of sight in search of a real + -- obstruction which counts as 'normal' nodebox. + while minetest_registered_nodes[nn] + and minetest_registered_nodes[nn].walkable == false do + + -- Check if you can still move forward + if td < ad + stepsize then + return true -- Reached the target + end + + -- Moves the analyzed pos + local d = vector.distance(pos1, pos2) + + npos1.x = ((pos2.x - pos1.x) / d * stepsize) + pos1.x + npos1.y = ((pos2.y - pos1.y) / d * stepsize) + pos1.y + npos1.z = ((pos2.z - pos1.z) / d * stepsize) + pos1.z + + -- NaN checks + if d == 0 + or npos1.x ~= npos1.x + or npos1.y ~= npos1.y + or npos1.z ~= npos1.z then + return false + end + + ad = ad + stepsize + + -- scan again + r, pos = minetest_line_of_sight(npos1, pos2, stepsize) + + if r == true then return true end + + -- New Nodename found + nn = minetest_get_node(pos).name + + end + + return false +end + +-- Returns true if node is a water hazard +local is_node_waterhazard = function(self, nodename) + local nn = nodename + if self.water_damage > 0 then + if minetest_get_item_group(nn, "water") ~= 0 then + return true + end + end + if minetest_registered_nodes[nn] and minetest_registered_nodes[nn].drowning and minetest_registered_nodes[nn].drowning > 0 then + if self.breath_max ~= -1 then + -- check if the mob is water-breathing _and_ the block is water; only return true if neither is the case + -- this will prevent water-breathing mobs to classify water or e.g. sand below them as dangerous + if not self.breathes_in_water and minetest_get_item_group(nn, "water") ~= 0 then + return true end end end - 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 + return false end +-- Returns true is node can deal damage to self +local is_node_dangerous = function(self, nodename) + local nn = nodename + if self.lava_damage > 0 then + if minetest_get_item_group(nn, "lava") ~= 0 then + return true + end + end + if self.fire_damage > 0 then + if minetest_get_item_group(nn, "fire") ~= 0 then + return true + end + end + if minetest_registered_nodes[nn] and minetest_registered_nodes[nn].damage_per_second and minetest_registered_nodes[nn].damage_per_second > 0 then + return true + end + return false +end + + +local add_texture_mod = function(self, mod) + local full_mod = "" + local already_added = false + for i=1, #self.texture_mods do + if mod == self.texture_mods[i] then + already_added = true + end + full_mod = full_mod .. self.texture_mods[i] + end + if not already_added then + full_mod = full_mod .. mod + table.insert(self.texture_mods, mod) + end + self.object:set_texture_mod(full_mod) +end + + +local remove_texture_mod = function(self, mod) + local full_mod = "" + local remove = {} + for i=1, #self.texture_mods do + if self.texture_mods[i] ~= mod then + full_mod = full_mod .. self.texture_mods[i] + else + table.insert(remove, i) + end + end + for i=#remove, 1 do + table.remove(self.texture_mods, remove[i]) + end + self.object:set_texture_mod(full_mod) +end + + +-- Return true if object is in view_range +local function object_in_range(self, object) + if not object then + return false + end + local factor + -- Apply view range reduction for special player armor + if not object then + return false + end + local factor + -- Apply view range reduction for special player armor + if object:is_player() and mod_armor then + local factors = mcl_armor.player_view_range_factors[object] + factor = factors and factors[self.name] + end + -- Distance check + local dist + if factor and factor == 0 then + return false + elseif factor then + dist = self.view_range * factor + else + dist = self.view_range + end + + local p1, p2 = self.object:get_pos(), object:get_pos() + return p1 and p2 and (vector.distance(p1, p2) <= dist) +end + +-- attack player/mob +local do_attack = function(self, player) + + if self.state == "attack" or self.state == "die" then + return + end + + self.attack = player + self.state = "attack" + + -- TODO: Implement war_cry sound without being annoying + --if math_random(0, 100) < 90 then + --mob_sound(self, "war_cry", true) + --end +end + + +-- play sound +local mob_sound = function(self, soundname, is_opinion, fixed_pitch) + local soundinfo + if self.sounds_child and self.child then + soundinfo = self.sounds_child + elseif self.sounds then + soundinfo = self.sounds + end + if not soundinfo then + return + end + local sound = soundinfo[soundname] + if sound then + if is_opinion and self.opinion_sound_cooloff > 0 then + return + end + local pitch + if not fixed_pitch then + local base_pitch = soundinfo.base_pitch + if not base_pitch then + base_pitch = 1 + end + if self.child and (not self.sounds_child) then + -- Children have higher pitch + pitch = base_pitch * 1.5 + else + pitch = base_pitch + end + -- randomize the pitch a bit + pitch = pitch + math_random(-10, 10) * 0.005 + end + minetest_sound_play(sound, { + object = self.object, + gain = 1.0, + max_hear_distance = self.sounds.distance, + pitch = pitch, + }, true) + self.opinion_sound_cooloff = 1 + end +end + + +local function update_roll(self) + local is_Fleckenstein = self.nametag == "Fleckenstein" + local was_Fleckenstein = false + + local rot = self.object:get_rotation() + rot.z = is_Fleckenstein and math_pi or 0 + self.object:set_rotation(rot) + + local cbox = table.copy(self.collisionbox) + local acbox = self.object:get_properties().collisionbox + + if math_abs(cbox[2] - acbox[2]) > 0.1 then + was_Fleckenstein = true + end + + if is_Fleckenstein ~= was_Fleckenstein then + local pos = self.object:get_pos() + pos.y = pos.y + (acbox[2] + acbox[5]) + self.object:set_pos(pos) + end + + if is_Fleckenstein then + cbox[2], cbox[5] = -cbox[5], -cbox[2] + end + + self.object:set_properties({collisionbox = cbox}) +end + + + -- is mob facing a cliff or danger local is_at_cliff_or_danger = function(self) @@ -951,23 +1450,23 @@ local is_at_cliff_or_danger = function(self) return false end local yaw = self.object:get_yaw() - local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) - local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) + local dir_x = -math_sin(yaw) * (self.collisionbox[4] + 0.5) + local dir_z = math_cos(yaw) * (self.collisionbox[4] + 0.5) local pos = self.object:get_pos() local ypos = pos.y + self.collisionbox[2] -- just above floor - local free_fall, blocker = minetest.line_of_sight( + local free_fall, blocker = minetest_line_of_sight( {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, {x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z}) if free_fall then return true else - local bnode = minetest.get_node(blocker) + local bnode = minetest_get_node(blocker) local danger = is_node_dangerous(self, bnode.name) if danger then return true else - local def = minetest.registered_nodes[bnode.name] + local def = minetest_registered_nodes[bnode.name] if def and def.walkable then return false end @@ -986,18 +1485,18 @@ local is_at_water_danger = function(self) return false end local yaw = self.object:get_yaw() - local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) - local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) + local dir_x = -math_sin(yaw) * (self.collisionbox[4] + 0.5) + local dir_z = math_cos(yaw) * (self.collisionbox[4] + 0.5) local pos = self.object:get_pos() local ypos = pos.y + self.collisionbox[2] -- just above floor - local free_fall, blocker = minetest.line_of_sight( + local free_fall, blocker = minetest_line_of_sight( {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, {x = pos.x + dir_x, y = ypos - 3, z = pos.z + dir_z}) if free_fall then return true else - local bnode = minetest.get_node(blocker) + local bnode = minetest_get_node(blocker) local waterdanger = is_node_waterhazard(self, bnode.name) if waterdanger and (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) then @@ -1005,7 +1504,7 @@ local is_at_water_danger = function(self) elseif waterdanger and (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) == false then return true else - local def = minetest.registered_nodes[bnode.name] + local def = minetest_registered_nodes[bnode.name] if def and def.walkable then return false end @@ -1015,21 +1514,6 @@ local is_at_water_danger = function(self) return false end - --- get node but use fallback for nil or unknown -local node_ok = function(pos, fallback) - - fallback = fallback or mobs.fallback_node - - local node = minetest.get_node_or_nil(pos) - - if node and minetest.registered_nodes[node.name] then - return node - end - - return minetest.registered_nodes[fallback] -end - local function get_light(pos, tod) if minetest.get_node_or_nil(pos) then local lightfunc = minetest.get_natural_light or minetest.get_node_light @@ -1121,7 +1605,7 @@ local do_env_damage = function(self) self.object:set_velocity({x = 0, y = 0, z = 0}) end - local nodef = minetest.registered_nodes[self.standing_in] + local nodef = minetest_registered_nodes[self.standing_in] -- rain if self.rain_damage > 0 and mod_weather then @@ -1203,7 +1687,7 @@ local do_env_damage = function(self) if self.breath_max ~= -1 then local drowning = false if self.breathes_in_water then - if minetest.get_item_group(self.standing_in, "water") == 0 then + if minetest_get_item_group(self.standing_in, "water") == 0 then drowning = true end elseif nodef.drowning > 0 then @@ -1211,7 +1695,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 @@ -1229,7 +1713,7 @@ local do_env_damage = function(self) return true end else - self.breath = math.min(self.breath_max, self.breath + 1) + self.breath = math_min(self.breath_max, self.breath + 1) end end @@ -1295,13 +1779,13 @@ local do_jump = function(self) local nod = node_ok(pos) - if minetest.registered_nodes[nod.name].walkable == false then + if minetest_registered_nodes[nod.name].walkable == false then return false end -- where is front - local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5) - local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5) + local dir_x = -math_sin(yaw) * (self.collisionbox[4] + 0.5) + local dir_z = math_cos(yaw) * (self.collisionbox[4] + 0.5) -- what is in front of mob? nod = node_ok({ @@ -1319,7 +1803,7 @@ local do_jump = function(self) }, "air") -- we don't attempt to jump if there's a stack of blocks blocking - if minetest.registered_nodes[nodTop.name].walkable == true then + if minetest_registered_nodes[nodTop.name].walkable == true then return false end @@ -1329,11 +1813,11 @@ local do_jump = function(self) end if self.walk_chance == 0 - or minetest.registered_items[nod.name].walkable then + or minetest_registered_items[nod.name].walkable then - if minetest.get_item_group(nod.name, "fence") == 0 - and minetest.get_item_group(nod.name, "fence_gate") == 0 - and minetest.get_item_group(nod.name, "wall") == 0 then + if minetest_get_item_group(nod.name, "fence") == 0 + and minetest_get_item_group(nod.name, "fence_gate") == 0 + and minetest_get_item_group(nod.name, "wall") == 0 then local v = self.object:get_velocity() @@ -1344,7 +1828,7 @@ local do_jump = function(self) self.object:set_velocity(v) -- when in air move forward - minetest.after(0.3, function(self, v) + minetest_after(0.3, function(self, v) if (not self.object) or (not self.object:get_luaentity()) or (self.state == "die") then return end @@ -1391,7 +1875,7 @@ local entity_physics = function(pos, radius) radius = radius * 2 - local objs = minetest.get_objects_inside_radius(pos, radius) + local objs = minetest_get_objects_inside_radius(pos, radius) local obj_pos, dist for n = 1, #objs do @@ -1401,7 +1885,7 @@ local entity_physics = function(pos, radius) dist = vector.distance(pos, obj_pos) if dist < 1 then dist = 1 end - local damage = floor((4 / dist) * radius) + local damage = math_floor((4 / dist) * radius) local ent = objs[n]:get_luaentity() -- punches work on entities AND players @@ -1481,14 +1965,14 @@ local breed = function(self) return end - -- horny animal can mate for HORNY_TIME seconds, - -- afterwards horny animal cannot mate again for HORNY_AGAIN_TIME seconds + -- horny animal can mate for BREED_TIME seconds, + -- afterwards horny animal cannot mate again for BREED_TIME_AGAIN seconds if self.horny == true - and self.hornytimer < HORNY_TIME + HORNY_AGAIN_TIME then + and self.hornytimer < BREED_TIME + BREED_TIME_AGAIN then self.hornytimer = self.hornytimer + 1 - if self.hornytimer >= HORNY_TIME + HORNY_AGAIN_TIME then + if self.hornytimer >= BREED_TIME + BREED_TIME_AGAIN then self.hornytimer = 0 self.horny = false end @@ -1496,13 +1980,13 @@ local breed = function(self) -- find another same animal who is also horny and mate if nearby if self.horny == true - and self.hornytimer <= HORNY_TIME then + and self.hornytimer <= BREED_TIME then local pos = self.object:get_pos() effect({x = pos.x, y = pos.y + 1, z = pos.z}, 8, "heart.png", 3, 4, 1, 0.1) - local objs = minetest.get_objects_inside_radius(pos, 3) + local objs = minetest_get_objects_inside_radius(pos, 3) local num = 0 local ent = nil @@ -1535,18 +2019,18 @@ local breed = function(self) if ent and canmate == true and ent.horny == true - and ent.hornytimer <= HORNY_TIME then + and ent.hornytimer <= BREED_TIME then num = num + 1 end -- found your mate? then have a baby if num > 1 then - self.hornytimer = HORNY_TIME + 1 - ent.hornytimer = HORNY_TIME + 1 + self.hornytimer = BREED_TIME + 1 + ent.hornytimer = BREED_TIME + 1 -- spawn baby - minetest.after(5, function(parent1, parent2, pos) + minetest_after(5, function(parent1, parent2, pos) if not parent1.object:get_luaentity() then return end @@ -1556,7 +2040,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 @@ -1573,7 +2057,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 @@ -1596,7 +2080,6 @@ local breed = function(self) end end - -- find and replace what mob is looking for (grass, wheat etc.) local replace = function(self, pos) @@ -1604,7 +2087,7 @@ local replace = function(self, pos) or not self.replace_what or self.child == true or self.object:get_velocity().y ~= 0 - or random(1, self.replace_rate) > 1 then + or math_random(1, self.replace_rate) > 1 then return end @@ -1612,7 +2095,7 @@ local replace = function(self, pos) if type(self.replace_what[1]) == "table" then - local num = 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 "" @@ -1625,7 +2108,7 @@ local replace = function(self, pos) pos.y = pos.y + y_offset - local node = minetest.get_node(pos) + local node = minetest_get_node(pos) if node.name == what then local oldnode = {name = what, param2 = node.param2} @@ -1639,7 +2122,7 @@ local replace = function(self, pos) if on_replace_return ~= false then if mobs_griefing then - minetest.set_node(pos, newnode) + minetest_set_node(pos, newnode) end end @@ -1663,650 +2146,24 @@ local day_docile = function(self) end -local los_switcher = false -local height_switcher = false --- path finding and smart mob routine by rnd, line_of_sight and other edits by Elkien3 -local smart_mobs = function(self, s, p, dist, dtime) +local mob_detach_child = function(self, child) - local s1 = self.path.lastpos - - local target_pos = self.attack:get_pos() - - -- is it becoming stuck? - if abs(s1.x - s.x) + abs(s1.z - s.z) < .5 then - self.path.stuck_timer = self.path.stuck_timer + dtime - else - self.path.stuck_timer = 0 + if self.driver == child then + self.driver = nil end - self.path.lastpos = {x = s.x, y = s.y, z = s.z} - - local use_pathfind = false - local has_lineofsight = minetest.line_of_sight( - {x = s.x, y = (s.y) + .5, z = s.z}, - {x = target_pos.x, y = (target_pos.y) + 1.5, z = target_pos.z}, .2) - - -- im stuck, search for path - if not has_lineofsight then - - if los_switcher == true then - use_pathfind = true - los_switcher = false - end -- cannot see target! - else - if los_switcher == false then - - los_switcher = true - use_pathfind = false - - minetest.after(1, function(self) - if not self.object:get_luaentity() then - return - end - if has_lineofsight then self.path.following = false end - end, self) - end -- can see target! - end - - if (self.path.stuck_timer > stuck_timeout and not self.path.following) then - - use_pathfind = true - self.path.stuck_timer = 0 - - minetest.after(1, function(self) - if not self.object:get_luaentity() then - return - end - if has_lineofsight then self.path.following = false end - end, self) - end - - if (self.path.stuck_timer > stuck_path_timeout and self.path.following) then - - use_pathfind = true - self.path.stuck_timer = 0 - - minetest.after(1, function(self) - if not self.object:get_luaentity() then - return - end - if has_lineofsight then self.path.following = false end - end, self) - end - - if math.abs(vector.subtract(s,target_pos).y) > self.stepheight then - - if height_switcher then - use_pathfind = true - height_switcher = false - end - else - if not height_switcher then - use_pathfind = false - height_switcher = true - end - end - - if use_pathfind then - -- lets try find a path, first take care of positions - -- since pathfinder is very sensitive - local sheight = self.collisionbox[5] - self.collisionbox[2] - - -- round position to center of node to avoid stuck in walls - -- also adjust height for player models! - s.x = floor(s.x + 0.5) - s.z = floor(s.z + 0.5) - - local ssight, sground = minetest.line_of_sight(s, { - x = s.x, y = s.y - 4, z = s.z}, 1) - - -- determine node above ground - if not ssight then - s.y = sground.y + 1 - end - - local p1 = self.attack:get_pos() - - p1.x = floor(p1.x + 0.5) - p1.y = floor(p1.y + 0.5) - p1.z = floor(p1.z + 0.5) - - local dropheight = 12 - if self.fear_height ~= 0 then dropheight = self.fear_height end - local jumpheight = 0 - if self.jump and self.jump_height >= 4 then - jumpheight = math.min(math.ceil(self.jump_height / 4), 4) - elseif self.stepheight > 0.5 then - jumpheight = 1 - end - self.path.way = minetest.find_path(s, p1, 16, jumpheight, dropheight, "A*_noprefetch") - - self.state = "" - do_attack(self, self.attack) - - -- no path found, try something else - if not self.path.way then - - self.path.following = false - - -- lets make way by digging/building if not accessible - if self.pathfinding == 2 and mobs_griefing then - - -- is player higher than mob? - if s.y < p1.y then - - -- build upwards - if not minetest.is_protected(s, "") then - - local ndef1 = minetest.registered_nodes[self.standing_in] - - if ndef1 and (ndef1.buildable_to or ndef1.groups.liquid) then - - minetest.set_node(s, {name = mobs.fallback_node}) - end - end - - local sheight = math.ceil(self.collisionbox[5]) + 1 - - -- assume mob is 2 blocks high so it digs above its head - s.y = s.y + sheight - - -- remove one block above to make room to jump - if not minetest.is_protected(s, "") then - - local node1 = node_ok(s, "air").name - local ndef1 = minetest.registered_nodes[node1] - - if node1 ~= "air" - and node1 ~= "ignore" - and ndef1 - and not ndef1.groups.level - and not ndef1.groups.unbreakable - and not ndef1.groups.liquid then - - minetest.set_node(s, {name = "air"}) - minetest.add_item(s, ItemStack(node1)) - - end - end - - s.y = s.y - sheight - self.object:set_pos({x = s.x, y = s.y + 2, z = s.z}) - - else -- dig 2 blocks to make door toward player direction - - local yaw1 = self.object:get_yaw() + pi / 2 - local p1 = { - x = s.x + cos(yaw1), - y = s.y, - z = s.z + sin(yaw1) - } - - if not minetest.is_protected(p1, "") then - - local node1 = node_ok(p1, "air").name - local ndef1 = minetest.registered_nodes[node1] - - if node1 ~= "air" - and node1 ~= "ignore" - and ndef1 - and not ndef1.groups.level - and not ndef1.groups.unbreakable - and not ndef1.groups.liquid then - - minetest.add_item(p1, ItemStack(node1)) - minetest.set_node(p1, {name = "air"}) - end - - p1.y = p1.y + 1 - node1 = node_ok(p1, "air").name - ndef1 = minetest.registered_nodes[node1] - - if node1 ~= "air" - and node1 ~= "ignore" - and ndef1 - and not ndef1.groups.level - and not ndef1.groups.unbreakable - and not ndef1.groups.liquid then - - minetest.add_item(p1, ItemStack(node1)) - minetest.set_node(p1, {name = "air"}) - end - - end - end - end - - -- will try again in 2 seconds - self.path.stuck_timer = stuck_timeout - 2 - elseif s.y < p1.y and (not self.fly) then - do_jump(self) --add jump to pathfinding - self.path.following = true - -- Yay, I found path! - -- TODO: Implement war_cry sound without being annoying - --mob_sound(self, "war_cry", true) - else - set_velocity(self, self.walk_velocity) - - -- follow path now that it has it - self.path.following = true - end - end end - --- specific attacks -local specific_attack = function(list, what) - - -- no list so attack default (player, animals etc.) - if list == nil then - return true - end - - -- found entity on list to attack? - for no = 1, #list do - - if list[no] == what then - return true - end - end - - return false -end - --- monster find someone to attack -local monster_attack = function(self) - - if self.type ~= "monster" - or not damage_enabled - or minetest.is_creative_enabled("") - or self.passive - or self.state == "attack" - or day_docile(self) then - return - end - - local s = self.object:get_pos() - local p, sp, dist - local player, obj, min_player - local type, name = "", "" - local min_dist = self.view_range + 1 - local objs = minetest.get_objects_inside_radius(s, self.view_range) - - for n = 1, #objs do - - if objs[n]:is_player() then - - if mobs.invis[ objs[n]:get_player_name() ] or (not object_in_range(self, objs[n])) then - type = "" - else - player = objs[n] - type = "player" - name = "player" - end - else - obj = objs[n]:get_luaentity() - - if obj then - player = obj.object - type = obj.type - name = obj.name or "" - end - end - - -- find specific mob to attack, failing that attack player/npc/animal - if specific_attack(self.specific_attack, name) - and (type == "player" or type == "npc" - or (type == "animal" and self.attack_animals == true)) then - - p = player:get_pos() - sp = s - - dist = vector.distance(p, s) - - -- aim higher to make looking up hills more realistic - p.y = p.y + 1 - sp.y = sp.y + 1 - - - -- choose closest player to attack - if dist < min_dist - and line_of_sight(self, sp, p, 2) == true then - min_dist = dist - min_player = player - end - end - end - - -- attack player - if min_player then - do_attack(self, min_player) - end -end - - --- npc, find closest monster to attack -local npc_attack = function(self) - - if self.type ~= "npc" - or not self.attacks_monsters - or self.state == "attack" then - return - end - - local p, sp, obj, min_player - local s = self.object:get_pos() - local min_dist = self.view_range + 1 - local objs = minetest.get_objects_inside_radius(s, self.view_range) - - for n = 1, #objs do - - obj = objs[n]:get_luaentity() - - if obj and obj.type == "monster" then - - p = obj.object:get_pos() - sp = s - - local dist = vector.distance(p, s) - - -- aim higher to make looking up hills more realistic - p.y = p.y + 1 - sp.y = sp.y + 1 - - if dist < min_dist - and line_of_sight(self, sp, p, 2) == true then - min_dist = dist - min_player = obj.object - end - end - end - - if min_player then - do_attack(self, min_player) - end -end - - --- specific runaway -local specific_runaway = function(list, what) - - -- no list so do not run - if list == nil then - return false - end - - -- found entity on list to attack? - for no = 1, #list do - - if list[no] == what then - return true - end - end - - return false -end - - --- find someone to runaway from -local runaway_from = function(self) - - if not self.runaway_from and self.state ~= "flop" then - return - end - - local s = self.object:get_pos() - local p, sp, dist - local player, obj, min_player - local type, name = "", "" - local min_dist = self.view_range + 1 - local objs = minetest.get_objects_inside_radius(s, self.view_range) - - for n = 1, #objs do - - if objs[n]:is_player() then - - if mobs.invis[ objs[n]:get_player_name() ] - or self.owner == objs[n]:get_player_name() - or (not object_in_range(self, objs[n])) then - type = "" - else - player = objs[n] - type = "player" - name = "player" - end - else - obj = objs[n]:get_luaentity() - - if obj then - player = obj.object - type = obj.type - name = obj.name or "" - end - end - - -- find specific mob to runaway from - if name ~= "" and name ~= self.name - and specific_runaway(self.runaway_from, name) then - - p = player:get_pos() - sp = s - - -- aim higher to make looking up hills more realistic - p.y = p.y + 1 - sp.y = sp.y + 1 - - dist = vector.distance(p, s) - - - -- choose closest player/mpb to runaway from - if dist < min_dist - and line_of_sight(self, sp, p, 2) == true then - min_dist = dist - min_player = player - end - end - end - - if min_player then - - local lp = player:get_pos() - local vec = { - x = lp.x - s.x, - y = lp.y - s.y, - z = lp.z - s.z - } - - local yaw = (atan(vec.z / vec.x) + 3 * pi / 2) - self.rotate - - if lp.x > s.x then - yaw = yaw + pi - end - - yaw = set_yaw(self, yaw, 4) - self.state = "runaway" - self.runaway_timer = 3 - self.following = nil - end -end - - --- follow player if owner or holding item, if fish outta water then flop -local follow_flop = function(self) - - -- find player to follow - if (self.follow ~= "" - or self.order == "follow") - and not self.following - and self.state ~= "attack" - and self.order ~= "sit" - and self.state ~= "runaway" then - - local s = self.object:get_pos() - local players = minetest.get_connected_players() - - for n = 1, #players do - - if (object_in_range(self, players[n])) - and not mobs.invis[ players[n]:get_player_name() ] then - - self.following = players[n] - - break - end - end - end - - if self.type == "npc" - and self.order == "follow" - and self.state ~= "attack" - and self.order ~= "sit" - and self.owner ~= "" then - - -- npc stop following player if not owner - if self.following - and self.owner - and self.owner ~= self.following:get_player_name() then - self.following = nil - end - else - -- stop following player if not holding specific item, - -- mob is horny, fleeing or attacking - if self.following - and self.following:is_player() - and (follow_holding(self, self.following) == false or - self.horny or self.state == "runaway") then - self.following = nil - end - - end - - -- follow that thing - if self.following then - - local s = self.object:get_pos() - local p - - if self.following:is_player() then - - p = self.following:get_pos() - - elseif self.following.object then - - p = self.following.object:get_pos() - end - - if p then - - local dist = vector.distance(p, s) - - -- dont follow if out of range - if (not object_in_range(self, self.following)) then - self.following = nil - else - local vec = { - x = p.x - s.x, - z = p.z - s.z - } - - local yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate - - if p.x > s.x then yaw = yaw + pi end - - set_yaw(self, yaw, 2.35) - - -- anyone but standing npc's can move along - if dist > 3 - and self.order ~= "stand" then - - set_velocity(self, self.follow_velocity) - - if self.walk_chance ~= 0 then - set_animation(self, "run") - end - else - set_velocity(self, 0) - set_animation(self, "stand") - end - - return - end - end - end - - -- swimmers flop when out of their element, and swim again when back in - if self.fly then - local s = self.object:get_pos() - if not flight_check(self, s) then - - self.state = "flop" - self.object:set_acceleration({x = 0, y = DEFAULT_FALL_SPEED, z = 0}) - - local sdef = minetest.registered_nodes[self.standing_on] - -- Flop on ground - if sdef and sdef.walkable then - mob_sound(self, "flop") - self.object:set_velocity({ - x = math.random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), - y = FLOP_HEIGHT, - z = math.random(-FLOP_HOR_SPEED, FLOP_HOR_SPEED), - }) - end - - set_animation(self, "stand", true) - - return - elseif self.state == "flop" then - self.state = "stand" - self.object:set_acceleration({x = 0, y = 0, z = 0}) - set_velocity(self, 0) - end - end -end - - --- dogshoot attack switch and counter function -local dogswitch = function(self, dtime) - - -- switch mode not activated - if not self.dogshoot_switch - or not dtime then - return 0 - end - - self.dogshoot_count = self.dogshoot_count + dtime - - if (self.dogshoot_switch == 1 - and self.dogshoot_count > self.dogshoot_count_max) - or (self.dogshoot_switch == 2 - and self.dogshoot_count > self.dogshoot_count2_max) then - - self.dogshoot_count = 0 - - if self.dogshoot_switch == 1 then - self.dogshoot_switch = 2 - else - self.dogshoot_switch = 1 - end - end - - return self.dogshoot_switch -end - --- execute current state (stand, walk, run, attacks) --- returns true if mob has died -local do_states = function(self, dtime) - - local yaw = self.object:get_yaw() or 0 +function do_states(self) if self.state == "stand" then - if random(1, 4) == 1 then + if math_random(1, 4) == 1 then local lp = nil local s = self.object:get_pos() - local objs = minetest.get_objects_inside_radius(s, 3) + local objs = minetest_get_objects_inside_radius(s, 3) for n = 1, #objs do @@ -2324,11 +2181,11 @@ local do_states = function(self, dtime) z = lp.z - s.z } - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate - if lp.x > s.x then yaw = yaw + pi end + if lp.x > s.x then yaw = yaw + math_pi end else - yaw = yaw + random(-0.5, 0.5) + yaw = yaw + math_random(-0.5, 0.5) end yaw = set_yaw(self, yaw, 8) @@ -2343,7 +2200,7 @@ local do_states = function(self, dtime) if self.walk_chance ~= 0 and self.facing_fence ~= true - and 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) @@ -2362,19 +2219,19 @@ local do_states = function(self, dtime) and self.lava_damage > 0) or self.breath_max ~= -1 then - lp = minetest.find_node_near(s, 1, {"group:water", "group:lava"}) + lp = minetest_find_node_near(s, 1, {"group:water", "group:lava"}) elseif self.water_damage > 0 then - lp = minetest.find_node_near(s, 1, {"group:water"}) + lp = minetest_find_node_near(s, 1, {"group:water"}) elseif self.lava_damage > 0 then - lp = minetest.find_node_near(s, 1, {"group:lava"}) + lp = minetest_find_node_near(s, 1, {"group:lava"}) elseif self.fire_damage > 0 then - lp = minetest.find_node_near(s, 1, {"group:fire"}) + lp = minetest_find_node_near(s, 1, {"group:fire"}) end @@ -2388,12 +2245,12 @@ local do_states = function(self, dtime) -- If mob in or on dangerous block, look for land if is_in_danger then -- Better way to find shore - copied from upstream - lp = minetest.find_nodes_in_area_under_air( + lp = minetest_find_nodes_in_area_under_air( {x = s.x - 5, y = s.y - 0.5, z = s.z - 5}, {x = s.x + 5, y = s.y + 1, z = s.z + 5}, {"group:solid"}) - lp = #lp > 0 and lp[random(#lp)] + lp = #lp > 0 and lp[math_random(#lp)] -- did we find land? if lp then @@ -2403,10 +2260,10 @@ local do_states = function(self, dtime) z = lp.z - s.z } - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate - if lp.x > s.x then yaw = yaw + pi end + if lp.x > s.x then yaw = yaw + math_pi end -- look towards land and move in that direction yaw = set_yaw(self, yaw, 6) @@ -2419,8 +2276,8 @@ local do_states = function(self, dtime) else -- Randomly turn - if random(1, 100) <= 30 then - yaw = yaw + 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 @@ -2428,9 +2285,9 @@ local do_states = function(self, dtime) yaw = set_yaw(self, yaw, 8) -- otherwise randomly turn - elseif random(1, 100) <= 30 then + elseif math_random(1, 100) <= 30 then - yaw = yaw + random(-0.5, 0.5) + yaw = yaw + math_random(-0.5, 0.5) yaw = set_yaw(self, yaw, 8) end @@ -2441,7 +2298,7 @@ local do_states = function(self, dtime) end if self.facing_fence == true or cliff_or_danger - or random(1, 100) <= 30 then + or math_random(1, 100) <= 30 then set_velocity(self, 0) self.state = "stand" @@ -2516,9 +2373,9 @@ local do_states = function(self, dtime) z = p.z - s.z } - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate - if p.x > s.x then yaw = yaw + pi end + if p.x > s.x then yaw = yaw + math_pi end yaw = set_yaw(self, yaw, 0, dtime) @@ -2584,10 +2441,10 @@ local do_states = function(self, dtime) local pos = self.object:get_pos() if mod_explosions then - if mobs_griefing and not minetest.is_protected(pos, "") then + if mobs_griefing and not minetest_is_protected(pos, "") then mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { drop_chance = 1.0 }, self.object) else - minetest.sound_play(self.sounds.explode, { + minetest_sound_play(self.sounds.explode, { pos = pos, gain = 1.0, max_hear_distance = self.sounds.distance or 32 @@ -2612,9 +2469,9 @@ local do_states = function(self, dtime) and dist > self.reach then local p1 = s - local me_y = floor(p1.y) + local me_y = math_floor(p1.y) local p2 = p - local p_y = floor(p2.y + 1) + local p_y = math_floor(p2.y + 1) local v = self.object:get_velocity() if flight_check(self, s) then @@ -2675,7 +2532,7 @@ local do_states = function(self, dtime) return end - if abs(p1.x-s.x) + abs(p1.z - s.z) < 0.6 then + if math_abs(p1.x-s.x) + math_abs(p1.z - s.z) < 0.6 then -- reached waypoint, remove it from queue table.remove(self.path.way, 1) end @@ -2689,9 +2546,9 @@ local do_states = function(self, dtime) z = p.z - s.z } - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate - if p.x > s.x then yaw = yaw + pi end + if p.x > s.x then yaw = yaw + math_pi end yaw = set_yaw(self, yaw, 0, dtime) @@ -2741,7 +2598,7 @@ local do_states = function(self, dtime) self.timer = 0 if self.double_melee_attack - and random(1, 2) == 1 then + and math_random(1, 2) == 1 then set_animation(self, "punch2") else set_animation(self, "punch") @@ -2794,9 +2651,9 @@ local do_states = function(self, dtime) z = p.z - s.z } - yaw = (atan(vec.z / vec.x) + pi / 2) - self.rotate + yaw = (atan(vec.z / vec.x) + math_pi / 2) - self.rotate - if p.x > s.x then yaw = yaw + pi end + if p.x > s.x then yaw = yaw + math_pi end yaw = set_yaw(self, yaw, 0, dtime) @@ -2807,8 +2664,8 @@ local do_states = function(self, dtime) if self.shoot_interval and self.timer > self.shoot_interval - and not minetest.raycast(p, self.attack:get_pos(), false, false):next() - and random(1, 100) <= 60 then + and not minetest_raycast(p, self.attack:get_pos(), false, false):next() + and math_random(1, 100) <= 60 then self.timer = 0 set_animation(self, "shoot") @@ -2817,16 +2674,16 @@ local do_states = function(self, dtime) mob_sound(self, "shoot_attack") -- Shoot arrow - if minetest.registered_entities[self.arrow] then + if minetest_registered_entities[self.arrow] then local arrow, ent local v = 1 if not self.shoot_arrow then self.firing = true - minetest.after(1, function() + minetest_after(1, function() self.firing = false end) - arrow = minetest.add_entity(p, self.arrow) + arrow = minetest_add_entity(p, self.arrow) ent = arrow:get_luaentity() if ent.velocity then v = ent.velocity @@ -2854,851 +2711,48 @@ local do_states = function(self, dtime) end --- falling and fall damage --- returns true if mob died -local falling = function(self, pos) - if self.fly and self.state ~= "die" then + +-- above function exported for mount.lua +function mobs:set_animation(self, anim) + set_animation(self, anim) +end + + +-- set defined animation +local set_animation = function(self, anim, fixed_frame) + if not self.animation or not anim then + return + end + if self.state == "die" and anim ~= "die" and anim ~= "stand" then return end - if mcl_portals ~= nil then - if mcl_portals.nether_portal_cooloff(self.object) then - return false -- mob has teleported through Nether portal - it's 99% not falling - end + self.animation.current = self.animation.current or "" + + if (anim == self.animation.current + or not self.animation[anim .. "_start"] + or not self.animation[anim .. "_end"]) and self.state ~= "die" then + return end - -- floating in water (or falling) - local v = self.object:get_velocity() + self.animation.current = anim - if v.y > 0 then - - -- apply gravity when moving up - self.object:set_acceleration({ - x = 0, - y = -10, - z = 0 - }) - - elseif v.y <= 0 and v.y > self.fall_speed then - - -- fall downwards at set speed - self.object:set_acceleration({ - x = 0, - y = self.fall_speed, - z = 0 - }) + local a_start = self.animation[anim .. "_start"] + local a_end + if fixed_frame then + a_end = a_start else - -- stop accelerating once max fall speed hit - self.object:set_acceleration({x = 0, y = 0, z = 0}) + a_end = self.animation[anim .. "_end"] end - if minetest.registered_nodes[node_ok(pos).name].groups.lava then - - if self.floats_on_lava == 1 then - - self.object:set_acceleration({ - x = 0, - y = -self.fall_speed / (max(1, v.y) ^ 2), - z = 0 - }) - end - end - - -- in water then float up - if minetest.registered_nodes[node_ok(pos).name].groups.water then - - if self.floats == 1 then - - self.object:set_acceleration({ - x = 0, - y = -self.fall_speed / (max(1, v.y) ^ 2), - z = 0 - }) - end - else - - -- fall damage onto solid ground - if self.fall_damage == 1 - and self.object:get_velocity().y == 0 then - - local d = (self.old_y or 0) - self.object:get_pos().y - - if d > 5 then - - local add = minetest.get_item_group(self.standing_on, "fall_damage_add_percent") - local damage = d - 5 - if add ~= 0 then - damage = damage + damage * (add/100) - end - damage = floor(damage) - if damage > 0 then - self.health = self.health - damage - - effect(pos, 5, "mcl_particles_smoke.png", 1, 2, 2, nil) - - if check_for_death(self, "fall", {type = "fall"}) then - return true - end - end - end - - self.old_y = self.object:get_pos().y - end - end + self.object:set_animation({ + x = a_start, + y = a_end}, + self.animation[anim .. "_speed"] or self.animation.speed_normal or 15, + 0, self.animation[anim .. "_loop"] ~= false) end -local teleport = function(self, target) - if self.do_teleport then - if self.do_teleport(self, target) == false then - return - end - end -end - - --- deal damage and effects when mob punched -local mob_punch = function(self, hitter, tflp, tool_capabilities, dir) - - -- custom punch function - if self.do_punch then - - -- when false skip going any further - if self.do_punch(self, hitter, tflp, tool_capabilities, dir) == false then - return - end - end - - -- error checking when mod profiling is enabled - if not tool_capabilities then - minetest.log("warning", "[mobs] Mod profiling enabled, damage not enabled") - return - end - - local is_player = hitter:is_player() - - if is_player then - -- is mob protected? - if self.protected and minetest.is_protected(self.object:get_pos(), hitter:get_player_name()) then - return - end - - -- set/update 'drop xp' timestamp if hitted by player - self.xp_timestamp = minetest.get_us_time() - end - - - -- punch interval - local weapon = hitter:get_wielded_item() - local punch_interval = 1.4 - - -- exhaust attacker - if mod_hunger and is_player then - mcl_hunger.exhaust(hitter:get_player_name(), mcl_hunger.EXHAUST_ATTACK) - end - - -- calculate mob damage - local damage = 0 - local armor = self.object:get_armor_groups() or {} - local tmp - - -- quick error check incase it ends up 0 (serialize.h check test) - if tflp == 0 then - tflp = 0.2 - end - - if use_cmi then - damage = cmi.calculate_damage(self.object, hitter, tflp, tool_capabilities, dir) - else - - for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do - - tmp = tflp / (tool_capabilities.full_punch_interval or 1.4) - - if tmp < 0 then - tmp = 0.0 - elseif tmp > 1 then - tmp = 1.0 - end - - damage = damage + (tool_capabilities.damage_groups[group] or 0) - * tmp * ((armor[group] or 0) / 100.0) - end - end - - if weapon then - local fire_aspect_level = mcl_enchanting.get_enchantment(weapon, "fire_aspect") - if fire_aspect_level > 0 then - mcl_burning.set_on_fire(self.object, fire_aspect_level * 4) - end - end - - -- check for tool immunity or special damage - for n = 1, #self.immune_to do - - if self.immune_to[n][1] == weapon:get_name() then - - damage = self.immune_to[n][2] or 0 - break - end - end - - -- healing - if damage <= -1 then - self.health = self.health - floor(damage) - return - end - - if use_cmi then - - local cancel = cmi.notify_punch(self.object, hitter, tflp, tool_capabilities, dir, damage) - - if cancel then return end - end - - if tool_capabilities then - punch_interval = tool_capabilities.full_punch_interval or 1.4 - end - - -- add weapon wear manually - -- Required because we have custom health handling ("health" property) - if minetest.is_creative_enabled("") ~= true - and tool_capabilities then - if tool_capabilities.punch_attack_uses then - -- Without this delay, the wear does not work. Quite hacky ... - minetest.after(0, function(name) - local player = minetest.get_player_by_name(name) - if not player then return end - local weapon = hitter:get_wielded_item(player) - local def = weapon:get_definition() - if def.tool_capabilities and def.tool_capabilities.punch_attack_uses then - local wear = floor(65535/tool_capabilities.punch_attack_uses) - weapon:add_wear(wear) - hitter:set_wielded_item(weapon) - end - end, hitter:get_player_name()) - end - end - - local die = false - - -- only play hit sound and show blood effects if damage is 1 or over; lower to 0.1 to ensure armor works appropriately. - if damage >= 0.1 then - - -- weapon sounds - if weapon:get_definition().sounds ~= nil then - - local s = random(0, #weapon:get_definition().sounds) - - minetest.sound_play(weapon:get_definition().sounds[s], { - object = self.object, --hitter, - max_hear_distance = 8 - }, true) - else - minetest.sound_play("default_punch", { - object = self.object, - max_hear_distance = 5 - }, true) - end - - damage_effect(self, damage) - - -- do damage - self.health = self.health - damage - - -- skip future functions if dead, except alerting others - if check_for_death(self, "hit", {type = "punch", puncher = hitter}) then - die = true - end - - -- knock back effect (only on full punch) - if not die - and self.knock_back - and tflp >= punch_interval then - - local v = self.object:get_velocity() - local r = 1.4 - min(punch_interval, 1.4) - local kb = r * 2.0 - local up = 2 - - -- if already in air then dont go up anymore when hit - if v.y ~= 0 - or self.fly then - up = 0 - end - - -- direction error check - dir = dir or {x = 0, y = 0, z = 0} - - -- check if tool already has specific knockback value - if tool_capabilities.damage_groups["knockback"] then - kb = tool_capabilities.damage_groups["knockback"] - else - kb = kb * 1.5 - end - - - local luaentity - if hitter then - luaentity = hitter:get_luaentity() - end - if hitter and is_player then - local wielditem = hitter:get_wielded_item() - kb = kb + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") - elseif luaentity and luaentity._knockback then - kb = kb + luaentity._knockback - end - - self.object:set_velocity({ - x = dir.x * kb, - y = dir.y * kb + up * 2, - z = dir.z * kb - }) - - self.pause_timer = 0.25 - end - end -- END if damage - - -- if skittish then run away - if not die and self.runaway == true and self.state ~= "flop" then - - local lp = hitter:get_pos() - local s = self.object:get_pos() - local vec = { - x = lp.x - s.x, - y = lp.y - s.y, - z = lp.z - s.z - } - - local yaw = (atan(vec.z / vec.x) + 3 * pi / 2) - self.rotate - - if lp.x > s.x then - yaw = yaw + pi - end - - yaw = set_yaw(self, yaw, 6) - self.state = "runaway" - self.runaway_timer = 0 - self.following = nil - end - - local name = hitter:get_player_name() or "" - - -- attack puncher and call other mobs for help - if self.passive == false - and self.state ~= "flop" - and (self.child == false or self.type == "monster") - and hitter:get_player_name() ~= self.owner - and not mobs.invis[ name ] then - - if not die then - -- attack whoever punched mob - self.state = "" - do_attack(self, hitter) - end - - -- alert others to the attack - local objs = minetest.get_objects_inside_radius(hitter:get_pos(), self.view_range) - local obj = nil - - for n = 1, #objs do - - obj = objs[n]:get_luaentity() - - if obj then - - -- only alert members of same mob or friends - if obj.group_attack - and obj.state ~= "attack" - and obj.owner ~= name then - if obj.name == self.name then - do_attack(obj, hitter) - elseif type(obj.group_attack) == "table" then - for i=1, #obj.group_attack do - if obj.name == obj.group_attack[i] then - do_attack(obj, hitter) - break - end - end - end - end - - -- have owned mobs attack player threat - if obj.owner == name and obj.owner_loyal then - do_attack(obj, self.object) - end - end - end - end -end - -local mob_detach_child = function(self, child) - - if self.driver == child then - self.driver = nil - end - -end - --- get entity staticdata -local mob_staticdata = function(self) - ---[[ - -- remove mob when out of range unless tamed - if remove_far - and self.can_despawn - and self.remove_ok - and ((not self.nametag) or (self.nametag == "")) - and self.lifetimer <= 20 then - - minetest.log("action", "Mob "..name.." despawns in mob_staticdata at "..minetest.pos_to_string(self.object.get_pos(), 1)) - mcl_burning.extinguish(self.object) - self.object:remove() - - return ""-- nil - end ---]] - self.remove_ok = true - self.attack = nil - self.following = nil - self.state = "stand" - - if use_cmi then - self.serialized_cmi_components = cmi.serialize_components(self._cmi_components) - end - - local tmp = {} - - for _,stat in pairs(self) do - - local t = type(stat) - - if t ~= "function" - and t ~= "nil" - and t ~= "userdata" - and _ ~= "_cmi_components" then - tmp[_] = self[_] - end - end - - return minetest.serialize(tmp) -end - - --- activate mob and reload settings -local mob_activate = function(self, staticdata, def, dtime) - - -- remove monsters in peaceful mode - if self.type == "monster" - and minetest.settings:get_bool("only_peaceful_mobs", false) then - mcl_burning.extinguish(self.object) - self.object:remove() - - return - end - - -- load entity variables - local tmp = minetest.deserialize(staticdata) - - if tmp then - for _,stat in pairs(tmp) do - self[_] = stat - end - end - - -- select random texture, set model and size - if not self.base_texture then - - -- compatiblity with old simple mobs textures - if type(def.textures[1]) == "string" then - def.textures = {def.textures} - end - - self.base_texture = def.textures[random(1, #def.textures)] - self.base_mesh = def.mesh - self.base_size = self.visual_size - self.base_colbox = self.collisionbox - self.base_selbox = self.selectionbox - end - - -- for current mobs that dont have this set - if not self.base_selbox then - self.base_selbox = self.selectionbox or self.base_colbox - end - - -- set texture, model and size - local textures = self.base_texture - local mesh = self.base_mesh - local vis_size = self.base_size - local colbox = self.base_colbox - local selbox = self.base_selbox - - -- specific texture if gotten - if self.gotten == true - and def.gotten_texture then - textures = def.gotten_texture - end - - -- specific mesh if gotten - if self.gotten == true - and def.gotten_mesh then - mesh = def.gotten_mesh - end - - -- set child objects to half size - if self.child == true then - - vis_size = { - x = self.base_size.x * .5, - y = self.base_size.y * .5, - } - - if def.child_texture then - textures = def.child_texture[1] - end - - colbox = { - self.base_colbox[1] * .5, - self.base_colbox[2] * .5, - self.base_colbox[3] * .5, - self.base_colbox[4] * .5, - self.base_colbox[5] * .5, - self.base_colbox[6] * .5 - } - selbox = { - self.base_selbox[1] * .5, - self.base_selbox[2] * .5, - self.base_selbox[3] * .5, - self.base_selbox[4] * .5, - self.base_selbox[5] * .5, - self.base_selbox[6] * .5 - } - end - - if self.health == 0 then - self.health = random (self.hp_min, self.hp_max) - end - if self.breath == nil then - self.breath = self.breath_max - end - - -- pathfinding init - self.path = {} - self.path.way = {} -- path to follow, table of positions - self.path.lastpos = {x = 0, y = 0, z = 0} - self.path.stuck = false - self.path.following = false -- currently following path? - self.path.stuck_timer = 0 -- if stuck for too long search for path - - -- Armor groups - -- immortal=1 because we use custom health - -- handling (using "health" property) - local armor - if type(self.armor) == "table" then - armor = table.copy(self.armor) - armor.immortal = 1 - else - armor = {immortal=1, fleshy = self.armor} - end - self.object:set_armor_groups(armor) - self.old_y = self.object:get_pos().y - self.old_health = self.health - self.sounds.distance = self.sounds.distance or 10 - self.textures = textures - self.mesh = mesh - self.collisionbox = colbox - self.selectionbox = selbox - self.visual_size = vis_size - self.standing_in = "ignore" - self.standing_on = "ignore" - self.jump_sound_cooloff = 0 -- used to prevent jump sound from being played too often in short time - self.opinion_sound_cooloff = 0 -- used to prevent sound spam of particular sound types - - self.texture_mods = {} - self.object:set_texture_mod("") - - self.v_start = false - self.timer = 0 - self.blinktimer = 0 - self.blinkstatus = false - - -- check existing nametag - if not self.nametag then - self.nametag = def.nametag - end - - -- set anything changed above - self.object:set_properties(self) - set_yaw(self, (random(0, 360) - 180) / 180 * pi, 6) - update_tag(self) - set_animation(self, "stand") - - -- run on_spawn function if found - if self.on_spawn and not self.on_spawn_run then - if self.on_spawn(self) then - self.on_spawn_run = true -- if true, set flag to run once only - end - end - - -- run after_activate - if def.after_activate then - def.after_activate(self, staticdata, def, dtime) - end - - if use_cmi then - self._cmi_components = cmi.activate_components(self.serialized_cmi_components) - cmi.notify_activate(self.object, dtime) - end -end - - --- main mob function -local mob_step = function(self, dtime) - - if not self.fire_resistant then - mcl_burning.tick(self.object, dtime, self) - end - - if use_cmi then - cmi.notify_step(self.object, dtime) - end - - local pos = self.object:get_pos() - local yaw = 0 - - if mobs_debug then - update_tag(self) - end - - if self.state == "die" then - return - end - - if self.jump_sound_cooloff > 0 then - self.jump_sound_cooloff = self.jump_sound_cooloff - dtime - end - if self.opinion_sound_cooloff > 0 then - self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime - end - if falling(self, pos) then - -- Return if mob died after falling - return - end - - -- smooth rotation by ThomasMonroe314 - - if self.delay and self.delay > 0 then - - local yaw = self.object:get_yaw() or 0 - - if self.delay == 1 then - yaw = self.target_yaw - else - local dif = abs(yaw - self.target_yaw) - - if yaw > self.target_yaw then - - if dif > pi then - dif = 2 * pi - dif -- need to add - yaw = yaw + dif / self.delay - else - yaw = yaw - dif / self.delay -- need to subtract - end - - elseif yaw < self.target_yaw then - - if dif > pi then - dif = 2 * pi - dif - yaw = yaw - dif / self.delay -- need to subtract - else - yaw = yaw + dif / self.delay -- need to add - end - end - - if yaw > (pi * 2) then yaw = yaw - (pi * 2) end - if yaw < 0 then yaw = yaw + (pi * 2) end - end - - self.delay = self.delay - 1 - if self.shaking then - yaw = yaw + (math.random() * 2 - 1) * 5 * dtime - end - self.object:set_yaw(yaw) - update_roll(self) - end - - -- end rotation - - -- run custom function (defined in mob lua file) - if self.do_custom then - - -- when false skip going any further - if self.do_custom(self, dtime) == false then - return - end - end - - -- knockback timer - if self.pause_timer > 0 then - - self.pause_timer = self.pause_timer - dtime - - return - end - - -- attack timer - self.timer = self.timer + dtime - - if self.state ~= "attack" then - - if self.timer < 1 then - return - end - - self.timer = 0 - end - - -- never go over 100 - if self.timer > 100 then - self.timer = 1 - end - - -- mob plays random sound at times - if random(1, 70) == 1 then - mob_sound(self, "random", true) - end - - -- environmental damage timer (every 1 second) - self.env_damage_timer = self.env_damage_timer + dtime - - if (self.state == "attack" and self.env_damage_timer > 1) - or self.state ~= "attack" then - - self.env_damage_timer = 0 - - -- check for environmental damage (water, fire, lava etc.) - if do_env_damage(self) then - return - end - - -- node replace check (cow eats grass etc.) - replace(self, pos) - end - - monster_attack(self) - - npc_attack(self) - - breed(self) - - if do_states(self, dtime) then - return - end - - if not self.object:get_luaentity() then - return false - end - - do_jump(self) - - runaway_from(self) - - if is_at_water_danger(self) and self.state ~= "attack" then - if random(1, 10) <= 6 then - set_velocity(self, 0) - self.state = "stand" - set_animation(self, "stand") - yaw = yaw + random(-0.5, 0.5) - yaw = set_yaw(self, yaw, 8) - end - end - - -- Add water flowing for mobs from mcl_item_entity - local p, node, nn, def - p = self.object:get_pos() - node = minetest.get_node_or_nil(p) - if node then - nn = node.name - def = minetest.registered_nodes[nn] - end - - -- Move item around on flowing liquids - if def and def.liquidtype == "flowing" then - - --[[ Get flowing direction (function call from flowlib), if there's a liquid. - NOTE: According to Qwertymine, flowlib.quickflow is only reliable for liquids with a flowing distance of 7. - Luckily, this is exactly what we need if we only care about water, which has this flowing distance. ]] - local vec = flowlib.quick_flow(p, node) - -- Just to make sure we don't manipulate the speed for no reason - if vec.x ~= 0 or vec.y ~= 0 or vec.z ~= 0 then - -- Minecraft Wiki: Flowing speed is "about 1.39 meters per second" - local f = 1.39 - -- Set new item moving speed into the direciton of the liquid - local newv = vector.multiply(vec, f) - self.object:set_acceleration({x = 0, y = 0, z = 0}) - self.object:set_velocity({x = newv.x, y = -0.22, z = newv.z}) - - self.physical_state = true - self._flowing = true - self.object:set_properties({ - physical = true - }) - return - end - elseif self._flowing == true then - -- Disable flowing physics if not on/in flowing liquid - self._flowing = false - enable_physics(self.object, self, true) - return - end - - --Mob following code. - follow_flop(self) - - if is_at_cliff_or_danger(self) then - set_velocity(self, 0) - self.state = "stand" - set_animation(self, "stand") - local yaw = self.object:get_yaw() or 0 - yaw = set_yaw(self, yaw + 0.78, 8) - end - - -- Despawning: when lifetimer expires, remove mob - if remove_far - and self.can_despawn == true - and ((not self.nametag) or (self.nametag == "")) - and self.state ~= "attack" - and self.following == nil then - - self.lifetimer = self.lifetimer - dtime - if self.despawn_immediately or self.lifetimer <= 0 then - minetest.log("action", "Mob "..self.name.." despawns in mob_step at "..minetest.pos_to_string(pos, 1)) - mcl_burning.extinguish(self.object) - self.object:remove() - elseif self.lifetimer <= 10 then - if math.random(10) < 4 then - self.despawn_immediately = true - else - self.lifetimer = 20 - end - end - end -end - - --- default function when mobs are blown up with TNT -local do_tnt = function(obj, damage) - - obj.object:punch(obj.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = damage}, - }, nil) - - return false, true, {} -end - - -mobs.spawning_mobs = {} -- Code to execute before custom on_rightclick handling local on_rightclick_prefix = function(self, clicker) @@ -3736,643 +2790,201 @@ local create_mob_on_rightclick = function(on_rightclick) end end --- register mob entity -function mobs:register_mob(name, def) +-- set and return valid yaw +local set_yaw = function(self, yaw, delay, dtime) - mobs.spawning_mobs[name] = true - -local can_despawn -if def.can_despawn ~= nil then - can_despawn = def.can_despawn -elseif def.spawn_class == "passive" then - can_despawn = false -else - can_despawn = true -end - -local function scale_difficulty(value, default, min, special) - if (not value) or (value == default) or (value == special) then - return default - else - return max(min, value * difficulty) - end -end - -local collisionbox = def.collisionbox or {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25} --- Workaround for : --- Increase upper Y limit to avoid mobs glitching through solid nodes. --- FIXME: Remove workaround if it's no longer needed. -if collisionbox[5] < 0.79 then - collisionbox[5] = 0.79 -end - -minetest.register_entity(name, { - - use_texture_alpha = def.use_texture_alpha, - stepheight = def.stepheight or 0.6, - name = name, - description = def.description, - type = def.type, - attack_type = def.attack_type, - fly = def.fly, - fly_in = def.fly_in or {"air", "__airlike"}, - owner = def.owner or "", - order = def.order or "", - on_die = def.on_die, - spawn_small_alternative = def.spawn_small_alternative, - do_custom = def.do_custom, - jump_height = def.jump_height or 4, -- was 6 - rotate = math.rad(def.rotate or 0), -- 0=front, 90=side, 180=back, 270=side2 - lifetimer = def.lifetimer or 57.73, - hp_min = scale_difficulty(def.hp_min, 5, 1), - hp_max = scale_difficulty(def.hp_max, 10, 1), - xp_min = def.xp_min or 0, - xp_max = def.xp_max or 0, - xp_timestamp = 0, - breath_max = def.breath_max or 15, - breathes_in_water = def.breathes_in_water or false, - physical = true, - collisionbox = collisionbox, - selectionbox = def.selectionbox or def.collisionbox, - visual = def.visual, - visual_size = def.visual_size or {x = 1, y = 1}, - mesh = def.mesh, - makes_footstep_sound = def.makes_footstep_sound or false, - view_range = def.view_range or 16, - walk_velocity = def.walk_velocity or 1, - run_velocity = def.run_velocity or 2, - damage = scale_difficulty(def.damage, 0, 0), - light_damage = def.light_damage or 0, - sunlight_damage = def.sunlight_damage or 0, - water_damage = def.water_damage or 0, - lava_damage = def.lava_damage or 8, - fire_damage = def.fire_damage or 1, - suffocation = def.suffocation or true, - fall_damage = def.fall_damage or 1, - fall_speed = def.fall_speed or DEFAULT_FALL_SPEED, -- must be lower than -2 - drops = def.drops or {}, - armor = def.armor or 100, - on_rightclick = create_mob_on_rightclick(def.on_rightclick), - arrow = def.arrow, - shoot_interval = def.shoot_interval, - sounds = def.sounds or {}, - animation = def.animation, - follow = def.follow, - jump = def.jump ~= false, - walk_chance = def.walk_chance or 50, - attacks_monsters = def.attacks_monsters or false, - group_attack = def.group_attack or false, - passive = def.passive or false, - knock_back = def.knock_back ~= false, - shoot_offset = def.shoot_offset or 0, - floats = def.floats or 1, -- floats in water by default - floats_on_lava = def.floats_on_lava or 0, - replace_rate = def.replace_rate, - replace_what = def.replace_what, - replace_with = def.replace_with, - replace_offset = def.replace_offset or 0, - on_replace = def.on_replace, - timer = 0, - env_damage_timer = 0, - tamed = false, - pause_timer = 0, - horny = false, - hornytimer = 0, - gotten = false, - health = 0, - reach = def.reach or 3, - htimer = 0, - texture_list = def.textures, - child_texture = def.child_texture, - docile_by_day = def.docile_by_day or false, - time_of_day = 0.5, - fear_height = def.fear_height or 0, - runaway = def.runaway, - runaway_timer = 0, - pathfinding = def.pathfinding, - immune_to = def.immune_to or {}, - explosion_radius = def.explosion_radius, -- LEGACY - explosion_damage_radius = def.explosion_damage_radius, -- LEGACY - explosiontimer_reset_radius = def.explosiontimer_reset_radius, - explosion_timer = def.explosion_timer or 3, - allow_fuse_reset = def.allow_fuse_reset ~= false, - stop_to_explode = def.stop_to_explode ~= false, - custom_attack = def.custom_attack, - double_melee_attack = def.double_melee_attack, - dogshoot_switch = def.dogshoot_switch, - dogshoot_count = 0, - dogshoot_count_max = def.dogshoot_count_max or 5, - dogshoot_count2_max = def.dogshoot_count2_max or (def.dogshoot_count_max or 5), - attack_animals = def.attack_animals or false, - specific_attack = def.specific_attack, - runaway_from = def.runaway_from, - owner_loyal = def.owner_loyal, - facing_fence = false, - _cmi_is_mob = true, - pushable = def.pushable or true, - - - -- MCL2 extensions - teleport = teleport, - do_teleport = def.do_teleport, - spawn_class = def.spawn_class, - ignores_nametag = def.ignores_nametag or false, - rain_damage = def.rain_damage or 0, - glow = def.glow, - can_despawn = can_despawn, - child = def.child or false, - texture_mods = {}, - shoot_arrow = def.shoot_arrow, - sounds_child = def.sounds_child, - explosion_strength = def.explosion_strength, - suffocation_timer = 0, - follow_velocity = def.follow_velocity or 2.4, - instant_death = def.instant_death or false, - fire_resistant = def.fire_resistant or false, - fire_damage_resistant = def.fire_damage_resistant or false, - ignited_by_sunlight = def.ignited_by_sunlight or false, - -- End of MCL2 extensions - - on_spawn = def.on_spawn, - - on_blast = def.on_blast or do_tnt, - - on_step = mob_step, - - do_punch = def.do_punch, - - on_punch = mob_punch, - - on_breed = def.on_breed, - - on_grown = def.on_grown, - - on_detach_child = mob_detach_child, - - on_activate = function(self, staticdata, dtime) - --this is a temporary hack so mobs stop - --glitching and acting really weird with the - --default built in engine collision detection - self.object:set_properties({ - collide_with_objects = false, - }) - return mob_activate(self, staticdata, def, dtime) - end, - - get_staticdata = function(self) - return mob_staticdata(self) - end, - - harmed_by_heal = def.harmed_by_heal, - -}) - -if minetest.get_modpath("doc_identifier") ~= nil then - doc.sub.identifier.register_object(name, "basics", "mobs") -end - -end -- END mobs:register_mob function - - --- register arrow for shoot attack -function mobs:register_arrow(name, def) - - if not name or not def then return end -- errorcheck - - minetest.register_entity(name, { - - physical = false, - visual = def.visual, - visual_size = def.visual_size, - textures = def.textures, - velocity = def.velocity, - hit_player = def.hit_player, - hit_node = def.hit_node, - hit_mob = def.hit_mob, - hit_object = def.hit_object, - drop = def.drop or false, -- drops arrow as registered item when true - collisionbox = {0, 0, 0, 0, 0, 0}, -- remove box around arrows - timer = 0, - switch = 0, - owner_id = def.owner_id, - rotate = def.rotate, - on_punch = function(self) - local vel = self.object:get_velocity() - self.object:set_velocity({x=vel.x * -1, y=vel.y * -1, z=vel.z * -1}) - end, - collisionbox = def.collisionbox or {0, 0, 0, 0, 0, 0}, - automatic_face_movement_dir = def.rotate - and (def.rotate - (pi / 180)) or false, - - on_activate = def.on_activate, - - on_step = def.on_step or function(self, dtime) - - self.timer = self.timer + 1 - - local pos = self.object:get_pos() - - if self.switch == 0 - or self.timer > 150 - or not within_limits(pos, 0) then - mcl_burning.extinguish(self.object) - self.object:remove(); - - return - end - - -- does arrow have a tail (fireball) - if def.tail - and def.tail == 1 - and def.tail_texture then - - minetest.add_particle({ - pos = pos, - velocity = {x = 0, y = 0, z = 0}, - acceleration = {x = 0, y = 0, z = 0}, - expirationtime = def.expire or 0.25, - collisiondetection = false, - texture = def.tail_texture, - size = def.tail_size or 5, - glow = def.glow or 0, - }) - end - - if self.hit_node then - - local node = node_ok(pos).name - - if minetest.registered_nodes[node].walkable then - - self.hit_node(self, pos, node) - - if self.drop == true then - - pos.y = pos.y + 1 - - self.lastpos = (self.lastpos or pos) - - minetest.add_item(self.lastpos, self.object:get_luaentity().name) - end - - self.object:remove(); - - return - end - end - - if self.hit_player or self.hit_mob or self.hit_object then - - for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do - - if self.hit_player - and player:is_player() then - - self.hit_player(self, player) - self.object:remove(); - return - end - - local entity = player:get_luaentity() - - if entity - and self.hit_mob - and entity._cmi_is_mob == true - and tostring(player) ~= self.owner_id - and entity.name ~= self.object:get_luaentity().name then - self.hit_mob(self, player) - self.object:remove(); - return - end - - if entity - and self.hit_object - and (not entity._cmi_is_mob) - and tostring(player) ~= self.owner_id - and entity.name ~= self.object:get_luaentity().name then - self.hit_object(self, player) - self.object:remove(); - return - end - end - end - - self.lastpos = pos - end - }) -end - - --- no damage to nodes explosion -function mobs:safe_boom(self, pos, strength) - minetest.sound_play(self.sounds and self.sounds.explode or "tnt_explode", { - pos = pos, - gain = 1.0, - max_hear_distance = self.sounds and self.sounds.distance or 32 - }, true) - local radius = strength - entity_physics(pos, radius) - effect(pos, 32, "mcl_particles_smoke.png", radius * 3, radius * 5, radius, 1, 0) -end - - --- make explosion with protection and tnt mod check -function mobs:boom(self, pos, strength, fire) - self.object:remove() - if mod_explosions then - if mobs_griefing and not minetest.is_protected(pos, "") then - mcl_explosions.explode(pos, strength, { drop_chance = 1.0, fire = fire }, self.object) - else - mobs:safe_boom(self, pos, strength) - end - else - mobs:safe_boom(self, pos, strength) - end -end - - --- Register spawn eggs - --- Note: This also introduces the “spawn_egg” group: --- * spawn_egg=1: Spawn egg (generic mob, no metadata) --- * spawn_egg=2: Spawn egg (captured/tamed mob, metadata) -function mobs:register_egg(mob, desc, background, addegg, no_creative) - - local grp = {spawn_egg = 1} - - -- do NOT add this egg to creative inventory (e.g. dungeon master) - if no_creative == true then - grp.not_in_creative_inventory = 1 + if not yaw or yaw ~= yaw then + yaw = 0 end - local invimg = background + delay = delay or 0 - if addegg == 1 then - invimg = "mobs_chicken_egg.png^(" .. invimg .. - "^[mask:mobs_chicken_egg_overlay.png)" + if delay == 0 then + if self.shaking and dtime then + yaw = yaw + (math_random() * 2 - 1) * 5 * dtime + end + self.yaw(yaw) + update_roll(self) + return yaw end - -- register old stackable mob egg - minetest.register_craftitem(mob, { - - description = desc, - inventory_image = invimg, - groups = grp, - - _doc_items_longdesc = S("This allows you to place a single mob."), - _doc_items_usagehelp = S("Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns."), - - on_place = function(itemstack, placer, pointed_thing) - - local pos = pointed_thing.above - - -- am I clicking on something with existing on_rightclick function? - local under = minetest.get_node(pointed_thing.under) - local def = minetest.registered_nodes[under.name] - if def and def.on_rightclick then - return def.on_rightclick(pointed_thing.under, under, placer, itemstack) - end - - if pos - and within_limits(pos, 0) - and not minetest.is_protected(pos, placer:get_player_name()) then - - local name = placer:get_player_name() - local privs = minetest.get_player_privs(name) - if mod_mobspawners and under.name == "mcl_mobspawners:spawner" then - if minetest.is_protected(pointed_thing.under, name) then - minetest.record_protection_violation(pointed_thing.under, name) - return itemstack - end - if not privs.maphack then - minetest.chat_send_player(name, S("You need the “maphack” privilege to change the mob spawner.")) - return itemstack - end - mcl_mobspawners.setup_spawner(pointed_thing.under, itemstack:get_name()) - if not mobs.is_creative(name) then - itemstack:take_item() - end - return itemstack - end - - if not minetest.registered_entities[mob] then - return itemstack - end - - if minetest.settings:get_bool("only_peaceful_mobs", false) - and minetest.registered_entities[mob].type == "monster" then - minetest.chat_send_player(name, S("Only peaceful mobs allowed!")) - return itemstack - end - - pos.y = pos.y - 0.5 - - local mob = minetest.add_entity(pos, mob) - minetest.log("action", "Mob spawned: "..name.." at "..minetest.pos_to_string(pos)) - local ent = mob:get_luaentity() - - -- don't set owner if monster or sneak pressed - if ent.type ~= "monster" - and not placer:get_player_control().sneak then - ent.owner = placer:get_player_name() - ent.tamed = true - end - - -- set nametag - local nametag = itemstack:get_meta():get_string("name") - if nametag ~= "" then - if string.len(nametag) > MAX_MOB_NAME_LENGTH then - nametag = string.sub(nametag, 1, MAX_MOB_NAME_LENGTH) - end - ent.nametag = nametag - update_tag(ent) - end - - -- if not in creative then take item - if not mobs.is_creative(placer:get_player_name()) then - itemstack:take_item() - end - end - - return itemstack - end, - }) + self.target_yaw = yaw + self.delay = delay + return self.target_yaw end --- No-op in MCL2 (capturing mobs is not possible). --- Provided for compability with Mobs Redo -function mobs:capture_mob(self, clicker, chance_hand, chance_net, chance_lasso, force_take, replacewith) - return false +-- global function to set mob yaw +function mobs:yaw(self, yaw, delay, dtime) + set_yaw(self, yaw, delay, dtime) end --- No-op in MCL2 (protecting mobs is not possible). -function mobs:protect(self, clicker) - return false -end +mob_step = function() + + --if self.state == "die" then + -- print("need custom die stop moving thing") + -- return + --end + + --if not self.fire_resistant then + -- mcl_burning.tick(self.object, dtime, self) + --end + + --if use_cmi then + --cmi.notify_step(self.object, dtime) + --end + + --local pos = self.object:get_pos() + --local yaw = 0 + + --if mobs_debug then + --update_tag(self) + --end --- feeding, taming and breeding (thanks blert2112) -function mobs:feed_tame(self, clicker, feed_count, breed, tame) - if not self.follow then - return false + + --if self.jump_sound_cooloff > 0 then + -- self.jump_sound_cooloff = self.jump_sound_cooloff - dtime + --end + + --if self.opinion_sound_cooloff > 0 then + -- self.opinion_sound_cooloff = self.opinion_sound_cooloff - dtime + --end + + --if falling(self, pos) then + -- Return if mob died after falling + -- return + --end + + + -- run custom function (defined in mob lua file) + --if self.do_custom then + + -- when false skip going any further + --if self.do_custom(self, dtime) == false then + -- return + --end + --end + + -- knockback timer + --if self.pause_timer > 0 then + + -- self.pause_timer = self.pause_timer - dtime + + -- return + --end + + -- attack timer + --self.timer = self.timer + dtime + + --[[ + if self.state ~= "attack" then + + if self.timer < 1 then + print("returning>>error code 1") + return + end + + self.timer = 0 end + ]]-- - -- can eat/tame with item in hand - if follow_holding(self, clicker) then + -- never go over 100 + --if self.timer > 100 then + -- self.timer = 1 + --end - -- if not in creative then take item - if not mobs.is_creative(clicker:get_player_name()) then + -- mob plays random sound at times + --if math_random(1, 70) == 1 then + -- mob_sound(self, "random", true) + --end - local item = clicker:get_wielded_item() + -- environmental damage timer (every 1 second) + --self.env_damage_timer = self.env_damage_timer + dtime - item:take_item() + --if (self.state == "attack" and self.env_damage_timer > 1) + --or self.state ~= "attack" then + -- + -- self.env_damage_timer = 0 + -- + -- -- check for environmental damage (water, fire, lava etc.) + -- if do_env_damage(self) then + -- return + -- end + -- + -- node replace check (cow eats grass etc.) + -- replace(self, pos) + --end - clicker:set_wielded_item(item) - end + --monster_attack(self) - mob_sound(self, "eat", nil, true) + --npc_attack(self) - -- increase health - self.health = self.health + 4 + --breed(self) - if self.health >= self.hp_max then + --do_jump(self) - self.health = self.hp_max + --runaway_from(self) - if self.htimer < 1 then - self.htimer = 5 - end - end - self.object:set_hp(self.health) + --if is_at_water_danger(self) and self.state ~= "attack" 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 = set_yaw(self, yaw, 8) + -- end + --end - update_tag(self) - -- make children grow quicker - if self.child == true then - - -- deduct 10% of the time to adulthood - self.hornytimer = self.hornytimer + ((CHILD_GROW_TIME - self.hornytimer) * 0.1) - - return true - end - - -- feed and tame - self.food = (self.food or 0) + 1 - if self.food >= feed_count then - - self.food = 0 - - if breed and self.hornytimer == 0 then - self.horny = true - end - - if tame then - - self.tamed = true - - if not self.owner or self.owner == "" then - self.owner = clicker:get_player_name() - end - end - - -- make sound when fed so many times - mob_sound(self, "random", true) - end - - return true - end - - return false -end - --- Spawn a child -function mobs:spawn_child(pos, mob_type) - local child = minetest.add_entity(pos, mob_type) - if not child then + -- Add water flowing for mobs from mcl_item_entity + --[[ + local p, node, nn, def + p = self.object:get_pos() + node = minetest_get_node_or_nil(p) + if node then + nn = node.name + def = minetest_registered_nodes[nnenable_physicss if not on/in flowing liquid + self._flowing = false + enable_physics(self.object, self, true) return end - local ent = child:get_luaentity() - effect(pos, 15, "mcl_particles_smoke.png", 1, 2, 2, 15, 5) + --Mob following code. + follow_flop(self) - ent.child = true - local textures - -- using specific child texture (if found) - if ent.child_texture then - textures = ent.child_texture[1] + if is_at_cliff_or_danger(self) then + set_velocity(self, 0) + self.state = "stand" + set_animation(self, "stand") + local yaw = self.object:get_yaw() or 0 + yaw = set_yaw(self, yaw + 0.78, 8) end - -- and resize to half height - child:set_properties({ - textures = textures, - visual_size = { - x = ent.base_size.x * .5, - y = ent.base_size.y * .5, - }, - collisionbox = { - ent.base_colbox[1] * .5, - ent.base_colbox[2] * .5, - ent.base_colbox[3] * .5, - ent.base_colbox[4] * .5, - ent.base_colbox[5] * .5, - ent.base_colbox[6] * .5, - }, - selectionbox = { - ent.base_selbox[1] * .5, - ent.base_selbox[2] * .5, - ent.base_selbox[3] * .5, - ent.base_selbox[4] * .5, - ent.base_selbox[5] * .5, - ent.base_selbox[6] * .5, - }, - }) - - return child -end - - --- compatibility function for old entities to new modpack entities -function mobs:alias_mob(old_name, new_name) - - -- spawn egg - minetest.register_alias(old_name, new_name) - - -- entity - minetest.register_entity(":" .. old_name, { - - physical = false, - - on_step = function(self) - - if minetest.registered_entities[new_name] then - minetest.add_entity(self.object:get_pos(), new_name) - end + -- Despawning: when lifetimer expires, remove mob + if remove_far + and self.can_despawn == true + and ((not self.nametag) or (self.nametag == "")) + and self.state ~= "attack" + and self.following == nil then + self.lifetimer = self.lifetimer - dtime + if self.despawn_immediately or self.lifetimer <= 0 then + minetest.log("action", "Mob "..self.name.." despawns in mob_step at "..minetest.pos_to_string(pos, 1)) + mcl_burning.extinguish(self.object) self.object:remove() - end - }) - -end - - -local timer = 0 -minetest.register_globalstep(function(dtime) - timer = timer + dtime - if timer < 1 then return end - for _, player in pairs(minetest.get_connected_players()) do - local pos = player:get_pos() - for _, obj in pairs(minetest.get_objects_inside_radius(pos, 47)) do - local lua = obj:get_luaentity() - if lua and lua._cmi_is_mob then - lua.lifetimer = math.max(20, lua.lifetimer) - lua.despawn_immediately = false + elseif self.lifetimer <= 10 then + if math_random(10) < 4 then + self.despawn_immediately = true + else + self.lifetimer = 20 end end end - timer = 0 -end) + ]]-- + +end diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua new file mode 100644 index 000000000..5dc0b8884 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/breeding.lua @@ -0,0 +1,184 @@ +local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius + +local vector_distance = vector.distance + +--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) + end + + --hey look, this thing works for passive mobs too! + local follower = mobs.detect_closest_player_within_radius(self,true,self.view_range,self.eye_height) + + --check if the follower is a player incase they log out + if follower and follower:is_player() then + local stack = follower:get_wielded_item() + --safety check + if not stack then + self.following_person = nil + 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) + end + end + + --everything failed + self.following_person = nil + return(false) +end + +--a function which attempts to make mobs enter +--the breeding state +mobs.enter_breed_state = function(self,clicker) + + --do not breed if baby + if self.baby then + 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) + end + + --if this is caught, that means something has gone + --seriously wrong + if not clicker or not clicker:is_player() then + return(false) + end + + local stack = clicker:get_wielded_item() + --safety check + 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 + if not minetest.is_creative_enabled(clicker:get_player_name()) then + stack:take_item() + clicker:set_wielded_item(stack) + end + self.breed_lookout_timer = self.breed_lookout_timer_goal + self.bred = true + mobs.play_sound_specific(self,"mobs_mc_animal_eat_generic") + return(true) + end + + --everything failed + return(false) +end + + +--find the closest mate in the area +mobs.look_for_mate = function(self) + + local pos1 = self.object:get_pos() + pos1.y = pos1.y + self.eye_height + + local mates_in_area = {} + local winner_mate = nil + local mates_detected = 0 + local radius = self.view_range + + --get mates in radius + 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 + 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) + + if distance <= radius then + if 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) + ) then + mates_detected = mates_detected + 1 + mates_in_area[mate] = distance + end + else + mates_detected = mates_detected + 1 + mates_in_area[mate] = distance + end + end + end + end + + + --return if there's no one near by + if mates_detected <= 0 then --handle negative numbers for some crazy error that could possibly happen + return nil + end + + --do a default radius max + local shortest_distance = radius + 1 + + --sort through mates and find the closest mate + for mate,distance in pairs(mates_in_area) do + if distance < shortest_distance then + shortest_distance = distance + winner_mate = mate + end + end + + return(winner_mate) + +end + +--make the baby grow up +mobs.baby_grow_up = function(self) + self.baby = nil + self.visual_size = self.backup_visual_size + self.collisionbox = self.backup_collisionbox + self.selectionbox = self.backup_selectionbox + self.object:set_properties(self) +end + +--makes the baby grow up faster with diminishing returns +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) + 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 + + if not minetest.is_creative_enabled(clicker:get_player_name()) then + stack:take_item() + clicker:set_wielded_item(stack) + end + + mobs.play_sound_specific(self,"mobs_mc_animal_eat_generic") + + return(true) + end + end + + 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 new file mode 100644 index 000000000..44f43f20f --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/collision.lua @@ -0,0 +1,140 @@ +local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius + +local math_random = math.random +local vector_multiply = vector.multiply + +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 + + --do collision detection from the base of the mob + local collisionbox = self.object:get_properties().collisionbox + + pos.y = pos.y + collisionbox[2] + + local collision_boundary = collisionbox[4] + + local radius = collision_boundary + + if collisionbox[5] > collision_boundary then + radius = collisionbox[5] + end + + local collision_count = 0 + + + local check_for_attack = false + + if self.attack_type == "punch" and self.hostile and self.attacking then + check_for_attack = true + end + + 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 self.object:get_attach() or (self.object:get_attach() and self.object:get_attach() ~= object)) then + --stop infinite loop + collision_count = collision_count + 1 + --mob cramming + if collision_count > 30 then + self.health = -20 + break + end + + local pos2 = object:get_pos() + + local object_collisionbox = object:get_properties().collisionbox + + pos2.y = pos2.y + object_collisionbox[2] + + local object_collision_boundary = object_collisionbox[4] + + + --this is checking the difference of the object collided with's possision + --if positive top of other object is inside (y axis) of current object + local y_base_diff = (pos2.y + object_collisionbox[5]) - pos.y + + local y_top_diff = (pos.y + collisionbox[5]) - pos2.y + + + local distance = vector.distance(vector.new(pos.x,0,pos.z),vector.new(pos2.x,0,pos2.z)) + + if distance <= collision_boundary + object_collision_boundary and y_base_diff >= 0 and y_top_diff >= 0 then + + 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 + --corner/wall sticking + dir.x = dir.x + ((math_random()/10)*integer_test[math.random(1,2)]) + dir.z = dir.z + ((math_random()/10)*integer_test[math.random(1,2)]) + end + + local velocity = dir + + --0.5 is the max force multiplier + local force = 0.5 - (0.5 * distance / (collision_boundary + object_collision_boundary)) + + local vel1 = vector.multiply(velocity, -1.5) + local vel2 = vector.multiply(velocity, 1.5) + + vel1 = vector.multiply(vel1, force * 10) + vel2 = vector.multiply(vel2, force) + + if object:is_player() then + vel2 = vector_multiply(vel2, 2.5) + + --integrate mob punching into collision detection + if check_for_attack and self.punch_timer <= 0 then + if object == self.attacking then + mobs.punch_attack(self) + end + end + end + + self.object:add_velocity(vel1) + object:add_velocity(vel2) + end + + end + end +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} + }, nil) + + + --knockback + local pos1 = self.object:get_pos() + pos1.y = 0 + local pos2 = player:get_pos() + pos2.y = 0 + local dir = vector_direction(pos1,pos2) + + dir = vector_multiply(dir,3) + + if player:get_velocity().y <= 1 then + dir.y = 5 + end + + player:add_velocity(dir) +end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua new file mode 100644 index 000000000..fd95b60ef --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/death_logic.lua @@ -0,0 +1,154 @@ +local minetest_add_item = minetest.add_item +local minetest_sound_play = minetest.sound_play + +local math_pi = math.pi +local math_random = math.random +local math_floor = math.floor +local HALF_PI = math_pi / 2 + +local vector_new = vector.new + + +-- drop items +local item_drop = function(self, cooked, looting_level) + + looting_level = looting_level or 0 + + -- no drops for child mobs (except monster) + if (self.child and self.type ~= "monster") then + return + end + + local obj, item, num + local pos = self.object:get_pos() + + self.drops = self.drops or {} -- nil check + + for n = 1, #self.drops do + local dropdef = self.drops[n] + local chance = 1 / dropdef.chance + local looting_type = dropdef.looting + + if looting_level > 0 then + local chance_function = dropdef.looting_chance_function + if chance_function then + chance = chance_function(looting_level) + elseif looting_type == "rare" then + chance = chance + (dropdef.looting_factor or 0.01) * looting_level + end + end + + local num = 0 + local do_common_looting = (looting_level > 0 and looting_type == "common") + if math_random() < chance then + num = math_random(dropdef.min or 1, dropdef.max or 1) + elseif not dropdef.looting_ignore_chance then + do_common_looting = false + end + + if do_common_looting then + num = num + math_floor(math_random(0, looting_level) + 0.5) + end + + if num > 0 then + item = dropdef.name + + -- cook items when true + if cooked then + + local output = minetest_get_craft_result({ + method = "cooking", width = 1, items = {item}}) + + if output and output.item and not output.item:is_empty() then + item = output.item:get_name() + end + end + + -- add item if it exists + for x = 1, num do + obj = minetest_add_item(pos, ItemStack(item .. " " .. 1)) + end + + if obj and obj:get_luaentity() then + + obj:set_velocity({ + x = math_random(-10, 10) / 9, + y = 6, + z = math_random(-10, 10) / 9, + }) + elseif obj then + obj:remove() -- item does not exist + end + end + end + + self.drops = {} +end + + +mobs.death_logic = function(self, dtime) + self.death_animation_timer = self.death_animation_timer + dtime + + --get all attached entities and sort through them + local attached_entities = self.object:get_children() + if #attached_entities > 0 then + for _,entity in pairs(attached_entities) do + --kick the player off + if entity:is_player() then + mobs.detach(entity) + --kick mobs off + --if there is scaling issues, this needs an additional check + else + entity:set_detach() + end + end + end + + --stop mob from getting in the way of other mobs you're fighting + if self.object:get_properties().pointable then + self.object:set_properties({pointable = false}) + end + + --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 + + --I'm sure there's a more efficient way to do this + --but this is the easiest, easier to work with 1 variable synced + --this is also not smooth + local death_animation_roll = self.death_animation_timer * 2 -- * 2 to make it faster + if death_animation_roll > 1 then + death_animation_roll = 1 + end + + local rot = self.object:get_rotation() --(no pun intended) + + rot.z = death_animation_roll * HALF_PI + + self.object:set_rotation(rot) + + mobs.set_mob_animation(self,"stand", true) + + + --flying and swimming mobs just fall down + if self.fly or self.swim then + if self.object:get_acceleration().y ~= -self.gravity then + self.object:set_acceleration(vector_new(0,-self.gravity,0)) + end + end + + --when landing allow mob to slow down and just fall if in air + if self.pause_timer <= 0 then + mobs.set_velocity(self,0) + end +end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua new file mode 100644 index 000000000..7c709c09e --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/environment.lua @@ -0,0 +1,260 @@ +local minetest_line_of_sight = minetest.line_of_sight +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 +local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius +local minetest_get_node_or_nil = minetest.get_node_or_nil +local minetest_registered_nodes = minetest.registered_nodes +local minetest_get_connected_players = minetest.get_connected_players + +local vector_new = vector.new +local vector_add = vector.add +local vector_multiply = vector.multiply +local vector_distance = vector.distance + +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) + + obj.object:punch(obj.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = damage}, + }, nil) + + return false, true, {} +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 + local players_detected = 0 + + --get players in radius + for _,player in pairs(minetest.get_connected_players()) do + if player and player:get_hp() > 0 then + + local pos2 = player:get_pos() + + local distance = vector_distance(pos1,pos2) + + if distance <= radius then + if 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 + object_height_adder, pos1.z), + vector_new(pos2.x, pos2.y + player:get_properties().eye_height, pos2.z) + ) then + players_detected = players_detected + 1 + players_in_area[player] = distance + end + else + players_detected = players_detected + 1 + players_in_area[player] = distance + end + end + end + end + + + --return if there's no one near by + if players_detected <= 0 then --handle negative numbers for some crazy error that could possibly happen + return nil + end + + --do a default radius max + local shortest_distance = radius + 1 + + --sort through players and find the closest player + for player,distance in pairs(players_in_area) do + if distance < shortest_distance then + shortest_distance = distance + winner_player = player + end + end + + return(winner_player) +end + + +--check if a mob needs to jump +mobs.jump_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 collisionbox = self.object:get_properties().collisionbox + local radius = collisionbox[4] + 0.5 + + vector_multiply(dir, radius) + + --only jump if there's a node and a non-solid node above it + local test_dir = vector_add(pos,dir) + + local green_flag_1 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") ~= 0 + + test_dir.y = test_dir.y + 1 + + local green_flag_2 = minetest_get_item_group(minetest_get_node(test_dir).name, "solid") == 0 + + 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 + --wall in front of mob + return(2) + end + + --nothing to jump over + return(0) +end + +-- a helper function to quickly turn neutral passive mobs hostile +local turn_hostile = function(self,detected_mob) + --drop in variables for attacking (stops crash) + detected_mob.punch_timer = 0 + --set to hostile + detected_mob.hostile = true + --hostile_cooldown timer is initialized here + detected_mob.hostile_cooldown_timer = detected_mob.hostile_cooldown + --set target to the same + detected_mob.attacking = self.attacking +end + +--allow hostile mobs to signal to other mobs +--to switch from neutal passive to neutral hostile +mobs.group_attack_initialization = function(self) + + --get basic data + local friends_list + + if self.group_attack == true then + friends_list = {self.name} + else + friends_list = table_copy(self.group_attack) + end + + local objects_in_area = minetest_get_objects_inside_radius(self.object:get_pos(), self.view_range) + + --get the player's name + local name = self.attacking:get_player_name() + + --re-use local variable + local detected_mob + + --run through mobs in viewing distance + for _,object in pairs(objects_in_area) do + if object and object:get_luaentity() then + detected_mob = object:get_luaentity() + -- only alert members of same mob or friends + if detected_mob._cmi_is_mob and detected_mob.state ~= "attack" and detected_mob.owner ~= name then + if detected_mob.name == self.name then + turn_hostile(self,detected_mob) + else + for _,id in pairs(friends_list) do + if detected_mob.name == id then + turn_hostile(self,detected_mob) + break + end + end + end + end + + --THIS NEEDS TO BE RE-IMPLEMENTED AS A GLOBAL HIT IN MOB_PUNCH!! + -- have owned mobs attack player threat + --if obj.owner == name and obj.owner_loyal then + -- do_attack(obj, self.object) + --end + end + end +end + +-- check if within physical map limits (-30911 to 30927) +-- within_limits, wmin, wmax = nil, -30913, 30928 +mobs.within_limits = function(pos, radius) + 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 + 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 + +-- get node but use fallback for nil or unknown +mobs.node_ok = function(pos, fallback) + + fallback = fallback or mobs.fallback_node + + local node = minetest_get_node_or_nil(pos) + + if node and minetest_registered_nodes[node.name] then + return node + end + + return minetest_registered_nodes[fallback] +end + + +--a teleport functoin +mobs.teleport = function(self, target) + if self.do_teleport then + if self.do_teleport(self, target) == false then + return + end + end +end + +--a function used for despawning mobs +mobs.check_for_player_within_area = function(self, radius) + local pos1 = self.object:get_pos() + --get players in radius + for _,player in pairs(minetest_get_connected_players()) do + if player and player:get_hp() > 0 then + local pos2 = player:get_pos() + local distance = vector_distance(pos1,pos2) + if distance < radius then + --found a player + return(true) + end + end + end + --did not find a player + return(false) +end + + +--a simple helper function for mobs following +mobs.get_2d_distance = function(pos1,pos2) + pos1.y = 0 + pos2.y = 0 + return(vector_distance(pos1, pos2)) +end + +-- fall damage onto solid ground +mobs.calculate_fall_damage = function(self) + if self.old_velocity and self.old_velocity.y < -7 and self.object:get_velocity().y == 0 then + local vel = self.object:get_velocity() + if vel then + local damage = math_abs(self.old_velocity.y + 7) * 2 + self.pause_timer = 0.4 + self.health = self.health - damage + end + end +end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua new file mode 100644 index 000000000..0fc94ffe6 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/head_logic.lua @@ -0,0 +1,112 @@ +local vector_new = vector.new + + +--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 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 + 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]) +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 new file mode 100644 index 000000000..6b23d2fe7 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/interaction.lua @@ -0,0 +1,291 @@ +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 MAX_MOB_NAME_LENGTH = 30 + +mobs.feed_tame = function(self) + return nil +end + +-- Code to execute before custom on_rightclick handling +local on_rightclick_prefix = function(self, clicker) + + local item = clicker:get_wielded_item() + + -- Name mob with nametag + if not self.ignores_nametag and item:get_name() == "mcl_mobs:nametag" then + + local tag = item:get_meta():get_string("name") + if tag ~= "" then + if string.len(tag) > MAX_MOB_NAME_LENGTH then + tag = string.sub(tag, 1, MAX_MOB_NAME_LENGTH) + end + self.nametag = tag + + mobs.update_tag(self) + + if not mobs.is_creative(clicker:get_player_name()) then + item:take_item() + clicker:set_wielded_item(item) + end + return true + end + + end + return false +end + +-- I have no idea what this does +mobs.create_mob_on_rightclick = function(on_rightclick) + return function(self, clicker) + --don't allow rightclicking dead mobs + if self.health <= 0 then + return + end + local stop = on_rightclick_prefix(self, clicker) + if (not stop) and (on_rightclick) then + on_rightclick(self, clicker) + end + end +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 + end + + --neutral passive mobs switch to neutral hostile + if self.neutral then + --drop in variables for attacking (stops crash) + self.attacking = hitter + self.punch_timer = 0 + self.hostile = true + --hostile_cooldown timer is initialized here + self.hostile_cooldown_timer = self.hostile_cooldown + + --initialize the group attack (check for other mobs in area, make them neutral hostile) + if self.group_attack then + mobs.group_attack_initialization(self) + end + end + + --turn skittish mobs away and RUN + if self.skittish then + + self.state = "run" + + self.run_timer = 5 --arbitrary 5 seconds + + local pos1 = self.object:get_pos() + pos1.y = 0 + local pos2 = hitter:get_pos() + pos2.y = 0 + + + 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 + if self.do_punch(self, hitter, tflp, tool_capabilities, dir) == false then + return + end + end + + --don't do damage until pause timer resets + if self.pause_timer > 0 then + return + 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 + + -- exhaust attacker + if mod_hunger and is_player then + mcl_hunger.exhaust(hitter:get_player_name(), mcl_hunger.EXHAUST_ATTACK) + end + + -- calculate mob damage + local damage = 0 + local armor = self.object:get_armor_groups() or {} + local tmp + + --calculate damage groups + for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do + damage = damage + (tool_capabilities.damage_groups[group] or 0) * ((armor[group] or 0) / 100.0) + end + + if weapon then + local fire_aspect_level = mcl_enchanting.get_enchantment(weapon, "fire_aspect") + if fire_aspect_level > 0 then + mcl_burning.set_on_fire(self.object, fire_aspect_level * 4) + end + end + + -- check for tool immunity or special damage + for n = 1, #self.immune_to do + if self.immune_to[n][1] == weapon:get_name() then + damage = self.immune_to[n][2] or 0 + break + end + end + + -- healing + if damage <= -1 then + self.health = self.health - math_floor(damage) + return + end + + if tool_capabilities then + punch_interval = tool_capabilities.full_punch_interval or 1.4 + end + + -- add weapon wear manually + -- Required because we have custom health handling ("health" property) + --minetest_is_creative_enabled("") ~= true --removed for now + if tool_capabilities then + if tool_capabilities.punch_attack_uses then + -- Without this delay, the wear does not work. Quite hacky ... + minetest_after(0, function(name) + local player = minetest.get_player_by_name(name) + if not player then return end + local weapon = hitter:get_wielded_item(player) + local def = weapon:get_definition() + if def.tool_capabilities and def.tool_capabilities.punch_attack_uses then + local wear = math_floor(65535/tool_capabilities.punch_attack_uses) + weapon:add_wear(wear) + hitter:set_wielded_item(weapon) + end + end, hitter:get_player_name()) + end + end + + + --if player is falling multiply damage by 1.5 + --critical hit + if hitter:get_velocity().y < 0 then + damage = damage * 1.5 + mobs.critical_effect(self) + end + + + -- only play hit sound and show blood effects if damage is 1 or over; lower to 0.1 to ensure armor works appropriately. + if damage >= 0.1 then + + minetest_sound_play("default_punch", { + object = self.object, + max_hear_distance = 16 + }, true) + + -- do damage + self.health = self.health - damage + + + --0.4 seconds until you can hurt the mob again + self.pause_timer = 0.4 + + --don't do knockback from a rider + for _,obj in pairs(self.object:get_children()) do + if obj == hitter then + return + end + end + + -- knock back effect + local velocity = self.object:get_velocity() + + --2d direction + local pos1 = self.object:get_pos() + pos1.y = 0 + local pos2 = hitter:get_pos() + pos2.y = 0 + + local dir = vector.direction(pos2,pos1) + + local up = 3 + + -- if already in air then dont go up anymore when hit + if velocity.y ~= 0 then + up = 0 + end + + + --0.75 for perfect distance to not be too easy, and not be too hard + local multiplier = 0.75 + + -- check if tool already has specific knockback value + local knockback_enchant = mcl_enchanting.get_enchantment(hitter:get_wielded_item(), "knockback") + if knockback_enchant and knockback_enchant > 0 then + multiplier = knockback_enchant + 1 --(starts from 1, 1 would be no change) + end + + --do this to sure you can punch a mob back when + --it's coming for you + if self.hostile then + multiplier = multiplier + 2 + 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 + + local pos2 = self.attacking:get_pos() + --add player eye height + pos2.y = pos2.y + self.attacking:get_properties().eye_height + + --get direction + local dir = vector_direction(pos1,pos2) + + --call internal shoot_arrow function + self.shoot_arrow(self,pos1,dir) +end + +mobs.update_tag = function(self) + self.object:set_properties({ + nametag = self.nametag, + }) +end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua new file mode 100644 index 000000000..847315ff1 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/mob_effects.lua @@ -0,0 +1,152 @@ +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 collisionbox = self.object:get_properties().collisionbox + + local min, max + + if collisionbox then + min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} + max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} + end + + minetest_add_particlespawner({ + amount = 50, + time = 0.0001, + minpos = vector.add(pos, min), + maxpos = vector.add(pos, max), + minvel = vector.new(-0.5,0.5,-0.5), + maxvel = vector.new(0.5,1,0.5), + minexptime = 1.1, + maxexptime = 1.5, + minsize = 1, + maxsize = 2, + collisiondetection = false, + vertical = false, + texture = "mcl_particles_mob_death.png", -- this particle looks strange + }) +end + +mobs.critical_effect = function(self) + + local pos = self.object:get_pos() + local yaw = self.object:get_yaw() + local collisionbox = self.object:get_properties().collisionbox + + local min, max + + if collisionbox then + min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} + max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} + end + + minetest_add_particlespawner({ + amount = 10, + time = 0.0001, + minpos = vector.add(pos, min), + maxpos = vector.add(pos, max), + minvel = vector.new(-1,1,-1), + maxvel = vector.new(1,3,1), + minexptime = 0.7, + maxexptime = 1, + minsize = 1, + maxsize = 2, + collisiondetection = false, + vertical = false, + texture = "heart.png^[colorize:black:255", + }) +end + +--when feeding a mob +mobs.feed_effect = function(self) + + local pos = self.object:get_pos() + local yaw = self.object:get_yaw() + local collisionbox = self.object:get_properties().collisionbox + + local min, max + + if collisionbox then + min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} + max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} + end + + minetest_add_particlespawner({ + amount = 10, + time = 0.0001, + minpos = vector.add(pos, min), + maxpos = vector.add(pos, max), + minvel = vector.new(-1,1,-1), + maxvel = vector.new(1,3,1), + minexptime = 0.7, + maxexptime = 1, + minsize = 1, + maxsize = 2, + collisiondetection = false, + vertical = false, + texture = "heart.png^[colorize:gray:255", + }) +end + +--hearts when tamed +mobs.tamed_effect = function(self) + local pos = self.object:get_pos() + local yaw = self.object:get_yaw() + local collisionbox = self.object:get_properties().collisionbox + + local min, max + + if collisionbox then + min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} + max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} + end + + minetest_add_particlespawner({ + amount = 30, + time = 0.0001, + minpos = vector.add(pos, min), + maxpos = vector.add(pos, max), + minvel = vector.new(-1,1,-1), + maxvel = vector.new(1,3,1), + minexptime = 0.7, + maxexptime = 1, + minsize = 1, + maxsize = 2, + collisiondetection = false, + vertical = false, + texture = "heart.png", + }) +end + +--hearts when breeding +mobs.breeding_effect = function(self) + local pos = self.object:get_pos() + local yaw = self.object:get_yaw() + local collisionbox = self.object:get_properties().collisionbox + + local min, max + + if collisionbox then + min = {x=collisionbox[1], y=collisionbox[2], z=collisionbox[3]} + max = {x=collisionbox[4], y=collisionbox[5], z=collisionbox[6]} + end + + minetest_add_particlespawner({ + amount = 2, + time = 0.0001, + minpos = vector.add(pos, min), + maxpos = vector.add(pos, max), + minvel = vector.new(-1,1,-1), + maxvel = vector.new(1,3,1), + minexptime = 0.7, + maxexptime = 1, + minsize = 1, + maxsize = 2, + collisiondetection = false, + vertical = false, + texture = "heart.png", + }) +end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua new file mode 100644 index 000000000..9a5fd9ea1 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/movement.lua @@ -0,0 +1,391 @@ +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 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 minetest_yaw_to_dir = minetest.yaw_to_dir +local minetest_dir_to_yaw = minetest.dir_to_yaw + +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) + + 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 + self.object:add_velocity(new_velocity_addition) + end +end + +--this is a generic float function +mobs.float = function(self) + + if self.object:get_acceleration().y ~= 0 then + self.object:set_acceleration(vector_new(0,0,0)) + end + + local current_velocity = self.object:get_velocity() + + local goal_velocity = { + x = 0, + y = DEFAULT_FLOAT_SPEED, + z = 0, + } + + local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) + + new_velocity_addition.x = 0 + new_velocity_addition.z = 0 + + --smooths out mobs a bit + if vector_length(new_velocity_addition) >= 0.0001 then + self.object:add_velocity(new_velocity_addition) + end +end + +--this is a generic climb function +mobs.climb = function(self) + + local current_velocity = self.object:get_velocity() + + local goal_velocity = { + x = 0, + y = DEFAULT_CLIMB_SPEED, + z = 0, + } + + local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) + + new_velocity_addition.x = 0 + new_velocity_addition.z = 0 + + --smooths out mobs a bit + if vector_length(new_velocity_addition) >= 0.0001 then + self.object:add_velocity(new_velocity_addition) + end +end + + + +--[[ + _ _ +| | | | +| | __ _ _ __ __| | +| | / _` | '_ \ / _` | +| |___| (_| | | | | (_| | +\_____/\__,_|_| |_|\__,_| +]] + + +-- move mob in facing direction +--this has been modified to be internal +--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() + + local goal_velocity = { + x = (math_sin(yaw) * -v), + y = 0, + 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))) + end + + new_velocity_addition.y = 0 + + --smooths out mobs a bit + if vector_length(new_velocity_addition) >= 0.0001 then + self.object:add_velocity(new_velocity_addition) + end +end + + + +-- calculate mob velocity +mobs.get_velocity = function(self) + + local v = self.object:get_velocity() + + v.y = 0 + + if v then + return vector_length(v) + end + + return 0 +end + +--make mobs jump +mobs.jump = function(self, velocity) + + if self.object:get_velocity().y ~= 0 or not self.old_velocity or (self.old_velocity and self.old_velocity.y > 0) then + return + end + + --fallback velocity to allow modularity + velocity = velocity or DEFAULT_JUMP_HEIGHT + + self.object:add_velocity(vector_new(0,velocity,0)) +end + +--make mobs fall slowly +mobs.mob_fall_slow = function(self) + + local current_velocity = self.object:get_velocity() + + local goal_velocity = { + x = 0, + y = -2, + z = 0, + } + + + local new_velocity_addition = vector.subtract(goal_velocity,current_velocity) + + 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))) + 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 + self.object:add_velocity(new_velocity_addition) + end + +end + + +--[[ + _____ _ +/ ___| (_) +\ `--.__ ___ _ __ ___ + `--. \ \ /\ / / | '_ ` _ \ +/\__/ /\ V V /| | | | | | | +\____/ \_/\_/ |_|_| |_| |_| +]]-- + + + + +--make mobs flop +mobs.flop = function(self, velocity) + + if self.object:get_velocity().y ~= 0 or not self.old_velocity or (self.old_velocity and self.old_velocity.y > 0) then + return false + end + + mobs.set_velocity(self, 0) + + --fallback velocity to allow modularity + velocity = velocity or DEFAULT_JUMP_HEIGHT + + --create a random direction (2d yaw) + local dir = DOUBLE_PI * math_random() + + --create a random force value + 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) + + --place in the "flop" velocity to make the mob flop + final_additional_force.y = velocity + + self.object:add_velocity(final_additional_force) + + return true +end + + + +-- move mob in facing direction +--this has been modified to be internal +--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) + + if v == 0 then + pitch = 0 + end + + local current_velocity = self.object:get_velocity() + + local goal_velocity = { + x = (math_sin(yaw) * -v), + y = pitch, + 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))) + end + + --smooths out mobs a bit + if vector_length(new_velocity_addition) >= 0.0001 then + self.object:add_velocity(new_velocity_addition) + end +end + +--[[ +______ _ +| ___| | +| |_ | |_ _ +| _| | | | | | +| | | | |_| | +\_| |_|\__, | + __/ | + |___/ +]]-- + +-- move mob in facing direction +--this has been modified to be internal +--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) + + if v == 0 then + pitch = 0 + end + + local current_velocity = self.object:get_velocity() + + local goal_velocity = { + x = (math_sin(yaw) * -v), + y = pitch, + 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))) + end + + --smooths out mobs a bit + if vector_length(new_velocity_addition) >= 0.0001 then + self.object:add_velocity(new_velocity_addition) + end +end + +--a quick and simple pitch calculation between two vector positions +mobs.calculate_pitch = function(pos1, pos2) + + if pos1 == nil or pos2 == nil then + 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) +end + +--make mobs fly up or down based on their y difference +mobs.set_pitch_while_attacking = function(self) + local pos1 = self.object:get_pos() + local pos2 = self.attacking:get_pos() + + local pitch = mobs.calculate_pitch(pos2,pos1) + + self.pitch = pitch +end + + + +--[[ + ___ + |_ | + | |_ _ _ __ ___ _ __ + | | | | | '_ ` _ \| '_ \ +/\__/ / |_| | | | | | | |_) | +\____/ \__,_|_| |_| |_| .__/ + | | + |_| +]]-- + +--special mob jump movement +mobs.jump_move = function(self, velocity) + + if self.object:get_velocity().y ~= 0 or not self.old_velocity or (self.old_velocity and self.old_velocity.y > 0) then + return + end + + --make the mob stick for a split second + mobs.set_velocity(self,0) + + --fallback velocity to allow modularity + 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), + y = jump_height, + 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))) + end + + --smooths out mobs a bit + if vector_length(new_velocity_addition) >= 0.0001 then + self.object:add_velocity(new_velocity_addition) + end +end + +--make it so mobs do not glitch out and freak out +--when moving around over nodes +mobs.swap_auto_step_height_adjust = function(self) + local y_vel = self.object:get_velocity().y + + if y_vel == 0 and self.stepheight ~= self.stepheight_backup then + self.stepheight = self.stepheight_backup + elseif y_vel ~= 0 and self.stepheight ~= 0 then + self.stepheight = 0 + end +end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/projectile_handling.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/projectile_handling.lua new file mode 100644 index 000000000..e7ae6ffbe --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/projectile_handling.lua @@ -0,0 +1,44 @@ +local GRAVITY = minetest.settings:get("movement_gravity")-- + 9.81 + +mobs.shoot_projectile_handling = function(arrow_item, pos, dir, yaw, shooter, power, damage, is_critical, bow_stack, collectable, gravity) + local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, arrow_item.."_entity") + if power == nil then + power = 19 + end + if damage == nil then + damage = 3 + end + + gravity = gravity or -GRAVITY + + local knockback + if bow_stack then + local enchantments = mcl_enchanting.get_enchantments(bow_stack) + if enchantments.power then + damage = damage + (enchantments.power + 1) / 4 + end + if enchantments.punch then + knockback = enchantments.punch * 3 + end + if enchantments.flame then + mcl_burning.set_on_fire(obj, math.huge) + end + end + obj:set_velocity({x=dir.x*power, y=dir.y*power, z=dir.z*power}) + obj:set_acceleration({x=0, y=gravity, z=0}) + obj:set_yaw(yaw-math.pi/2) + local le = obj:get_luaentity() + le._shooter = shooter + le._damage = damage + le._is_critical = is_critical + le._startpos = pos + le._knockback = knockback + le._collectable = collectable + + --play custom shoot sound + if shooter ~= nil and shooter.shoot_sound then + minetest.sound_play(shooter.shoot_sound, {pos=pos, max_hear_distance=16}, true) + end + + return obj +end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua new file mode 100644 index 000000000..dfef98ee8 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/set_up.lua @@ -0,0 +1,226 @@ +local math_random = math.random + +local minetest_settings = minetest.settings + +-- 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 + if not mobs.check_for_player_within_area(self, 64) then + --print("removing SERIALIZED!") + self.object:remove() + return + end + end + + self.remove_ok = true + self.attack = nil + self.following = nil + + if use_cmi then + self.serialized_cmi_components = cmi.serialize_components(self._cmi_components) + end + + local tmp = {} + + for _,stat in pairs(self) do + + local t = type(stat) + + if t ~= "function" + and t ~= "nil" + and t ~= "userdata" + and _ ~= "_cmi_components" then + tmp[_] = self[_] + end + end + + return minetest.serialize(tmp) +end + + +-- activate mob and reload settings +mobs.mob_activate = function(self, staticdata, def, dtime) + + -- remove monsters in peaceful mode + if self.type == "monster" and minetest_settings:get_bool("only_peaceful_mobs", false) then + mcl_burning.extinguish(self.object) + self.object:remove() + return + end + + -- load entity variables + local tmp = minetest.deserialize(staticdata) + + if tmp then + for _,stat in pairs(tmp) do + self[_] = stat + end + end + + --set up wandering + if not self.wandering then + self.wandering = true + end + + --clear animation + self.current_animation = nil + + -- select random texture, set model and size + if not self.base_texture then + + -- compatiblity with old simple mobs textures + if type(def.textures[1]) == "string" then + def.textures = {def.textures} + end + + self.base_texture = def.textures[math_random(1, #def.textures)] + self.base_mesh = def.mesh + self.base_size = self.visual_size + self.base_colbox = self.collisionbox + self.base_selbox = self.selectionbox + end + + -- for current mobs that dont have this set + if not self.base_selbox then + self.base_selbox = self.selectionbox or self.base_colbox + end + + -- set texture, model and size + local textures = self.base_texture + local mesh = self.base_mesh + local vis_size = self.base_size + local colbox = self.base_colbox + local selbox = self.base_selbox + + -- specific texture if gotten + if self.gotten == true + and def.gotten_texture then + textures = def.gotten_texture + end + + -- specific mesh if gotten + if self.gotten == true + and def.gotten_mesh then + mesh = def.gotten_mesh + end + + -- set baby mobs to half size + if self.baby == true then + + vis_size = { + x = self.base_size.x * self.baby_size, + y = self.base_size.y * self.baby_size, + } + + if def.child_texture then + textures = def.child_texture[1] + end + + colbox = { + self.base_colbox[1] * self.baby_size, + self.base_colbox[2] * self.baby_size, + self.base_colbox[3] * self.baby_size, + self.base_colbox[4] * self.baby_size, + self.base_colbox[5] * self.baby_size, + self.base_colbox[6] * self.baby_size + } + selbox = { + self.base_selbox[1] * self.baby_size, + self.base_selbox[2] * self.baby_size, + self.base_selbox[3] * self.baby_size, + self.base_selbox[4] * self.baby_size, + self.base_selbox[5] * self.baby_size, + self.base_selbox[6] * self.baby_size + } + end + + --stop mobs from reviving + if not self.dead and not self.health then + 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 + + if self.breath == nil then + self.breath = self.breath_max + end + + -- pathfinding init + self.path = {} + self.path.way = {} -- path to follow, table of positions + self.path.lastpos = {x = 0, y = 0, z = 0} + self.path.stuck = false + self.path.following = false -- currently following path? + self.path.stuck_timer = 0 -- if stuck for too long search for path + + -- Armor groups + -- immortal=1 because we use custom health + -- handling (using "health" property) + local armor + if type(self.armor) == "table" then + armor = table.copy(self.armor) + armor.immortal = 1 + else + armor = {immortal=1, fleshy = self.armor} + end + self.object:set_armor_groups(armor) + self.old_y = self.object:get_pos().y + self.old_health = self.health + self.sounds.distance = self.sounds.distance or 10 + self.textures = textures + self.mesh = mesh + self.collisionbox = colbox + self.selectionbox = selbox + self.visual_size = vis_size + self.standing_in = "ignore" + self.standing_on = "ignore" + self.jump_sound_cooloff = 0 -- used to prevent jump sound from being played too often in short time + self.opinion_sound_cooloff = 0 -- used to prevent sound spam of particular sound types + + self.texture_mods = {} + + + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.blinkstatus = false + + + --continue mob effect on server restart + if self.dead or self.health <= 0 then + self.object:set_texture_mod("^[colorize:red:120") + else + self.object:set_texture_mod("") + end + + + -- set anything changed above + self.object:set_properties(self) + + --update_tag(self) + --mobs.set_animation(self, "stand") + + -- run on_spawn function if found + if self.on_spawn and not self.on_spawn_run then + if self.on_spawn(self) then + self.on_spawn_run = true -- if true, set flag to run once only + end + end + + -- run after_activate + if def.after_activate then + def.after_activate(self, staticdata, def, dtime) + end + + if use_cmi then + self._cmi_components = cmi.activate_components(self.serialized_cmi_components) + cmi.notify_activate(self.object, dtime) + end +end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/api/mob_functions/sound_handling.lua b/mods/ENTITIES/mcl_mobs/api/mob_functions/sound_handling.lua new file mode 100644 index 000000000..98d2644e8 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/sound_handling.lua @@ -0,0 +1,59 @@ +local math_random = math.random + + +--generic call for sound handler for mobs (data access) +mobs.play_sound = function(self,sound) + local soundinfo = self.sounds + + if not soundinfo then + return + end + + local play_sound = soundinfo[sound] + + if not play_sound then + return + end + + mobs.play_sound_handler(self, play_sound) +end + + +--generic sound handler for mobs +mobs.play_sound_handler = function(self, sound) + local pitch = (100 + math_random(-15,15) + math_random()) / 100 + local distance = self.sounds.distance or 16 + + minetest.sound_play(sound, { + object = self.object, + gain = 1.0, + max_hear_distance = distance, + pitch = pitch, + }, true) +end + + +--random sound timing handler +mobs.random_sound_handling = function(self,dtime) + + self.random_sound_timer = self.random_sound_timer - dtime + + --play sound and reset timer + if self.random_sound_timer <= 0 then + mobs.play_sound(self,"random") + self.random_sound_timer = math_random(self.random_sound_timer_min,self.random_sound_timer_max) + end +end + +--used for playing a non-mob internal sound at random pitches +mobs.play_sound_specific = function(self,soundname) + local pitch = (100 + math_random(-15,15) + math_random()) / 100 + local distance = self.sounds.distance or 16 + + minetest.sound_play(soundname, { + object = self.object, + gain = 1.0, + max_hear_distance = distance, + pitch = pitch, + }, true) +end \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/mount.lua b/mods/ENTITIES/mcl_mobs/api/mount.lua similarity index 92% rename from mods/ENTITIES/mcl_mobs/mount.lua rename to mods/ENTITIES/mcl_mobs/api/mount.lua index 9383ee067..8ee45f299 100644 --- a/mods/ENTITIES/mcl_mobs/mount.lua +++ b/mods/ENTITIES/mcl_mobs/api/mount.lua @@ -206,21 +206,30 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) -- move forwards if ctrl.up then - entity.v = entity.v + entity.accel / 10 + mobs.set_velocity(entity, entity.run_velocity) + + mobs.set_mob_animation(entity, moving_anim) -- move backwards elseif ctrl.down then - if entity.max_speed_reverse == 0 and entity.v == 0 then - return - end + mobs.set_velocity(entity, -entity.run_velocity) - entity.v = entity.v - entity.accel / 10 + mobs.set_mob_animation(entity, moving_anim) + + --halt + else + + mobs.set_velocity(entity, 0) + + mobs.set_mob_animation(entity, stand_anim) end - -- fix mob rotation + -- mob rotation entity.object:set_yaw(entity.driver:get_look_horizontal() - entity.rotate) + entity.yaw = entity.driver:get_look_horizontal() - entity.rotate + --[[ if can_fly then -- fly up @@ -244,32 +253,21 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) end else + ]]-- - -- jump - if ctrl.jump then + -- jump + if ctrl.jump then - if velo.y == 0 then - velo.y = velo.y + entity.jump_height - acce_y = acce_y + (acce_y * 3) + 1 - end - end - - end - end - - -- if not moving then set animation and return - if entity.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then - - if stand_anim then - mobs:set_animation(entity, stand_anim) + mobs.jump(entity) end - return + --end end + --[[ -- set moving animation if moving_anim then - mobs:set_animation(entity, moving_anim) + mobs:set_mob_animation(entity, moving_anim) end -- Stop! @@ -383,6 +381,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) end entity.v2 = v + ]]-- end @@ -390,6 +389,10 @@ end function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) + if true then + print("succ") + return + end local ctrl = entity.driver:get_player_control() local velo = entity.object:get_velocity() local dir = entity.driver:get_look_dir() @@ -440,9 +443,9 @@ function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) -- change animation if stopped if velo.x == 0 and velo.y == 0 and velo.z == 0 then - mobs:set_animation(entity, stand_anim) + mobs:set_mob_animation(entity, stand_anim) else -- moving animation - mobs:set_animation(entity, moving_anim) + mobs:set_mob_animation(entity, moving_anim) end end diff --git a/mods/ENTITIES/mcl_mobs/spawning.lua b/mods/ENTITIES/mcl_mobs/api/spawning.lua similarity index 67% rename from mods/ENTITIES/mcl_mobs/spawning.lua rename to mods/ENTITIES/mcl_mobs/api/spawning.lua index 210c6b9c6..ca4dc1e4f 100644 --- a/mods/ENTITIES/mcl_mobs/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/api/spawning.lua @@ -1,17 +1,30 @@ --lua locals -local get_node = minetest.get_node -local get_item_group = minetest.get_item_group -local get_node_light = minetest.get_node_light +local get_node = minetest.get_node +local get_item_group = minetest.get_item_group +local get_node_light = minetest.get_node_light local find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air -local new_vector = vector.new +local get_biome_name = minetest.get_biome_name +local get_objects_inside_radius = minetest.get_objects_inside_radius + + local math_random = math.random -local get_biome_name = minetest.get_biome_name +local math_floor = math.floor local max = math.max -local get_objects_inside_radius = minetest.get_objects_inside_radius + local vector_distance = vector.distance +local vector_new = vector.new +local vector_floor = vector.floor + +local table_copy = table.copy +local table_remove = table.remove + -- range for mob count -local aoc_range = 32 +local aoc_range = 48 + +--do mobs spawn? +local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false + --[[ THIS IS THE BIG LIST OF ALL BIOMES - used for programming/updating mobs @@ -153,28 +166,14 @@ Overworld regular: - -local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false --- count how many mobs of one type are inside an area - -local count_mobs = function(pos,mobtype) +-- count how many mobs are in an area +local count_mobs = function(pos) local num = 0 - local objs = get_objects_inside_radius(pos, aoc_range) - for n = 1, #objs do - local obj = objs[n]:get_luaentity() - if obj and obj.name and obj._cmi_is_mob then - -- count hostile mobs only - if mobtype == "hostile" then - if obj.spawn_class == "hostile" then - num = num + 1 - end - -- count passive mobs only - else - num = num + 1 - end + 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 + num = num + 1 end end - return num end @@ -484,23 +483,23 @@ end local axis --inner and outer part of square donut radius -local inner = 1 -local outer = 65 +local inner = 15 +local outer = 64 local int = {-1,1} local position_calculation = function(pos) - pos = vector.floor(pos) + pos = vector_floor(pos) --this is used to determine the axis buffer from the player - axis = math.random(0,1) + axis = math_random(0,1) --cast towards the direction if axis == 0 then --x - pos.x = pos.x + math.random(inner,outer)*int[math.random(1,2)] - pos.z = pos.z + math.random(-outer,outer) + pos.x = pos.x + math_random(inner,outer)*int[math_random(1,2)] + pos.z = pos.z + math_random(-outer,outer) else --z - pos.z = pos.z + math.random(inner,outer)*int[math.random(1,2)] - pos.x = pos.x + math.random(-outer,outer) + pos.z = pos.z + math_random(inner,outer)*int[math_random(1,2)] + pos.x = pos.x + math_random(-outer,outer) end return(pos) end @@ -516,7 +515,7 @@ local decypher_limits_dictionary = { local function decypher_limits(posy) --local min_max_table = decypher_limits_dictionary[dimension] --return min_max_table[1],min_max_table[2] - posy = math.floor(posy) + posy = math_floor(posy) return posy - 32, posy + 32 end @@ -539,108 +538,169 @@ if mobs_spawn then local timer = 0 minetest.register_globalstep(function(dtime) timer = timer + dtime - if timer >= 8 then + if timer >= 10 then timer = 0 for _,player in pairs(minetest.get_connected_players()) do - for i = 1,math_random(3,8) do - repeat -- after this line each "break" means "continue" - local player_pos = player:get_pos() + -- after this line each "break" means "continue" + local do_mob_spawning = true + repeat + --don't need to get these variables more than once + --they happen in a single server step - local _,dimension = mcl_worlds.y_to_layer(player_pos.y) + local player_pos = player:get_pos() + local _,dimension = mcl_worlds.y_to_layer(player_pos.y) - if dimension == "void" or dimension == "default" then - break -- ignore void and unloaded area - end + if dimension == "void" or dimension == "default" then + break -- ignore void and unloaded area + end - local min,max = decypher_limits(player_pos.y) + local min,max = decypher_limits(player_pos.y) - local goal_pos = position_calculation(player_pos) + for i = 1,math_random(1,4) do + -- after this line each "break" means "continue" + local do_mob_algorithm = true + repeat - local spawning_position_list = find_nodes_in_area_under_air(new_vector(goal_pos.x,min,goal_pos.z), vector.new(goal_pos.x,max,goal_pos.z), {"group:solid", "group:water", "group:lava"}) + local goal_pos = position_calculation(player_pos) + + local spawning_position_list = find_nodes_in_area_under_air(vector_new(goal_pos.x,min,goal_pos.z), vector_new(goal_pos.x,max,goal_pos.z), {"group:solid", "group:water", "group:lava"}) + + --couldn't find node + if #spawning_position_list <= 0 then + break + end + + 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 + break + end + + --hard code mob limit in area to 5 for now + if count_mobs(spawning_position) >= 5 then + break + end + + local gotten_node = get_node(spawning_position).name + + if not gotten_node or gotten_node == "air" then --skip air nodes + break + end + + local gotten_biome = minetest.get_biome_data(spawning_position) + + if not gotten_biome then + break --skip if in unloaded area + end + + gotten_biome = get_biome_name(gotten_biome.biome) --makes it easier to work with + + --add this so mobs don't spawn inside nodes + spawning_position.y = spawning_position.y + 1 + + --only need to poll for node light if everything else worked + local gotten_light = get_node_light(spawning_position) + + local is_water = get_item_group(gotten_node, "water") ~= 0 + 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) + + --grab mob that fits into the spawning location + --randomly grab a mob, don't exclude any possibilities + local repeat_mob_search = true + repeat + + --do not infinite loop + if #mob_library_worker_table <= 0 then + --print("breaking infinite loop") + break + end + + local skip = false + + --use this for removing table elements of mobs that do not match + local temp_index = math_random(1,#mob_library_worker_table) + + local temp_def = mob_library_worker_table[temp_index] + + --skip if something ridiculous happens (nil mob def) + --something truly horrible has happened if skip gets + --activated at this point + if not temp_def then + skip = true + end + + if not skip and (spawning_position.y < temp_def.min_height or spawning_position.y > temp_def.max_height) then + skip = true + end + + --skip if not correct dimension + if not skip and (temp_def.dimension ~= dimension) then + skip = true + end + + --skip if not in correct biome + if not skip and (not biome_check(temp_def.biomes, gotten_biome)) then + skip = true + end + + --don't spawn if not in light limits + if not skip and (gotten_light < temp_def.min_light or gotten_light > temp_def.max_light) then + skip = true + end + + --skip if not in correct spawning type + if not skip and (temp_def.type_of_spawning == "ground" and is_water) then + skip = true + end + + if not skip and (temp_def.type_of_spawning == "ground" and is_lava) then + skip = true + end + + --found a mob, exit out of loop + if not skip then + --minetest.log("warning", "found mob:"..temp_def.name) + --print("found mob:"..temp_def.name) + mob_def = table_copy(temp_def) + break + else + --minetest.log("warning", "deleting temp index "..temp_index) + --print("deleting temp index") + table_remove(mob_library_worker_table, temp_index) + end + + until repeat_mob_search == false --this is needed to sort through mobs randomly + + + --catch if went through all mobs and something went horribly wrong + --could not find a valid mob to spawn that fits the environment + if not mob_def then + break + end + + --adjust the position for water and lava mobs + if mob_def.type_of_spawning == "water" or mob_def.type_of_spawning == "lava" then + spawning_position.y = spawning_position.y - 1 + end + + --print("spawning: " .. mob_def.name) + + --everything is correct, spawn mob + minetest.add_entity(spawning_position, mob_def.name) - --couldn't find node - if #spawning_position_list <= 0 then break - end + until do_mob_algorithm == false --this is a safety catch + end - local spawning_position = spawning_position_list[math_random(1,#spawning_position_list)] - - --Prevent strange behavior/too close to player - if not spawning_position or vector_distance(player_pos, spawning_position) < 15 then - break - end - - local gotten_node = get_node(spawning_position).name - - if not gotten_node or gotten_node == "air" then --skip air nodes - break - end - - local gotten_biome = minetest.get_biome_data(spawning_position) - - if not gotten_biome then - break --skip if in unloaded area - end - - gotten_biome = get_biome_name(gotten_biome.biome) --makes it easier to work with - - --grab random mob - local mob_def = spawn_dictionary[math.random(1,#spawn_dictionary)] - - if not mob_def then - break --skip if something ridiculous happens (nil mob def) - end - - --skip if not correct dimension - if mob_def.dimension ~= dimension then - break - end - - --skip if not in correct biome - if not biome_check(mob_def.biomes, gotten_biome) then - break - end - - --add this so mobs don't spawn inside nodes - spawning_position.y = spawning_position.y + 1 - - if spawning_position.y < mob_def.min_height or spawning_position.y > mob_def.max_height then - break - end - - --only need to poll for node light if everything else worked - local gotten_light = get_node_light(spawning_position) - - --don't spawn if not in light limits - if gotten_light < mob_def.min_light or gotten_light > mob_def.max_light then - break - end - - local is_water = get_item_group(gotten_node, "water") ~= 0 - local is_lava = get_item_group(gotten_node, "lava") ~= 0 - - if mob_def.type_of_spawning == "ground" and is_water then - break - end - - if mob_def.type_of_spawning == "ground" and is_lava then - break - end - - --finally do the heavy check (for now) of mobs in area - if count_mobs(spawning_position, mob_def.spawn_class) >= mob_def.aoc then - break - end - - --adjust the position for water and lava mobs - if mob_def.type_of_spawning == "water" or mob_def.type_of_spawning == "lava" then - spawning_position.y = spawning_position.y - 1 - end - - --everything is correct, spawn mob - minetest.add_entity(spawning_position, mob_def.name) - until true --this is a safety catch - end + break + until do_mob_spawning == false --this is a performance catch end end end) diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index 69246b470..b0daba2c4 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -1,14 +1,16 @@ local path = minetest.get_modpath(minetest.get_current_modname()) +local api_path = path.."/api" + -- Mob API -dofile(path .. "/api.lua") +dofile(api_path .. "/api.lua") -- Spawning Algorithm -dofile(path .. "/spawning.lua") +dofile(api_path .. "/spawning.lua") -- Rideable Mobs -dofile(path .. "/mount.lua") +dofile(api_path .. "/mount.lua") -- Mob Items dofile(path .. "/crafts.lua") \ No newline at end of file diff --git a/mods/ENTITIES/mcl_mobs/lucky_block.lua b/mods/ENTITIES/mcl_mobs/lucky_block.lua deleted file mode 100644 index ea90de74a..000000000 --- a/mods/ENTITIES/mcl_mobs/lucky_block.lua +++ /dev/null @@ -1,8 +0,0 @@ - -if minetest.get_modpath("lucky_block") then - - lucky_block:add_blocks({ - {"dro", {"mcl_mobs:nametag"}, 1}, - {"lig"}, - }) -end diff --git a/mods/ENTITIES/mcl_mobs/sounds/attributes.txt b/mods/ENTITIES/mcl_mobs/sounds/attributes.txt new file mode 100644 index 000000000..1228dd9d7 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/sounds/attributes.txt @@ -0,0 +1,4 @@ + +default_punch.1 = https://freesound.org/people/Merrick079/sounds/566436/ +default_punch.2 = https://freesound.org/people/Merrick079/sounds/566435/ +default_punch.3 = https://freesound.org/people/Merrick079/sounds/566434/ diff --git a/mods/ENTITIES/mcl_mobs/sounds/default_punch.1.ogg b/mods/ENTITIES/mcl_mobs/sounds/default_punch.1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4d7ba8015eb13ce415ea09f4223a427bc4d2e17d GIT binary patch literal 12658 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 literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mcl_mobs/sounds/default_punch.2.ogg b/mods/ENTITIES/mcl_mobs/sounds/default_punch.2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c022d94f871345810b7d90ab953a01985e2d369b GIT binary patch literal 12801 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 R&zZhFM!opw0l>!ge*lM|2+9Be literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mcl_mobs/sounds/default_punch.3.ogg b/mods/ENTITIES/mcl_mobs/sounds/default_punch.3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4c5e3f9b301e682372399f6213210a42d86fc558 GIT binary patch literal 12943 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 10 then @@ -360,11 +377,16 @@ mobs:register_mob("mobs_mc:enderman", { --if looking in general head position, turn hostile if minetest.line_of_sight(ender_eye_pos, look_pos_base) and vector.distance(look_pos, ender_eye_pos) <= 0.4 then self.provoked = "staring" - self.attack = minetest.get_player_by_name(obj:get_player_name()) + self.state = "stand" + self.hostile = false break - else -- I'm not sure what this part does, but I don't want to break anything - jordan4ibanez + --begin attacking the player + else if self.provoked == "staring" then self.provoked = "broke_contact" + self.hostile = true + self.state = "attack" + self.attacking = obj end end @@ -430,7 +452,7 @@ mobs:register_mob("mobs_mc:enderman", { self.base_texture = create_enderman_textures(block_type, self._taken_node) self.object:set_properties({ textures = self.base_texture }) self.animation = select_enderman_animation("block") - mobs:set_animation(self, self.animation.current) + mobs.set_mob_animation(self, self.animation.current) if def.sounds and def.sounds.dug then minetest.sound_play(def.sounds.dug, {pos = take_pos, max_hear_distance = 16}, true) end @@ -453,7 +475,7 @@ mobs:register_mob("mobs_mc:enderman", { local def = minetest.registered_nodes[self._taken_node] -- Update animation accordingly (removes visible block) self.animation = select_enderman_animation("normal") - mobs:set_animation(self, self.animation.current) + mobs.set_mob_animation(self, self.animation.current) if def.sounds and def.sounds.place then minetest.sound_play(def.sounds.place, {pos = place_pos, max_hear_distance = 16}, true) end @@ -557,7 +579,7 @@ mobs:register_mob("mobs_mc:enderman", { water_damage = 8, view_range = 64, fear_height = 4, - attack_type = "dogfight", + attack_type = "punch", }) diff --git a/mods/ENTITIES/mobs_mc/endermite.lua b/mods/ENTITIES/mobs_mc/endermite.lua index 2bffa8304..712086828 100644 --- a/mods/ENTITIES/mobs_mc/endermite.lua +++ b/mods/ENTITIES/mobs_mc/endermite.lua @@ -9,12 +9,15 @@ mobs:register_mob("mobs_mc:endermite", { type = "monster", spawn_class = "hostile", passive = false, + rotate = 270, + hostile = true, hp_min = 8, hp_max = 8, xp_min = 3, xp_max = 3, armor = {fleshy = 100, arthropod = 100}, group_attack = true, + attack_type = "punch", collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.29, 0.2}, visual = "mesh", mesh = "mobs_mc_endermite.b3d", diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index 1d7179162..609110bdb 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -14,13 +14,17 @@ mobs:register_mob("mobs_mc:ghast", { description = S("Ghast"), type = "monster", spawn_class = "hostile", - pathfinding = 1, group_attack = true, + hostile = true, + fly_random_while_attack = true, hp_min = 10, hp_max = 10, + rotate = 270, xp_min = 5, xp_max = 5, - collisionbox = {-2, 5, -2, 2, 9, 2}, + reach = 20, + eye_height = 2.5, + collisionbox = {-2, 0, -2, 2, 4, 2}, visual = "mesh", mesh = "mobs_mc_ghast.b3d", textures = { @@ -36,8 +40,10 @@ mobs:register_mob("mobs_mc:ghast", { -- TODO: damage -- TODO: better death }, + walk_velocity = 1.6, run_velocity = 3.2, + drops = { {name = mobs_mc.items.gunpowder, chance = 1, min = 0, max = 2, looting = "common"}, {name = mobs_mc.items.ghast_tear, chance = 10/6, min = 0, max = 1, looting = "common", looting_ignore_chance = true}, @@ -48,22 +54,23 @@ mobs:register_mob("mobs_mc:ghast", { walk_start = 0, walk_end = 40, run_start = 0, run_end = 40, }, + fall_damage = 0, - view_range = 100, - attack_type = "dogshoot", - arrow = "mobs_mc:fireball", - shoot_interval = 3.5, - shoot_offset = -5, - dogshoot_switch = 1, - dogshoot_count_max =1, - passive = false, - jump = true, - jump_height = 4, + view_range = 28, + attack_type = "projectile", + arrow = "mobs_mc:ghast_fireball", floats=1, fly = true, makes_footstep_sound = false, - instant_death = true, fire_resistant = true, + projectile_cooldown_min = 5, + projectile_cooldown_max = 7, + shoot_arrow = function(self, pos, dir) + -- 2-4 damage per arrow + local dmg = math.random(2,4) + mobs.shoot_projectile_handling("mobs_mc:ghast_fireball", pos, dir, self.object:get_yaw(), self.object, 11, dmg,nil,nil,nil,-0.6) + end, + --[[ do_custom = function(self) if self.firing == true then self.base_texture = {"mobs_mc_ghast_firing.png"} @@ -73,6 +80,7 @@ mobs:register_mob("mobs_mc:ghast", { self.object:set_properties({textures=self.base_texture}) end end, + ]]-- }) @@ -92,32 +100,40 @@ mobs_mc.spawn_height.nether_min, mobs_mc.spawn_height.nether_max) -- fireball (projectile) -mobs:register_arrow("mobs_mc:fireball", { +mobs:register_arrow("mobs_mc:ghast_fireball", { visual = "sprite", visual_size = {x = 1, y = 1}, textures = {"mcl_fire_fire_charge.png"}, velocity = 15, collisionbox = {-.5, -.5, -.5, .5, .5, .5}, + tail = 1, + tail_texture = "mobs_mc_spit.png^[colorize:black:255", --repurpose spit texture + tail_size = 5, _is_fireball = true, hit_player = function(self, player) + --[[ player:punch(self.object, 1.0, { full_punch_interval = 1.0, damage_groups = {fleshy = 6}, }, nil) - mobs:boom(self, self.object:get_pos(), 1, true) + ]]-- + --mobs:boom(self, self.object:get_pos(), 1, true) + mcl_explosions.explode(self.object:get_pos(), 3,{ drop_chance = 1.0 }) end, hit_mob = function(self, mob) mob:punch(self.object, 1.0, { full_punch_interval = 1.0, - damage_groups = {fleshy = 6}, + damage_groups = {fleshy = self._damage}, }, nil) - mobs:boom(self, self.object:get_pos(), 1, true) + --mobs:boom(self, self.object:get_pos(), 1, true) + mcl_explosions.explode(self.object:get_pos(), 3,{ drop_chance = 1.0 }) end, hit_node = function(self, pos, node) - mobs:boom(self, pos, 1, true) + --mobs:boom(self, pos, 1, true) + mcl_explosions.explode(self.object:get_pos(), 3,{ drop_chance = 1.0 }) end }) diff --git a/mods/ENTITIES/mobs_mc/guardian.lua b/mods/ENTITIES/mobs_mc/guardian.lua index 06a2ba2e2..241ac3444 100644 --- a/mods/ENTITIES/mobs_mc/guardian.lua +++ b/mods/ENTITIES/mobs_mc/guardian.lua @@ -14,7 +14,7 @@ mobs:register_mob("mobs_mc:guardian", { xp_max = 10, breath_max = -1, passive = false, - attack_type = "dogfight", + attack_type = "punch", pathfinding = 1, view_range = 16, walk_velocity = 2, diff --git a/mods/ENTITIES/mobs_mc/guardian_elder.lua b/mods/ENTITIES/mobs_mc/guardian_elder.lua index 5b8150dd4..4fb989e2f 100644 --- a/mods/ENTITIES/mobs_mc/guardian_elder.lua +++ b/mods/ENTITIES/mobs_mc/guardian_elder.lua @@ -16,7 +16,7 @@ mobs:register_mob("mobs_mc:guardian_elder", { xp_max = 10, breath_max = -1, passive = false, - attack_type = "dogfight", + attack_type = "punch", pathfinding = 1, view_range = 16, walk_velocity = 2, diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index ac631f205..461c60efd 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -88,6 +88,10 @@ local horse = { spawn_class = "passive", visual = "mesh", mesh = "mobs_mc_horse.b3d", + rotate = 270, + walk_velocity = 1, + run_velocity = 8, + skittish = true, visual_size = {x=3.0, y=3.0}, collisionbox = {-0.69825, -0.01, -0.69825, 0.69825, 1.59, 0.69825}, animation = { @@ -97,7 +101,7 @@ local horse = { walk_speed = 25, walk_start = 0, walk_end = 40, - run_speed = 60, + run_speed = 120, run_start = 0, run_end = 40, }, @@ -114,7 +118,8 @@ local horse = { fly = false, walk_chance = 60, view_range = 16, - follow = mobs_mc.follow.horse, + follow = "mcl_farming:wheat_item", + follow_distance = 3, passive = true, hp_min = 15, hp_max = 30, @@ -182,7 +187,7 @@ local horse = { -- if driver present and horse has a saddle allow control of horse if self.driver and self._saddle then - mobs.drive(self, "walk", "stand", false, dtime) + mobs.drive(self, "run", "stand", false, dtime) return false -- skip rest of mob functions end @@ -214,6 +219,21 @@ local horse = { local iname = item:get_name() local heal = 0 + --sneak click to breed the horse/feed it + if self.owner and self.owner == clicker:get_player_name() then + --attempt to enter breed state + if mobs.enter_breed_state(self,clicker) then + return + end + end + + --don't do any other logic with the baby + --make baby grow faster + if self.baby then + mobs.make_baby_grow_faster(self,clicker) + return + end + -- Taming self.temper = self.temper or (math.random(1,100)) @@ -239,6 +259,7 @@ local horse = { self.buck_off_time = 40 -- TODO how long does it take in minecraft? if self.temper > 100 then self.tamed = true -- NOTE taming can only be finished by riding the horse + mobs.tamed_effect(self) if not self.owner or self.owner == "" then self.owner = clicker:get_player_name() end @@ -253,6 +274,14 @@ local horse = { -- If nothing happened temper_increase = 0 and addition does nothing self.temper = self.temper + temper_increase + --give the player some kind of idea + --of what's happening with the horse's temper + if self.temper <= 100 then + mobs.feed_effect(self) + else + mobs.tamed_effect(self) + end + return end @@ -282,10 +311,6 @@ local horse = { return end - if mobs:protect(self, clicker) then - return - end - -- 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 @@ -357,9 +382,6 @@ local horse = { self.object:set_properties({stepheight = 1.1}) mobs.attach(self, clicker) - -- Used to capture horse - elseif not self.driver and iname ~= "" then - mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) end end end, @@ -520,22 +542,53 @@ mobs:spawn_specific( "overworld", "ground", { -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"ColdTaiga", -"SunflowerPlains", -"RoofedForest", -"MesaPlateauFM_grasstop", -"ExtremeHillsM", -"BirchForestM", + "FlowerForest_beach", + "Forest_beach", + "StoneBeach", + "ColdTaiga_beach_water", + "Taiga_beach", + "Savanna_beach", + "Plains_beach", + "ExtremeHills_beach", + "ColdTaiga_beach", + "Swampland_shore", + "JungleM_shore", + "Jungle_shore", + "MesaPlateauFM_sandlevel", + "MesaPlateauF_sandlevel", + "MesaBryce_sandlevel", + "Mesa_sandlevel", + "Mesa", + "FlowerForest", + "Swampland", + "Taiga", + "ExtremeHills", + "Jungle", + "Savanna", + "BirchForest", + "MegaSpruceTaiga", + "MegaTaiga", + "ExtremeHills+", + "Forest", + "Plains", + "Desert", + "ColdTaiga", + "IcePlainsSpikes", + "SunflowerPlains", + "IcePlains", + "RoofedForest", + "ExtremeHills+_snowtop", + "MesaPlateauFM_grasstop", + "JungleEdgeM", + "ExtremeHillsM", + "JungleM", + "BirchForestM", + "MesaPlateauF", + "MesaPlateauFM", + "MesaPlateauF_grasstop", + "MesaBryce", + "JungleEdge", + "SavannaM", }, 0, minetest.LIGHT_MAX+1, diff --git a/mods/ENTITIES/mobs_mc/iron_golem.lua b/mods/ENTITIES/mobs_mc/iron_golem.lua index 0d3e74645..48e573e13 100644 --- a/mods/ENTITIES/mobs_mc/iron_golem.lua +++ b/mods/ENTITIES/mobs_mc/iron_golem.lua @@ -16,8 +16,11 @@ mobs:register_mob("mobs_mc:iron_golem", { type = "npc", spawn_class = "passive", passive = true, + rotate = 270, hp_min = 100, - hp_max = 100, + hp_max = 100, + protect = true, + neutral = true, breath_max = -1, collisionbox = {-0.7, -0.01, -0.7, 0.7, 2.69, 0.7}, visual = "mesh", @@ -40,7 +43,7 @@ mobs:register_mob("mobs_mc:iron_golem", { reach = 3, group_attack = true, attacks_monsters = true, - attack_type = "dogfight", + attack_type = "punch", drops = { {name = mobs_mc.items.iron_ingot, chance = 1, diff --git a/mods/ENTITIES/mobs_mc/llama.lua b/mods/ENTITIES/mobs_mc/llama.lua index 655cddfb6..58f565ec1 100644 --- a/mods/ENTITIES/mobs_mc/llama.lua +++ b/mods/ENTITIES/mobs_mc/llama.lua @@ -28,6 +28,15 @@ mobs:register_mob("mobs_mc:llama", { description = S("Llama"), type = "animal", spawn_class = "passive", + rotate = 270, + neutral = true, + group_attack = true, + attack_type = "projectile", + 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) + end, hp_min = 15, hp_max = 30, xp_min = 1, @@ -50,7 +59,11 @@ mobs:register_mob("mobs_mc:llama", { walk_velocity = 1, run_velocity = 4.4, follow_velocity = 4.4, + breed_distance = 1.5, + baby_size = 0.5, + follow_distance = 2, floats = 1, + reach = 6, drops = { {name = mobs_mc.items.leather, chance = 1, @@ -83,7 +96,7 @@ mobs:register_mob("mobs_mc:llama", { look_start = 78, look_end = 108, }, - follow = mobs_mc.follow.llama, + follow = mobs_mc.items.hay_bale, view_range = 16, do_custom = function(self, dtime) @@ -126,30 +139,71 @@ mobs:register_mob("mobs_mc:llama", { return end - local item = clicker:get_wielded_item() - if item:get_name() == mobs_mc.items.hay_bale then - -- Breed with hay bale - if mobs:feed_tame(self, clicker, 1, true, false) then return end - else - -- Feed with anything else - if mobs:feed_tame(self, clicker, 1, false, true) then return end + --owner is broken for this + --we'll make the owner this guy + --attempt to enter breed state + if mobs.enter_breed_state(self,clicker) then + self.tamed = true + self.owner = clicker:get_player_name() + return + end + + --ignore other logic + --make baby grow faster + if self.baby then + mobs.make_baby_grow_faster(self,clicker) + return end - if mobs:protect(self, clicker) then return end + -- Make sure tamed llama is mature and being clicked by owner only if self.tamed and not self.child and self.owner == clicker:get_player_name() then + local item = clicker:get_wielded_item() + --safety catch + if not item then + return + end + + + + --put chest on carpeted llama + if self.carpet and not self.chest and item:get_name() == "mcl_chests:chest" then + if not minetest.is_creative_enabled(clicker:get_player_name()) then + item:take_item() + clicker:set_wielded_item(item) + end + + self.base_texture = table.copy(self.base_texture) + self.base_texture[1] = "mobs_mc_llama_chest.png" + self.object:set_properties({ + textures = self.base_texture, + }) + self.chest = true + + return --don't attempt to ride + end + + -- Place carpet - --[[ TODO: Re-enable this code when carpet textures arrived. - if minetest.get_item_group(item:get_name(), "carpet") == 1 and not self.carpet then + --TODO: Re-enable this code when carpet textures arrived. + if minetest.get_item_group(item:get_name(), "carpet") == 1 then + for group, carpetdata in pairs(carpets) do if minetest.get_item_group(item:get_name(), group) == 1 then if not minetest.is_creative_enabled(clicker:get_player_name()) then item:take_item() clicker:set_wielded_item(item) + + --shoot off old carpet + if self.carpet then + minetest.add_item(self.object:get_pos(), self.carpet) + end end + local substr = carpetdata[2] local tex_carpet = "mobs_mc_llama_decor_"..substr..".png" + self.base_texture = table.copy(self.base_texture) self.base_texture[2] = tex_carpet self.object:set_properties({ @@ -170,23 +224,21 @@ mobs:register_mob("mobs_mc:llama", { end end end - ]] - -- detatch player already riding llama - if self.driver and clicker == self.driver then + if self.carpet then + -- detatch player already riding llama + if self.driver and clicker == self.driver then - mobs.detach(clicker, {x = 1, y = 0, z = 1}) + mobs.detach(clicker, {x = 1, y = 0, z = 1}) - -- attach player to llama - elseif not self.driver then + -- attach player to llama + elseif not self.driver then - self.object:set_properties({stepheight = 1.1}) - mobs.attach(self, clicker) + self.object:set_properties({stepheight = 1.1}) + mobs.attach(self, clicker) + end end - -- Used to capture llama - elseif not self.driver and clicker:get_wielded_item():get_name() ~= "" then - mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) end end, @@ -240,3 +292,38 @@ mobs_mc.spawn_height.overworld_max) -- spawn eggs mobs:register_egg("mobs_mc:llama", S("Llama"), "mobs_mc_spawn_icon_llama.png", 0) + + +-- llama spit +mobs:register_arrow("mobs_mc:spit", { + visual = "sprite", + visual_size = {x = 0.3, y = 0.3}, + textures = {"mobs_mc_spit.png"}, + velocity = 1, + speed = 1, + tail = 1, + tail_texture = "mobs_mc_spit.png", + tail_size = 2, + tail_distance_divider = 4, + + hit_player = function(self, player) + if rawget(_G, "armor") and armor.last_damage_types then + armor.last_damage_types[player:get_player_name()] = "spit" + end + player:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = self._damage}, + }, nil) + end, + + hit_mob = function(self, mob) + mob:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = _damage}, + }, nil) + end, + + hit_node = function(self, pos, node) + --does nothing + end +}) \ No newline at end of file diff --git a/mods/ENTITIES/mobs_mc/models/attributes.txt b/mods/ENTITIES/mobs_mc/models/attributes.txt new file mode 100644 index 000000000..ec59e0f70 --- /dev/null +++ b/mods/ENTITIES/mobs_mc/models/attributes.txt @@ -0,0 +1 @@ +Ghast fixed by epCode - Thanks! \ No newline at end of file diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_ghast.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_ghast.b3d index cebc037c05efdcf2343c4232099b12fffc4c5c89..ab34f334f8321e30f05ae4b53a946b4095587ef0 100644 GIT binary patch delta 18141 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 KUl*Z12>%DJKTiJu literal 75657 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 V09X&5s-C+ER1az5QHx%`0RZsDdanQg diff --git a/mods/ENTITIES/mobs_mc/ocelot.lua b/mods/ENTITIES/mobs_mc/ocelot.lua index 5a3f135a1..e36abec77 100644 --- a/mods/ENTITIES/mobs_mc/ocelot.lua +++ b/mods/ENTITIES/mobs_mc/ocelot.lua @@ -31,6 +31,8 @@ local ocelot = { type = "animal", spawn_class = "passive", can_despawn = true, + rotate = 270, + skittish = true, hp_min = 10, hp_max = 10, xp_min = 1, @@ -43,7 +45,7 @@ local ocelot = { makes_footstep_sound = true, walk_chance = default_walk_chance, walk_velocity = 1, - run_velocity = 3, + run_velocity = 10, follow_velocity = 1, floats = 1, runaway = true, @@ -57,7 +59,7 @@ local ocelot = { }, animation = { speed_normal = 25, - run_speed = 50, + run_speed = 150, stand_start = 0, stand_end = 0, walk_start = 0, @@ -123,8 +125,6 @@ cat.sounds = { } cat.on_rightclick = function(self, clicker) if mobs:feed_tame(self, clicker, 1, true, false) then return end - if mobs:capture_mob(self, clicker, 0, 60, 5, false, nil) then return end - if mobs:protect(self, clicker) then return end if self.child then return end diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mobs_mc/parrot.lua index c04ea77c6..de52c6252 100644 --- a/mods/ENTITIES/mobs_mc/parrot.lua +++ b/mods/ENTITIES/mobs_mc/parrot.lua @@ -20,11 +20,14 @@ mobs:register_mob("mobs_mc:parrot", { hp_max = 6, xp_min = 1, xp_max = 3, - collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.89, 0.25}, + tilt_fly = true, + collisionbox = {-0.25, 0, -0.25, 0.25, 0.9, 0.25}, + eye_height = 0.45, visual = "mesh", mesh = "mobs_mc_parrot.b3d", textures = {{"mobs_mc_parrot_blue.png"},{"mobs_mc_parrot_green.png"},{"mobs_mc_parrot_grey.png"},{"mobs_mc_parrot_red_blue.png"},{"mobs_mc_parrot_yellow_blue.png"}}, visual_size = {x=3, y=3}, + rotate = 270, walk_velocity = 3, run_velocity = 5, sounds = { @@ -85,8 +88,6 @@ mobs:register_mob("mobs_mc:parrot", { -- Feed to tame, but not breed if mobs:feed_tame(self, clicker, 1, false, true) then return end - if mobs:protect(self, clicker) then return end - if mobs:capture_mob(self, clicker, 0, 50, 80, false, nil) then return end end, }) diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index b7d919cff..d7433a092 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -6,7 +6,8 @@ mobs:register_mob("mobs_mc:pig", { description = S("Pig"), type = "animal", spawn_class = "passive", - runaway = true, + skittish = true, + rotate = 270, hp_min = 10, hp_max = 10, xp_min = 1, @@ -19,11 +20,30 @@ mobs:register_mob("mobs_mc:pig", { "mobs_mc_pig.png", -- base "blank.png", -- saddle }}, + + --head code + has_head = true, + head_bone = "head", + + swap_y_with_x = false, + reverse_head_yaw = false, + + head_bone_pos_y = 2.4, + head_bone_pos_z = 0, + + head_height_offset = 1.1, + head_direction_offset = 0, + head_pitch_modifier = 0, + --end head code + visual_size = {x=2.5, y=2.5}, makes_footstep_sound = true, walk_velocity = 1, run_velocity = 3, follow_velocity = 3.4, + breed_distance = 1.5, + baby_size = 0.5, + follow_distance = 2, drops = { {name = mobs_mc.items.porkchop_raw, chance = 1, @@ -50,7 +70,7 @@ mobs:register_mob("mobs_mc:pig", { run_start = 0, run_end = 40, }, - follow = mobs_mc.follow.pig, + follow = "mcl_farming:carrot_item", view_range = 8, do_custom = function(self, dtime) @@ -91,12 +111,17 @@ mobs:register_mob("mobs_mc:pig", { return end - local wielditem = clicker:get_wielded_item() - -- Feed pig - if wielditem:get_name() ~= mobs_mc.items.carrot_on_a_stick then - if mobs:feed_tame(self, clicker, 1, true, true) then return end + --attempt to enter breed state + if mobs.enter_breed_state(self,clicker) then + return + end + + --ignore other logic + --make baby grow faster + if self.baby then + mobs.make_baby_grow_faster(self,clicker) + return end - if mobs:protect(self, clicker) then return end if self.child then return @@ -104,6 +129,8 @@ 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 @@ -164,10 +191,6 @@ mobs:register_mob("mobs_mc:pig", { inv:set_stack("main",self.driver:get_wield_index(), wielditem) end return - - -- Capture pig - elseif not self.driver and clicker:get_wielded_item():get_name() ~= "" then - mobs:capture_mob(self, clicker, 0, 5, 60, false, nil) end end, @@ -188,22 +211,53 @@ mobs:spawn_specific( "overworld", "ground", { -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"ColdTaiga", -"SunflowerPlains", -"RoofedForest", -"MesaPlateauFM_grasstop", -"ExtremeHillsM", -"BirchForestM", + "FlowerForest_beach", + "Forest_beach", + "StoneBeach", + "ColdTaiga_beach_water", + "Taiga_beach", + "Savanna_beach", + "Plains_beach", + "ExtremeHills_beach", + "ColdTaiga_beach", + "Swampland_shore", + "JungleM_shore", + "Jungle_shore", + "MesaPlateauFM_sandlevel", + "MesaPlateauF_sandlevel", + "MesaBryce_sandlevel", + "Mesa_sandlevel", + "Mesa", + "FlowerForest", + "Swampland", + "Taiga", + "ExtremeHills", + "Jungle", + "Savanna", + "BirchForest", + "MegaSpruceTaiga", + "MegaTaiga", + "ExtremeHills+", + "Forest", + "Plains", + "Desert", + "ColdTaiga", + "IcePlainsSpikes", + "SunflowerPlains", + "IcePlains", + "RoofedForest", + "ExtremeHills+_snowtop", + "MesaPlateauFM_grasstop", + "JungleEdgeM", + "ExtremeHillsM", + "JungleM", + "BirchForestM", + "MesaPlateauF", + "MesaPlateauFM", + "MesaPlateauF_grasstop", + "MesaBryce", + "JungleEdge", + "SavannaM", }, 9, minetest.LIGHT_MAX+1, diff --git a/mods/ENTITIES/mobs_mc/polar_bear.lua b/mods/ENTITIES/mobs_mc/polar_bear.lua index 98268961b..0476229b5 100644 --- a/mods/ENTITIES/mobs_mc/polar_bear.lua +++ b/mods/ENTITIES/mobs_mc/polar_bear.lua @@ -31,7 +31,7 @@ mobs:register_mob("mobs_mc:polar_bear", { walk_velocity = 1.2, run_velocity = 2.4, group_attack = true, - attack_type = "dogfight", + attack_type = "punch", drops = { -- 3/4 chance to drop raw fish (poor approximation) {name = mobs_mc.items.fish_raw, diff --git a/mods/ENTITIES/mobs_mc/rabbit.lua b/mods/ENTITIES/mobs_mc/rabbit.lua index 6b47fec70..90d5c27bf 100644 --- a/mods/ENTITIES/mobs_mc/rabbit.lua +++ b/mods/ENTITIES/mobs_mc/rabbit.lua @@ -8,7 +8,7 @@ local rabbit = { spawn_class = "passive", passive = true, reach = 1, - + rotate = 270, hp_min = 3, hp_max = 3, xp_min = 1, @@ -62,8 +62,6 @@ local rabbit = { on_rightclick = function(self, clicker) -- Feed, tame protect or capture if mobs:feed_tame(self, clicker, 1, true, true) then return end - if mobs:protect(self, clicker) then return end - if mobs:capture_mob(self, clicker, 0, 50, 80, false, nil) then return end end, do_custom = function(self) -- Easter egg: Change texture if rabbit is named “Toast” @@ -116,22 +114,53 @@ mobs:spawn_specific( "overworld", "ground", { -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"ColdTaiga", -"SunflowerPlains", -"RoofedForest", -"MesaPlateauFM_grasstop", -"ExtremeHillsM", -"BirchForestM", + "FlowerForest_beach", + "Forest_beach", + "StoneBeach", + "ColdTaiga_beach_water", + "Taiga_beach", + "Savanna_beach", + "Plains_beach", + "ExtremeHills_beach", + "ColdTaiga_beach", + "Swampland_shore", + "JungleM_shore", + "Jungle_shore", + "MesaPlateauFM_sandlevel", + "MesaPlateauF_sandlevel", + "MesaBryce_sandlevel", + "Mesa_sandlevel", + "Mesa", + "FlowerForest", + "Swampland", + "Taiga", + "ExtremeHills", + "Jungle", + "Savanna", + "BirchForest", + "MegaSpruceTaiga", + "MegaTaiga", + "ExtremeHills+", + "Forest", + "Plains", + "Desert", + "ColdTaiga", + "IcePlainsSpikes", + "SunflowerPlains", + "IcePlains", + "RoofedForest", + "ExtremeHills+_snowtop", + "MesaPlateauFM_grasstop", + "JungleEdgeM", + "ExtremeHillsM", + "JungleM", + "BirchForestM", + "MesaPlateauF", + "MesaPlateauFM", + "MesaPlateauF_grasstop", + "MesaBryce", + "JungleEdge", + "SavannaM", }, 9, minetest.LIGHT_MAX+1, diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index 9ddc0adee..1527fd6da 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -63,8 +63,13 @@ mobs:register_mob("mobs_mc:sheep", { hp_max = 8, xp_min = 1, xp_max = 3, + skittish = true, + breed_distance = 1.5, + baby_size = 0.5, + follow_distance = 2, + follow = mobs_mc.items.wheat, collisionbox = {-0.45, -0.01, -0.45, 0.45, 1.29, 0.45}, - + rotate = 270, visual = "mesh", visual_size = {x=3, y=3}, mesh = "mobs_mc_sheepfur.b3d", @@ -73,6 +78,23 @@ mobs:register_mob("mobs_mc:sheep", { color = "unicolor_white", 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, + + head_bone_pos_y = 3.6, + head_bone_pos_z = -0.6, + + head_height_offset = 1.0525, + head_direction_offset = 0.5, + head_pitch_modifier = 0, + --end head code + drops = { {name = mobs_mc.items.mutton_raw, chance = 1, @@ -99,7 +121,6 @@ mobs:register_mob("mobs_mc:sheep", { walk_start = 0, walk_end = 40, run_start = 0, run_end = 40, }, - follow = mobs_mc.follow.sheep, view_range = 12, -- Eat grass @@ -195,8 +216,16 @@ mobs:register_mob("mobs_mc:sheep", { on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() - if mobs:feed_tame(self, clicker, 1, true, true) then return end - if mobs:protect(self, clicker) then return end + --attempt to enter breed state + if mobs.enter_breed_state(self,clicker) then + return + end + + --make baby grow faster + if self.baby then + mobs.make_baby_grow_faster(self,clicker) + return + end if item:get_name() == mobs_mc.items.shears and not self.gotten and not self.child then self.gotten = true @@ -252,7 +281,6 @@ mobs:register_mob("mobs_mc:sheep", { end return end - if mobs:capture_mob(self, clicker, 0, 5, 70, false, nil) then return end end, on_breed = function(parent1, parent2) -- Breed sheep and choose a fur color for the child. @@ -309,22 +337,53 @@ mobs:spawn_specific( "overworld", "ground", { -"FlowerForest", -"Swampland", -"Taiga", -"ExtremeHills", -"BirchForest", -"MegaSpruceTaiga", -"MegaTaiga", -"ExtremeHills+", -"Forest", -"Plains", -"ColdTaiga", -"SunflowerPlains", -"RoofedForest", -"MesaPlateauFM_grasstop", -"ExtremeHillsM", -"BirchForestM", + "FlowerForest_beach", + "Forest_beach", + "StoneBeach", + "ColdTaiga_beach_water", + "Taiga_beach", + "Savanna_beach", + "Plains_beach", + "ExtremeHills_beach", + "ColdTaiga_beach", + "Swampland_shore", + "JungleM_shore", + "Jungle_shore", + "MesaPlateauFM_sandlevel", + "MesaPlateauF_sandlevel", + "MesaBryce_sandlevel", + "Mesa_sandlevel", + "Mesa", + "FlowerForest", + "Swampland", + "Taiga", + "ExtremeHills", + "Jungle", + "Savanna", + "BirchForest", + "MegaSpruceTaiga", + "MegaTaiga", + "ExtremeHills+", + "Forest", + "Plains", + "Desert", + "ColdTaiga", + "IcePlainsSpikes", + "SunflowerPlains", + "IcePlains", + "RoofedForest", + "ExtremeHills+_snowtop", + "MesaPlateauFM_grasstop", + "JungleEdgeM", + "ExtremeHillsM", + "JungleM", + "BirchForestM", + "MesaPlateauF", + "MesaPlateauFM", + "MesaPlateauF_grasstop", + "MesaBryce", + "JungleEdge", + "SavannaM", }, 0, minetest.LIGHT_MAX+1, @@ -336,3 +395,4 @@ mobs_mc.spawn_height.overworld_max) -- spawn eggs mobs:register_egg("mobs_mc:sheep", S("Sheep"), "mobs_mc_spawn_icon_sheep.png", 0) + diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 0d5ad880a..9932c5add 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -15,7 +15,7 @@ mobs:register_mob("mobs_mc:shulker", { description = S("Shulker"), type = "monster", spawn_class = "hostile", - attack_type = "shoot", + attack_type = "projectile", shoot_interval = 0.5, arrow = "mobs_mc:shulkerbullet", shoot_offset = 0.5, diff --git a/mods/ENTITIES/mobs_mc/silverfish.lua b/mods/ENTITIES/mobs_mc/silverfish.lua index 5af3c8aa0..148c4c722 100644 --- a/mods/ENTITIES/mobs_mc/silverfish.lua +++ b/mods/ENTITIES/mobs_mc/silverfish.lua @@ -44,7 +44,7 @@ mobs:register_mob("mobs_mc:silverfish", { run_start = 0, run_end = 20, }, view_range = 16, - attack_type = "dogfight", + attack_type = "punch", damage = 1, reach = 1, }) diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index 61e1c6eb2..37b1fc6dd 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -16,11 +16,15 @@ local skeleton = { description = S("Skeleton"), type = "monster", spawn_class = "hostile", + hostile = true, + rotate = 270, hp_min = 20, hp_max = 20, xp_min = 6, xp_max = 6, breath_max = -1, + eye_height = 1.5, + projectile_cooldown = 1.5, armor = {undead = 100, fleshy = 100}, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.98, 0.3}, pathfinding = 1, @@ -31,6 +35,22 @@ local skeleton = { "mcl_bows_bow_0.png", -- bow "mobs_mc_skeleton.png", -- skeleton } }, + + --head code + has_head = false, + head_bone = "head", + + swap_y_with_x = true, + reverse_head_yaw = true, + + head_bone_pos_y = 2.4, + head_bone_pos_z = 0, + + head_height_offset = 1.1, + head_direction_offset = 0, + head_pitch_modifier = 0, + --end head code + visual_size = {x=1, y=1}, makes_footstep_sound = true, textures = { @@ -43,7 +63,7 @@ local skeleton = { walk_velocity = 1.2, run_velocity = 2.4, damage = 2, - reach = 2, + reach = 3, drops = { {name = mobs_mc.items.arrow, chance = 1, @@ -75,6 +95,8 @@ local skeleton = { walk_speed = 15, walk_start = 40, walk_end = 60, + run_start = 40, + run_end = 60, run_speed = 30, shoot_start = 70, shoot_end = 90, @@ -86,13 +108,13 @@ local skeleton = { ignited_by_sunlight = true, view_range = 16, fear_height = 4, - attack_type = "dogshoot", + attack_type = "projectile", arrow = "mcl_bows:arrow_entity", shoot_arrow = function(self, pos, dir) if mod_bows then -- 2-4 damage per arrow - local dmg = math.max(4, math.random(2, 8)) - mcl_bows.shoot_arrow("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object, nil, dmg) + local dmg = math.random(2,4) + mobs.shoot_projectile_handling("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object, nil, dmg) end end, shoot_interval = 2, diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mobs_mc/skeleton_wither.lua index 1c0bdbea1..279a1d8cb 100644 --- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua +++ b/mods/ENTITIES/mobs_mc/skeleton_wither.lua @@ -87,7 +87,7 @@ mobs:register_mob("mobs_mc:witherskeleton", { fire_damage = 0, light_damage = 0, view_range = 16, - attack_type = "dogfight", + attack_type = "punch", dogshoot_switch = 1, dogshoot_count_max =0.5, fear_height = 4, diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 0c5fe24ac..0cae6757d 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -64,6 +64,7 @@ local slime_big = { hp_max = 16, xp_min = 4, xp_max = 4, + rotate = 270, collisionbox = {-1.02, -0.01, -1.02, 1.02, 2.03, 1.02}, visual_size = {x=12.5, y=12.5}, textures = {{"mobs_mc_slime.png", "mobs_mc_slime.png"}}, @@ -95,8 +96,9 @@ local slime_big = { }, fall_damage = 0, view_range = 16, - attack_type = "dogfight", + attack_type = "jump_punch", passive = false, + jump_only = true, jump = true, walk_velocity = 2.5, run_velocity = 2.5, @@ -309,6 +311,7 @@ local magma_cube_big = { }, walk_velocity = 4, run_velocity = 4, + rotate = 270, damage = 6, reach = 3, armor = 53, @@ -332,12 +335,13 @@ local magma_cube_big = { }, water_damage = 0, lava_damage = 0, - fire_damage = 0, + fire_damage = 0, light_damage = 0, fall_damage = 0, view_range = 16, - attack_type = "dogfight", + attack_type = "jump_punch", passive = false, + jump_only = true, jump = true, jump_height = 8, walk_chance = 0, diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.4.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.4.ogg index 5c9ee492ba4d2315ab820b8149dcb5b73cfc62f6..acb236445e2b530640a1c98a54c81d20a9a3672a 100644 GIT binary patch delta 10470 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 JyN#OB{~zmA!c71G delta 6045 zcmYLtc~p{H)cy;CA`TY}h)}NxYKoGYVwPRg6w9F!1wtsp*D_F=G@A>;p;wgDMlCJF z2@y(C>o!H=FdM-|t)N+kc$*oORx_)>(T$&)#Q0g<1c`la{Pr zoe02z|26l*)8OyveX1y?lr+Qk_ZntitAF5r>e&MrX;|q0|MU08?^6{?k`In^-~F1j zpLCogOp?r_?8Olr5;ldK0jXAiyAG*kuq8 z5lmGc1WkH+eD~@S zO=)7;ijA{(!-|CXjZzKf47;V(vRQC}BFw2m0(woNjS%*z#JE-B@3HSTEhKlPOU}1X zvCw-y9vGa{(y5=g-1Bl`peT!&(6P7u!*Ia8e6rE8blKM1Z?`HA%oqqi4O73AyUhPq zLq9sPY9nZ$*)e|Y%1not6;aclk*5|FOMIv&TGlO|e#{0+w3gQR>4`Rwe?R~c0AxyV z|INBZ#Gs_Ja@Qa=U7N(?@rYcBYaIvgsGSB@aU~64*`c~TiriDdqoTR2#yYW@gFmV* zkR8yh+x@M-w=Q`k%nzVh_5xtW8f=H$q(;(+6qBr$6L-tBl1lF0N&?GVxkNJ&8LWxUp&)Z4qliSlO*PaGzU}K!&5E(R%j>x7VWEycp9cOHSZs=4e-O2^R=IS8PMwAK2$Lse&93@>% zU}CYot^}pZlR~@>z+l$5GwUbq#srQ9@onWl?mbzddJc2YB7w!Qxxg@^sd1q8HQ2+wdb~h4 zSPB^i_|en#OAFh)(oo|>Pn*1aV_^y^ftiINK=SUss3PL9|LMI4Jk0B|tKq>W}9%=BvP)1dy*X@dZdTe!tg$ z&v$zSJ0rxW3JUQ`5bp?!jGUNc3$Zs|^{-`xOe?swMquP4V9oT1R~KXl;Jc)|VRsyW zW7e?bpcb|->f+MBuKbZ~zn<#bzG>*6{6nvhyT59#j(6OEt$m6#tsQE!cBuYq>)Yui z=^Yz25$Fx*XtxwxSwlB3&X)Y!JwEw{^wx-O3b*SPH{MoIXv7ujbfzRpQ@|otIG!aC z_)`>=szl~Sh^7k1I%)yw>Mk)rq!IGP%}Pzx>Y=tPA`C{-5v1bP6T%sAHAI;ckF?EV zr6o*fkl&nzA+XFnI-0}Ful@QpU9Jn0@`-u~%%Jmi2iIlsW0zXyDv6*`L98MS_-m(~ zU9u_z*rf*bCRtPm1%e@(1}G>wMb2#GY1Ik>M~gyBgLkXovlp)`9Gj%Sy)KBBZV2f- zo>GnYRf-9N{qdK@rQn*=T|XWgyO#V|?>7^DN8prj|Ix3vuO8L!3?@!PzHpXJB+m}h z94OzHj*cT7PBat9K?rj|#K8e!t3pQ7Y(mvF@Zt)~>Iw{DI?FO*KI5n)#m2FzrT4s& zqM}LDW!bTbfRV>;6#1NqUE;)vV@{k6 z1S(Iyqso|Jkr@bgm{WdMwDjL^z(nxM*0i>g?>ByYjV)EWX|@(ea5DyM8ZKXyUdG*D zs5-Lw?w|K92mh;p)%dJ;I}{Vwjtz0x41?8&tfx63Ub6up(pE3k4-Tf9lDY@D7)&Bw zVk_8QXlOb+%dQ{cLnu_*MfF1I{_3g@mC7RCR;`$~A6ZBAfYiJx$eHam7n;wk7d!Jg zEou=bl^iM_uJWaLs$RvjaQ+L+ds4Bp(ciZ9tiBQY>m3EH89;gRBC|!=pU`$h1k;9u z$H`%L4;3F+e=^DXgZriAEf@Dk zSwBB=5VPX(Sl-p`;f;oKcv((aHL@WATMtTA$ou;rU+eYo@VG)2Iskxelg5;S-Olo< z)3sG9)y9E=;bBca5*Dd%ZEilY2{d(DW)Rf1oW>wNjVno6w8!3=gly#NxUHp+>r6XG zcA)Ent+)T0UC-J3?#{@RSq21Kr{hVQIuv;fJ#aTrM+2y88E=n&{>;t0sen|krxP+( z9t}HZciUx~yNos`EQ4u;qlq!6YaS4e!QHZC?t(p_odzHP`6&fHdqf-23M95smI&Z@ zS|*2yME34xSai`8u0%>*wn7HU0Zp0fm!qEqlgFRq!q$fY3tspRXe--^B^S2<151{} zCd7K3Ce4t9%@)vz&K@T=Cx3*JW=>c@yiwQb6WivVI%QO3(JP_wt!h zKL-=?aCbR?0Nnr}tYsnjb)2K1BZ{t4nH&L6i<1Brk9dT#zTbD=y3W)W6=`g$y&2?5 zOD{V_k&!HAyu{cr0}cj_V_Hafr9KKDM?UGB?zD3y`kqwdKEwa`+iO5m9WrGbxz=$wg0rGONsqttvwFQY^fU5;N3ng@`gck_mp4p;}|S)j*(3# zMcKdKZe`w$TZ*rJwq;&WASOhJ5Vv$ zD`-$`>%g1mQ#1pf8juyp(^Eiikrcn(li0BJ_M=_4$c(9Iv2+I1R1&kxRse+K!%RP z;N>V%3?5?y1s{|eXaj4w0^Zp$+eVNG^7;C;g;g|>mIgLfkyu(IB&)K+J1bJ`BA9HZ zKg(@E9-A4o0k!$t&b&j}GbU;6*1U~silyy4(D4EDrc1PU8ZDk7LMjU8{cz6z**=SLnc?)>KjUsbj2S^$BD4p9mdj*vzzRauwKg<4l-v_TUB>06%x(rVWt1HFq>*ZuocidAk}G!w=AkF+285UwHZH zRbOMYtnX$^vz^I|l7GX9iL)^wexn!!7`}m(&gPcnTVJ^U}&*No7Z{GQSew2GL#wj$=hP0{Oy4Vh_ z78)^r`YT98`^o?Qvpzp|x@jl+(qcW1|1X!-mIA5Km5F4 z&%A8g-%cW?r&t5ym|=h&I@=aV7O|lbf9aFzM_m;&+|#}gNchK_dq&1Z<9_wA1xan| z)CrLfA+-{nG{S)O&r@t z!++RFCQv=np5Z|MG!L@5nUe{b-BpC5l+~-HgE{I-uR3B-x^cdpk8P}0b!edf2$EJ; zfVRwc=k-$LkU_YWJ_lbNjx(rQ?e?%b{A4tZTEXD*zZR^V>OJ@;P#P-R|6Y+&aJr7r@Xv>h9Iu0(mC7h17NLWlM_z|X%0udj*=fOvCZ6}dfHhpc#d zc;C|1g{v)p%>VCww0;lI_h{DsjEjipU={#xmq65DDof%&Ky*x7VAj$7bI*qzo!h8 z0R^YKer08^VDrj{YcJh)UWzG3jiPDi@^>s@vlx6NU;#*u7cX<{Bd`AZ9>ggX{Bf*i z*@}M-9*~|U5xg1C>yY@GmWBxDOGwm){6R0*|&+v4Yp9Hb|e&ZxUYqu`Gtw zn5D7^=6O}T3^px97e#K!L=&rCB*Tuat{KHXoO&GnJ)L}eVF&fRZz%q=v3=Fyl&ozr zG(8*M-EAKi*JE!F_H+x)kp)vp+zT z?;oXwG-P$2msH4W#zi1?Y;lYmTkH|JU>BPrGQY-t+WA zgPfsOls?>-_n>TgqZr=^c2nR&@ytQq{M)gcEM^HKq0d-drLeZt$c?C&Xn*qhS}z$D zElJ#40fbggXTI85iV7}?hn0Jcx|7>#UpF}QLs;oi>Gvo1!{5BBqFURQ!V-XnZFa!_ zlTZ)`c;<9%w%^K#h57sT_)@)<>DlPuqh~KdSJ#aHnRRHqucW%GqV)0ho}|aI5qs@_ z%!V~MIVCtHlsR{ol^2wkmz&QK3H?#H2uv&QO?M!tUqScLnv*;Y6y7{f1NqX#3_{S* z$`gskK@ycDam2%viw#%6#@)o^wo4bLXI>5_2~TJSYKImMxqkAE0wSyNjpR!+0$+qX zpAziu0lOiglF4cS z)zywHS-fS}<7Y$_voY~7e3tZ|Q~z4!!Y$@C;gAVaiBo}NX>KN}*!Q#jtpz3jH+>IJ zTIxCTMpHdh8{@hOL*67z1I@aOhndSlX1u@5Kbh4Zr<6|JEu2 z>!Y4a@_v17)dfn`t^|uh8BMW@F)WD=)V;$B@Piu@wkf&kD;l zT%(7Np;IF^tu!2|RdVTzy3*KoaW-+S3ZY4)E-SMuu)u zpXYwk_YuM2qF6HK>Isuu-7lN3G5L3I6hFrCGcQ_V@70hn+fQGXV-a9BX@I#H zh2a}3Q&Nd_N_?SM+>ErO)d`zT^X>GM{5i z^(Si4_!Loc=;}g6$=+qz(tqIZ=dP;U|Ml#;ku^z~!;=$|vGrkZR6EZ7?EDtBsSkf@ zru15zANlZ&qD!LE?4RG=L~sOfX;r_Z!1#FMrW1n}f~cE^c=W}qr)vIcdS`EM-{6D| z3C4u{mec|Q`~ko(F4jVzVBA%Rjqsy!+7urD?ERMBK1+#p{-DSp?Mu*lQn>6$odCi& z63+PPo8sB;k2Tgn2{oOoay8+GtR@SOW!bgM=3G69#j~ql-4PmcU(jH;tYAb$BSpj0 z8qPO)I_7%rYWGUrQP%T`;%fXz2prN5pIa9?>~Zu#%b}de>+OykPL=<+c-n@m1;1LC z5WXzEv+ZlI!=2^v=KjBhMm+gsTgg0Vc}wtU;8&zo2~Oq!{Fx?EEr9BlxovUlF+~<* z7M)x8{@N-xbJj{ou*QT02Ro#C{AM88j7}5pH9a4eZ;-2rgnVeQv$F-4QO6PR^|g6C z#gRi?13b31y$^Tye9FTxB)$v5X0?D+fJE*4cZSsd<(Em+_9SNtge-)RbZwnICz7SZ zN8UNXM9nMz@Oe_x!DU+zTFMee32QD>v2Xr~)Gg0^Rx5iGQ=0N|m0gxm0eNbKh0t=( z2JEoc?BmyG{?Ya3Ebf!!=w{14R2Hgh)#ie|5II7Q@%{#KXUvtBA|!7*ejwZ7+3>w^ zX=vKq|Gva@mPQBkzw)ZtJFR$U+rITH`)pgcp&O=tmfv(WgqwMI9~%JkpW+wrI}hXa z{HC)cuAr;M#4m$`;{7*+c&(rpA!x8O%3G7~1&LFP3Xb<2h6d8G@KlY8R-1L~=}?7h zW;vbUt%>6J0GY?<*~E=rxNxCS%%Mz~csr+IhT!b8icg$p6kRwq#ycjtp$DN?NVJ80I~wX3qmxYLiG1O5kVg)`Cs diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.5.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.5.ogg index acb236445e2b530640a1c98a54c81d20a9a3672a..1ef7a522744a727da6082e2a3a1f2bf36fc77604 100644 GIT binary patch delta 6897 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 Y^}12-boZEETz}BiBjV(bf8T@u3+ffPY5)KL delta 10469 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 J^-U+>{{WCWcXR*% delta 6898 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 ZS+5)QPIr&##q|eGJt9v2`1d{dzW@w?xjp~@ diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.7.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager.7.ogg deleted file mode 100644 index c2743fbcc640651eedc1529bbed4e3c209552fc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11068 zcmeHtcT|%}+xLVTstF_^AYkYr1|>jPKy*V1hAIgJLjWbANVOrX-B1kyEP#j<7eWyt zQ6dBtcNLHzh#*K2u`D($h-=wZS=)OD+X=Do%5XUzjw|s%v^KLT=!gM<~IXt zHf#t23gBBhA9tB1uO>}S&%lgfX`8lk<5T1W1P4u6zgqWS6q$XQCdus*JQT2rNy~2Y*ap}=g$J? z5RC>v3Gnc02WqCh69%0(V66^pt#XbJa5{lg70{=g)w+JSjM`Y=TA#Ra(Aom76{-v^ z98hQ`*(ip*;POp!uu!qzaBHv0iHfc2godgNb-P|%rk~xj+M)oLXALz6T%O}whuk%6 zT5tIHk;X!zPW`MBu{&kZ`ANmMLT!E>IOtp4RrI3~?r{0^eCztstX#S}44bccL!|4HhwZ6B!TwArrADkxi@BMWdNXZLXlZuXxjmuhvco2_Bi?6o zusPrIhdsZ%m*@GV<6xl5%(>*Dwb0Z+_`q4Hn3dC{0HWn8!KoFRS{K%M*T*KDiZ5@A zJK2`pe}>q9MsuD8z#tZRs){eG|G#oaaS+;Yx}tlvi)_>?`&g_|0$8pGJ_I9RLc+P`1Ue57Gw1W@IaQZOY1< zDgHMhRme5+Kd1D0e}NWaQW;y4z=PW#;>@ds2ThBuhI?o(NP-yn)sJvxLuGFVoVCjy zS2d!_M>=zZ%dO5gmX^<3FlkW#A!JMItH)$j$A-#M2E8@Q>K1A{bjnr5jW-~g{*wyr z9(@kP7k{Hnwec1U8XG!PHr;R@1=Vtk%dMp6gBRxe<`#|XDh4~9??WSUC(9Ght3^Py zx#)_Q18Q>GKi!7{*^M)S?WxSb?Kz;rMVZu_6d7+js9jV=>b0≦!)j)0i2^(6_4F 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⪼8)D-TJ`->@>Uw(8fCdv}Jn*&O4Gn>9R&mbhvv@|5CwbLtc zT+Cv#3`9_)uRYtkD#uzl*1!*`QQ&9q{K3jO=+~DCVyXK5Nwr6Jz1JP#%{V^kRk?WK zk1wAdXUG%)Uo=b*VVkj(it<5m*jbmmFMI|soRp3ewj4R&hvv_;U7I_@W6{w}I&?nG zLNkqDeRBQBOBYUs;7Egg+2OG#H{KP6UGYwtXixpBZ+GjCdh_|;wK^{TaqIK$WBy*> T_m77=o*i6O^uzS|W#GR6*1vMu diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_hurt.1.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_villager_hurt.1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5c9ee492ba4d2315ab820b8149dcb5b73cfc62f6 GIT binary patch literal 10341 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 F{0E)bG4}uf literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/spider.lua b/mods/ENTITIES/mobs_mc/spider.lua index c1cb5be4b..6ade915ab 100644 --- a/mods/ENTITIES/mobs_mc/spider.lua +++ b/mods/ENTITIES/mobs_mc/spider.lua @@ -17,17 +17,22 @@ local spider = { type = "monster", spawn_class = "hostile", passive = false, + hostile = true, + always_climb = true, docile_by_day = true, - attack_type = "dogfight", - pathfinding = 1, + attack_type = "punch", + punch_timer_cooloff = 0.5, + rotate = 270, damage = 2, reach = 2, hp_min = 16, hp_max = 16, + ignores_cobwebs = true, xp_min = 5, xp_max = 5, + eye_height = 0.475, armor = {fleshy = 100, arthropod = 100}, - collisionbox = {-0.7, -0.01, -0.7, 0.7, 0.89, 0.7}, + collisionbox = {-0.45, 0, -0.45, 0.45, 0.9, 0.45}, visual = "mesh", mesh = "mobs_mc_spider.b3d", textures = { @@ -44,7 +49,7 @@ local spider = { distance = 16, }, walk_velocity = 1.3, - run_velocity = 2.8, + run_velocity = 2.75, --spider can become extremely difficult if any higher jump = true, jump_height = 4, view_range = 16, diff --git a/mods/ENTITIES/mobs_mc/squid.lua b/mods/ENTITIES/mobs_mc/squid.lua index 0c425bb51..55d4b05c3 100644 --- a/mods/ENTITIES/mobs_mc/squid.lua +++ b/mods/ENTITIES/mobs_mc/squid.lua @@ -17,6 +17,8 @@ mobs:register_mob("mobs_mc:squid", { xp_min = 1, xp_max = 3, armor = 100, + rotate = 270, + tilt_swim = true, -- FIXME: If the squid is near the floor, it turns black collisionbox = {-0.4, 0.0, -0.4, 0.4, 0.9, 0.4}, visual = "mesh", @@ -48,8 +50,7 @@ mobs:register_mob("mobs_mc:squid", { }, visual_size = {x=3, y=3}, makes_footstep_sound = false, - fly = true, - fly_in = { mobs_mc.items.water_source, mobs_mc.items.river_water_source }, + swim = true, breathes_in_water = true, jump = false, view_range = 16, diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_chest.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..e0715af9f02aa63fd68ee71dd0cdaa7fc5e32e1c GIT binary patch literal 20594 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 literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_cyan.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_cyan.png new file mode 100644 index 0000000000000000000000000000000000000000..83f7a8faa17d54d5e7402e7d6e94e18f50e27401 GIT binary patch literal 7612 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 literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_green.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_green.png new file mode 100644 index 0000000000000000000000000000000000000000..c3297ce9424cbcc9d6f40928e2c1f6ad9e6f13a2 GIT binary patch literal 5809 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 literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_blue.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..71eabea5365dd02619695bfe447b7a327758b534 GIT binary patch literal 7643 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 literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_gray.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_light_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..929a6095072b637a445ab8dc122209208b262619 GIT binary patch literal 6354 zcma(!WmFVgu#0rFNGV;?Areb3%_7}PH>~7Jv%(@GEvYLhox;-HT_PooNUumN2z(%j zynR33|99@08*}E)%$YlJC*DwBi<0ay82|vFglMZ9?(a!%Qs$ zj2(kH{9gLH!Mt2K0z&;RzTrx=Sae`h7c@$ktqx4HYF#A*;t9IR~?= z!%%0*;+g!8B3*kmd>)C1GCzC&!M51{?)@$?th$i4LRPKn%z4zwg?Nyrtn_%Za`0F^50zFZymnoQa><7PYA%0|Fq}dHAfv`Gx>hJoqkWg zG^}ufWw{po<6KLyn{yogN_lz-5dLsC#eNGri&Z9#$i@o&{^7K;@pOBX+F~35Zu2=*=NrXZGOPtuY5hbqJ#HZ*OxXI^8a`} zk=JbvIR-g#2{Aau^L_O&!d@lk@S;i}*ZQywe&xl+lC+@z6zGu}&s9hCPj%?z*?9MabOeyoK7bbPEJqo4HDZ& z7}y~YC!XXy0zLDS=K3*kwG=Bumd;lZLWts@^>ywuyPOv<#;FJO?3CJFIc2`ljSH4W zu?w(LOl5mkHn#{i$IAWkYX4wv?KzjbTjnBQTpF+ak+TtF7j|6p92Y1jBvV)Nk>|_1-7y`Z+J;{*o}1e{Pf@-KS_y0w>BQD!Abji|+fCf%`S7xl0`a#D zHLIpghchsTsRsJbi@Mcob$_y&gUx#pcPfk9@}3876SW!B)o{tUR}{cJ{VGgSQYr0t zTL=*#;CHT~A}U?M|5KxTpIiGA2B@OUmijc4fbe6J=IgA^UWqH~Q1a$`^Nl&=gw5%< zJ244H?eABiwilkns zPL@?$diVoE(VVk5xUq1>ft;~a23dpBtV+CKN$HrV)QeT4FMJ*yP2zq*x$vA-lt7~P z$lVb~jYg3C654ap37l9NIB%oRDKV@MMO3dY*_Bg^l;-sW=L{Q*5EQXg%ta{*t@(t? z|CTh!zoq$gbYC27d`Gg-%l<*3JP>WK(Qx2m0r$QD8&eHA)|0TBsSL%JoOD;wyRUgp zY@w=*F?M%`%G@KB+g;U!rn#zyrEgFAZ4&__$11Xw)b@j31Yu=`=5^ioJLP1ax4r86mnO*Wp8Ss)cqvWztA{Wj>Xkv{D}-eoLpS?!%f#KbB!&e9%s#8zkT<#S+}YH?Z~Z^=xgszqg` zktHglROwta2bx*oCReQG5)C~X-S&TI9J4<01~Q|5+8k&!innoa?7;u4ei5K7K1uL& zVZ~ddg7@(k!g-tP+Cr&MyVuBq6?{WC;`^VEGbI3ZzIZ&3h}i{wJ}!(COJvR$Dk(zC zMHwyPpAdZE_>pt+Tkexz(kksy%WN?BEn#ZTdd><*tHIRcGOpkWFW>NDoX!mCw&E#T_340Sk*yFdvUgXOv8z+Og&kBhNM zY@Np#iJ&b$+4s;P#&?$e9)U5>l)@28Jiv;>xoCX;*Q0i_sSb!3h(%jYKmG+y|j zN;3`qBX#FuTJy()p2gQ3Xc1VM*{qJjNetNGN0i&H(V%qPD>^v&Vr!G$v8PYnVpf3N zXA@3|ZGL}8JU_wiAa{MWGyCHsmX<2^*m+sWs!^KE&Ta}iEl=QJ& z|I3X!^KwVt{rc4;YTgD95+2&hsEJ!N_K|wbN7ibxuNc6nURpG7)_}^?tq(0+0e2nI*XnrcMJFqP5 zBEc^7YpHPIZ32l274k6&^SSJFe z`as`*UkEXy{N3S2gQ`?C;g2^#CaK{cT;lgw3YuJaN}m|`!U(?*&_D7V0O?7Sk9z%l z7tOPuCCYx?oz>c^>s33FMx#{SuU;)-rlK+5LWH@!b>KbH=5Ghp|G;#d$XMD(|o??Vm3Jr3;iv;2{ zN@zk;OEK8&XL~S7!}guTWstth>HcB$GVNA?Xvm zmRc(|hL{_pC?xT!iquS_l6Ouw!_jbh)j;S9LZsrKA~`Fm{Q6TKw9WAVnnJiv9`h)9 zr7fzS`MqVT3x>YpjYEB^>a_F9pE`@bx11UA>B^a2FJn;ZVXKPVExF-dv_HOr+2zIy z7}(R*gf^!DHh9iT`)n6v^W1bdhKKVtahuXBR>{ku<)WwmY<3dI%)}^{S^b2YLN}y$ z9E~)A-bwV~04^svjoJz!nYX380!+W8;ejT&Q;2a)%; zeh$aza9K8@%AFSP=h6DF_2z16@kd@znPaC&)>S0kII*wQ>3>{?7JnTc25L?2Pumz5 zDvzKt+OxVIqnft9XhDqPXh2oWl{Kf!^KI2XCjFjRx~%I4q(sMs_`9)Ro<84=wSTY9 z>ozGKWDQfP6AH*={rt8#S-->X!x({_8XxN>eqyUB`3T8hJ5S>BFuJj&v#{5yKcOD_ zaWfA{@!yQ4I=F)C=oI^VTHZ3FzX>DbVqV}|P<>h|L9Hs5gyTlCvpZc&O=S+LLeE!Y{i0>Q2AX_^@?(w;mcPXb@EBSU8Q z8XIG^rMe#@Cb+tp5kcSJ98D?db>Fhhm^xLcRAK|geZFsQ= z=2^07jU^ZbPsHmMYMEGYn2Br1Uc!&E&jZ{kmm$`Bc2xPV&{tOf912?#{y4;~`Scp? z$63-HFDTRAysBYE3d4nbI#!Byjy{d<-W`vzhuE({7TKR?%1bBlQ9eAJy_>yp98K<& z<{w0qbg(Nw_*l7c_K=DMIk$HI>-IjF1Ie!$eC<0ubI-``AJGp0;6=mK)C?hNYX8@Y z;2MzJ@H9p3K`_g({d@u!J#iu(e9SOUxPl)3O^~iowSwL%P`v$uJX?}SKr}hZv%f!O zxav(}Bbo{w#c_?dy}w`blZ*GCm_Sq9b^l}Cqn87=&2hAn-k zJrKAm~*e<)vEbF z4`GI!pV+2eryVAY`sR|0k}EuODKj}A;&iH?8PQ>GEUE+=0JTi@%3pEr)K7#aHkzXw z_7(q-zmW}h%{r8fP3z-Aai~N`3F`0NO^IQ-ahsH;n;jdMRye zS|wen+t%?03}U<{(7WXVyXSqkkHSqDnA!-#mbx~wZ$aUJxo>8_i9jF%P4f5M8(ZHM zkGt;>Wh+0Zcl2L=V`bYC$90HAPS3T}0r&qq3cAZPa2QfQZKyv0K>qN50S}O!%Y;J` z2SD^Ri1!GX7#T$xHQvhr0A%VAbrsW))#KblpLK1jw@@?V11I7)U32=W8cz)5$$46w zISk(0w{!+t9H&fa8Lsl2gd9yJ+Y&@A>$F+{#|H=1s`7FjK7RaI$xjCVI<7E1FwMm^ zC_dI1jLnT3ySxm{E`wB6rK1l^yse>2W*c3hJG*%Q9n6>S=03#a3QuymLUnW?`=KaT z=#VVmQ_V*)DmZdD%djjTCjk&h$~o2`oa6sexRl5DM^E@npdz1;erVcN#Lg=pC7Ewl zP*el@bCb6aPGSd|y0@(;)sZQhqpyDh0TGD5vQt;bF$=W4Y{Z13s;VR{tE%QWwwCSN z(Tt1$4I|u@upJHc5x6O_jg3u754IGG5J*t<4KSkH?*2GAIoTwf*oD0RS1#ehqD3i) z$)y-9$hSw8;s1<5&a7LrIVmeeaA8wdnpcuGrbA3!O|hM6wi z5lKrf^7RDk8ykXMqLW-^W-!f_u)oVOYM-mpd$7EvJUgHlj8F~V;bIWH`4|NikWGPpn8QftTtsNf9kwyze=7{`36I8tFt;!2v_ z=bp4v(E+HScYgmq{Ut+`V2-wmG)Kd-Ir-d$$WDy8S?T3R=ELrfOvM4V<(S6Q+q0cf zf(9B6@o>|gGMFR@JWL0YM=pc+4_Ni91Leqsvr)w`#xI;>cz9StwYelu-F~xUqTy9t z`kz*QJeryYVVP4V=l3n%*tZ^Q=lGKXysoDki1zmO6#^3|idNO|pPvGoOwFU+clwci zoBlX&Ut6<2);_v_?SP93BYZX$Llf1ue>71zb?%8Tq8a<~ICL3aj(5SbBjNz-mcXdcxR0ET% zJKqG%0BhK`A%homm}dnHr%b-C)N?HdxlV!jAKP35*r2k6%# zMg*L^1yzE$WKafM6;6u;fY|lHd;{**4Y%7go7QS{h;j)>bz&Q-9VACAnai( zUa&RuLy=!>Gd@{LNQ3#3QUL5@dX%xpBn6UW!jUOpvf@wnnhX4{*~@ox;4$W)L%$4`-q`qzGP)al zQH|fH34#Xd0C3K%Uw9&i+1=mQWF-kutFF$Sl=WlqbOY7F9(xb|SL~k1lnNQ?GCz+6 zJh|tGp<3FWOUJF`l@z5~xm>Nw3 zeWxmB`q||DxyxDkQ4_PyDNrZImP>_`2fRga1X^Bt`ZMf5o>VLO>Bii=yu30_WFBYg zLJ(g*>RnDNquH1sbHKXaMl5#?8Oc%sqCkWI=(nseZFRWCOz@)vJweLv*y67;)=-OF z8md(r&KTYmQqNI!imMJ90itx z`n1M~U;(S;usH|9?E^3gSZ6At`EPqhU(^an5%ebgGp-`>MQfK2ipRa;)$_PHS2(k6B(`CLotmo?cu5qt2X#JRti@%+?T0?$NZuKdremZ^K$d^CqIhWH`%4u_7K6t z;}5*{1jDUg(CN4^7=lAlM}NzG@L{D#YWXzMx59m`bn?F%Ayf$>fyLjTvW$2mCx7~Tvi`2b%8(FAu&0rt?iDq?V-?^FYy|GiRe#-)E1anG#@l0=u+?U#`+lF))R5YPnbq$JK50=NXd2NC+783;c zgFp$xx~7VYb^i@An#!{1MdI>FR$m=;h}G|`-sP<{e1J#HdRk!|7%aUPNi1<>(jNZf zuw!9rY6=Pa9puVfOi&l)`i6$K-Iw#qR;xveAFp@2T?Q0;*YHH*djuoU>cJ(_UZO#f z_QBr=mk_Gh!TkePI?dao*WYK|5Ba(K9{vQ}d*+ludRyIl$A!2$Je+zjo$n2GT6*CC z@QnxaaS=()r#$Lq4E~XhMT^%;gX<(p#QOiexs^Gz(uSHAPbTBOm;i`|zB*dfA?kks DvSSw9 literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_lime.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_lime.png new file mode 100644 index 0000000000000000000000000000000000000000..1507d6d7956e15fe5190684a3a34df54e1db2444 GIT binary patch literal 7388 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 Lid3zHX~_QoDQo#C literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_magenta.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_magenta.png new file mode 100644 index 0000000000000000000000000000000000000000..809e645fb6a872106d5ffdd1a731c564bc79756a GIT binary patch literal 7352 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 Ls>)PKnfU!5Wd#{H literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_orange.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..ff17ff67c3f1903f27f80c44224f283c98803e23 GIT binary patch literal 7396 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 MtALdo6(O+y1O7G#1ONa4 literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_pink.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_pink.png new file mode 100644 index 0000000000000000000000000000000000000000..7009e6efc5d29ab14705578dab4f9cfbc481f759 GIT binary patch literal 7732 zcmb7{WltPVw8nRFDGL-Ywz#{yyKAu)hvII<7h0@9`9pCpy128ryF+oeMT=Xp%YAV_ zz|G{GNuEq{GLz?=%r8n)T>%T@0|o#9z*16_)qdMU-a--$2bdcWhtz zz-1opsoj`8#;W4;&yIgx-M~Y)pI!nE&Rn#Ev9DjYExS&57}ig!Vs-<*X2qZV3OBD3 zaPoX;nM?aTcvG|ca+!}aBk4*-iRuNbQ50sN(RxuG(#`vw? zF|GFcR)vQIG_}X?Tm@iF`AEI^5(WJTdX+m*?5G-&=&NnF?91qUqMq*ry0;|^;idO9*|b)UaP?aK+Mhhdvv8yB zET7c}{gbganv|j;v+3EVGKG5$)0bhI%$=Ip>98f!8jDZEEGgE$`%k~h6ct6!+WwGk z#t(`-Pp0(b>kgZ>oBwsx%z5}=F@ImtcscH|-!gLXEt=S>6BR5w_Q_Cn%xcq)YhiJl zhDqs1Uri#|dM_?k3B{tqu5L(|I~}xr*_Lr*Y{!N{XX+E<4L9rIfgrqI1j|s!dbeLBqSG;D$DasAwg`dJ7$;JmQNJA1w=L+tJ1B$q$O^ThljI|x- z=umGH76jBM~w=VMoF*S0tvI|sOhr!&rt@J2S!gkXlr@6L$Z zKdP8;$!$k7{1-pJa<#^v7K-R<%6=R}lKmyphIk!qvX}%=?w`cbx)v&7>7sKblVpLy zVYBxUYUgXaeR7U2B!B7$4yl!weD~42?aUW=nfA76{Mxl^|0|ut!1Vs` z(wt4$e+VM6tp~Z6K$S^bwxD*NP(l^m71q{Ci>n7&x$HT*a&*qoFJlIYU(8gBdTU_z z1>E2YZ$reVEPjv|Pp#fmr=@dS&j%f)-w6wca;`Ety=2F35bL_~171dl6I-Lqq*gh$ zx~6gY(!u#I)s;b-MCdIK13n@4J3FDpek?~pWOqR=5k9oxrWzD~Fk3OhY9&Ta4@R(>6+sMl=n>N+t;HF1bqLisgY9>S7{?qN%jfU?cgj(Ew(xB|dE~kN z-Eh(+8Wl~cvd3z6MgsX_3`E24Rt&EVT{jbIH~nfTa<#ATzR}2(pkKenX61T)ja54R z{o(wJnax}X%N8N?pfIVjWm5;^9W}z_{IsR6rSD&`qtklu%0{lB z&oW?I^@ie>pY+w2Jb$PG8>fxC=ErJsVrf_pJ8hLrXE^&GM}mTeIHcr-S`>S)%kTZP z9R5J21`FYrpX=WX!z=(tp;HJT)t=lCWMIi;o54zY=sYeM0-5_%Y#{{5@T2Y`zM@$w zmKv^Djq5U@w=XZnvEy`8!FgZb{Q1Tt{8HRGT;YXb#Tg9a-9G6R5q-rdf{-LB%jIe0I;+ z>?}4xP1hmm&)^U(@RD6f&^bo>*6MxQTHP3{+TZhPG?xJpJ55UthR{uiO zWzQ}_D(m<|{9ib24Y&jYEuYaqO=+*$FqKM=$`mufO5zYLphDfEoKVMyKBeXCKjFLX zOumzmqU0Lv@eJpp3Y=)MbsIYY2M=o;G=~`R@5XA8Y?&?jbw6XAjP&S#E&B*8wg6w3 zd9|xz4jsB!q@6tC)WW#=CVv|bA-)hC6LcplStHc|jE$xuJ(XWX=MZ)bmq)3BR8YDfdB0CLm~Q5>W8z%oSQm$WX@6Jn z_^$GY?}xO$Uy5v;Y00FahV5q69diiAh&{6-nbU)(=dsk}xm9`62PEACWxsiwTMiPw zmDD&yb{L{hYie$XlP(e_>2=cZ(G*Ha)MCPecDePWl1=yZ#86MQr0@ zMMlyQb&S;b14)Pu4hN>}CYNlpamc-yTX>JT0UHjDu)c-)c&ctB0meuH7%?HRe%f

    `hXTeEBkp~gOh=j|UVsMC=p68Fk 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 F@;?IJlnnp? literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_white.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_white.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ae669dd830fe5a581a46f6dc7d3f07494b9748 GIT binary patch literal 6866 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 x#<<0c0CfxOfJ(VdIP5a0Sb-{{j9sLxTVS literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_yellow.png b/mods/ENTITIES/mobs_mc/textures/mobs_mc_llama_decor_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..6318e163d74b28c3aa5247821c0ebffa5cdbf140 GIT binary patch literal 7571 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 LNkvXXu0mjfiR>Ik literal 0 HcmV?d00001 diff --git a/mods/ENTITIES/mobs_mc/vex.lua b/mods/ENTITIES/mobs_mc/vex.lua index a72827d5d..c23643cda 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 = "dogfight", + attack_type = "punch", physical = false, hp_min = 14, hp_max = 14, diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index db9cf3b19..154e9411f 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -962,14 +962,18 @@ mobs:register_mob("mobs_mc:villager", { }, }, visual_size = {x=2.75, y=2.75}, + rotate = 270, + skittish = true, makes_footstep_sound = true, walk_velocity = 1.2, - run_velocity = 2.4, + run_velocity = 3, drops = {}, can_despawn = false, -- TODO: sounds sounds = { random = "mobs_mc_villager", + damage = "mobs_mc_villager_hurt", + death = "mobs_mc_villager_hurt", distance = 10, }, animation = { diff --git a/mods/ENTITIES/mobs_mc/villager_evoker.lua b/mods/ENTITIES/mobs_mc/villager_evoker.lua index 04c95b88f..f87483e2b 100644 --- a/mods/ENTITIES/mobs_mc/villager_evoker.lua +++ b/mods/ENTITIES/mobs_mc/villager_evoker.lua @@ -35,7 +35,7 @@ mobs:register_mob("mobs_mc:evoker", { walk_velocity = 0.2, run_velocity = 1.4, group_attack = true, - attack_type = "dogfight", + attack_type = "punch", -- Summon vexes custom_attack = function(self, to_attack) local r = pr:next(2,4) diff --git a/mods/ENTITIES/mobs_mc/villager_illusioner.lua b/mods/ENTITIES/mobs_mc/villager_illusioner.lua index 496f08fc6..46b8760a1 100644 --- a/mods/ENTITIES/mobs_mc/villager_illusioner.lua +++ b/mods/ENTITIES/mobs_mc/villager_illusioner.lua @@ -10,7 +10,7 @@ mobs:register_mob("mobs_mc:illusioner", { description = S("Illusioner"), type = "monster", spawn_class = "hostile", - attack_type = "shoot", + attack_type = "projectile", shoot_interval = 2.5, shoot_offset = 1.5, arrow = "mcl_bows:arrow_entity", @@ -18,7 +18,7 @@ mobs:register_mob("mobs_mc:illusioner", { if mod_bows then -- 1-4 damage per arrow local dmg = math.random(1, 4) - mcl_bows.shoot_arrow("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object, nil, dmg) + mobs.shoot_projectile_handling("mcl_bows:arrow", pos, dir, self.object:get_yaw(), self.object, nil, dmg) end end, hp_min = 32, diff --git a/mods/ENTITIES/mobs_mc/villager_vindicator.lua b/mods/ENTITIES/mobs_mc/villager_vindicator.lua index 276f80011..7df54ef58 100644 --- a/mods/ENTITIES/mobs_mc/villager_vindicator.lua +++ b/mods/ENTITIES/mobs_mc/villager_vindicator.lua @@ -37,7 +37,7 @@ mobs:register_mob("mobs_mc:vindicator", { reach = 2, walk_velocity = 1.2, run_velocity = 2.4, - attack_type = "dogfight", + attack_type = "punch", drops = { {name = mobs_mc.items.emerald, chance = 1, diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mobs_mc/villager_zombie.lua index 1948b693d..450710c49 100644 --- a/mods/ENTITIES/mobs_mc/villager_zombie.lua +++ b/mods/ENTITIES/mobs_mc/villager_zombie.lua @@ -29,6 +29,9 @@ mobs:register_mob("mobs_mc:villager_zombie", { description = S("Zombie Villager"), type = "monster", spawn_class = "hostile", + hostile = true, + rotate = 270, + eye_height = 1.65, hp_min = 20, hp_max = 20, xp_min = 5, @@ -51,8 +54,8 @@ mobs:register_mob("mobs_mc:villager_zombie", { damage = 3, reach = 2, walk_velocity = 1.2, - run_velocity = 2.4, - attack_type = "dogfight", + run_velocity = 3.5, + attack_type = "punch", group_attack = true, drops = { {name = mobs_mc.items.rotten_flesh, diff --git a/mods/ENTITIES/mobs_mc/witch.lua b/mods/ENTITIES/mobs_mc/witch.lua index 8ebe71fc0..0c72d0018 100644 --- a/mods/ENTITIES/mobs_mc/witch.lua +++ b/mods/ENTITIES/mobs_mc/witch.lua @@ -34,7 +34,7 @@ mobs:register_mob("mobs_mc:witch", { run_velocity = 2.4, pathfinding = 1, group_attack = true, - attack_type = "dogshoot", + attack_type = "projectile", arrow = "mobs_mc:potion_arrow", shoot_interval = 2.5, shoot_offset = 1, diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 72459a354..7c9072f43 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -53,7 +53,7 @@ mobs:register_mob("mobs_mc:wither", { }, lava_damage = 0, fire_damage = 0, - attack_type = "dogshoot", + attack_type = "projectile", explosion_strength = 8, dogshoot_stop = true, arrow = "mobs_mc:wither_skull", diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua index 7f14ac6b0..89a4b4629 100644 --- a/mods/ENTITIES/mobs_mc/wolf.lua +++ b/mods/ENTITIES/mobs_mc/wolf.lua @@ -23,13 +23,31 @@ local wolf = { type = "animal", spawn_class = "passive", can_despawn = true, + neutral = true, hp_min = 8, hp_max = 8, xp_min = 1, xp_max = 3, + rotate = 270, passive = false, group_attack = true, - collisionbox = {-0.3, -0.01, -0.3, 0.3, 0.84, 0.3}, + + --head code + has_head = false, + head_bone = "head", + + swap_y_with_x = false, + reverse_head_yaw = false, + + head_bone_pos_y = 3.6, + head_bone_pos_z = -0.6, + + head_height_offset = 1.0525, + head_direction_offset = 0.5, + head_pitch_modifier = 0, + --end head code + + collisionbox = {-0.3, -0.00, -0.3, 0.3, 0.85, 0.3}, visual = "mesh", mesh = "mobs_mc_wolf.b3d", textures = { @@ -53,7 +71,7 @@ local wolf = { run_velocity = 3, damage = 4, reach = 2, - attack_type = "dogfight", + attack_type = "punch", fear_height = 4, follow = mobs_mc.follow.wolf, on_rightclick = function(self, clicker) @@ -75,6 +93,7 @@ local wolf = { dog:set_yaw(yaw) ent = dog:get_luaentity() ent.owner = clicker:get_player_name() + ent.tamed = true -- cornfirm taming minetest.sound_play("mobs_mc_wolf_bark", {object=dog, max_hear_distance=16}, true) -- Replace wolf @@ -142,17 +161,29 @@ dog.owner_loyal = true dog.follow_velocity = 3.2 -- Automatically teleport dog to owner dog.do_custom = mobs_mc.make_owner_teleport_function(12) -dog.follow = mobs_mc.follow.dog dog.attack_animals = nil dog.specific_attack = nil +dog.breed_distance = 1.5 +dog.baby_size = 0.5 +dog.follow_distance = 2 +dog.follow = "mcl_mobitems:beef" + dog.on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() - if mobs:protect(self, clicker) then + --owner is broken for this + --attempt to enter breed state + if mobs.enter_breed_state(self,clicker) then return - elseif item:get_name() ~= "" and mobs:capture_mob(self, clicker, 0, 2, 80, false, nil) then + end + + --make baby grow faster + if self.baby then + mobs.make_baby_grow_faster(self,clicker) return - elseif is_food(item:get_name()) then + end + + if is_food(item:get_name()) then -- Feed to increase health local hp = self.health local hp_add = 0 diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index 4ae5796b3..7d0fb1491 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -49,6 +49,8 @@ local zombie = { description = S("Zombie"), type = "monster", spawn_class = "hostile", + hostile = true, + rotate = 270, hp_min = 20, hp_max = 20, xp_min = 5, @@ -74,8 +76,25 @@ local zombie = { damage = "mobs_mc_zombie_hurt", distance = 16, }, - walk_velocity = .8, - run_velocity = 1.6, + + --head code + has_head = false, + head_bone = "Head", + + swap_y_with_x = true, + reverse_head_yaw = true, + + head_bone_pos_y = 2.4, + head_bone_pos_z = 0, + + head_height_offset = 1.1, + head_direction_offset = 0, + head_pitch_modifier = 0, + --end head code + + eye_height = 1.65, + walk_velocity = 1, + run_velocity = 3.5, damage = 3, reach = 2, fear_height = 4, @@ -93,7 +112,8 @@ local zombie = { ignited_by_sunlight = true, sunlight_damage = 2, view_range = 16, - attack_type = "dogfight", + attack_type = "punch", + punch_timer_cooloff = 0.5, harmed_by_heal = true, } diff --git a/mods/ENTITIES/mobs_mc/zombiepig.lua b/mods/ENTITIES/mobs_mc/zombiepig.lua index 1ea4197c1..72a19f413 100644 --- a/mods/ENTITIES/mobs_mc/zombiepig.lua +++ b/mods/ENTITIES/mobs_mc/zombiepig.lua @@ -15,13 +15,16 @@ local pigman = { -- type="animal", passive=false: This combination is needed for a neutral mob which becomes hostile, if attacked type = "animal", passive = false, + neutral = true, + rotate = 270, spawn_class = "passive", + hostile_cooldown = 15, --seconds hp_min = 20, hp_max = 20, xp_min = 6, xp_max = 6, armor = {undead = 90, fleshy = 90}, - attack_type = "dogfight", + attack_type = "punch", group_attack = { "mobs_mc:pigman", "mobs_mc:baby_pigman" }, damage = 9, reach = 2, @@ -41,6 +44,22 @@ local pigman = { damage = "mobs_mc_zombiepig_hurt", distance = 16, }, + + --head code + has_head = false, + head_bone = "head", + + swap_y_with_x = true, + reverse_head_yaw = true, + + head_bone_pos_y = 2.4, + head_bone_pos_z = 0, + + head_height_offset = 1.1, + head_direction_offset = 0, + head_pitch_modifier = 0, + --end head code + jump = true, makes_footstep_sound = true, walk_velocity = .8, From e0c94ccb8a75ef23ad154fe1b25715b908e0a397 Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Wed, 28 Apr 2021 21:58:28 -0400 Subject: [PATCH 123/136] Stop thorns enchant from crashing server when dealing damage to mobs --- 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 c5023deb5..3732de8e6 100644 --- a/mods/ITEMS/mcl_armor/damage.lua +++ b/mods/ITEMS/mcl_armor/damage.lua @@ -81,7 +81,7 @@ mcl_damage.register_modifier(function(obj, damage, reason) local thorns_damage = thorns_damage_regular + thorns_damage_irregular if thorns_damage > 0 and reason.type ~= "thorns" and reason.source ~= obj then - mcl_util.deal_damage(reason.source, {type = "thorns", direct = obj}) + mcl_util.deal_damage(reason.source, thorns_damage) local thorns_item = thorns_pieces[math.random(#thorns_pieces)] mcl_util.use_item_durability(thorns_item.itemstack, 2) From cf46f0d8b88870170a0a00367601f031499f193a Mon Sep 17 00:00:00 2001 From: jordan4ibanez Date: Thu, 29 Apr 2021 01:32:57 -0400 Subject: [PATCH 124/136] Fix crashing if null itemstack enchant when player is hacking --- mods/ITEMS/mcl_enchanting/engine.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index e5b61d328..89fdc393d 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -6,6 +6,9 @@ function mcl_enchanting.is_book(itemname) end function mcl_enchanting.get_enchantments(itemstack) + if not itemstack then + return({}) + end return minetest.deserialize(itemstack:get_meta():get_string("mcl_enchanting:enchantments")) or {} end From 6fac49550e3a126d48c0d87617698e89bbe2b945 Mon Sep 17 00:00:00 2001 From: Marcin Serwin Date: Thu, 29 Apr 2021 08:18:33 +0200 Subject: [PATCH 125/136] Fix kicking players from bed when it's destroyed --- 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 b1ce06b96..ecd749603 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -88,7 +88,7 @@ local function lay_down(player, pos, bed_pos, state, skip) end for _, other_pos in pairs(mcl_beds.bed_pos) do - if vector.distance(bed_pos, other_pos) < 0.1 then + if vector.distance(bed_pos2, other_pos) < 0.1 then return false, S("This bed is already occupied!") end end @@ -170,7 +170,7 @@ local function lay_down(player, pos, bed_pos, state, skip) mcl_beds.player[name] = 1 mcl_beds.pos[name] = pos - mcl_beds.bed_pos[name] = bed_pos + mcl_beds.bed_pos[name] = bed_pos2 player_in_bed = player_in_bed + 1 -- physics, eye_offset, etc player:set_eye_offset({x = 0, y = -13, z = 0}, {x = 0, y = 0, z = 0}) From 33c0aa23c5b6023a9a91fe88e8623c52a190ffea Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 29 Apr 2021 10:58:10 +0200 Subject: [PATCH 126/136] Re-add thorns damage type --- 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 3732de8e6..8ad566d18 100644 --- a/mods/ITEMS/mcl_armor/damage.lua +++ b/mods/ITEMS/mcl_armor/damage.lua @@ -81,7 +81,7 @@ mcl_damage.register_modifier(function(obj, damage, reason) local thorns_damage = thorns_damage_regular + thorns_damage_irregular if thorns_damage > 0 and reason.type ~= "thorns" and reason.source ~= obj then - mcl_util.deal_damage(reason.source, thorns_damage) + mcl_util.deal_damage(reason.source, thorns_damage, {type = "thorns", direct = obj}) local thorns_item = thorns_pieces[math.random(#thorns_pieces)] mcl_util.use_item_durability(thorns_item.itemstack, 2) From 199488cc74b8d6f31d901a20d39e52e309499607 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 29 Apr 2021 11:17:52 +0200 Subject: [PATCH 127/136] Add nil check for crash prevention --- mods/CORE/mcl_util/init.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index f619b5465..f976457c0 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -532,6 +532,10 @@ function mcl_util.get_object_name(object) else local luaentity = object:get_luaentity() + if not luaentity then + return "" + end + return luaentity.nametag and luaentity.nametag ~= "" and luaentity.nametag or luaentity.description or luaentity.name end end From ec08032b62d6377ef5d94dbba4fdcd923f09d298 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 29 Apr 2021 11:40:09 +0200 Subject: [PATCH 128/136] Add on_break callback --- mods/ITEMS/mcl_armor/api.lua | 2 ++ mods/ITEMS/mcl_armor/damage.lua | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua index 2e5ba1112..566ce5c49 100644 --- a/mods/ITEMS/mcl_armor/api.lua +++ b/mods/ITEMS/mcl_armor/api.lua @@ -92,6 +92,7 @@ function mcl_armor.register_set(def) local groups = def.groups or {} local on_equip_callbacks = def.on_equip_callbacks or {} local on_unequip_callbacks = def.on_unequip_callbacks or {} + local on_break_callbacks = def.on_break_callbacks or {} local textures = def.textures or {} local previews = def.previews or {} local durabilities = def.durabilities or {} @@ -125,6 +126,7 @@ function mcl_armor.register_set(def) on_secondary_use = mcl_armor.equip_on_use, _on_equip = on_equip_callbacks[name] or def.on_equip, _on_unequip = on_unequip_callbacks[name] or def.on_unequip, + _on_break = on_break_callbacks[name] or def.on_break, _mcl_armor_element = name, _mcl_armor_texture = textures[name] or modname .. "_" .. itemname .. ".png", _mcl_armor_preview = previews[name] or modname .. "_" .. itemname .. "_preview.png", diff --git a/mods/ITEMS/mcl_armor/damage.lua b/mods/ITEMS/mcl_armor/damage.lua index 8ad566d18..f17033495 100644 --- a/mods/ITEMS/mcl_armor/damage.lua +++ b/mods/ITEMS/mcl_armor/damage.lua @@ -1,3 +1,12 @@ +local function use_durability(obj, inv, index, stack, uses) + local def = stack:get_definition() + mcl_util.use_item_durability(stack, uses) + if stack:is_empty() and def and def._on_break then + stack = def._on_break(obj) or stack + end + inv:set_stack("armor", index, stack) +end + mcl_damage.register_modifier(function(obj, damage, reason) local flags = reason.flags @@ -28,8 +37,7 @@ mcl_damage.register_modifier(function(obj, damage, reason) points = points + minetest.get_item_group(itemname, "mcl_armor_points") toughness = toughness + minetest.get_item_group(itemname, "mcl_armor_toughness") - mcl_util.use_item_durability(itemstack, uses) - inv:set_stack("armor", element.index, itemstack) + use_durability(obj, inv, element.index, itemstack, uses) end if not flags.bypasses_magic then @@ -84,8 +92,8 @@ mcl_damage.register_modifier(function(obj, damage, reason) mcl_util.deal_damage(reason.source, thorns_damage, {type = "thorns", direct = obj}) local thorns_item = thorns_pieces[math.random(#thorns_pieces)] - mcl_util.use_item_durability(thorns_item.itemstack, 2) - inv:set_stack("armor", thorns_item.index, thorns_item.itemstack) + + use_durability(obj, inv, thorns_item.index, thorns_item.itemstack, 2) end mcl_armor.update(obj) From 87e41cc9a939e83c4c287cd6f231a8cc086819f2 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 29 Apr 2021 11:46:27 +0200 Subject: [PATCH 129/136] Add support for armor texture and preview being functions --- mods/ITEMS/mcl_armor/api.lua | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua index 566ce5c49..b632eeca7 100644 --- a/mods/ITEMS/mcl_armor/api.lua +++ b/mods/ITEMS/mcl_armor/api.lua @@ -205,12 +205,26 @@ function mcl_armor.update(obj) if not itemstack:is_empty() then local def = itemstack:get_definition() - if def._mcl_armor_texture then - info.texture = "(" .. def._mcl_armor_texture .. ")" .. (info.texture and "^" .. info.texture or "") + local texture = def._mcl_armor_texture + + if texture then + if type(texture) == "function" then + texture = texture(obj, itemstack) + end + if texture then + info.texture = "(" .. texture .. ")" .. (info.texture and "^" .. info.texture or "") + end end - if obj:is_player() and def._mcl_armor_preview then - info.preview = "(player.png^[opacity:0^" .. def._mcl_armor_preview .. ")" .. (info.preview and "^" .. info.preview or "" ) + local preview = def._mcl_armor_preview + + if obj:is_player() and preview then + if type(preview) == "function" then + preview = preview(obj, itemstack) + end + if preview then + info.preview = "(player.png^[opacity:0^" .. def._mcl_armor_preview .. ")" .. (info.preview and "^" .. info.preview or "" ) + end end info.points = info.points + minetest.get_item_group(itemname, "mcl_armor_points") From 6550e3e8e2200099ddc61a1ffccd44013bab8565 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 29 Apr 2021 11:51:06 +0200 Subject: [PATCH 130/136] Add per-element armor groups --- mods/ITEMS/mcl_armor/api.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua index b632eeca7..d58b5e666 100644 --- a/mods/ITEMS/mcl_armor/api.lua +++ b/mods/ITEMS/mcl_armor/api.lua @@ -96,6 +96,7 @@ function mcl_armor.register_set(def) local textures = def.textures or {} local previews = def.previews or {} local durabilities = def.durabilities or {} + local element_groups = def.element_groups or {} for name, element in pairs(mcl_armor.elements) do local itemname = element.name .. "_" .. def.name @@ -111,6 +112,10 @@ function mcl_armor.register_set(def) groups.mcl_armor_uses = (durabilities[name] or math.floor(def.durability * element.durability)) + 1 groups.enchantability = def.enchantability + for k, v in pairs(element_groups) do + groups[k] = v + end + minetest.register_tool(itemstring, { description = S(def.description .. " " .. (descriptions[name] or element.description)), _doc_items_longdesc = mcl_armor.longdesc, From fed1410b7f1de50d7fba259e2c2f957f889d7fa9 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 29 Apr 2021 12:28:34 +0200 Subject: [PATCH 131/136] Add set_on_fire to do_env_damage --- mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua | 4 ++++ 1 file changed, 4 insertions(+) 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.lua index d5b644f73..c7c4ad27c 100644 --- a/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua +++ b/mods/ENTITIES/mcl_mobs/api/mob_functions/backup_code_api.lua @@ -1646,6 +1646,8 @@ local do_env_damage = function(self) self.health = self.health - self.lava_damage + mcl_burning.set_on_fire(self.object, 15) + effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) if check_for_death(self, "lava", {type = "environment", @@ -1662,6 +1664,8 @@ local do_env_damage = function(self) self.health = self.health - self.fire_damage + mcl_burning.set_on_fire(self.object, 8) + effect(pos, 5, "fire_basic_flame.png", nil, nil, 1, nil) if check_for_death(self, "fire", {type = "environment", From 7be749a1229fce7322850c7fe046cc0fd9d13f25 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 29 Apr 2021 12:40:18 +0200 Subject: [PATCH 132/136] Update mcl_awards translations --- mods/HUD/awards/locale/awards.de.tr | 7 +++++-- mods/HUD/awards/locale/template.txt | 11 ++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/mods/HUD/awards/locale/awards.de.tr b/mods/HUD/awards/locale/awards.de.tr index 2fb04c4ca..489a19683 100644 --- a/mods/HUD/awards/locale/awards.de.tr +++ b/mods/HUD/awards/locale/awards.de.tr @@ -1,7 +1,7 @@ # textdomain:awards @1: @2=@1: @2 @1 (got)=@1 (erhalten) -@1’s awards:=Auszeichnungen von @1: +@1’s awards:=Auszeichnungen von @: (Secret Award)=(Geheime Auszeichnung) Achievement gotten!=Auszeichnung erhalten! Achievement gotten:=Auszeichnung erhalten: @@ -27,7 +27,6 @@ Awards=Auszeichnungen @1/@2 deaths=@1/@2 Tode @1/@2 dug=@1/@2 abgebaut @1/@2 game joins=@1/@2 Spielen beigetreten -@1/@2 lines of chat=@1/@2 Chatzeilen @1/@2 placed=@1/@2 platziert Die @1 times.=Sterben Sie @1 mal. Die.=Sterben Sie. @@ -58,3 +57,7 @@ Invalid action.=Ungültige Aktion. Player is not online.=Spieler ist nicht online. Done.=Fertig. Achievement “@1” does not exist.=Auszeichnung »@1« existiert nicht. +@1 has made the achievement @2=@1 hat die Auszeichnung @2 erhalten +Write something in chat.=Schreiben Sie etwas in den Chat. +Write @1 chat messages.=Schreiben Sie @1 Chatnachrichten. +@1/@2 chat messages=@1/@2 Chatnachrichten diff --git a/mods/HUD/awards/locale/template.txt b/mods/HUD/awards/locale/template.txt index a1505b349..ac6a1d752 100644 --- a/mods/HUD/awards/locale/template.txt +++ b/mods/HUD/awards/locale/template.txt @@ -6,12 +6,11 @@ @1/@2 game joins= @1/@2 placed= @1 (got)= -@1: @1= +@1: @2= @1’s awards:= (Secret Award)= = = -A Cat in a Pop-Tart?!= Achievement gotten!= Achievement gotten:= Achievement gotten: @1= @@ -28,9 +27,9 @@ Join the game.= List awards in chat (deprecated)= Place a block: @1= Place blocks: @1×@2= -Secret Achievement gotten!= -Secret Achievement gotten:= -Secret Achievement gotten: @1= +Secret achievement gotten!= +Secret achievement gotten:= +Secret achievement gotten: @1= Show details of an achievement= Show, clear, disable or enable your achievements= Get this achievement to find out what it is.= @@ -60,3 +59,5 @@ Player is not online.= Done.= Achievement “@1” does not exist.= @1 has made the achievement @2= +Mine a block: @1= +Mine blocks: @1×@2= From db78c1988041f3af0b0dc55a8e8b9691b8de09de Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 29 Apr 2021 12:42:08 +0200 Subject: [PATCH 133/136] Remove legacy mcl_potions translations --- mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr b/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr index 36f5280b9..34693d531 100644 --- a/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr +++ b/mods/ITEMS/mcl_potions/locale/mcl_potions.de.tr @@ -112,18 +112,3 @@ No effect=Keine Wirkung A throwable potion that will shatter on impact, where it gives all nearby players and mobs a status effect.=Ein werfbarer Trank, der bei Kollision zerbrechen wird, wo er allen nahen Spielern und Mobs einen Statuseffekt geben wird. This particular arrow is tipped and will give an effect when it hits a player or mob.=Diese Pfeilspitze dieses Pfeils in einem Trank getränkt und gibt einen Effekt, wenn er einen Spieler oder einen Mob trifft. - - - -##### not used anymore ##### - -Lingering Weakness Potion=Schwächeverweiltrank -Lingering Weakness Potion +=Schwächeverweiltrank + -Lingering Strength Potion=Stärkeverweiltrank -Lingering Strength Potion II=Stärkeverweiltrank II -Lingering Strength Potion +=Stärkeverweiltrank + -Weakness Splash Potion=Schwächewurftrank -Weakness Splash Potion +=Schwächewurftrank + -Strength Splash Potion=Stärkewurftrank -Strength Splash Potion II=Stärkewurftrank II -Strength Splash Potion +=Stärkewurftrank + From 404097dcc0959bfb29f7b1d0784e105e5b9cf6ee Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 29 Apr 2021 12:43:44 +0200 Subject: [PATCH 134/136] Update german mcl_core translations --- mods/ITEMS/mcl_core/locale/mcl_core.de.tr | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr index 8fbd79722..3d90dd5ae 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.de.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.de.tr @@ -274,3 +274,4 @@ Slows down movement=Verlangsamt die Fortbewegung 2×2 saplings @= large tree=2×2 Setzlinge @= großer Baum Grows on sand or dirt next to water=Wächst auf Sand oder Erde neben Wasser Stackable=Stapelbar +Needs soil and water to grow=Braucht Nährboden und Wasser zum wachsen From f8b9f16799835f408939b4d3bda6b283156a536d Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 29 Apr 2021 12:45:15 +0200 Subject: [PATCH 135/136] Update mcl_chests translation template --- mods/ITEMS/mcl_chests/locale/template.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_chests/locale/template.txt b/mods/ITEMS/mcl_chests/locale/template.txt index d680c24c9..1d947184b 100644 --- a/mods/ITEMS/mcl_chests/locale/template.txt +++ b/mods/ITEMS/mcl_chests/locale/template.txt @@ -24,7 +24,7 @@ Red Shulker Box= Grey Shulker Box= Black Shulker Box= A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.= -To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.= +To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out.= Shulker Box= Large Chest= Inventory= From ab4b6d214ea70896bca2fa6cf70408fc96c41b3c Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Thu, 29 Apr 2021 12:49:07 +0200 Subject: [PATCH 136/136] Update doc_items translations --- mods/HELP/doc/doc_items/locale/doc_items.de.tr | 9 ++++----- mods/HELP/doc/doc_items/locale/template.txt | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/mods/HELP/doc/doc_items/locale/doc_items.de.tr b/mods/HELP/doc/doc_items/locale/doc_items.de.tr index 90747c38a..f14c99314 100644 --- a/mods/HELP/doc/doc_items/locale/doc_items.de.tr +++ b/mods/HELP/doc/doc_items/locale/doc_items.de.tr @@ -10,9 +10,9 @@ # Itemname (ca. 25%) @1 (ca. @2%)=@1 (ca. @2%) # List separator (e.g. “one, two, three”) -, =, +, =, # Final list separator (e.g. “One, two and three”) - and = und + and = und 1 second=1 Sekunde A transparent block, basically empty space. It is usually left behind after digging something.=Ein transparenter Block, praktisch leerer Raum. Er wird üblicherweise hinterlassen, nachdem man etwas ausgegraben hat. Air=Luft @@ -32,7 +32,7 @@ Item reference of items which are neither blocks, tools or weapons (esp. craftin Liquids can flow into this block and destroy it.=Flüssigkeiten können in diesen Block hereinfließen und ihn zerstören. Maximum stack size: @1=Maximale Stapelgröße: @1 Mining level: @1=Grabestufe: @1 -Mining ratings:=Grabewertungen: +Mining ratings:=Grabewertungen: • @1, rating @2: @3 s - @4 s=• @1, Wertung @2: @3 s - @4 s • @1, rating @2: @3 s=• @1, Wertung @2: @3 s Mining times:=Grabezeiten: @@ -76,9 +76,8 @@ This block connects to these blocks: @1.=Dieser Block verbindet sich mit den fol This block connects to this block: @1.=Dieser Block verbindet sich mit diesem Block: @1. This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds.=Dieser Block reduziert Ihren Atem und verursacht beim Ertrinken einen Schaden von @1 Trefferpunkt alle 2 Sekunden. This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds.=Dieser Block reduziert Ihren Atem und verursacht beim Ertrinken einen Schaden von @1 Trefferpunkten alle 2 Sekunden. -This block glows faintly. It is barely noticable.=Dieser Block leuchtet schwach. Es ist kaum merklich. This block is a light source with a light level of @1.=Dieser Block ist eine Lichtquelle mit einer Helligkeitsstufe von @1. -This block glows faintly with a light level of @1.=Dieser Block leuchtet schwach mit einer Helligkeitsstufe von @1. +This block glows faintly with a light level of @1.=Dieser Block leuchtet schwach mit einer Helligkeitsstufe von @1. This block is a building block for creating various buildings.=Dieser Block ist für den Bau diverser Gebäude vorgesehen. This block is a liquid with these properties:=Dieser Block ist eine Flüssigkeit mit folgenden Eigenschaften: This block is affected by gravity and can fall.=Dieser Block wird von der Schwerkraft beeinflusst und kann fallen. diff --git a/mods/HELP/doc/doc_items/locale/template.txt b/mods/HELP/doc/doc_items/locale/template.txt index 484e40ec1..77f107863 100644 --- a/mods/HELP/doc/doc_items/locale/template.txt +++ b/mods/HELP/doc/doc_items/locale/template.txt @@ -2,7 +2,7 @@ Using it as fuel turns it into: @1.= @1 seconds= # Item count times item name -%@1×@2= +@1×@2= # Itemname (25%) @1 (@2%)= # Itemname (<0.5%)

    xAP zM=7r~cU~0e@4Y}PG#;i{FvyGLz`4pR%};-h!U&Crd3+<)vWvVJ14k~eG|p+wnC?R3 zVWx^4m8a(b?HkaA0~70|397&qN)I_rkSeuB1{`Now%%Ua>3DeeH5Z23zXD8CtVB7$ zCu&zdF&0K1<7YiTyEg+2CfKbO#n&hD9Z;BW<0j;Ep^Jxxaa7r-NLpB~MH2(@XQfSuq^aV+ekKjB$(}j;}mW+JnKLmWfHF+ECj(7x+oZK_e zt&C$PV2{}hVW!HpMP}6x1G9kX`Uokt>nc#{hB!Wg^Y~z#gYm8^*B<$-c?9^t;^m{P z)cI?zeyQ$_ah#}y;42nW^<_LfC&e^#h(JYhgMt^CJ3FCM z4nVN&delA#-=iLr8fwKauX?`3Udc>*&3SK1)|=cMjD(*O>V-ek!lE05SG`zT3>;&Gt)n+#AcNh`h0U{#p|3N*bIXZ!BL_ z*%)r5eiuE1uPoCgsC#{788>?3zflO022ln37&MQsEaP>2V!yCi@N3Sf$ zzp#sYFK}Ah{4yx!@r_~c?N7WMo&Vo`h1rHzlcM>PzwnJ&_rHCo8Ls~yz0!;dfc-H0 z8O5PX8lggG#pd;u=J*$Kk9-05-+upA-Wc|(Aoc}ZPa%2Z_kaJLX*v@DES9%L9eqvR z%l{w0GhHb!mNzT#pS?4!9h`P(+QEfRmem63=yW=s8Z)1T_MJs@PWXgCcJ>H(Jq=3q z&#jXEahiU_9i02Q*TJPtFZUs&X$GV`8FYn8d$`Dcq=v5xz+|ur-+!YQ9f<-eJFK&llQfGxVYo2R~zC<_uG@1qQ!3VBm`bu35Ot&a=<(uu7{~(j5d7PhNHc zY^H&CqTp!3XYCyOOvK`Z)h09fb7Cmbz()z*v`6A)ka?|BSJoLiby!{LYxX>6XV~Z^ z+=*8}-?t6tJ#P>1U8vQd)e_9-YSHQ<@1s6g3y{*}9#WdRn=Rkjz3|JNK6e3#g<}1S zd?zl@w2|}fx2PzNJ%w3M{hh}2a;c)o8vdFUEn5H|44l=Fi3n6Z6#5cbz()?CzHU@M zW>YCBpj5%HMFByxVnI0UcmA^`_Xqnq`zFMqCK+x8_bzTFr;R7TyN|#t3sZDp|Kz$a zQ)s%`*a#^W^>Lc?YG;}Vrw9{o%5pt0<5jS)f3!Cx%@P@yaxtF%YhyON_n&r>m5uM@ut2xQDN+@zoF{pnKdkGGiqo=w?Z zQ!sVd>vvu8?2IK3nKusGkJ}580k!bpX(athYbbt0$4;!m=7KGbzRq!mj-ooBNCK?~ z-Mgh&mFKjoILlfv?1js28`gMNFY5F(b+hlJJg27UYyWj->N=341mDv0A3#dPhLFxY(iR-jdZbS&D@&?+&yN5%o|_H~gZcIgDZ29lk<6buK1 z{x!;XK{O2=kS6~#dVuD)O@nwXp!P#q3rJ59BCVz1k4OxAj=Gxd-}rAe(`_fuUZbZF zWYA@hspRfYEQ4ej>jO9=chrr6G`O=}{yn@`l$+q>*lQ6@D+)ra;0P)P%vdITROC(j zKBOg8-L?<%Ee@twy+f1hFL;<%3n;~+;ndP>qJV{lE`DerR-&^nWkd66tkh+a2WTGy zs$ddZf~eJE)DE+{m18^PHT)#WK=VN>r-gkhJ`DgFqn+UUOYmkO2|f;oh5BIu9(`<3 zsCqc~8=6a}BQTrhgrGGPBzDOhGV6sbaF=Vfe19A5Rftn9cCsjGB?2FI@7VUb3UJV zK*}nGB7*21P@cql2M=Ucm!z43Pn@>N*a70d=;H<2NlanNi&XTh>!%JK!m#Xkf1*uZ z$2&M1Rl*QhVBpIu-A&{;2{`5~-4IY>$oBl|BKL~k#WQ|7VZhgC{jlMWLxZ;6b=9hZq$PJ2joUh+f9Uv5&-VKB z14Dk!UiQqk-&XCMI3#W8OQCho{Pe-nA>a6qaty$K>XCoTp!P?xDC!u1(+j&5ulgZz z$0c7qx&8Y;{e63n+*Ej|%6}*QT7AmY{im1o>z-Irn;W2G06Hh5(|71UlXr6<#q1db z;ew5}`D6h3;7({I9tyClx3kn*fm?pE_VagB@;~9UT+-Tq$oEuE;aO&=5K`XqqY!;= zG!9wdL@5>LzVf|NDy(dNKo}A^1m-P2TBLmHg@pOhmLDxrlC+OSD-!u49xI?lN>U*t z1myz(v`9(ngoL1cAb=JrNrR9Olnw;Q&>|&q#Zv?|58|-`TBIcERDzoQc&q>w(Ze%` zs7aU7vu|3U8@*AGrj)nTBc^dU7BXiik*FIjQH^0D5u|hsctTh^j2&4Kmms z+PWO~nbC2QS6Rf{L(tQrI7GeVRhDYiKz7iE>NrHBmzBdu81 z$T6xb?=O;KRW_82mtpd;D9pQmF&|YE!8XDMap7N!@nirkQyy+RrXgP8O{GYqWlBS8 zph3tleECq^X2q(}bQw8>yZ#9)6ZOaMIxd2@6=|5_y;tI(nD_;LT8|W^=9a18h^g?p zBf3V?Pzq}o%z!j%Gp`h@g24`WnH+(OMqnitM0vtZ<2>;TAGn6Blrm)!>BKaI4L>*? zX|zmfLYPdE665nxKjmsOZ3MHBU1B(k=C~+U+?U-U2hu{{t8cNV6fu^Z)kwNVA?{MDy+m^M!EOJ?lOu<|Konay=A_pUvoZKBn@flN|-vp{Gc=3 zlUs1gUh`k*WVFn@RBfM-s_b;|Y@)7+rWLg1i1J{eUeEfR#So6S9BGk~j1v-OMO%)v zNJ;92grNMnJ}pv`v_=+0P_yYKoODQ$k_07BQ1b*PDSviif~4eVk6$X2!%OX7v5MQb)&9VXR^XHRtSY6YPB{cCF{ZctUrzw z*>Q-7|L6)2!+}al)TDP85AMB zp*s%IAbFLgG8j>YcEllEZMjme?TJH-woVC!YLzc}PnLu*Bl2)YffPKWQ1+w%IFyNK z`-yZFI+(e)L6-p(`lqVLR0Uk;h7BLogJ-Jo`%ltkilOOo+=+&c$F7hTa>l*;KCRl6 z&uf0*r@IBG(p5X{d$_n`25os-Udl=p zXQqfPeXg-Uaac1?j$An`fTW>`H{nwfEOLj!r+T5NZU}y|m&}X&7GqwD@bT8XQ^hx( zP1RaBs%qolz?`FfgwGn~myhrv07Q5UI*4M(m_OQ52wykrbi~)q#1B5RCeazp8*v2c zvFa$SNGJLx;7IQiXUj6-a|o@y4{Zsl2Tc^PY1E#^cdfgsT$i>9DB#P2T|X z(C>g%JxI~%aS@cqrH61)jgCVuhjM|-u&|Q?T&7(PyKF*dQMcf65tPSe^sC%lRHx&S zOL9NpGNzum&<3LFI4*+nxQrDps#6c-lF=Wy>|W`l#B3k>jStxO6cVV%YLu{2#j=o9 z&VVRZMeE^XWOp_%f77!hfq87k2piSxL}XJqFp3TC9UAD?#_!tuWGy_wi~mj@b*A(LPjx9o)RI#K(!j&1k@K_Yd){8K;Sf%5h*#P^{0|q;@vrePZ{0c^_bH0n(0TL>IPxJp9|6UX zQ9aP>v_hvD5t(M_or+E`Xch*znAs&7Xx1%q+L%}V=A<3DhifF?`G+J8cIT1Z?MWj! z4pa3%@O+~V=N+=&Rj73QXKGjpc)?8W6i7|M{aYZ|m0gdN^4!Ax@g{chX@f-v7GOK9xRRfikOk zcO9iHGjxDuM!xrCx`$OJf9e9Q$BkpJq%{0ayC6f726sXT;Fm7`(gn}PhmR8c`K$#*puc+H-188p1Ums50$g_3kw04ic{Oz32XSoSv2RRT4LTqu58k^FeBo zMtX5C8aa{EhP|6xY)SK3cZ+X{w0s6hN_psl?EoErJ zEj)vxRQg)%@8D8a7w8h@_Nlf)@8kBI5BG7sSwH0;>?3-kTyxq!XGd=g1RS`!2KW;V z_}j&;X(;m^k%=kG40hn|w=uO@=G`h257I~%5h~KnVUZzJrFp}H$$by@0bD2uX5Pzhnv zR&f;9ps1jzQBc7(QKUgo+ZCgZH@J-88Wk7Z5)?^rZD-ICozbAqD5IlsTydM=sQm9+ zbum7ar1pU?j z*X2$J5;xN@VD}_gOs#NroBJ(<93q@WC!r|$-B9&%6ra(Sz&Lh zd%WJJG23`{v^K8 #Z+wd&998ka{cvPSu*KiHm`ivi!wtWk2E|E+A7rn$~% z_dV3KuWM9{Wxj8dHG13P*bRQaZt?DBp}G^^1ZV@!T%((dWX)gMv*30=Q`5eqU(r22 zQ1>hO!y>X@rQWzrzuCDrvmyJ{iV^J+y^V{&rMy$Xh_NZI{gT?z1N{|CW4rn5R^ory ztnGn6ogllxmp$V9?C{Gt<1f&ifLt??9jBQ{?PEuxYvvB@R!ENhsVd-d%IySFSu*p# z{5g=_a$l9?o*?f;_~$_Ir7k3g9W~!d{-r4H`D=T}dk2fZD7^UX7l4lHRJsA15<<&N zk;i>l{JW>jRI<^gDvr*J-WzorM*ZqO@gXrmYx=|wP1lv4*|f*|-PXM^^=0`c(5}b4 zU0(9;ZR;-k?u7Alv~A#swbv%+k3aduRZ?F2Ol~*^v?~Rmi3b8)xw89SNi*|>v zeyD#P>QJU%`Z`7HFM4&}*%PAgcAI$4Q+3#0@J*q$d%xT?@$)0seRk~23}W3u&yE;> z!cOn5Yx?zsCRA+tx&GF*FP-|p_~ECoT8ALk)n0XE^Y`o5HIJM!Vj_Z=_-#v~srciX z@_p`n>$%p$HVhxO>b>X7+D=-x?z*AUfi0)p^1^=EaWDS*!MYdr!5<7MzwhRWzx{Z? zq}lten>ceve=x*fe_2ywwElpL?k$iWAO1qT{JQrqEPr;)MdI+`G39IDxuAOdf{QO& z#|)i)T~Tvm`*WKwdw21A^l1F3+uvzwJnr)Y4tuy@9ek{N@|#o3V{0EOKYH>-P4LmQ z@$W0v#;;j5zQ@vw$`^FG_@eUr_P(gO`akzIFPyw+0-Q|9eN$*~(LYC)-#qZ!=g+F_ z+_Y}?)TRaTk@m6?8F$Xh`z=cLtaxSFFXhD#FY@>9A3re0{WSN5Ao)`vKK@k5u?f38z%tnPW<{#@@^EmQnqgX6DswfakK z6)8^)iLZ)1BY&Q8Sp3NXZNYxwASNb@KS>tH=+u90X#C#5_=gyy^XE@QDWmZh?;U@# zPxb(9JyWhcRT1LcJ4XAD7AHObhJE7ex>{o!l2r0%4M#{%F{Gjq@k0x|2l&@DW{rs7 zV_;%ryre))R}YPMDG)FI!6Omd zFB%B_Q7Ri^+#>AIJ zSMbqKxqoAk7G$XL7tbu55nGCs znAkjGUtHDGRdhPSx<|u0`OA!j*vuh3oXB?#+&4T}jYn2MU(QGdq!@kjlWrXZhxKRfFA|_oYm(NS+D|HGc*Hlk~v6?I+HmViY}8E-JY@8wCsNeJU*x%na_fifyW)@ zV7EUo2U%KiA|38G-WTr_z`ai>r;V#ZSQ3!=X&xXM8oq8@fLmUxiFkqrN_RF5g#5e63z$e64;SzEh*TaVWX`f=}xDWep!|Kymo6ukXIf@yNKm0j3|7lM; zpA*Gal_K_Qzd$+T^k;p8>i4j^dMDJz8NR>%3l!hWVvUVZ8)vWlq5{Nrw-nEbqH#iP zoSoI$+PL&A*S6$9+Fr%l+BTs-|0jfY9cyD05AaWWFMd??k59-gnxo57vby5Q-4;todg^x(d^wa$+3-2CD1mhuqvC)Ycil4uA~44nS`3 z*)6RtZj<;t}d9?0g&$#&4W|Y?s0#qmPAF z;rnoG264cHa^q{a(hQ6IS-tZIF_jxc+H)BmOJ3`ckAZ#hJ|ixBEMW|Y1RQ9ZW-txc$H zGkBd`GJ-mDWdvpBvQIia9%F3{jZkL~yQ+K4MeLZ_gNU_pO#v_Ea*5C_OfC^}wH;>W z$5{Wo;|h=UkGiU(xdrF>AQnL>@9E~?WI(JZj7(^QCe{;1nenu*f7dC6)BP`(;{T+} ziG@e1SUY-}a4J1{#Qy3z*d;=qQaMi(Sw4SEe6;_@*@egZvB9z8+KRz?C}>YV^UtB5 zEU}&}LVhwiKT`ugzf~6=AALHshZWGx${M=K5c@@!hr+>h%y~IB@G@*EygZ{`Bt3=n zvT*b90{)EZiLH@jD*a^J^>@m}`N#&W2%2PWj_Z~Op zt4;Znru=DB-T>~eZdX_wqbI-rjfE!^)bYEFoDpN9iGesyi|ntjEgVxI?dX;5Jef9f zk4C7ohRy44`uhdt;sZG$)G5oTbWSe8?@BRql2A812CFxKOIfUQj!>s8`=As43MrNg z7ooPzuBr2@S*#PDP}^pYbw9j@#k!ISwQWg+EH)|D#U{lv-)FM6%q@&&p}%HD;Zf0s z(B{>MaxshSHBh-;$#G3jI`7 zXqLSWEw8`0ME>v|FOhpVbBzYNeOwdTK8SVupuJ!FcU~j^3{y_Cjmo{Zm1qB=JoAnz zZ!zWXnez8d`QN~Gn$eR^9=T7^$s_kEa+kvf^dcx%8XX|H(8zU)?V7nIcR@P0y|>ObBmqQtKbuOvv040#5%Fr zS@ph-<+^DQYU7dvIcDwiAc{3MLcNK~NbR=^5AeHwTX>XzOHF&ZAjvi0LzFeF{+8E( zL8yR{uy?~L7U_l&8pKp?5NXf5Vf_ZFWjWQi@IJQZ9|NvwAZv%UnMLz4~54j^(c2_KcT*Ej?e7tVQ=)P(A%<*uax+bp6*3A zMPt2X{>z_5yVh3hrFUfirXM8l!+68v*A`wDEiT1Shn7K>1`HI>*Fug3>t@CZycfb| zwiUMA%>JX?`&D`NH|3cKVqkeYMo(?mg*FIcJ+-A+KKwHHc~Sky`=#E-51zkg zmwI^qo}or}8+ra7a+b*EdodewUf$)rY;X`LaNxnOsro5g>En?Ht<*`021C0HGANWSeoi`hqw z&b}K$c_h|6meSAaci`tw>PIe~JyGkwbo$X2b~-~V?Xu*<;)nlZJ<4BkdDKhW!pY`ce5)~*ck%e}9?AsQ_U@2vxwX$; z3a8xoO+EW{b>0%w-j-YY44;+5-uS_%8+O=RA}Z}8=JF$VJwYQ_AS zJ0%W_mC$7MPKlcfO!3U*+>USSulmiB`$ZiRy<>tl@0^&^sp>CUDBPdc6NS|H!#lu7 zO57C{CGa3X9+&IINgkK4-X$?4w!4XFfB!F?5=STALRj8kSv@bTsRh|Rg1EGN^{LUh z9X~crlWWt0=J!m@?f8k7dF1}ex@hm1AcS>GOq@wn8Hq}-i8iXi1({N|ws{vM>TN_+ zFE#TbIxMzV5RfS@M56wwji$)iXs-f=lBrfxD%@X>Ka>{}JI$2%TiGiyBPNf2%~f8W z{Ys{W1eu!M9hv$I2k=uilNT2Z4tl!MeV!cx5*W(;2&RMa3#A}J)(=F z^w5vx|Gs!1&6UOB%`;yu-p72kxTLFBb)wwSdHt&NyM{ONi?{MSyS{iB-~U{{TjGm? z%s;-4;Vj%Y@jk8~9|8Nd{i*(n7K;ZYzU+quaU+O7{0}M*f$EJ+U8R40Nn(`$%#wD` z>3(D*WFZz@BxC+BhW%eI_WxpVIj2x=dt&WR1fc)p4L{ECV+@~e_|b+RYxv2^`$Q^@ zf(?`*0*}4L^4|>XPur!#q}q!937edD{_w-_tLgApA5#UMBxv>SiP`Cjt&%#rSTO=F zOe!njI-{L$#`m3?@V^b9iY|hhKh63bsFsRAqdM4CVs8nw#;$UL)jWF8tU!nFJf;zC zBx001s=OoJcs8<4Y6f+oV}Pp7`P(jN_{-C!O*AbP)*<4d4u<+;BBu_GY^M{4ws$CP z-f?EAcQX^I!0&y|rA8~$@H!`jG`ucIA?zSC81^JcHgytApb6~Qu+5Fsg`L%YSlz#H|bu+ohj6)YYHd5NwwP+QDDm5LZA6 zs!U62Ol2yYHJHF1bs!E&IE8kY!nz$bvRyFnWjn$dhky8?()1)~80xSg&G@5sVJp?; z&1%|7kFDM78#*>`0PV8r=wNP%F1?{+1(mMhn!B#gH-sH^A-f7Vl)4OydN`!cZA9$U zpJvP2Q78R3ORu^4-bayzyq*{x=Z9@NQn3R&qszC`%up9B?uuNtL?`VxJ4*D2^BgwA z&NQOE8#%H|#qg0`nomFdh9E%dMnE@eoPZ{;q7#&o0iHU!|}Pw+6*d>&jq78G+beIc52Or?tiG8 z7a;xFj$r+3byl`Lv8gc*^U}r1b(-|}gCJY4ZTE}-J5#doK}Am2vBK(X(66Uq zIE!QQ`iAFe$o{dB9qG>IFy+}zUAMiiWApaGbZoW_=YpA9PF;G#hPW`q zM#4H9U{2Su+3IWt(UE3b*X|#$Z`e@&^R^~*cq;!>0sij6q9{7Gp*$XGZd!zFFhc5X zTi&DD>U7jqXDf$wG1SFgQ4!Yt!bYIeV6+Wur@>H{-cY^+!*y0?9U{PWZo|~s0CNsE ztaBSdM=Gp88w_>gZ-k_QNtE7IxDILPIBdXo^v>>r8aDOz?jd(mh7_XTcK_5)gmpp9 zz;4I4GL9YcNjuS^eXT6YkYTfJIA}I+GY`Txc00O-%?pNhXd`zaK)cYTtuoJHI6~OT zRmA9Yh#m>u|Jne}?W$=+{pIX(0p{!wU>e?y14N^#-cc49h0zQH9mHg>tmrS-I7+L`*atH|rI`ZGGr ze-ouK%!@Fj3ml@Nop3?_0$nI*>YBo{KO%v+n_1fKaJku^Gvv4jF6q#n3xUpBJr!v>R_XB-2oZt-F20JMtH5R*LD*A9iRoZZ`q? zgD#u^>4@m4H}O^EVhLIf>B9AG%z+)eSe@G8?j{{NTd5)M-FPnJ*~(Tmx@J9tX((Zx zYo~`q4cgjK=h)%wm*#0QzhTF)nFm5PY)1$V10A{~wXJSP2T>;&)|Jjl%`_aC%0`*z z(40<#0Ht!+A*zQCj6U6VGq!WKBl!;-%+rgo z(q@4@b`Fkmq|WJ>Z1%2W#SWfsg>>qXlQ1`_&CucLMM$ZJ=Glz&*!Cp<@roVy+)>#M z3HJ&&!0-uJ{pr3yJ4~O-3OgpK9D1@qQyn{dZnu?b=N_}ex}06^iH6N8=a!xQXqQhf z@}J#l<$PUkR&NL%ET~Qb4C$y8IH%(6F%fq(?AJbIGF7w4Fb&RG_kB}FHYJ>@X%0Jll5opZA_2BHTv8Iy;``31(CHB4(DS=xhc#KkUTRU}Tumfs%oQmXkbbwo#iUW}ZH) z)~txUM)GyqG?!g&chp?xbZI_aREOsJ9;Ai=nd`gBj9Owmn{%^Y$1`8Y+^~1KXLmMR zVIBR;{?Ch!ebQ`u9M;(Yd4aKZJJRJE2|v|TEr-rdYHP=#OWOy&R%y22yt%-J?N!m* zg>{-}ok#A?i<#7U!^A9@XaDI6Ny8$&3$`x=Y$G(ZTkDQ=wqe+D@0XVeHiKcE%@&8r zE>CS2zc@8t$?DODnjHdBhCFMOcRENNvZv1zu6N`*N6t8M zbx20Dkw{fYLAlbAQ;uBb$fb_l-H|;uHby z#~|g%WsY3x$lV>;bL6%HCj$lj(|J2xi(`;=6fKUNb>v1zu6N`*N6t8MwIipi97UxgryRM=kxL!9yCZv! z+}1uX1L;U>z9Q1%$XQ2jbmV$Ru5;v!BUk6iSbkM`3hacAoO0wcM=o{b?vCs^a$CDl z2DtyXh82)o969UAjgDOJ$aRjKapdZd%=RNyAqC}1M@~6%nIo4va(74e9JwtTWI)=F zwB{6SKhomJSx0Vk)jLh9YMP@W*)e=JS?|4a`*cD z@-j!xIZlp|Lwm^EsB`3cM{acF ztRuHLa;qb^shqq1d+VJZJ94QbmpO9Ekt-d!%8{!@4v(>8Q0K_?j@;tRDZgu1~ zNA_OL53qZljOACFr@&twb>x&IS2}W)BUd|e#*yp7GWY-bumWd0-5?7ik> zAdt2FNNJ#u_9JDEoO0w!N3L?@YDdmEa-Ee;`;mI9(DoyZj+}Mm7DsM%GtRuHLa;qb^IkLCG$$%r5Le9JXmpKM0N3L|_ zDo3t%fLz+~&yM8%_osIbG@~${ac6$d!&<<;c~JoN?s3d>PmOd_|fLz+~&yMpPdZk$yk1+c?w+p969C4m5yBH$kmRVapbzN%>BPUtl-tpk+Y86 z;>c}|?A<#s@2bZa`#MK%b>z&4`Sw+F@INcjbX4C>;@7GL3icn5WE{Dwlm3ru z+v93S&NyJib>tRDZdEyV{cm#&ya`SQ9J$ny%N#l7$d!&cn~FT%8|RjpI@GGB#9SM^Wv_8Aq;jom0BYRz(3^;PBBbRmgI{*5gattaRxyq5N9XaF3b&g!`$cucj z_KNfUb$8@aM=nb{ij*T)I&zgGS37dXk?S0}-jUOdjw0*Gt&ZI0$X-{c$Bta;$YuF* zI+Ds)L@FJ*&XMaKIqS$Rj@;_VZFw@5pSP>i14k}(!NGxy+GMj$BFEpLJrQOF;|2`sc4X5x*2k zP|b;nUImQ;$Ii0KvDaC&mBkq;1~hdU5QeDY0lre)S^uRS`(m}j4hqcv`LK~^k)$gsBY+5P)$(0_2fh!ejUYM&K^kN z@+&Nw9#ohf=+-c0VmJL%AbzFI-$b3D(Traj5^H8A7LqVGuT&b1^t;>{D9rMQTZ|Rg2BvVq5Oi4j94H^aZ z;KC9#mh)6~?1P}`xzYfkvMF7|S*JA^mweOAuL+dPgDPtRG@X@YLT{x`P!Cpa(OJ$I z1j(uqB&)_6hO1;mIX3XPiPKYbo4COUS`#2yHlmvz*vYa{yTFSq8-D*umyICFSBpaC zM$npt7Hyqv(eyJd+EiuHR<1*-vGp{IYEHLkYkd~kaF)Be4l^}^qOBt2w7?mPsLy*KLNaE8{#wSSPQ^fcLNqmANK0y+n zBF4wB;Anh`7@r`CPmsi?rHoH?j875c6D08olK8Zg@d=Xn6fr(Q5}zQ6Pmsi?i1G3J zFdCmC#wSSP6D09zDdSTe<5R@=1W9~?Bt9)=e1arCMT}37#3xAN6D08|Vto9%jK-&k z@d=Xn1W9~~7?mPMB}ifsBOpCE}(OBtW)7@s1>CrIKGB=Kn};}azDDPnwrBtAhBpCE}( z5#!@GEi^twj8BlnCrIMcQpTq`#;1t!36l5(Nqkz$_ykFOiWr|DiBFKkCrIK`#Q6BV z2#rq>;}azD36l7)8J{4DPZ8r2B=HH7_ykFOiWnciNucp5Vtj%mK0y+n zmNGuoF+N3%PmshXNaE8{#wSSPQ^fcLNqmANK0y+nBF4w}{2HGk#wSSP6D09zDdSTe z<5R@=1W9~?Bt9)=e1arCMT}37#3xAN6D08|VtjlHukk5je1arCK@y*qGCtKYK1GaA zki;iQ;?q*bCrIK`#P|eBe1arCK@y)L#>aQ&8lNJ@CrIKGB=Kn}<5L~uQyuTes|Cto zL6Dqe74aTDXDILV^&D)K)+6sxMYo&>3BIfMw^Aoajw$lO-e1EzbiSE4$4h}yhp*>- zL45J9#qv(x-ztX&(aNELFW!AQQwWk`dHJrE^4{H_z61^NjXRaSV|!WUz)3>B3cR(OL>Q`F8Q)s>&T09AGhqiW1^J1b3t;)E@(OZ2$CCrz9;tOFd#?{ z2!iCszf7RqrwfvMcSTphjUc(l7gWRhbVWR|37XDe)Q%?!d9lr78lDY^c6qqmS}x72 zBk!)YPItaV_T@Y%NY03YmUD&(+R7*d)zG)<7_Fclxzej}dZ)Whj7Hu+`&*?3UJR>J zUOM|)g-SWh@jbG?mCXr4ZG)tgZ-rU8cT7+XyCO)u*ixK51&SNII5w{NhFAwfketH! zR@le6r%!u=O$?tehW+V0qVW~5znrHYMOOgvEw8_vc7o*Kr8?H&J6?Yc?F99pj_-MW zIfC&GFYDsS$CtbQ8oF6RBo6uhR+|$frF@6$kL9G|%U53<3K}cpEpR#WVU-qfitzob zFQtM|#ptB6ypHu{jQL(vAF~MB%D4p8u!`z9#;VJevJugVLwUXGOBKFYH4ixWPF112 zPW89465o^hYXY>KPfg_IsTT9CrPh%*rfQi}%4<@8`jv1b%9;ReqD#@qbCg^ac@e5E zJ-!hn>>U%diJ2@FSi?@{lqrESi>%TV%fz!fJj4>%gNaeZaTkPv#j;e$iIh{yi%Wf2 zADKLLLatR2M z9afO^O5XkXn}XsRUJ#^MHgbOAdHqlvaUrpHqc3gs$*P& zY*~;DvmnWJN+B~WXe?KOpy>e; z!;C05aZt31T=@mc^Yv`PBdUS6WB*QF7hFQ=i&h3=It!!GA z?2I5uW6m%mum}4uNCsMv478x-oOOb>1~H7~kc)0C+w=Ga$1G!o92r59JwdWa1Z}0gWRSKpGD zn>K$`g7(e3!QRLd;DvuKVps5PbQu{CxdaV#HFyDVvB3+0t3lQV)dVY7%uic)5p3I2 z0iS6CsSAPpa^q+zxOK_~t~B}>Y&;Mv$MK0i3NFAW|E>k~h4}1X@U5t4?OFF09^aN)i3#jaCa4&F{QBNJ65z`6Fh?$i;Ok)Fp>q7Vs1~Y4S8$1knPY~@O1`11KwzGGx!SzbKLDb;GE!GU;{Ux+|C2eiR+9#0~kz` z$bfWY1C+O!f+0}tr3H}{(6Nk;-U5Ha;4C4!LM z^A5+K1^eQ23?cA)Fdl922f(8Y{yT7saYP&ZJrn#45WbJW0_}K=>u?-z; z@KkVXKO6Woqn`=hUAC(Mk;%YQjQ&FKi}e>_l|+t$z&}>Q#wze>je4TuEUKZu0H6KD zQAwl}e1g%R1D&$$=ZG*Maws@^K}Xg2 ztPxxyJvm+QfXD*y%Zz>xIOJd6q5Y}&oNO960{9Sv`ImRB4LfoQi1tU~b0BTFN&JSC z+qC}`Nj^a69Lwvwe;mjW{kB86(b8i+6#J8IXX0?F5Vfk23b0uofQ(-M&W8<;fvoT@QS& z!Cdle8&neEOlG=iv>Whw#%M3_T@5}O{49fqfir!y9|CMAX-8l?CpeLrN!m=nCo@KT zFtT!pnY{g?SP=b

  • 75!%R;YNFRwNgk` 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%0AuQmLD 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 literal 453135 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�IO0jbSm!vY+(~ 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
  • < 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