This commit is contained in:
fluxionary 2024-04-13 13:31:15 +02:00 committed by GitHub
commit f8c79c781a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 35 additions and 20 deletions

View File

@ -167,11 +167,11 @@ Doors API
The doors mod allows modders to register custom doors and trapdoors.
`doors.registered_doors[name] = Door definition`
* Table of registered doors, indexed by door name
`doors.registered_doors[name] = Door definition`
* Table of registered doors, indexed by door name
`doors.registered_trapdoors[name] = Trapdoor definition`
* Table of registered trap doors, indexed by trap door name
`doors.registered_trapdoors[name] = Trapdoor definition`
* Table of registered trap doors, indexed by trap door name
`doors.register_door(name, def)`
@ -214,7 +214,7 @@ The doors mod allows modders to register custom doors and trapdoors.
* `pos` Position of the door
* `node` Node definition
* `clicker` Player definition for the player that clicked on the door
### Door definition
description = "Door description",
@ -232,7 +232,7 @@ The doors mod allows modders to register custom doors and trapdoors.
gain_open = 0.3, -- optional, defaults to 0.3
gain_close = 0.3, -- optional, defaults to 0.3
protected = false, -- If true, only placer can open the door (locked for others)
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing),
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing),
-- optional function containing the on_rightclick callback, defaults to a doors.door_toggle-wrapper
use_texture_alpha = "clip",
@ -257,7 +257,7 @@ The doors mod allows modders to register custom doors and trapdoors.
gain_open = 0.3, -- optional, defaults to 0.3
gain_close = 0.3, -- optional, defaults to 0.3
protected = false, -- If true, only placer can open the door (locked for others)
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) ,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing),
-- function containing the on_rightclick callback
use_texture_alpha = "clip",

View File

@ -91,12 +91,7 @@ end
local basic_flame_on_construct -- cached value
local function destroy(drops, npos, cid, c_air, c_fire,
on_blast_queue, on_construct_queue,
ignore_protection, ignore_on_blast, owner)
if not ignore_protection and minetest.is_protected(npos, owner) then
return cid
end
on_blast_queue, on_construct_queue, ignore_on_blast)
local def = cid_data[cid]
if not def then
@ -293,7 +288,6 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owne
local minp, maxp = vm1:read_from_map(p1, p2)
local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
local data = vm1:get_data()
local count = 0
local c_tnt
local c_tnt_burning = minetest.get_content_id("tnt:tnt_burning")
local c_tnt_boom = minetest.get_content_id("tnt:boom")
@ -304,9 +298,12 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owne
else
c_tnt = c_tnt_burning -- tnt is not registered if disabled
end
-- make sure we still have explosion even when centre node isnt tnt related
local count
if explode_center then
count = 1
else
count = 0
end
for z = pos.z - 2, pos.z + 2 do
@ -322,6 +319,7 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owne
end
end
end
count = math.max(1, count)
vm1:set_data(data)
vm1:write_to_map()
@ -352,10 +350,10 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owne
if (radius * radius) / (r * r) >= (pr:next(80, 125) / 100) then
local cid = data[vi]
local p = {x = pos.x + x, y = pos.y + y, z = pos.z + z}
if cid ~= c_air and cid ~= c_ignore then
if cid ~= c_air and cid ~= c_ignore and (ignore_protection or not minetest.is_protected(p, owner)) then
data[vi] = destroy(drops, p, cid, c_air, c_fire,
on_blast_queue, on_construct_queue,
ignore_protection, ignore_on_blast, owner)
ignore_on_blast)
end
end
vi = vi + 1
@ -363,11 +361,24 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owne
end
end
-- make the center of the explosion flash, if it's safe
local vc = a:index(pos.x, pos.y, pos.z)
local ccid = data[vc]
if ccid == c_air then
data[vc] = c_tnt_boom
end
vm:set_data(data)
vm:write_to_map()
vm:update_map()
vm:update_liquids()
-- make the center of the explosion flash, if it's safe
-- have to set the timer *after* data is written to the map
if ccid == c_air then
minetest.get_node_timer(pos):start(0)
end
-- call check_single_for_falling for everything within 1.5x blast radius
for y = -radius * 1.5, radius * 1.5 do
for z = -radius * 1.5, radius * 1.5 do
@ -409,9 +420,6 @@ function tnt.boom(pos, def)
def.damage_radius = def.damage_radius or def.radius * 2
local meta = minetest.get_meta(pos)
local owner = meta:get_string("owner")
if not def.explode_center and def.ignore_protection ~= true then
minetest.set_node(pos, {name = "tnt:boom"})
end
local sound = def.sound or "tnt_explode"
minetest.sound_play(sound, {pos = pos, gain = 2.5,
max_hear_distance = math.min(def.radius * 20, 128)}, true)
@ -438,6 +446,13 @@ minetest.register_node("tnt:boom", {
groups = {dig_immediate = 3, not_in_creative_inventory = 1},
-- unaffected by explosions
on_blast = function() end,
on_timer = function(pos, elapsed)
if elapsed > 0 then
minetest.remove_node(pos)
else
return true
end
end,
})
minetest.register_node("tnt:gunpowder", {