Initial commit

This commit is contained in:
stujones11 2013-11-26 21:22:21 +00:00
commit 6255c81015
11 changed files with 174 additions and 0 deletions

7
.gitignore vendored Normal file
View file

@ -0,0 +1,7 @@
## Generic ignorable patterns and files
*~
.*.swp
*bak*
tags
*.vim

12
LICENSE.txt Normal file
View file

@ -0,0 +1,12 @@
Minetest Mod - Simple Shooter [shooter]
=======================================
License Source: 2013 Stuart Jones - LGPL
License Textures: Stuart Jones - WTFPL
License Sounds: freesound.org
flobert1_20070728.wav by Nonoo - Attribution 3.0 Unported (CC BY 3.0)
GUNSHOT.WAV by erkanozan - CC0 1.0 Universal (CC0 1.0)

54
README.txt Normal file
View file

@ -0,0 +1,54 @@
Minetest Mod - Simple Shooter [shooter]
=======================================
Mod Version: 0.1.0
Minetest Version: 0.4.8
Depends: default
An experimental first person shooter mod using vector mathematics instead of
physical projectile entities. This has a number of advantages along with a
number disadvantages.
Pros:
Fast and responsive
Fairly light weight
Not affected by chunk boundaries
Cons:
Only works against other players
Slightly less realistic
This is still very much a work in progress and currently not much use in a
singleplayer game. I plan to eventually use this as a base for a 'Spades' style
FPS game using the minetest engine, however, I decided to add a couple of craft
recipes and release this simple version for minetest_game.
Crafting
========
S = Steel Ingot [default:steel_ingot]
B = Bronze Ingot [default:bronze_ingot]
M = Mese Crystal [default:mese_crysytal]
Pistol: [shooter:pistol]
+---+---+
| S | B |
+---+---+
| | M |
+---+---+
Riffle: [shooter:riffle]
+---+---+---+
| S | | |
+---+---+---+
| | B | |
+---+---+---+
| | M | B |
+---+---+---+

2
depends.txt Normal file
View file

@ -0,0 +1,2 @@
default

47
init.lua Normal file
View file

@ -0,0 +1,47 @@
dofile(minetest.get_modpath(minetest.get_current_modname()).."/shooter.lua")
minetest.register_tool("shooter:pistol", {
description = "Pistol",
inventory_image = "shooter_pistol.png",
on_use = function(itemstack, user, pointed_thing)
shooter:fire_weapon(user, {
range_func = {a=-0.1, b=-1.5, c=100},
tool_caps = {full_punch_interval=1.0, damage_groups={fleshy=3}},
sound = "shooter_pistol",
})
itemstack:add_wear(328) -- 200 Rounds
return itemstack
end,
})
minetest.register_tool("shooter:riffle", {
description = "Riffle",
inventory_image = "shooter_riffle.png",
on_use = function(itemstack, user, pointed_thing)
shooter:fire_weapon(user, {
range_func = {a=-0.02, b=-0.6, c=100},
tool_caps = {full_punch_interval=1.0, damage_groups={fleshy=5}},
sound = "shooter_riffle",
})
itemstack:add_wear(656) -- 100 Rounds
return itemstack
end,
})
minetest.register_craft({
output = "shooter:pistol",
recipe = {
{"default:steel_ingot", "default:bronze_ingot"},
{"", "default:mese_crystal"},
},
})
minetest.register_craft({
output = "shooter:riffle",
recipe = {
{"default:steel_ingot", "", ""},
{"", "default:bronze_ingot", ""},
{"", "default:mese_crystal", "default:bronze_ingot"},
},
})

52
shooter.lua Normal file
View file

@ -0,0 +1,52 @@
shooter = {}
local function in_range(r, x)
local chance = r.a * (x * x) + r.b * x + r.c
if math.random(100) < chance then
return true
end
return false
end
function shooter:fire_weapon(user, def)
minetest.sound_play(def.sound, {object=user})
local target = {player=nil, distance=50}
local p1 = user:getpos()
for _,player in ipairs(minetest.get_connected_players()) do
local p2 = player:getpos()
if p1 and p2 then
local x = vector.distance(p1, p2)
p2.y = p2.y - 0.75
if x > 0 and x < target.distance and x < 50 then
if in_range(def.range_func, x) == true then
local v1 = user:get_look_dir()
local v2 = vector.normalize(vector.direction(p1, p2))
local vd = vector.subtract(v1, v2)
local yx = 0.00002 * (x * x) - 0.002 * x + 0.05
local yy = yx * 3
if math.abs(vd.x) < yx and
math.abs(vd.z) < yx and
math.abs(vd.y) < yy then
target = {
player = player,
distance = x,
direction = v1,
pos1 = {x=p1.x, z=p1.z, y=p1.y+1},
pos2 = {x=p2.x, z=p2.z, y=p2.y+1.75},
}
end
end
end
end
end
if target.player then
if minetest.line_of_sight(target.pos1, target.pos2, 1) then
target.player:punch(user, nil, def.tool_caps, target.direction)
end
end
end
minetest.register_on_joinplayer(function(player)
player:hud_set_flags({crosshair = true})
end)

BIN
sounds/shooter_pistol.ogg Normal file

Binary file not shown.

BIN
sounds/shooter_riffle.ogg Normal file

Binary file not shown.

BIN
textures/crosshair.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 B

BIN
textures/shooter_pistol.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

BIN
textures/shooter_riffle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B