2024-12-16 18:59:03 -06:00

73 lines
1.9 KiB
Lua

local class = {
_owner = nil
}
function class:on_step(dtime, moveresult)
local slowdown_speed = self._slowdown_speed or 0.98
local slowdown = self._slowdown
if slowdown == nil then
slowdown = true
end
if slowdown then
local vel = self.object:get_velocity()
vel = vector.multiply(vel, slowdown_speed)
self.object:set_velocity(vel)
end
for _, v in pairs(moveresult.collisions) do
if v.type == "node" then
self:_on_hit_node(v.node_pos, core.get_node(v.node_pos))
self.object:remove()
elseif v.type == "object" then
self:_on_hit_object(v.object)
self.object:remove()
end
end
end
PyuTest.make_projectile = function (name, properties, options, functions)
local fns = functions or {}
fns.on_hit_node = fns.on_hit_node or function (...)end
fns.on_hit_object = fns.on_hit_object or function (...)end
core.register_entity(name, setmetatable(PyuTest.util.tableconcat({
initial_properties = PyuTest.util.tableconcat({
visual = "cube",
visual_size = {x=0.5, y=0.5},
collisionbox = {-0.2, -0.2, -0.2, 0.2, 0.2, 0.2,},
use_texture_alpha = false,
pointable = false,
glow = core.LIGHT_MAX,
physical = true,
collide_with_objects = true,
}, properties or {}),
_on_hit_node = fns.on_hit_node,
_on_hit_object = fns.on_hit_object
}, options or {}), { __index = class }))
end
PyuTest.shoot_projectile_from_object = function(name, object, velocity)
local dir
if object:is_player() then
dir = object:get_look_dir()
else
dir = object:get_rotation()
end
local pos = object:get_pos()
pos = vector.offset(pos, 0, 1.3, 0)
pos = vector.add(pos, dir)
local projectile = core.add_entity(pos, name)
projectile:set_velocity(vector.multiply(dir, velocity or 30))
projectile:set_rotation(dir)
projectile:get_luaentity()._owner = object
return projectile
end