From fe5638e1c856fa02b29964413a913d55a2b1a16c Mon Sep 17 00:00:00 2001 From: teknomunk Date: Sun, 8 Sep 2024 09:41:32 -0500 Subject: [PATCH] Address more review comments --- mods/ITEMS/mcl_bows/arrow.lua | 19 +++----- mods/ITEMS/mcl_potions/splash.lua | 10 ++-- mods/ITEMS/mcl_potions/tipped_arrow.lua | 2 +- mods/ITEMS/mcl_throwing/ender_pearl.lua | 9 ++-- mods/ITEMS/vl_projectile/init.lua | 65 ++++++++++--------------- 5 files changed, 45 insertions(+), 60 deletions(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 93f735124..404897850 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -36,13 +36,15 @@ S("Arrows might get stuck on solid blocks and can be retrieved again. They are a }) -- Destroy arrow entity self at pos and drops it as an item -local function spawn_item(self, pos) +local function replace_with_item_drop(self, pos) if not minetest.is_creative_enabled("") then local item = minetest.add_item(pos, "mcl_bows:arrow") item:set_velocity(vector.zero()) item:set_yaw(self.object:get_yaw()) end + mcl_burning.extinguish(self.object) + self._removed = true self.object:remove() end @@ -62,13 +64,10 @@ local function stuck_arrow_on_step(self, dtime) -- Drop arrow as item when it is no longer stuck -- FIXME: Arrows are a bit slow to react and continue to float in mid air for a few seconds. if self._stuckrechecktimer > STUCK_RECHECK_TIME then - local stuckin_def - if self._stuckin then - stuckin_def = minetest.registered_nodes[minetest.get_node(self._stuckin).name] - end + local stuckin_def = self._stuckin and minetest.registered_nodes[minetest.get_node(self._stuckin).name] -- TODO: In MC, arrow just falls down without turning into an item if stuckin_def and stuckin_def.walkable == false then - spawn_item(self, pos) + replace_with_item_drop(self, pos) return end self._stuckrechecktimer = 0 @@ -153,9 +152,8 @@ local arrow_entity = { end }, on_collide_with_solid = function(self, pos, node, node_def) - local def = node_def local vel = self.object:get_velocity() - local dpos = vector.round(vector.new(pos)) -- digital pos + local dpos = vector.round(pos) -- digital pos -- Check for the node to which the arrow is pointing local dir @@ -244,7 +242,7 @@ local arrow_entity = { elseif pointed_thing.type == "node" then local nn = minetest.get_node(minetest.get_pointed_thing_position(pointed_thing)).name local def = minetest.registered_nodes[nn] - if (not def) or def.walkable then + if not def or def.walkable then -- There's a node in the way. Delete arrow without damage mcl_burning.extinguish(self.object) self.object:remove() @@ -334,9 +332,6 @@ local arrow_entity = { -- Process as projectile vl_projectile.update_projectile(self, dtime) - - -- Update yaw - local vel = self.object:get_velocity() end, -- Force recheck of stuck arrows when punched. diff --git a/mods/ITEMS/mcl_potions/splash.lua b/mods/ITEMS/mcl_potions/splash.lua index bbf4effc8..388d35a60 100644 --- a/mods/ITEMS/mcl_potions/splash.lua +++ b/mods/ITEMS/mcl_potions/splash.lua @@ -125,14 +125,16 @@ function mcl_potions.register_splash(name, descr, color, def) -- Apply effect list if def._effect_list then - local ef_level - local dur for name, details in pairs(def._effect_list) do + local ef_level + local dur + if details.uses_level then - ef_level = details.level + details.level_scaling * (potency) + ef_level = details.level + details.level_scaling * potency else ef_level = details.level end + if details.dur_variable then dur = details.dur * math.pow(mcl_potions.PLUS_FACTOR, plus) if potency>0 and details.uses_level then @@ -142,9 +144,11 @@ function mcl_potions.register_splash(name, descr, color, def) else dur = details.dur end + if details.effect_stacks then ef_level = ef_level + mcl_potions.get_effect_level(obj, name) end + if rad > 0 then mcl_potions.give_effect_by_level(name, obj, ef_level, REDUX_MAP[rad]*dur) else diff --git a/mods/ITEMS/mcl_potions/tipped_arrow.lua b/mods/ITEMS/mcl_potions/tipped_arrow.lua index 1d67b65a2..f053557fc 100644 --- a/mods/ITEMS/mcl_potions/tipped_arrow.lua +++ b/mods/ITEMS/mcl_potions/tipped_arrow.lua @@ -58,7 +58,7 @@ function mcl_potions.register_arrow(name, desc, color, def) for name, details in pairs(def._effect_list) do local ef_level = details.level if details.uses_level then - ef_level = details.level + details.level_scaling * (potency) + ef_level = details.level + details.level_scaling * potency end local dur = details.dur diff --git a/mods/ITEMS/mcl_throwing/ender_pearl.lua b/mods/ITEMS/mcl_throwing/ender_pearl.lua index 0693b9088..5f6440ecc 100644 --- a/mods/ITEMS/mcl_throwing/ender_pearl.lua +++ b/mods/ITEMS/mcl_throwing/ender_pearl.lua @@ -71,10 +71,8 @@ vl_projectile.register("mcl_throwing:ender_pearl_entity",{ -- Node is walkable, we have to find a place somewhere outside of that node vc = vector.normalize(vc) - -- Zero-out the two axes with a lower absolute value than - -- the axis with the strongest force - local lv, ld - lv, ld = math.abs(vc.y), "y" + -- Zero-out the two axes with a lower absolute value than the axis with the strongest force + local lv, ld = math.abs(vc.y), "y" if math.abs(vc.x) > lv then lv, ld = math.abs(vc.x), "x" end @@ -122,8 +120,7 @@ vl_projectile.register("mcl_throwing:ender_pearl_entity",{ player:set_hp(player:get_hp() - 5, { type = "fall", from = "mod" }) -- 5% chance to spawn endermite at the player's origin - local r = math.random(1,20) - if r == 1 then + if math.random(1,20) == 1 then minetest.add_entity(oldpos, "mobs_mc:endermite") end end diff --git a/mods/ITEMS/vl_projectile/init.lua b/mods/ITEMS/vl_projectile/init.lua index 03e6da173..5104a17a5 100644 --- a/mods/ITEMS/vl_projectile/init.lua +++ b/mods/ITEMS/vl_projectile/init.lua @@ -22,8 +22,8 @@ function mod.projectile_physics(obj, entity_def, v, a) v,a = vl_physics.apply_entity_environmental_physics(obj) else -- Simple physics - if not v then v = obj:get_velocity() end - if not a then a = vector.zero() end + v = v or obj:get_velocity() + a = a or vector.zero() if not entity_def.ignore_gravity then a = a + vector.new(0,-GRAVITY,0) @@ -72,8 +72,7 @@ function mod.update_projectile(self, dtime) -- Run behaviors local behaviors = entity_vl_projectile.behaviors or {} for i=1,#behaviors do - local behavior = behaviors[i] - if behavior(self, dtime, entity_def, entity_vl_projectile) then + if behaviors[i](self, dtime, entity_def, entity_vl_projectile) then return end end @@ -81,8 +80,6 @@ function mod.update_projectile(self, dtime) mod.projectile_physics(self.object, entity_def) end -local function no_op() -end local function damage_particles(pos, is_critical) if is_critical then minetest.add_particlespawner({ @@ -102,20 +99,6 @@ local function damage_particles(pos, is_critical) }) end end -local function random_arrow_positions(positions, placement) - if positions == "x" then - return math.random(-4, 4) - elseif positions == "y" then - return math.random(0, 10) - end - if placement == "front" and positions == "z" then - return 3 - elseif placement == "back" and positions == "z" then - return -3 - end - return 0 -end - local function random_hit_positions(positions, placement) if positions == "x" then return math.random(-4, 4) @@ -170,8 +153,8 @@ local function handle_player_sticking(self, entity_def, projectile_def, entity) local placement = self._placement == 1 and "front" or "back" self._rotation_station = self.placement == 1 and -90 or 90 self._in_player = true - self._y_position = random_arrow_positions("y", placement) - self._x_position = random_arrow_positions("x", placement) + self._y_position = random_hit_positions("y", placement) + self._x_position = random_hit_positions("x", placement) if self._y_position > 6 and self._x_position < 2 and self._x_position > -2 then self._attach_parent = "Head" self._y_position = self._y_position - 6 @@ -187,10 +170,10 @@ local function handle_player_sticking(self, entity_def, projectile_def, entity) self._attach_parent = "Body" end self._z_rotation = math.random(-30, 30) - self._y_rotation = math.random( -30, 30) + self._y_rotation = math.random(-30, 30) self.object:set_attach( entity, self._attach_parent, - vector.new(self._x_position, self._y_position, random_arrow_positions("z", placement)), + vector.new(self._x_position, self._y_position, random_hit_positions("z", placement)), vector.new(0, self._rotation_station + self._y_rotation, self._z_rotation) ) end @@ -226,12 +209,12 @@ function mod.collides_with_solids(self, dtime, entity_def, projectile_def) end -- Call entity collied hook - local hook = projectile_def.on_collide_with_solid or no_op - hook(self, pos, node, node_def) + local hook = projectile_def.on_collide_with_solid + if hook then hook(self, pos, node, node_def) end -- Call node collided hook - local hook = ((node_def and node_def._vl_projectile) or {}).on_collide or no_op - hook(self, pos, node, node_def) + local hook = node_def and node_def._vl_projectile and node_def._vl_projectile.on_collide + if hook then hook(self, pos, node, node_def) end -- Play sounds local sounds = projectile_def.sounds or {} @@ -280,7 +263,7 @@ local function handle_entity_collision(self, entity_def, projectile_def, object) do_damage = true handle_player_sticking(self, entity_def, projectile_def, object) - elseif object_lua and (object_lua.is_mob == true or object_lua._hittable_by_projectile) and (self_vl_projectile.owner ~= object) then + elseif object_lua and (object_lua.is_mob or object_lua._hittable_by_projectile) and self_vl_projectile.owner ~= object then do_damage = true end @@ -298,16 +281,17 @@ local function handle_entity_collision(self, entity_def, projectile_def, object) end -- Call entity collision hook - (projectile_def.on_collide_with_entity or no_op)(self, pos, object) + local hook = projectile_def.on_collide_with_entity + if hook then hook(self, pos, object) end -- Call reverse entity collision hook local other_entity_def = minetest.registered_entities[object.name] or {} local other_entity_vl_projectile = other_entity_def._vl_projectile or {} - local hook = (other_entity_vl_projectile or {}).on_collide or no_op - hook(object, self) + local hook = other_entity_vl_projectile and other_entity_vl_projectile.on_collide + if hook then hook(object, self) end -- Play sounds - local sounds = (projectile_def.sounds or {}) + local sounds = projectile_def.sounds or {} local sound = sounds.on_entity_collion or sounds.on_collision if type(sound) == "function" then sound = sound(self, entity_def, projectile_def, "entity", object) end if sound then @@ -339,7 +323,7 @@ function mod.collides_with_entities(self, dtime, entity_def, projectile_def) if entity and entity.name ~= self.object:get_luaentity().name then if object:is_player() and owner ~= object:get_player_name() then return handle_entity_collision(self, entity_def, projectile_def, object) - elseif (entity.is_mob == true or entity._hittable_by_projectile) and (owner ~= object) then + elseif (entity.is_mob or entity._hittable_by_projectile) and owner ~= object then return handle_entity_collision(self, entity_def, projectile_def, object) end end @@ -347,8 +331,7 @@ function mod.collides_with_entities(self, dtime, entity_def, projectile_def) end function mod.raycast_collides_with_entities(self, dtime, entity_def, projectile_def) - local closest_object - local closest_distance + local closest_object, closest_distance local pos = self.object:get_pos() local arrow_dir = self.object:get_velocity() @@ -377,8 +360,14 @@ function mod.create(entity_id, options) local obj = minetest.add_entity(pos, entity_id, options.staticdata) -- Set initial velocity and acceleration - local v = vector.multiply(options.dir or vector.zero(), options.velocity or 0) - local a = vector.multiply(v, -math.abs(options.drag)) + local a, v + if options.dir then + v = vector.multiply(options.dir, options.velocity or 0) + a = vector.multiply(v, -math.abs(options.drag)) + else + a = vector.zero() + v = a + end mod.projectile_physics(obj, entity_def, v, a) -- Update projectile parameters