122 lines
2.9 KiB
Lua
122 lines
2.9 KiB
Lua
MCLObject = class()
|
|
|
|
function MCLObject:constructor(obj)
|
|
self.object = obj.object or obj
|
|
self.IS_MCL_OBJECT = true
|
|
end
|
|
|
|
function MCLObject:on_punch(hitter, time_from_last_punch, tool_capabilities, dir, damage)
|
|
local source = MCLDamageSource({is_punch = true, raw_source_object = hitter})
|
|
|
|
local knockback = {
|
|
hitter = hitter,
|
|
time_from_last_punch = time_from_last_punch,
|
|
tool_capabilities = tool_capabilities,
|
|
dir = dir,
|
|
}
|
|
|
|
self:damage(damage, source, knockback)
|
|
return true
|
|
end
|
|
|
|
function MCLObject:apply_knockback(strength, dir)
|
|
local oldvel = self.object:get_velocity()
|
|
local vel = vector.multiply(vector.normalize(vector.new(dir.x, 0, dir.z)), strength)
|
|
|
|
if self:is_on_ground() then
|
|
local old_y = oldvel.y / 2
|
|
|
|
y = math.min(0.4, old_y / 2 + strenth)
|
|
vel.y
|
|
end
|
|
|
|
vel = vector.subtract(vel, vector.divide(vector.new(oldvel.x, 0, oldvel.z), 2))
|
|
|
|
self.object:add_velocity(vel)
|
|
end
|
|
|
|
-- use this function to deal regular damage to an object (do NOT use :punch() unless toolcaps need to be handled)
|
|
function MCLObject:damage(damage, source, knockback)
|
|
damage = self:damage_modifier(damage, source) or damage
|
|
self:set_hp(self:get_hp() - damage)
|
|
|
|
if type(knockback) == "table" then
|
|
knockback = self:calculate_knockback(
|
|
knockback.hitter,
|
|
knockback.time_from_last_punch,
|
|
knockback.tool_capabilities,
|
|
knockback.dir or vector.direction(knockback.hitter:get_pos(), self.object:get_pos(),
|
|
knockback.distance or vector.distance(knockback.hitter:get_pos(), self.object:get_pos(),
|
|
damage,
|
|
source)
|
|
end
|
|
|
|
table.insert(self.damage_info, {
|
|
damage = damage,
|
|
source = source,
|
|
knockback = knockback,
|
|
})
|
|
|
|
return damage
|
|
end
|
|
|
|
function MCLObject:wield_index()
|
|
end
|
|
|
|
MCLObject:__getter("equipment", function(self)
|
|
return MCLEquipment(self:inventory(), self:wield_index())
|
|
end)
|
|
|
|
function MCLObject:get_hp()
|
|
return self.object:get_hp()
|
|
end
|
|
|
|
function MCLObject:set_hp(hp)
|
|
self.object:set_hp(hp)
|
|
end
|
|
|
|
function MCLObject:death_drop(inventory, listname, index, stack)
|
|
minetest.add_item(self.object:get_pos(), stack)
|
|
inventory:set_stack(listname, index, nil)
|
|
end
|
|
|
|
function MCLObject:on_death(source)
|
|
local inventory = self:inventory()
|
|
if inventory then
|
|
for listname, list in pairs(inventory:get_lists()) do
|
|
for index, stack in pairs(list) do
|
|
if stack:get_name() ~= "" and then
|
|
self:death_drop(inventory, listname, index, stack)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function MCLObject:damage_modifier(damage, source)
|
|
if self.invulnerable and not source.bypasses_invulnerability then
|
|
return 0
|
|
end
|
|
end
|
|
|
|
function MCLObject:on_damage(damage, source, knockback)
|
|
end
|
|
|
|
MCLObject.calculate_knockback = minetest.calculate_knockback
|
|
|
|
function minetest.calculate_knockback()
|
|
return 0
|
|
end
|
|
|
|
function MCLObject:on_step()
|
|
local damage_info = self.damage_info
|
|
if damage_info then
|
|
self.damage_info = nil
|
|
self:on_damage(damage_info.damage, damage_info.source)
|
|
|
|
if damage_info.knockback then
|
|
self.object:add_velocity(damage_info.knockback)
|
|
end
|
|
end
|
|
end
|