forked from luanti-org/minetest_game
		
	TNT: Add explode_center flag
Add 'explode_centre' flag which when false explodes as normal and when true runs on_blast on centre node as well as dropping items.
This commit is contained in:
		| @@ -363,7 +363,8 @@ TNT API | ||||
| ^ Create an explosion. | ||||
|  | ||||
| * `position` The center of explosion. | ||||
| * `definition` The TNT definion as passed to `tnt.register` | ||||
| * `definition` The TNT definion as passed to `tnt.register` with the following addition: | ||||
|  * `explode_center` false by default which removes TNT node on blast, when true will explode center node. | ||||
|  | ||||
| `tnt.burn(position, [nodename])` | ||||
|  | ||||
|   | ||||
| @@ -208,6 +208,7 @@ local function add_effects(pos, radius, drops) | ||||
| 		collisiondetection = false, | ||||
| 		vertical = false, | ||||
| 		texture = "tnt_boom.png", | ||||
| 		glow = 15, | ||||
| 	}) | ||||
| 	minetest.add_particlespawner({ | ||||
| 		amount = 64, | ||||
| @@ -272,7 +273,7 @@ function tnt.burn(pos, nodename) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owner) | ||||
| local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owner, explode_center) | ||||
| 	pos = vector.round(pos) | ||||
| 	-- scan for adjacent TNT nodes first, and enlarge the explosion | ||||
| 	local vm1 = VoxelManip() | ||||
| @@ -286,6 +287,10 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owne | ||||
| 	local c_tnt_burning = minetest.get_content_id("tnt:tnt_burning") | ||||
| 	local c_tnt_boom = minetest.get_content_id("tnt:boom") | ||||
| 	local c_air = minetest.get_content_id("air") | ||||
| 	-- make sure we still have explosion even when centre node isnt tnt related | ||||
| 	if explode_center then | ||||
| 		count = 1 | ||||
| 	end | ||||
|  | ||||
| 	for z = pos.z - 2, pos.z + 2 do | ||||
| 	for y = pos.y - 2, pos.y + 2 do | ||||
| @@ -384,12 +389,14 @@ end | ||||
| function tnt.boom(pos, def) | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| 	local owner = meta:get_string("owner") | ||||
| 	if not def.explode_center then | ||||
| 		minetest.set_node(pos, {name = "tnt:boom"}) | ||||
| 	end | ||||
| 	local sound = def.sound or "tnt_explode" | ||||
| 	minetest.sound_play(sound, {pos = pos, gain = 1.5, | ||||
| 			max_hear_distance = math.min(def.radius * 20, 128)}) | ||||
| 	minetest.set_node(pos, {name = "tnt:boom"}) | ||||
| 	local drops, radius = tnt_explode(pos, def.radius, def.ignore_protection, | ||||
| 			def.ignore_on_blast, owner) | ||||
| 			def.ignore_on_blast, owner, def.explode_center) | ||||
| 	-- append entity drops | ||||
| 	local damage_radius = (radius / def.radius) * def.damage_radius | ||||
| 	entity_physics(pos, damage_radius, drops) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user