diff --git a/gravityuse.lua b/gravityuse.lua index 7233e57..4a3eaec 100644 --- a/gravityuse.lua +++ b/gravityuse.lua @@ -14,12 +14,15 @@ function portalgun_gravity(itemstack, user, pointed_thing) return itemstack end if not ob:get_attach() and (ob:is_player() or (ob:get_luaentity() and ob:get_luaentity().powerball~=1)) 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 + --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 diff --git a/init.lua b/init.lua index 2b24099..e29f46c 100644 --- a/init.lua +++ b/init.lua @@ -337,7 +337,7 @@ on_activate= function(self, staticdata) end, on_step=portalgun_on_step, }) -minetest.register_craftitem("portalgun:gun", { +minetest.register_craftitem(":", { description = "Portalgun", range = 100, inventory_image = "portalgun_gun0_rndr.png", @@ -352,118 +352,33 @@ minetest.register_craftitem("portalgun:gun", { damage_groups = {fleshy=1}, }, on_place=function(itemstack, user, pointed_thing) - portalgun_setmode(itemstack, user, pointed_thing, 2) - portalgun_onuse(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) - portalgun_setmode(itemstack, user, pointed_thing, 1) - portalgun_onuse(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 }) -minetest.register_craftitem("portalgun:gun1", { - description = "Portalgun (blue)", - range = 100, - groups = {not_in_creative_inventory=1}, - inventory_image = "portalgun_gun1_rndr.png", - wield_image = "portalgun_gun1_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) - portalgun_setmode(itemstack, user, pointed_thing, 2) - portalgun_onuse(itemstack, user, pointed_thing) - return itemstack -end, -on_use = function(itemstack, user, pointed_thing) - portalgun_setmode(itemstack, user, pointed_thing, 1) - portalgun_onuse(itemstack, user, pointed_thing) - return itemstack -end -}) -minetest.register_craftitem("portalgun:gun2", { - description = "Portalgun (orange)", - range = 100, - inventory_image = "portalgun_gun2_rndr.png", - wield_image = "portalgun_gun2_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}, - }, - groups = {not_in_creative_inventory=1}, - on_place=function(itemstack, user, pointed_thing) - portalgun_setmode(itemstack, user, pointed_thing, 2) - portalgun_onuse(itemstack, user, pointed_thing) - return itemstack - end, - on_use = function(itemstack, user, pointed_thing) - portalgun_setmode(itemstack, user, pointed_thing, 1) - portalgun_onuse(itemstack, user, pointed_thing) - return itemstack - end -}) - -function portalgun_mode(itemstack, user, pointed_thing) -- change modes - local item=itemstack:to_table() - local meta=minetest.deserialize(item["metadata"]) - local mode=0 - if meta==nil then - meta={} - mode=1 - minetest.chat_send_player(user:get_player_name(), " PLACE to change portal mode (or LEFT+RIGHTCLICK to use the other)") - minetest.chat_send_player(user:get_player_name(), " LEFTCLICK on an object to carry it, CLICK AGAIN to release") - minetest.chat_send_player(user:get_player_name(), " SHIFT+LEFTCLICK to close both portals (or wait 40sec until it removes it self)") - end - if meta.mode==nil then meta.mode=2 end - mode=(meta.mode) - if mode==1 then - mode=2 - else - mode=1 - end - meta.mode=mode - item.name="portalgun:gun"..mode - item.metadata=minetest.serialize(meta) - itemstack:replace(item) - minetest.sound_play("portalgun_mode", {pos=user:get_pos(),max_hear_distance = 5, gain = 1}) -end - -function portalgun_setmode(itemstack, user, pointed_thing, mode) -- change modes - local item=itemstack:to_table() - local meta=minetest.deserialize(item["metadata"]) - if meta==nil then - meta={} - mode=1 - minetest.chat_send_player(user:get_player_name(), " PLACE to change portal mode (or LEFT+RIGHTCLICK to use the other)") - minetest.chat_send_player(user:get_player_name(), " LEFTCLICK on an object to carry it, CLICK AGAIN to release") - minetest.chat_send_player(user:get_player_name(), " SHIFT+LEFTCLICK to close both portals (or wait 40sec until it removes it self)") - end - if meta.mode==nil then meta.mode=2 end - meta.mode=mode - item.name="portalgun:gun"..mode - item.metadata=minetest.serialize(meta) - itemstack:replace(item) - minetest.sound_play("portalgun_mode", {pos=user:get_pos(),max_hear_distance = 5, gain = 1}) -end - local function rnd(r) return math.floor(r+ 0.5) end -function portalgun_onuse(itemstack, user, pointed_thing) -- using the gun +function portalgun_onuse(itemstack, user, pointed_thing, mode) -- using the gun if pointed_thing.type=="object" then portalgun_gravity(itemstack, user, pointed_thing) @@ -477,14 +392,6 @@ function portalgun_onuse(itemstack, user, pointed_thing) -- using the gun local exist=0 local item=itemstack:to_table() - local mode=minetest.deserialize(item["metadata"]) - if mode==nil then - portalgun_mode(itemstack, user, pointed_thing) - return itemstack - else - mode=mode.mode - end - local ob={} ob.project=1 ob.lifelime=portalgun_lifelime diff --git a/other.lua b/other.lua index cda171c..d42a453 100644 --- a/other.lua +++ b/other.lua @@ -36,7 +36,34 @@ minetest.register_node("portalgun:cplps1", { }} }) - +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", diff --git a/powerball.lua b/powerball.lua index 9534808..2d495d6 100644 --- a/powerball.lua +++ b/powerball.lua @@ -17,7 +17,6 @@ minetest.register_node("portalgun:powerballspawner", { sounds = glass_sounds, is_ground_content = false, paramtype2 = "facedir", - on_place = minetest.rotate_node, on_construct = function(pos) minetest.get_node_timer(pos):start(10) end, @@ -28,8 +27,9 @@ minetest.register_node("portalgun:powerballspawner", { 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==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 @@ -121,6 +121,7 @@ on_step= function(self, dtime) 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}) diff --git a/sounds/block_place.ogg b/sounds/block_place.ogg index 0e61ce1..d5cdb17 100644 Binary files a/sounds/block_place.ogg and b/sounds/block_place.ogg differ diff --git a/sounds/glass_walk.ogg b/sounds/glass_walk.ogg index 4919c6a..c335287 100644 Binary files a/sounds/glass_walk.ogg and b/sounds/glass_walk.ogg differ diff --git a/sounds/stone_walk.ogg b/sounds/stone_walk.ogg index 40efa02..e1be195 100644 Binary files a/sounds/stone_walk.ogg and b/sounds/stone_walk.ogg differ diff --git a/sounds/wood_walk.ogg b/sounds/wood_walk.ogg index 77c5e50..9832c14 100644 Binary files a/sounds/wood_walk.ogg and b/sounds/wood_walk.ogg differ diff --git a/stuff.lua b/stuff.lua index 7db11bd..fdbfae2 100644 --- a/stuff.lua +++ b/stuff.lua @@ -94,7 +94,7 @@ end minetest.register_node("portalgun:turretgun2", { description = "Sentry turret", - groups = {cracky=3,not_in_creative_inventory=1}, + groups = {oddly_breakable_by_hand=1,not_in_creative_inventory=1}, drop="portalgun:turretgun", paramtype = "light", paramtype2 = "facedir", @@ -160,7 +160,7 @@ minetest.register_node("portalgun:turretgun2", { minetest.register_node("portalgun:turretgun", { description = "Sentry turret", - groups = {cracky=3}, + groups = {oddly_breakable_by_hand=1}, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, @@ -226,12 +226,12 @@ minetest.register_chatcommand("giveitems", { func = function(name) local player = minetest.get_player_by_name(name) if player then - --give all items that dont have not_in_creative_inventory=1 - for i,v in pairs(minetest.registered_items) do - if v.not_in_creative_inventory==nil or v.not_in_creative_inventory==0 then - player:get_inventory():add_item("main",i.." 1") - end - end + --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, }) @@ -304,7 +304,25 @@ minetest.register_node("portalgun:toxwater_2", { 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", @@ -529,7 +547,6 @@ minetest.register_entity("portalgun:bullet1",{ mesh = "bullet.obj", --yellow color as tiles tiles = {"#color[yellow]"}, - visual_size = {x=0.1, y=0.1}, initial_sprite_basepos = {x=0, y=0}, portalgun=2, bullet=1, diff --git a/textures/portalgun_pick.png b/textures/portalgun_pick.png new file mode 100644 index 0000000..5e7d332 Binary files /dev/null and b/textures/portalgun_pick.png differ