Add poison and pit traps.

This commit is contained in:
Duane 2016-08-05 01:29:38 -05:00
parent 5f3d97ab0c
commit 04ecb1bd5c
2 changed files with 81 additions and 5 deletions

View file

@ -359,7 +359,6 @@ minetest.register_abm({
neighbors = {'air'},
interval = 5 * time_factor,
chance = 500,
catch_up = false,
action = function(pos, node, aoc, active_object_count_wider)
if not (pos and node) or active_object_count_wider > dungeon_monster_density then
return

View file

@ -100,12 +100,70 @@ local chest_formspec =
"listring[current_player;main]" ..
default.get_hotbar_bg(0,4.85)
local function disintigrate(minp, maxp)
if not (minp and maxp) then
return
end
minp = vector.round(minp)
maxp = vector.round(maxp)
local air = minetest.get_content_id('air')
local vm = minetest.get_voxel_manip()
if not vm then
return
end
local emin, emax = vm:read_from_map(minp, maxp)
local area = VoxelArea:new({MinEdge = emin, MaxEdge = emax})
local data = vm:get_data()
local p = {}
for z = minp.z, maxp.z do
for y = minp.y, maxp.y do
local ivm = area:index(minp.x, y, z)
for x = minp.x, maxp.x do
data[ivm] = air
ivm = ivm + 1
end
end
end
vm:set_data(data)
vm:write_to_map()
vm:update_map()
end
if fun_caves.register_status then
fun_caves.register_status({
name = 'poisoned',
during = function(player)
if not player then
return
end
local hp = player:get_hp()
if hp and type(hp) == 'number' then
hp = hp - 1
player:set_hp(hp)
end
end,
terminate = function(player)
if not player then
return
end
local player_name = player:get_player_name()
minetest.chat_send_player(player_name, 'Your sickness ebbs away.')
end,
})
end
local newnode = fun_caves.clone_node("default:chest")
newnode.description = "Treasure Chest"
newnode.on_construct = nil
newnode.drop = 'default:chest'
newnode.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
if not pos then
if not (pos and clicker) then
return
end
@ -118,13 +176,32 @@ newnode.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
local ready = meta:get_string('formspec')
if treasures and ready == '' then
if minetest.get_modpath('tnt') and math.random(20) == 1 then
if math.random(20) == 1 then
local player_name = clicker:get_player_name()
if not player_name or player_name == '' or not fun_caves.set_status then
return
end
minetest.chat_send_player(player_name, minetest.colorize('#FF0000', 'You\'ve been poisoned!'))
fun_caves.set_status(player_name, 'poisoned', 2 ^ math.random(8), {damage = 1})
return
elseif minetest.get_modpath('tnt') and math.random(20) == 1 then
minetest.set_node(pos, {name = 'tnt:tnt_burning'})
local timer = minetest.get_node_timer(pos)
if timer then
timer:start(5)
timer:start(3)
end
minetest.sound_play("default_dig_crumbly", {pos = pos, gain = 0.5, max_hear_distance = 10})
return
elseif math.random(20) == 1 then
minetest.remove_node(pos)
pos = clicker:getpos()
if not pos then
return
end
disintigrate({x = pos.x - 1, y = pos.y - 12, z = pos.z - 1}, {x = pos.x + 1, y = pos.y - 1, z = pos.z + 1})
return
end
@ -390,7 +467,7 @@ fun_caves.dungeon = function(minp_in, maxp_in, data, p2data, area, node, heightm
if not leave_alone[data[ivm]] then
if ry == 0 and (cy > 0 or not centered_in) then
if content[cx][cy][cz] == 'room' then
local r = math.random(5000)
local r = math.random(2000)
if r == 1 then
data[ivm] = node['fun_caves:stone_with_gold_trap']
elseif r == 2 then