From 487909e8ebe912487abb5053d223aeafbda969bc Mon Sep 17 00:00:00 2001 From: Brandon Date: Fri, 26 Jun 2020 20:32:03 -0400 Subject: [PATCH] Generate lingering functions. --- mods/ITEMS/mcl_potions/lingering.lua | 159 +++++++++++++++++---------- mods/ITEMS/mcl_potions/splash.lua | 8 +- 2 files changed, 104 insertions(+), 63 deletions(-) diff --git a/mods/ITEMS/mcl_potions/lingering.lua b/mods/ITEMS/mcl_potions/lingering.lua index cd99e85b1..ba8f43da6 100644 --- a/mods/ITEMS/mcl_potions/lingering.lua +++ b/mods/ITEMS/mcl_potions/lingering.lua @@ -5,6 +5,74 @@ local lingering_image = function(colorstring, opacity) return "mcl_potions_splash_overlay.png^[colorize:"..colorstring..":"..tostring(opacity).."^mcl_potions_splash_bottle.png" end + +local lingering_effect_at = {} + +local function add_lingering_effect(pos, color, def) + + lingering_effect_at[pos] = {color = color, timer = 30, def = def} + + local timer = 0 + + minetest.register_globalstep(function(dtime) + + timer = timer + dtime + + if timer >= 0.5 then + + for pos, vals in pairs(lingering_effect_at) do + + if lingering_effect_at[pos] then + + lingering_effect_at[pos].timer = lingering_effect_at[pos].timer - timer + + if lingering_effect_at[pos].timer > 0 then + + local d = 3 * (lingering_effect_at[pos].timer / 30.0) + + minetest.add_particlespawner({ + amount = 5 * math.ceil(d)^2, + time = 1, + minpos = {x=pos.x-d, y=pos.y+0.5, z=pos.z-d}, + maxpos = {x=pos.x+d, y=pos.y+1, z=pos.z+d}, + minvel = {x=-0.5, y=0, z=-0.5}, + maxvel = {x=0.5, y=0.5, z=0.5}, + minacc = {x=-0.2, y=0, z=-0.2}, + maxacc = {x=0.2, y=.05, z=0.2}, + minexptime = 1, + maxexptime = 2, + minsize = 2, + maxsize = 4, + collisiondetection = true, + vertical = false, + texture = "mcl_potions_sprite.png^[colorize:"..lingering_effect_at[pos].color..":127", + }) + + for i, obj in ipairs(minetest.get_objects_inside_radius(pos, math.ceil(d+1))) do + + obj = obj or obj:get_luaentity() + + if minetest.is_player(obj) or obj._cmi_is_mob then + + lingering_effect_at[pos].def.potion_fun(obj) + lingering_effect_at[pos].timer = lingering_effect_at[pos].timer / 2 + + end + end + + else + lingering_effect_at[pos] = nil + end + end + end + timer = 0 + end + end) + +end + + + local function register_lingering(name, descr, color, def) local id = "mcl_potions:"..name.."_lingering" @@ -12,7 +80,6 @@ local function register_lingering(name, descr, color, def) description = descr, inventory_image = lingering_image(color), on_use = function(item, placer, pointed_thing) - --weapons_shot(itemstack, placer, pointed_thing, def.velocity, name) local velocity = 10 local dir = placer:get_look_dir(); local pos = placer:getpos(); @@ -24,7 +91,7 @@ local function register_lingering(name, descr, color, def) end return item end, - stack_max = 1, + stack_max = 1, }) local w = 0.7 @@ -39,147 +106,119 @@ local function register_lingering(name, descr, color, def) local node = minetest.get_node(pos) local n = node.name local d = 2 - local redux_map = {7/8,0.5,0.25} - if n ~= "air" or mcl_potions.is_obj_hit(self, pos) then + if n ~= "air" or mcl_potions.is_obj_hit(self, pos) then minetest.sound_play("mcl_potions_breaking_glass", {pos = pos, max_hear_distance = 16, gain = 1}) - minetest.add_particlespawner({ - amount = 1000, - time = 30, - minpos = {x=pos.x-d, y=pos.y+0.5, z=pos.z-d}, - maxpos = {x=pos.x+d, y=pos.y+d, z=pos.z+d}, - minvel = {x=-0.5, y=0, z=-0.5}, - maxvel = {x=0.5, y=0.5, z=0.5}, - minacc = {x=-0.2, y=0, z=-0.2}, - maxacc = {x=0.2, y=.05, z=0.2}, - minexptime = 1, - maxexptime = 2, - minsize = 2, - maxsize = 4, - collisiondetection = true, - vertical = false, - texture = "mcl_potions_sprite.png^[colorize:"..color..":127", - }) - self.object:remove() - for i, obj in ipairs(minetest.get_objects_inside_radius(pos, 4)) do - - if minetest.is_player(obj) or obj:get_entity_name() then - - pos2 = obj:get_pos() - local rad = math.floor(math.sqrt((pos2.x-pos.x)^2 + (pos2.y-pos.y)^2 + (pos2.z-pos.z)^2)) - if rad > 0 then def.potion_fun(obj, redux_map[rad]) else def.potion_fun(obj, 1) end - - end - end - + add_lingering_effect(pos, color, def) + self.object:remove() end end, }) end register_lingering("water", "Lingering Potion", "#0000FF", { - potion_fun = function(player, redx) end, + potion_fun = function(player) end, }) register_lingering("river_water", "Lingering Potion", "#0000FF", { - potion_fun = function(player, redx) end, + potion_fun = function(player) end, }) register_lingering("awkward", "Lingering Awkward Potion", "#0000FF", { - potion_fun = function(player, redx) end, + potion_fun = function(player) end, }) register_lingering("mundane", "Lingering Mundane Potion", "#0000FF", { - potion_fun = function(player, redx) end, + potion_fun = function(player) end, }) register_lingering("thick", "Lingering Thick Potion", "#0000FF", { - potion_fun = function(player, redx) end, + potion_fun = function(player) end, }) register_lingering("healing", "Lingering Healing", "#AA0000", { - potion_fun = function(player, redx) player:set_hp(player:get_hp() + 3*redx) end, + potion_fun = function(player) player:set_hp(player:get_hp() + 3*0.5) end, }) register_lingering("healing_2", "Lingering Healing II", "#DD0000", { - potion_fun = function(player, redx) player:set_hp(player:get_hp() + 6*redx) end, + potion_fun = function(player, redx) player:set_hp(player:get_hp() + 6*0.5) end, }) register_lingering("harming", "Lingering Harming", "#660099", { - potion_fun = function(player, redx) mcl_potions.healing_func(player, -4*redx) end, + potion_fun = function(player, redx) mcl_potions.healing_func(player, -4*0.5) end, }) register_lingering("harming_2", "Lingering Harming II", "#330066", { - potion_fun = function(player, redx) mcl_potions.healing_func(player, -6*redx) end, + potion_fun = function(player, redx) mcl_potions.healing_func(player, -6*0.5) end, }) register_lingering("leaping", "Lingering Leaping", "#00CC33", { - potion_fun = function(player, redx) mcl_potions.leaping_func(player, 1.2, 135*redx) end + potion_fun = function(player, redx) mcl_potions.leaping_func(player, 1.2, 135*0.25) end }) register_lingering("leaping_2", "Lingering Leaping II", "#00EE33", { - potion_fun = function(player, redx) mcl_potions.leaping_func(player, 1.4, 135*redx) end + potion_fun = function(player, redx) mcl_potions.leaping_func(player, 1.4, 135*0.25) end }) register_lingering("leaping_plus", "Lingering Leaping +", "#00DD33", { - potion_fun = function(player, redx) mcl_potions.leaping_func(player, 1.2, 360*redx) end + potion_fun = function(player, redx) mcl_potions.leaping_func(player, 1.2, 360*0.25) end }) register_lingering("swiftness", "Lingering Swiftness", "#009999", { - potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 1.2, 135*redx) end + potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 1.2, 135*0.25) end }) register_lingering("swiftness_2", "Lingering Swiftness II", "#00BBBB", { - potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 1.4, 135*redx) end + potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 1.4, 135*0.25) end }) register_lingering("swiftness_plus", "Lingering Swiftness +", "#00BBBB", { - potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 1.2, 360*redx) end + potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 1.2, 360*0.25) end }) register_lingering("slowness", "Lingering Slowness ", "#000080", { - potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 0.85, 68*redx) end + potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 0.85, 68*0.25) end }) register_lingering("slowness_plus", "Lingering Slowness +", "#000066", { - potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 0.85, 180*redx) end + potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 0.85, 180*0.25) end }) register_lingering("poison", "Lingering Poison", "#335544", { - potion_fun = function(player, redx) mcl_potions.poison_func(player, 2.5, 45*redx) end + potion_fun = function(player, redx) mcl_potions.poison_func(player, 2.5, 45*0.25) end }) register_lingering("poison_2", "Lingering Poison II", "#446655", { - potion_fun = function(player, redx) mcl_potions.poison_func(player, 1.2, 21*redx) end + potion_fun = function(player, redx) mcl_potions.poison_func(player, 1.2, 21*0.25) end }) register_lingering("poison_plus", "Lingering Poison +", "#557766", { - potion_fun = function(player, redx) mcl_potions.poison_func(player, 2.5, 90*redx) end + potion_fun = function(player, redx) mcl_potions.poison_func(player, 2.5, 90*0.25) end }) register_lingering("regeneration", "Lingering Regeneration", "#A52BB2", { - potion_fun = function(player, redx) mcl_potions.regeneration_func(player, 2.5, 45*redx) end + potion_fun = function(player, redx) mcl_potions.regeneration_func(player, 2.5, 45*0.25) end }) register_lingering("regeneration_2", "Lingering Regeneration II", "#B52CC2", { - potion_fun = function(player, redx) mcl_potions.regeneration_func(player, 1.2, 21*redx) end + potion_fun = function(player, redx) mcl_potions.regeneration_func(player, 1.2, 21*0.25) end }) register_lingering("regeneration_plus", "Lingering Regeneration +", "#C53DD3", { - potion_fun = function(player, redx) mcl_potions.regeneration_func(player, 2.5, 90*redx) end + potion_fun = function(player, redx) mcl_potions.regeneration_func(player, 2.5, 90*0.25) end }) register_lingering("invisibility", "Lingering Invisibility", "#B0B0B0", { - potion_fun = function(player, redx) mcl_potions.invisiblility_func(player, 135*redx) end + potion_fun = function(player, redx) mcl_potions.invisiblility_func(player, 135*0.25) end }) register_lingering("invisibility_plus", "Lingering Invisibility +", "#A0A0A0", { - potion_fun = function(player, redx) mcl_potions.invisiblility_func(player, 300*redx) end + potion_fun = function(player, redx) mcl_potions.invisiblility_func(player, 300*0.25) end }) register_lingering("weakness", "Lingering Weakness", "#6600AA", { - potion_fun = function(player, redx) mcl_potions.weakness_func(player, 1.2, 68*redx) end + potion_fun = function(player, redx) mcl_potions.weakness_func(player, 1.2, 68*0.25) end }) register_lingering("weakness_plus", "Lingering Weakness +", "#7700BB", { - potion_fun = function(player, redx) mcl_potions.weakness_func(player, 1.4, 180*redx) end + potion_fun = function(player, redx) mcl_potions.weakness_func(player, 1.4, 180*0.25) end }) diff --git a/mods/ITEMS/mcl_potions/splash.lua b/mods/ITEMS/mcl_potions/splash.lua index 4745881b9..eb4826372 100644 --- a/mods/ITEMS/mcl_potions/splash.lua +++ b/mods/ITEMS/mcl_potions/splash.lua @@ -40,7 +40,7 @@ local function register_splash(name, descr, color, def) local n = node.name local d = 2 local redux_map = {7/8,0.5,0.25} - if n ~= "air" or mcl_potions.is_obj_hit(self, pos) then + if n ~= "air" or mcl_potions.is_obj_hit(self, pos) then minetest.sound_play("mcl_potions_breaking_glass", {pos = pos, max_hear_distance = 16, gain = 1}) minetest.add_particlespawner({ amount = 50, @@ -59,10 +59,12 @@ local function register_splash(name, descr, color, def) vertical = false, texture = "mcl_potions_sprite.png^[colorize:"..color..":127", }) - self.object:remove() + self.object:remove() for i, obj in ipairs(minetest.get_objects_inside_radius(pos, 4)) do - if minetest.is_player(obj) or obj:get_entity_name() then + obj = obj or obj:get_luaentity() + + if minetest.is_player(obj) or obj._cmi_is_mob then local pos2 = obj:get_pos() local rad = math.floor(math.sqrt((pos2.x-pos.x)^2 + (pos2.y-pos.y)^2 + (pos2.z-pos.z)^2))