diff --git a/aliveai_threat_eletric/depends.txt b/aliveai_threat_eletric/depends.txt new file mode 100644 index 0000000..5433dee --- /dev/null +++ b/aliveai_threat_eletric/depends.txt @@ -0,0 +1,4 @@ +default +aliveai +aliveai_electric +nitroglycerine? \ No newline at end of file diff --git a/aliveai_threat_eletric/init.lua b/aliveai_threat_eletric/init.lua new file mode 100644 index 0000000..ee67611 --- /dev/null +++ b/aliveai_threat_eletric/init.lua @@ -0,0 +1,502 @@ +aliveai_threat_eletric={} + +minetest.register_craft({ + output = "aliveai_threat_eletric:secam_off", + recipe = { + {"default:steel_ingot", "dye:black", "default:steel_ingot"}, + {"default:glass", "aliveai_threat_eletric:core2", "default:glass"}, + {"default:steel_ingot", "dye:black", "default:steel_ingot"}, + } +}) + + +minetest.register_tool("aliveai_threat_eletric:core", { + description = "High voltage core", + inventory_image = "aliveai_threat_eletric_core.png", + on_use=function(itemstack, user, pointed_thing) + local pos1,pos2=aliveai_electric.dir(user,pointed_thing) + local obs,pos,hit=aliveai_electric.getobjects(pos1,pos2) + aliveai_electric.lightning1(obs,pos,hit) + itemstack:add_wear(65535/20) + return itemstack + end, + on_place=function(itemstack, user, pointed_thing) + itemstack:take_item() + aliveai_threat_eletric.explode(user:get_pos(),20) + return itemstack + end +}) + +minetest.register_tool("aliveai_threat_eletric:core2", { + description = "Lightning core", + inventory_image = "aliveai_threat_eletric_core2.png", + on_use=function(itemstack, user, pointed_thing) + local pos1,pos2=aliveai_electric.dir(user,pointed_thing) + local obs,pos,hit=aliveai_electric.getobjects(pos1,pos2) + aliveai_electric.lightning2(obs,pos,hit) + itemstack:add_wear(65535/20) + return itemstack + end, + on_place=function(itemstack, user, pointed_thing) + itemstack:take_item() + aliveai_threat_eletric.explode(user:get_pos(),30) + return itemstack + end +}) + +minetest.register_tool("aliveai_threat_eletric:stungun", { + description = "Stungun", + inventory_image = "aliveai_threat_eletric_stungun.png", + on_use=function(itemstack, user, pointed_thing) + if pointed_thing.type=="object" then + aliveai_electric.hit(pointed_thing.ref,15) + itemstack:add_wear(65535/20) + return itemstack + end + end +}) + + +minetest.register_craft({ + output = "aliveai_threat_eletric:stungun", + recipe = { + {"default:steel_ingot","default:mese_crystal_fragment","default:steel_ingot"}, + {"default:steel_ingot","default:mese_crystal","default:steel_ingot"}, + {"default:steel_ingot","dye:black","default:steel_ingot"}, + } +}) + + +aliveai.create_bot({ + drop_dead_body=0, + attack_players=1, + name="eletric_terminator3", + team="nuke", + texture="aliveai_threat_eletric_terminator.png^[colorize:#00ff0033", + attacking=1, + talking=0, + light=0, + arm=4, + building=0, + escape=0, + start_with_items={["default:steel_ingot"]=4,["aliveai_threat_eletric:stungun"]=1}, + type="monster", + dmg=5, + hp=200, + name_color="", + attack_chance=3, + damage_by_blocks=0, + on_step=function(self,dtime) + if self.fight and aliveai.visiable(self,self.fight) then + local p=self.object:get_pos() + self.temper=3 + local a=aliveai.random_pos(self.fight:get_pos(),2,3) + if a then self.object:setpos(a) end + aliveai.lookat(self,self.fight:get_pos()) + if aliveai.def(p,"buildable_to") then + minetest.set_node(p,{name="aliveai_electric:chock"}) + elseif aliveai.def({x=p.x,y=p.y+1,z=p.z},"buildable_to") then + minetest.set_node({x=p.x,y=p.y+1,z=p.z},{name="aliveai_electric:chock"}) + end + end + end, + on_load=function(self) + self.hp2=self.object:get_hp() + self.move.speed=4 + end, + spawn=function(self) + self.hp2=self.object:get_hp() + self.move.speed=4 + end, + on_blow=function(self) + aliveai.kill(self) + self.death(self,self.object,self.object:getpos()) + end, + death=function(self,puncher,pos) + if not self.exx then + self.exx=1 + local pos=self.object:get_pos() + minetest.add_particlespawner({ + amount = 20, + time =0.1, + minpos = pos, + maxpos = pos, + minvel = {x=-10, y=10, z=-10}, + maxvel = {x=10, y=50, z=10}, + minacc = {x=0, y=-3, z=0}, + maxacc = {x=0, y=-8, z=0}, + minexptime = 3, + maxexptime = 1, + minsize = 1, + maxsize = 8, + texture = "default_steel_block.png", + collisiondetection = true, + }) + aliveai_threat_eletric.explode(pos,2) + aliveai.die(self) + end + end, + on_punched=function(self,puncher) + if self.hp2-self.hp<5 then + self.object:set_hp(self.hp2) + self.hp=self.hp2 + if aliveai.team(puncher)~="nuke" then aliveai_electric.hit(puncher) end + return self + end + local pos=self.object:get_pos() + minetest.add_particlespawner({ + amount = 20, + time=0.2, + minpos = {x=pos.x+0.5,y=pos.y+0.5,z=pos.z+0.5}, + maxpos = {x=pos.x-0.5,y=pos.y-0.5,z=pos.z-0.5}, + minvel = {x=-0.1, y=-0.1, z=-0.1}, + maxvel = {x=0.1, y=0.1, z=0.1}, + minacc = {x=0, y=0, z=0}, + maxacc = {x=0, y=0, z=0}, + minexptime = 0.5, + maxexptime = 1, + minsize = 0.5, + maxsize = 2, + texture = "aliveai_electric_vol.png", + }) + end +}) + +aliveai.create_bot({ + drop_dead_body=0, + attack_players=1, + name="eletric_terminator", + team="nuke", + texture="aliveai_threat_eletric_terminator.png", + attacking=1, + talking=0, + light=0, + building=0, + escape=0, + start_with_items={["default:steel_ingot"]=4,["aliveai_threat_eletric:core"]=1}, + type="monster", + dmg=9, + hp=200, + name_color="", + attack_chance=3, + damage_by_blocks=0, + on_step=function(self,dtime) + if self.fight and math.random(1,3)==1 and aliveai.visiable(self,self.fight) and aliveai.viewfield(self,self.fight) then + local pos=self.object:get_pos() + local ta=self.fight:get_pos() + aliveai.lookat(self,ta) + aliveai.use(self) + end + end, + on_load=function(self) + self.hp2=self.object:get_hp() + end, + spawn=function(self) + self.hp2=self.object:get_hp() + end, + on_blow=function(self) + aliveai.kill(self) + self.death(self,self.object,self.object:getpos()) + end, + death=function(self,puncher,pos) + if not self.exx then + self.exx=1 + local pos=self.object:get_pos() + minetest.add_particlespawner({ + amount = 20, + time =0.1, + minpos = pos, + maxpos = pos, + minvel = {x=-10, y=10, z=-10}, + maxvel = {x=10, y=50, z=10}, + minacc = {x=0, y=-3, z=0}, + maxacc = {x=0, y=-8, z=0}, + minexptime = 3, + maxexptime = 1, + minsize = 1, + maxsize = 8, + texture = "default_steel_block.png", + collisiondetection = true, + }) + aliveai_threat_eletric.explode(pos,10) + aliveai.die(self) + end + end, + on_punching=function(self,target) + local pos=target:get_pos() + if math.random(1,3)==1 and minetest.registered_nodes[minetest.get_node(pos).name] and minetest.registered_nodes[minetest.get_node(pos).name].buildable_to then + minetest.set_node(pos, {name="aliveai_threat_eletric:lightning"}) + end + end, + on_punched=function(self,puncher) + if self.hp2-self.hp<5 then + self.object:set_hp(self.hp2) + self.hp=self.hp2 + if aliveai.team(puncher)~="nuke" then aliveai_electric.hit(puncher) end + return self + end + local pos=self.object:get_pos() + minetest.add_particlespawner({ + amount = 20, + time=0.2, + minpos = {x=pos.x+0.5,y=pos.y+0.5,z=pos.z+0.5}, + maxpos = {x=pos.x-0.5,y=pos.y-0.5,z=pos.z-0.5}, + minvel = {x=-0.1, y=-0.1, z=-0.1}, + maxvel = {x=0.1, y=0.1, z=0.1}, + minacc = {x=0, y=0, z=0}, + maxacc = {x=0, y=0, z=0}, + minexptime = 0.5, + maxexptime = 1, + minsize = 0.5, + maxsize = 2, + texture = "aliveai_electric_vol.png", + }) + end +}) + +aliveai.create_bot({ + drop_dead_body=0, + attack_players=1, + name="eletric_terminator2", + team="nuke", + texture="aliveai_threat_eletric_terminator.png^[colorize:#fa7fff44", + attacking=1, + talking=0, + light=0, + building=0, + escape=0, + start_with_items={["default:steel_ingot"]=4,["aliveai_threat_eletric:core2"]=1}, + type="monster", + dmg=9, + hp=200, + name_color="", + attack_chance=3, + floating=1, + damage_by_blocks=0, + on_step=function(self,dtime) + if self.fight and math.random(1,3)==1 and aliveai.visiable(self,self.fight) and aliveai.viewfield(self,self.fight) then + local pos=self.object:get_pos() + local ta=self.fight:get_pos() + aliveai.lookat(self,ta) + aliveai.use(self) + end + end, + on_load=function(self) + self.hp2=self.object:get_hp() + end, + spawn=function(self) + self.hp2=self.object:get_hp() + end, + on_blow=function(self) + aliveai.kill(self) + self.death(self,self.object,self.object:getpos()) + end, + death=function(self,puncher,pos) + if not self.exx then + self.exx=1 + local pos=self.object:get_pos() + minetest.add_particlespawner({ + amount = 20, + time =0.1, + minpos = pos, + maxpos = pos, + minvel = {x=-10, y=10, z=-10}, + maxvel = {x=10, y=50, z=10}, + minacc = {x=0, y=-3, z=0}, + maxacc = {x=0, y=-8, z=0}, + minexptime = 3, + maxexptime = 1, + minsize = 1, + maxsize = 8, + texture = "default_steel_block.png", + collisiondetection = true, + }) + aliveai_threat_eletric.explode(pos,10) + aliveai.die(self) + end + end, + on_punching=function(self,target) + aliveai_electric.hit(target,10) + end, + on_punched=function(self,puncher) + if self.hp2-self.hp<5 then + self.object:set_hp(self.hp2) + self.hp=self.hp2 + if aliveai.team(puncher)~="nuke" then + if aliveai.is_bot(puncher) then aliveai.dying(puncher:get_luaentity(),1) end + aliveai.punchdmg(puncher,15) + aliveai_electric.hit(puncher) + end + return self + end + local pos=self.object:get_pos() + minetest.add_particlespawner({ + amount = 20, + time=0.2, + minpos = {x=pos.x+0.5,y=pos.y+0.5,z=pos.z+0.5}, + maxpos = {x=pos.x-0.5,y=pos.y-0.5,z=pos.z-0.5}, + minvel = {x=-0.1, y=-0.1, z=-0.1}, + maxvel = {x=0.1, y=0.1, z=0.1}, + minacc = {x=0, y=0, z=0}, + maxacc = {x=0, y=0, z=0}, + minexptime = 0.5, + maxexptime = 1, + minsize = 0.5, + maxsize = 2, + texture = "aliveai_electric_vol.png", + }) + end +}) + + +aliveai_threat_eletric.explode=function(pos,r) + for _, ob in ipairs(minetest.get_objects_inside_radius(pos, r*2)) do + if not (ob:get_luaentity() and ob:get_luaentity().itemstring) then + local pos2=ob:get_pos() + local d=math.max(1,vector.distance(pos,pos2)) + local dmg=(8/d)*r + ob:punch(ob,1,{full_punch_interval=1,damage_groups={fleshy=dmg}},nil) + else + ob:get_luaentity().age=890 + end + local pos2=ob:get_pos() + if aliveai.def(pos2,"buildable_to") then + minetest.set_node(pos2, {name="aliveai_electric:lightning_clump"}) + end + end + + for _, ob in ipairs(minetest.get_objects_inside_radius(pos, r*2)) do + local pos2=ob:get_pos() + local d=math.max(1,vector.distance(pos,pos2)) + local dmg=(8/d)*r + if ob:get_luaentity() then + ob:setvelocity({x=(pos2.x-pos.x)*dmg, y=(pos2.y-pos.y)*dmg, z=(pos2.z-pos.z)*dmg}) + elseif ob:is_player() then + aliveai_nitroglycerine.new_player=ob + minetest.add_entity(pos2, "aliveai_nitroglycerine:playerp"):setvelocity({x=(pos2.x-pos.x)*dmg, y=(pos2.y-pos.y)*dmg, z=(pos2.z-pos.z)*dmg}) + aliveai_nitroglycerine.new_player=nil + end + end + minetest.sound_play("aliveai_nitroglycerine_nuke", {pos=pos, gain = 0.5, max_hear_distance = r*4}) +end + +if aliveai_nitroglycerine then +minetest.register_craft({ + output = "aliveai_threat_eletric:timed_ebumb 2", + recipe = { + {"default:steel_ingot","default:coal_lump","default:steel_ingot"}, + {"default:steel_ingot","default:mese_crystal","default:steel_ingot"}, + {"","",""}, + } +}) +minetest.register_node("aliveai_threat_eletric:timed_ebumb", { + description = "Timed bomb", + tiles = {"aliveai_threats_c4_controller.png^[colorize:#fa7fff55"}, + 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_threat_eletric.explode(pos,7) + aliveai_nitroglycerine.explode(pos,{radius=3,set="air"}) + end,pos) + end, + on_timer=function(pos, elapsed) + minetest.registered_nodes["aliveai_threat_eletric:timed_ebumb"].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_threat_eletric:timed_ebumb"].on_rightclick(pos) + end + } + }, + on_burn = function(pos) + minetest.registered_nodes["aliveai_threat_eletric:timed_ebumb"].on_rightclick(pos) + end, + on_ignite = function(pos, igniter) + minetest.registered_nodes["aliveai_threat_eletric:timed_ebumb"].on_rightclick(pos) + end, +}) +end + + + +minetest.register_node("aliveai_threat_eletric:secam_off", { + description = "Lightning security cam", + tiles = {"aliveai_threats_cam2.png^[colorize:#fa7fff44"}, + 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_threat_eletric:secam", param1 = node.param1, param2 = node.param2}) + minetest.get_meta(pos):set_string("team",aliveai.team(player)) + if minetest.get_node(pos).param2==21 then + minetest.get_meta(pos):set_int("y",-1) + else + minetest.get_meta(pos):set_int("y",1) + end + 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_threat_eletric:secam", { + description = "Lightning security cam", + tiles = { + { + name = "aliveai_threats_cam1.png^[colorize:#fa7fff44", + 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_threat_eletric: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) + local obpos=ob:get_pos() + obpos={x=obpos.x,y=obpos.y-1,z=obpos.z} + if te~="" and te~="animal" and te~=t and aliveai.gethp(ob)>0 and not (aliveai.is_bot(ob) and ob:get_luaentity().dying) and aliveai.visiable(pos,obpos) then + local obs,pos2=aliveai_electric.getobjects({x=pos.x,y=pos.y+minetest.get_meta(pos):get_int("y"),z=pos.z},obpos) + aliveai_electric.lightning2(obs,pos2) + return true + end + end + return true + end, +}) diff --git a/aliveai_threat_eletric/readme.txt b/aliveai_threat_eletric/readme.txt new file mode 100644 index 0000000..3521336 --- /dev/null +++ b/aliveai_threat_eletric/readme.txt @@ -0,0 +1 @@ +electric threat for aliveai \ No newline at end of file diff --git a/aliveai_threat_eletric/textures/aliveai_threat_eletric_core.png b/aliveai_threat_eletric/textures/aliveai_threat_eletric_core.png new file mode 100644 index 0000000..4c868f1 Binary files /dev/null and b/aliveai_threat_eletric/textures/aliveai_threat_eletric_core.png differ diff --git a/aliveai_threat_eletric/textures/aliveai_threat_eletric_core2.png b/aliveai_threat_eletric/textures/aliveai_threat_eletric_core2.png new file mode 100644 index 0000000..3ced5c4 Binary files /dev/null and b/aliveai_threat_eletric/textures/aliveai_threat_eletric_core2.png differ diff --git a/aliveai_threat_eletric/textures/aliveai_threat_eletric_stungun.png b/aliveai_threat_eletric/textures/aliveai_threat_eletric_stungun.png new file mode 100644 index 0000000..260c2f0 Binary files /dev/null and b/aliveai_threat_eletric/textures/aliveai_threat_eletric_stungun.png differ diff --git a/aliveai_threat_eletric/textures/aliveai_threat_eletric_terminator.png b/aliveai_threat_eletric/textures/aliveai_threat_eletric_terminator.png new file mode 100644 index 0000000..49604f1 Binary files /dev/null and b/aliveai_threat_eletric/textures/aliveai_threat_eletric_terminator.png differ diff --git a/aliveai_threat_eletric/textures/aliveai_threats_quantum_monster_lights.png b/aliveai_threat_eletric/textures/aliveai_threats_quantum_monster_lights.png new file mode 100644 index 0000000..f839fb7 Binary files /dev/null and b/aliveai_threat_eletric/textures/aliveai_threats_quantum_monster_lights.png differ