From cbd2731e0609354da4e7cee687cc7ccbfbde7893 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Fri, 9 Apr 2021 13:22:45 +0200 Subject: [PATCH 1/4] Improve mcl_bossbars performance --- mods/HUD/mcl_bossbars/init.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mods/HUD/mcl_bossbars/init.lua b/mods/HUD/mcl_bossbars/init.lua index 3a144aac4..3ab1a83c7 100644 --- a/mods/HUD/mcl_bossbars/init.lua +++ b/mods/HUD/mcl_bossbars/init.lua @@ -86,9 +86,10 @@ function mcl_bossbars.update_boss(luaentity, name, color) if not bardef.text or bardef.text == "" then bardef.text = name end - for _, obj in pairs(minetest.get_objects_inside_radius(object:get_pos(), 128)) do - if obj:is_player() then - mcl_bossbars.add_bar(obj, bardef) + local pos = object:get_pos() + for _, player in pairs(minetest.get_connected_players()) do + if vector.distance(pos, player:get_pos()) <= 80 then + mcl_bossbars.add_bar(player, bardef) end end end From c6ffccfef5f9401176014692f07840d283fdce3c Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Fri, 9 Apr 2021 13:35:58 +0200 Subject: [PATCH 2/4] Add priority to bossbars; display bossbars of closest bosses first --- mods/HUD/mcl_bossbars/init.lua | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/mods/HUD/mcl_bossbars/init.lua b/mods/HUD/mcl_bossbars/init.lua index 3ab1a83c7..a95d533ce 100644 --- a/mods/HUD/mcl_bossbars/init.lua +++ b/mods/HUD/mcl_bossbars/init.lua @@ -36,12 +36,12 @@ end local last_id = 0 -function mcl_bossbars.add_bar(player, def) +function mcl_bossbars.add_bar(player, def, dynamic, priority) local name = player:get_player_name() local bars = mcl_bossbars.bars[name] - local bar = {text = def.text} + local bar = {text = def.text, priority = priority or 0} bar.color, bar.image = get_color_info(def.color, def.percentage) - if def.dynamic then + if dynamic then for _, other in pairs(bars) do if not other.id and other.color == bar.color and (other.original_text or other.text) == bar.text and other.image == bar.image then if not other.count then @@ -55,7 +55,7 @@ function mcl_bossbars.add_bar(player, def) end end table.insert(bars, bar) - if not def.dynamic then + if not dynamic then bar.raw_color = def.color bar.id = last_id + 1 last_id = bar.id @@ -69,10 +69,11 @@ function mcl_bossbars.remove_bar(id) mcl_bossbars.static[id] = nil end -function mcl_bossbars.update_bar(id, def) +function mcl_bossbars.update_bar(id, def, priority) local old = mcl_bossbars.static[id] old.color = get_color_info(def.color or old.raw_color, def.percentage or old.percentage) old.text = def.text or old.text + old.priority = priority or old.priority end function mcl_bossbars.update_boss(luaentity, name, color) @@ -81,15 +82,15 @@ function mcl_bossbars.update_boss(luaentity, name, color) text = luaentity.nametag, percentage = math.floor(luaentity.health / luaentity.hp_max * 100), color = color, - dynamic = true, } if not bardef.text or bardef.text == "" then bardef.text = name end local pos = object:get_pos() for _, player in pairs(minetest.get_connected_players()) do - if vector.distance(pos, player:get_pos()) <= 80 then - mcl_bossbars.add_bar(player, bardef) + local d = vector.distance(pos, player:get_pos()) + if d <= 80 then + mcl_bossbars.add_bar(player, bardef, true, d) end end end @@ -116,6 +117,7 @@ minetest.register_globalstep(function() local name = player:get_player_name() local bars = mcl_bossbars.bars[name] local huds = mcl_bossbars.huds[name] + table.sort(bars, function(a, b) return a.priority < b.priority end) local huds_new = {} local bars_new = {} local i = 0 From ea41c82834d1664ba29d41adddf532c4d5121250 Mon Sep 17 00:00:00 2001 From: kay27 Date: Sat, 10 Apr 2021 21:15:04 +0400 Subject: [PATCH 3/4] [mcl_mobs, mobs_mc] TEMP! Remove `goto` to run on RasbPI4, Oil_boi free to revert --- mods/ENTITIES/mcl_mobs/spawning.lua | 197 ++++++++++++---------------- mods/ENTITIES/mobs_mc/enderman.lua | 37 +++--- 2 files changed, 104 insertions(+), 130 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/spawning.lua b/mods/ENTITIES/mcl_mobs/spawning.lua index 206dfdd41..a0572f50b 100644 --- a/mods/ENTITIES/mcl_mobs/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/spawning.lua @@ -1,14 +1,15 @@ --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 math_random = math.random -local get_biome_name = minetest.get_biome_name -local max = math.max +local get_biome_data = minetest.get_biome_data +local new_vector = vector.new +local math_random = math.random +local get_biome_name = minetest.get_biome_name +local max = math.max local get_objects_inside_radius = minetest.get_objects_inside_radius -local vector_distance = vector.distance +local vector_distance = vector.distance -- range for mob count local aoc_range = 32 @@ -536,113 +537,87 @@ end --todo mob limiting --MAIN LOOP if mobs_spawn then - local timer = 0 - minetest.register_globalstep(function(dtime) - timer = timer + dtime - if timer >= 8 then - timer = 0 - for _,player in ipairs(minetest.get_connected_players()) do - for i = 1,math.random(3,8) do + local timer = 0 + minetest.register_globalstep(function(dtime) + timer = timer + dtime + if timer >= 8 then + timer = 0 + for _,player in pairs(minetest.get_connected_players()) do + for i = 1,math_random(3,8) do - local player_pos = player:get_pos() + local player_pos = player:get_pos() - local _,dimension = mcl_worlds.y_to_layer(player_pos.y) + local _,dimension = mcl_worlds.y_to_layer(player_pos.y) - if dimension == "void" or dimension == "default" then - goto continue -- ignore void and unloaded area - end - - local min,max = decypher_limits(player_pos.y) + if dimension ~= "void" and dimension ~= "default" then - local goal_pos = position_calculation(player_pos) - - 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 min,max = decypher_limits(player_pos.y) - --couldn't find node - if #spawning_position_list <= 0 then - goto continue + local goal_pos = position_calculation(player_pos) + + 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"}) + + if #spawning_position_list > 0 then --couldn't find node + local spawning_position = spawning_position_list[math_random(1,#spawning_position_list)] + + --Prevent strange behavior/too close to player + if spawning_position and vector_distance(player_pos, spawning_position) > 15 then + + local gotten_node = get_node(spawning_position).name + + if gotten_node and gotten_node ~= "air" then --skip air nodes + + local gotten_biome = get_biome_data(spawning_position) + + if gotten_biome then --skip if in unloaded area + + 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 mob_def --skip if something ridiculous happens (nil mob def) + and mob_def.dimension == dimension --skip if not correct dimension + and biome_check(mob_def.biomes, gotten_biome) then --skip if not in correct biome + + --add this so mobs don't spawn inside nodes + spawning_position.y = spawning_position.y + 1 + + if spawning_position.y >= mob_def.min_height and spawning_position.y <= mob_def.max_height then + + --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 and gotten_light <= mob_def.max_light then + + 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" or not (is_water or is_lava) then + + --finally do the heavy check (for now) of mobs in area + if count_mobs(spawning_position, mob_def.spawn_class) < mob_def.aoc then + + --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) + end + end + end + end + end + end + end + end + end 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 - goto continue - end - - local gotten_node = get_node(spawning_position).name - - if not gotten_node or gotten_node == "air" then --skip air nodes - goto continue - end - - local gotten_biome = minetest.get_biome_data(spawning_position) - - if not gotten_biome then - goto continue --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 - goto continue --skip if something ridiculous happens (nil mob def) - end - - --skip if not correct dimension - if mob_def.dimension ~= dimension then - goto continue - end - - --skip if not in correct biome - if not biome_check(mob_def.biomes, gotten_biome) then - goto continue - 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 - goto continue - 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 - goto continue - 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 - goto continue - end - - if mob_def.type_of_spawning == "ground" and is_lava then - goto continue - 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 - goto continue - 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) - - ::continue:: --this is a safety catch - end - end - end - end) + end + end + end + end) end diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua index ba04f8b59..5c00bc6e2 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mobs_mc/enderman.lua @@ -346,29 +346,28 @@ mobs:register_mob("mobs_mc:enderman", { --skip player if they have no data - log it if not player_eye_height then minetest.log("error", "Enderman at location: ".. dump(enderpos).." has indexed a null player!") - goto continue - end + else - --calculate very quickly the exact location the player is looking - --within the distance between the two "heads" (player and enderman) - local look_pos = vector.new(player_pos.x, player_pos.y + player_eye_height, player_pos.z) - local look_pos_base = look_pos - 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)) + --calculate very quickly the exact location the player is looking + --within the distance between the two "heads" (player and enderman) + local look_pos = vector.new(player_pos.x, player_pos.y + player_eye_height, player_pos.z) + local look_pos_base = look_pos + 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" - self.attack = minetest.get_player_by_name(obj:get_player_name()) - break - 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 + --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()) + break + 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 - ::continue:: -- this is a sweep over statement, this can be used to continue even when errors occurred end end end From 9ba1917209ae5510cd968b8772ce70232077e9fc Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 10 Apr 2021 20:58:34 +0200 Subject: [PATCH 4/4] Add end crystal beams --- mods/ENTITIES/mobs_mc/ender_dragon.lua | 16 ++++++ mods/ITEMS/mcl_end/end_crystal.lua | 48 ++++++++++++++++++ .../mcl_end/textures/mcl_end_crystal_beam.png | Bin 0 -> 2065 bytes 3 files changed, 64 insertions(+) create mode 100644 mods/ITEMS/mcl_end/textures/mcl_end_crystal_beam.png diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index 92806d878..db29b63ae 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -61,6 +61,22 @@ mobs:register_mob("mobs_mc:enderdragon", { ignores_nametag = true, do_custom = function(self) mcl_bossbars.update_boss(self, "Ender Dragon", "light_purple") + for _, obj in ipairs(minetest.get_objects_inside_radius(self.object:get_pos(), 80)) do + local luaentity = obj:get_luaentity() + if luaentity and luaentity.name == "mcl_end:crystal" then + if luaentity.beam then + if luaentity.beam == self.beam then + break + end + else + if self.beam then + self.beam:remove() + end + minetest.add_entity(self.object:get_pos(), "mcl_end:crystal_beam"):get_luaentity():init(self.object, obj) + break + end + end + end if self._portal_pos then -- migrate old format if type(self._portal_pos) == "string" then diff --git a/mods/ITEMS/mcl_end/end_crystal.lua b/mods/ITEMS/mcl_end/end_crystal.lua index 772776a1c..720d8ed8d 100644 --- a/mods/ITEMS/mcl_end/end_crystal.lua +++ b/mods/ITEMS/mcl_end/end_crystal.lua @@ -79,6 +79,54 @@ minetest.register_entity("mcl_end:crystal", { _hittable_by_projectile = true }) +minetest.register_entity("mcl_end:crystal_beam", { + initial_properties = { + physical = false, + visual = "cube", + visual_size = {x = 1, y = 1, z = 1}, + textures = { + "mcl_end_crystal_beam.png^[transformR90", + "mcl_end_crystal_beam.png^[transformR90", + "mcl_end_crystal_beam.png", + "mcl_end_crystal_beam.png", + "blank.png", + "blank.png", + }, + static_save = false, + }, + spin = 0, + init = function(self, dragon, crystal) + self.dragon, self.crystal = dragon, crystal + crystal:get_luaentity().beam = self.object + dragon:get_luaentity().beam = self.object + end, + on_deactivate = function(self) + if self.crystal and self.crystal:get_luaentity() then + self.crystal:get_luaentity().beam = nil + end + if self.dragon and self.dragon:get_luaentity() then + self.dragon:get_luaentity().beam = nil + end + end, + on_step = function(self, dtime) + if self.dragon and self.dragon:get_luaentity() and self.crystal and self.crystal:get_luaentity() then + self.spin = self.spin + dtime * math.pi * 2 / 4 + local dragon_pos, crystal_pos = self.dragon:get_pos(), self.crystal:get_pos() + + dragon_pos.y = dragon_pos.y + 4 + crystal_pos.y = crystal_pos.y + 2 + + self.object:set_pos(vector.divide(vector.add(dragon_pos, crystal_pos), 2)) + local rot = vector.dir_to_rotation(vector.direction(dragon_pos, crystal_pos)) + rot.z = self.spin + self.object:set_rotation(rot) + self.object:set_properties({visual_size = {x = 0.5, y = 0.5, z = vector.distance(dragon_pos, crystal_pos)}}) + else + self.object:remove() + end + end, +}) + minetest.register_craftitem("mcl_end:crystal", { inventory_image = "mcl_end_crystal_item.png", description = S("End Crystal"), diff --git a/mods/ITEMS/mcl_end/textures/mcl_end_crystal_beam.png b/mods/ITEMS/mcl_end/textures/mcl_end_crystal_beam.png new file mode 100644 index 0000000000000000000000000000000000000000..1259a5d0ec80af0c59843b46c21fda8853fa9601 GIT binary patch literal 2065 zcmV+s2=4cZP)EK|00004XF*Lt006O% z3;baP00009a7bBm000id000id0mpBsWB>pMvq?ljRCr#cTL*F+ISkzY|5M2dmX#&T znmfV+7@-lyzN)K|ha?C#8qK(;ZQD-h|M&Oz|3Blhhld9$`}OM=Rqz$lhRC2cFliX- zK=(7(-FGr(4BX$}r(RrLU2&PIgD@~gzrMa;L-qy@p~E70a1@8sK-aSj_wDUX>Ygg# z_Hk0>>+5Tc1^xZ__=uS{4CCqc_SP7f3?blUK74$95U&@<_y0P8#RKVG#r^c{+qcv! zuGbPt;X%gE&dypMOx>s9jXijMeTBmr8^}Ui=7JwDFai}x8|9Glw=j$@&Q&=X3l(;- zw#9SgvLe{_{rmSa7s$ZkJ2Le2^n^VaQdlrCfK9Vdcj7U~SjfZRa`|@%k5b=Jgwpt~ zF7EE`JP!hM=|eRScA!pV-G{MF=R*mGqR`S;hkG&vQ^(8Pq29P>4f-h7+)&R*{0#vH zrR#_yl~GVroQP^@u(aUw^E30r0}C(US3{w8pDnP6ICNB zyS%*2w7`Jqf$Tyl<Cqp=>5bsjFN^1`~Kw;gkQ5gl#1H_3@GF7|}%=6OL4S~v^pP$oC z!~j?amKmv+x}6sl4q=T%l>s~H`}z4f(Lf7s*Lz!@RcPbCmUtBp#IU09NK|?JWPQ3; z4$ADvLTjb{TZl*t(rTEk-2ASsGA1hI=FE1v&w4?wqfHp;yeIaD29_mdNS$_q)}LF0RUuB3_Do|(<^s0m1S&A0vVhT6FWnx0plv~$|`;^mAAp>D$N<4>tp_FjJhyt zqp*W2olS%6^c%_*Up{mIiXL>r>9o-dTmF%4F73|I$WXVF`tL4oUgOVSq zyWLiZfj=ERz3~xCr>#XC;6)hDBo`_S;4x6e|4>FA=!@Ec8kw-8B~F*tW)emQI(AYA zyey;zMsg)chFm1beI0r-z~klur-$VdATUuK2~UzLo!az?-C-W2kwKT&27?_7pWf_& z|8C|+LK_Z#pP<|nuN;KaXZ=c4MrKdb;?;?T#H6@f{H-wkPl0MF$P}V z7}zeIGs%+(O$?y$O1p^xQ^x~4#vs#5W};D?AQDl^k~uqx_fup}B<;^IS=BOx@|=z1P&BVpYWh{#?y4>!D1 zbR?>b94C@LZwnwcufk;Pd?b=Z!RVd~uP#f^*2S=26M3$9B88rdWe(MyOz)-Gq)c4G z((E0h2g%e%4;cZF!2mjtMA0z&X*dM0dpfKmqa zWh|%<7+U(+S2r#VArB7W@;4KU5g0MB=XaIHp|eHzP7h4ERwKRKud=P2xvEp$Ls6j0 z!vnYw(kcoDZA7AuX(1whQN9F+GcbGDoD$6(fn@GwDztx(l2!>vrV%oP#EVL`qb3fG z7^9ev3sn5@}VPAtC!_|S@)Ry3