mirror of
https://github.com/minetest-mods/digtron.git
synced 2025-01-03 17:37:28 +01:00
Add damage-dealing to the digger heads
This commit is contained in:
parent
ee0cf5538a
commit
257863b888
@ -59,6 +59,8 @@ Facing of a digger head is significant; it will excavate material from the node
|
||||
|
||||
Digger heads come in both regular and "intermittent" versions, each of which is craftable from the other. The intermittent version can have a period and offset defined if you want them to punch regularly-spaced holes. Note that diggers aimed forward should generally always be the regular kind (or have a period of 1), otherwise the digging machine may be unable to move.
|
||||
|
||||
Be cautious around active digger heads when damage is enabled - they bite!
|
||||
|
||||
Soft Material Digger Head
|
||||
----------------
|
||||
|
||||
|
1
init.lua
1
init.lua
@ -11,6 +11,7 @@ dofile( minetest.get_modpath( "digtron" ) .."/recipes.lua" )
|
||||
digtron.creative_mode = false -- this causes digtrons to operate without consuming fuel or building materials.
|
||||
digtron.particle_effects = true -- Enables the spray of particles out the back of a digger head
|
||||
digtron.lava_impassible = true -- when true, lava counts as protected nodes.
|
||||
digtron.diggers_damage_creatures = true -- when true, diggers deal damage to creatures when they trigger.
|
||||
|
||||
digtron.cycle_time = 1 -- How many seconds a digtron waits between cycles. Auto-controllers can make this wait longer, but cannot make it shorter.
|
||||
digtron.traction_factor = 3.0 -- How many digtron nodes can be moved for each adjacent solid node that the digtron has traction against
|
||||
|
@ -208,7 +208,18 @@ local execute_cycle = function(pos, clicker)
|
||||
player_pos.z >= layout.extents.min_z - 1 and player_pos.z <= layout.extents.max_z + 1 then
|
||||
move_player = true
|
||||
end
|
||||
|
||||
|
||||
-- damage the weak flesh
|
||||
if digtron.diggers_damage_creatures then
|
||||
for k, location in pairs(layout.diggers) do
|
||||
local target = minetest.get_node(location)
|
||||
local targetdef = minetest.registered_nodes[target.name]
|
||||
if targetdef.damage_creatures ~= nil then
|
||||
targetdef.damage_creatures(clicker, location, digtron.find_new_pos(location, target.param2), controlling_coordinate)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--move the array
|
||||
digtron.move_digtron(facing, layout.all, layout.extents, nodes_dug, clicker:get_player_name())
|
||||
local oldpos = {x=pos.x, y=pos.y, z=pos.z}
|
||||
|
@ -83,6 +83,10 @@ minetest.register_node("digtron:digger", {
|
||||
|
||||
return digtron.mark_diggable(digpos, nodes_dug)
|
||||
end,
|
||||
|
||||
damage_creatures = function(player, pos, targetpos, controlling_coordinate)
|
||||
digtron.damage_creatures(player, targetpos, 8)
|
||||
end,
|
||||
})
|
||||
|
||||
-- Digs out nodes that are "in front" of the digger head.
|
||||
@ -138,6 +142,13 @@ minetest.register_node("digtron:intermittent_digger", {
|
||||
|
||||
return digtron.mark_diggable(digpos, nodes_dug)
|
||||
end,
|
||||
|
||||
damage_creatures = function(player, pos, targetpos, controlling_coordinate)
|
||||
local meta = minetest.get_meta(pos)
|
||||
if (targetpos[controlling_coordinate] + meta:get_int("offset")) % meta:get_int("period") == 0 then
|
||||
digtron.damage_creatures(player, targetpos, 8)
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
-- A special-purpose digger to deal with stuff like sand and gravel in the ceiling. It always digs (no periodicity or offset), but it only digs falling_block nodes
|
||||
@ -192,6 +203,10 @@ minetest.register_node("digtron:soft_digger", {
|
||||
|
||||
return 0, nil
|
||||
end,
|
||||
|
||||
damage_creatures = function(player, pos, targetpos, controlling_coordinate)
|
||||
digtron.damage_creatures(player, targetpos, 4)
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node("digtron:intermittent_soft_digger", {
|
||||
@ -254,4 +269,11 @@ minetest.register_node("digtron:intermittent_soft_digger", {
|
||||
|
||||
return 0, nil
|
||||
end,
|
||||
|
||||
damage_creatures = function(player, pos, targetpos, controlling_coordinate)
|
||||
local meta = minetest.get_meta(pos)
|
||||
if (targetpos[controlling_coordinate] + meta:get_int("offset")) % meta:get_int("period") == 0 then
|
||||
digtron.damage_creatures(player, targetpos, 4)
|
||||
end
|
||||
end,
|
||||
})
|
17
util.lua
17
util.lua
@ -429,4 +429,19 @@ digtron.update_builder_item = function(pos)
|
||||
digtron.create_builder_item = item_stack:get_name()
|
||||
minetest.add_entity(pos,"digtron:builder_item")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
digtron.damage_creatures = function(player, pos, amount)
|
||||
local objects = minetest.env:get_objects_inside_radius(pos, 1.0)
|
||||
if objects ~= nil then
|
||||
for _, obj in ipairs(objects) do
|
||||
if obj then
|
||||
obj:punch(player, 1.0, {
|
||||
full_punch_interval = 1.0,
|
||||
damage_groups = {fleshy = amount},
|
||||
}, nil )
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user