Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix wrong behaviors when explode_center = false #2916

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions game_api.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)`

Expand Down Expand Up @@ -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",
Expand All @@ -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",

Expand All @@ -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",

Expand Down
41 changes: 28 additions & 13 deletions mods/tnt/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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")
Expand All @@ -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
Expand All @@ -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()
Expand Down Expand Up @@ -352,22 +350,35 @@ 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
end
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
Expand Down Expand Up @@ -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)
Expand All @@ -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", {
Expand Down
Loading