328 lines
9.4 KiB
Lua
328 lines
9.4 KiB
Lua
--Molotov Cocktail_[rev002]
|
|
--base code is from throwing enhanced and potions mods
|
|
|
|
local MOD_NAME = minetest.get_current_modname()
|
|
local MOD_PATH = minetest.get_modpath(MOD_NAME)
|
|
local Vec3 = dofile(MOD_PATH.."/lib/Vec3_1-0.lua")
|
|
|
|
more_fire = {}
|
|
|
|
minetest.register_craftitem("more_fire:molotov_cocktail", {
|
|
description = "Molotov Cocktail",
|
|
inventory_image = "more_fire_molotov_cocktail.png",
|
|
on_place = function(itemstack, user, pointed_thing)
|
|
itemstack:take_item()
|
|
minetest.sound_play("more_fire_shatter", {gain = 1.0})
|
|
n = minetest.env:get_node(pointed_thing)
|
|
if pointed_thing.type == "node" then
|
|
minetest.env:add_node(pointed_thing.above, {name="more_fire:napalm"})
|
|
minetest.sound_play("more_fire_ignite", {pos,pos})
|
|
end
|
|
--Shattered glass Particles
|
|
minetest.add_particlespawner(40, 0.1,
|
|
pointed_thing.above, pointed_thing.above,
|
|
{x=2, y=0.2, z=2}, {x=-2, y=0.5, z=-2},
|
|
{x=0, y=-6, z=0}, {x=0, y=-10, z=0},
|
|
0.5, 2,
|
|
0.2, 5,
|
|
true, "more_fire_shatter.png")
|
|
--fire ember particles
|
|
minetest.add_particlespawner(100, 0.1,
|
|
pointed_thing.above, pointed_thing.above,
|
|
{x=-2, y=0.5, z=-2}, {x=2, y=0.5, z=2},
|
|
{x=0, y=-10, z=0}, {x=0, y=-6, z=0},
|
|
2, 3,
|
|
0.25, 0.5,
|
|
true, "more_fire_spark.png")
|
|
local dir = Vec3(user:get_look_dir()) *20
|
|
minetest.add_particle(
|
|
{x=user:getpos().x, y=user:getpos().y+1.5, z=user:getpos().z}, {x=dir.x, y=dir.y, z=dir.z}, {x=0, y=-10, z=0}, 0.2,
|
|
6, false, "more_fire_molotov_cocktail.png")
|
|
return itemstack
|
|
end,
|
|
})
|
|
|
|
local function throw_cocktail(item, player)
|
|
local playerpos = player:getpos()
|
|
local obj = minetest.add_entity({x=playerpos.x,y=playerpos.y+1.625,z=playerpos.z}, "more_fire:molotov_entity")
|
|
local dir = player:get_look_dir()
|
|
obj:setvelocity({x=dir.x*30, y=dir.y*30, z=dir.z*30})
|
|
obj:setacceleration({x=dir.x*-3, y=-dir.y^8*80-10, z=dir.z*-3})
|
|
if not minetest.setting_getbool("creative_mode") then
|
|
item:take_item()
|
|
end
|
|
return item
|
|
end
|
|
|
|
local radius = 5.0
|
|
|
|
local function add_effects(pos, radius)
|
|
minetest.add_particlespawner({
|
|
amount = 10,
|
|
time = 0.2,
|
|
minpos = vector.subtract(pos, radius / 2),
|
|
maxpos = vector.add(pos, radius / 2),
|
|
minvel = {x=-2, y=-2, z=-2},
|
|
maxvel = {x=2, y=-4, z=2},
|
|
minacc = {x=0, y=-4, z=0},
|
|
--~ maxacc = {x=-20, y=-50, z=-50},
|
|
minexptime = 1,
|
|
maxexptime = 1.5,
|
|
minsize = 1,
|
|
maxsize = 2,
|
|
texture = "more_fire_spark.png",
|
|
})
|
|
minetest.add_particlespawner({
|
|
amount = 10,
|
|
time = 0.2,
|
|
minpos = vector.subtract(pos, radius / 2),
|
|
maxpos = vector.add(pos, radius / 2),
|
|
minvel = {x=-1.25, y=-1.25, z=-1.25},
|
|
maxvel = {x=0.5, y=-4, z=0.5},
|
|
minacc = {x=1.25, y=-1.25, z=1.25},
|
|
--~ maxacc = {x=-20, y=-50, z=-50},
|
|
minexptime =1,
|
|
maxexptime = 1.5,
|
|
minsize = 1,
|
|
maxsize = 2,
|
|
texture = "more_fire_spark.png",
|
|
})
|
|
end
|
|
|
|
local function napalm(pos)
|
|
minetest.sound_play("more_fire_ignite", {pos=pos, gain=1})
|
|
minetest.set_node(pos, {name="more_fire:napalm"})
|
|
minetest.get_node_timer(pos):start(5.0)
|
|
add_effects(pos, radius)
|
|
end
|
|
|
|
local MORE_FIRE_MOLOTOV_ENTITY = {
|
|
timer=0,
|
|
collisionbox = {0,0,0,0,0,0},
|
|
physical = false,
|
|
textures = {"more_fire_molotov_cocktail.png"},
|
|
lastpos={},
|
|
}
|
|
|
|
MORE_FIRE_MOLOTOV_ENTITY.on_step = function(self, dtime)
|
|
self.timer = self.timer + dtime
|
|
local pos = self.object:getpos()
|
|
local node = minetest.get_node(pos)
|
|
minetest.add_particlespawner({
|
|
amount = 10,
|
|
time = 0.5,
|
|
minpos = pos,
|
|
maxpos = pos,
|
|
minvel = {x=-0, y=0, z=-0.5},
|
|
maxvel = {x=0, y=0, z=-0.75},
|
|
minacc = vector.new(),
|
|
maxacc = vector.new(),
|
|
minexptime = 0.5,
|
|
maxexptime = 1,
|
|
minsize = 0.25,
|
|
maxsize = 0.5,
|
|
texture = "more_fire_smoke.png",
|
|
})
|
|
minetest.add_particlespawner({
|
|
amount = 100,
|
|
time = 0.25,
|
|
minpos = pos,
|
|
maxpos = pos,
|
|
minvel = {x=-0, y=0, z=-0.5},
|
|
maxvel = {x=0, y=0, z=-0.75},
|
|
minacc = {x=0, y=0, z=-0.75},
|
|
maxacc = {x=-0, y=0, z=-0.5},
|
|
minexptime = 0.25,
|
|
maxexptime = 0.5,
|
|
minsize = 0.5,
|
|
maxsize = 0.75,
|
|
texture = "more_fire_spark.png",
|
|
})
|
|
if self.timer>0.2 then
|
|
local objs = minetest.env:get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 1)
|
|
for k, obj in pairs(objs) do
|
|
if obj:get_luaentity() ~= nil then
|
|
if obj:get_luaentity().name ~= "more_fire:molotov_entity" and obj:get_luaentity().name ~= "__builtin:item" then
|
|
if self.node ~= "" then
|
|
minetest.sound_play("more_fire_shatter", {gain = 1.0})
|
|
for dx=-3,3 do
|
|
for dy=-3,3 do
|
|
for dz=-3,3 do
|
|
local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
|
|
local n = minetest.env:get_node(pos).name
|
|
if minetest.registered_nodes[n].groups.flammable or math.random(1, 100) <= 20 then
|
|
minetest.sound_play("more_fire_ignite", {pos = self.lastpos})
|
|
minetest.env:set_node(p, {name="more_fire:napalm"})
|
|
else
|
|
--minetest.env:remove_node(p)
|
|
minetest.sound_play("more_fire_ignite", {pos = self.lastpos})
|
|
minetest.env:set_node(p, {name="fire:basic_flame"})
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
self.object:remove()
|
|
end
|
|
else
|
|
if self.node ~= "" then
|
|
minetest.sound_play("more_fire_shatter", {gain = 1.0})
|
|
for dx=-2,2 do
|
|
for dy=-2,2 do
|
|
for dz=-2,2 do
|
|
local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
|
|
local n = minetest.env:get_node(pos).name
|
|
if minetest.registered_nodes[n].groups.flammable or math.random(1, 100) <= 20 then
|
|
minetest.sound_play("more_fire_ignite", {pos = self.lastpos})
|
|
minetest.env:set_node(p, {name="more_fire:napalm"})
|
|
else
|
|
--minetest.env:remove_node(p)
|
|
minetest.sound_play("more_fire_ignite", {pos = self.lastpos})
|
|
minetest.env:set_node(p, {name="fire:basic_flame"})
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
self.object:remove()
|
|
end
|
|
end
|
|
end
|
|
|
|
if self.lastpos.x~=nil then
|
|
if node.name ~= "air" then
|
|
if self.node ~= "" then
|
|
minetest.sound_play("more_fire_shatter", {gain = 1.0})
|
|
for dx=-1,1 do
|
|
for dy=-1,1 do
|
|
for dz=-1,1 do
|
|
local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz}
|
|
local n = minetest.env:get_node(pos).name
|
|
if minetest.registered_nodes[n].groups.flammable or math.random(1, 100) <= 20 then
|
|
minetest.sound_play("more_fire_ignite", {pos = self.lastpos})
|
|
minetest.env:set_node(p, {name="more_fire:napalm"})
|
|
else
|
|
--minetest.env:remove_node(p)
|
|
minetest.sound_play("more_fire_ignite", {pos = self.lastpos})
|
|
minetest.env:set_node(p, {name="fire:basic_flame"})
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
self.object:remove()
|
|
napalm(self.lastpos)
|
|
end
|
|
end
|
|
self.lastpos={x=pos.x, y=pos.y, z=pos.z}
|
|
end
|
|
|
|
minetest.register_entity("more_fire:molotov_entity", MORE_FIRE_MOLOTOV_ENTITY)
|
|
|
|
minetest.override_item("more_fire:molotov_cocktail", {on_use = throw_cocktail})
|
|
|
|
minetest.register_node("more_fire:napalm", {
|
|
drawtype = "firelike",
|
|
tiles = {{
|
|
name="fire_basic_flame_animated.png",
|
|
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1},
|
|
}},
|
|
inventory_image = "fire_basic_flame.png",
|
|
light_source = 14,
|
|
groups = {igniter=1,dig_immediate=3, not_in_creative_inventory =1, not_in_craft_guide=1},
|
|
drop = '',
|
|
walkable = false,
|
|
buildable_to = true,
|
|
damage_per_second = 4,
|
|
})
|
|
|
|
minetest.register_abm({
|
|
nodenames={"more_fire:napalm"},
|
|
neighbors={"air"},
|
|
interval = 1,
|
|
chance = 1,
|
|
action = function(pos,node,active_object_count,active_object_count_wider)
|
|
minetest.add_particlespawner(200, 3,
|
|
pos, pos,
|
|
{x=2, y=-0.2, z=2}, {x=-2, y=-0.5, z=-2},
|
|
{x=0, y=-6, z=0}, {x=0, y=-10, z=0},
|
|
2, 6,
|
|
0.05, 0.5,
|
|
false, "more_fire_spark.png")
|
|
minetest.add_particlespawner(20, 2,
|
|
pos, pos,
|
|
{x=-2, y=2, z=-2}, {x=1, y=3, z=1},
|
|
{x=0, y=6, z=0}, {x=0, y=2, z=0},
|
|
1, 3,
|
|
3, 5,
|
|
false, "more_fire_smoke.png")
|
|
minetest.add_particlespawner(10, 4,
|
|
pos, pos,
|
|
{x=0, y= 3, z=0}, {x=0, y=5, z=0},
|
|
{x=0.1, y=0.5, z=-0.1}, {x=-0.2, y=2, z=0.2},
|
|
1, 3,
|
|
1, 3,
|
|
false, "more_fire_smoke.png")
|
|
local r = 0-- Radius for destroying
|
|
for x = pos.x-r, pos.x+r, 1 do
|
|
for y = pos.y-r, pos.y+r, 1 do
|
|
for z = pos.z-r, pos.z+r, 1 do
|
|
local cpos = {x=x,y=y,z=z}
|
|
if minetest.env:get_node(cpos).name == "more_fire:napalm" then
|
|
minetest.env:set_node(cpos,{name="fire:basic_flame"})
|
|
end
|
|
if math.random(0,1) == 1
|
|
or minetest.env:get_node(cpos).name == "more_fire:napalm"
|
|
then
|
|
minetest.env:remove_node(cpos)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end,
|
|
})
|
|
|
|
minetest.register_abm({
|
|
nodenames={"fire:basic_flame"},
|
|
neighbors={"air"},
|
|
interval = 1,
|
|
chance = 2,
|
|
action = function(pos, node)
|
|
if
|
|
minetest.get_node({x=pos.x, y=pos.y+1.0, z=pos.z}).name == "air" and
|
|
minetest.get_node({x=pos.x, y=pos.y+2.0, z=pos.z}).name == "air"
|
|
then
|
|
minetest.add_particlespawner(30, 2,
|
|
pos, pos,
|
|
{x=-2, y=2, z=-2}, {x=1, y=3, z=1},
|
|
{x=0, y=6, z=0}, {x=0, y=2, z=0},
|
|
1, 3,
|
|
10, 20,
|
|
false, "more_fire_smoke.png")
|
|
minetest.add_particlespawner(15, 4,
|
|
pos, pos,
|
|
{x=0, y= 3, z=0}, {x=0, y=5, z=0},
|
|
{x=0.1, y=0.5, z=-0.1}, {x=-0.2, y=2, z=0.2},
|
|
1, 3,
|
|
5, 10,
|
|
false, "more_fire_smoke.png")
|
|
end
|
|
end
|
|
})
|
|
|
|
--crafting recipes
|
|
minetest.register_craft( {
|
|
output = 'more_fire:molotov_cocktail',
|
|
recipe = {
|
|
{'farming:cotton'},
|
|
{'more_fire:oil'},
|
|
{'vessels:glass_bottle'},
|
|
}
|
|
})
|
|
|
|
-- fuel recipes
|
|
minetest.register_craft({
|
|
type = 'fuel',
|
|
recipe = 'more_fire:molotov_cocktail',
|
|
burntime = 5,
|
|
}) |