InsaneProtestor/mods/ip_more_fire/pipebomb.lua

139 lines
3.9 KiB
Lua
Raw Normal View History

2022-11-21 22:12:22 +01:00
--Pipe Bomb
--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')
local playerWhoThrewObject = minetest.get_player_by_name("singleplayer")
2022-11-24 06:51:57 +01:00
minetest.register_craftitem(':more_fire:pipebomb', {
2022-11-21 22:12:22 +01:00
description = 'Pipe Bomb',
inventory_image = 'more_fire_pipebomb.png',
2022-11-21 22:12:22 +01:00
})
local function throw_pipebomb(item, player)
local playerpos = player:getpos()
local obj = minetest.add_entity({x = playerpos.x, y = playerpos.y + 1.625, z = playerpos.z}, 'more_fire:pipebomb_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})
item:take_item()
playerWhoThrewObject = player
return item
end
local function add_effects(pos)
minetest.add_particlespawner({
amount = 200,
time = 0.1,
minpos = vector.subtract(pos, 5 / 3),
maxpos = vector.add(pos, 5 / 3),
minvel = {x=2, y=0.2, z=2},
maxvel = {x=-2, y=-0.5, z=-2},
minacc = {x=1, y=-6, z=1},
maxacc = {x=1, y=-10, z=1},
minexptime = 1,
maxexptime = 5,
minsize = 10,
maxsize = 20,
texture = 'more_fire_smoke.png',})
minetest.add_particlespawner({
amount = 100,
time = 2,
minpos = vector.subtract(pos, 5 / 2),
maxpos = vector.add(pos, 5 / 2),
minvel = {x=0.2, y=0.2, z=0.2},
maxvel = {x=-0.2, y=0.5, z=-0.2},
minacc = {x=10, y= 2, z=10},
maxacc = {x=-10, y= 1, z=-10},
minexptime =1,
maxexptime = 3,
minsize = 5,
maxsize = 15,
texture = 'more_fire_smoke.png',})
end
local function plume(pos)
minetest.set_node(pos, {name='more_fire:plume'})
minetest.get_node_timer(pos):start(3.0)
add_effects(pos)
end
local MORE_FIRE_PIPEBOMB_ENTITY = {
timer=0,
collisionbox = {0,0,0,0,0,0},
physical = false,
textures = {'more_fire_pipebomb.png'},
lastpos={},
}
MORE_FIRE_PIPEBOMB_ENTITY.on_step = function(self, dtime)
self.timer = self.timer + dtime
local pos = self.object:getpos()
local node = minetest.get_node(pos)
if self.timer > 0.005 then
local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 2)
2022-11-21 22:12:22 +01:00
for k, obj in pairs(objs) do
if obj:get_luaentity() ~= nil then
if obj:get_luaentity().name ~= 'more_fire:pipebomb_entity' and obj:get_luaentity().name ~= '__builtin:item' then
if self.node ~= '' then
2022-11-26 19:52:38 +01:00
minetest.sound_play('tnt_explode', {gain = 1.0})
explosives.boom(pos, {radius = 5})
2022-11-21 22:12:22 +01:00
local damage = 1
obj:punch(self.object, 1.0, {
full_punch_interval=1.0,
damage_groups={fleshy=damage},
}, nil)
self.object:remove()
end
end
end
end
2022-11-21 22:12:22 +01:00
if node.name ~= 'air' then
self.object:remove()
2022-11-26 19:52:38 +01:00
minetest.sound_play('tnt_explode', {gain = 1.0})
2022-11-21 22:12:22 +01:00
explosives.boom(pos, {
owner = playerWhoThrewObject
})
minetest.add_particlespawner({
2022-11-26 19:52:38 +01:00
amount = 256,
2022-11-21 22:12:22 +01:00
time = 0.5,
minpos = {x = pos.x - 2, y = pos.y - 2, z = pos.z - 2},
maxpos = {x = pos.x + 2, y = pos.y + 2, z = pos.z + 2},
minvel = {x = -10, y = -10, z = -10},
maxvel = {x = 10, y = 10, z = 10},
minacc = vector.new(),
maxacc = vector.new(),
minexptime = 1,
maxexptime = 2.5,
2022-11-26 19:52:38 +01:00
minsize = 4,
maxsize = 7,
2022-11-21 22:12:22 +01:00
texture = "tnt_smoke.png",
})
end
2022-11-21 22:12:22 +01:00
self.lastpos={x=pos.x, y=pos.y, z=pos.z}
end
end
2022-11-24 06:51:57 +01:00
minetest.register_entity(':more_fire:pipebomb_entity', MORE_FIRE_PIPEBOMB_ENTITY)
2022-11-21 22:12:22 +01:00
minetest.override_item('more_fire:pipebomb', {on_use = throw_pipebomb})
minetest.register_craft({
output = 'more_fire:pipe_bomb',
recipe = {
{'more_fire:flintstone'},
{'more_fire:charcoal'},
{'vessels:glass_bottle'},
}
})