From 272061541a47caeae5a38b92562c267b59ca5544 Mon Sep 17 00:00:00 2001 From: stujones11 Date: Sun, 29 Jun 2014 21:28:09 +0100 Subject: [PATCH] Add a simple ammo system and fix misspelling of rifle --- LICENSE.txt | 4 + README.txt | 2 +- depends.txt | 2 + init.lua | 130 ++++++++---------- shooter.lua | 39 ++++++ sounds/shooter_click.ogg | Bin 0 -> 7377 bytes sounds/shooter_reload.ogg | Bin 0 -> 12213 bytes .../{shooter_riffle.ogg => shooter_rifle.ogg} | Bin .../{shooter_riffle.png => shooter_rifle.png} | Bin 9 files changed, 106 insertions(+), 71 deletions(-) create mode 100644 sounds/shooter_click.ogg create mode 100644 sounds/shooter_reload.ogg rename sounds/{shooter_riffle.ogg => shooter_rifle.ogg} (100%) rename textures/{shooter_riffle.png => shooter_rifle.png} (100%) diff --git a/LICENSE.txt b/LICENSE.txt index 6b0af2d..55a2b42 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -13,3 +13,7 @@ License Sounds: freesound.org GUNSHOT.WAV by erkanozan - CC0 1.0 Universal (CC0 1.0) + winchester-rifle-cock-reload.wav by MentalSanityOff - CC0 1.0 Universal (CC0 1.0) + + trigger-with-hammer-fall.wav by Nanashi - CC0 1.0 Universal (CC0 1.0) + diff --git a/README.txt b/README.txt index 8c114a3..54e397a 100644 --- a/README.txt +++ b/README.txt @@ -32,7 +32,7 @@ Pistol: [shooter:pistol] | | M | +---+---+ -Riffle: [shooter:riffle] +Rifle: [shooter:rifle] +---+---+---+ | S | | | diff --git a/depends.txt b/depends.txt index e69de29..845d8d2 100644 --- a/depends.txt +++ b/depends.txt @@ -0,0 +1,2 @@ +default +tnt diff --git a/init.lua b/init.lua index f1eb1a7..7464baf 100644 --- a/init.lua +++ b/init.lua @@ -1,87 +1,70 @@ dofile(minetest.get_modpath(minetest.get_current_modname()).."/shooter.lua") -minetest.register_tool("shooter:pistol", { +shooter:register_weapon("shooter:pistol", { description = "Pistol", inventory_image = "shooter_pistol.png", - on_use = function(itemstack, user, pointed_thing) - local name = user:get_player_name() - shooter:fire_weapon(user, pointed_thing, { - name = name, - range = 100, - step = 20, - tool_caps = {full_punch_interval=0.5, damage_groups={fleshy=2}}, - groups = {snappy=3, fleshy=3, oddly_breakable_by_hand=3}, - sound = "shooter_pistol", - particle = "shooter_cap.png", - }) - itemstack:add_wear(328) -- 200 Rounds - return itemstack - end, + rounds = 200, + spec = { + range = 100, + step = 20, + tool_caps = {full_punch_interval=0.5, damage_groups={fleshy=2}}, + groups = {snappy=3, fleshy=3, oddly_breakable_by_hand=3}, + sound = "shooter_pistol", + particle = "shooter_cap.png", + }, }) -minetest.register_tool("shooter:riffle", { - description = "Riffle", - inventory_image = "shooter_riffle.png", - on_use = function(itemstack, user, pointed_thing) - local name = user:get_player_name() - shooter:fire_weapon(user, pointed_thing, { - name = name, - range = 200, - step = 30, - tool_caps = {full_punch_interval=1.0, damage_groups={fleshy=3}}, - groups = {snappy=3, crumbly=3, choppy=3, fleshy=2, oddly_breakable_by_hand=2}, - sound = "shooter_riffle", - particle = "shooter_bullet.png", - }) - itemstack:add_wear(656) -- 100 Rounds - return itemstack - end, +shooter:register_weapon("shooter:rifle", { + description = "Rifle", + inventory_image = "shooter_rifle.png", + rounds = 100, + spec = { + range = 200, + step = 30, + tool_caps = {full_punch_interval=1.0, damage_groups={fleshy=3}}, + groups = {snappy=3, crumbly=3, choppy=3, fleshy=2, oddly_breakable_by_hand=2}, + sound = "shooter_rifle", + particle = "shooter_bullet.png", + }, }) -minetest.register_tool("shooter:shotgun", { +shooter:register_weapon("shooter:shotgun", { description = "Shotgun", inventory_image = "shooter_shotgun.png", - on_use = function(itemstack, user, pointed_thing) - local name = user:get_player_name() - shooter:fire_weapon(user, pointed_thing, { - name = name, - range = 50, - step = 15, - tool_caps = {full_punch_interval=1.5, damage_groups={fleshy=4}}, - groups = {cracky=3, snappy=2, crumbly=2, choppy=2, fleshy=1, oddly_breakable_by_hand=1}, - sound = "shooter_shotgun", - particle = "smoke_puff.png", - }) - itemstack:add_wear(1311) -- 50 Rounds - return itemstack - end, + rounds = 50, + spec = { + range = 50, + step = 15, + tool_caps = {full_punch_interval=1.5, damage_groups={fleshy=4}}, + groups = {cracky=3, snappy=2, crumbly=2, choppy=2, fleshy=1, oddly_breakable_by_hand=1}, + sound = "shooter_shotgun", + particle = "smoke_puff.png", + }, }) -minetest.register_tool("shooter:machine_gun", { +shooter:register_weapon("shooter:machine_gun", { description = "Sub Machine Gun", inventory_image = "shooter_smgun.png", - on_use = function(itemstack, user, pointed_thing) - local name = user:get_player_name() - for i = 0, 0.45, 0.15 do - minetest.after(i, function() - shooter:fire_weapon(user, pointed_thing, { - name = name, - range = 100, - step = 20, - tool_caps = {full_punch_interval=0.1, damage_groups={fleshy=2}}, - groups = {snappy=3, fleshy=3, oddly_breakable_by_hand=3}, - sound = "shooter_pistol", - particle = "shooter_cap.png", - }) - end) - end - itemstack:add_wear(328) -- 4 x 200 Rounds - return itemstack - end, + rounds = 50, + shots = 4, + spec = { + range = 100, + step = 20, + tool_caps = {full_punch_interval=0.125, damage_groups={fleshy=2}}, + groups = {snappy=3, fleshy=3, oddly_breakable_by_hand=3}, + sound = "shooter_pistol", + particle = "shooter_cap.png", + }, }) +minetest.register_craftitem("shooter:ammo", { + description = "Ammo pack", + inventory_image = "shooter_ammo.png", +}) + + minetest.register_craft({ - output = "shooter:pistol", + output = "shooter:pistol 1 65535", recipe = { {"default:steel_ingot", "default:steel_ingot"}, {"", "default:mese_crystal"}, @@ -89,7 +72,7 @@ minetest.register_craft({ }) minetest.register_craft({ - output = "shooter:riffle", + output = "shooter:riffle 1 65535", recipe = { {"default:steel_ingot", "", ""}, {"", "default:bronze_ingot", ""}, @@ -98,7 +81,7 @@ minetest.register_craft({ }) minetest.register_craft({ - output = "shooter:shotgun", + output = "shooter:shotgun 1 65535", recipe = { {"default:steel_ingot", "", ""}, {"", "default:steel_ingot", ""}, @@ -107,7 +90,7 @@ minetest.register_craft({ }) minetest.register_craft({ - output = "shooter:machine_gun", + output = "shooter:machine_gun 1 65535", recipe = { {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, {"", "default:bronze_ingot", "default:mese_crystal"}, @@ -115,3 +98,10 @@ minetest.register_craft({ }, }) +minetest.register_craft({ + output = "shooter:ammo", + recipe = { + {"tnt:gunpowder", "default:bronze_ingot"}, + }, +}) + diff --git a/shooter.lua b/shooter.lua index 77a7ab0..bb991c8 100644 --- a/shooter.lua +++ b/shooter.lua @@ -182,6 +182,45 @@ local function process_round(round) end end +function shooter:register_weapon(name, def) + local shots = def.shots or 1 + local wear = math.ceil(65534 / def.rounds) + local max_wear = (def.rounds - 1) * wear + minetest.register_tool(name, { + description = def.description, + 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) + end + else + shooter:fire_weapon(user, pointed_thing, def.spec) + end + itemstack:add_wear(wear) + else + local inv = user:get_inventory() + if inv then + local stack = "shooter:ammo 1" + if inv:contains_item("main", stack) then + minetest.sound_play("shooter_reload", {object=user}) + inv:remove_item("main", stack) + itemstack:replace(name.." 1 1") + else + minetest.sound_play("shooter_click", {object=user}) + end + end + end + return itemstack + end, + }) +end + function shooter:fire_weapon(user, pointed_thing, def) if shooter.shots[def.name] then if shooter.time < shooter.shots[def.name] then diff --git a/sounds/shooter_click.ogg b/sounds/shooter_click.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8e60db8039d82614d59d75902e9197a972823554 GIT binary patch literal 7377 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 literal 0 HcmV?d00001 diff --git a/sounds/shooter_reload.ogg b/sounds/shooter_reload.ogg new file mode 100644 index 0000000000000000000000000000000000000000..47f72459711e08f80f50078ad03dfd7acd4fc184 GIT binary patch literal 12213 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