Add better ranged combat for shooters

This commit is contained in:
rubenwardy 2019-03-22 04:01:36 +00:00
parent 72c7563a85
commit c1b7ab7f9f
5 changed files with 92 additions and 16 deletions

View file

@ -83,13 +83,18 @@ minetest.register_tool("shooter:grapple_gun", {
description = "Grappling Gun",
inventory_image = "shooter_hook_gun.png",
on_use = function(itemstack, user, pointed_thing)
local ent = pointed_thing.ref and pointed_thing.ref:get_luaentity()
if ent and ent.name == "__builtin:item" then
return ent:on_punch(user)
end
local inv = user:get_inventory()
if inv:contains_item("main", "shooter:grapple_hook") and
inv:contains_item("main", "tnt:gunpowder") then
inv:remove_item("main", "tnt:gunpowder")
true then --inv:contains_item("main", "tnt:gunpowder") then
-- inv:remove_item("main", "tnt:gunpowder")
minetest.sound_play("shooter_reload", {object=user})
local stack = inv:remove_item("main", "shooter:grapple_hook")
itemstack = "shooter:grapple_gun_loaded 1 "..stack:get_wear()
itemstack = ItemStack("shooter:grapple_gun_loaded 1 "..stack:get_wear())
else
minetest.sound_play("shooter_click", {object=user})
end
@ -107,6 +112,7 @@ minetest.register_tool("shooter:grapple_gun_loaded", {
end
minetest.sound_play("shooter_pistol", {object=user})
itemstack = ItemStack("shooter:grapple_hook 1 "..itemstack:get_wear())
itemstack:add_wear(65536 / 6)
throw_hook(itemstack, user, 20)
return "shooter:grapple_gun"
end,

View file

@ -229,18 +229,20 @@ function shooter:register_weapon(name, def)
inventory_image = def.inventory_image,
on_use = function(itemstack, user, pointed_thing)
if itemstack:get_wear() < max_wear then
def.spec.name = user:get_player_name()
if shots > 1 then
local step = def.spec.tool_caps.full_punch_interval
for i = 0, step * shots, step do
minetest.after(i, function()
shooter:fire_weapon(user, pointed_thing, def.spec)
end)
local spec = shooter:get_weapon_spec(user, name)
if spec then
if shots > 1 then
local step = spec.tool_caps.full_punch_interval
for i = 0, step * shots, step do
minetest.after(i, function()
shooter:fire_weapon(user, pointed_thing, spec)
end)
end
else
shooter:fire_weapon(user, pointed_thing, spec)
end
else
shooter:fire_weapon(user, pointed_thing, def.spec)
itemstack:add_wear(wear)
end
itemstack:add_wear(wear)
else
local inv = user:get_inventory()
if inv then
@ -259,6 +261,16 @@ function shooter:register_weapon(name, def)
})
end
function shooter:get_weapon_spec(user, name)
local spec = shooter.registered_weapons[name]
if not spec then
return nil
end
spec = spec.spec
spec.name = user:get_player_name()
return spec
end
function shooter:fire_weapon(user, pointed_thing, def)
if shooter.shots[def.name] then
if shooter.time < shooter.shots[def.name] then
@ -466,9 +478,8 @@ if not singleplayer and SHOOTER_ADMIN_WEAPONS then
if player:get_player_control().LMB then
local name = player:get_player_name()
if minetest.check_player_privs(name, {server=true}) then
local spec = shooter.registered_weapons[player:get_wielded_item():get_name()]
local spec = shooter:get_weapon_spec(player, player:get_wielded_item():get_name())
if spec then
spec = spec.spec
shooter.shots[name] = false
spec.name = name
shooter:fire_weapon(player, {}, spec)