Move arrow self-collision grace logic to vl_projectile then apply to mob projectiles and splash and linger potions, allow entity luaentity to be passed to mcl_util.get_entity_id()

This commit is contained in:
teknomunk 2024-11-13 22:02:58 -06:00
parent be26dc9800
commit 42c4d91967
7 changed files with 38 additions and 12 deletions

@ -717,6 +717,8 @@ function mcl_util.gen_uuid()
return table.concat(u) return table.concat(u)
end end
function mcl_util.get_entity_id(entity) function mcl_util.get_entity_id(entity)
if entity.object then entity = entity.object end
if entity:is_player() then if entity:is_player() then
return entity:get_player_name() return entity:get_player_name()
else else

@ -382,7 +382,9 @@ end
function mcl_mobs.register_arrow(name, def) function mcl_mobs.register_arrow(name, def)
if not name or not def then return end -- errorcheck if not name or not def then return end -- errorcheck
local behaviors = {} local behaviors = {
vl_projectile.has_owner_grace_distance
}
if def.hit_node then if def.hit_node then
table.insert(behaviors, vl_projectile.collides_with_solids) table.insert(behaviors, vl_projectile.collides_with_solids)
end end

@ -46,7 +46,6 @@ local arrow_entity = {
"last_pos", "startpos", "damage", "is_critical", "stuck", "stuckin", "stuckin_player", "time_in_air", "vl_projectile", "last_pos", "startpos", "damage", "is_critical", "stuck", "stuckin", "stuckin_player", "time_in_air", "vl_projectile",
}, },
_startpos=nil,
_damage=1, -- Damage on impact _damage=1, -- Damage on impact
_is_critical=false, -- Whether this arrow would deal critical damage _is_critical=false, -- Whether this arrow would deal critical damage
_stuck=false, -- Whether arrow is stuck _stuck=false, -- Whether arrow is stuck
@ -76,12 +75,10 @@ local arrow_entity = {
vl_projectile.sticks, vl_projectile.sticks,
vl_projectile.burns, vl_projectile.burns,
vl_projectile.has_tracer, vl_projectile.has_tracer,
vl_projectile.has_owner_grace_distance,
-- Custom arrow behaviors -- Custom arrow behaviors
function(self, dtime) function(self, dtime)
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
if self._deflection_cooloff > 0 then if self._deflection_cooloff > 0 then
self._deflection_cooloff = self._deflection_cooloff - dtime self._deflection_cooloff = self._deflection_cooloff - dtime
end end
@ -91,8 +88,6 @@ local arrow_entity = {
vl_projectile.raycast_collides_with_entities, vl_projectile.raycast_collides_with_entities,
}, },
allow_punching = function(self, entity_def, projectile_def, object) allow_punching = function(self, entity_def, projectile_def, object)
if not self._allow_punch then return false end
local lua = object:get_luaentity() local lua = object:get_luaentity()
if lua and lua.name == "mobs_mc:rover" then return false end if lua and lua.name == "mobs_mc:rover" then return false end

@ -65,7 +65,6 @@ function mcl_bows.shoot_arrow(arrow_item, pos, dir, yaw, shooter, power, damage,
le._source_object = shooter le._source_object = shooter
le._damage = damage le._damage = damage
le._is_critical = is_critical le._is_critical = is_critical
le._startpos = pos
le._knockback = knockback le._knockback = knockback
le._collectable = collectable le._collectable = collectable
le._arrow_item = arrow_item le._arrow_item = arrow_item

@ -208,6 +208,7 @@ function mcl_potions.register_lingering(name, descr, color, def)
pointable = false, pointable = false,
_vl_projectile = { _vl_projectile = {
behaviors = { behaviors = {
vl_projectile.has_owner_grace_distance,
vl_projectile.collides_with_entities, vl_projectile.collides_with_entities,
vl_projectile.collides_with_solids, vl_projectile.collides_with_solids,
}, },

@ -176,6 +176,7 @@ function mcl_potions.register_splash(name, descr, color, def)
collisionbox = {-0.1,-0.1,-0.1,0.1,0.1,0.1}, collisionbox = {-0.1,-0.1,-0.1,0.1,0.1,0.1},
_vl_projectile = { _vl_projectile = {
behaviors = { behaviors = {
vl_projectile.has_owner_grace_distance,
vl_projectile.collides_with_entities, vl_projectile.collides_with_entities,
vl_projectile.collides_with_solids, vl_projectile.collides_with_solids,
}, },

@ -215,6 +215,13 @@ function mod.burns(self, dtime, entity_def, projectile_def)
end end
end end
function mod.has_owner_grace_distance(self, dtime, entity_def, projectile_def)
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) > ( projectile_def.grace_distance or 1.5 )
end
function mod.has_tracer(self, dtime, entity_def, projectile_def) function mod.has_tracer(self, dtime, entity_def, projectile_def)
local hide_tracer = projectile_def.hide_tracer local hide_tracer = projectile_def.hide_tracer
if hide_tracer and hide_tracer(self) then return end if hide_tracer and hide_tracer(self) then return end
@ -593,10 +600,11 @@ function mod.create(entity_id, options)
local luaentity = obj:get_luaentity() local luaentity = obj:get_luaentity()
if options.owner_id then if options.owner_id then
luaentity._owner = options.owner_id luaentity._owner = options.owner_id
else elseif options.owner then
luaentity._owner = mcl_util.get_entity_id(options.owner) luaentity._owner = mcl_util.get_entity_id(options.owner)
end end
luaentity._starting_velocity = obj:get_velocity() luaentity._starting_velocity = obj:get_velocity()
luaentity._startpos = pos
luaentity._vl_projectile = { luaentity._vl_projectile = {
extra = options.extra, extra = options.extra,
} }
@ -606,11 +614,29 @@ function mod.create(entity_id, options)
end end
function mod.register(name, def) function mod.register(name, def)
assert(def._vl_projectile, "vl_projectile.register() requires definition to define _vl_projectile") def_vl_projectile = def._vl_projectile
assert(def._vl_projectile.behaviors, "vl_projectile.register() requires definition to define _vl_projectile.behaviors") assert(def_vl_projectile, "vl_projectile.register() requires definition to define _vl_projectile")
local behaviors = def._vl_projectile.behaviors local behaviors = def_vl_projectile.behaviors
assert(behaviors, "vl_projectile.register() requires definition to define _vl_projectile.behaviors")
for i = 1,#behaviors do for i = 1,#behaviors do
assert(behaviors[i] and type(behaviors[i]) == "function", "def._vl_projectile.behaviors["..i.." is malformed") assert(behaviors[i] and type(behaviors[i]) == "function", "def._vl_projectile.behaviors["..i.." is malformed")
if behaviors[i] == vl_projectile.has_owner_grace_distance then
local old_allow_punching = def_vl_projectile.allow_punching
if old_allow_punching then
def_vl_projectile.allow_punching = function(self, ...)
if not self._allow_punch then return false end
return old_allow_punching(self, ...)
end
else
def_vl_projectile.allow_punching = function(self, ...)
if not self._allow_punch then return false end
return true
end
end
end
end end
if not def.on_step then if not def.on_step then