From 6193b2630f7f4de51b15220c8230b7700a81a4ec Mon Sep 17 00:00:00 2001 From: teknomunk Date: Sun, 20 Oct 2024 13:31:29 -0500 Subject: [PATCH] Move tracer to vl_projectile --- mods/ITEMS/mcl_bows/arrow.lua | 26 +++++--------------------- mods/ITEMS/vl_projectile/api.md | 4 +++- mods/ITEMS/vl_projectile/init.lua | 28 ++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 1c4194de0..68c488fc8 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -132,8 +132,13 @@ local arrow_entity = { damage_groups = function(self) return { fleshy = self._damage } end, + hide_tracer = function(self) + return self._stuck or self._damage < 9 or self._in_player + end, + tracer_texture = "mobs_mc_arrow_particle.png", behaviors = { vl_projectile.burns, + vl_projectile.has_tracer, -- Custom arrow behaviors function(self, dtime) @@ -146,27 +151,6 @@ local arrow_entity = { local pos = self.object:get_pos() self._allow_punch = self._allow_punch or not self._owner or not self._startpos or pos and vector.distance(self._startpos, pos) > 1.5 - -- Add tracer - if self._damage >= 9 and self._in_player == false then - minetest.add_particlespawner({ - amount = 20, - time = .2, - minpos = vector.zero(), - maxpos = vector.zero(), - minvel = vector.new(-0.1,-0.1,-0.1), - maxvel = vector.new(0.1,0.1,0.1), - minexptime = 0.5, - maxexptime = 0.5, - minsize = 2, - maxsize = 2, - attached = self.object, - collisiondetection = false, - vertical = false, - texture = "mobs_mc_arrow_particle.png", - glow = 1, - }) - end - -- Give the arrows a maximum flight time self._time_in_air = (self._time_in_air or 0) + dtime if self._time_in_air > ARROW_TIMEOUT then diff --git a/mods/ITEMS/vl_projectile/api.md b/mods/ITEMS/vl_projectile/api.md index b132546af..942c70685 100644 --- a/mods/ITEMS/vl_projectile/api.md +++ b/mods/ITEMS/vl_projectile/api.md @@ -62,9 +62,11 @@ Arguments: The projectile API supports specifying the behaviors that a projectile will exhibit. There are several standard behaviors provided with the API: -* `vl_projectile.burns`: Projectiles can be set on fire +* `vl_projectile.burns`: projectile can be set on fire * `vl_projectile.collides_with_solids`: handles collisions between projectiles and solid nodes * `vl_projectile.collides_with_entities`: handles collisions between projectiles and entities by checking nearby entities +* `vl_projectile.has_tracer`: projectile will have a tracer trail when thrown/shot. Projectile can define + `_vl_projectile.hide_tracer = function(self)` to conditionally hide the tracer. * `vl_projectile.raycast_collides_with_entities`: handles collisions between projectils and entities by performing a raycast check along the path of movement. diff --git a/mods/ITEMS/vl_projectile/init.lua b/mods/ITEMS/vl_projectile/init.lua index f8107de3c..db1e15499 100644 --- a/mods/ITEMS/vl_projectile/init.lua +++ b/mods/ITEMS/vl_projectile/init.lua @@ -10,6 +10,8 @@ local enable_pvp = minetest.settings:get_bool("enable_pvp") function mod.projectile_physics(obj, entity_def, v, a) local le = obj:get_luaentity() + if not le then return end + local entity_def = minetest.registered_entities[le.name] local pos = obj:get_pos() if not pos then return end @@ -203,6 +205,30 @@ function mod.burns(self, dtime, entity_def, projectile_def) end end +function mod.has_tracer(self, dtime, entity_def, projectile_def) + local hide_tracer = projectile_def.hide_tracer + if hide_tracer and hide_tracer(self) then return end + + -- Add tracer + minetest.add_particlespawner({ + amount = 20, + time = .2, + minpos = vector.zero(), + maxpos = vector.zero(), + minvel = vector.new(-0.1,-0.1,-0.1), + maxvel = vector.new(0.1,0.1,0.1), + minexptime = 0.5, + maxexptime = 0.5, + minsize = 2, + maxsize = 2, + attached = self.object, + collisiondetection = false, + vertical = false, + texture = projectile_def.tracer_texture or "mobs_mc_arrow_particle.png", + glow = 1, + }) +end + function mod.collides_with_solids(self, dtime, entity_def, projectile_def) local pos = self.object:get_pos() if not pos then return end @@ -380,6 +406,8 @@ function mod.raycast_collides_with_entities(self, dtime, entity_def, projectile_ local closest_object, closest_distance local pos = self.object:get_pos() + if not pos then return end + local arrow_dir = self.object:get_velocity() --create a raycast from the arrow based on the velocity of the arrow to deal with lag