diff --git a/gravityuse.lua b/gravityuse.lua deleted file mode 100644 index 4a3eaec..0000000 --- a/gravityuse.lua +++ /dev/null @@ -1,160 +0,0 @@ -portalgun_power={} -portalgun_power_tmp_power=0 - -function portalgun_gravity(itemstack, user, pointed_thing) - local ob=pointed_thing.ref - local at = ob:get_attach() - if at and at:get_luaentity() and at:get_luaentity().portalgun_power then - ob:set_detach() - local target = at:get_luaentity().target - if target and target:get_luaentity() and (target:get_luaentity().itemstring or target:get_luaentity().wsc) then - target:set_velocity({x=0, y=-1, z=0}) - target:set_acceleration({x=0, y=-8, z=0}) - end - return itemstack - end - if not ob:get_attach() and (ob:is_player() or (ob:get_luaentity() and ob:get_luaentity().powerball~=1)) then - --if 4 blocks or closer to player - if vector.distance(ob:get_pos(),user:get_pos())<4 then - portalgun_power.user=user - portalgun_power.target=ob - if ob:is_player() then portalgun_power.player=1 end - local m=minetest.add_entity(ob:get_pos(), "portalgun:power") - ob:set_attach(m, "", {x=0,y=0,z=0}, {x=0,y=0,z=0}) - return itemstack - end - end - - - - - - - - return itemstack -end - -minetest.register_entity("portalgun:power",{ - hp_max = 100, - physical = false, - weight = 0, - collisionbox = {-0.2,-0.2,-0.2, 0.2,0.2,0.2}, - visual = "sprite", - visual_size = {x=1, y=1}, - textures = {"portalgun_gravity.png"}, - spritediv = {x=1, y=1}, - is_visible = true, - makes_footstep_sound = false, - automatic_rotate = 0, - timer=0, - time=0.1, - portalgun_power=1, - portalgun=1, - lifelime=100, -on_activate=function(self, staticdata) - if portalgun_power.user then - self.user=portalgun_power.user - self.target=portalgun_power.target - self.player=portalgun_power.player - portalgun_power={} - else - self.object:remove() - end - end, -on_punch=function(self, puncher, time_from_last_punch, tool_capabilities, dir) - if self.target and self.target:get_attach() then - self.target:set_detach() - self.target:set_hp(0) - end - -end, -on_step= function(self, dtime) - self.timer=self.timer+dtime - if self.timer<self.time then return self end - self.timer=0 - if self.target==nil or (not self.target:get_attach()) then - self.object:set_hp(0) - if self.sound then minetest.sound_stop(self.sound) end - end - if self.player then - self.lifelime=self.lifelime-1 - if self.lifelime<0 then - self.target:set_detach() - return self - end - end - local pos = self.user:get_pos() - if pos==nil then return self end - pos.y=pos.y+1.6 - local dir = self.user:get_look_dir() - local npos={x=pos.x+(dir.x*2), y=pos.y+(dir.y*2), z=pos.z+(dir.z*2)} - if minetest.registered_nodes[minetest.get_node(npos).name].walkable then - return self - end - self.object:move_to(npos) - return self - end, -}) - -minetest.register_entity("portalgun:power2",{ - hp_max = 100, - physical = true, - weight = 10, - collisionbox = {-0.35,0,-0.35, 0.35,1,0.35}, - visual = "sprite", - visual_size = {x=1, y=1}, - textures = {"portalgun_gravity.png"}, - spritediv = {x=1, y=1}, - is_visible = true, - makes_footstep_sound = false, - automatic_rotate = 0, - timer=0, - time=0.025, - portalgun_power=1, - portalgun=1, - lifelime=1000, - v=0.3, - ltime=0, -on_activate=function(self, staticdata) - if portalgun_power.user then - self.user=portalgun_power.user - self.target=portalgun_power.target - self.ltime=portalgun_power_tmp_power - portalgun_power={} - else - self.object:remove() - end - end, -on_step= function(self, dtime) - local pos=self.object:get_pos() - local v=self.object:get_velocity() - local v2={x=v.x-self.v,y=(v.y-self.v)*0.99,z=v.z-self.v} - - if v2.x<0.5 and v2.x>-0.5 then v2.x=0 end - if v2.y<0.5 and v2.y>-0.5 then v2.y=0 end - if v2.z<0.5 and v2.z>-0.5 then v2.z=0 end - - self.object:set_velocity(v2) - self.ltime=self.ltime-self.v - - if self.ltime<self.v or (v2.x+v2.y+v2.z==0) then - self.lifelime=-1 - end - - local nexpos={x=pos.x+(v.x*0.05),y=pos.y+(v.y*0.05)+1,z=pos.z+(v.z*0.05)} - if minetest.registered_nodes[minetest.get_node(nexpos).name].walkable then - self.lifelime=-1 - end - - self.lifelime=self.lifelime-1 - if self.lifelime<0 then - self.target:set_detach() - end - - if self.target==nil or (not self.target:get_attach()) then - self.object:set_hp(0) - return self - end - return self - end, -}) diff --git a/init.lua b/init.lua index e29f46c..986e4a0 100644 --- a/init.lua +++ b/init.lua @@ -1,556 +1,38 @@ -disable_portal_stuff=false -proportal_group_only = false +--do scripts in folder scripts - -portalgun={new=0,checkpoints={}} -dofile(minetest.get_modpath("portalgun") .. "/gravityuse.lua") -- the gravity part of portalgun -dofile(minetest.get_modpath("portalgun") .. "/stuff.lua") -- security cam -if disable_portal_stuff==false and minetest.get_modpath("mesecons")~=nil then -dofile(minetest.get_modpath("portalgun") .. "/weightedstoragecube.lua") -- weighted storage cube -dofile(minetest.get_modpath("portalgun") .. "/powerball.lua") -- the poweball -dofile(minetest.get_modpath("portalgun") .. "/other.lua") -end - -portalgun_portal={} -portalgun_portal_tmp_user_abort=0 -portalgun_portal_tmp_user="" -local portalgun_timer=1.2 -local portalgun_time=0 -portalgun_lifelime=1200 --deletes portals that not used after a while -portalgun_max_rage=100 -portalgun_max_use_per_secund_time=4 --destroys the portal if excessive used -portalgun_max_use_per_secund=25 --4 & 25 is default = teleported (teleported 25 times in 4 sec) - -function portalgun_param2(pos,param2,r) - local pos2={x=pos.x,y=pos.y,z=pos.z} - if r then - if param2==0 then - pos2.x=pos2.x-1 - elseif param2==1 then pos2.z=pos2.z+1 - elseif param2==2 then pos2.x=pos2.x+1 - elseif param2==3 then pos2.z=pos2.z-1 - end - else - if param2==0 then - pos2.x=pos2.x+1 - elseif param2==1 then pos2.z=pos2.z-1 - elseif param2==2 then pos2.x=pos2.x-1 - elseif param2==3 then pos2.z=pos2.z+1 - end - end - return pos2 -end - - -local function portalgun_getLength(a)-- get length of an array / table - local count = 0 - for _ in pairs(a) do count = count + 1 end - return count -end - -function portal_delete(name,n) -- using set_hp & :punch instand of :remove ... no risk for crash if something attach it - if portalgun_portal[name]==nil then return end - if (n==1 or n==0) and portalgun_portal[name].portal1~=nil then - if n==0 then - local pos=portalgun_portal[name].portal1:get_pos() - if pos~=nil then minetest.sound_play("portalgun_closeportals", {pos=pos,max_hear_distance = 20, gain = 1}) end - end - portalgun_portal[name].portal1_active=false - portalgun_portal[name].portal1:set_hp(0) - end - if (n==2 or n==0) and portalgun_portal[name].portal2~=nil then - if n==0 then - local pos=portalgun_portal[name].portal2:get_pos() - if pos~=nil then minetest.sound_play("portalgun_closeportals", {pos=pos,max_hear_distance = 20, gain = 1}) end - end - portalgun_portal[name].portal2_active=false - portalgun_portal[name].portal2:set_hp(0) - end - if n==0 then portalgun_portal[name]=nil end -end - -minetest.register_on_leaveplayer(function(player)-- deletes user the profile (saveing memory) - local name=player:get_player_name() - portal_delete(name,0) - portalgun_portal[name]=nil -end) -minetest.register_on_dieplayer(function(player) - local name=player:get_player_name() - portal_delete(name,0) - portalgun_portal[name]=nil -end) - - -portalgun_on_step=function(self, dtime) - local name=self.user - - if portalgun_portal[self.user]==nil then - self.object:remove() - return self - end - - if (self.project==1 and self.use~=portalgun_portal[self.user].portal1_use) - or (self.project==2 and self.use~=portalgun_portal[self.user].portal2_use) then - self.object:remove() - return self - end - - if portalgun_portal[name].lifelime<0 then - portal_delete(name,0) - return self - end - - if portalgun_portal[name].portal1_active and portalgun_portal[name].portal2_active then -- makes lifetime equal when both is acive, or it will be half - portalgun_portal[name].lifelime=portalgun_portal[name].lifelime-0.5 - else - portalgun_portal[name].lifelime=portalgun_portal[name].lifelime-1 - return self -- abort when only 1 is active (saves cpu) - end - - if portalgun_portal[name].timer>0 then -- makes teleported stuff wont move back at same time (bug fix) - portalgun_portal[name].timer=portalgun_portal[name].timer-dtime - return self - end - - - if self.portal_max_use>0 then -- makes teleported stuff wont move back at same time (bug fix) - self.portal_max_use_time=self.portal_max_use_time+dtime - if self.portal_max_use>=portalgun_max_use_per_secund then - portal_delete(name,self.project) - return self - elseif self.portal_max_use_time>=portalgun_max_use_per_secund_time then - self.portal_max_use_time=0 - self.portal_max_use=0 - end - end - - local pos1=0 - local pos2=0 - local d1=0 - local d2=0 - if self.project==1 then - pos1=portalgun_portal[name].portal1_pos - pos2=portalgun_portal[name].portal2_pos - d1=portalgun_portal[name].portal1_dir - d2=portalgun_portal[name].portal2_dir - else - pos1=portalgun_portal[name].portal2_pos - pos2=portalgun_portal[name].portal1_pos - d1=portalgun_portal[name].portal2_dir - d2=portalgun_portal[name].portal1_dir - end - --- portalgun_front_of_field should fix teleport through walls, but is not working in all directions --- waiting with this issue - - - - if pos2~=0 and pos1~=0 then - for ii, ob in pairs(minetest.get_objects_inside_radius(pos1, self.area)) do - if pos2~=0 then --and portalgun_front_of_field(self.object,ob) - if (ob:is_player() ) or (ob:get_luaentity() and ob:get_luaentity().portalgun~=1 and ob:get_luaentity().name:find(":text",4)==nil) then - - - if ob:get_attach() then - ob:set_detach() - ob:set_acceleration({x=0, y=-10, z=0}) - end - --set velocity then teleport - local p=pos2 - local x=0 - local y=0 - local z=0 - local dis=2 - if p==nil or p.x==nil then - return self - end - - - if ob:is_player() then - local v=ob:get_player_velocity() - local player_name=ob:get_player_name() - portalgun_power.user=player_name - portalgun_power.target=ob - local vv={x=v.x,y=v.y,z=v.z} - -- get the highest velocity - dis=2 - if vv.x+vv.y+vv.z<=0.3 then - if self.small==true then - vv.x=1.4 - else - vv.x=2 - end - end - if vv.x+vv.y+vv.z==0 then vv.x=2 end - if vv.x<0 then vv.x=vv.x*-1 end - if vv.y<0 then vv.y=vv.y*-1 end - if vv.z<0 then vv.z=vv.z*-1 end - if vv.x>vv.z then vv.a=vv.x else vv.a=vv.z end - if vv.a<vv.y then vv.a=vv.y end - portalgun_power_tmp_power=vv.a - local m=minetest.add_entity(ob:get_pos(), "portalgun:power2") - ob:set_attach(m, "", {x=0,y=0,z=0}, {x=0,y=0,z=0}) - m:set_velocity(v) - m:set_acceleration({x=0,y=-10,z=0}) - ob=m - - end - - if ob:is_player()==false then - local v=ob:get_velocity() - if v.x<0 then v.x=v.x*-1 end - if v.y<0 then v.y=v.y*-1 end - if v.z<0 then v.z=v.z*-1 end - - local vv=0 -- get the highest velocity - if v.x>v.z then vv=v.x else vv=v.z end - if vv<v.y then vv=v.y end - v.x=0 - v.y=0 - v.z=0 - if d2=="x+" then v.x=vv end - if d2=="x-" then v.x=vv*-1 end - if d2=="y+" then v.y=vv end - if d2=="y-" then v.y=vv*-1 end - if d2=="z+" then v.z=vv end - if d2=="z-" then v.z=vv*-1 end - ob:set_velocity({x=v.x, y=v.y, z=v.z}) - end - if d2=="x+" then x=2 - elseif d2=="x-" then x=-dis - elseif d2=="y+" then y=dis - elseif d2=="y-" then y=-dis - elseif d2=="z+" then z=dis - elseif d2=="z-" then z=-dis - end - local obpos={x=p.x+x,y=p.y+y,z=p.z+z} - portalgun_portal[name].timer=0.2 - self.portal_max_use=self.portal_max_use+1 - ob:set_pos(obpos,false) - portalgun_portal[name].lifelime=portalgun_lifelime - minetest.sound_play("portalgun_teleport", {pos=portalgun_portal[name].portal1_pos,max_hear_distance = 10, gain = 30}) - minetest.sound_play("portalgun_teleport", {pos=portalgun_portal[name].portal2_pos,max_hear_distance = 10, gain = 30}) - end --end of set velocity part then teleport - end - end - end -end - -minetest.register_entity("portalgun:portal",{ -- the portals - hp_max=10000, - visual = "mesh", - mesh = "portalgun_portal_xp.obj", - physical = false, - textures ={"portalgun_blue.png"}, - visual_size = {x=1, y=1}, - spritediv = {x=7, y=0}, - collisionbox = {0,0,0,0,0,0}, - timer=0, - user="", - project=1, - portalgun=1, - portal_max_use=0, - portal_max_use_time=0, - area=2, - small=false, -get_staticdata = function(self) - return minetest.serialize({ - user= self.user, - project=self.project, - use=self.use - }) - end, -on_activate= function(self, staticdata) - local data=minetest.deserialize(staticdata) - if data and type(data) == "table" then - self.user = data.user - self.project = data.project - self.use=data.use - if portalgun_portal[self.user]==nil then - self.object:remove() - return self - end - if (self.project==1 and self.use~=portalgun_portal[self.user].portal1_use) - or (self.project==2 and self.use~=portalgun_portal[self.user].portal2_use) then - self.object:remove() - return self - end - elseif portalgun_portal_tmp_user~="" then - self.user=portalgun_portal_tmp_user - portalgun_portal_tmp_user="" - self.project=portalgun_portal[self.user].project - - if self.project==1 then-- if inactivated then activated and another portal is created: remove - self.use=portalgun_portal[self.user].portal1_use - else - self.use=portalgun_portal[self.user].portal2_use - end - - else - self.object:remove() - return self - end - - if portalgun_portal[self.user]==nil then - self.object:remove() - return self - end - - local d="" - if self.project==1 then - d=portalgun_portal[self.user].portal1_dir - self.object:set_properties({textures = {"portalgun_blue.png"}}) - else - d=portalgun_portal[self.user].portal2_dir - self.object:set_properties({textures = {"portalgun_orange.png"}}) - end - if d=="x+" then self.object:set_yaw(math.pi * 0) - elseif d=="x-" then self.object:set_yaw(math.pi * 1) - elseif d=="y+" then self.object:set_properties({mesh = "portalgun_portal_yp.obj",}) -- becaouse there is no "setpitch" - elseif d=="y-" then self.object:set_properties({mesh = "portalgun_portal_ym.obj",}) -- becaouse there is no "setpitch" - elseif d=="z+" then self.object:set_yaw(math.pi * 0.5) - elseif d=="z-" then self.object:set_yaw(math.pi * 1.5) - end - if d=="y+" then - local pos1={} - if self.project==1 then - pos1=portalgun_portal[self.user].portal1_pos - else - pos1=portalgun_portal[self.user].portal2_pos - end - if portalgun_portal[self.user].y>8 then - pos1.y=pos1.y+1 - end - if portalgun_portal[self.user].y>12 then - pos1.y=pos1.y+1 - end - if self.project==1 then - portalgun_portal[self.user].portal1_pos=pos1 - else - portalgun_portal[self.user].portal2_pos=pos1 - end - elseif string.find(d,"y",1)==nil and (portalgun_portal[self.user].x+portalgun_portal[self.user].z<2.5) then - self.area=1.2 - self.small=true - self.object:set_properties({visual_size = {x=0.7, y=0.7},}) - end - end, -on_step=portalgun_on_step, -}) -minetest.register_craftitem(":", { - description = "Portalgun", - range = 100, - inventory_image = "portalgun_gun0_rndr.png", - wield_image = "portalgun_gun0_rndr.png", - tool_capabilities = { - full_punch_interval = 0.5, - max_drop_level = 3, - groupcaps = { - fleshy = {times={[2]=0.80, [3]=0.40}, uses=100, maxlevel=3}, - oddly_breakable_by_hand = {times={[1]=1}, uses=100, maxlevel=1}, - }, - damage_groups = {fleshy=1}, - }, - on_place=function(itemstack, user, pointed_thing) - local node = minetest.get_node(pointed_thing.under) - if node.name=="portalgun:button"then - --use the item normally - minetest.item_place(itemstack, user, pointed_thing) - else - portalgun_onuse(itemstack, user, pointed_thing, 2) - end - return itemstack - end, - on_use = function(itemstack, user, pointed_thing) - --if pointing at turret then start breaking it - if pointed_thing.type=="node" then - local node=minetest.get_node(pointed_thing.under) - if node.name=="portalgun:turretgun" or node.name=="portalgun:turretgun2" then - minetest.remove_node(pointed_thing.under) - end - end - portalgun_onuse(itemstack, user, pointed_thing, 1) - return itemstack - end -}) - -local function rnd(r) -return math.floor(r+ 0.5) -end - -function portalgun_onuse(itemstack, user, pointed_thing, mode) -- using the gun - - if pointed_thing.type=="object" then - portalgun_gravity(itemstack, user, pointed_thing) - return itemstack - end - - local pos = user:get_pos() - local dir = user:get_look_dir() - local key = user:get_player_control() - local name=user:get_player_name() - local exist=0 - - local item=itemstack:to_table() - local ob={} - ob.project=1 - ob.lifelime=portalgun_lifelime - ob.portal1=0 - ob.portal2=0 - ob.portal1_dir=0 - ob.portal2_dir=0 - ob.portal2_pos=0 - ob.portal1_pos=0 - ob.user = user:get_player_name() - - if portalgun_portal[name]==nil then -- new portal profile - portalgun_portal[name]={lifelime=portalgun_lifelime,project=1,timer=0,portal1_active=false,portal2_active=false,portal1_use=0,portal2_use=0} - end - - if key.sneak then - portal_delete(name,0) - return itemstack - end - - pos.y=pos.y+1.5 - --- the project - - for i=1, portalgun_max_rage,0.5 do - local nname=minetest.get_node({x=pos.x+(dir.x*i), y=pos.y+(dir.y*i), z=pos.z+(dir.z*i)}).name - if minetest.registered_nodes[nname].walkable then - portalgun_portal[name].lifelime=portalgun_lifelime - - if not proportal_group_only and minetest.get_node_group(nname, "antiportal") > 0 then - minetest.sound_play("portalgun_error", {pos=pos,max_hear_distance = 5, gain = 3}) - return itemstack - elseif proportal_group_only and minetest.get_node_group(nname, "proportal") == 0 then - minetest.sound_play("portalgun_error", {pos=pos,max_hear_distance = 5, gain = 3}) - return itemstack - end - - if minetest.registered_nodes[minetest.get_node({x=rnd(pos.x+(dir.x*i)), y=rnd(pos.y+(dir.y*i)+1), z=rnd(pos.z+(dir.z*i))}).name].walkable==false and rnd(user:get_pos().y)>rnd(pos.y+(dir.y*i)) then - portalgun_setportal(pos,name,dir,i,mode,"y+") - return itemstack - elseif minetest.registered_nodes[minetest.get_node({x=rnd(pos.x+(dir.x*i)), y=rnd(pos.y+(dir.y*i)-1), z=rnd(pos.z+(dir.z*i))}).name].walkable==false and rnd(user:get_pos().y)<rnd(pos.y+(dir.y*i)) then - portalgun_setportal(pos,name,dir,i,mode,"y-") - return itemstack - elseif minetest.registered_nodes[minetest.get_node({x=rnd(pos.x+(dir.x*i)-1), y=rnd(pos.y+(dir.y*i)), z=rnd(pos.z+(dir.z*i))}).name].walkable==false and rnd(user:get_pos().x)<rnd(pos.x+(dir.x*i)) then - portalgun_setportal(pos,name,dir,i,mode,"x-") - return itemstack - elseif minetest.registered_nodes[minetest.get_node({x=rnd(pos.x+(dir.x*i))+1, y=rnd(pos.y+(dir.y*i)), z=rnd(pos.z+(dir.z*i))}).name].walkable==false and rnd(user:get_pos().x)>rnd(pos.x+(dir.x*i)) then - portalgun_setportal(pos,name,dir,i,mode,"x+") - return itemstack - elseif minetest.registered_nodes[minetest.get_node({x=rnd(pos.x+(dir.x*i)), y=rnd(pos.y+(dir.y*i)), z=rnd(pos.z+(dir.z*i)-1)}).name].walkable==false and rnd(user:get_pos().z)<rnd(pos.z+(dir.z*i)) then - portalgun_setportal(pos,name,dir,i,mode,"z-") - return itemstack - elseif minetest.registered_nodes[minetest.get_node({x=rnd(pos.x+(dir.x*i)), y=rnd(pos.y+(dir.y*i)), z=rnd(pos.z+(dir.z*i)+1)}).name].walkable==false and rnd(user:get_pos().z)>rnd(pos.z+(dir.z*i)) then - portalgun_setportal(pos,name,dir,i,mode,"z+") - return itemstack - end - minetest.sound_play("portalgun_error", {pos=pos,max_hear_distance = 20, gain = 3}) - return itemstack - end - end - return itemstack -end - - - -function portalgun_setportal(pos,name,dir,i,mode,portal_dir) - local lpos={x=pos.x+(dir.x*(i-1)), y=pos.y+(dir.y*(i-1)), z=pos.z+(dir.z*(i-1))} -- last pos - local cpos={x=pos.x+(dir.x*i), y=pos.y+(dir.y*i), z=pos.z+(dir.z*i)} -- corrent poss - if portal_dir=="y+" then - cpos.y=(math.floor(cpos.y+ 0.5))+0.524 - elseif portal_dir=="y-" then - cpos.y=(math.floor(cpos.y+ 0.5))-0.524 - elseif portal_dir=="z+" then - cpos.z=(math.floor(cpos.z+ 0.5))+0.524 - elseif portal_dir=="z-" then - cpos.z=(math.floor(cpos.z+ 0.5))-0.524 - elseif portal_dir=="x+" then - cpos.x=(math.floor(cpos.x+ 0.5))+0.524 - elseif portal_dir=="x-" then - cpos.x=(math.floor(cpos.x+ 0.5))-0.524 - end - - if portal_dir=="x+" or portal_dir=="x-" then -- auto correct (place in center) - cpos.y=(math.floor(cpos.y+ 0.5)) - cpos.z=(math.floor(cpos.z+ 0.5)) - elseif portal_dir=="y+" or portal_dir=="y-" then - cpos.x=(math.floor(cpos.x+ 0.5)) - cpos.z=(math.floor(cpos.z+ 0.5)) - elseif portal_dir=="z+" or portal_dir=="z-" then - cpos.x=(math.floor(cpos.x+ 0.5)) - cpos.y=(math.floor(cpos.y+ 0.5)) - end - - if minetest.registered_nodes[minetest.get_node(cpos).name].walkable then - minetest.sound_play("portalgun_error", {pos=pos,max_hear_distance = 5, gain = 3}) - return false - end - - if string.find(portal_dir,"x",1) or string.find(portal_dir,"z",1) then-- auto correct (move from bottom / top) - local testpos1={x=cpos.x,y=cpos.y-1,z=cpos.z} - local testpos2={x=cpos.x,y=cpos.y+1,z=cpos.z} - if minetest.registered_nodes[minetest.get_node(testpos1).name].walkable - and minetest.registered_nodes[minetest.get_node(testpos2).name].walkable==false then - cpos.y=cpos.y+0.5 - elseif minetest.registered_nodes[minetest.get_node(testpos2).name].walkable - and minetest.registered_nodes[minetest.get_node(testpos1).name].walkable==false then - cpos.y=cpos.y-0.5 - end - end - - portalgun_portal_tmp_user=name - portalgun_portal[name].x=pos.x-lpos.x - portalgun_portal[name].y=pos.y-lpos.y - portalgun_portal[name].z=pos.z-lpos.z - portalgun_portal[name].project=mode - - if portalgun_portal[name].x<0 then - portalgun_portal[name].x=portalgun_portal[name].x*-1 - end - if portalgun_portal[name].z<0 then - portalgun_portal[name].z=portalgun_portal[name].z*-1 - end - - - - - - - if mode==1 then - portal_delete(name,1) - portalgun_portal[name].portal1_use=portalgun_portal[name].portal1_use+1 - portalgun_portal[name].portal1_dir=portal_dir - portalgun_portal[name].portal1_pos=cpos - portalgun_portal[name].portal1=minetest.add_entity(cpos, "portalgun:portal") - portalgun_portal[name].portal1_active=true - minetest.sound_play("portalgun_portalblue", {pos=cpos, max_hear_distance = 20, gain = 1}) - else - portal_delete(name,2) - portalgun_portal[name].portal2_use=portalgun_portal[name].portal2_use+1 - portalgun_portal[name].portal2_dir=portal_dir - portalgun_portal[name].portal2_pos=cpos - portalgun_portal[name].portal2=minetest.add_entity(cpos, "portalgun:portal") - portalgun_portal[name].portal2_active=true - minetest.sound_play("portalgun_portalorange", {pos=cpos,max_hear_distance = 20, gain = 1}) - end -end - -portalgun_front_of_field=function(ob,ob2) - local pos2=ob2:get_pos() - return vector.distance(ob:get_pos(),pos2)>vector.distance(portalgun_pointat(ob),pos2) -end - -portalgun_pointat=function(ob) - local pos=ob:get_pos() - local yaw=ob:get_yaw() - if yaw ~= yaw or type(yaw)~="number" then - yaw=0 - end - local z =math.sin(yaw) * -0.1 - local x =math.cos(yaw) * 0.1 - return {x=pos.x+x,y=pos.y,z=pos.z+z} -end + --portalgun + dofile(minetest.get_modpath("portalgun") .. "/scripts/portalgun.lua") + dofile(minetest.get_modpath("portalgun") .. "/scripts/gravityuse.lua") + + --powerball + dofile(minetest.get_modpath("portalgun") .. "/scripts/powerball.lua") + dofile(minetest.get_modpath("portalgun") .. "/scripts/powerballspawner.lua") + dofile(minetest.get_modpath("portalgun") .. "/scripts/powerballtarget.lua") + + + --cubes + dofile(minetest.get_modpath("portalgun") .. "/scripts/weightedstoragecube.lua") + dofile(minetest.get_modpath("portalgun") .. "/scripts/cubespawners.lua") + dofile(minetest.get_modpath("portalgun") .. "/scripts/pressureplatforms.lua") + dofile(minetest.get_modpath("portalgun") .. "/scripts/fizzlers.lua") + dofile(minetest.get_modpath("portalgun") .. "/scripts/checkpoint.lua") + + --misc + dofile(minetest.get_modpath("portalgun") .. "/scripts/buildingblocks.lua") + dofile(minetest.get_modpath("portalgun") .. "/scripts/warntape.lua") + dofile(minetest.get_modpath("portalgun") .. "/scripts/cake.lua") + dofile(minetest.get_modpath("portalgun") .. "/scripts/editingtools.lua") + dofile(minetest.get_modpath("portalgun") .. "/scripts/portaltarget.lua") + dofile(minetest.get_modpath("portalgun") .. "/scripts/signs.lua") + + --hazardous + dofile(minetest.get_modpath("portalgun") .. "/scripts/toxicwater.lua") + dofile(minetest.get_modpath("portalgun") .. "/scripts/turrets.lua") + dofile(minetest.get_modpath("portalgun") .. "/scripts/camera.lua") + dofile(minetest.get_modpath("portalgun") .. "/scripts/damageblock.lua") + dofile(minetest.get_modpath("portalgun") .. "/scripts/objectdestroyer.lua") + + --logic + dofile(minetest.get_modpath("portalgun") .. "/scripts/delayer.lua") + dofile(minetest.get_modpath("portalgun") .. "/scripts/button.lua") + dofile(minetest.get_modpath("portalgun") .. "/scripts/doors.lua") \ No newline at end of file diff --git a/mod.conf b/mod.conf index f1cc4ca..3b628e0 100644 --- a/mod.conf +++ b/mod.conf @@ -1,3 +1,3 @@ name = portalgun description = Portals and stuff -optional_depends = mesecons \ No newline at end of file +depends = mesecons \ No newline at end of file diff --git a/models/torret.blend b/models/turret.blend similarity index 100% rename from models/torret.blend rename to models/turret.blend diff --git a/models/torret1.obj b/models/turret1.obj similarity index 100% rename from models/torret1.obj rename to models/turret1.obj diff --git a/models/torret2.obj b/models/turret2.obj similarity index 100% rename from models/torret2.obj rename to models/turret2.obj diff --git a/other.lua b/other.lua deleted file mode 100644 index d42a453..0000000 --- a/other.lua +++ /dev/null @@ -1,637 +0,0 @@ -local pgad_rules={{x = 1, y = 0, z = 0},{x =-1, y = 0, z = 0},{x = 0, y = 1, z = 0},{x = 0, y =-1, z = 0},{x = 0, y = 0, z = 1},{x = 0, y = 0, z =-1}} -stone_sounds = {} -stone_sounds.footstep = {name="stone_walk", gain=1.0} -stone_sounds.dug = {name="stone_break", gain=1.0} -stone_sounds.place = {name="block_place", gain=1.0} -glass_sounds = {} -glass_sounds.footstep = {name="glass_walk", gain=1.0} -glass_sounds.dug = {name="glass_break", gain=1.0} -glass_sounds.place = {name="block_place", gain=1.0} -wood_sounds = {} -wood_sounds.footstep = {name="wood_walk", gain=1.0} -wood_sounds.dug = {name="wood_break", gain=1.0} -wood_sounds.place = {name="block_place", gain=1.0} - -minetest.register_node("portalgun:cplps1", { - description = "Close player portal", - tiles = {"portalgun_gray.png"}, - groups = {mesecon=2,snappy = 3, not_in_creative_inventory=0}, - sounds = stone_sounds, - is_ground_content = false, - mesecons = {effector = { - action_on = function (pos, node) - for i, ob in pairs(minetest.get_objects_inside_radius(pos, 6)) do - if ob and ob:is_player() then - portal_delete(ob:get_player_name(),0) - end - end - minetest.swap_node(pos, {name="portalgun:cplps2"}) - minetest.after((2), function(pos) - minetest.swap_node(pos, {name="portalgun:cplps1"}) - end, pos) - - - return false - end, - }} -}) - -minetest.register_node("portalgun:cplps3", { - description = "Close player portal when player is near", - tiles = {"portalgun_gray.png"}, - groups = {snappy = 3, not_in_creative_inventory=0}, - sounds = stone_sounds, - is_ground_content = false, - --every 2 seconds, check if player is near and close portal if so - on_timer = function (pos, elapsed) - for i, ob in pairs(minetest.get_objects_inside_radius(pos, 4)) do - if ob and ob:is_player() then - minetest.sound_play("portalgun_close", {pos=pos, gain=1.0, max_hear_distance = 10,}) - portal_delete(ob:get_player_name(),0) - end - --destroy Weighted storage cubes - --if name starts with '''portalgun:wsc''' - if ob and ob:get_luaentity() and ob:get_luaentity().name and string.sub(ob:get_luaentity().name,1,13) == "portalgun:wsc" then - ob:remove() - end - end - local timer = minetest.get_node_timer(pos) - timer:start(2) - return true - end, - after_place_node = function(pos, placer, itemstack, pointed_thing) - local timer = minetest.get_node_timer(pos) - timer:start(2) - end, -}) - -minetest.register_node("portalgun:cplps2", { - description = "Close player portal", - tiles = {"portalgun_gray.png^[colorize:#ffe85977"}, - groups = {mesecon=2,snappy = 3, not_in_creative_inventory=1}, - sounds = stone_sounds, - is_ground_content = false, - paramtype = "light", - light_source = 4, -}) - - - -minetest.register_node("portalgun:sign_v", { - description = "Sign V", - tiles = {"portalgun_v.png"}, - inventory_image = "portalgun_v.png", - drop="portalgun:sign_x", - drawtype = "nodebox", - groups = {mesecon=2,snappy = 3, not_in_creative_inventory=1}, - sounds = wood_sounds, - is_ground_content = false, - paramtype2 = "facedir", - paramtype = "light", - light_source = 5, - node_box = { - type="fixed", - fixed={-0.5,-0.5,0.45,0.5,0.5,0.5}}, - mesecons = {effector = { - action_off = function (pos, node) - minetest.swap_node(pos, {name="portalgun:sign_x", param2=minetest.get_node(pos).param2}) - end, - }} -}) - - -minetest.register_node("portalgun:sign_x", { - description = "Sign X", - tiles = {"portalgun_x.png"}, - inventory_image = "portalgun_x.png", - drawtype = "nodebox", - groups = {mesecon=2,snappy = 3, not_in_creative_inventory=0}, - sounds = wood_sounds, - is_ground_content = false, - paramtype2 = "facedir", - paramtype = "light", - light_source = 3, - node_box = { - type="fixed", - fixed={-0.5,-0.5,0.45,0.5,0.5,0.5}}, - mesecons = {effector = { - action_on = function (pos, node) - minetest.swap_node(pos, {name="portalgun:sign_v", param2=minetest.get_node(pos).param2}) - end, - }} -}) - - -local portaltarget_sig={ -{1,"portalgun_blue.png"}, -{2,"portalgun_orange.png"}, -} - -for ii = 1, #portaltarget_sig, 1 do - -minetest.register_node("portalgun:portaltarget_" .. portaltarget_sig[ii][1], { - description = "Portal target " .. portaltarget_sig[ii][1] , - tiles = {"portalgun_testblock.png^" .. portaltarget_sig[ii][2]}, - groups = {mesecon = 2,cracky=2}, - mesecons = {receptor = {state = "off"}}, - sounds = stone_sounds, - is_ground_content = false, - paramtype2 = "facedir", - paramtype = "light", - on_timer = function (pos, elapsed) - for i, ob in pairs(minetest.get_objects_inside_radius(pos, 2)) do - if ob:get_luaentity() and ob:get_luaentity().portalgun and ob:get_luaentity().project==portaltarget_sig[ii][1] then - mesecon.receptor_on(pos) - - return true - end - end - mesecon.receptor_off(pos) - return true - end, - on_construct = function(pos) - if not mesecon then return false end - minetest.get_node_timer(pos):start(2) - end, -}) -end - - - -minetest.register_node("portalgun:button", { - description = "Button", - tiles = {"portalgun_bu.png"}, - groups = {cracky = 3,mesecon=1}, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - selection_box = {type = "fixed",fixed = { -0.2, -0.5, -0.2, 0.2, 0.85, 0.2 }}, - sounds = stone_sounds, - mesecons = {receptor = {state = "off"}}, - on_rightclick = function(pos, node, clicker) - mesecon.receptor_on(pos) - minetest.get_node_timer(pos):start(2) - minetest.sound_play("button_press", {pos=pos,max_hear_distance = 10, gain = 1}) - end, - on_timer = function (pos, elapsed) - mesecon.receptor_off(pos) - end, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.25, -0.5, -0.25, 0.25, 0.7, 0.25}, - {-0.125, 0.5, -0.125, 0.125, 0.77, 0.125}, - }} - - - -}) - -minetest.register_node("portalgun:dmgblock_1", { - description = "Damage block (hurts when not active)", - tiles = {"portalgun_powerwall.png"}, - groups = {cracky = 1,mesecon=2}, - drawtype="glasslike", - paramtype="light", - alpha = 50, - sunlight_propagates = true, - sounds = stone_sounds, - walkable=false, - damage_per_second = 5, - mesecons = {conductor = { - state = mesecon.state.off, - onstate = "portalgun:dmgblock_2", - rules = pgad_rules - }}, -}) -minetest.register_node("portalgun:dmgblock_2", { - description = "Damage block", - tiles = {"portalgun_gravity.png"}, - groups = {mesecon=2,not_in_creative_inventory=1}, - drawtype="airlike", - pointable=false, - sunlight_propagates = true, - drop="portalgun:dmgblock_1", - paramtype="light", - walkable=false, - mesecons = {conductor = { - state = mesecon.state.on, - offstate = "portalgun:dmgblock_1", - rules = pgad_rules - }}, -}) - - - - - - - - - - - - - -minetest.register_on_respawnplayer(function(player) - local name=player:get_player_name() - minetest.after(1, function(name) - if portalgun.checkpoints[name]~=nil then - player:move_to(portalgun.checkpoints[name]) - end - end, name) - -end) -minetest.register_on_leaveplayer(function(player) - local name=player:get_player_name() - if portalgun.checkpoints[name]~=nil then - portalgun.checkpoints[name]=nil - end -end) -minetest.register_node("portalgun:autocheckpoint", { - description = "Checkpoint (teleports to here on death)", - tiles = {"portalgun_checkpoint.png"}, - groups = {cracky = 3,not_in_creative_inventory=0}, - paramtype = "light", - sunlight_propagates = true, - light_source = 5, - sounds = stone_sounds, - drawtype="nodebox", - node_box = { - type="fixed", - fixed={-0.5,-0.5,-0.5,0.5,-0.4,0.5}}, - on_construct = function(pos) - minetest.get_meta(pos):set_string("infotext","Checkpoint") - minetest.get_node_timer(pos):start(2) - end, - on_timer = function (pos, elapsed) - for i, ob in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do - if ob:is_player() then - local name=ob:get_player_name() - if portalgun.checkpoints[name]~=nil then - local cp=portalgun.checkpoints[name] - if cp.x==pos.x and cp.y==pos.y and cp.z==pos.z then - return true - end - end - portal_delete(name,0) - portalgun_portal[name]=nil - portalgun.checkpoints[name]=pos - minetest.sound_play("portalgun_checkpoint", {pos=pos,max_hear_distance = 5, gain = 1}) - minetest.chat_send_player(name, "<Portalgun> You will spawn here next time you die") - end - end - return true - end, -}) - -minetest.register_node("portalgun:powerdoor1_1", { - description = "Power door", - inventory_image = "portalgun_powerwall.png", - wield_image = "portalgun_powerwall.png", - groups = {mesecon=1,unbreakable = 1,not_in_creative_inventory=0}, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - sounds = stone_sounds, - drawtype="nodebox", - alpha = 160, - node_box = { - type="fixed", - fixed={-0.5,-0.5,0.4,0.5,0.5,0.5}}, - tiles = { - { - name = "portalgun_powerwall1.png", - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 0.2, - }, - }, - }, -after_place_node = function(pos, placer, itemstack) - local name=placer:get_player_name() - minetest.get_meta(pos):set_string("owner",name) - local p2=minetest.get_node(pos) - pos.y=pos.y+1 - local n=minetest.get_node(pos) - if n.name=="air" then - minetest.set_node(pos,{name="portalgun:powerdoor1_2",param2=p2.param2}) - minetest.get_meta(pos):set_string("owner",name) - end - end, -on_punch = function(pos, node, player, pointed_thing) - local meta = minetest.get_meta(pos); - if meta:get_string("owner")==player:get_player_name() then - minetest.node_dig(pos,minetest.get_node(pos),player) - pos.y=pos.y+1 - local un=minetest.get_node(pos).name - if un=="portalgun:powerdoor1_2" then - minetest.set_node(pos,{name="air"}) - end - pos.y=pos.y-1 - return true - end - end, - mesecons = {conductor = { - state = mesecon.state.off, - onstate = "portalgun:powerdoor2_1", - rules = pgad_rules - }}, -}) - -minetest.register_node("portalgun:powerdoor1_2", { - description = "Power door", - inventory_image = "portalgun_powerwall.png", - groups = {mesecon=1,unbreakable = 1,not_in_creative_inventory=1}, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - sounds = stone_sounds, - drawtype="nodebox", - alpha = 160, - node_box = { - type="fixed", - fixed={-0.5,-0.5,0.4,0.5,0.5,0.5}}, - tiles = { - { - name = "portalgun_powerwall1.png", - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 0.2, - }, - }, - }, -on_punch = function(pos, node, player, pointed_thing) - local meta = minetest.get_meta(pos); - if meta:get_string("owner")==player:get_player_name() then - minetest.set_node(pos,{name="air"}) - pos.y=pos.y-1 - local un=minetest.get_node(pos).name - if un=="portalgun:powerdoor1_1" then - minetest.node_dig(pos,minetest.get_node(pos),player) - end - pos.y=pos.y+1 - return true - end - end, - mesecons = {conductor = { - state = mesecon.state.off, - onstate = "portalgun:powerdoor2_2", - rules = pgad_rules - }}, -}) - -minetest.register_node("portalgun:powerdoor2_1", { - description = "Power door", - inventory_image = "portalgun_powerwall.png", - groups = {unbreakable=1,mesecon=1,not_in_creative_inventory=1}, - paramtype = "light", - sunlight_propagates = true, - drawtype="airlike", - walkable = false, - pointable = false, - diggable = false, - mesecons = {conductor = { - state = mesecon.state.on, - offstate = "portalgun:powerdoor1_1", - rules = pgad_rules - }}, -}) - -minetest.register_node("portalgun:powerdoor2_2", { - description = "Power door", - inventory_image = "portalgun_powerwall.png", - groups = {unbreakable=1,mesecon=1,not_in_creative_inventory=1}, - paramtype = "light", - sunlight_propagates = true, - drawtype="airlike", - walkable = false, - pointable = false, - diggable = false, - mesecons = {conductor = { - state = mesecon.state.on, - offstate = "portalgun:powerdoor1_2", - rules = pgad_rules - }}, -}) - - -minetest.register_node("portalgun:delayer", { - description = "Delayer (Punsh to change time)", - tiles = {"portalgun_delayer.png","portalgun_testblock.png"}, - groups = {dig_immediate = 2,mesecon=1}, - sounds = stone_sounds, - paramtype = "light", - sunlight_propagates = true, - drawtype="nodebox", - node_box = { - type="fixed", - fixed={-0.5,-0.5,-0.5,0.5,-0.4,0.5}}, -on_punch = function(pos, node, player, pointed_thing) - if minetest.is_protected(pos, player:get_player_name())==false then - local meta = minetest.get_meta(pos) - local time=meta:get_int("time") - if time>=10 then time=0 end - meta:set_int("time",time+1) - meta:set_string("infotext","Delayer (" .. (time+1) ..")") - end - end, - - - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_int("time",1) - meta:set_string("infotext","Delayer (1)") - meta:set_int("case",0) - end, - on_timer = function (pos, elapsed) - local meta = minetest.get_meta(pos) - if meta:get_int("case")==2 then - meta:set_int("case",0) - mesecon.receptor_off(pos) - end - if meta:get_int("case")==1 then - meta:set_int("case",2) - mesecon.receptor_on(pos) - minetest.get_node_timer(pos):start(meta:get_int("time")) - end - return false - end, - - mesecons = {effector = { - action_on = function (pos, node) - local meta = minetest.get_meta(pos) - if meta:get_int("case")==0 then - meta:set_int("case",1) - minetest.get_node_timer(pos):start(meta:get_int("time")) - end - - end, - }} -}) - - -minetest.register_node("portalgun:testblocks", { - description = "Trapblock", - tiles = {"portalgun_testblock.png"}, - groups = {cracky = 1,mesecon=2}, - sounds = stone_sounds, - mesecons = {conductor = { - state = mesecon.state.off, - onstate = "portalgun:testblocks2", - rules = pgad_rules - }}, -}) -minetest.register_node("portalgun:testblocks2", { - description = "Damage block", - tiles = {"portalgun_gravity.png"}, - groups = {mesecon=2,not_in_creative_inventory=1}, - drawtype="airlike", - pointable=false, - sunlight_propagates = true, - drop="portalgun:testblocks", - paramtype="light", - walkable=false, - mesecons = {conductor = { - state = mesecon.state.on, - offstate = "portalgun:testblocks", - rules = pgad_rules - }}, -}) - -minetest.register_node("portalgun:door_1", { - description = "Mesecon Door", - drop="portalgun:door_1", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.125, 0.5, 0.5, 0.125}, - } - }, - tiles = {"portalgun_testblock.png"}, - groups = {mesecon=1,cracky = 1, level = 2, not_in_creative_inventory=0}, - sounds = stone_sounds, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - is_ground_content = false, -after_place_node = function(pos, placer, itemstack, pointed_thing) - local p={x=pos.x,y=pos.y+1,z=pos.z} - if minetest.registered_nodes[minetest.get_node(p).name].walkable then - return false - else - minetest.set_node(p, {name = "portalgun:door_2",param2=minetest.get_node(pos).param2}) - end - end, - - - - mesecons = {effector = { - action_on = function (pos, node) - local p={x=pos.x,y=pos.y+1,z=pos.z} - minetest.swap_node(p, {name="portalgun:door_open_2", param2=minetest.get_node(pos).param2}) - minetest.swap_node(pos, {name="portalgun:door_open_1", param2=minetest.get_node(pos).param2}) - minetest.sound_play("portalgun_door", {pos=pos, gain = 1, max_hear_distance = 5}) - end, - }}, -after_dig_node = function (pos, name, digger) - minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z}, {name = "air"}) - end, -}) - -minetest.register_node("portalgun:door_2", { - description = "Door 2-1", - drawtype = "nodebox", - drop="portalgun:door_1", - node_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.125, 0.5, 0.5, 0.125}, - } - }, - tiles = {"portalgun_testblock.png"}, - groups = {mesecon=1,cracky = 1, level = 2, not_in_creative_inventory=1}, - sounds = wood_sounds, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - is_ground_content = false, - mesecons = {effector = { - action_on = function (pos, node) - local p={x=pos.x,y=pos.y-1,z=pos.z} - minetest.swap_node(p, {name="portalgun:door_open_1", param2=minetest.get_node(pos).param2}) - minetest.swap_node(pos, {name="portalgun:door_open_2", param2=minetest.get_node(pos).param2}) - minetest.sound_play("portalgun_door", {pos=pos, gain = 1, max_hear_distance = 5}) - - end, - }}, -after_dig_node = function (pos, name, digger) - minetest.set_node({x=pos.x,y=pos.y-1,z=pos.z}, {name = "air"}) - end, -}) - -minetest.register_node("portalgun:door_open_1", { - description = "Door (open) 2-o-1", - drop="portalgun:door_1", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {0.41, -0.5, -0.124, 1.41, 0.5, 0.125}, - } - }, - tiles = {"portalgun_testblock.png"}, - groups = {mesecon=1,cracky = 1, level = 2, not_in_creative_inventory=1}, - sounds = wood_sounds, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - is_ground_content = false, -after_dig_node = function (pos, name, digger) - minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z}, {name = "air"}) - end, - mesecons = {effector = { - action_off = function (pos, node) - local p={x=pos.x,y=pos.y+1,z=pos.z} - minetest.sound_play("portalgun_door", {pos=pos, gain = 1, max_hear_distance = 5}) - minetest.swap_node(p, {name="portalgun:door_2", param2=minetest.get_node(pos).param2}) - minetest.swap_node(pos, {name="portalgun:door_1", param2=minetest.get_node(pos).param2}) - end, - }} -}) - -minetest.register_node("portalgun:door_open_2", { - description = "Door (open) 2-o-1", - drawtype = "nodebox", - drop="portalgun:door_1", - node_box = { - type = "fixed", - fixed = { - {0.41, -0.5, -0.124, 1.41, 0.5, 0.125}, - } - }, - tiles = {"portalgun_testblock.png"}, - groups = {mesecon=1,cracky = 1, level = 2, not_in_creative_inventory=1}, - sounds = wood_sounds, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - is_ground_content = false, -after_dig_node = function (pos, name, digger) - minetest.set_node({x=pos.x,y=pos.y-1,z=pos.z}, {name = "air"}) - end, - mesecons = {effector = { - action_off = function (pos, node) - local p={x=pos.x,y=pos.y-1,z=pos.z} - minetest.sound_play("portalgun_door", {pos=pos, gain = 1, max_hear_distance = 5}) - minetest.swap_node(p, {name="portalgun:door_1", param2=minetest.get_node(pos).param2}) - minetest.swap_node(pos, {name="portalgun:door_2", param2=minetest.get_node(pos).param2}) - end, - }} -}) diff --git a/powerball.lua b/powerball.lua deleted file mode 100644 index 2d495d6..0000000 --- a/powerball.lua +++ /dev/null @@ -1,147 +0,0 @@ -stone_sounds = {} -stone_sounds.footstep = {name="stone_walk", gain=1.0} -stone_sounds.dug = {name="stone_break", gain=1.0} -stone_sounds.place = {name="block_place", gain=1.0} -glass_sounds = {} -glass_sounds.footstep = {name="glass_walk", gain=1.0} -glass_sounds.dug = {name="glass_break", gain=1.0} -glass_sounds.place = {name="block_place", gain=1.0} -wood_sounds = {} -wood_sounds.footstep = {name="wood_walk", gain=1.0} -wood_sounds.dug = {name="wood_break", gain=1.0} -wood_sounds.place = {name="block_place", gain=1.0} -minetest.register_node("portalgun:powerballspawner", { - description = "Power ball spawner" , - tiles = {"steel.png","steel.png","steel.png","steel.png","steel.png","portalgun_powerballspawner.png"}, - groups = {cracky=2}, - sounds = glass_sounds, - is_ground_content = false, - paramtype2 = "facedir", - 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==5 then v.y=-1 - elseif dir==4 then v.y=1 - else 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 = {"steel.png","steel.png","steel.png","steel.png","steel.png","portalgun_powerballspawner.png^[colorize:#aaaa0055"}, - groups = {cracky=2,mesecon=1}, - sounds = glass_sounds, - 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 = 0, - 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) - 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) - 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) - self.object:remove() - 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 = stone_sounds, - is_ground_content = false, - on_timer = function (pos, elapsed) - mesecon.receptor_off(pos) - return false - end, -}) diff --git a/scripts/buildingblocks.lua b/scripts/buildingblocks.lua new file mode 100644 index 0000000..d301a78 --- /dev/null +++ b/scripts/buildingblocks.lua @@ -0,0 +1,101 @@ +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} +local pgad_rules = { + {x = 1, y = 0, z = 0}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y = -1, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z = -1} +} +minetest.register_node( + "portalgun:testblock", + { + description = "Test block", + tiles = {"portalgun_testblock.png"}, + groups = {cracky = 1}, + sounds = stone_sounds + } +) + +minetest.register_node( + "portalgun:apb", + { + description = "Anti portal block", + tiles = {"portalgun_testblock.png^[colorize:#ffffffaa"}, + groups = {cracky = 3, antiportal = 1}, + sounds = stone_sounds + } +) + +minetest.register_node( + "portalgun:apg", + { + description = "Anti portal glass", + drawtype = "glasslike", + paramtype = "light", + sunlight_propagates = true, + tiles = {"glass.png^[colorize:#ffffffaa"}, + groups = {cracky = 1, antiportal = 1}, + sounds = glass_sounds + } +) +minetest.register_node( + "portalgun:hard_glass", + { + description = "Hard glass", + drawtype = "glasslike", + paramtype = "light", + sunlight_propagates = true, + tiles = {"glass.png^[colorize:#ddddddaa"}, + groups = {cracky = 1}, + sounds = glass_sounds + } +) +minetest.register_node( + "portalgun:testblocks", + { + description = "Trapblock", + tiles = {"portalgun_testblock.png"}, + groups = {cracky = 1, mesecon = 2}, + sounds = stone_sounds, + mesecons = { + conductor = { + state = mesecon.state.off, + onstate = "portalgun:testblocks2", + rules = pgad_rules + } + } + } +) +minetest.register_node( + "portalgun:testblocks2", + { + description = "Air block", + tiles = {"portalgun_gravity.png"}, + groups = {mesecon = 2, not_in_creative_inventory = 1}, + drawtype = "airlike", + pointable = false, + sunlight_propagates = true, + drop = "portalgun:testblocks", + paramtype = "light", + walkable = false, + mesecons = { + conductor = { + state = mesecon.state.on, + offstate = "portalgun:testblocks", + rules = pgad_rules + } + } + } +) diff --git a/scripts/button.lua b/scripts/button.lua new file mode 100644 index 0000000..1f82f7d --- /dev/null +++ b/scripts/button.lua @@ -0,0 +1,51 @@ +local pgad_rules = { + {x = 1, y = 0, z = 0}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y = -1, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z = -1} +} +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} + +minetest.register_node( + "portalgun:button", + { + description = "Button", + tiles = {"portalgun_bu.png"}, + groups = {cracky = 3, mesecon = 1}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + selection_box = {type = "fixed", fixed = {-0.2, -0.5, -0.2, 0.2, 0.85, 0.2}}, + sounds = stone_sounds, + mesecons = {receptor = {state = "off"}}, + on_rightclick = function(pos, node, clicker) + mesecon.receptor_on(pos) + minetest.get_node_timer(pos):start(2) + minetest.sound_play("button_press", {pos = pos, max_hear_distance = 10, gain = 1}) + end, + on_timer = function(pos, elapsed) + mesecon.receptor_off(pos) + end, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.25, -0.5, -0.25, 0.25, 0.7, 0.25}, + {-0.125, 0.5, -0.125, 0.125, 0.77, 0.125} + } + } + } +) diff --git a/scripts/cake.lua b/scripts/cake.lua new file mode 100644 index 0000000..dd9ee71 --- /dev/null +++ b/scripts/cake.lua @@ -0,0 +1,43 @@ +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} +minetest.register_node( + "portalgun:cake", + { + description = "Cake", + groups = {dig_immediate = 3, not_in_creative_inventory = 0}, + paramtype = "light", + sunlight_propagates = true, + selection_box = {type = "fixed", fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.3}}, + sounds = stone_sounds, + tiles = { + "dirt.png^portalgun_cake1.png", + "dirt.png^portalgun_cake2.png" + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.3125, -0.5, 0.375, 0.3125, -0.125, 0.4375}, + {-0.3125, -0.5, -0.4375, 0.3125, -0.125, -0.375}, + {-0.4375, -0.5, -0.3125, -0.375, -0.125, 0.3125}, + {0.375, -0.5, -0.3125, 0.4375, -0.125, 0.3125}, + {-0.375, -0.5, -0.375, 0.375, -0.125, 0.375}, + {-0.25, -0.5, 0.4375, 0.25, -0.125, 0.5}, + {-0.25, -0.5, -0.5, 0.25, -0.125, -0.4375}, + {0.4375, -0.5, -0.25, 0.5, -0.125, 0.25}, + {-0.5, -0.5, -0.25, -0.4375, -0.125, 0.25}, + {0, -0.125, -0.0625, 0.0625, 0.1875, 0} + } + } + } +) diff --git a/scripts/camera.lua b/scripts/camera.lua new file mode 100644 index 0000000..074172d --- /dev/null +++ b/scripts/camera.lua @@ -0,0 +1,73 @@ +stone_sounds = {} +stone_sounds.footstep = {name="stone_walk", gain=1.0} +stone_sounds.dug = {name="stone_break", gain=1.0} +stone_sounds.place = {name="block_place", gain=1.0} +glass_sounds = {} +glass_sounds.footstep = {name="glass_walk", gain=1.0} +glass_sounds.dug = {name="glass_break", gain=1.0} +glass_sounds.place = {name="block_place", gain=1.0} +wood_sounds = {} +wood_sounds.footstep = {name="wood_walk", gain=1.0} +wood_sounds.dug = {name="wood_break", gain=1.0} +wood_sounds.place = {name="block_place", gain=1.0} +minetest.register_node("portalgun:secam_off", { + description = "Security cam (off)" , + tiles = {"portalgun_scam.png"}, + drawtype = "nodebox", + walkable=false, + groups = {dig_immediate = 3}, + sounds = glass_sounds, + 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") + end, +on_rightclick = function(pos, node, player, itemstack, pointed_thing) + minetest.set_node(pos, {name ="portalgun:secam", param1 = node.param1, param2 = node.param2}) + minetest.get_node_timer(pos):start(1) +end, +}) +minetest.register_node("portalgun:secam", { + description = "Security cam", + tiles = {"portalgun_scam.png"}, + drawtype = "nodebox", + walkable=false, + groups = {dig_immediate = 3,stone=1,not_in_creative_inventory=1}, + sounds = glass_sounds, + is_ground_content = false, + paramtype = "light", + paramtype2 = "facedir", + drop="portalgun: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) + for i, ob in pairs(minetest.get_objects_inside_radius(pos, 10)) do + if ob:is_player() or (ob:get_luaentity() and ob:get_luaentity().itemstring==nil and ob:get_luaentity().portalgun==nil) then + if portalgun_visiable(pos,ob) then + local v=ob:get_pos() + if not ob:get_luaentity() then v.y=v.y+1 end + 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, "portalgun:bullet1") + m:set_velocity(s) + m:set_acceleration(s) + minetest.sound_play("portalgun_bullet1", {pos=pos, gain = 1, max_hear_distance = 15,}) + minetest.after((math.random(1,9)*0.1), function(pos,s,v) + local m=minetest.add_entity(pos, "portalgun:bullet1") + m:set_velocity(s) + m:set_acceleration(s) + minetest.sound_play("portalgun_bullet1", {pos=pos, gain = 1, max_hear_distance = 15,}) + end, pos,s,v) + end + end + end + return true + end, +}) \ No newline at end of file diff --git a/scripts/checkpoint.lua b/scripts/checkpoint.lua new file mode 100644 index 0000000..645b703 --- /dev/null +++ b/scripts/checkpoint.lua @@ -0,0 +1,64 @@ +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} +checkpoints={} +minetest.register_node("portalgun:autocheckpoint", { + description = "Checkpoint (teleports to here on death)", + tiles = {"portalgun_checkpoint.png"}, + groups = {cracky = 3,not_in_creative_inventory=0}, + paramtype = "light", + sunlight_propagates = true, + light_source = 5, + sounds = stone_sounds, + drawtype="nodebox", + node_box = { + type="fixed", + fixed={-0.5,-0.5,-0.5,0.5,-0.4,0.5}}, + on_construct = function(pos) + minetest.get_meta(pos):set_string("infotext","Checkpoint") + minetest.get_node_timer(pos):start(2) + end, + on_timer = function (pos, elapsed) + for i, ob in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do + if ob:is_player() then + local name=ob:get_player_name() + if checkpoints[name]~=nil then + local cp=checkpoints[name] + if cp.x==pos.x and cp.y==pos.y and cp.z==pos.z then + return true + end + end + portal_delete(name,0) + portalgun_portal[name]=nil + checkpoints[name]=pos + minetest.sound_play("portalgun_checkpoint", {pos=pos,max_hear_distance = 5, gain = 1}) + minetest.chat_send_player(name, "<Portalgun> You will spawn here next time you die") + end + end + return true + end, +}) +minetest.register_on_respawnplayer(function(player) + local name=player:get_player_name() + minetest.after(1, function(name) + if checkpoints[name]~=nil then + player:move_to(checkpoints[name]) + end + end, name) + +end) +minetest.register_on_leaveplayer(function(player) + local name=player:get_player_name() + if checkpoints[name]~=nil then + checkpoints[name]=nil + end +end) \ No newline at end of file diff --git a/scripts/cubespawners.lua b/scripts/cubespawners.lua new file mode 100644 index 0000000..e51e07e --- /dev/null +++ b/scripts/cubespawners.lua @@ -0,0 +1,101 @@ +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} +new = 0 +local ptgwsc = { + {"weightedstoragecube.png", "portalgun_presplat.png", "(blue)"}, + {"weightedstoragecube2.png", "portalgun_presplat2.png", "(orange)"}, + {"weightedstoragecube3.png", "portalgun_presplat3.png", "(yellow)"}, + {"weightedstoragecube4.png", "portalgun_presplat4.png", "(green)"}, + {"weightedcompanioncube.png", "portalgun_presplat.png", "(blue companion)"}, + {"weightedcompanioncube2.png", "portalgun_presplat2.png", "(orange companion)"}, + {"weightedcompanioncube3.png", "portalgun_presplat3.png", "(yellow companion)"}, + {"weightedcompanioncube4.png", "portalgun_presplat4.png", "(green companion)"} +} + +for ii = 1, #ptgwsc, 1 do + minetest.register_node( + "portalgun:wscspawner2_" .. ii, + { + description = "Weighted storage cube spawner2 " .. ptgwsc[ii][3], + tiles = {"steel.png", "steel.png", "steel.png", "steel.png", "steel.png", ptgwsc[ii][1]}, + groups = {cracky = 2, mesecon_receptor_off = 1, mesecon_effector_off = 1}, + sounds = glass_sounds, + is_ground_content = false, + paramtype2 = "facedir", + mesecons = { + receptor = {state = "off"}, + 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.2 + elseif dir == 2 then + v.z = 1.2 + elseif dir == 3 then + v.x = 1.2 + elseif dir == 8 then + v.y = -1.2 + elseif dir == 4 then + v.y = 1.2 + end + local pv = {x = pos.x + v.x, y = pos.y + v.y, z = pos.z + v.z} + new = 1 + local m = minetest.add_entity(pv, "portalgun:wsc" .. ii) + m:set_acceleration({x = 0, y = -10, z = 0}) + end + } + } + } + ) + minetest.register_node( + "portalgun:wscspawner" .. ii, + { + description = "Weighted storage cube spawner " .. ptgwsc[ii][3], + tiles = {ptgwsc[ii][1]}, + groups = {cracky = 1, not_in_creative_inventory = 0}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + light_source = 14, + sounds = stone_sounds, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.7, -0.5, -0.7, 0.7, -0.375, 0.7}, + {0.7, -0.5, -0.1875, 0.9, -0.4375, 0.1875}, + {-0.9, -0.5, -0.1875, -0.7, -0.4375, 0.1875}, + {-0.1875, -0.5, -0.9, 0.1875, -0.4375, -0.7}, + {-0.1875, -0.5, 0.7, 0.1875, -0.4375, 0.9} + } + }, + on_construct = function(pos) + minetest.get_node_timer(pos):start(5) + end, + on_timer = function(pos, elapsed) + for i, ob in pairs(minetest.get_objects_inside_radius(pos, 40)) do + if ob:get_luaentity() and ob:get_luaentity().wsc == ii then + return true + end + end + new = 1 + local m = minetest.add_entity(pos, "portalgun:wsc" .. ii) + m:set_acceleration({x = 0, y = -10, z = 0}) + return true + end + } + ) +end -- of for # diff --git a/scripts/damageblock.lua b/scripts/damageblock.lua new file mode 100644 index 0000000..57681dd --- /dev/null +++ b/scripts/damageblock.lua @@ -0,0 +1,63 @@ +local pgad_rules = { + {x = 1, y = 0, z = 0}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y = -1, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z = -1} +} +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} +minetest.register_node( + "portalgun:dmgblock_1", + { + description = "Damage block (hurts when not active)", + tiles = {"portalgun_powerwall.png"}, + groups = {cracky = 1, mesecon = 2}, + drawtype = "glasslike", + paramtype = "light", + alpha = 50, + sunlight_propagates = true, + sounds = stone_sounds, + walkable = false, + damage_per_second = 5, + mesecons = { + conductor = { + state = mesecon.state.off, + onstate = "portalgun:dmgblock_2", + rules = pgad_rules + } + } + } +) +minetest.register_node( + "portalgun:dmgblock_2", + { + description = "Damage block", + tiles = {"portalgun_gravity.png"}, + groups = {mesecon = 2, not_in_creative_inventory = 1}, + drawtype = "airlike", + pointable = false, + sunlight_propagates = true, + drop = "portalgun:dmgblock_1", + paramtype = "light", + walkable = false, + mesecons = { + conductor = { + state = mesecon.state.on, + offstate = "portalgun:dmgblock_1", + rules = pgad_rules + } + } + } +) diff --git a/scripts/delayer.lua b/scripts/delayer.lua new file mode 100644 index 0000000..08df39d --- /dev/null +++ b/scripts/delayer.lua @@ -0,0 +1,78 @@ +local pgad_rules = { + {x = 1, y = 0, z = 0}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y = -1, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z = -1} +} +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} + +minetest.register_node( + "portalgun:delayer", + { + description = "Delayer (Punsh to change time)", + tiles = {"portalgun_delayer.png", "portalgun_testblock.png"}, + groups = {dig_immediate = 2, mesecon = 1}, + sounds = stone_sounds, + paramtype = "light", + sunlight_propagates = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -0.4, 0.5} + }, + on_punch = function(pos, node, player, pointed_thing) + if minetest.is_protected(pos, player:get_player_name()) == false then + local meta = minetest.get_meta(pos) + local time = meta:get_int("time") + if time >= 10 then + time = 0 + end + meta:set_int("time", time + 1) + meta:set_string("infotext", "Delayer (" .. (time + 1) .. ")") + end + end, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("time", 1) + meta:set_string("infotext", "Delayer (1)") + meta:set_int("case", 0) + end, + on_timer = function(pos, elapsed) + local meta = minetest.get_meta(pos) + if meta:get_int("case") == 2 then + meta:set_int("case", 0) + mesecon.receptor_off(pos) + end + if meta:get_int("case") == 1 then + meta:set_int("case", 2) + mesecon.receptor_on(pos) + minetest.get_node_timer(pos):start(meta:get_int("time")) + end + return false + end, + mesecons = { + effector = { + action_on = function(pos, node) + local meta = minetest.get_meta(pos) + if meta:get_int("case") == 0 then + meta:set_int("case", 1) + minetest.get_node_timer(pos):start(meta:get_int("time")) + end + end + } + } + } +) diff --git a/scripts/doors.lua b/scripts/doors.lua new file mode 100644 index 0000000..2dfbdc8 --- /dev/null +++ b/scripts/doors.lua @@ -0,0 +1,322 @@ +local pgad_rules = { + {x = 1, y = 0, z = 0}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y = -1, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z = -1} +} +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} +minetest.register_node( + "portalgun:powerdoor1_1", + { + description = "Power door", + inventory_image = "portalgun_powerwall.png", + wield_image = "portalgun_powerwall.png", + groups = {mesecon = 1, unbreakable = 1, not_in_creative_inventory = 0}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + sounds = stone_sounds, + drawtype = "nodebox", + alpha = 160, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0.4, 0.5, 0.5, 0.5} + }, + tiles = { + { + name = "portalgun_powerwall1.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.2 + } + } + }, + after_place_node = function(pos, placer, itemstack) + local name = placer:get_player_name() + minetest.get_meta(pos):set_string("owner", name) + local p2 = minetest.get_node(pos) + pos.y = pos.y + 1 + local n = minetest.get_node(pos) + if n.name == "air" then + minetest.set_node(pos, {name = "portalgun:powerdoor1_2", param2 = p2.param2}) + minetest.get_meta(pos):set_string("owner", name) + end + end, + on_punch = function(pos, node, player, pointed_thing) + local meta = minetest.get_meta(pos) + if meta:get_string("owner") == player:get_player_name() then + minetest.node_dig(pos, minetest.get_node(pos), player) + pos.y = pos.y + 1 + local un = minetest.get_node(pos).name + if un == "portalgun:powerdoor1_2" then + minetest.set_node(pos, {name = "air"}) + end + pos.y = pos.y - 1 + return true + end + end, + mesecons = { + conductor = { + state = mesecon.state.off, + onstate = "portalgun:powerdoor2_1", + rules = pgad_rules + } + } + } +) + +minetest.register_node( + "portalgun:powerdoor1_2", + { + description = "Power door", + inventory_image = "portalgun_powerwall.png", + groups = {mesecon = 1, unbreakable = 1, not_in_creative_inventory = 1}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + sounds = stone_sounds, + drawtype = "nodebox", + alpha = 160, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0.4, 0.5, 0.5, 0.5} + }, + tiles = { + { + name = "portalgun_powerwall1.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.2 + } + } + }, + on_punch = function(pos, node, player, pointed_thing) + local meta = minetest.get_meta(pos) + if meta:get_string("owner") == player:get_player_name() then + minetest.set_node(pos, {name = "air"}) + pos.y = pos.y - 1 + local un = minetest.get_node(pos).name + if un == "portalgun:powerdoor1_1" then + minetest.node_dig(pos, minetest.get_node(pos), player) + end + pos.y = pos.y + 1 + return true + end + end, + mesecons = { + conductor = { + state = mesecon.state.off, + onstate = "portalgun:powerdoor2_2", + rules = pgad_rules + } + } + } +) + +minetest.register_node( + "portalgun:powerdoor2_1", + { + description = "Power door", + inventory_image = "portalgun_powerwall.png", + groups = {unbreakable = 1, mesecon = 1, not_in_creative_inventory = 1}, + paramtype = "light", + sunlight_propagates = true, + drawtype = "airlike", + walkable = false, + pointable = false, + diggable = false, + mesecons = { + conductor = { + state = mesecon.state.on, + offstate = "portalgun:powerdoor1_1", + rules = pgad_rules + } + } + } +) + +minetest.register_node( + "portalgun:powerdoor2_2", + { + description = "Power door", + inventory_image = "portalgun_powerwall.png", + groups = {unbreakable = 1, mesecon = 1, not_in_creative_inventory = 1}, + paramtype = "light", + sunlight_propagates = true, + drawtype = "airlike", + walkable = false, + pointable = false, + diggable = false, + mesecons = { + conductor = { + state = mesecon.state.on, + offstate = "portalgun:powerdoor1_2", + rules = pgad_rules + } + } + } +) +minetest.register_node( + "portalgun:door_1", + { + description = "Mesecon Door", + drop = "portalgun:door_1", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.125, 0.5, 0.5, 0.125} + } + }, + tiles = {"portalgun_testblock.png"}, + groups = {mesecon = 1, cracky = 1, level = 2, not_in_creative_inventory = 0}, + sounds = stone_sounds, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + after_place_node = function(pos, placer, itemstack, pointed_thing) + local p = {x = pos.x, y = pos.y + 1, z = pos.z} + if minetest.registered_nodes[minetest.get_node(p).name].walkable then + return false + else + minetest.set_node(p, {name = "portalgun:door_2", param2 = minetest.get_node(pos).param2}) + end + end, + mesecons = { + effector = { + action_on = function(pos, node) + local p = {x = pos.x, y = pos.y + 1, z = pos.z} + minetest.swap_node(p, {name = "portalgun:door_open_2", param2 = minetest.get_node(pos).param2}) + minetest.swap_node(pos, {name = "portalgun:door_open_1", param2 = minetest.get_node(pos).param2}) + minetest.sound_play("portalgun_door", {pos = pos, gain = 1, max_hear_distance = 5}) + end + } + }, + after_dig_node = function(pos, name, digger) + minetest.set_node({x = pos.x, y = pos.y + 1, z = pos.z}, {name = "air"}) + end + } +) + +minetest.register_node( + "portalgun:door_2", + { + description = "Door 2-1", + drawtype = "nodebox", + drop = "portalgun:door_1", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.125, 0.5, 0.5, 0.125} + } + }, + tiles = {"portalgun_testblock.png"}, + groups = {mesecon = 1, cracky = 1, level = 2, not_in_creative_inventory = 1}, + sounds = wood_sounds, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + mesecons = { + effector = { + action_on = function(pos, node) + local p = {x = pos.x, y = pos.y - 1, z = pos.z} + minetest.swap_node(p, {name = "portalgun:door_open_1", param2 = minetest.get_node(pos).param2}) + minetest.swap_node(pos, {name = "portalgun:door_open_2", param2 = minetest.get_node(pos).param2}) + minetest.sound_play("portalgun_door", {pos = pos, gain = 1, max_hear_distance = 5}) + end + } + }, + after_dig_node = function(pos, name, digger) + minetest.set_node({x = pos.x, y = pos.y - 1, z = pos.z}, {name = "air"}) + end + } +) + +minetest.register_node( + "portalgun:door_open_1", + { + description = "Door (open) 2-o-1", + drop = "portalgun:door_1", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {0.41, -0.5, -0.124, 1.41, 0.5, 0.125} + } + }, + tiles = {"portalgun_testblock.png"}, + groups = {mesecon = 1, cracky = 1, level = 2, not_in_creative_inventory = 1}, + sounds = wood_sounds, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + after_dig_node = function(pos, name, digger) + minetest.set_node({x = pos.x, y = pos.y + 1, z = pos.z}, {name = "air"}) + end, + mesecons = { + effector = { + action_off = function(pos, node) + local p = {x = pos.x, y = pos.y + 1, z = pos.z} + minetest.sound_play("portalgun_door", {pos = pos, gain = 1, max_hear_distance = 5}) + minetest.swap_node(p, {name = "portalgun:door_2", param2 = minetest.get_node(pos).param2}) + minetest.swap_node(pos, {name = "portalgun:door_1", param2 = minetest.get_node(pos).param2}) + end + } + } + } +) + +minetest.register_node( + "portalgun:door_open_2", + { + description = "Door (open) 2-o-1", + drawtype = "nodebox", + drop = "portalgun:door_1", + node_box = { + type = "fixed", + fixed = { + {0.41, -0.5, -0.124, 1.41, 0.5, 0.125} + } + }, + tiles = {"portalgun_testblock.png"}, + groups = {mesecon = 1, cracky = 1, level = 2, not_in_creative_inventory = 1}, + sounds = wood_sounds, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + after_dig_node = function(pos, name, digger) + minetest.set_node({x = pos.x, y = pos.y - 1, z = pos.z}, {name = "air"}) + end, + mesecons = { + effector = { + action_off = function(pos, node) + local p = {x = pos.x, y = pos.y - 1, z = pos.z} + minetest.sound_play("portalgun_door", {pos = pos, gain = 1, max_hear_distance = 5}) + minetest.swap_node(p, {name = "portalgun:door_1", param2 = minetest.get_node(pos).param2}) + minetest.swap_node(pos, {name = "portalgun:door_2", param2 = minetest.get_node(pos).param2}) + end + } + } + } +) diff --git a/scripts/editingtools.lua b/scripts/editingtools.lua new file mode 100644 index 0000000..0a39568 --- /dev/null +++ b/scripts/editingtools.lua @@ -0,0 +1,64 @@ +minetest.register_tool( + "portalgun:pick", + { + --a pickaxe that can mine all blocks + description = "Portalgun Pickaxe", + inventory_image = "portalgun_pick.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level = 3, + groupcaps = { + unbreakable = {times = {[1] = 1, [2] = 1, [3] = 1}, uses = 0, maxlevel = 3}, + fleshy = {times = {[1] = 1, [2] = 1, [3] = 1}, uses = 0, maxlevel = 3}, + choppy = {times = {[1] = 1, [2] = 1, [3] = 1}, uses = 0, maxlevel = 3}, + bendy = {times = {[1] = 1, [2] = 1, [3] = 1}, uses = 0, maxlevel = 3}, + cracky = {times = {[1] = 1, [2] = 1, [3] = 1}, uses = 0, maxlevel = 3}, + crumbly = {times = {[1] = 1, [2] = 1, [3] = 1}, uses = 0, maxlevel = 3}, + snappy = {times = {[1] = 1, [2] = 1, [3] = 1}, uses = 0, maxlevel = 3} + }, + damage_groups = {fleshy = 1000} + } + } +) +minetest.register_tool( + "portalgun:ed", + { + description = "Entity Destroyer", + inventory_image = "portalgun_edestroyer.png", + range = 15, + on_use = function(itemstack, user, pointed_thing) + local pos = user:get_pos() + if pointed_thing.type == "node" then + pos = pointed_thing.above + end + if pointed_thing.type == "object" then + pos = pointed_thing.ref:get_pos() + end + local name = user:get_player_name() + if minetest.check_player_privs(name, {kick = true}) == false then + minetest.chat_send_player(name, "You need the kick privilege to use this tool!") + return itemstack + end + for ii, ob in pairs(minetest.get_objects_inside_radius(pos, 7)) do + if ob:get_luaentity() then + ob:set_hp(0) + end + end + return itemstack + end + } +) +--register command for admins to build a testblock at the players position +minetest.register_chatcommand( + "testblock", + { + params = "", + description = "builds a testblock at the players position", + privs = {server = true}, + func = function(name, param) + local player = minetest.get_player_by_name(name) + local pos = player:get_pos() + minetest.set_node(pos, {name = "portalgun:testblock"}) + end + } +) diff --git a/scripts/fizzlers.lua b/scripts/fizzlers.lua new file mode 100644 index 0000000..bdd9b6d --- /dev/null +++ b/scripts/fizzlers.lua @@ -0,0 +1,88 @@ +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} + +minetest.register_node( + "portalgun:cplps1", + { + description = "Close player portal", + tiles = {"portalgun_gray.png"}, + groups = {mesecon = 2, snappy = 3, not_in_creative_inventory = 0}, + sounds = stone_sounds, + is_ground_content = false, + mesecons = { + effector = { + action_on = function(pos, node) + for i, ob in pairs(minetest.get_objects_inside_radius(pos, 6)) do + if ob and ob:is_player() then + portal_delete(ob:get_player_name(), 0) + end + end + minetest.swap_node(pos, {name = "portalgun:cplps2"}) + minetest.after( + (2), + function(pos) + minetest.swap_node(pos, {name = "portalgun:cplps1"}) + end, + pos + ) + + return false + end + } + } + } +) + +minetest.register_node( + "portalgun:cplps3", + { + description = "Close player portal when player is near", + tiles = {"portalgun_gray.png"}, + groups = {snappy = 3, not_in_creative_inventory = 0}, + sounds = stone_sounds, + is_ground_content = false, + --every 2 seconds, check if player is near and close portal if so + on_t = function(pos, elapsed) + for i, ob in pairs(minetest.get_objects_inside_radius(pos, 4)) do + if ob and ob:is_player() then + minetest.sound_play("portalgun_close", {pos = pos, gain = 1.0, max_hear_distance = 10}) + portal_delete(ob:get_player_name(), 0) + end + --destroy all entities except players + if ob and not ob:is_player() then + ob:remove() + end + end + local timer = minetest.get_node_timer(pos) + timer:start(2) + return true + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + local timer = minetest.get_node_timer(pos) + timer:start(2) + end + } +) + +minetest.register_node( + "portalgun:cplps2", + { + description = "Close player portal", + tiles = {"portalgun_gray.png^[colorize:#ffe85977"}, + groups = {mesecon = 2, snappy = 3, not_in_creative_inventory = 1}, + sounds = stone_sounds, + is_ground_content = false, + paramtype = "light", + light_source = 4 + } +) diff --git a/scripts/gravityuse.lua b/scripts/gravityuse.lua new file mode 100644 index 0000000..18f6397 --- /dev/null +++ b/scripts/gravityuse.lua @@ -0,0 +1,173 @@ +portalgun_power = {} +portalgun_power_tmp_power = 0 + +function portalgun_gravity(itemstack, user, pointed_thing) + local ob = pointed_thing.ref + local at = ob:get_attach() + if at and at:get_luaentity() and at:get_luaentity().portalgun_power then + ob:set_detach() + local target = at:get_luaentity().target + if target and target:get_luaentity() and (target:get_luaentity().itemstring or target:get_luaentity().wsc) then + target:set_velocity({x = 0, y = -1, z = 0}) + target:set_acceleration({x = 0, y = -8, z = 0}) + end + return itemstack + end + if not ob:get_attach() and (ob:is_player() or (ob:get_luaentity() and ob:get_luaentity().powerball ~= 1)) then + --if 4 blocks or closer to player + if vector.distance(ob:get_pos(), user:get_pos()) < 4 then + portalgun_power.user = user + portalgun_power.target = ob + if ob:is_player() then + portalgun_power.player = 1 + end + local m = minetest.add_entity(ob:get_pos(), "portalgun:power") + ob:set_attach(m, "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + return itemstack + end + end + + return itemstack +end + +minetest.register_entity( + "portalgun:power", + { + hp_max = 100, + physical = false, + weight = 0, + collisionbox = {-0.2, -0.2, -0.2, 0.2, 0.2, 0.2}, + visual = "sprite", + visual_size = {x = 1, y = 1}, + textures = {"portalgun_gravity.png"}, + spritediv = {x = 1, y = 1}, + is_visible = true, + makes_footstep_sound = false, + automatic_rotate = 0, + timer = 0, + time = 0.1, + portalgun_power = 1, + portalgun = 1, + lifelime = 100, + on_activate = function(self, staticdata) + if portalgun_power.user then + self.user = portalgun_power.user + self.target = portalgun_power.target + self.player = portalgun_power.player + portalgun_power = {} + else + self.object:remove() + end + end, + on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir) + if self.target and self.target:get_attach() then + self.target:set_detach() + self.target:set_hp(0) + end + end, + on_step = function(self, dtime) + self.timer = self.timer + dtime + if self.timer < self.time then + return self + end + self.timer = 0 + if self.target == nil or (not self.target:get_attach()) then + self.object:set_hp(0) + if self.sound then + minetest.sound_stop(self.sound) + end + end + if self.player then + self.lifelime = self.lifelime - 1 + if self.lifelime < 0 then + self.target:set_detach() + return self + end + end + local pos = self.user:get_pos() + if pos == nil then + return self + end + pos.y = pos.y + 1.6 + local dir = self.user:get_look_dir() + local npos = {x = pos.x + (dir.x * 2), y = pos.y + (dir.y * 2), z = pos.z + (dir.z * 2)} + if minetest.registered_nodes[minetest.get_node(npos).name].walkable then + return self + end + self.object:move_to(npos) + return self + end + } +) + +minetest.register_entity( + "portalgun:power2", + { + hp_max = 100, + physical = true, + weight = 10, + collisionbox = {-0.35, 0, -0.35, 0.35, 1, 0.35}, + visual = "sprite", + visual_size = {x = 1, y = 1}, + textures = {"portalgun_gravity.png"}, + spritediv = {x = 1, y = 1}, + is_visible = true, + makes_footstep_sound = false, + automatic_rotate = 0, + timer = 0, + time = 0.025, + portalgun_power = 1, + portalgun = 1, + lifelime = 1000, + v = 0.3, + ltime = 0, + on_activate = function(self, staticdata) + if portalgun_power.user then + self.user = portalgun_power.user + self.target = portalgun_power.target + self.ltime = portalgun_power_tmp_power + portalgun_power = {} + else + self.object:remove() + end + end, + on_step = function(self, dtime) + local pos = self.object:get_pos() + local v = self.object:get_velocity() + local v2 = {x = v.x - self.v, y = (v.y - self.v) * 0.99, z = v.z - self.v} + + if v2.x < 0.5 and v2.x > -0.5 then + v2.x = 0 + end + if v2.y < 0.5 and v2.y > -0.5 then + v2.y = 0 + end + if v2.z < 0.5 and v2.z > -0.5 then + v2.z = 0 + end + + self.object:set_velocity(v2) + self.ltime = self.ltime - self.v + + if self.ltime < self.v or (v2.x + v2.y + v2.z == 0) then + self.lifelime = -1 + end + + local nexpos = {x = pos.x + (v.x * 0.05), y = pos.y + (v.y * 0.05) + 1, z = pos.z + (v.z * 0.05)} + if minetest.registered_nodes[minetest.get_node(nexpos).name].walkable then + self.lifelime = -1 + end + + self.lifelime = self.lifelime - 1 + if self.lifelime < 0 then + self.target:set_detach() + end + + if self.target == nil or (not self.target:get_attach()) then + self.object:set_hp(0) + return self + end + return self + end + } +) diff --git a/scripts/objectdestroyer.lua b/scripts/objectdestroyer.lua new file mode 100644 index 0000000..87a26e2 --- /dev/null +++ b/scripts/objectdestroyer.lua @@ -0,0 +1,51 @@ +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} +minetest.register_node( + "portalgun:objdestroyer_1", + { + description = "Object destroyer (destroys on active)", + tiles = {"portalgun_testblock.png^[colorize:#FF0000aa"}, + groups = {cracky = 2, mesecon = 1}, + sounds = stone_sounds, + mesecons = { + effector = { + action_on = function(pos, node) + minetest.set_node(pos, {name = "portalgun:objdestroyer_2"}) + for i, ob in pairs(minetest.get_objects_inside_radius(pos, 5)) do + if ob:get_luaentity() then + ob:set_hp(0) + end + end + end + } + } + } +) +minetest.register_node( + "portalgun:objdestroyer_2", + { + description = "Obj destroyer", + tiles = {"portalgun_testblock.png^[colorize:#FF0000cc"}, + groups = {cracky = 2, mesecon = 1, not_in_creative_inventory = 1}, + sunlight_propagates = true, + drop = "portalgun:objdestroyer_1", + paramtype = "light", + light_source = 14, + mesecons = { + conductor = { + state = mesecon.state.on, + offstate = "portalgun:objdestroyer_1" + } + } + } +) diff --git a/scripts/portalgun.lua b/scripts/portalgun.lua new file mode 100644 index 0000000..894c050 --- /dev/null +++ b/scripts/portalgun.lua @@ -0,0 +1,664 @@ +portalgun_portal = {} +portalgun_portal_tmp_user_abort = 0 +portalgun_portal_tmp_user = "" +local portalgun_timer = 1.2 +local portalgun_time = 0 +portalgun_lifelime = 1200 --deletes portals that not used after a while +portalgun_max_rage = 100 +portalgun_max_use_per_secund_time = 4 --destroys the portal if excessive used +portalgun_max_use_per_secund = 25 --4 & 25 is default = teleported (teleported 25 times in 4 sec) +function portalgun_param2(pos, param2, r) + local pos2 = {x = pos.x, y = pos.y, z = pos.z} + if r then + if param2 == 0 then + pos2.x = pos2.x - 1 + elseif param2 == 1 then + pos2.z = pos2.z + 1 + elseif param2 == 2 then + pos2.x = pos2.x + 1 + elseif param2 == 3 then + pos2.z = pos2.z - 1 + end + else + if param2 == 0 then + pos2.x = pos2.x + 1 + elseif param2 == 1 then + pos2.z = pos2.z - 1 + elseif param2 == 2 then + pos2.x = pos2.x - 1 + elseif param2 == 3 then + pos2.z = pos2.z + 1 + end + end + return pos2 +end + +local function portalgun_getLength(a) -- get length of an array / table + local count = 0 + for _ in pairs(a) do + count = count + 1 + end + return count +end + +function portal_delete(name, n) -- using set_hp & :punch instand of :remove ... no risk for crash if something attach it + if portalgun_portal[name] == nil then + return + end + if (n == 1 or n == 0) and portalgun_portal[name].portal1 ~= nil then + if n == 0 then + local pos = portalgun_portal[name].portal1:get_pos() + if pos ~= nil then + minetest.sound_play("portalgun_closeportals", {pos = pos, max_hear_distance = 20, gain = 1}) + end + end + portalgun_portal[name].portal1_active = false + portalgun_portal[name].portal1:set_hp(0) + end + if (n == 2 or n == 0) and portalgun_portal[name].portal2 ~= nil then + if n == 0 then + local pos = portalgun_portal[name].portal2:get_pos() + if pos ~= nil then + minetest.sound_play("portalgun_closeportals", {pos = pos, max_hear_distance = 20, gain = 1}) + end + end + portalgun_portal[name].portal2_active = false + portalgun_portal[name].portal2:set_hp(0) + end + if n == 0 then + portalgun_portal[name] = nil + end +end + +minetest.register_on_leaveplayer( + function(player) -- deletes user the profile (saveing memory) + local name = player:get_player_name() + portal_delete(name, 0) + portalgun_portal[name] = nil + end +) +minetest.register_on_dieplayer( + function(player) + local name = player:get_player_name() + portal_delete(name, 0) + portalgun_portal[name] = nil + end +) + +portalgun_on_step = function(self, dtime) + local name = self.user + + if portalgun_portal[self.user] == nil then + self.object:remove() + return self + end + + if + (self.project == 1 and self.use ~= portalgun_portal[self.user].portal1_use) or + (self.project == 2 and self.use ~= portalgun_portal[self.user].portal2_use) + then + self.object:remove() + return self + end + + if portalgun_portal[name].lifelime < 0 then + portal_delete(name, 0) + return self + end + + if portalgun_portal[name].portal1_active and portalgun_portal[name].portal2_active then -- makes lifetime equal when both is acive, or it will be half + portalgun_portal[name].lifelime = portalgun_portal[name].lifelime - 0.5 + else + portalgun_portal[name].lifelime = portalgun_portal[name].lifelime - 1 + return self -- abort when only 1 is active (saves cpu) + end + + if portalgun_portal[name].timer > 0 then -- makes teleported stuff wont move back at same time (bug fix) + portalgun_portal[name].timer = portalgun_portal[name].timer - dtime + return self + end + + if self.portal_max_use > 0 then -- makes teleported stuff wont move back at same time (bug fix) + self.portal_max_use_time = self.portal_max_use_time + dtime + if self.portal_max_use >= portalgun_max_use_per_secund then + portal_delete(name, self.project) + return self + elseif self.portal_max_use_time >= portalgun_max_use_per_secund_time then + self.portal_max_use_time = 0 + self.portal_max_use = 0 + end + end + + local pos1 = 0 + local pos2 = 0 + local d1 = 0 + local d2 = 0 + if self.project == 1 then + pos1 = portalgun_portal[name].portal1_pos + pos2 = portalgun_portal[name].portal2_pos + d1 = portalgun_portal[name].portal1_dir + d2 = portalgun_portal[name].portal2_dir + else + pos1 = portalgun_portal[name].portal2_pos + pos2 = portalgun_portal[name].portal1_pos + d1 = portalgun_portal[name].portal2_dir + d2 = portalgun_portal[name].portal1_dir + end + + -- portalgun_front_of_field should fix teleport through walls, but is not working in all directions + -- waiting with this issue + + if pos2 ~= 0 and pos1 ~= 0 then + for ii, ob in pairs(minetest.get_objects_inside_radius(pos1, self.area)) do + if pos2 ~= 0 then --and portalgun_front_of_field(self.object,ob) + if + (ob:is_player()) or + (ob:get_luaentity() and ob:get_luaentity().portalgun ~= 1 and + ob:get_luaentity().name:find(":text", 4) == nil) + then + if ob:get_attach() then + ob:set_detach() + ob:set_acceleration({x = 0, y = -10, z = 0}) + end + --set velocity then teleport + local p = pos2 + local x = 0 + local y = 0 + local z = 0 + local dis = 2 + if p == nil or p.x == nil then + return self + end + + if ob:is_player() then + local v = ob:get_player_velocity() + local player_name = ob:get_player_name() + portalgun_power.user = player_name + portalgun_power.target = ob + local vv = {x = v.x, y = v.y, z = v.z} + -- get the highest velocity + dis = 2 + if vv.x + vv.y + vv.z <= 0.3 then + if self.small == true then + vv.x = 1.4 + else + vv.x = 2 + end + end + if vv.x + vv.y + vv.z == 0 then + vv.x = 2 + end + if vv.x < 0 then + vv.x = vv.x * -1 + end + if vv.y < 0 then + vv.y = vv.y * -1 + end + if vv.z < 0 then + vv.z = vv.z * -1 + end + if vv.x > vv.z then + vv.a = vv.x + else + vv.a = vv.z + end + if vv.a < vv.y then + vv.a = vv.y + end + portalgun_power_tmp_power = vv.a + local m = minetest.add_entity(ob:get_pos(), "portalgun:power2") + ob:set_attach(m, "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + m:set_velocity(v) + m:set_acceleration({x = 0, y = -10, z = 0}) + ob = m + end + + if ob:is_player() == false then + local v = ob:get_velocity() + if v.x < 0 then + v.x = v.x * -1 + end + if v.y < 0 then + v.y = v.y * -1 + end + if v.z < 0 then + v.z = v.z * -1 + end + + local vv = 0 -- get the highest velocity + if v.x > v.z then + vv = v.x + else + vv = v.z + end + if vv < v.y then + vv = v.y + end + v.x = 0 + v.y = 0 + v.z = 0 + if d2 == "x+" then + v.x = vv + end + if d2 == "x-" then + v.x = vv * -1 + end + if d2 == "y+" then + v.y = vv + end + if d2 == "y-" then + v.y = vv * -1 + end + if d2 == "z+" then + v.z = vv + end + if d2 == "z-" then + v.z = vv * -1 + end + ob:set_velocity({x = v.x, y = v.y, z = v.z}) + end + if d2 == "x+" then + x = 2 + elseif d2 == "x-" then + x = -dis + elseif d2 == "y+" then + y = dis + elseif d2 == "y-" then + y = -dis + elseif d2 == "z+" then + z = dis + elseif d2 == "z-" then + z = -dis + end + local obpos = {x = p.x + x, y = p.y + y, z = p.z + z} + portalgun_portal[name].timer = 0.2 + self.portal_max_use = self.portal_max_use + 1 + ob:set_pos(obpos, false) + portalgun_portal[name].lifelime = portalgun_lifelime + minetest.sound_play( + "portalgun_teleport", + {pos = portalgun_portal[name].portal1_pos, max_hear_distance = 10, gain = 30} + ) + minetest.sound_play( + "portalgun_teleport", + {pos = portalgun_portal[name].portal2_pos, max_hear_distance = 10, gain = 30} + ) + end --end of set velocity part then teleport + end + end + end +end + +minetest.register_entity( + "portalgun:portal", + { + -- the portals + hp_max = 10000, + visual = "mesh", + mesh = "portalgun_portal_xp.obj", + physical = false, + textures = {"portalgun_blue.png"}, + visual_size = {x = 1, y = 1}, + spritediv = {x = 7, y = 0}, + collisionbox = {0, 0, 0, 0, 0, 0}, + timer = 0, + user = "", + project = 1, + portalgun = 1, + portal_max_use = 0, + portal_max_use_time = 0, + area = 2, + small = false, + get_staticdata = function(self) + return minetest.serialize( + { + user = self.user, + project = self.project, + use = self.use + } + ) + end, + on_activate = function(self, staticdata) + local data = minetest.deserialize(staticdata) + if data and type(data) == "table" then + self.user = data.user + self.project = data.project + self.use = data.use + if portalgun_portal[self.user] == nil then + self.object:remove() + return self + end + if + (self.project == 1 and self.use ~= portalgun_portal[self.user].portal1_use) or + (self.project == 2 and self.use ~= portalgun_portal[self.user].portal2_use) + then + self.object:remove() + return self + end + elseif portalgun_portal_tmp_user ~= "" then + self.user = portalgun_portal_tmp_user + portalgun_portal_tmp_user = "" + self.project = portalgun_portal[self.user].project + + if self.project == 1 then -- if inactivated then activated and another portal is created: remove + self.use = portalgun_portal[self.user].portal1_use + else + self.use = portalgun_portal[self.user].portal2_use + end + else + self.object:remove() + return self + end + + if portalgun_portal[self.user] == nil then + self.object:remove() + return self + end + + local d = "" + if self.project == 1 then + d = portalgun_portal[self.user].portal1_dir + self.object:set_properties({textures = {"portalgun_blue.png"}}) + else + d = portalgun_portal[self.user].portal2_dir + self.object:set_properties({textures = {"portalgun_orange.png"}}) + end + if d == "x+" then + self.object:set_yaw(math.pi * 0) + elseif d == "x-" then + self.object:set_yaw(math.pi * 1) + elseif d == "y+" then + self.object:set_properties({mesh = "portalgun_portal_yp.obj"}) -- becaouse there is no "setpitch" + elseif d == "y-" then + self.object:set_properties({mesh = "portalgun_portal_ym.obj"}) -- becaouse there is no "setpitch" + elseif d == "z+" then + self.object:set_yaw(math.pi * 0.5) + elseif d == "z-" then + self.object:set_yaw(math.pi * 1.5) + end + if d == "y+" then + local pos1 = {} + if self.project == 1 then + pos1 = portalgun_portal[self.user].portal1_pos + else + pos1 = portalgun_portal[self.user].portal2_pos + end + if portalgun_portal[self.user].y > 8 then + pos1.y = pos1.y + 1 + end + if portalgun_portal[self.user].y > 12 then + pos1.y = pos1.y + 1 + end + if self.project == 1 then + portalgun_portal[self.user].portal1_pos = pos1 + else + portalgun_portal[self.user].portal2_pos = pos1 + end + elseif + string.find(d, "y", 1) == nil and (portalgun_portal[self.user].x + portalgun_portal[self.user].z < 2.5) + then + self.area = 1.2 + self.small = true + self.object:set_properties({visual_size = {x = 0.7, y = 0.7}}) + end + end, + on_step = portalgun_on_step + } +) +minetest.register_craftitem( + ":", + { + description = "Portalgun", + range = 100, + inventory_image = "portalgun_gun0_rndr.png", + wield_image = "portalgun_gun0_rndr.png", + tool_capabilities = { + full_punch_interval = 0.5, + max_drop_level = 3, + damage_groups = {fleshy = 1} + }, + on_place = function(itemstack, user, pointed_thing) + local node = minetest.get_node(pointed_thing.under) + if node.name == "portalgun:button" then + --use the item normally + minetest.item_place(itemstack, user, pointed_thing) + else + portalgun_onuse(itemstack, user, pointed_thing, 2) + end + return itemstack + end, + on_use = function(itemstack, user, pointed_thing) + --if pointing at turret then start breaking it + if pointed_thing.type == "node" then + local node = minetest.get_node(pointed_thing.under) + if node.name == "portalgun:turretgun" or node.name == "portalgun:turretgun2" then + minetest.remove_node(pointed_thing.under) + end + end + portalgun_onuse(itemstack, user, pointed_thing, 1) + return itemstack + end + } +) + +local function rnd(r) + return math.floor(r + 0.5) +end + +function portalgun_onuse(itemstack, user, pointed_thing, mode) -- using the gun + if pointed_thing.type == "object" then + portalgun_gravity(itemstack, user, pointed_thing) + return itemstack + end + + local pos = user:get_pos() + local dir = user:get_look_dir() + local key = user:get_player_control() + local name = user:get_player_name() + local exist = 0 + + local item = itemstack:to_table() + local ob = {} + ob.project = 1 + ob.lifelime = portalgun_lifelime + ob.portal1 = 0 + ob.portal2 = 0 + ob.portal1_dir = 0 + ob.portal2_dir = 0 + ob.portal2_pos = 0 + ob.portal1_pos = 0 + ob.user = user:get_player_name() + + if portalgun_portal[name] == nil then -- new portal profile + portalgun_portal[name] = { + lifelime = portalgun_lifelime, + project = 1, + timer = 0, + portal1_active = false, + portal2_active = false, + portal1_use = 0, + portal2_use = 0 + } + end + + if key.sneak then + portal_delete(name, 0) + return itemstack + end + + pos.y = pos.y + 1.5 + + -- the project + + for i = 1, portalgun_max_rage, 0.5 do + local nname = + minetest.get_node({x = pos.x + (dir.x * i), y = pos.y + (dir.y * i), z = pos.z + (dir.z * i)}).name + if minetest.registered_nodes[nname].walkable then + portalgun_portal[name].lifelime = portalgun_lifelime + + if minetest.get_node_group(nname, "antiportal") > 0 then + minetest.sound_play("portalgun_error", {pos = pos, max_hear_distance = 5, gain = 3}) + return itemstack + elseif minetest.get_node_group(nname, "proportal") == 0 then + minetest.sound_play("portalgun_error", {pos = pos, max_hear_distance = 5, gain = 3}) + return itemstack + end + + if + minetest.registered_nodes[ + minetest.get_node( + {x = rnd(pos.x + (dir.x * i)), y = rnd(pos.y + (dir.y * i) + 1), z = rnd(pos.z + (dir.z * i))} + ).name + ].walkable == false and rnd(user:get_pos().y) > rnd(pos.y + (dir.y * i)) + then + portalgun_setportal(pos, name, dir, i, mode, "y+") + return itemstack + elseif + minetest.registered_nodes[ + minetest.get_node( + {x = rnd(pos.x + (dir.x * i)), y = rnd(pos.y + (dir.y * i) - 1), z = rnd(pos.z + (dir.z * i))} + ).name + ].walkable == false and rnd(user:get_pos().y) < rnd(pos.y + (dir.y * i)) + then + portalgun_setportal(pos, name, dir, i, mode, "y-") + return itemstack + elseif + minetest.registered_nodes[ + minetest.get_node( + {x = rnd(pos.x + (dir.x * i) - 1), y = rnd(pos.y + (dir.y * i)), z = rnd(pos.z + (dir.z * i))} + ).name + ].walkable == false and rnd(user:get_pos().x) < rnd(pos.x + (dir.x * i)) + then + portalgun_setportal(pos, name, dir, i, mode, "x-") + return itemstack + elseif + minetest.registered_nodes[ + minetest.get_node( + {x = rnd(pos.x + (dir.x * i)) + 1, y = rnd(pos.y + (dir.y * i)), z = rnd(pos.z + (dir.z * i))} + ).name + ].walkable == false and rnd(user:get_pos().x) > rnd(pos.x + (dir.x * i)) + then + portalgun_setportal(pos, name, dir, i, mode, "x+") + return itemstack + elseif + minetest.registered_nodes[ + minetest.get_node( + {x = rnd(pos.x + (dir.x * i)), y = rnd(pos.y + (dir.y * i)), z = rnd(pos.z + (dir.z * i) - 1)} + ).name + ].walkable == false and rnd(user:get_pos().z) < rnd(pos.z + (dir.z * i)) + then + portalgun_setportal(pos, name, dir, i, mode, "z-") + return itemstack + elseif + minetest.registered_nodes[ + minetest.get_node( + {x = rnd(pos.x + (dir.x * i)), y = rnd(pos.y + (dir.y * i)), z = rnd(pos.z + (dir.z * i) + 1)} + ).name + ].walkable == false and rnd(user:get_pos().z) > rnd(pos.z + (dir.z * i)) + then + portalgun_setportal(pos, name, dir, i, mode, "z+") + return itemstack + end + minetest.sound_play("portalgun_error", {pos = pos, max_hear_distance = 20, gain = 3}) + return itemstack + end + end + return itemstack +end + +function portalgun_setportal(pos, name, dir, i, mode, portal_dir) + local lpos = {x = pos.x + (dir.x * (i - 1)), y = pos.y + (dir.y * (i - 1)), z = pos.z + (dir.z * (i - 1))} -- last pos + local cpos = {x = pos.x + (dir.x * i), y = pos.y + (dir.y * i), z = pos.z + (dir.z * i)} -- corrent poss + if portal_dir == "y+" then + cpos.y = (math.floor(cpos.y + 0.5)) + 0.524 + elseif portal_dir == "y-" then + cpos.y = (math.floor(cpos.y + 0.5)) - 0.524 + elseif portal_dir == "z+" then + cpos.z = (math.floor(cpos.z + 0.5)) + 0.524 + elseif portal_dir == "z-" then + cpos.z = (math.floor(cpos.z + 0.5)) - 0.524 + elseif portal_dir == "x+" then + cpos.x = (math.floor(cpos.x + 0.5)) + 0.524 + elseif portal_dir == "x-" then + cpos.x = (math.floor(cpos.x + 0.5)) - 0.524 + end + + if portal_dir == "x+" or portal_dir == "x-" then -- auto correct (place in center) + cpos.y = (math.floor(cpos.y + 0.5)) + cpos.z = (math.floor(cpos.z + 0.5)) + elseif portal_dir == "y+" or portal_dir == "y-" then + cpos.x = (math.floor(cpos.x + 0.5)) + cpos.z = (math.floor(cpos.z + 0.5)) + elseif portal_dir == "z+" or portal_dir == "z-" then + cpos.x = (math.floor(cpos.x + 0.5)) + cpos.y = (math.floor(cpos.y + 0.5)) + end + + if minetest.registered_nodes[minetest.get_node(cpos).name].walkable then + minetest.sound_play("portalgun_error", {pos = pos, max_hear_distance = 5, gain = 3}) + return false + end + + if string.find(portal_dir, "x", 1) or string.find(portal_dir, "z", 1) then -- auto correct (move from bottom / top) + local testpos1 = {x = cpos.x, y = cpos.y - 1, z = cpos.z} + local testpos2 = {x = cpos.x, y = cpos.y + 1, z = cpos.z} + if + minetest.registered_nodes[minetest.get_node(testpos1).name].walkable and + minetest.registered_nodes[minetest.get_node(testpos2).name].walkable == false + then + cpos.y = cpos.y + 0.5 + elseif + minetest.registered_nodes[minetest.get_node(testpos2).name].walkable and + minetest.registered_nodes[minetest.get_node(testpos1).name].walkable == false + then + cpos.y = cpos.y - 0.5 + end + end + + portalgun_portal_tmp_user = name + portalgun_portal[name].x = pos.x - lpos.x + portalgun_portal[name].y = pos.y - lpos.y + portalgun_portal[name].z = pos.z - lpos.z + portalgun_portal[name].project = mode + + if portalgun_portal[name].x < 0 then + portalgun_portal[name].x = portalgun_portal[name].x * -1 + end + if portalgun_portal[name].z < 0 then + portalgun_portal[name].z = portalgun_portal[name].z * -1 + end + + if mode == 1 then + portal_delete(name, 1) + portalgun_portal[name].portal1_use = portalgun_portal[name].portal1_use + 1 + portalgun_portal[name].portal1_dir = portal_dir + portalgun_portal[name].portal1_pos = cpos + portalgun_portal[name].portal1 = minetest.add_entity(cpos, "portalgun:portal") + portalgun_portal[name].portal1_active = true + minetest.sound_play("portalgun_portalblue", {pos = cpos, max_hear_distance = 20, gain = 1}) + else + portal_delete(name, 2) + portalgun_portal[name].portal2_use = portalgun_portal[name].portal2_use + 1 + portalgun_portal[name].portal2_dir = portal_dir + portalgun_portal[name].portal2_pos = cpos + portalgun_portal[name].portal2 = minetest.add_entity(cpos, "portalgun:portal") + portalgun_portal[name].portal2_active = true + minetest.sound_play("portalgun_portalorange", {pos = cpos, max_hear_distance = 20, gain = 1}) + end +end + +portalgun_front_of_field = function(ob, ob2) + local pos2 = ob2:get_pos() + return vector.distance(ob:get_pos(), pos2) > vector.distance(portalgun_pointat(ob), pos2) +end + +portalgun_pointat = function(ob) + local pos = ob:get_pos() + local yaw = ob:get_yaw() + if yaw ~= yaw or type(yaw) ~= "number" then + yaw = 0 + end + local z = math.sin(yaw) * -0.1 + local x = math.cos(yaw) * 0.1 + return {x = pos.x + x, y = pos.y, z = pos.z + z} +end diff --git a/scripts/portaltarget.lua b/scripts/portaltarget.lua new file mode 100644 index 0000000..2787981 --- /dev/null +++ b/scripts/portaltarget.lua @@ -0,0 +1,52 @@ +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} +local portaltarget_sig = { + {1, "portalgun_blue.png"}, + {2, "portalgun_orange.png"} +} + +for ii = 1, #portaltarget_sig, 1 do + minetest.register_node( + "portalgun:portaltarget_" .. portaltarget_sig[ii][1], + { + description = "Portal target " .. portaltarget_sig[ii][1], + tiles = {"portalgun_testblock.png^" .. portaltarget_sig[ii][2]}, + groups = {mesecon = 2, cracky = 2}, + mesecons = {receptor = {state = "off"}}, + sounds = stone_sounds, + is_ground_content = false, + paramtype2 = "facedir", + paramtype = "light", + on_timer = function(pos, elapsed) + for i, ob in pairs(minetest.get_objects_inside_radius(pos, 2)) do + if + ob:get_luaentity() and ob:get_luaentity().portalgun and + ob:get_luaentity().project == portaltarget_sig[ii][1] + then + mesecon.receptor_on(pos) + + return true + end + end + mesecon.receptor_off(pos) + return true + end, + on_construct = function(pos) + if not mesecon then + return false + end + minetest.get_node_timer(pos):start(2) + end + } + ) +end diff --git a/scripts/powerball.lua b/scripts/powerball.lua new file mode 100644 index 0000000..1b36de5 --- /dev/null +++ b/scripts/powerball.lua @@ -0,0 +1,86 @@ +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} +new = 0 +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 = 0, + portalgun = 2, + powerball = 1, + on_activate = function(self, staticdata) + if new == 0 then + self.object:remove() + return self + end + 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) + 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) + 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) + self.object:remove() + 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 = {} + } +) diff --git a/scripts/powerballspawner.lua b/scripts/powerballspawner.lua new file mode 100644 index 0000000..7008591 --- /dev/null +++ b/scripts/powerballspawner.lua @@ -0,0 +1,95 @@ +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} +new = 0 +minetest.register_node( + "portalgun:powerballspawner", + { + description = "Power ball spawner", + tiles = {"steel.png", "steel.png", "steel.png", "steel.png", "steel.png", "portalgun_powerballspawner.png"}, + groups = {cracky = 2}, + sounds = glass_sounds, + is_ground_content = false, + paramtype2 = "facedir", + 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 == 5 then + v.y = -1 + elseif dir == 4 then + v.y = 1 + else + v.y = -1 + end + local pv = {x = pos.x + v.x, y = pos.y + v.y, z = pos.z + v.z} + 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 = { + "steel.png", + "steel.png", + "steel.png", + "steel.png", + "steel.png", + "portalgun_powerballspawner.png^[colorize:#aaaa0055" + }, + groups = {cracky = 2, mesecon = 1}, + sounds = glass_sounds, + 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} + 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 + } + } + } +) diff --git a/scripts/powerballtarget.lua b/scripts/powerballtarget.lua new file mode 100644 index 0000000..ac8fdfc --- /dev/null +++ b/scripts/powerballtarget.lua @@ -0,0 +1,27 @@ +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} +minetest.register_node( + "portalgun:powerballtarget", + { + description = "Power ball target", + tiles = {"portalgun_powerballstarget.png"}, + groups = {mesecon = 2, cracky = 2}, + mesecons = {receptor = {state = "off"}}, + sounds = stone_sounds, + is_ground_content = false, + on_timer = function(pos, elapsed) + mesecon.receptor_off(pos) + return false + end + } +) diff --git a/scripts/pressureplatforms.lua b/scripts/pressureplatforms.lua new file mode 100644 index 0000000..af179d3 --- /dev/null +++ b/scripts/pressureplatforms.lua @@ -0,0 +1,236 @@ +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} +local ptgwsc = { + {"weightedstoragecube.png", "portalgun_presplat.png", "(blue)"}, + {"weightedstoragecube2.png", "portalgun_presplat2.png", "(orange)"}, + {"weightedstoragecube3.png", "portalgun_presplat3.png", "(yellow)"}, + {"weightedstoragecube4.png", "portalgun_presplat4.png", "(green)"}, + {"weightedcompanioncube.png", "portalgun_presplat.png", "(blue companion)"}, + {"weightedcompanioncube2.png", "portalgun_presplat2.png", "(orange companion)"}, + {"weightedcompanioncube3.png", "portalgun_presplat3.png", "(yellow companion)"}, + {"weightedcompanioncube4.png", "portalgun_presplat4.png", "(green companion)"} +} + +for ii = 1, #ptgwsc, 1 do + minetest.register_node( + "portalgun:plantform1_" .. ii, + { + description = "Pressure platform " .. ptgwsc[ii][3], + tiles = {ptgwsc[ii][2], "cloud.png", "cloud.png", "cloud.png", "cloud.png", "cloud.png"}, + groups = {mesecon = 2, cracky = 1, not_in_creative_inventory = 0}, + mesecons = {receptor = {state = "off"}}, + paramtype = "light", + sunlight_propagates = true, + sounds = stone_sounds, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.7, -0.5, -0.7, 0.7, -0.375, 0.7}, + {0.7, -0.5, -0.1875, 0.9, -0.4375, 0.1875}, + {-0.9, -0.5, -0.1875, -0.7, -0.4375, 0.1875}, + {-0.1875, -0.5, -0.9, 0.1875, -0.4375, -0.7}, + {-0.1875, -0.5, 0.7, 0.1875, -0.4375, 0.9}, + {-0.5, -0.5, -0.5, 0.5, -0.3125, 0.5} + } + }, + on_construct = function(pos) + minetest.get_node_timer(pos):start(2) + end, + on_timer = function(pos, elapsed) + if not mesecon then + return false + end + for i, ob in pairs(minetest.get_objects_inside_radius(pos, 1)) do + if ob:get_luaentity() and ob:get_luaentity().wsc == ii then + local node = minetest.get_node(pos) + mesecon.receptor_on(pos) + minetest.set_node( + pos, + {name = "portalgun:plantform2_" .. ii, param1 = node.param1, param2 = node.param2} + ) + end + return true + end + return true + end + } + ) + + minetest.register_node( + "portalgun:plantform2_" .. ii, + { + description = "Pressure platform", + tiles = {ptgwsc[ii][2], "cloud.png", "cloud.png", "cloud.png", "cloud.png", "cloud.png"}, + drop = "portalgun:plantform1_" .. ii, + groups = {mesecon = 2, cracky = 1, not_in_creative_inventory = 1}, + mesecons = {receptor = {state = "on"}}, + paramtype = "light", + sunlight_propagates = true, + light_source = 14, + sounds = stone_sounds, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.7, -0.5, -0.7, 0.7, -0.375, 0.7}, + {0.7, -0.5, -0.1875, 0.9, -0.4375, 0.1875}, + {-0.9, -0.5, -0.1875, -0.7, -0.4375, 0.1875}, + {-0.1875, -0.5, -0.9, 0.1875, -0.4375, -0.7}, + {-0.1875, -0.5, 0.7, 0.1875, -0.4375, 0.9} + } + }, + on_construct = function(pos) + minetest.get_node_timer(pos):start(2) + end, + on_timer = function(pos, elapsed) + for i, ob in pairs(minetest.get_objects_inside_radius(pos, 1)) do + if ob:get_luaentity() and ob:get_luaentity().wsc == ii then + return true + end + end + mesecon.receptor_off(pos) + local node = minetest.get_node(pos) + minetest.set_node( + pos, + {name = "portalgun:plantform1_" .. ii, param1 = node.param1, param2 = node.param2} + ) + return true + end + } + ) +end -- of for # + +minetest.register_node( + "portalgun:plantform_nu1", + { + description = "Pressure platform (player or cube)", + tiles = {"portalgun_presplat5.png", "cloud.png", "cloud.png", "cloud.png", "cloud.png", "cloud.png"}, + groups = {mesecon = 2, cracky = 1, not_in_creative_inventory = 0}, + mesecons = {receptor = {state = "off"}}, + paramtype = "light", + sunlight_propagates = true, + sounds = stone_sounds, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.7, -0.5, -0.7, 0.7, -0.375, 0.7}, + {0.7, -0.5, -0.1875, 0.9, -0.4375, 0.1875}, + {-0.9, -0.5, -0.1875, -0.7, -0.4375, 0.1875}, + {-0.1875, -0.5, -0.9, 0.1875, -0.4375, -0.7}, + {-0.1875, -0.5, 0.7, 0.1875, -0.4375, 0.9}, + {-0.5, -0.5, -0.5, 0.5, -0.3125, 0.5} + } + }, + on_construct = function(pos) + minetest.get_node_timer(pos):start(2) + end, + on_timer = function(pos, elapsed) + if not mesecon then + return false + end + for i, ob in pairs(minetest.get_objects_inside_radius(pos, 1)) do + if ob:is_player() or (ob:get_luaentity() and ob:get_luaentity().wsc) then + local node = minetest.get_node(pos) + mesecon.receptor_on(pos) + minetest.set_node( + pos, + {name = "portalgun:plantform_nu2", param1 = node.param1, param2 = node.param2} + ) + end + return true + end + return true + end + } +) +minetest.register_node( + "portalgun:plantform_nu2", + { + description = "Pressure platform", + tiles = {"portalgun_presplat5.png", "cloud.png", "cloud.png", "cloud.png", "cloud.png", "cloud.png"}, + drop = "portalgun:plantform_nu1", + groups = {mesecon = 2, cracky = 1, not_in_creative_inventory = 1}, + mesecons = {receptor = {state = "on"}}, + paramtype = "light", + sunlight_propagates = true, + light_source = 14, + sounds = stone_sounds, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.7, -0.5, -0.7, 0.7, -0.375, 0.7}, + {0.7, -0.5, -0.1875, 0.9, -0.4375, 0.1875}, + {-0.9, -0.5, -0.1875, -0.7, -0.4375, 0.1875}, + {-0.1875, -0.5, -0.9, 0.1875, -0.4375, -0.7}, + {-0.1875, -0.5, 0.7, 0.1875, -0.4375, 0.9} + } + }, + on_construct = function(pos) + minetest.get_node_timer(pos):start(2) + end, + on_timer = function(pos, elapsed) + for i, ob in pairs(minetest.get_objects_inside_radius(pos, 1)) do + if ob:is_player() or (ob:get_luaentity() and ob:get_luaentity().wsc) then + return true + end + end + mesecon.receptor_off(pos) + local node = minetest.get_node(pos) + minetest.set_node(pos, {name = "portalgun:plantform_nu1", param1 = node.param1, param2 = node.param2}) + return true + end + } +) +minetest.register_node( + "portalgun:planthole", + { + description = "Plathole (activate by any cube, 2 blocks under)", + tiles = {"cloud.png"}, + groups = {mesecon = 2, cracky = 1}, + mesecons = {receptor = {state = "off"}}, + paramtype = "light", + sunlight_propagates = true, + sounds = stone_sounds, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-1.5, -0.5, -1.5, 0.5, -0.25, -1.3}, + {-1.5, -0.5, 0.3, 0.5, -0.25, 0.5}, + {0.3, -0.5, -1.5, 0.5, -0.25, 0.5}, + {-1.5, -0.5, -1.5, -1.3, -0.25, 0.5}, + {0.5, -0.5, -0.9, 0.7, -0.375, -0.0625}, + {-1.7, -0.5, -0.9, -1.5, -0.3125, -0.0625}, + {-0.9, -0.5, -1.7, -0.0625, -0.375, -1.5}, + {-1, -0.5, 0.5, -0.0625, -0.375, 0.7} + } + }, + on_construct = function(pos) + minetest.get_node_timer(pos):start(5) + end, + on_timer = function(pos, elapsed) + local pos2 = {x = pos.x, y = pos.y - 2, z = pos.z} + for i, ob in pairs(minetest.get_objects_inside_radius(pos2, 1)) do + if ob:get_luaentity() and ob:get_luaentity().wsc then + mesecon.receptor_on(pos) + return true + end + end + mesecon.receptor_off(pos) + return true + end + } +) \ No newline at end of file diff --git a/scripts/signs.lua b/scripts/signs.lua new file mode 100644 index 0000000..3f2b942 --- /dev/null +++ b/scripts/signs.lua @@ -0,0 +1,202 @@ +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} +local snuma = 1 +for ii = 0, 9, 1 do + if ii == 1 then + snuma = 0 + end + minetest.register_node( + "portalgun:sign_numa" .. ii, + { + description = "Sign number (" .. ii .. ")", + tiles = {"portalgun_snum" .. ii .. ".png"}, + drop = "portalgun:sign_numa1", + drawtype = "nodebox", + groups = {mesecon = 2, portalnuma = 1, dig_immediate = 3, not_in_creative_inventory = snuma}, + sounds = wood_sounds, + is_ground_content = false, + paramtype2 = "facedir", + paramtype = "light", + light_source = 3, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.4375, 0, 0.5, 0.5} + } + }, + after_place_node = function(pos, placer, itemstack) + local param2 = minetest.get_node(pos).param2 + local pos2 = portalgun_param2(pos, param2) + if minetest.get_node(pos2) and minetest.get_node(pos2).name == "air" then + minetest.set_node(pos2, {name = "portalgun:sign_numb1", param2 = param2}) + minetest.swap_node(pos, {name = "portalgun:sign_numa0", param2 = minetest.get_node(pos).param2}) + end + end, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if not minetest.is_protected(pos, clicker:get_player_name()) then + local iin = ii + 1 + if iin == 10 then + iin = 0 + end + minetest.swap_node( + pos, + {name = "portalgun:sign_numa" .. iin, param2 = minetest.get_node(pos).param2} + ) + end + end, + on_punch = function(pos, node, player, pointed_thing) + local param2 = minetest.get_node(pos).param2 + local pos2 = portalgun_param2(pos, param2) + local node = minetest.get_node(pos2) + if node and minetest.get_node_group(node.name, "portalnumb") > 0 then + minetest.set_node(pos2, {name = "air"}) + end + end + } + ) + if snuma == 0 then + snuma = 1 + end + minetest.register_node( + "portalgun:sign_numb" .. ii, + { + description = "Sign number", + tiles = {"portalgun_snum" .. ii .. ".png"}, + drop = "portalgun:sign_numa1", + drawtype = "nodebox", + groups = {mesecon = 2, portalnumb = 1, dig_immediate = 3, not_in_creative_inventory = 1}, + sounds = wood_sounds, + is_ground_content = false, + paramtype2 = "facedir", + paramtype = "light", + light_source = 3, + node_box = { + type = "fixed", + fixed = { + {-1, -0.5, 0.4375, -0.5, 0.5, 0.5} + } + }, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if not minetest.is_protected(pos, clicker:get_player_name()) then + local iin = ii + 1 + if iin == 10 then + iin = 0 + end + minetest.swap_node( + pos, + {name = "portalgun:sign_numb" .. iin, param2 = minetest.get_node(pos).param2} + ) + end + end, + on_punch = function(pos, node, player, pointed_thing) + local param2 = minetest.get_node(pos).param2 + local pos2 = portalgun_param2(pos, param2, true) + local node = minetest.get_node(pos2) + if node and minetest.get_node_group(node.name, "portalnuma") > 0 then + minetest.set_node(pos2, {name = "air"}) + end + end + } + ) +end +minetest.register_node( + "portalgun:sign1", + { + description = "Portal sign blue", + tiles = {"portalgun_testblock.png^portalgun_sign1.png"}, + inventory_image = "portalgun_testblock.png^portalgun_sign1.png", + drawtype = "nodebox", + groups = {snappy = 3, not_in_creative_inventory = 0}, + sounds = wood_sounds, + is_ground_content = false, + paramtype2 = "facedir", + paramtype = "light", + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0.45, 0.5, 0.5, 0.5} + } + } +) + +minetest.register_node( + "portalgun:sign2", + { + description = "Portal sign orange", + tiles = {"portalgun_testblock.png^portalgun_sign2.png"}, + inventory_image = "portalgun_testblock.png^portalgun_sign2.png", + drawtype = "nodebox", + groups = {snappy = 3, not_in_creative_inventory = 0}, + sounds = wood_sounds, + is_ground_content = false, + paramtype2 = "facedir", + paramtype = "light", + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0.45, 0.5, 0.5, 0.5} + } + } +) +minetest.register_node( + "portalgun:sign_v", + { + description = "Sign V", + tiles = {"portalgun_v.png"}, + inventory_image = "portalgun_v.png", + drop = "portalgun:sign_x", + drawtype = "nodebox", + groups = {mesecon = 2, snappy = 3, not_in_creative_inventory = 1}, + sounds = wood_sounds, + is_ground_content = false, + paramtype2 = "facedir", + paramtype = "light", + light_source = 5, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0.45, 0.5, 0.5, 0.5} + }, + mesecons = { + effector = { + action_off = function(pos, node) + minetest.swap_node(pos, {name = "portalgun:sign_x", param2 = minetest.get_node(pos).param2}) + end + } + } + } +) + +minetest.register_node( + "portalgun:sign_x", + { + description = "Sign X", + tiles = {"portalgun_x.png"}, + inventory_image = "portalgun_x.png", + drawtype = "nodebox", + groups = {mesecon = 2, snappy = 3, not_in_creative_inventory = 0}, + sounds = wood_sounds, + is_ground_content = false, + paramtype2 = "facedir", + paramtype = "light", + light_source = 3, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0.45, 0.5, 0.5, 0.5} + }, + mesecons = { + effector = { + action_on = function(pos, node) + minetest.swap_node(pos, {name = "portalgun:sign_v", param2 = minetest.get_node(pos).param2}) + end + } + } + } +) diff --git a/scripts/toxicwater.lua b/scripts/toxicwater.lua new file mode 100644 index 0000000..89b035a --- /dev/null +++ b/scripts/toxicwater.lua @@ -0,0 +1,58 @@ +minetest.register_node( + "portalgun:toxwater_1", + { + description = "Toxic water", + drawtype = "liquid", + tiles = {"portalgun_toxwat.png"}, + alpha = 190, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + damage_per_second = 20, + liquidtype = "source", + liquid_alternative_flowing = "portalgun:toxwater_2", + liquid_alternative_source = "portalgun:toxwater_1", + liquid_viscosity = 2, + liquid_renewable = false, + liquid_range = 3, + post_effect_color = {a = 200, r = 119, g = 70, b = 16}, + groups = {water = 3, liquid = 3} + } +) + +minetest.register_node( + "portalgun:toxwater_2", + { + description = "Toxic water 2", + drawtype = "flowingliquid", + tiles = {name = "portalgun_toxwat.png", backface_culling = false}, + special_tiles = { + {name = "portalgun_toxwat.png", backface_culling = true}, + {name = "portalgun_toxwat.png", backface_culling = false} + }, + alpha = 190, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + damage_per_second = 4, + liquidtype = "flowing", + liquid_alternative_flowing = "portalgun:toxwater_2", + liquid_alternative_source = "portalgun:toxwater_1", + liquid_viscosity = 2, + liquid_renewable = false, + liquid_range = 3, + post_effect_color = {a = 200, r = 119, g = 70, b = 16}, + groups = {water = 3, liquid = 3, not_in_creative_inventory = 1} + } +) diff --git a/scripts/turrets.lua b/scripts/turrets.lua new file mode 100644 index 0000000..d7c1a6b --- /dev/null +++ b/scripts/turrets.lua @@ -0,0 +1,257 @@ +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} +minetest.register_node( + "portalgun:turretgun2", + { + description = "Sentry turret", + groups = {oddly_breakable_by_hand = 1, not_in_creative_inventory = 1}, + drop = "portalgun:turretgun", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + sounds = stone_sounds, + tiles = {"portalgun_sentry_turret.png"}, + drawtype = "mesh", + mesh = "turret2.obj", + selection_box = { + type = "fixed", + fixed = { + {-0.3, -0.5, -0.3, 0.3, 1, 0.3} + } + }, + on_timer = function(pos, elapsed) + local p = minetest.get_node(pos).param2 + local pos1 = {x = pos.x, y = pos.y + 0.5, z = pos.z} + local d + for i, ob in pairs(minetest.get_objects_inside_radius(pos, 10)) do + if + portalgun_visiable(pos1, ob) and + (ob:is_player() or + (ob:get_luaentity() and (ob:get_luaentity().type or ob:get_luaentity().portalgun == nil))) + then + local a = ob:get_pos() + if a.y < pos.y + 2 and a.y > pos.y - 1 then + a = {x = math.floor(a.x), y = math.floor(a.y), z = math.floor(a.z)} + if p == 3 and a.x > pos.x and a.z == pos.z then + d = {x = 20, y = 0, z = 0} + break + elseif p == 1 and a.x < pos.x and a.z == pos.z then + d = {x = -20, y = 0, z = 0} + break + elseif p == 2 and a.z > pos.z and a.x == pos.x then + d = {x = 0, y = 0, z = 20} + break + elseif p == 0 and a.z < pos.z and a.x == pos.x then + d = {x = 0, y = 0, z = -20} + break + end + end + end + end + local m = minetest.get_meta(pos) + if d then + m:set_int("stop", 0) + minetest.add_entity(pos1, "portalgun:bullet1"):set_velocity(d) + minetest.sound_play("portalgun_bullet1", {pos = pos, gain = 1, max_hear_distance = 15}) + for i = 2, 5, 1 do + minetest.after( + i * 0.1, + function(pos, d) + minetest.add_entity(pos1, "portalgun:bullet1"):set_velocity(d) + minetest.sound_play("portalgun_bullet1", {pos = pos, gain = 1, max_hear_distance = 15}) + end, + pos, + d + ) + end + else + if m:get_int("stop") == 1 then + minetest.set_node(pos, {name = "portalgun:turretgun", param2 = p}) + minetest.get_node_timer(pos):start(0.2) + else + m:set_int("stop", 1) + end + end + return true + end + } +) + +minetest.register_node( + "portalgun:turretgun", + { + description = "Sentry turret", + groups = {oddly_breakable_by_hand = 1}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + sounds = stone_sounds, + tiles = {"portalgun_sentry_turret.png"}, + drawtype = "mesh", + mesh = "turret1.obj", + selection_box = { + type = "fixed", + fixed = { + {-0.3, -0.5, -0.3, 0.3, 1, 0.3} + } + }, + on_construct = function(pos) + minetest.get_node_timer(pos):start(0.2) + end, + on_timer = function(pos, elapsed) + local p = minetest.get_node(pos).param2 + local pos1 = {x = pos.x, y = pos.y + 0.5, z = pos.z} + local d + for i, ob in pairs(minetest.get_objects_inside_radius(pos1, 10)) do + if + portalgun_visiable(pos1, ob) and + (ob:is_player() or + (ob:get_luaentity() and (ob:get_luaentity().type or ob:get_luaentity().portalgun == nil))) + then + local a = ob:get_pos() + if a.y < pos.y + 2 and a.y > pos.y - 1 then + a = {x = math.floor(a.x), y = math.floor(a.y), z = math.floor(a.z)} + if p == 3 and a.x > pos.x and a.z == pos.z then + d = {x = 20, y = 0, z = 0} + break + elseif p == 1 and a.x < pos.x and a.z == pos.z then + d = {x = -20, y = 0, z = 0} + break + elseif p == 2 and a.z > pos.z and a.x == pos.x then + d = {x = 0, y = 0, z = 20} + break + elseif p == 0 and a.z < pos.z and a.x == pos.x then + d = {x = 0, y = 0, z = -20} + break + end + end + end + end + + if d then + minetest.add_entity(pos1, "portalgun:bullet1"):set_velocity(d) + minetest.set_node(pos, {name = "portalgun:turretgun2", param2 = p}) + minetest.get_node_timer(pos):start(1) + minetest.sound_play("portalgun_bullet1", {pos = pos, gain = 1, max_hear_distance = 15}) + for i = 2, 5, 1 do + minetest.after( + i * 0.1, + function(pos, d) + minetest.add_entity(pos1, "portalgun:bullet1"):set_velocity(d) + minetest.sound_play("portalgun_bullet1", {pos = pos, gain = 1, max_hear_distance = 15}) + end, + pos, + d + ) + end + end + return true + end + } +) + +function portalgun_visiable(pos, ob) + if ob == nil or ob:get_pos() == nil or ob:get_pos().y == nil then + return false + end + local ta = ob:get_pos() + local v = {x = pos.x - ta.x, y = pos.y - ta.y - 1, z = pos.z - ta.z} + v.y = v.y - 1 + local amount = (v.x ^ 2 + v.y ^ 2 + v.z ^ 2) ^ 0.5 + local d = + math.sqrt((pos.x - ta.x) * (pos.x - ta.x) + (pos.y - ta.y) * (pos.y - ta.y) + (pos.z - ta.z) * (pos.z - ta.z)) + v.x = (v.x / amount) * -1 + v.y = (v.y / amount) * -1 + v.z = (v.z / amount) * -1 + for i = 1, d, 1 do + local node = + minetest.registered_nodes[ + minetest.get_node({x = pos.x + (v.x * i), y = pos.y + (v.y * i), z = pos.z + (v.z * i)}).name + ] + if node.walkable then + return false + end + end + return true +end + +function portalgun_round(x) + if x % 2 ~= 0.5 then + return math.floor(x + 0.5) + end + return x - 0.5 +end + +function portalgun_ra2shoot(pos, ob) + local op = ob:get_pos() + local m = minetest.get_meta(pos) + local x = m:get_int("x") + local y = m:get_int("y") + local z = m:get_int("z") + local ox = portalgun_round(op.x) + local oy = portalgun_round(op.y) + local oz = portalgun_round(op.z) + if x == 1 and ox == pos.x and oz <= pos.z then + return true + end + if x == -1 and ox == pos.x and oz >= pos.z then + return true + end + if z == -1 and oz == pos.z and ox <= pos.x then + return true + end + if z == 1 and oz == pos.z and ox >= pos.x then + return true + end + return false +end + +minetest.register_entity( + "portalgun:bullet1", + { + hp_max = 1, + --physical = true, + --collisionbox={-0.01,-0.01,-0.01,0.01,0.01,0.01}, + pointable = false, + visual = "mesh", + mesh = "bullet.obj", + --yellow color as tiles + tiles = {"#color[yellow]"}, + initial_sprite_basepos = {x = 0, y = 0}, + portalgun = 2, + bullet = 1, + on_step = function(self, dtime) + self.timer = self.timer + dtime + self.timer2 = self.timer2 + dtime + local pos = self.object:get_pos() + local n = minetest.registered_nodes[minetest.get_node(self.object:get_pos()).name] + if self.timer > 1 or (n and n.walkable) then + self.object:remove() + return + end + for i, ob in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do + if ob:is_player() then + if ob:get_hp() > 2 then + ob:set_hp(ob:get_hp() - 2) + else + ob:set_hp(0) + end + self.object:remove() + return + end + end + end, + timer = 0, + timer2 = 0 + } +) diff --git a/scripts/warntape.lua b/scripts/warntape.lua new file mode 100644 index 0000000..a7debfa --- /dev/null +++ b/scripts/warntape.lua @@ -0,0 +1,32 @@ +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} +minetest.register_node( + "portalgun:warntape", + { + description = "Warntape", + groups = {dig_immediate = 3, not_in_creative_inventory = 0}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + sounds = stone_sounds, + tiles = {"portalgun_warntape.png"}, + walkable = false, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.3125, 0.5, -0.4375, 0.5} + } + } + } +) diff --git a/scripts/weightedstoragecube.lua b/scripts/weightedstoragecube.lua new file mode 100644 index 0000000..56a8465 --- /dev/null +++ b/scripts/weightedstoragecube.lua @@ -0,0 +1,88 @@ +stone_sounds = {} +stone_sounds.footstep = {name = "stone_walk", gain = 1.0} +stone_sounds.dug = {name = "stone_break", gain = 1.0} +stone_sounds.place = {name = "block_place", gain = 1.0} +glass_sounds = {} +glass_sounds.footstep = {name = "glass_walk", gain = 1.0} +glass_sounds.dug = {name = "glass_break", gain = 1.0} +glass_sounds.place = {name = "block_place", gain = 1.0} +wood_sounds = {} +wood_sounds.footstep = {name = "wood_walk", gain = 1.0} +wood_sounds.dug = {name = "wood_break", gain = 1.0} +wood_sounds.place = {name = "block_place", gain = 1.0} +new = 0 +local ptgwsc = { + {"weightedstoragecube.png", "portalgun_presplat.png", "(blue)"}, + {"weightedstoragecube2.png", "portalgun_presplat2.png", "(orange)"}, + {"weightedstoragecube3.png", "portalgun_presplat3.png", "(yellow)"}, + {"weightedstoragecube4.png", "portalgun_presplat4.png", "(green)"}, + {"weightedcompanioncube.png", "portalgun_presplat.png", "(blue companion)"}, + {"weightedcompanioncube2.png", "portalgun_presplat2.png", "(orange companion)"}, + {"weightedcompanioncube3.png", "portalgun_presplat3.png", "(yellow companion)"}, + {"weightedcompanioncube4.png", "portalgun_presplat4.png", "(green companion)"} +} + +for ii = 1, #ptgwsc, 1 do + minetest.register_craftitem( + "portalgun:wscube" .. ii, + { + description = "Weighted storage cube " .. ptgwsc[ii][3], + inventory_image = minetest.inventorycube(ptgwsc[ii][1]), + on_place = function(itemstack, user, pointed_thing) + if pointed_thing.type == "node" then + new = 1 + local m = minetest.add_entity(pointed_thing.above, "portalgun:wsc" .. ii) + m:set_acceleration({x = 0, y = -10, z = 0}) + itemstack:take_item() + end + return itemstack + end + } + ) + + minetest.register_entity( + "portalgun:wsc" .. ii, + { + hp_max = 100, + physical = true, + weight = 5, + collisionbox = {-0.6, -0.6, -0.6, 0.6, 0.6, 0.6}, + visual = "cube", + visual_size = {x = 1.1, y = 1.1}, + textures = {ptgwsc[ii][1], ptgwsc[ii][1], ptgwsc[ii][1], ptgwsc[ii][1], ptgwsc[ii][1], ptgwsc[ii][1]}, + initial_sprite_basepos = {x = 0, y = 0}, + is_visible = true, + makes_footstep_sound = true, + automatic_rotate = 0, + portalgun = 2, + wsc = ii, + on_activate = function(self, staticdata) + if new == 0 then + self.object:remove() + return self + end + new = 0 + end, + on_step = function(self, dtime) + self.timer = self.timer + dtime + if self.timer < 1 then + return self + end + self.timer = 0 + self.object:set_acceleration({x = 0, y = -10, z = 0}) + self.timer2 = self.timer2 + 1 + if self.timer2 > 4 then + self.timer2 = 0 + for i, ob in pairs(minetest.get_objects_inside_radius(self.object:get_pos(), 20)) do + if ob:is_player() then + return true + end + end + self.object:set_hp(0) + end + end, + timer = 0, + timer2 = 0 + } + ) +end -- of for # diff --git a/stuff.lua b/stuff.lua deleted file mode 100644 index fdbfae2..0000000 --- a/stuff.lua +++ /dev/null @@ -1,606 +0,0 @@ -stone_sounds = {} -stone_sounds.footstep = {name="stone_walk", gain=1.0} -stone_sounds.dug = {name="stone_break", gain=1.0} -stone_sounds.place = {name="block_place", gain=1.0} -glass_sounds = {} -glass_sounds.footstep = {name="glass_walk", gain=1.0} -glass_sounds.dug = {name="glass_break", gain=1.0} -glass_sounds.place = {name="block_place", gain=1.0} -wood_sounds = {} -wood_sounds.footstep = {name="wood_walk", gain=1.0} -wood_sounds.dug = {name="wood_break", gain=1.0} -wood_sounds.place = {name="block_place", gain=1.0} -local snuma=1 -for ii = 0, 9, 1 do -if ii==1 then snuma=0 end -minetest.register_node("portalgun:sign_numa".. ii, { - description = "Sign number (" .. ii ..")", - tiles = {"portalgun_snum" .. ii ..".png"}, - drop="portalgun:sign_numa1", - drawtype = "nodebox", - groups = {mesecon=2,portalnuma=1,dig_immediate = 3, not_in_creative_inventory=snuma}, - sounds = wood_sounds, - is_ground_content = false, - paramtype2 = "facedir", - paramtype = "light", - light_source = 3, - node_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, 0.4375, 0, 0.5, 0.5}, - } - }, -after_place_node = function(pos, placer, itemstack) - local param2=minetest.get_node(pos).param2 - local pos2=portalgun_param2(pos,param2) - if minetest.get_node(pos2) and minetest.get_node(pos2).name=="air" then - minetest.set_node(pos2,{name="portalgun:sign_numb1",param2=param2}) - minetest.swap_node(pos, {name="portalgun:sign_numa0", param2=minetest.get_node(pos).param2}) - end - end, - on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if not minetest.is_protected(pos,clicker:get_player_name()) then - local iin=ii+1 - if iin==10 then iin=0 end - minetest.swap_node(pos, {name="portalgun:sign_numa".. iin, param2=minetest.get_node(pos).param2}) - end - end, - on_punch = function(pos, node, player, pointed_thing) - local param2=minetest.get_node(pos).param2 - local pos2=portalgun_param2(pos,param2) - local node=minetest.get_node(pos2) - if node and minetest.get_node_group(node.name, "portalnumb")>0 then - minetest.set_node(pos2, {name = "air"}) - end - end, - - -}) -if snuma==0 then snuma=1 end -minetest.register_node("portalgun:sign_numb".. ii, { - description = "Sign number", - tiles = {"portalgun_snum" .. ii ..".png"}, - drop="portalgun:sign_numa1", - drawtype = "nodebox", - groups = {mesecon=2,portalnumb=1,dig_immediate = 3, not_in_creative_inventory=1}, - sounds = wood_sounds, - is_ground_content = false, - paramtype2 = "facedir", - paramtype = "light", - light_source = 3, - node_box = { - type = "fixed", - fixed = { - {-1, -0.5, 0.4375, -0.5, 0.5, 0.5}, - } - }, - on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if not minetest.is_protected(pos,clicker:get_player_name()) then - local iin=ii+1 - if iin==10 then iin=0 end - minetest.swap_node(pos, {name="portalgun:sign_numb".. iin, param2=minetest.get_node(pos).param2}) - end - end, - on_punch = function(pos, node, player, pointed_thing) - local param2=minetest.get_node(pos).param2 - local pos2=portalgun_param2(pos,param2,true) - local node=minetest.get_node(pos2) - if node and minetest.get_node_group(node.name, "portalnuma")>0 then - minetest.set_node(pos2, {name = "air"}) - end - end, -}) -end - -minetest.register_node("portalgun:turretgun2", { - description = "Sentry turret", - groups = {oddly_breakable_by_hand=1,not_in_creative_inventory=1}, - drop="portalgun:turretgun", - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - sounds = stone_sounds, - tiles = {"portalgun_sentry_turret.png"}, - drawtype = "mesh", - mesh="torret2.obj", - selection_box = { - type = "fixed", - fixed = { - {-0.3, -0.5, -0.3, 0.3, 1,0.3}, - } - }, - on_timer=function(pos, elapsed) - local p=minetest.get_node(pos).param2 - local pos1={x=pos.x,y=pos.y+0.5,z=pos.z} - local d - for i, ob in pairs(minetest.get_objects_inside_radius(pos, 10)) do - if portalgun_visiable(pos1,ob) and (ob:is_player() or (ob:get_luaentity() and (ob:get_luaentity().type or ob:get_luaentity().portalgun==nil))) then - local a=ob:get_pos() - if a.y<pos.y+2 and a.y>pos.y-1 then - a={x=math.floor(a.x),y=math.floor(a.y),z=math.floor(a.z)} - if p==3 and a.x>pos.x and a.z==pos.z then - d={x=20,y=0,z=0} - break - elseif p==1 and a.x<pos.x and a.z==pos.z then - d={x=-20,y=0,z=0} - break - elseif p==2 and a.z>pos.z and a.x==pos.x then - d={x=0,y=0,z=20} - break - elseif p==0 and a.z<pos.z and a.x==pos.x then - d={x=0,y=0,z=-20} - break - end - end - end - end - local m=minetest.get_meta(pos) - if d then - m:set_int("stop",0) - minetest.add_entity(pos1, "portalgun:bullet1"):set_velocity(d) - minetest.sound_play("portalgun_bullet1", {pos=pos, gain = 1, max_hear_distance = 15}) - for i=2,5,1 do - minetest.after(i*0.1, function(pos,d) - minetest.add_entity(pos1, "portalgun:bullet1"):set_velocity(d) - minetest.sound_play("portalgun_bullet1", {pos=pos, gain = 1, max_hear_distance = 15}) - end, pos,d) - end - else - if m:get_int("stop")==1 then - minetest.set_node(pos,{name="portalgun:turretgun",param2=p}) - minetest.get_node_timer(pos):start(0.2) - else - m:set_int("stop",1) - end - end - return true - end -}) - - -minetest.register_node("portalgun:turretgun", { - description = "Sentry turret", - groups = {oddly_breakable_by_hand=1}, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - sounds = stone_sounds, - tiles = {"portalgun_sentry_turret.png"}, - drawtype = "mesh", - mesh="torret1.obj", - selection_box = { - type = "fixed", - fixed = { - {-0.3, -0.5, -0.3, 0.3, 1,0.3}, - } - }, - on_construct = function(pos) - minetest.get_node_timer(pos):start(0.2) - end, - on_timer=function(pos, elapsed) - local p=minetest.get_node(pos).param2 - local pos1={x=pos.x,y=pos.y+0.5,z=pos.z} - local d - for i, ob in pairs(minetest.get_objects_inside_radius(pos1, 10)) do - if portalgun_visiable(pos1,ob) and (ob:is_player() or (ob:get_luaentity() and (ob:get_luaentity().type or ob:get_luaentity().portalgun==nil))) then - local a=ob:get_pos() - if a.y<pos.y+2 and a.y>pos.y-1 then - a={x=math.floor(a.x),y=math.floor(a.y),z=math.floor(a.z)} - if p==3 and a.x>pos.x and a.z==pos.z then - d={x=20,y=0,z=0} - break - elseif p==1 and a.x<pos.x and a.z==pos.z then - d={x=-20,y=0,z=0} - break - elseif p==2 and a.z>pos.z and a.x==pos.x then - d={x=0,y=0,z=20} - break - elseif p==0 and a.z<pos.z and a.x==pos.x then - d={x=0,y=0,z=-20} - break - end - end - end - end - - if d then - minetest.add_entity(pos1, "portalgun:bullet1"):set_velocity(d) - minetest.set_node(pos,{name="portalgun:turretgun2",param2=p}) - minetest.get_node_timer(pos):start(1) - minetest.sound_play("portalgun_bullet1", {pos=pos, gain = 1, max_hear_distance = 15}) - for i=2,5,1 do - minetest.after(i*0.1, function(pos,d) - minetest.add_entity(pos1, "portalgun:bullet1"):set_velocity(d) - minetest.sound_play("portalgun_bullet1", {pos=pos, gain = 1, max_hear_distance = 15}) - end, pos,d) - end - end - return true - end -}) - ---giveitems register_chatcommand -minetest.register_chatcommand("giveitems", { - description = "Give items to player", - privs = {give=true}, - func = function(name) - local player = minetest.get_player_by_name(name) - if player then - --clear inventory - player:get_inventory():set_list("main", {}) - --GIVE turret - player:get_inventory():add_item("main", "portalgun:turretgun") - --give testblock - player:get_inventory():add_item("main", "portalgun:testblock") - end - end, -}) - -minetest.register_node("portalgun:warntape", { - description = "Warntape", - groups = {dig_immediate = 3,not_in_creative_inventory=0}, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - sounds = stone_sounds, - tiles = {"portalgun_warntape.png",}, - walkable = false, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, 0.3125, 0.5, -0.4375, 0.5}, - } - } -}) - - -minetest.register_node("portalgun:toxwater_1", { - description = "Toxic water", - drawtype = "liquid", - tiles = {"portalgun_toxwat.png"}, - alpha = 190, - paramtype = "light", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - drop = "", - drowning = 1, - damage_per_second = 20, - liquidtype = "source", - liquid_alternative_flowing = "portalgun:toxwater_2", - liquid_alternative_source = "portalgun:toxwater_1", - liquid_viscosity = 2, - liquid_renewable = false, - liquid_range = 3, - post_effect_color = {a = 200, r = 119, g = 70, b = 16}, - groups = {water = 3, liquid = 3}, -}) - -minetest.register_node("portalgun:toxwater_2", { - description = "Toxic water 2", - drawtype = "flowingliquid", - tiles = {name = "portalgun_toxwat.png",backface_culling=false}, - special_tiles = {{name = "portalgun_toxwat.png",backface_culling=true},{name = "portalgun_toxwat.png",backface_culling=false}}, - alpha = 190, - paramtype = "light", - paramtype2 = "flowingliquid", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - drop = "", - drowning = 1, - damage_per_second = 4, - liquidtype = "flowing", - liquid_alternative_flowing = "portalgun:toxwater_2", - liquid_alternative_source = "portalgun:toxwater_1", - liquid_viscosity = 2, - liquid_renewable = false, - liquid_range = 3, - post_effect_color = {a = 200, r = 119, g = 70, b = 16}, - groups = {water = 3, liquid = 3, not_in_creative_inventory = 1} -}) -minetest.register_tool("portalgun:pick", { - --a pickaxe that can mine all blocks - description = "Portalgun Pickaxe", - inventory_image = "portalgun_pick.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level = 3, - groupcaps = { - unbreakable = {times={[1]=1, [2]=1, [3]=1}, uses=0, maxlevel=3}, - fleshy = {times={[1]=1, [2]=1, [3]=1}, uses=0, maxlevel=3}, - choppy = {times={[1]=1, [2]=1, [3]=1}, uses=0, maxlevel=3}, - bendy = {times={[1]=1, [2]=1, [3]=1}, uses=0, maxlevel=3}, - cracky = {times={[1]=1, [2]=1, [3]=1}, uses=0, maxlevel=3}, - crumbly = {times={[1]=1, [2]=1, [3]=1}, uses=0, maxlevel=3}, - snappy = {times={[1]=1, [2]=1, [3]=1}, uses=0, maxlevel=3}, - }, - damage_groups = {fleshy = 1000}, - }, -}) -minetest.register_tool("portalgun:ed", { - description = "Entity Destroyer", - inventory_image = "portalgun_edestroyer.png", - range = 15, -on_use = function(itemstack, user, pointed_thing) - local pos=user:get_pos() - if pointed_thing.type=="node" then - pos=pointed_thing.above - end - if pointed_thing.type=="object" then - pos=pointed_thing.ref:get_pos() - end - local name=user:get_player_name() - if minetest.check_player_privs(name, {kick=true})==false then - minetest.chat_send_player(name, "You need the kick privilege to use this tool!") - return itemstack - end - for ii, ob in pairs(minetest.get_objects_inside_radius(pos, 7)) do - if ob:get_luaentity() then - ob:set_hp(0) - end - end - return itemstack -end -}) - -minetest.register_node("portalgun:cake", { - description = "Cake", - groups = {dig_immediate = 3,not_in_creative_inventory=0}, - paramtype = "light", - sunlight_propagates = true, - selection_box = {type = "fixed",fixed = { -0.3, -0.5, -0.3, 0.3, 0, 0.3 }}, - sounds = stone_sounds, -tiles = { - "dirt.png^portalgun_cake1.png", - "dirt.png^portalgun_cake2.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.3125, -0.5, 0.375, 0.3125, -0.125, 0.4375}, - {-0.3125, -0.5, -0.4375, 0.3125, -0.125, -0.375}, - {-0.4375, -0.5, -0.3125, -0.375, -0.125, 0.3125}, - {0.375, -0.5, -0.3125, 0.4375, -0.125, 0.3125}, - {-0.375, -0.5, -0.375, 0.375, -0.125, 0.375}, - {-0.25, -0.5, 0.4375, 0.25, -0.125, 0.5}, - {-0.25, -0.5, -0.5, 0.25, -0.125, -0.4375}, - {0.4375, -0.5, -0.25, 0.5, -0.125, 0.25}, - {-0.5, -0.5, -0.25, -0.4375, -0.125, 0.25}, - {0, -0.125, -0.0625, 0.0625, 0.1875, 0}, - } - } -}) - - -minetest.register_node("portalgun:testblock", { - description = "Test block", - tiles = {"portalgun_testblock.png"}, - groups = {cracky = 1}, - sounds = stone_sounds, -}) - -minetest.register_node("portalgun:apb", { - description = "Anti portal block", - tiles = {"portalgun_testblock.png^[colorize:#ffffffaa"}, - groups = {cracky = 3,antiportal=1}, - sounds = stone_sounds, -}) - -minetest.register_node("portalgun:apg", { - description = "Anti portal glass", - drawtype="glasslike", - paramtype="light", - sunlight_propagates = true, - tiles = {"glass.png^[colorize:#ffffffaa"}, - groups = {cracky = 1,antiportal=1}, - sounds = glass_sounds, -}) -minetest.register_node("portalgun:hard_glass", { - description = "Hard glass", - drawtype="glasslike", - paramtype="light", - sunlight_propagates = true, - tiles = {"glass.png^[colorize:#ddddddaa"}, - groups = {cracky = 1}, - sounds = glass_sounds, -}) - -function portalgun_visiable(pos,ob) - if ob==nil or ob:get_pos()==nil or ob:get_pos().y==nil then return false end - local ta=ob:get_pos() - local v = {x = pos.x - ta.x, y = pos.y - ta.y-1, z = pos.z - ta.z} - v.y=v.y-1 - local amount = (v.x ^ 2 + v.y ^ 2 + v.z ^ 2) ^ 0.5 - local d=math.sqrt((pos.x-ta.x)*(pos.x-ta.x) + (pos.y-ta.y)*(pos.y-ta.y)+(pos.z-ta.z)*(pos.z-ta.z)) - v.x = (v.x / amount)*-1 - v.y = (v.y / amount)*-1 - v.z = (v.z / amount)*-1 - for i=1,d,1 do - local node=minetest.registered_nodes[minetest.get_node({x=pos.x+(v.x*i),y=pos.y+(v.y*i),z=pos.z+(v.z*i)}).name] - if node.walkable then - return false - end - end - return true -end - -function portalgun_round(x) -if x%2 ~= 0.5 then -return math.floor(x+0.5) -end -return x-0.5 -end - - -function portalgun_ra2shoot(pos,ob) - local op=ob:get_pos() - local m=minetest.get_meta(pos) - local x=m:get_int("x") - local y=m:get_int("y") - local z=m:get_int("z") - local ox=portalgun_round(op.x) - local oy=portalgun_round(op.y) - local oz=portalgun_round(op.z) - if x==1 and ox==pos.x and oz<=pos.z then - return true - end - if x==-1 and ox==pos.x and oz>=pos.z then - return true - end - if z==-1 and oz==pos.z and ox<=pos.x then - return true - end - if z==1 and oz==pos.z and ox>=pos.x then - return true - end - return false -end - -minetest.register_node("portalgun:secam_off", { - description = "Security cam (off)" , - tiles = {"portalgun_scam.png"}, - drawtype = "nodebox", - walkable=false, - groups = {dig_immediate = 3}, - sounds = glass_sounds, - 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") - end, -on_rightclick = function(pos, node, player, itemstack, pointed_thing) - minetest.set_node(pos, {name ="portalgun:secam", param1 = node.param1, param2 = node.param2}) - minetest.get_node_timer(pos):start(1) -end, -}) - -minetest.register_node("portalgun:secam", { - description = "Security cam", - tiles = {"portalgun_scam.png"}, - drawtype = "nodebox", - walkable=false, - groups = {dig_immediate = 3,stone=1,not_in_creative_inventory=1}, - sounds = glass_sounds, - is_ground_content = false, - paramtype = "light", - paramtype2 = "facedir", - drop="portalgun: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) - for i, ob in pairs(minetest.get_objects_inside_radius(pos, 10)) do - if ob:is_player() or (ob:get_luaentity() and ob:get_luaentity().itemstring==nil and ob:get_luaentity().portalgun==nil) then - if portalgun_visiable(pos,ob) then - local v=ob:get_pos() - if not ob:get_luaentity() then v.y=v.y+1 end - 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, "portalgun:bullet1") - m:set_velocity(s) - m:set_acceleration(s) - minetest.sound_play("portalgun_bullet1", {pos=pos, gain = 1, max_hear_distance = 15,}) - minetest.after((math.random(1,9)*0.1), function(pos,s,v) - local m=minetest.add_entity(pos, "portalgun:bullet1") - m:set_velocity(s) - m:set_acceleration(s) - minetest.sound_play("portalgun_bullet1", {pos=pos, gain = 1, max_hear_distance = 15,}) - end, pos,s,v) - end - end - end - return true - end, -}) - ---register command for admins to build a testblock at the players position -minetest.register_chatcommand("testblock", { - params = "", - description = "builds a testblock at the players position", - privs = {server=true}, - func = function(name, param) - local player = minetest.get_player_by_name(name) - local pos = player:get_pos() - minetest.set_node(pos, {name = "portalgun:testblock"}) - end, -}) - -minetest.register_entity("portalgun:bullet1",{ - hp_max = 1, - --physical = true, - --collisionbox={-0.01,-0.01,-0.01,0.01,0.01,0.01}, - pointable=false, - visual = "mesh", - mesh = "bullet.obj", - --yellow color as tiles - tiles = {"#color[yellow]"}, - initial_sprite_basepos = {x=0, y=0}, - portalgun=2, - bullet=1, -on_step= function(self, dtime) - self.timer=self.timer+dtime - self.timer2=self.timer2+dtime - local pos=self.object:get_pos() - local n=minetest.registered_nodes[minetest.get_node(self.object:get_pos()).name] - if self.timer>1 or (n and n.walkable) then - self.object:remove() - return - end - for i, ob in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do - if ob:is_player() then - if ob:get_hp() > 2 then - ob:set_hp(ob:get_hp()-2) - else - ob:set_hp(0) - end - self.object:remove() - return - end - end - end, - timer=0, - timer2=0, -}) - -minetest.register_node("portalgun:sign1", { - description = "Portal sign blue", - tiles = {"portalgun_testblock.png^portalgun_sign1.png"}, - inventory_image = "portalgun_testblock.png^portalgun_sign1.png", - drawtype = "nodebox", - groups = {snappy = 3, not_in_creative_inventory=0}, - sounds = wood_sounds, - is_ground_content = false, - paramtype2 = "facedir", - paramtype = "light", - node_box = { - type="fixed", - fixed={-0.5,-0.5,0.45,0.5,0.5,0.5}}, -}) - -minetest.register_node("portalgun:sign2", { - description = "Portal sign orange", - tiles = {"portalgun_testblock.png^portalgun_sign2.png"}, - inventory_image = "portalgun_testblock.png^portalgun_sign2.png", - drawtype = "nodebox", - groups = {snappy = 3, not_in_creative_inventory=0}, - sounds = wood_sounds, - is_ground_content = false, - paramtype2 = "facedir", - paramtype = "light", - node_box = { - type="fixed", - fixed={-0.5,-0.5,0.45,0.5,0.5,0.5}}, -}) diff --git a/textures/weightedcompanioncube.png b/textures/weightedcompanioncube.png new file mode 100644 index 0000000..7a2225d Binary files /dev/null and b/textures/weightedcompanioncube.png differ diff --git a/textures/weightedcompanioncube2.png b/textures/weightedcompanioncube2.png new file mode 100644 index 0000000..2db7c72 Binary files /dev/null and b/textures/weightedcompanioncube2.png differ diff --git a/textures/weightedcompanioncube3.png b/textures/weightedcompanioncube3.png new file mode 100644 index 0000000..040140d Binary files /dev/null and b/textures/weightedcompanioncube3.png differ diff --git a/textures/weightedcompanioncube4.png b/textures/weightedcompanioncube4.png new file mode 100644 index 0000000..5285c5e Binary files /dev/null and b/textures/weightedcompanioncube4.png differ diff --git a/weightedstoragecube.lua b/weightedstoragecube.lua deleted file mode 100644 index 05ab815..0000000 --- a/weightedstoragecube.lua +++ /dev/null @@ -1,362 +0,0 @@ -stone_sounds = {} -stone_sounds.footstep = {name="stone_walk", gain=1.0} -stone_sounds.dug = {name="stone_break", gain=1.0} -stone_sounds.place = {name="block_place", gain=1.0} -glass_sounds = {} -glass_sounds.footstep = {name="glass_walk", gain=1.0} -glass_sounds.dug = {name="glass_break", gain=1.0} -glass_sounds.place = {name="block_place", gain=1.0} -wood_sounds = {} -wood_sounds.footstep = {name="wood_walk", gain=1.0} -wood_sounds.dug = {name="wood_break", gain=1.0} -wood_sounds.place = {name="block_place", gain=1.0} -local ptgwsc={ -{"weightedstoragecube.png","portalgun_presplat.png","(blue)"}, -{"weightedstoragecube2.png","portalgun_presplat2.png","(orange)"}, -{"weightedstoragecube3.png","portalgun_presplat3.png","(yellow)"}, -{"weightedstoragecube4.png","portalgun_presplat4.png","(green)"}, -} - - -for ii = 1, #ptgwsc, 1 do - - -minetest.register_craftitem("portalgun:wscube" ..ii, { - description = "Weighted storage cube " .. ptgwsc[ii][3], - inventory_image = minetest.inventorycube(ptgwsc[ii][1]), -on_place=function(itemstack, user, pointed_thing) - if pointed_thing.type=="node" then - portalgun.new=1 - local m=minetest.add_entity(pointed_thing.above, "portalgun:wsc"..ii) - m:set_acceleration({x=0,y=-10,z=0}) - itemstack:take_item() - end - return itemstack -end, -}) - -minetest.register_node("portalgun:wscspawner2_" .. ii, { - description = "Weighted storage cube spawner2 " ..ptgwsc[ii][3], - tiles = {"steel.png","steel.png","steel.png","steel.png","steel.png",ptgwsc[ii][1]}, - groups = {cracky=2,mesecon_receptor_off = 1, mesecon_effector_off = 1}, - sounds = glass_sounds, - is_ground_content = false, - paramtype2 = "facedir", - mesecons = {receptor = {state = "off"}, 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.2 - elseif dir==2 then v.z=1.2 - elseif dir==3 then v.x=1.2 - elseif dir==8 then v.y=-1.2 - elseif dir==4 then v.y=1.2 - 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:wsc" ..ii) - m:set_acceleration({x=0, y=-10, z=0}) - end - }} -}) - -minetest.register_entity("portalgun:wsc" ..ii,{ - hp_max = 100, - physical = true, - weight = 5, - collisionbox = {-0.6,-0.6,-0.6, 0.6,0.6,0.6}, - visual = "cube", - visual_size = {x=1.1, y=1.1}, - textures = {ptgwsc[ii][1],ptgwsc[ii][1],ptgwsc[ii][1],ptgwsc[ii][1],ptgwsc[ii][1],ptgwsc[ii][1]}, - initial_sprite_basepos = {x=0, y=0}, - is_visible = true, - makes_footstep_sound = true, - automatic_rotate = 0, - portalgun=2, - wsc=ii, -on_activate= function(self, staticdata) - if portalgun.new==0 then - self.object:remove() - return self - end - portalgun.new=0 -end, -on_step= function(self, dtime) - self.timer=self.timer+dtime - if self.timer<1 then return self end - self.timer=0 - self.object:set_acceleration({x=0, y=-10, z=0}) - self.timer2=self.timer2+1 - if self.timer2>4 then - self.timer2=0 - for i, ob in pairs(minetest.get_objects_inside_radius(self.object:get_pos(), 20)) do - if ob:is_player() then - return true - end - end - self.object:set_hp(0) - end - end, - timer=0, - timer2=0, -}) - -minetest.register_node("portalgun:wscspawner"..ii, { - description = "Weighted storage cube spawner " ..ptgwsc[ii][3], - tiles = {ptgwsc[ii][1]}, - groups = {cracky = 1, not_in_creative_inventory=0}, - paramtype = "light", - paramtype2="facedir", - sunlight_propagates = true, - light_source = 14, - sounds = stone_sounds, - drawtype="nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.7, -0.5, -0.7, 0.7, -0.375, 0.7}, - {0.7, -0.5, -0.1875, 0.9, -0.4375, 0.1875}, - {-0.9, -0.5, -0.1875, -0.7, -0.4375, 0.1875}, - {-0.1875, -0.5, -0.9, 0.1875, -0.4375, -0.7}, - {-0.1875, -0.5, 0.7, 0.1875, -0.4375, 0.9}, - } - }, - on_construct = function(pos) - minetest.get_node_timer(pos):start(5) - end, - on_timer = function (pos, elapsed) - for i, ob in pairs(minetest.get_objects_inside_radius(pos, 40)) do - if ob:get_luaentity() and ob:get_luaentity().wsc==ii then - return true - end - end - portalgun.new=1 - local m=minetest.add_entity(pos, "portalgun:wsc" ..ii) - m:set_acceleration({x=0,y=-10,z=0}) - return true - end, -}) - -minetest.register_node("portalgun:plantform1_" ..ii, { - description = "Pressure platform " .. ptgwsc[ii][3], - tiles = {ptgwsc[ii][2],"cloud.png","cloud.png","cloud.png","cloud.png","cloud.png"}, - groups = {mesecon = 2,cracky = 1, not_in_creative_inventory=0}, - mesecons = {receptor = {state = "off"}}, - paramtype = "light", - sunlight_propagates = true, - sounds = stone_sounds, - drawtype="nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.7, -0.5, -0.7, 0.7, -0.375, 0.7}, - {0.7, -0.5, -0.1875, 0.9, -0.4375, 0.1875}, - {-0.9, -0.5, -0.1875, -0.7, -0.4375, 0.1875}, - {-0.1875, -0.5, -0.9, 0.1875, -0.4375, -0.7}, - {-0.1875, -0.5, 0.7, 0.1875, -0.4375, 0.9}, - {-0.5, -0.5, -0.5, 0.5, -0.3125, 0.5}, - } - }, - on_construct = function(pos) - minetest.get_node_timer(pos):start(2) - end, - on_timer = function (pos, elapsed) - if not mesecon then return false end - for i, ob in pairs(minetest.get_objects_inside_radius(pos, 1)) do - if ob:get_luaentity() and ob:get_luaentity().wsc==ii then - local node=minetest.get_node(pos) - mesecon.receptor_on(pos) - minetest.set_node(pos, {name ="portalgun:plantform2_"..ii, param1 = node.param1, param2 = node.param2}) - end - return true - end - return true - end, -}) - -minetest.register_node("portalgun:plantform2_"..ii, { - description = "Pressure platform", - tiles = {ptgwsc[ii][2],"cloud.png","cloud.png","cloud.png","cloud.png","cloud.png"}, - drop="portalgun:plantform1_"..ii, - groups = {mesecon = 2,cracky = 1, not_in_creative_inventory=1}, - mesecons = {receptor = {state = "on"}}, - paramtype = "light", - sunlight_propagates = true, - light_source = 14, - sounds = stone_sounds, - drawtype="nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.7, -0.5, -0.7, 0.7, -0.375, 0.7}, - {0.7, -0.5, -0.1875, 0.9, -0.4375, 0.1875}, - {-0.9, -0.5, -0.1875, -0.7, -0.4375, 0.1875}, - {-0.1875, -0.5, -0.9, 0.1875, -0.4375, -0.7}, - {-0.1875, -0.5, 0.7, 0.1875, -0.4375, 0.9}, - } - }, - on_construct = function(pos) - minetest.get_node_timer(pos):start(2) - end, - on_timer = function (pos, elapsed) - for i, ob in pairs(minetest.get_objects_inside_radius(pos, 1)) do - if ob:get_luaentity() and ob:get_luaentity().wsc==ii then - return true - end - end - mesecon.receptor_off(pos) - local node=minetest.get_node(pos) - minetest.set_node(pos, {name ="portalgun:plantform1_"..ii, param1 = node.param1, param2 = node.param2}) - return true - end, -}) - - -end -- of for # - - -minetest.register_node("portalgun:plantform_nu1", { - description = "Pressure platform (player or cube)", - tiles = {"portalgun_presplat5.png","cloud.png","cloud.png","cloud.png","cloud.png","cloud.png"}, - groups = {mesecon = 2,cracky = 1, not_in_creative_inventory=0}, - mesecons = {receptor = {state = "off"}}, - paramtype = "light", - sunlight_propagates = true, - sounds = stone_sounds, - drawtype="nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.7, -0.5, -0.7, 0.7, -0.375, 0.7}, - {0.7, -0.5, -0.1875, 0.9, -0.4375, 0.1875}, - {-0.9, -0.5, -0.1875, -0.7, -0.4375, 0.1875}, - {-0.1875, -0.5, -0.9, 0.1875, -0.4375, -0.7}, - {-0.1875, -0.5, 0.7, 0.1875, -0.4375, 0.9}, - {-0.5, -0.5, -0.5, 0.5, -0.3125, 0.5}, - } - }, - on_construct = function(pos) - minetest.get_node_timer(pos):start(2) - end, - on_timer = function (pos, elapsed) - if not mesecon then return false end - for i, ob in pairs(minetest.get_objects_inside_radius(pos, 1)) do - if ob:is_player() or (ob:get_luaentity() and ob:get_luaentity().wsc) then - local node=minetest.get_node(pos) - mesecon.receptor_on(pos) - minetest.set_node(pos, {name ="portalgun:plantform_nu2", param1 = node.param1, param2 = node.param2}) - end - return true - end - return true - end, -}) - -minetest.register_node("portalgun:plantform_nu2", { - description = "Pressure platform", - tiles = {"portalgun_presplat5.png","cloud.png","cloud.png","cloud.png","cloud.png","cloud.png"}, - drop="portalgun:plantform_nu1", - groups = {mesecon = 2,cracky = 1, not_in_creative_inventory=1}, - mesecons = {receptor = {state = "on"}}, - paramtype = "light", - sunlight_propagates = true, - light_source = 14, - sounds = stone_sounds, - drawtype="nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.7, -0.5, -0.7, 0.7, -0.375, 0.7}, - {0.7, -0.5, -0.1875, 0.9, -0.4375, 0.1875}, - {-0.9, -0.5, -0.1875, -0.7, -0.4375, 0.1875}, - {-0.1875, -0.5, -0.9, 0.1875, -0.4375, -0.7}, - {-0.1875, -0.5, 0.7, 0.1875, -0.4375, 0.9}, - } - }, - on_construct = function(pos) - minetest.get_node_timer(pos):start(2) - end, - on_timer = function (pos, elapsed) - for i, ob in pairs(minetest.get_objects_inside_radius(pos, 1)) do - if ob:is_player() or (ob:get_luaentity() and ob:get_luaentity().wsc) then - return true - end - end - mesecon.receptor_off(pos) - local node=minetest.get_node(pos) - minetest.set_node(pos, {name ="portalgun:plantform_nu1", param1 = node.param1, param2 = node.param2}) - return true - end, -}) - - -minetest.register_node("portalgun:planthole", { - description = "Plathole (activate by any cube, 2 blocks under)", - tiles = {"cloud.png"}, - groups = {mesecon = 2,cracky = 1}, - mesecons = {receptor = {state = "off"}}, - paramtype = "light", - sunlight_propagates = true, - sounds = stone_sounds, - drawtype="nodebox", - node_box = { - type = "fixed", - fixed = { - {-1.5, -0.5, -1.5, 0.5, -0.25, -1.3}, - {-1.5, -0.5, 0.3, 0.5, -0.25, 0.5}, - {0.3, -0.5, -1.5, 0.5, -0.25, 0.5}, - {-1.5, -0.5, -1.5, -1.3, -0.25, 0.5}, - {0.5, -0.5, -0.9, 0.7, -0.375, -0.0625}, - {-1.7, -0.5, -0.9, -1.5, -0.3125, -0.0625}, - {-0.9, -0.5, -1.7, -0.0625, -0.375, -1.5}, - {-1, -0.5, 0.5, -0.0625, -0.375, 0.7}, - } - }, - on_construct = function(pos) - minetest.get_node_timer(pos):start(5) - end, - on_timer = function (pos, elapsed) - local pos2={x=pos.x,y=pos.y-2,z=pos.z} - for i, ob in pairs(minetest.get_objects_inside_radius(pos2, 1)) do - if ob:get_luaentity() and ob:get_luaentity().wsc then - mesecon.receptor_on(pos) - return true - end - end - mesecon.receptor_off(pos) - return true - end, -}) - - - -minetest.register_node("portalgun:objdestroyer_1", { - description = "Object destroyer (destroys on active)", - tiles = {"portalgun_testblock.png^[colorize:#FF0000aa"}, - groups = {cracky = 2,mesecon=1}, - sounds = stone_sounds, - mesecons = {effector = { - action_on = function (pos, node) - minetest.set_node(pos, {name ="portalgun:objdestroyer_2"}) - for i, ob in pairs(minetest.get_objects_inside_radius(pos, 5)) do - if ob:get_luaentity() then - ob:set_hp(0) - end - end - end - }} -}) -minetest.register_node("portalgun:objdestroyer_2", { - description = "Obj destroyer", - tiles = {"portalgun_testblock.png^[colorize:#FF0000cc"}, - groups = {cracky=2,mesecon=1,not_in_creative_inventory=1}, - sunlight_propagates = true, - drop="portalgun:objdestroyer_1", - paramtype="light", - light_source = 14, - mesecons = {conductor = { - state = mesecon.state.on, - offstate = "portalgun:objdestroyer_1", - }}, -})