gravitygun/init.lua

260 lines
8.5 KiB
Lua

enable_gravitygun_requires_privilege_to_hold_players=true
enable_gravitygun_throw_stuff_destroys=true
enable_gravitygun_basic=true
enable_gravitygun=true
enable_gravitygun_requires_privilege=false
enable_gravitygun_owerloaded=true
enable_gravitygun_owerloaded_requires_privilege=true
minetest.register_privilege("gravitygun", {
description = "Gravitygun privilege",
give_to_singleplayer=true
})
minetest.register_privilege("gravitygun2", {
description = "Gravitygun overloaded privilege",
give_to_singleplayer=true
})
dofile(minetest.get_modpath("gravitygun") .. "/entitys.lua")
dofile(minetest.get_modpath("gravitygun") .. "/craft.lua")
gravitygun_slowdown={}
if enable_gravitygun_owerloaded then
minetest.register_node("gravitygun:gun3", {
description = "Gravitygun (overloaded)",
range = 5,
drawtype="mesh",
mesh="gravitygun_gun_wielded.obj",
paramtype="light",
paramtype2="facedir",
sunlight_propagates = true,
tiles={"gravitygun_gtex3.png"},
wield_scale = {x=2, y=2, z=2},
on_place = function(itemstack, placer, pointed_thing)
return itemstack
end,
on_use = function(itemstack, user, pointed_thing)
if enable_gravitygun_owerloaded_requires_privilege and minetest.check_player_privs(user:get_player_name(), {gravitygun2=true})==false then
minetest.chat_send_player(user:get_player_name(), "You need the gravitygun2 privilege to use this")
return itemstack
end
local obs={}
local item=user:get_wielded_item():get_name():split(":")[2]
local powers={}
local name=user:get_player_name()
local pos={}
local y=1
if pointed_thing.type=="node" then
if gravitygun_slowdown_user(user)==false then
return itemstack
end
pos=pointed_thing.above
y=2
elseif pointed_thing.type=="object" then
pos=pointed_thing.ref:get_pos()
elseif pointed_thing.type=="nothing" then
pos=user:get_pos()
local dir=user:get_look_dir()
pos={x=pos.x+(dir.x*2), y=pos.y+(dir.y*2)+1, z=pos.z+(dir.z*2)}
y=2
else
return itemstack
end
if pointed_thing.type~="node" then
for i, ob in pairs(minetest.get_objects_inside_radius(pos, 5)) do
if (ob:get_luaentity() and ob:get_luaentity().ggunpower==nil) or ob:get_player_name()~=name then
gravitygun_power.item=item
gravitygun_power.user=user
local obpos=ob:get_pos()
ob:move_to({x=obpos.x,y=obpos.y+y,z=obpos.z})
gravitygun_power.target=ob
local m=minetest.add_entity(ob:get_pos(), "gravitygun:power")
ob:set_attach(m, "", {x=0,y=0,z=0}, {x=0,y=0,z=0})
table.insert(powers,m)
end
end
for i, ob in pairs(powers) do
ob:right_click(user)
end
minetest.sound_play("gravitygun_grabnodesend_massive1", {pos=pos,max_hear_distance = 10, gain = 1})
return itemstack
else
for i=1,20,1 do
local np=minetest.find_node_near(pos, 2,{
"group:snappy",
"group:wood",
"group:choppy",
"group:tree",
"group:level",
"group:crumbly",
"group:falling_node",
"group:sand",
"group:dig_immediate",
"group:flammable",
"group:water",
"group:liquid ",
"group:oddly_breakable_by_hand",
"group:soil",
"group:cracky",
"group:stone"
})
if np~=nil and minetest.is_protected(np,user:get_player_name())==false then
local obn=gravitygun_spawn_block(np)
if not obn.notable then
table.insert(obs,obn)
end
else
break
end
end
for i, ob in pairs(obs) do
gravitygun_power.item=item
gravitygun_power.user=user
gravitygun_power.target=ob
local m=minetest.add_entity(ob:get_pos(), "gravitygun:power")
ob:set_attach(m, "", {x=0,y=0,z=0}, {x=0,y=0,z=0})
table.insert(powers,m)
end
for i, ob in pairs(powers) do
ob:right_click(user)
end
minetest.sound_play("gravitygun_grabnodesend_massive2", {pos=pos,max_hear_distance = 10, gain = 1})
end
return itemstack
end,
})
end
if enable_gravitygun==true then
minetest.register_node("gravitygun:gun2", {
description = "Gravitygun",
range = 10,
drawtype="mesh",
mesh="gravitygun_gun_wielded.obj",
paramtype="light",
paramtype2="facedir",
sunlight_propagates = true,
tiles={"gravitygun_gtex2.png"},
wield_scale = {x=2, y=2, z=2},
on_place = function(itemstack, placer, pointed_thing)
return itemstack
end,
on_use = function(itemstack, user, pointed_thing)
if enable_gravitygun_requires_privilege and minetest.check_player_privs(user:get_player_name(), {gravitygun=true})==false then
minetest.chat_send_player(user:get_player_name(), "You need the gravitygun privilege to use this")
return itemstack
end
gravitygun_onuse(itemstack, user, pointed_thing,2)
return itemstack
end,
})
end
if enable_gravitygun_basic then
minetest.register_node("gravitygun:gun1", {
description = "Gravitygun (basic)",
range = 5,
drawtype="mesh",
mesh="gravitygun_gun_wielded.obj",
paramtype="light",
paramtype2="facedir",
sunlight_propagates = true,
tiles={"gravitygun_gtex1.png"},
wield_scale = {x=2, y=2, z=2},
on_place = function(itemstack, placer, pointed_thing)
return itemstack
end,
on_use = function(itemstack, user, pointed_thing)
gravitygun_onuse(itemstack, user, pointed_thing,1)
return itemstack
end,
})
end
function gravitygun_onuse(itemstack, user, pointed_thing,type)
local ob={}
local pos=user:get_pos()
if user:get_attach() then return itemstack end
if pointed_thing.type=="object" then
ob=pointed_thing.ref
elseif pointed_thing.type=="node" and minetest.is_protected(pointed_thing.above,user:get_player_name())==false then
ob=gravitygun_spawn_block(pointed_thing.under)
if ob.notable then
return itemstack
end
else
return itemstack
end
if ob:get_luaentity() and ob:get_luaentity().ggunpower then
local player_name=user:get_player_name()
local target=ob:get_luaentity().target
if ob:get_luaentity().user:get_player_name()==player_name
and not (target:get_luaentity() and target:get_luaentity().block) then
minetest.sound_play("gravitygun_grabnodedrop", {pos=pos,max_hear_distance = 5, gain = 1})
target:set_detach()
if target:get_luaentity() then
target:set_velocity({x=0, y=-2, z=0})
target:set_acceleration({x=0, y=-8, z=0})
end
return itemstack
elseif target:get_luaentity() and target:get_luaentity().block
and ob:get_luaentity().user:get_player_name()==player_name then
local pos=ob:get_pos()
if minetest.registered_nodes[minetest.get_node(pos).name].walkable==false
and minetest.is_protected(pos,player_name)==false then
if minetest.registered_nodes[target:get_luaentity().drop] then
minetest.set_node(pos,{name=target:get_luaentity().drop})
else
minetest.add_item(pos, target:get_luaentity().drop)
end
target:set_detach()
target:set_hp(1)
target:punch(target, {full_punch_interval=1.0,damage_groups={fleshy=4}}, "default:bronze_pick", nil)
minetest.sound_play("gravitygun_grabnodedrop", {pos=pos,max_hear_distance = 5, gain = 1})
end
end
if ob:get_luaentity().target:get_luaentity() and ob:get_luaentity().target:get_luaentity().itemstring then
ob:get_luaentity().target:set_velocity({x=0, y=-2, z=0})
ob:get_luaentity().target:set_acceleration({x=0, y=-8, z=0})
minetest.sound_play("gravitygun_grabnodedrop", {pos=pos,max_hear_distance = 5, gain = 1})
end
return itemstack
end
if (not ob:get_attach()) and not (ob:get_luaentity() and ob:get_luaentity().ggunpower) then
if (not ob:get_luaentity()) and enable_gravitygun_requires_privilege_to_hold_players and minetest.check_player_privs(user:get_player_name(), {gravitygun=true})==false then
minetest.chat_send_player(user:get_player_name(), "You need the gravitygun privilege to hold players")
return itemstack
end
gravitygun_power.item=user:get_wielded_item():get_name():split(":")[2]
gravitygun_power.user=user
gravitygun_power.target=ob
local m=minetest.add_entity(ob:get_pos(), "gravitygun:power")
ob:set_attach(m, "", {x=0,y=0,z=0}, {x=0,y=0,z=0})
if user:get_player_control().RMB then m:right_click(user)
else
minetest.sound_play("gravitygun_grabnode", {pos=pos,max_hear_distance = 5, gain = 1})
end
return itemstack
end
return itemstack
end
function gravitygun_slowdown_user(user)
local name=user:get_player_name()
if gravitygun_slowdown[name]~=nil then
return false
end
gravitygun_slowdown[name]=1
minetest.after(2, function(name)
gravitygun_slowdown[name]=nil
end, name)
return true
end