Added the shape "add_entity"

master
npx 2017-01-14 15:34:05 +01:00
parent e8036a0e02
commit 857bdfc4a9
25 changed files with 173 additions and 33 deletions

20
appunti
View File

@ -15,3 +15,23 @@ Per ogni bomba bisogna definire:
Aggiuntivi: Aggiuntivi:
-> velocity -> velocity
-> recipe_number -> recipe_number
Bombe presenti:
mobs_examples.lua:
- stone_wall_bomb
- Cubic Ice Shell bomb
- Fire circle
- Lava pool
- schematic bomb
Nssm_weapons:
- cobweb_bomb
- cubic mantis clay shell bomb
-
nssbombs:register_throwitem("nssm:", "", {
textures = "",
recipe_number = ,
recipe = ,
})

View File

@ -1,25 +1,30 @@
function nssbombs:register_throwitem(name, descr, def) function nssbombs:register_throwitem(name, descr, def)
minetest.register_craftitem("nssbombs:"..name.."_bomb", { minetest.register_craftitem(name, {
description = descr, description = descr,
inventory_image = def.textures, inventory_image = def.textures,
on_use = function(itemstack, placer, pointed_thing) on_use = function(itemstack, placer, pointed_thing)
local velocity = def.velocity or 15 local velocity = def.velocity or 15
local dir = placer:get_look_dir() local dir = placer:get_look_dir()
local playerpos = placer:getpos() local playerpos = placer:getpos()
local obj = minetest.env:add_entity({x=playerpos.x+dir.x,y=playerpos.y+2+dir.y,z=playerpos.z+dir.z}, "nssbombs:"..name.."_bomb_flying") local obj = minetest.add_entity({x=playerpos.x+dir.x,y=playerpos.y+2+dir.y,z=playerpos.z+dir.z}, name.."_flying")
local vec = {x=dir.x*velocity,y=dir.y*velocity,z=dir.z*velocity} local vec = {x=dir.x*velocity,y=dir.y*velocity,z=dir.z*velocity}
local acc = {x=0, y=-9.8, z=0} local acc = {x=0, y=-9.8, z=0}
obj:setvelocity(vec) obj:setvelocity(vec)
obj:setacceleration(acc) obj:setacceleration(acc)
obj:get_luaentity().placer = placer
itemstack:take_item() itemstack:take_item()
return itemstack return itemstack
end, end,
}) })
minetest.register_entity("nssbombs:"..name.."_bomb_flying",{ minetest.register_entity(name.."_flying",{
textures = {def.textures}, textures = {def.textures},
hp_max = 50, hp_max = 50,
placer = nil,
collisionbox = {-0.1,-0.1,-0.1, 0.1,0.1,0.1}, collisionbox = {-0.1,-0.1,-0.1, 0.1,0.1,0.1},
visual_size = def.visual_size or {x=1, y=1}, visual_size = def.visual_size or {x=1, y=1},
explosion = def.explosion or {}, explosion = def.explosion or {},
@ -31,13 +36,17 @@ function nssbombs:register_throwitem(name, descr, def)
if def.hit_node then if def.hit_node then
def.hit_node(self, pos) def.hit_node(self, pos)
else else
default_hit_node(self, self.explosion, vec) if self.explosion then
default_hit_node(self, self.explosion)
else
minetest.chat_send_player(self.placer, "No hit_node function defined")
end
end end
self.object:remove() self.object:remove()
end end
end, end,
}) })
local recepy
if def.recipe_block then if def.recipe_block then
recepy = { recepy = {
{def.recipe_block, def.recipe_block, def.recipe_block}, {def.recipe_block, def.recipe_block, def.recipe_block},
@ -48,13 +57,14 @@ function nssbombs:register_throwitem(name, descr, def)
local number = def.recipe_number or 1 local number = def.recipe_number or 1
minetest.register_craft({ minetest.register_craft({
output = "nssbombs:"..name.."_bomb "..number, output = name.." "..number,
type = def.recipe_type or nil,
recipe = def.recipe or recepy recipe = def.recipe or recepy
}) })
end end
function perpendicular_vector(vec) --returns a vector rotated of 90° in 2D function perpendicular_vector(vec) --returns a vector rotated of 90° in 2D (x and z directions)
local ang = math.pi/2 local ang = math.pi/2
local c = math.cos(ang) local c = math.cos(ang)
local s = math.sin(ang) local s = math.sin(ang)
@ -79,10 +89,6 @@ function default_hit_node(self, explosion)
center = {x=p.x, y=p.y+radius, z=p.z} center = {x=p.x, y=p.y+radius, z=p.z}
end end
if particles then
add_effects(center, radius, block)
end
if shape == "cube" then if shape == "cube" then
for dx = -radius,radius do for dx = -radius,radius do
for dy = 0,2*radius do for dy = 0,2*radius do
@ -94,6 +100,17 @@ function default_hit_node(self, explosion)
end end
end end
end end
elseif shape == "pool" then
for dx = -radius,radius do
for dy = -1,0 do
for dz = -radius,radius do
local pos1 = {x = p.x+dx, y=p.y+dy, z=p.z+dz}
if not minetest.is_protected(pos1, "") or not minetest.get_item_group(minetest.get_node(pos1).name, "unbreakable") == 1 then
minetest.set_node(pos1, {name=block})
end
end
end
end
elseif shape == "sphere" then elseif shape == "sphere" then
for dx = -radius,radius do for dx = -radius,radius do
for dy = 0,2*radius do for dy = 0,2*radius do
@ -107,12 +124,40 @@ function default_hit_node(self, explosion)
end end
end end
end end
elseif shape == "sphere_shell" then
for dx = -radius,radius do
for dy = 0,2*radius do
for dz = -radius,radius do
local pos1 = {x = p.x+dx, y=p.y+dy, z=p.z+dz}
if round(math.abs(vector.length(vector.subtract(pos1,center)))) == radius then
if not minetest.is_protected(pos1, "") or not minetest.get_item_group(minetest.get_node(pos1).name, "unbreakable") == 1 then
minetest.set_node(pos1, {name=block})
end
end
end
end
end
elseif shape == "cubic_shell" then
local y = p.y + radius
for dx = -radius,radius do
for dy = -radius,radius do
for dz = -radius,radius do
local pos1 = {x = p.x+dx, y=y+dy, z=p.z+dz}
if ((math.abs(dz)==radius)or(math.abs(dx)==radius)or(math.abs(dy)==radius)) then
--if math.abs(vector.length(vector.subtract(pos1,center))) == radius then
if not minetest.is_protected(pos1, "") or not minetest.get_item_group(minetest.get_node(pos1).name, "unbreakable") == 1 then
minetest.set_node(pos1, {name=block})
end
end
end
end
end
elseif shape == "column" then elseif shape == "column" then
local base_side = 1 local base_side = 0
if round(radius/4) > 1 then if round(radius/4) > 1 then
base_side = round(radius/4) base_side = round(radius/4)
end end
local height = 2*radius local height = radius
for dx = -base_side,base_side do for dx = -base_side,base_side do
for dy = 0,height do for dy = 0,height do
for dz = -base_side,base_side do for dz = -base_side,base_side do
@ -126,11 +171,13 @@ function default_hit_node(self, explosion)
elseif shape == "circle" then elseif shape == "circle" then
center = {x=p.x, y=p.y+1, z=p.z} center = {x=p.x, y=p.y+1, z=p.z}
for dx = -radius,radius do for dx = -radius,radius do
for dz = -radius,radius do for dy = 0, 1 do
local pos1 = {x = p.x+dx, y=p.y+1, z=p.z+dz} for dz = -radius,radius do
if round(math.abs(vector.length(vector.subtract(pos1,center)))) == radius then local pos1 = {x = p.x+dx, y=p.y+1+dy, z=p.z+dz}
if not minetest.is_protected(pos1, "") or not minetest.get_item_group(minetest.get_node(pos1).name, "unbreakable") == 1 then if round(math.abs(vector.length(vector.subtract(pos1,center)))) == radius then
minetest.set_node(pos1, {name=block}) if not minetest.is_protected(pos1, "") or not minetest.get_item_group(minetest.get_node(pos1).name, "unbreakable") == 1 then
minetest.set_node(pos1, {name=block})
end
end end
end end
end end
@ -151,12 +198,43 @@ function default_hit_node(self, explosion)
if not minetest.is_protected(pp, "") or not minetest.get_item_group(minetest.get_node(pp).name, "unbreakable") == 1 then if not minetest.is_protected(pp, "") or not minetest.get_item_group(minetest.get_node(pp).name, "unbreakable") == 1 then
minetest.set_node(pp, {name=block}) minetest.set_node(pp, {name=block})
end end
if radius >= 10 then
local pp2 = vector.add(pp,vec)
if not minetest.is_protected(pp2, "") or not minetest.get_item_group(minetest.get_node(pp2).name, "unbreakable") == 1 then
minetest.set_node(pp2, {name=block})
end
end
end end
p = vector.add(p,pr) p = vector.add(p,pr)
end end
elseif shape == "schematic" then elseif shape == "schematic" then
--Adds a defined schematic in the landing position of the bomb --[[
minetest.place_schematic(p, block, "0", {}, true) Adds a defined schematic in the landing position of the bomb.
If you want the schematic appear with its center in the landing pos of the bomb
you have to specify the dimensione of the base of the schematic using
explosion.radius parameter
--]]
if radius then
center = {x = p.x - radius/2, y = p.y, z = p.z - radius/2}
minetest.place_schematic(center, block, "0", {}, true)
else
minetest.place_schematic(p, block, "0", {}, true)
end
elseif shape == "add_entity" then
--[[
Adds an entity in the landing position.
In this case block contains the name of the entity
to be added.
]]
minetest.add_entity(p, block)
elseif shape == "tnt_explosion" then
tnt.boom(p, {damage_radius=radius,radius=radius,ignore_protection=false})
end
if particles and block and center and not shape == "tnt_explosion" then
add_effects(center, radius, block)
end end
end end

View File

@ -1,20 +1,34 @@
--Ice bomb --Stone Wall bomb
nssbombs:register_throwitem("ice", "Ice Bomb", { nssbombs:register_throwitem("nssbombs:stone_wall_bomb", "Stone Wall Bomb", {
textures = "ice_bomb.png",
recipe_number = 8,
recipe_block = "default:cobble",
explosion = {
shape = "wall",
radius = 10,
block = "default:stone",
particles = true,
},
})
--Cubic Ice Shell bomb
nssbombs:register_throwitem("nssbombs:ice_bomb", "Cubic Ice Shell bomb", {
textures = "ice_bomb.png", textures = "ice_bomb.png",
recipe_number = 8, recipe_number = 8,
recipe_block = "default:ice", recipe_block = "default:ice",
explosion = { explosion = {
shape = "wall", shape = "cubic_shell",
radius = 20, radius = 2,
block = "default:ice", block = "default:ice",
particles = true, particles = true,
}, },
}) })
--Fire bomb --Fire Circle bomb
nssbombs:register_throwitem("fire", "Fire Bomb", { nssbombs:register_throwitem("nssbombs:fire_bomb", "Fire Bomb", {
textures = "fire_bomb.png", textures = "fire_bomb.png",
recipe_block = "bucket:lava_bucket", recipe_block = "fire:flint_and_steel",
recipe_number = 4,
explosion = { explosion = {
shape = "circle", shape = "circle",
radius = 6, radius = 6,
@ -23,15 +37,41 @@ nssbombs:register_throwitem("fire", "Fire Bomb", {
}, },
}) })
--Schematic bomb --Lava pool
nssbombs:register_throwitem("schematic", "Schematic Bomb", { nssbombs:register_throwitem("nssbombs:lava_bomb", "Lava Bomb", {
textures = "fire_bomb.png", textures = "lava_bomb.png",
recipe_block = "bucket:lava_bucket",
recipe_number = 3,
explosion = {
shape = "pool",
radius = 2,
block = "default:lava_source",
particles = false,
}
})
--Water column
nssbombs:register_throwitem("nssbombs:water_column_bomb", "Water Colun Bomb", {
textures = "water_column_bomb.png",
recipe_block = "bucket:water_bucket", recipe_block = "bucket:water_bucket",
recipe_number = 6,
explosion = {
shape = "column",
radius = 5,
block = "default:water_source",
particles = false,
}
})
--Schematic bomb
nssbombs:register_throwitem("nssbombs:schematic_bomb", "Schematic Bomb", {
textures = "fire_bomb.png",
recipe_block = "bucket:empty_bucket",
explosion = { explosion = {
shape = "schematic", shape = "schematic",
--radius = 5, radius = 9,
block = minetest.get_modpath("nssb").."/schems/piccoghiaccio.mts", block = minetest.get_modpath("nssbombs").."/schems/simple_house.mts",
--particles = true, particles = true,
}, },
}) })

View File

@ -1 +1,3 @@
tnt tnt
bucket
fire

BIN
schems/simple_house.mts Normal file

Binary file not shown.

BIN
textures/boom_bomb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 867 B

BIN
textures/cage_bomb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 928 B

BIN
textures/cobweb_bomb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 871 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 739 B

BIN
textures/evocation_bomb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 620 B

BIN
textures/fire_ring_bomb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 944 B

BIN
textures/food_bomb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 884 B

BIN
textures/hole_bomb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 742 B

BIN
textures/kaboom_bomb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 837 B

BIN
textures/lava_bomb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 885 B

BIN
textures/mantis_bomb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 854 B

BIN
textures/mornar_bomb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 942 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 915 B

BIN
textures/poison_bomb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 834 B

BIN
textures/smoke_bomb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 870 B

BIN
textures/stone_bomb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 B

BIN
textures/teleport_bomb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 872 B

BIN
textures/thick_web_bomb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 777 B

BIN
textures/water_bomb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 885 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 865 B