forked from Mirrorlandia_minetest/portalgun
138 lines
4.6 KiB
Lua
138 lines
4.6 KiB
Lua
|
minetest.register_node("portalgun:powerballspawner", {
|
||
|
description = "Power ball spawner" ,
|
||
|
tiles = {"default_steel_block.png","default_steel_block.png","default_steel_block.png","default_steel_block.png","default_steel_block.png","portalgun_powerballspawner.png"},
|
||
|
groups = {cracky=2},
|
||
|
sounds = default.node_sound_glass_defaults(),
|
||
|
is_ground_content = false,
|
||
|
paramtype2 = "facedir",
|
||
|
on_place = minetest.rotate_node,
|
||
|
on_construct = function(pos)
|
||
|
minetest.get_node_timer(pos):start(10)
|
||
|
end,
|
||
|
on_timer = function (pos, elapsed)
|
||
|
local dir=minetest.get_node(pos).param2
|
||
|
local v={x=0, y=0, z=0}
|
||
|
if dir==0 then v.z=-1
|
||
|
elseif dir==1 then v.x=-1
|
||
|
elseif dir==2 then v.z=1
|
||
|
elseif dir==3 then v.x=1
|
||
|
elseif dir==8 then v.y=-1
|
||
|
elseif dir==4 then v.y=1
|
||
|
end
|
||
|
local pv={x=pos.x+v.x, y=pos.y+v.y, z=pos.z+v.z}
|
||
|
portalgun.new=1
|
||
|
local m=minetest.add_entity(pv, "portalgun:powerball")
|
||
|
m:set_velocity({x=v.x*4, y=v.y*4, z=v.z*4})
|
||
|
return true
|
||
|
end,
|
||
|
})
|
||
|
|
||
|
minetest.register_node("portalgun:powerballspawner2", {
|
||
|
description = "Power ball spawner (spawn on activate)" ,
|
||
|
tiles = {"default_steel_block.png","default_steel_block.png","default_steel_block.png","default_steel_block.png","default_steel_block.png","portalgun_powerballspawner.png^[colorize:#aaaa0055"},
|
||
|
groups = {cracky=2,mesecon=1},
|
||
|
sounds = default.node_sound_glass_defaults(),
|
||
|
is_ground_content = false,
|
||
|
paramtype2 = "facedir",
|
||
|
on_place = minetest.rotate_node,
|
||
|
mesecons = {effector = {
|
||
|
action_on = function (pos, node)
|
||
|
local dir=minetest.get_node(pos).param2
|
||
|
local v={x=0, y=0, z=0}
|
||
|
if dir==0 then v.z=-1
|
||
|
elseif dir==1 then v.x=-1
|
||
|
elseif dir==2 then v.z=1
|
||
|
elseif dir==3 then v.x=1
|
||
|
elseif dir==8 then v.y=-1
|
||
|
elseif dir==4 then v.y=1
|
||
|
end
|
||
|
local pv={x=pos.x+v.x, y=pos.y+v.y, z=pos.z+v.z}
|
||
|
portalgun.new=1
|
||
|
local m=minetest.add_entity(pv, "portalgun:powerball")
|
||
|
m:set_velocity({x=v.x*4, y=v.y*4, z=v.z*4})
|
||
|
end
|
||
|
}}
|
||
|
})
|
||
|
|
||
|
|
||
|
minetest.register_entity("portalgun:powerball",{
|
||
|
hp_max = 1000,
|
||
|
physical = true,
|
||
|
weight = 0,
|
||
|
collisionbox = {-0.4,-0.4,-0.4, 0.4,0.4,0.4},
|
||
|
visual = "sprite",
|
||
|
visual_size = {x=1.1, y=1.1},
|
||
|
textures = {"portalgun_powrball.png"},
|
||
|
initial_sprite_basepos = {x=0, y=0},
|
||
|
is_visible = true,
|
||
|
makes_footstep_sound = false,
|
||
|
automatic_rotate = false,
|
||
|
portalgun=2,
|
||
|
powerball=1,
|
||
|
on_activate= function(self, staticdata)
|
||
|
if portalgun.new==0 then
|
||
|
self.object:remove()
|
||
|
return self
|
||
|
end
|
||
|
portalgun.new=0
|
||
|
local pos=self.object:get_pos()
|
||
|
self.sound=minetest.sound_play("portalgun_powerball", {pos=pos,max_hear_distance = 10, gain = 0.5})
|
||
|
minetest.sound_play("portalgun_powerballbonce", {pos=pos,max_hear_distance = 10, gain = 1})
|
||
|
end,
|
||
|
on_step= function(self, dtime)
|
||
|
self.timer=self.timer+dtime
|
||
|
if self.timer<0.2 then return self end
|
||
|
self.timer=0
|
||
|
local pos=self.object:get_pos()
|
||
|
for i, ob in pairs(minetest.get_objects_inside_radius(pos, 2)) do
|
||
|
if ob:is_player() or (ob:get_luaentity() and ob:get_luaentity().portalgun~=1 and ob:get_luaentity().wsc==nil and ob:get_luaentity().powerball~=1) then
|
||
|
ob:set_hp(0)
|
||
|
ob:punch(ob, {full_punch_interval=1.0,damage_groups={fleshy=9000}}, "default:bronze_pick", nil)
|
||
|
|
||
|
end
|
||
|
end
|
||
|
self.timer2=self.timer2+1
|
||
|
self.timer3=self.timer3+1
|
||
|
if self.timer3>=9 then
|
||
|
self.timer3=0
|
||
|
minetest.sound_stop(self.sound)
|
||
|
self.sound=minetest.sound_play("portalgun_powerball", {pos=pos,max_hear_distance = 10, gain = 0.5})
|
||
|
end
|
||
|
if self.timer2>40 then
|
||
|
minetest.sound_stop(self.sound)
|
||
|
self.object:set_hp(0)
|
||
|
self.object:punch(self.object, {full_punch_interval=1.0,damage_groups={fleshy=9000}}, "default:bronze_pick", nil)
|
||
|
return self
|
||
|
end
|
||
|
local v=self.object:get_velocity()
|
||
|
local nextn={x=pos.x+(v.x)/3, y=pos.y+(v.y)/3, z=pos.z+(v.z)/3}
|
||
|
local nname=minetest.get_node(nextn).name
|
||
|
if minetest.registered_nodes[nname].walkable then
|
||
|
|
||
|
if nname=="portalgun:powerballtarget" and mesecon then
|
||
|
mesecon.receptor_on(nextn)
|
||
|
minetest.get_node_timer(nextn):start(5)
|
||
|
end
|
||
|
self.object:set_velocity({x=v.x*-1, y=v.y*-1, z=v.z*-1})
|
||
|
minetest.sound_play("portalgun_powerballbonce", {pos=pos,max_hear_distance = 10, gain = 1})
|
||
|
end
|
||
|
end,
|
||
|
timer=0,
|
||
|
timer2=0,
|
||
|
timer3=0,
|
||
|
sound={}
|
||
|
})
|
||
|
|
||
|
minetest.register_node("portalgun:powerballtarget", {
|
||
|
description = "Power ball target" ,
|
||
|
tiles = {"portalgun_powerballstarget.png"},
|
||
|
groups = {mesecon = 2,cracky=2},
|
||
|
mesecons = {receptor = {state = "off"}},
|
||
|
sounds = default.node_sound_stone_defaults(),
|
||
|
is_ground_content = false,
|
||
|
on_timer = function (pos, elapsed)
|
||
|
mesecon.receptor_off(pos)
|
||
|
return false
|
||
|
end,
|
||
|
})
|