490 lines
16 KiB
Lua
490 lines
16 KiB
Lua
minetest.register_craft({
|
|
output = "aliveai_threats:secam_off",
|
|
recipe = {
|
|
{"default:steel_ingot", "dye:black", "default:steel_ingot"},
|
|
{"default:glass", "default:steel_ingot", "default:glass"},
|
|
{"default:steel_ingot", "dye:black", "default:steel_ingot"},
|
|
}
|
|
})
|
|
minetest.register_craft({
|
|
output = "aliveai_threats:landmine 2",
|
|
recipe = {
|
|
{"","default:coal_lump",""},
|
|
{"default:steel_ingot","default:mese_crystal_fragment",""},
|
|
{"","default:steel_ingot",""},
|
|
}
|
|
})
|
|
minetest.register_craft({
|
|
output = "aliveai_threats:timed_bumb 2",
|
|
recipe = {
|
|
{"default:steel_ingot","default:coal_lump","default:steel_ingot"},
|
|
{"default:steel_ingot","default:mese_crystal_fragment","default:steel_ingot"},
|
|
{"","default:coal_lump",""},
|
|
}
|
|
})
|
|
minetest.register_craft({
|
|
output = "aliveai_threats:timed_nitrobumb 4",
|
|
recipe = {
|
|
{"default:steel_ingot","default:coal_lump","default:steel_ingot"},
|
|
{"default:steel_ingot","default:mese_crystal_fragment","default:steel_ingot"},
|
|
{"default:ice","default:coal_lump","default:ice"},
|
|
}
|
|
})
|
|
minetest.register_craft({
|
|
output = "aliveai_threats:timed_cleaning_bomb",
|
|
recipe = {
|
|
{"default:steel_ingot","default:coal_lump","default:steel_ingot"},
|
|
{"default:steel_ingot","default:mese_crystal_fragment","default:steel_ingot"},
|
|
{"group:tree","default:coal_lump","group:tree"},
|
|
}
|
|
})
|
|
|
|
minetest.register_node("aliveai_threats:secam_off", {
|
|
description = "Security cam",
|
|
tiles = {"aliveai_threats_cam2.png"},
|
|
drawtype = "nodebox",
|
|
walkable=false,
|
|
groups = {dig_immediate = 3},
|
|
sounds = default.node_sound_glass_defaults(),
|
|
is_ground_content = false,
|
|
paramtype = "light",
|
|
paramtype2 = "facedir",
|
|
node_box = {type="fixed",
|
|
fixed={ {-0.2, -0.5, -0.2, 0.2, -0.4, 0.2},
|
|
{-0.1, -0.2, -0.1, 0.1, -0.4, 0.1}}
|
|
|
|
},
|
|
on_place = minetest.rotate_node,
|
|
on_construct = function(pos)
|
|
minetest.get_meta(pos):set_string("infotext","click to activate and secure")
|
|
end,
|
|
on_rightclick = function(pos, node, player, itemstack, pointed_thing)
|
|
minetest.set_node(pos, {name ="aliveai_threats:secam", param1 = node.param1, param2 = node.param2})
|
|
minetest.get_meta(pos):set_string("team",aliveai.team(player))
|
|
minetest.get_node_timer(pos):start(1)
|
|
minetest.sound_play("aliveai_threats_on", {pos=pos, gain = 1, max_hear_distance = 15})
|
|
end,
|
|
})
|
|
|
|
minetest.register_node("aliveai_threats:secam", {
|
|
description = "Security cam",
|
|
tiles = {
|
|
{
|
|
name = "aliveai_threats_cam1.png",
|
|
animation = {
|
|
type = "vertical_frames",
|
|
aspect_w = 16,
|
|
aspect_h = 16,
|
|
length = 3.0,
|
|
},
|
|
},
|
|
},
|
|
drawtype = "nodebox",
|
|
walkable=false,
|
|
groups = {dig_immediate = 3,stone=1,not_in_creative_inventory=1},
|
|
sounds = default.node_sound_glass_defaults(),
|
|
is_ground_content = false,
|
|
paramtype = "light",
|
|
paramtype2 = "facedir",
|
|
drop="aliveai_threats:secam_off",
|
|
node_box = {type="fixed",
|
|
fixed={ {-0.2, -0.5, -0.2, 0.2, -0.4, 0.2},
|
|
{-0.1, -0.2, -0.1, 0.1, -0.4, 0.1}}
|
|
},
|
|
on_timer=function(pos, elapsed)
|
|
local t=minetest.get_meta(pos):get_string("team")
|
|
for i, ob in pairs(minetest.get_objects_inside_radius(pos, 15)) do
|
|
local te=aliveai.team(ob)
|
|
if te~="" and te~="animal" and te~=t and aliveai.visiable(pos,ob:get_pos()) then
|
|
local v=ob:get_pos()
|
|
local s={x=(v.x-pos.x)*3,y=(v.y-pos.y)*3,z=(v.z-pos.z)*3}
|
|
local m=minetest.add_entity(pos, "aliveai_threats:bullet1")
|
|
m:set_velocity(s)
|
|
m:set_acceleration(s)
|
|
minetest.sound_play("aliveai_threats_bullet1", {pos=pos, gain = 1, max_hear_distance = 15})
|
|
minetest.after((math.random(1,9)*0.1), function(pos,s)
|
|
local m=minetest.add_entity(pos, "aliveai_threats:bullet1")
|
|
m:get_luaentity().team=t
|
|
m:set_velocity(s)
|
|
m:set_acceleration(s)
|
|
minetest.sound_play("aliveai_threats_bullet1", {pos=pos, gain = 1, max_hear_distance = 15})
|
|
end, pos,s)
|
|
return true
|
|
end
|
|
end
|
|
return true
|
|
end,
|
|
})
|
|
|
|
minetest.register_entity("aliveai_threats:bullet1",{
|
|
hp_max = 1,
|
|
physical = false,
|
|
weight = 5,
|
|
visual = "sprite",
|
|
visual_size = {x=0.1, y=0.1},
|
|
textures = {"default_mese_block.png"},
|
|
initial_sprite_basepos = {x=0, y=0},
|
|
is_visible = true,
|
|
makes_footstep_sound = false,
|
|
on_step=function(self, dtime)
|
|
local pos=self.object:get_pos()
|
|
for i, ob in pairs(minetest.get_objects_inside_radius(pos, 2)) do
|
|
local t=aliveai.team(ob)
|
|
if t~="" and t~="animal" and t~=self.team then
|
|
aliveai.punchdmg(ob,3)
|
|
self.timer=2
|
|
break
|
|
end
|
|
end
|
|
self.timer=self.timer+dtime
|
|
local n=minetest.get_node(self.object:get_pos()).name
|
|
if self.timer>1 or (n and minetest.registered_nodes[n].walkable) then aliveai.kill(self) end
|
|
end,
|
|
timer=0,
|
|
team="",
|
|
})
|
|
if aliveai_nitroglycerine then
|
|
minetest.register_node("aliveai_threats:landmine_on", {
|
|
description = "Landmine",
|
|
tiles = {"aliveai_threats_c4_controller.png"},
|
|
drawtype = "nodebox",
|
|
groups = {attached_node = 1,dig_immediate = 3,stone=1,not_in_creative_inventory=1},
|
|
sounds = default.node_sound_glass_defaults(),
|
|
is_ground_content = false,
|
|
paramtype = "light",
|
|
drop="aliveai_threats:landmine",
|
|
node_box = {type="fixed",
|
|
fixed={{-0.3, -0.7, -0.3, 0.3, -0.6, 0.3}}
|
|
},
|
|
on_blast=function(pos)
|
|
minetest.set_node(pos,{name="air"})
|
|
for i, ob in pairs(minetest.get_objects_inside_radius(pos, 2)) do
|
|
local en=ob:get_luaentity()
|
|
if en and en.aliveai then en.drop_dead_body=0 end
|
|
ob:punch(ob,1,{full_punch_interval=1,damage_groups={fleshy=250}})
|
|
end
|
|
if aliveai_nitroglycerine then
|
|
aliveai_nitroglycerine.explode(pos,{
|
|
radius=2,
|
|
set="air",
|
|
})
|
|
end
|
|
end,
|
|
on_timer=function(pos, elapsed)
|
|
for i, ob in pairs(minetest.get_objects_inside_radius(pos, 2)) do
|
|
local en=ob:get_luaentity()
|
|
if en and en.aliveai then en.drop_dead_body=0 end
|
|
ob:punch(ob,1,{full_punch_interval=1,damage_groups={fleshy=250}})
|
|
aliveai_nitroglycerine.explode(pos,{
|
|
radius=2,
|
|
set="air",
|
|
})
|
|
end
|
|
return true
|
|
end,
|
|
})
|
|
|
|
minetest.register_node("aliveai_threats:landmine", {
|
|
description = "Landmine",
|
|
tiles = {"aliveai_threats_c4_controller.png"},
|
|
drawtype = "nodebox",
|
|
groups = {attached_node = 1,dig_immediate = 3,stone=1,not_in_creative_inventory=0},
|
|
sounds = default.node_sound_glass_defaults(),
|
|
is_ground_content = false,
|
|
paramtype = "light",
|
|
node_box = {type="fixed",
|
|
fixed={{-0.3, -0.5, -0.3, 0.3, -0.4, 0.3}}
|
|
},
|
|
on_blast=function(pos)
|
|
minetest.set_node(pos,{name="air"})
|
|
for i, ob in pairs(minetest.get_objects_inside_radius(pos, 2)) do
|
|
local en=ob:get_luaentity()
|
|
if en and en.aliveai then en.drop_dead_body=0 end
|
|
ob:punch(ob,1,{full_punch_interval=1,damage_groups={fleshy=250}})
|
|
end
|
|
aliveai_nitroglycerine.explode(pos,{
|
|
radius=2,
|
|
set="air",
|
|
})
|
|
end,
|
|
on_rightclick = function(pos, node, player, itemstack, pointed_thing)
|
|
minetest.set_node(pos,{name="aliveai_threats:landmine_on"})
|
|
minetest.after(3, function(pos)
|
|
minetest.get_node_timer(pos):start(1)
|
|
minetest.sound_play("aliveai_threats_on", {pos=pos, gain = 1, max_hear_distance = 7})
|
|
end, pos)
|
|
end,
|
|
})
|
|
|
|
|
|
minetest.register_node("aliveai_threats:timed_bumb", {
|
|
description = "Timed bomb",
|
|
tiles = {"aliveai_threats_c4_controller.png"},
|
|
groups = {dig_immediate = 2,mesecon = 2,flammable = 5},
|
|
sounds = default.node_sound_wood_defaults(),
|
|
on_blast=function(pos)
|
|
minetest.set_node(pos,{name="air"})
|
|
minetest.after(0.1, function(pos)
|
|
for i, ob in pairs(minetest.get_objects_inside_radius(pos, 5)) do
|
|
local en=ob:get_luaentity()
|
|
if en and en.aliveai then en.drop_dead_body=0 end
|
|
ob:punch(ob,1,{full_punch_interval=1,damage_groups={fleshy=250}})
|
|
end
|
|
aliveai_nitroglycerine.explode(pos,{radius=5,set="air"})
|
|
end,pos)
|
|
end,
|
|
on_timer=function(pos, elapsed)
|
|
minetest.registered_nodes["aliveai_threats:timed_bumb"].on_blast(pos)
|
|
end,
|
|
on_rightclick = function(pos, node, player, itemstack, pointed_thing)
|
|
local meta=minetest.get_meta(pos)
|
|
if meta:get_int("b")==1 then return end
|
|
meta:set_int("b",1)
|
|
minetest.get_node_timer(pos):start(5)
|
|
minetest.sound_play("aliveai_threats_on", {pos=pos, gain = 1, max_hear_distance = 7})
|
|
end,
|
|
mesecons = {effector =
|
|
{action_on=function(pos)
|
|
minetest.registered_nodes["aliveai_threats:timed_bumb"].on_rightclick(pos)
|
|
end
|
|
}
|
|
},
|
|
on_burn = function(pos)
|
|
minetest.registered_nodes["aliveai_threats:timed_bumb"].on_rightclick(pos)
|
|
end,
|
|
on_ignite = function(pos, igniter)
|
|
minetest.registered_nodes["aliveai_threats:timed_bumb"].on_rightclick(pos)
|
|
end,
|
|
})
|
|
|
|
minetest.register_node("aliveai_threats:timed_nitrobumb", {
|
|
description = "Timed nitrobomb",
|
|
tiles = {"aliveai_threats_c4_controller.png^[colorize:#51ffe255"},
|
|
groups = {dig_immediate = 2,mesecon = 2,flammable = 5},
|
|
sounds = default.node_sound_wood_defaults(),
|
|
on_blast=function(pos)
|
|
minetest.set_node(pos,{name="air"})
|
|
minetest.after(0.1, function(pos)
|
|
aliveai_nitroglycerine.crush(pos)
|
|
local radius=5
|
|
aliveai_nitroglycerine.explode(pos,{
|
|
radius=radius,
|
|
hurt=0,
|
|
place={"default:snowblock","default:ice","default:snowblock"},
|
|
place_chance=2,
|
|
})
|
|
for _, ob in ipairs(minetest.get_objects_inside_radius(pos, radius*2)) do
|
|
local pos2=ob:get_pos()
|
|
local d=math.max(1,vector.distance(pos,pos2))
|
|
local dmg=(8/d)*radius
|
|
local en=ob:get_luaentity()
|
|
if ob:is_player() or not (en and en.name=="aliveai_nitroglycerine:ice" or en.aliveai_ice) then
|
|
if ob:get_hp()<=dmg+5 then
|
|
aliveai_nitroglycerine.freeze(ob)
|
|
else
|
|
ob:punch(ob,1,{full_punch_interval=1,damage_groups={fleshy=dmg}})
|
|
end
|
|
end
|
|
end
|
|
end,pos)
|
|
end,
|
|
on_timer=function(pos, elapsed)
|
|
minetest.registered_nodes["aliveai_threats:timed_nitrobumb"].on_blast(pos)
|
|
end,
|
|
on_rightclick = function(pos, node, player, itemstack, pointed_thing)
|
|
local meta=minetest.get_meta(pos)
|
|
if meta:get_int("b")==1 then return end
|
|
meta:set_int("b",1)
|
|
minetest.get_node_timer(pos):start(5)
|
|
minetest.sound_play("aliveai_threats_on", {pos=pos, gain = 1, max_hear_distance = 7})
|
|
end,
|
|
mesecons = {effector =
|
|
{action_on=function(pos)
|
|
minetest.registered_nodes["aliveai_threats:timed_nitrobumb"].on_rightclick(pos)
|
|
end
|
|
}
|
|
},
|
|
on_burn = function(pos)
|
|
minetest.registered_nodes["aliveai_threats:timed_nitrobumb"].on_rightclick(pos)
|
|
end,
|
|
on_ignite = function(pos, igniter)
|
|
minetest.registered_nodes["aliveai_threats:timed_nitrobumb"].on_rightclick(pos)
|
|
end,
|
|
})
|
|
|
|
end
|
|
|
|
if aliveai_nitroglycerine then
|
|
|
|
minetest.register_craft({
|
|
output = "aliveai_threats:secam2_off 3",
|
|
recipe = {
|
|
{"default:diamond","aliveai_threats:secam_off", "default:ice"},
|
|
}
|
|
})
|
|
|
|
minetest.register_node("aliveai_threats:secam2_off", {
|
|
description = "Nitro security cam",
|
|
tiles = {"aliveai_threats_cam2.png^[colorize:#51ffe255"},
|
|
drawtype = "nodebox",
|
|
walkable=false,
|
|
groups = {dig_immediate = 3},
|
|
sounds = default.node_sound_glass_defaults(),
|
|
is_ground_content = false,
|
|
paramtype = "light",
|
|
paramtype2 = "facedir",
|
|
node_box = {type="fixed",
|
|
fixed={ {-0.2, -0.5, -0.2, 0.2, -0.4, 0.2},
|
|
{-0.1, -0.2, -0.1, 0.1, -0.4, 0.1}}
|
|
|
|
},
|
|
on_place = minetest.rotate_node,
|
|
on_construct = function(pos)
|
|
minetest.get_meta(pos):set_string("infotext","click to activate and secure")
|
|
end,
|
|
on_rightclick = function(pos, node, player, itemstack, pointed_thing)
|
|
minetest.set_node(pos, {name ="aliveai_threats:secam2", param1 = node.param1, param2 = node.param2})
|
|
minetest.get_meta(pos):set_string("team",aliveai.team(player))
|
|
minetest.get_node_timer(pos):start(1)
|
|
minetest.sound_play("aliveai_threats_on", {pos=pos, gain = 1, max_hear_distance = 15})
|
|
end,
|
|
})
|
|
|
|
minetest.register_node("aliveai_threats:secam2", {
|
|
description = "Security cam",
|
|
tiles = {
|
|
{
|
|
name = "aliveai_threats_cam1.png^[colorize:#51ffe255",
|
|
animation = {
|
|
type = "vertical_frames",
|
|
aspect_w = 16,
|
|
aspect_h = 16,
|
|
length = 3.0,
|
|
},
|
|
},
|
|
},
|
|
drawtype = "nodebox",
|
|
walkable=false,
|
|
groups = {dig_immediate = 3,stone=1,not_in_creative_inventory=1},
|
|
sounds = default.node_sound_glass_defaults(),
|
|
is_ground_content = false,
|
|
paramtype = "light",
|
|
paramtype2 = "facedir",
|
|
drop="aliveai_threats:secam2_off",
|
|
node_box = {type="fixed",
|
|
fixed={ {-0.2, -0.5, -0.2, 0.2, -0.4, 0.2},
|
|
{-0.1, -0.2, -0.1, 0.1, -0.4, 0.1}}
|
|
},
|
|
on_timer=function(pos, elapsed)
|
|
local t=minetest.get_meta(pos):get_string("team")
|
|
for i, ob in pairs(minetest.get_objects_inside_radius(pos, 15)) do
|
|
local te=aliveai.team(ob)
|
|
if te~="" and te~="animal" and te~=t and aliveai.visiable(pos,ob:get_pos()) then
|
|
local v=ob:get_pos()
|
|
local s={x=(v.x-pos.x)*3,y=(v.y-pos.y)*3,z=(v.z-pos.z)*3}
|
|
local m=minetest.add_entity(pos, "aliveai_threats:bullet2")
|
|
m:get_luaentity().team=t
|
|
m:set_velocity(s)
|
|
m:set_acceleration(s)
|
|
minetest.sound_play("aliveai_threats_bullet1", {pos=pos, gain = 1, max_hear_distance = 15})
|
|
return true
|
|
end
|
|
end
|
|
return true
|
|
end,
|
|
})
|
|
|
|
minetest.register_entity("aliveai_threats:bullet2",{
|
|
hp_max = 1,
|
|
physical = false,
|
|
weight = 5,
|
|
visual = "sprite",
|
|
visual_size = {x=0.1, y=0.1},
|
|
textures = {"default_mese_block.png^[colorize:#51ffe2ff"},
|
|
initial_sprite_basepos = {x=0, y=0},
|
|
is_visible = true,
|
|
makes_footstep_sound = false,
|
|
automatic_rotate = false,
|
|
on_step=function(self, dtime)
|
|
local pos=self.object:get_pos()
|
|
for i, ob in pairs(minetest.get_objects_inside_radius(pos, 2)) do
|
|
local t=aliveai.team(ob)
|
|
if t~="" and t~="animal" and t~=self.team then
|
|
if aliveai.gethp(ob)<=5 then
|
|
if ob:get_luaentity() then ob:get_luaentity().destroy=1 end
|
|
minetest.after(0.1, function(ob)
|
|
aliveai_nitroglycerine.freeze(ob)
|
|
end,ob)
|
|
else
|
|
aliveai.punchdmg(ob,5)
|
|
end
|
|
self.timer=2
|
|
break
|
|
end
|
|
|
|
end
|
|
self.timer=self.timer+dtime
|
|
local n=minetest.get_node(self.object:get_pos()).name
|
|
if self.timer>1 or (n and minetest.registered_nodes[n].walkable) then aliveai.kill(self) end
|
|
end,
|
|
timer=0,
|
|
team=""
|
|
})
|
|
|
|
minetest.register_node("aliveai_threats:timed_cleaning_bomb", {
|
|
description = "Timed cleaning bomb",
|
|
tiles = {"aliveai_threats_c4_controller.png^[colorize:#00550055"},
|
|
groups = {dig_immediate = 2,mesecon = 2,flammable = 5},
|
|
sounds = default.node_sound_wood_defaults(),
|
|
on_blast=function(pos)
|
|
local newp={}
|
|
for x=-20,20,1 do
|
|
for y=-20,20,1 do
|
|
for z=-20,20,1 do
|
|
local p={x=pos.x+x,y=pos.y+y,z=pos.z+z,}
|
|
if minetest.is_protected(p,"") then
|
|
return
|
|
elseif minetest.get_node(p).name=="aliveai_threats:timed_cleaning_bomb" then
|
|
table.insert(newp,p)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
minetest.sound_play("aliveai_nitroglycerine_explode", {pos=pos, gain = 0.5, max_hear_distance = 50})
|
|
minetest.remove_node(pos)
|
|
local p1=vector.add(pos,-1)
|
|
local p2=vector.add(pos,1)
|
|
minetest.delete_area(p1, p2)
|
|
local t=0
|
|
for i, v in pairs(newp) do
|
|
t=t+0.1
|
|
minetest.after(t, function(newp)
|
|
minetest.registered_nodes["aliveai_threats:timed_cleaning_bomb"].on_blast(v)
|
|
end, newp)
|
|
end
|
|
end,
|
|
on_timer=function(pos, elapsed)
|
|
minetest.registered_nodes["aliveai_threats:timed_cleaning_bomb"].on_blast(pos)
|
|
end,
|
|
on_rightclick = function(pos, node, player, itemstack, pointed_thing)
|
|
local meta=minetest.get_meta(pos)
|
|
if meta:get_int("b")==1 then return end
|
|
meta:set_int("b",1)
|
|
minetest.get_node_timer(pos):start(5)
|
|
minetest.sound_play("aliveai_threats_on", {pos=pos, gain = 1, max_hear_distance = 7})
|
|
end,
|
|
mesecons = {effector =
|
|
{action_on=function(pos)
|
|
minetest.registered_nodes["aliveai_threats:timed_cleaning_bomb"].on_rightclick(pos)
|
|
end
|
|
}
|
|
},
|
|
on_burn = function(pos)
|
|
minetest.registered_nodes["aliveai_threats:timed_cleaning_bomb"].on_rightclick(pos)
|
|
end,
|
|
on_ignite = function(pos, igniter)
|
|
minetest.registered_nodes["aliveai_threats:timed_cleaning_bomb"].on_rightclick(pos)
|
|
end,
|
|
})
|
|
end
|