aliveai/aliveai_massdestruction/init.lua

1120 lines
33 KiB
Lua

minetest.register_entity("aliveai_massdestruction:bomb2",{
on_activate=function(self, staticdata)
self.object:remove()
return self
end,
})
aliveai_massdestruction={}
minetest.register_craft({
output = "aliveai_massdestruction:walking_bomb 3",
recipe = {
{"default:mese_crystal_fragment","default:coal_lump"},
}
})
minetest.register_craft({
output = "aliveai_massdestruction:timed_nuke",
recipe = {
{"default:steel_ingot","default:coalblock","default:steel_ingot"},
{"default:steel_ingot","default:mese_crystal","default:steel_ingot"},
{"","",""},
}
})
if aliveai_electric then
minetest.register_tool("aliveai_massdestruction:core", {
description = "Uranium core",
inventory_image = "aliveai_massdestruction_core.png",
range = 15,
on_use=function(itemstack, user, pointed_thing)
if user:get_luaentity() then user=user:get_luaentity() end
local typ=pointed_thing.type
local pos1=user:get_pos()
pos1.y=pos1.y+1.5
local pos2
if typ=="object" then
pos2=pointed_thing.ref:get_pos()
elseif typ=="node" then
pos2=pointed_thing.under
elseif typ=="nothing" then
local dir
if user:get_luaentity() then
if user:get_luaentity().aliveai and user:get_luaentity().fight then
local dir=aliveai.get_dir(user:get_luaentity(),user:get_luaentity().fight)
pos2={x=pos1.x+(dir.x*30),y=pos1.y+(dir.y*30),z=pos1.z+(dir.z*30)}
else
pos2=aliveai.pointat(user:get_luaentity(),30)
end
else
local dir=user:get_look_dir()
pos2={x=pos1.x+(dir.x*30),y=pos1.y+(dir.y*30),z=pos1.z+(dir.z*30)}
end
else
return itemstack
end
local d=math.floor(aliveai.distance(pos1,pos2)+0.5)
local dir={x=(pos1.x-pos2.x)/-d,y=(pos1.y-pos2.y)/-d,z=(pos1.z-pos2.z)/-d}
local p1=pos1
for i=0,d,1 do
p1={x=pos1.x+(dir.x*i),y=pos1.y+(dir.y*i),z=pos1.z+(dir.z*i)}
if minetest.registered_nodes[minetest.get_node(p1).name] and minetest.registered_nodes[minetest.get_node(p1).name].walkable then
break
end
end
if p1.x~=p1.x or p1.y~=p1.y or p1.z~=p1.z then
return itemstack
end
itemstack:add_wear(65535/10)
aliveai_massdestruction.uran_explode(p1,4)
return itemstack
end,
})
aliveai.create_bot({
description="Uranium monster, the most powerful AI/n It minds everything that's in its way\n and blasting it with its core",
drop_dead_body=0,
attack_players=1,
name="uranium",
team="nuke",
texture="aliveai_massdestruction_uranium.png",
attacking=1,
talking=0,
light=0,
building=0,
escape=0,
type="monster",
dmg=19,
hp=1000,
name_color="",
coming=0,
smartfight=0,
visual_size={x=2,y=1.5},
collisionbox={-0.7,-1.5,-0.7,0.7,1.2,0.7},
start_with_items={["default:mese_crystal"]=4,["aliveai_massdestruction:core"]=1},
spawn_on={"group:sand","group:spreading_dirt_type","default:gravel","group:stone"},
attack_chance=5,
spawn=function(self)
self.hp2=self.object:get_hp()
end,
on_load=function(self)
self.hp2=self.object:get_hp()
end,
on_step=function(self,dtime)
if math.random(1,20)==1 then
local np=minetest.find_node_near(self.object:get_pos(), 3,{"group:flammable"})
if np and not minetest.is_protected(np,"") then
minetest.set_node(np,{name="aliveai_massdestruction:fire"})
end
end
if self.fight then
if math.random(1,20)==1 and aliveai.distance(self,self.fight)>self.arm then
self.blowing=1
self.notblow=1
aliveai_nitroglycerine.explode(self.fight:get_pos(),{
radius=3,
set="air",
place={"aliveai_massdestruction:fire","aliveai_massdestruction:fire","air","air","air"}
})
self.notblow=nil
elseif math.random(1,10)==1 then
for _, ob in ipairs(minetest.get_objects_inside_radius(self.object:get_pos(), self.distance)) do
if not (aliveai.same_bot(self,ob) and aliveai.team(ob)=="nuke") then
local pos=ob:get_pos()
aliveai_electric.hit(ob,4)
local node=minetest.get_node(ob:get_pos()).name
if minetest.registered_nodes[node] and minetest.registered_nodes[node].walkable==false and not minetest.is_protected(pos,"") then
minetest.set_node(pos,{name="aliveai_massdestruction:fire"})
end
end
end
end
end
end,
on_punched=function(self,puncher,h)
if self.blowing or self.hp2-self.hp<10 then
self.object:set_hp(self.hp2)
self.hp=self.hp2
self.blowing=nil
if aliveai.team(puncher)~="nuke" then
local p=puncher:get_pos()
local node=minetest.get_node(p).name
if minetest.registered_nodes[node] and minetest.registered_nodes[node].walkable==false and not minetest.is_protected(p,"") then
minetest.set_node(p,{name="aliveai_massdestruction:fire"})
end
aliveai_electric.hit(puncher,4,4)
end
return self
end
self.hp2=self.hp
end,
on_detecting_enemy=function(self)
self.notblow=1
minetest.after(1, function(self)
self.notblow=nil
end,self)
end,
on_blow=function(self)
if self.notblow then return end
aliveai.kill(self)
self.death(self,self.object,self.object:get_pos())
end,
death=function(self)
if not self.ex then
self.ex=1
local pos=self.object:get_pos()
if not pos then return end
aliveai_massdestruction.uran_explode(pos,10,self)
minetest.set_node(pos,{name="aliveai_massdestruction:source"})
end
return self
end,
})
end
aliveai.create_bot({
description="The nuker is provoking everyone, in order to get the opportunity to trigger its explosive ability.\nThis thing will speard 50 bombs in the air to destroy its whole environment.",
drop_dead_body=0,
attack_players=1,
name="nuker",
team="nuke",
texture="aliveai_massdestruction_nuker.png",
attacking=1,
talking=0,
light=0,
building=0,
escape=0,
type="monster",
dmg=0,
hp=20,
name_color="",
arm=2,
coming=0,
smartfight=0,
spawn_on={"group:sand","group:spreading_dirt_type","default:gravel","group:stone"},
attack_chance=5,
on_fighting=function(self,target)
if not self.ti then self.ti=99 end
self.temper=1
self.ti=self.ti-1
if self.ti<0 then
self.death(self)
else
self.object:set_properties({nametag=self.ti,nametag_color="#ff0000aa"})
end
end,
on_blow=function(self)
aliveai.kill(self)
self.death(self)
end,
death=function(self)
if not self.aliveaibomb then
local pos=self.object:get_pos()
self.aliveaibomb=1
self.hp=0
self.object:punch(self.object,1,{full_punch_interval=1,damage_groups={fleshy=self.object:get_hp()*2}})
for i=1,50,1 do
minetest.add_entity({x=pos.x+math.random(-5,5),y=pos.y+math.random(2,5),z=pos.z+math.random(-5,5)}, "aliveai_massdestruction:bomb")
end
aliveai_nitroglycerine.explode(pos,{
radius=2,
set="air",
drops=0,
place={"air","air"}
})
end
return self
end,
})
minetest.register_entity("aliveai_massdestruction:bomb",{
hp_max = 9000,
physical =true,
weight = 1,
collisionbox = {-0.15,-0.15,-0.15,0.15,0.15,0.15},
visual = "sprite",
visual_size = {x=0.5,y=0.5},
textures ={"aliveai_massdestruction_bomb.png"},
colors = {},
spritediv = {x=1, y=1},
initial_sprite_basepos = {x=0, y=0},
is_visible = true,
makes_footstep_sound = false,
automatic_rotate = false,
on_activate=function(self, staticdata)
self.time2=math.random(1,20)
self.object:set_acceleration({x =0, y =-10, z =0})
self.object:set_velocity({x=math.random(-15,15),y=math.random(10,15),z=math.random(-15,15)})
return self
end,
on_step=function(self, dtime)
self.time=self.time+dtime
self.time2=self.time2-dtime
local v=self.object:get_velocity()
if self.time2>1 and v.y==0 and self.last_y<0 then
self.time2=0
self.expl=math.random(1,10)
end
if self.time<0.1 then return self end
self.last_y=v.y
self.time=0
if not self.expl then
for _, ob in ipairs(minetest.get_objects_inside_radius(self.object:get_pos(), 2)) do
local en=ob:get_luaentity()
if not (en and en.aliveaibomb) then
self.time2=-1
return self
end
end
end
if self.time2<0 then
if self.expl and math.random(1,self.expl)==1 then
aliveai_nitroglycerine.explode(self.object:get_pos(),{radius=3,set="air",drops=0,place={"air","air"}})
self.object:remove()
elseif not self.expl then
self.expl=math.random(1,10)
else
self.time2=0.5
end
end
return self
end,
time=0,
time2=10,
type="",
last_y=0,
aliveaibomb=1
})
aliveai.create_bot({
description="The walking and jumping bomb is constantly looking for targets to blast",
drop_dead_body=0,
name="walking_bomb",
team="bomb",
collisionbox = {-0.2,-0.2,-0.2,0.2,0.2,0.2},
visual = "sprite",
visual_size = {x=0.5,y=0.5},
texture ="aliveai_massdestruction_bomb.png",
light=0,
talking=0,
type="monster",
dmg=0,
hp=10,
name_color="",
spawn_on={"group:sand","default:snow"},
spawn=function(self)
self.obtimeer=0
self.aliveaibomb=1
end,
on_load=function(self)
self.obtimeer=0
self.aliveaibomb=1
end,
on_step=function(self, dtime)
self.obtimeer=self.obtimeer+0.1
self.time=0.1
if self.object:get_velocity().y==0 then
if self.fight then
local pos=self.object:get_pos()
local pos2=self.fight:get_pos()
if aliveai.visiable(pos,pos2) then
self.object:set_velocity({x=(pos.x-pos2.x)*-1,y=math.random(5,10),z=(pos.z-pos2.z)*-1})
end
else
self.object:set_velocity({x=math.random(-5,5),y=math.random(5,10),z=math.random(-5,5)})
end
local y=self.object:get_velocity().y
if y==0 or y==-0 then self.object:set_velocity({x=0,y=math.random(5,10),z=0}) end
end
if self.obtimeer<1 then return self end
self.obtimeer=0
local pos=self.object:get_pos()
local ob1
for _, ob in ipairs(minetest.get_objects_inside_radius(pos, 15)) do
local en=ob:get_luaentity()
if not (en and en.aliveaibomb) and aliveai.visiable(pos,ob:get_pos()) then ob1=ob end
if ob1 and math.random(1,3)==1 then break end
end
if not ob1 then self.fight=nil return end
local pos2=ob1:get_pos()
local vis=aliveai.visiable(pos,pos2)
if self.fight and aliveai.visiable(pos,self.fight:get_pos()) then
ob1=self.fight
pos2=self.fight:get_pos()
vis=aliveai.visiable(pos,pos2)
end
if aliveai.distance(pos,pos2)<3 and vis then
self.on_blow(self)
else
self.fight=ob1
end
return self
end,
on_blow=function(self)
aliveai.kill(self)
self.death(self)
end,
death=function(self)
if self.exp then return end
self.exp=1
aliveai_nitroglycerine.explode(self.object:get_pos(),{radius=2,set="air",place={"air","air"}})
return self
end,
})
minetest.register_craftitem("aliveai_massdestruction:walking_bomb", {
description = "Walking bomb",
inventory_image = "aliveai_massdestruction_bomb.png",
on_use=function(itemstack, user, pointed_thing)
local dir = user:get_look_dir()
local pos=user:get_pos()
local pos2={x=pos.x+(dir.x*2),y=pos.y+1.5+(dir.y*2),z=pos.z+dir.z*2}
minetest.add_entity(pos2, "aliveai_massdestruction:walking_bomb"):set_velocity({x=dir.x*10,y=dir.y*10,z=dir.z*10})
itemstack:take_item()
return itemstack
end,
})
minetest.register_node("aliveai_massdestruction:source", {
description = "Uranium source",
drawtype = "liquid",
tiles = {
{name = "aliveai_massdestruction_uran.png",
animation = {type = "vertical_frames",aspect_w = 16,aspect_h = 16,length = 2.0,},
},
},
special_tiles = {
{
name = "aliveai_massdestruction_uran.png",
animation = {type = "vertical_frames",aspect_w = 16,aspect_h = 16,length = 2.0,},
backface_culling = false,
},},
alpha = 220,
paramtype = "light",
light_source = 13,
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
is_ground_content = false,
drop = "",
drowning = 1,
liquidtype = "source",
liquid_alternative_flowing = "aliveai_massdestruction:flowing",
liquid_alternative_source = "aliveai_massdestruction:source",
liquid_viscosity = 0,
damage_per_second = 19,
post_effect_color = {a = 150, r = 150, g = 50, b = 190},
groups = {aileuran=1,igniter=1, liquid = 3, puts_out_fire = 1,not_in_creative_inventory=1},
})
minetest.register_node("aliveai_massdestruction:flowing", {
description = "Uranium flowing",
drawtype = "flowingliquid",
tiles = {"aliveai_massdestruction_uran.png"},
special_tiles = {
{
name = "aliveai_massdestruction_uran.png",
backface_culling = false,
animation = {type = "vertical_frames",aspect_w = 16,aspect_h = 16,length = 2.0}
},
{
name = "aliveai_massdestruction_uran.png",
backface_culling = true,
animation = {type = "vertical_frames",aspect_w = 16,aspect_h = 16,length = 2.0}
}
},
alpha = 190,
paramtype = "light",
light_source = 13,
paramtype2 = "flowingliquid",
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
is_ground_content = false,
drop = "",
drowning = 1,
liquidtype = "flowing",
liquid_alternative_flowing = "aliveai_massdestruction:flowing",
liquid_alternative_source = "aliveai_massdestruction:source",
liquid_viscosity = 2,
damage_per_second = 19,
post_effect_color = {a = 150, r = 150, g = 50, b = 190},
groups = {aileuran=1,igniter=1, liquid = 3, puts_out_fire = 1,not_in_creative_inventory = 1},
})
if aliveai_electric then
minetest.register_abm({
nodenames = {"group:soil","group:sand","group:flammable","group:dig_immediate","group:water","group:flowers","group:oddly_breakable_by_hand"},
neighbors = {"group:aileuran"},
interval = 10,
chance = 4,
action = function(pos)
if minetest.is_protected(pos,"")==false then
minetest.set_node(pos, {name ="aliveai_massdestruction:fire"})
end
end,
})
minetest.register_abm({
nodenames = {"aliveai_massdestruction:fire","aliveai_massdestruction:source"},
interval = 10,
chance = 4,
action = function(pos)
if minetest.is_protected(pos,"")==false then
minetest.set_node(pos, {name ="air"})
end
end,
})
minetest.register_abm({
nodenames = {"group:aileuran"},
interval = 10,
chance = 10,
action = function(pos)
if math.random(1,10)~=1 then return end
for i, ob in pairs(minetest.get_objects_inside_radius(pos, 15)) do
local node=minetest.get_node(ob:get_pos()).name
if aliveai.team(ob)~="nuke" and node~="aliveai_massdestruction:fire" and minetest.registered_nodes[node] and minetest.registered_nodes[node].walkable==false then
aliveai_electric.hit(ob,4)
minetest.set_node(ob:get_pos(), {name ="aliveai_massdestruction:fire"})
end
end
local np=minetest.find_node_near(pos,15,{"group:soil","group:sand","group:flammable","group:dig_immediate","group:flowers","group:oddly_breakable_by_hand"})
if np~=nil then
minetest.set_node(np, {name ="aliveai_massdestruction:fire"})
end
end,
})
minetest.register_node("aliveai_massdestruction:fire", {
description = "Uranium fire",
inventory_image = "fire_basic_flame.png^[colorize:#aaff00aa",
drawtype = "firelike",
tiles = {
{
name = "fire_basic_flame_animated.png^[colorize:#aaff00aa",
animation = {
type = "vertical_frames",
aspect_w = 16,
aspect_h = 16,
length = 1
},
},
},
paramtype = "light",
light_source = 13,
walkable = false,
buildable_to = true,
sunlight_propagates = true,
damage_per_second = 7,
groups = {dig_immediate = 2,igniter=1,puts_out_fire = 1},
drop="",
on_construct=function(pos)
minetest.get_node_timer(pos):start(5)
end,
on_punch=function(pos, node, puncher, pointed_thing)
local p=puncher:get_pos()
p={x=p.x,y=p.y+1,z=p.z}
local node=minetest.get_node(p).name
if minetest.registered_nodes[node] and minetest.registered_nodes[node].walkable==false then minetest.set_node(p, {name ="aliveai_massdestruction:fire"}) end
end,
on_timer=function (pos, elapsed)
for i, ob in pairs(minetest.get_objects_inside_radius(pos, 4)) do
local p=ob:get_pos()
local node=minetest.get_node(p).name
if aliveai.team(ob)~="nuke" then
if minetest.is_protected(p,"")==false and node~="aliveai_massdestruction:fire"
and minetest.registered_nodes[node] and minetest.registered_nodes[node].walkable==false then
minetest.set_node(p, {name ="aliveai_massdestruction:fire"})
end
aliveai_electric.hit(ob,4)
end
end
if math.random(3)==1 then
minetest.set_node(pos, {name ="air"})
else
minetest.sound_play("fire_small", {pos=pos, gain = 1.0, max_hear_distance = 5,})
end
return true
end
})
end
minetest.register_node("aliveai_massdestruction:nuclearbarrel", {
description = "Uranium barrel",
drawtype = "mesh",
mesh = "aliveai_massdestruction_barrel.obj",
paramtype2 = "facedir",
wield_scale = {x=1, y=1, z=1},
selection_box = {
type = "fixed",
fixed = {-0.4, -0.5, -0.4, 0.4, 0.9, 0.4}
},
collision_box = {
type = "fixed",
fixed = {{-0.4, -0.5, -0.4, 0.4, 0.9, 0.4},}},
tiles = {"default_cloud.png^[colorize:#ffee00ff^aliveai_massdestruction_log.png"},
groups = {barrel=1,cracky = 1, level = 2, not_in_creative_inventory=1},
sounds = default.node_sound_stone_defaults(),
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false,
liquids_pointable = true,
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type=="node" and minetest.is_protected(pointed_thing.under,user:get_player_name())==false then
if aliveai.def(pointed_thing.above,"buildable_to") then
local inv = user:get_inventory()
if inv:room_for_item("main", {name="aliveai_massdestruction:nuclearbarrel_empty"}) then
inv:add_item("main","aliveai_massdestruction:nuclearbarrel_empty")
minetest.set_node(pointed_thing.above,{name="aliveai_massdestruction:source"})
itemstack:take_item()
return itemstack
end
end
end
return itemstack
end,
on_blast=function(pos)
minetest.set_node(pos,{name="air"})
minetest.after(0.1, function(pos)
aliveai_massdestruction.uran_explode(pos,10)
minetest.set_node(pos,{name="aliveai_massdestruction:source"})
end,pos)
end,
mesecons = {effector =
{action_on=function(pos)
minetest.registered_nodes["aliveai_massdestruction:timed_nuke"].on_blast(pos)
end
}
},
on_burn = function(pos)
minetest.registered_nodes["aliveai_massdestruction:timed_nuke"].on_blast(pos)
end,
on_ignite = function(pos, igniter)
minetest.registered_nodes["aliveai_massdestruction:timed_nuke"].on_blast(pos)
end,
})
minetest.register_node("aliveai_massdestruction:nuclearbarrel_empty", {
description = "Uranium barrel (empty)",
drawtype = "mesh",
mesh = "aliveai_massdestruction_barrel.obj",
paramtype2 = "facedir",
wield_scale = {x=1, y=1, z=1},
selection_box = {
type = "fixed",
fixed = {-0.4, -0.5, -0.4, 0.4, 0.8, 0.4}
},
collision_box = {
type = "fixed",
fixed = {{-0.4, -0.5, -0.4, 0.4, 0.8, 0.4},}},
tiles = {"default_cloud.png^[colorize:#ffee00ff^aliveai_massdestruction_log.png"},
groups = {barrel=1,cracky = 1, level = 2, not_in_creative_inventory=1},
sounds = default.node_sound_stone_defaults(),
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false,
liquids_pointable = true,
on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type=="node" and minetest.is_protected(pointed_thing.under,user:get_player_name())==false then
if minetest.get_node(pointed_thing.under).name=="aliveai_massdestruction:source" then
local inv = user:get_inventory()
if inv:room_for_item("main", {name="aliveai_massdestruction:nuclearbarrel"}) then
minetest.set_node(pointed_thing.under,{name="air"})
inv:add_item("main","aliveai_massdestruction:nuclearbarrel")
itemstack:take_item()
return itemstack
end
end
end
return itemstack
end,
})
aliveai_massdestruction.uran_explode=function(pos,d,self)
aliveai_nitroglycerine.explode(pos,{
radius=d,
set="air",
drops=0,
place={"aliveai_massdestruction:fire","aliveai_massdestruction:fire","air","air","air"}
})
for _, ob in ipairs(minetest.get_objects_inside_radius(pos, d*2)) do
if not ((self and aliveai.same_bot(self,ob)) and aliveai.team(ob)=="nuke") then
aliveai_electric.hit(ob,4)
local node=minetest.get_node(ob:get_pos()).name
if minetest.registered_nodes[node] and minetest.registered_nodes[node].walkable==false then
minetest.set_node(pos,{name="aliveai_massdestruction:fire"})
end
end
end
end
minetest.register_node("aliveai_massdestruction:timed_nuke", {
description = "Timed nuke",
tiles = {"aliveai_massdestruction_nuke.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)
aliveai_massdestruction.uran_explode(pos,10)
minetest.set_node(pos,{name="aliveai_massdestruction:source"})
end,pos)
end,
on_timer=function(pos, elapsed)
minetest.registered_nodes["aliveai_massdestruction:timed_nuke"].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_massdestruction:timed_nuke"].on_rightclick(pos)
end
}
},
on_burn = function(pos)
minetest.registered_nodes["aliveai_massdestruction:timed_nuke"].on_rightclick(pos)
end,
on_ignite = function(pos, igniter)
minetest.registered_nodes["aliveai_massdestruction:timed_nuke"].on_rightclick(pos)
end,
})
aliveai.create_bot({
description="Blasts it self for any simple reason and creates a black hole",
drop_dead_body=0,
attack_players=1,
name="blackholebot",
team="nuke",
texture="aliveai_massdestruction_blackholebot.png",
attacking=1,
talking=0,
light=0,
building=0,
escape=0,
type="monster",
dmg=19,
hp=1000,
name_color="",
coming=0,
smartfight=0,
visual_size={x=2,y=1.5},
collisionbox={-0.7,-1.5,-0.7,0.7,1.2,0.7},
start_with_items={["aliveai_massdestruction:blackholecore"]=2},
spawn_on={"group:sand","group:spreading_dirt_type","default:gravel","default:stone"},
attack_chance=5,
spawn=function(self)
self.hp2=self.object:get_hp()
end,
on_load=function(self)
self.hp2=self.object:get_hp()
end,
on_step=function(self,dtime)
if self.fight then
self.blowing=1
aliveai_nitroglycerine.explode(self.object:get_pos(),{
radius=2,
set="air",
place={"air"}
})
minetest.add_entity(self.object:get_pos(), "aliveai_massdestruction:blackhole")
aliveai.kill(self)
end
end,
})
minetest.register_node("aliveai_massdestruction:blackholecore", {
description = "Blackhole core",
groups = {vessel = 1, not_in_creative_inventory=0,dig_immediate = 3, attached_node = 1},
tiles={"aliveai_massdestruction_blackhole.png"},
inventory_image = "aliveai_massdestruction_blackhole.png",
paramtype = "light",
is_ground_content = false,
drawtype = "plantlike",
walkable = false,
sounds = default.node_sound_glass_defaults(),
selection_box = {
type = "fixed",
fixed = {-0.27, -0.5, -0.27, 0.27, 0.2, 0.27}
},
on_use = function(itemstack, user, pointed_thing)
local pos=user:get_pos()
local dir=user:get_look_dir()
local e=minetest.add_item({x=pos.x+(dir.x*2),y=pos.y+2+(dir.y*2),z=pos.z+(dir.z*2)},"aliveai_massdestruction:blackholecore")
local vc = {x = dir.x*15, y = dir.y*15, z = dir.z*15}
e:set_velocity(vc)
e:get_luaentity().age=(tonumber(minetest.settings:get("item_entity_ttl")) or 900)-10
e:get_luaentity().on_punch=nil
e:get_luaentity().hp_max=10
table.insert(aliveai_threats.debris,{ob=e,n=user:get_player_name(),
on_hit_object=function(self,pos,ob)
self.object:remove()
pos.y=pos.y+2
minetest.add_entity(pos, "aliveai_massdestruction:blackhole")
end,
on_hit_ground=function(self,pos)
self.object:remove()
pos.y=pos.y+2
minetest.add_entity(pos, "aliveai_massdestruction:blackhole")
end
})
itemstack:take_item()
return itemstack
end,
})
minetest.register_entity("aliveai_massdestruction:blackhole",{
hp_max = 1000,
physical =false,
pointable=false,
visual = "sprite",
textures ={"aliveai_massdestruction_blackhole.png"},
visual_size={x=2,y=2},
on_activate=function(self, staticdata)
self.inv={["aliveai_massdestruction:blackholecore"]=1}
end,
on_punch=function(self, puncher, time_from_last_punch, tool_capabilities, dir)
if #self.inv==0 then
self.kill=1
self.nodrop=1
end
end,
on_step=function(self, dtime)
self.timer1=os.clock()
if self.timer2>0.5 then
self.timer2=os.clock()-self.timer1
return
end
if self.kill then
self.power=self.power-(self.power/10)
self.object:set_properties({visual_size = {x=0.2+(self.power*0.02), y=0.2+(self.power*0.02)}})
else
self.power=self.power-(self.power*0.005)
end
local pos=self.object:get_pos()
for _, ob in ipairs(minetest.get_objects_inside_radius(pos, self.power/10)) do
local en=ob:get_luaentity()
local opos=ob:get_pos()
if aliveai.visiable(pos,opos) and not (en and en.blackhole and en.power>=self.power) then
if aliveai.distance(pos,opos)<1+(self.power*0.01) then
if ob:is_player() then
aliveai.respawn_player(ob)
else
if en and en.name=="__builtin:item" and en.itemstring=="aliveai_massdestruction:blackholecore" then
self.kill=1
end
ob:remove()
end
self.power=self.power+5
else
if ob:is_player() and not ob:get_attach() then
aliveai_nitroglycerine.new_player=ob
minetest.add_entity({x=opos.x,y=opos.y+1,z=opos.z}, "aliveai_nitroglycerine:playerp"):set_velocity({x=(pos.x-opos.x)/0.1, y=((pos.y-opos.y)*1)/0.1, z=(pos.z-opos.z)/0.1})
aliveai_nitroglycerine.new_player=nil
else
ob:set_velocity({x=(pos.x-opos.x)/0.9, y=(pos.y-opos.y)/0.9, z=(pos.z-opos.z)/0.9})
end
end
end
if self.power<5 then
if self.kill and not self.nodrop then
minetest.add_item(pos,"aliveai_massdestruction:blackholecore 2")
end
self.object:remove()
end
if self.power>1000 then self.power=1000 end
self.time=self.time+dtime
if self.time>1 and self.timer2<0.01 then
self.time=0
self.object:set_properties({visual_size = {x=0.2+(self.power*0.02), y=0.2+(self.power*0.02)}})
local pick=math.floor(self.power/30)
if pick>0 then
local nodes={
"group:flora",
"group:dig_immediate",
"group:snappy",
"group:leaves",
"group:wood",
"group:oddly_breakable_by_hand",
"group:choppy",
"group:tree",
"group:sand",
"group:crumbly",
"group:soil",
"group:level",
}
local topick={}
if pick>13 then pick=13 end
for i=1,pick,1 do
table.insert(topick,nodes[i])
end
local np=minetest.find_node_near(pos, math.floor(self.power/10),topick)
if np and (minetest.is_protected(np,"") or aliveai.protected(np)) then
self.power=0
elseif np then
if not aliveai_nitroglycerine.spawn_dust(np) then
local nn=minetest.get_node(np).name
if nn and np then
local e=minetest.add_item(np, nn)
if not e then return end
e:get_luaentity().age=890
end
end
minetest.remove_node(np)
end
end
end
end
self.timer2=os.clock()-self.timer1
end,
aliveai=1,
blackhole=1,
power=100,
time=0,
timer1=0,
timer2=0,
})
minetest.register_node("aliveai_massdestruction:gass", {
description = "Gass",
inventory_image = "bubble.png",
tiles = {"aliveai_air.png"},
walkable = false,
pointable = false,
drowning = 1,
buildable_to = true,
drawtype = "glasslike",
damage_per_second = 1,
paramtype = "light",
groups = {crumbly = 1,not_in_creative_inventory=1}
})
minetest.register_node("aliveai_massdestruction:toxicdirt", {
description = "Toxic dirt",
tiles = {"default_dirt.png^[colorize:#604f20aa"},
groups = {crumbly = 3,spreading_dirt_type=1},
sounds = default.node_sound_dirt_defaults(),
on_construct = function(pos)
local meta=minetest.get_meta(pos)
meta:set_string("owner","plant")
minetest.get_node_timer(pos):start(math.random(1,10))
end,
on_timer = function (pos, elapsed)
local p={x=pos.x,y=pos.y+1,z=pos.z}
if minetest.get_node(p).name=="air" then
minetest.set_node(p,{name="aliveai_massdestruction:gass"})
end
return false
end,
})
minetest.register_node("aliveai_massdestruction:toxicwater", {
description = "Toxic water",
tiles = {"default_river_water.png^[colorize:#604f20aa"},
alpha = 200,
walkable = false,
pointable = true,
drowning = 1,
buildable_to = true,
drawtype = "glasslike",
post_effect_color = {a = 68, r =134, g = 244, b = 0},
damage_per_second = 1,
paramtype = "light",
liquid_viscosity = 15,
liquidtype = "source",
liquid_range = 0,
liquid_alternative_flowing = "aliveai_massdestruction:toxicwater",
liquid_alternative_source = "aliveai_massdestruction:toxicwater",
groups = {liquid = 4,crumbly = 1,not_in_creative_inventory=1}
})
aliveai.create_bot({
description="Pollution monster,blasts it self for any simple reason and pollute its environment",
drop_dead_body=0,
attack_players=1,
name="pollution",
team="pollution",
texture="aliveai_massdestruction_uranium.png^[colorize:#604f20aa",
attacking=1,
talking=0,
light=0,
building=0,
escape=0,
type="monster",
dmg=19,
hp=100,
name_color="",
coming=0,
smartfight=0,
visual_size={x=2,y=1.5},
collisionbox={-0.7,-1.5,-0.7,0.7,1.2,0.7},
start_with_items={["default:mese_crystal"]=4},
spawn_on={"group:sand","group:spreading_dirt_type","default:gravel"},
attack_chance=5,
on_detecting_enemy=function(self)
if self.ex then return end
self.ex=1
aliveai_massdestruction.pollutionblow(self.object:get_pos())
aliveai_nitroglycerine.explode(self.object:get_pos(),{
radius=1,
set="air",
place={"air"}
})
aliveai.kill(self)
end,
on_blow=function(self)
if self.ex then return end
self.ex=1
aliveai_nitroglycerine.explode(self.object:get_pos(),{
radius=3,
set="air",
place={"air"}
})
aliveai.kill(self)
end,
death=function(self,puncher,pos)
self.on_detecting_enemy(self)
end,
})
aliveai.create_bot({
description="The ice bomb, blasts it self for any simple reason and freezing its environment",
drop_dead_body=0,
attack_players=1,
name="icebomb",
team="ice",
texture="aliveai_threats_nitrogenblow.png",
attacking=1,
talking=0,
light=0,
building=0,
escape=0,
type="monster",
dmg=19,
hp=100,
name_color="",
coming=0,
smartfight=0,
visual_size={x=2,y=1.5},
collisionbox={-0.7,-1.5,-0.7,0.7,1.2,0.7},
start_with_items={["default:mese"]=1},
spawn_on={"group:sand","spreading_dirt_type","default:gravel","group:stone"},
attack_chance=5,
on_detecting_enemy=function(self)
if self.ex then return end
self.ex=1
aliveai_massdestruction.iceblow(self.object:get_pos())
aliveai_nitroglycerine.crush(self.object:get_pos())
aliveai_nitroglycerine.explode(self.object:get_pos(),{
radius=2,
set="air",
place={"air"}
})
aliveai.kill(self)
end,
on_blow=function(self)
if self.ex then return end
self.ex=1
aliveai_nitroglycerine.crush(self.object:get_pos())
aliveai_nitroglycerine.explode(self.object:get_pos(),{
radius=3,
place={"default:snowblock","default:ice","default:snowblock"},
place_chance=2,
})
aliveai.kill(self)
end,
death=function(self,puncher,pos)
self.on_detecting_enemy(self)
end,
})
aliveai_massdestruction.pollutionblow=function(pos)
local np=minetest.find_node_near(pos, 5,{"group:spreading_dirt_type"})
if np and not minetest.is_protected(np,"") then
aliveai_nitroglycerine.cons({pos=np,max=3000,
replace={
["spreading_dirt_type"]="aliveai_massdestruction:toxicdirt",
["flora"]="default:dry_shrub",
["tree"]="default:sand",
["choppy"]="default:sand",
["leaves"]=function(pos)
aliveai_nitroglycerine.cons({pos=pos,max=10,replace={["leaves"]="air"}})
end,
["water"]=function(pos)
aliveai_nitroglycerine.cons({pos=pos,max=10,replace={["water"]="aliveai_massdestruction:toxicwater"}})
end,
},
on_replace=function(pos)
for _, ob in ipairs(minetest.get_objects_inside_radius(pos, 2)) do
aliveai.punchdmg(ob,100)
end
end,
})
end
end
aliveai_massdestruction.iceblow=function(pos)
local np=minetest.find_node_near(pos, 5,{"group:spreading_dirt_type"})
if np and not minetest.is_protected(np,"") then
aliveai_nitroglycerine.cons({pos=np,max=3000,
replace={
["spreading_dirt_type"]="default:dirt_with_snow",
["flora"]="default:dry_shrub",
["tree"]="default:snowblock",
["choppy"]="default:ice",
["leaves"]=function(pos)
aliveai_nitroglycerine.cons({pos=pos,max=10,replace={["leaves"]="default:ice"}})
end,
["water"]=function(pos)
aliveai_nitroglycerine.cons({pos=pos,max=10,replace={["water"]="default:ice"}})
end,
},
on_replace=function(pos)
for _, ob in ipairs(minetest.get_objects_inside_radius(pos, 2)) do
aliveai_nitroglycerine.freeze(ob)
end
end,
})
end
end