From 198eb630e1b12f75d9524f586fa1a5cc723106c7 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Tue, 4 Apr 2023 21:57:28 +0200 Subject: [PATCH 1/6] replace globalstep with abm --- mods/ITEMS/mcl_beacons/init.lua | 54 ++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_beacons/init.lua b/mods/ITEMS/mcl_beacons/init.lua index 4614d5ce1..f0a3a15ef 100644 --- a/mods/ITEMS/mcl_beacons/init.lua +++ b/mods/ITEMS/mcl_beacons/init.lua @@ -178,6 +178,24 @@ local function beacon_blockcheck(pos) end end +local function is_obstructed(pos) --also removes beacon beam if true + + for y=pos.y+1, pos.y+100 do + + local nodename = minetest.get_node({x=pos.x,y=y, z = pos.z}).name + if nodename ~= "mcl_core:bedrock" and nodename ~= "air" and nodename ~= "mcl_core:void" and nodename ~= "ignore" then --ignore means not loaded, let's just assume that's air + if nodename ~="mcl_beacons:beacon_beam" then + if minetest.get_item_group(nodename,"glass") == 0 and minetest.get_item_group(nodename,"material_glass") == 0 then + remove_beacon_beam(pos) + return true + end + end + end + end + + return false +end + local function effect_player(effect,pos,power_level, effect_level,player) local distance = vector.distance(player:get_pos(), pos) if distance > (power_level+1)*10 then return end @@ -192,6 +210,7 @@ local function effect_player(effect,pos,power_level, effect_level,player) end end +--[[ local function globalstep_function(pos,player) local meta = minetest.get_meta(pos) local power_level = beacon_blockcheck(pos) @@ -219,6 +238,25 @@ local function globalstep_function(pos,player) effect_player(effect_string,pos,power_level,meta:get_int("effect_level"),player) end end +--]] + +local function abm_func(pos) + local meta = minetest.get_meta(pos) + local power_level = beacon_blockcheck(pos) + local effect_string = meta:get_string("effect") + + if meta:get_int("effect_level") == 2 and power_level < 4 then --no need to run loops when beacon is in an invalid setup :Pi + return + end + + for _, obj in ipairs(minetest.get_objects_inside_radius(pos, (power_level+1)*10)) do + if obj:is_player() then + if not is_obstructed(pos) then + effect_player(effect_string,pos,power_level,meta:get_int("effect_level"),obj) + end + end + end +end minetest.register_node("mcl_beacons:beacon", { description = S"Beacon", @@ -330,7 +368,8 @@ minetest.register_node("mcl_beacons:beacon", { minetest.set_node({x=pos.x,y=y,z=pos.z},{name="mcl_beacons:beacon_beam",param2=beam_palette_index}) end end - globalstep_function(pos,sender)--call it once outside the globalstep so the player gets the effect right after selecting it + abm_func(pos) --call it once outside the globalstep so the player gets the effect right after selecting it + --globalstep_function(pos,sender)--call it once outside the globalstep so the player gets the effect right after selecting it end end end, @@ -354,6 +393,7 @@ end local timer = 0 +--[[ minetest.register_globalstep(function(dtime) timer = timer + dtime if timer >= 3 then @@ -367,6 +407,7 @@ minetest.register_globalstep(function(dtime) timer = 0 end end) +--]] minetest.register_abm{ @@ -392,6 +433,17 @@ minetest.register_abm{ end, } + +minetest.register_abm{ + label="apply beacon effects to players", + nodenames = {"mcl_beacons:beacon"}, + interval = 3, + chance = 1, + action = function(pos) + abm_func(pos) -- for some FUC**** reason I can't just say abm_func directly, so this is a dirty workaround + end, +} + minetest.register_craft({ output = "mcl_beacons:beacon", recipe = { From 181cb73e45a3e8ddb404656cb58749ebf7330edb Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Tue, 4 Apr 2023 21:58:33 +0200 Subject: [PATCH 2/6] remove commented out code --- mods/ITEMS/mcl_beacons/init.lua | 49 +-------------------------------- 1 file changed, 1 insertion(+), 48 deletions(-) diff --git a/mods/ITEMS/mcl_beacons/init.lua b/mods/ITEMS/mcl_beacons/init.lua index f0a3a15ef..12c483d4b 100644 --- a/mods/ITEMS/mcl_beacons/init.lua +++ b/mods/ITEMS/mcl_beacons/init.lua @@ -210,36 +210,6 @@ local function effect_player(effect,pos,power_level, effect_level,player) end end ---[[ -local function globalstep_function(pos,player) - local meta = minetest.get_meta(pos) - local power_level = beacon_blockcheck(pos) - local effect_string = meta:get_string("effect") - if meta:get_int("effect_level") == 2 and power_level < 4 then - return - else - local obstructed = false - for y=pos.y+1, pos.y+100 do - - local nodename = minetest.get_node({x=pos.x,y=y, z = pos.z}).name - if nodename ~= "mcl_core:bedrock" and nodename ~= "air" and nodename ~= "mcl_core:void" and nodename ~= "ignore" then --ignore means not loaded, let's just assume that's air - if nodename ~="mcl_beacons:beacon_beam" then - if minetest.get_item_group(nodename,"glass") == 0 and minetest.get_item_group(nodename,"material_glass") == 0 then - obstructed = true - remove_beacon_beam(pos) - return - end - end - end - end - if obstructed then - return - end - effect_player(effect_string,pos,power_level,meta:get_int("effect_level"),player) - end -end ---]] - local function abm_func(pos) local meta = minetest.get_meta(pos) local power_level = beacon_blockcheck(pos) @@ -368,9 +338,7 @@ minetest.register_node("mcl_beacons:beacon", { minetest.set_node({x=pos.x,y=y,z=pos.z},{name="mcl_beacons:beacon_beam",param2=beam_palette_index}) end end - abm_func(pos) --call it once outside the globalstep so the player gets the effect right after selecting it - --globalstep_function(pos,sender)--call it once outside the globalstep so the player gets the effect right after selecting it - end + abm_func(pos) --call it once outside the globalstep so the player gets the effect right after selecting it end end end, light_source = 14, @@ -393,21 +361,6 @@ end local timer = 0 ---[[ -minetest.register_globalstep(function(dtime) - timer = timer + dtime - if timer >= 3 then - for _, player in ipairs(minetest.get_connected_players()) do - local player_pos = player:get_pos() - local pos_list = minetest.find_nodes_in_area({x=player_pos.x-50, y=player_pos.y-50, z=player_pos.z-50}, {x=player_pos.x+50, y=player_pos.y+50, z=player_pos.z+50},"mcl_beacons:beacon") - for _, pos in ipairs(pos_list) do - globalstep_function(pos,player) - end - end - timer = 0 - end -end) ---]] minetest.register_abm{ From 80cde37e6517591715c466c8c5f5eb82ff531ded Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Tue, 4 Apr 2023 21:59:50 +0200 Subject: [PATCH 3/6] remove empty lines and unneeded code --- mods/ITEMS/mcl_beacons/init.lua | 7 ------- 1 file changed, 7 deletions(-) diff --git a/mods/ITEMS/mcl_beacons/init.lua b/mods/ITEMS/mcl_beacons/init.lua index 12c483d4b..ee9c5a67b 100644 --- a/mods/ITEMS/mcl_beacons/init.lua +++ b/mods/ITEMS/mcl_beacons/init.lua @@ -179,9 +179,7 @@ local function beacon_blockcheck(pos) end local function is_obstructed(pos) --also removes beacon beam if true - for y=pos.y+1, pos.y+100 do - local nodename = minetest.get_node({x=pos.x,y=y, z = pos.z}).name if nodename ~= "mcl_core:bedrock" and nodename ~= "air" and nodename ~= "mcl_core:void" and nodename ~= "ignore" then --ignore means not loaded, let's just assume that's air if nodename ~="mcl_beacons:beacon_beam" then @@ -359,10 +357,6 @@ function register_beaconfuel(itemstring) table.insert(beacon_fuellist, itemstring) end -local timer = 0 - - - minetest.register_abm{ label="update beacon beam", nodenames = {"mcl_beacons:beacon_beam"}, @@ -386,7 +380,6 @@ minetest.register_abm{ end, } - minetest.register_abm{ label="apply beacon effects to players", nodenames = {"mcl_beacons:beacon"}, From 1a1473e8c0adfdf7697b7e9e944328958b3e2f56 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Tue, 4 Apr 2023 22:03:29 +0200 Subject: [PATCH 4/6] insert missing end --- mods/ITEMS/mcl_beacons/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ITEMS/mcl_beacons/init.lua b/mods/ITEMS/mcl_beacons/init.lua index ee9c5a67b..0a13c87be 100644 --- a/mods/ITEMS/mcl_beacons/init.lua +++ b/mods/ITEMS/mcl_beacons/init.lua @@ -337,6 +337,7 @@ minetest.register_node("mcl_beacons:beacon", { end end abm_func(pos) --call it once outside the globalstep so the player gets the effect right after selecting it end + end end end, light_source = 14, From a8c989edd85dabc8878a594e4fafe61705aef604 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 19 Apr 2023 16:27:35 +0200 Subject: [PATCH 5/6] don't get all objects in radius --- mods/ITEMS/mcl_beacons/init.lua | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_beacons/init.lua b/mods/ITEMS/mcl_beacons/init.lua index 0a13c87be..e738aeec2 100644 --- a/mods/ITEMS/mcl_beacons/init.lua +++ b/mods/ITEMS/mcl_beacons/init.lua @@ -213,16 +213,15 @@ local function abm_func(pos) local power_level = beacon_blockcheck(pos) local effect_string = meta:get_string("effect") - if meta:get_int("effect_level") == 2 and power_level < 4 then --no need to run loops when beacon is in an invalid setup :Pi + if meta:get_int("effect_level") == 2 and power_level < 4 then --no need to run loops when beacon is in an invalid setup :P return end - for _, obj in ipairs(minetest.get_objects_inside_radius(pos, (power_level+1)*10)) do - if obj:is_player() then - if not is_obstructed(pos) then - effect_player(effect_string,pos,power_level,meta:get_int("effect_level"),obj) - end - end + for _, obj in pairs(minetest.get_connected_players()) do + if vector.distance(pos,obj:get_pos()) > (power_level+1)*10 then return end --I used Pythagoras at first, and ignored this method lol + if not is_obstructed(pos) then + effect_player(effect_string,pos,power_level,meta:get_int("effect_level"),obj) + end end end From b15482012edc6187b2d8a46cc53655bc294e30f7 Mon Sep 17 00:00:00 2001 From: ancientmarinerdev Date: Thu, 27 Apr 2023 19:04:36 +0100 Subject: [PATCH 6/6] Implement review feedback. --- mods/ITEMS/mcl_beacons/init.lua | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/mods/ITEMS/mcl_beacons/init.lua b/mods/ITEMS/mcl_beacons/init.lua index e738aeec2..30a80bc32 100644 --- a/mods/ITEMS/mcl_beacons/init.lua +++ b/mods/ITEMS/mcl_beacons/init.lua @@ -178,7 +178,7 @@ local function beacon_blockcheck(pos) end end -local function is_obstructed(pos) --also removes beacon beam if true +local function clear_obstructed_beam(pos) for y=pos.y+1, pos.y+100 do local nodename = minetest.get_node({x=pos.x,y=y, z = pos.z}).name if nodename ~= "mcl_core:bedrock" and nodename ~= "air" and nodename ~= "mcl_core:void" and nodename ~= "ignore" then --ignore means not loaded, let's just assume that's air @@ -208,20 +208,25 @@ local function effect_player(effect,pos,power_level, effect_level,player) end end -local function abm_func(pos) - local meta = minetest.get_meta(pos) - local power_level = beacon_blockcheck(pos) +local function apply_effects_to_all_players(pos) + local meta = minetest.get_meta(pos) local effect_string = meta:get_string("effect") + local effect_level = meta:get_int("effect_level") - if meta:get_int("effect_level") == 2 and power_level < 4 then --no need to run loops when beacon is in an invalid setup :P + local power_level = beacon_blockcheck(pos) + + if effect_level == 2 and power_level < 4 then --no need to run loops when beacon is in an invalid setup :P return end - for _, obj in pairs(minetest.get_connected_players()) do - if vector.distance(pos,obj:get_pos()) > (power_level+1)*10 then return end --I used Pythagoras at first, and ignored this method lol - if not is_obstructed(pos) then - effect_player(effect_string,pos,power_level,meta:get_int("effect_level"),obj) - end + local beacon_distance = (power_level + 1) * 10 + + for _, player in pairs(minetest.get_connected_players()) do + if vector.distance(pos, player:get_pos()) <= beacon_distance then + if not clear_obstructed_beam(pos) then + effect_player(effect_string, pos, power_level, effect_level, player) + end + end end end @@ -335,7 +340,7 @@ minetest.register_node("mcl_beacons:beacon", { minetest.set_node({x=pos.x,y=y,z=pos.z},{name="mcl_beacons:beacon_beam",param2=beam_palette_index}) end end - abm_func(pos) --call it once outside the globalstep so the player gets the effect right after selecting it end + apply_effects_to_all_players(pos) --call it once outside the globalstep so the player gets the effect right after selecting it end end end, @@ -386,7 +391,7 @@ minetest.register_abm{ interval = 3, chance = 1, action = function(pos) - abm_func(pos) -- for some FUC**** reason I can't just say abm_func directly, so this is a dirty workaround + apply_effects_to_all_players(pos) end, }