Deprecate global config variables
This commit is contained in:
parent
347a8807bf
commit
83c60c85ff
11 changed files with 189 additions and 183 deletions
|
@ -13,11 +13,48 @@ to produce an accurate and server-firendly method of hit detection.
|
||||||
By default this mod is configured to work only against other players in
|
By default this mod is configured to work only against other players in
|
||||||
multiplayer mode and against Simple Mobs [mobs] in singleplayer mode.
|
multiplayer mode and against Simple Mobs [mobs] in singleplayer mode.
|
||||||
|
|
||||||
Default configuration can be customised by adding a shooter.conf file to
|
Configuration
|
||||||
the mod's main directory, see shooter.conf.example for more details.
|
=============
|
||||||
|
|
||||||
This is still very much a work in progress which I eventually plan to use
|
Override the following default settings by adding them to your minetest.conf file.
|
||||||
as the base for a 'Spades' style FPS game using the minetest engine.
|
|
||||||
|
-- Enable admin super weapons
|
||||||
|
-- This lets admins shoot guns automatically after 2 seconds without munition.
|
||||||
|
shooter_admin_weapons = false
|
||||||
|
|
||||||
|
-- Enable node destruction with explosives
|
||||||
|
shooter_enable_blasting = true
|
||||||
|
|
||||||
|
-- Enable Crafting
|
||||||
|
shooter_enable_crafting = true
|
||||||
|
|
||||||
|
-- Enable particle effects
|
||||||
|
shooter_enable_particle_fx = true
|
||||||
|
|
||||||
|
-- Enable protection mod support, requires a protection mod that utilizes
|
||||||
|
-- minetest.is_protected(), tested with TenPlus1's version of [protector]
|
||||||
|
shooter_enable_protection = false
|
||||||
|
|
||||||
|
-- Particle texture used when a player or entity is hit
|
||||||
|
shooter_explosion = "shooter_hit.png"
|
||||||
|
|
||||||
|
-- Allow node destruction
|
||||||
|
shooter_allow_nodes = true
|
||||||
|
|
||||||
|
-- Allow entities in multiplayer mode
|
||||||
|
shooter_allow_entities = false
|
||||||
|
|
||||||
|
-- Allow players in multiplayer mode
|
||||||
|
shooter_allow_players = true
|
||||||
|
|
||||||
|
-- How often objects are fully reloaded
|
||||||
|
shooter_object_reload_time = 1
|
||||||
|
|
||||||
|
-- How often object positions are updated
|
||||||
|
shooter_object_update_time = 0.25
|
||||||
|
|
||||||
|
-- How often rounds are processed
|
||||||
|
shooter_rounds_update_time = 0.4
|
||||||
|
|
||||||
Crafting
|
Crafting
|
||||||
========
|
========
|
||||||
|
|
120
shooter/api.lua
120
shooter/api.lua
|
@ -5,62 +5,28 @@ shooter = {
|
||||||
shots = {},
|
shots = {},
|
||||||
update_time = 0,
|
update_time = 0,
|
||||||
reload_time = 0,
|
reload_time = 0,
|
||||||
|
player_offset = {x=0, y=1, z=0},
|
||||||
|
entity_offset = {x=0, y=0, z=0},
|
||||||
}
|
}
|
||||||
|
|
||||||
SHOOTER_ADMIN_WEAPONS = false
|
shooter.config = {
|
||||||
SHOOTER_ENABLE_BLASTING = false
|
admin_weapons = false,
|
||||||
SHOOTER_ENABLE_CROSSBOW = true
|
enable_blasting = false,
|
||||||
SHOOTER_ENABLE_GUNS = true
|
enable_particle_fx = true,
|
||||||
SHOOTER_ENABLE_FLARES = true
|
enable_protection = false,
|
||||||
SHOOTER_ENABLE_HOOK = true
|
enable_crafting = true,
|
||||||
SHOOTER_ENABLE_GRENADES = true
|
explosion_texture = "shooter_hit.png",
|
||||||
SHOOTER_ENABLE_ROCKETS = true
|
allow_nodes = true,
|
||||||
SHOOTER_ENABLE_TURRETS = true
|
allow_entities = false,
|
||||||
SHOOTER_ENABLE_CRAFTING = true
|
allow_players = true,
|
||||||
SHOOTER_ENABLE_PARTICLE_FX = true
|
object_reload_time = 1,
|
||||||
SHOOTER_ENABLE_PROTECTION = false
|
object_update_time = 0.25,
|
||||||
SHOOTER_EXPLOSION_TEXTURE = "shooter_hit.png"
|
rounds_update_time = 0.4,
|
||||||
SHOOTER_ALLOW_NODES = true
|
}
|
||||||
SHOOTER_ALLOW_ENTITIES = false
|
|
||||||
SHOOTER_ALLOW_PLAYERS = true
|
|
||||||
SHOOTER_OBJECT_RELOAD_TIME = 1
|
|
||||||
SHOOTER_OBJECT_UPDATE_TIME = 0.25
|
|
||||||
SHOOTER_ROUNDS_UPDATE_TIME = 0.4
|
|
||||||
SHOOTER_PLAYER_OFFSET = {x=0, y=1, z=0}
|
|
||||||
SHOOTER_ENTITY_OFFSET = {x=0, y=0, z=0}
|
|
||||||
SHOOTER_ENTITIES = {}
|
|
||||||
for k, v in pairs(minetest.registered_entities) do
|
|
||||||
if string.find(k, "^mobs") then
|
|
||||||
table.insert(SHOOTER_ENTITIES, k)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
local config = shooter.config
|
||||||
local singleplayer = minetest.is_singleplayer()
|
local singleplayer = minetest.is_singleplayer()
|
||||||
if singleplayer then
|
|
||||||
SHOOTER_ENABLE_BLASTING = true
|
|
||||||
SHOOTER_ALLOW_ENTITIES = true
|
|
||||||
SHOOTER_ALLOW_PLAYERS = false
|
|
||||||
end
|
|
||||||
|
|
||||||
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
|
||||||
local worldpath = minetest.get_worldpath()
|
|
||||||
local input = io.open(modpath.."/shooter.conf", "r")
|
|
||||||
if input then
|
|
||||||
dofile(modpath.."/shooter.conf")
|
|
||||||
input:close()
|
|
||||||
input = nil
|
|
||||||
end
|
|
||||||
input = io.open(worldpath.."/shooter.conf", "r")
|
|
||||||
if input then
|
|
||||||
dofile(worldpath.."/shooter.conf")
|
|
||||||
input:close()
|
|
||||||
input = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
local allowed_entities = {}
|
local allowed_entities = {}
|
||||||
for _,v in ipairs(SHOOTER_ENTITIES) do
|
|
||||||
allowed_entities[v] = 1
|
|
||||||
end
|
|
||||||
|
|
||||||
local function get_dot_product(v1, v2)
|
local function get_dot_product(v1, v2)
|
||||||
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z
|
return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z
|
||||||
|
@ -70,10 +36,14 @@ local function get_particle_pos(p, v, d)
|
||||||
return vector.add(p, vector.multiply(v, {x=d, y=d, z=d}))
|
return vector.add(p, vector.multiply(v, {x=d, y=d, z=d}))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function shooter:set_shootable_entity(name)
|
||||||
|
allowed_entities[name] = 1
|
||||||
|
end
|
||||||
|
|
||||||
function shooter:spawn_particles(pos, texture)
|
function shooter:spawn_particles(pos, texture)
|
||||||
if SHOOTER_ENABLE_PARTICLE_FX == true then
|
if config.enable_particle_fx == true then
|
||||||
if type(texture) ~= "string" then
|
if type(texture) ~= "string" then
|
||||||
texture = SHOOTER_EXPLOSION_TEXTURE
|
texture = config.explosion_texture
|
||||||
end
|
end
|
||||||
local spread = {x=0.1, y=0.1, z=0.1}
|
local spread = {x=0.1, y=0.1, z=0.1}
|
||||||
minetest.add_particlespawner(15, 0.3,
|
minetest.add_particlespawner(15, 0.3,
|
||||||
|
@ -107,7 +77,7 @@ function shooter:punch_node(pos, def)
|
||||||
if not item then
|
if not item then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
if SHOOTER_ENABLE_PROTECTION then
|
if config.enable_protection then
|
||||||
if minetest.is_protected(pos, def.name) then
|
if minetest.is_protected(pos, def.name) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
@ -132,9 +102,9 @@ end
|
||||||
function shooter:is_valid_object(object)
|
function shooter:is_valid_object(object)
|
||||||
if object then
|
if object then
|
||||||
if object:is_player() == true then
|
if object:is_player() == true then
|
||||||
return SHOOTER_ALLOW_PLAYERS
|
return config.allow_players
|
||||||
end
|
end
|
||||||
if SHOOTER_ALLOW_ENTITIES == true then
|
if config.allow_entities == true then
|
||||||
local luaentity = object:get_luaentity()
|
local luaentity = object:get_luaentity()
|
||||||
if luaentity then
|
if luaentity then
|
||||||
if luaentity.name then
|
if luaentity.name then
|
||||||
|
@ -190,14 +160,14 @@ function shooter:process_round(round)
|
||||||
local user = minetest.get_player_by_name(round.name)
|
local user = minetest.get_player_by_name(round.name)
|
||||||
if user then
|
if user then
|
||||||
target.object:punch(user, nil, round.def.tool_caps, v1)
|
target.object:punch(user, nil, round.def.tool_caps, v1)
|
||||||
shooter:spawn_particles(target.pos, SHOOTER_EXPLOSION_TEXTURE)
|
shooter:spawn_particles(target.pos, config.explosion_texture)
|
||||||
end
|
end
|
||||||
return 1
|
return 1
|
||||||
elseif pos and SHOOTER_ALLOW_NODES == true then
|
elseif pos and config.allow_nodes == true then
|
||||||
shooter:punch_node(pos, round.def)
|
shooter:punch_node(pos, round.def)
|
||||||
return 1
|
return 1
|
||||||
end
|
end
|
||||||
elseif SHOOTER_ALLOW_NODES == true then
|
elseif config.allow_nodes == true then
|
||||||
local d = round.def.step
|
local d = round.def.step
|
||||||
local p2 = vector.add(p1, vector.multiply(v1, {x=d, y=d, z=d}))
|
local p2 = vector.add(p1, vector.multiply(v1, {x=d, y=d, z=d}))
|
||||||
local success, pos = minetest.line_of_sight(p1, p2, 1)
|
local success, pos = minetest.line_of_sight(p1, p2, 1)
|
||||||
|
@ -267,7 +237,7 @@ function shooter:fire_weapon(user, pointed_thing, def)
|
||||||
{x=0, y=0, z=0}, 0.5, 0.25,
|
{x=0, y=0, z=0}, 0.5, 0.25,
|
||||||
false, def.particle
|
false, def.particle
|
||||||
)
|
)
|
||||||
if pointed_thing.type == "node" and SHOOTER_ALLOW_NODES == true then
|
if pointed_thing.type == "node" and config.allow_nodes == true then
|
||||||
local pos = minetest.get_pointed_thing_position(pointed_thing, false)
|
local pos = minetest.get_pointed_thing_position(pointed_thing, false)
|
||||||
shooter:punch_node(pos, def)
|
shooter:punch_node(pos, def)
|
||||||
elseif pointed_thing.type == "object" then
|
elseif pointed_thing.type == "object" then
|
||||||
|
@ -277,7 +247,7 @@ function shooter:fire_weapon(user, pointed_thing, def)
|
||||||
local p2 = object:getpos()
|
local p2 = object:getpos()
|
||||||
local pp = get_particle_pos(p1, v1, vector.distance(p1, p2))
|
local pp = get_particle_pos(p1, v1, vector.distance(p1, p2))
|
||||||
pp.y = pp.y + 1.75
|
pp.y = pp.y + 1.75
|
||||||
shooter:spawn_particles(pp, SHOOTER_EXPLOSION_TEXTURE)
|
shooter:spawn_particles(pp, config.explosion_texture)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
shooter:update_objects()
|
shooter:update_objects()
|
||||||
|
@ -293,7 +263,7 @@ end
|
||||||
|
|
||||||
function shooter:load_objects()
|
function shooter:load_objects()
|
||||||
local objects = {}
|
local objects = {}
|
||||||
if SHOOTER_ALLOW_PLAYERS == true then
|
if config.allow_players == true then
|
||||||
local players = minetest.get_connected_players()
|
local players = minetest.get_connected_players()
|
||||||
for _,player in ipairs(players) do
|
for _,player in ipairs(players) do
|
||||||
local pos = player:getpos()
|
local pos = player:getpos()
|
||||||
|
@ -305,12 +275,12 @@ function shooter:load_objects()
|
||||||
object = player,
|
object = player,
|
||||||
pos = pos,
|
pos = pos,
|
||||||
collisionbox = {-0.25,-1.0,-0.25, 0.25,0.8,0.25},
|
collisionbox = {-0.25,-1.0,-0.25, 0.25,0.8,0.25},
|
||||||
offset = SHOOTER_PLAYER_OFFSET,
|
offset = shooter.player_offset,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if SHOOTER_ALLOW_ENTITIES == true then
|
if config.allow_entities == true then
|
||||||
for _,ref in pairs(minetest.luaentities) do
|
for _,ref in pairs(minetest.luaentities) do
|
||||||
if ref.object and ref.name then
|
if ref.object and ref.name then
|
||||||
if allowed_entities[ref.name] then
|
if allowed_entities[ref.name] then
|
||||||
|
@ -323,7 +293,7 @@ function shooter:load_objects()
|
||||||
object = ref.object,
|
object = ref.object,
|
||||||
pos = pos,
|
pos = pos,
|
||||||
collisionbox = def.collisionbox or {0,0,0, 0,0,0},
|
collisionbox = def.collisionbox or {0,0,0, 0,0,0},
|
||||||
offset = SHOOTER_ENTITY_OFFSET,
|
offset = shooter.entity_offset,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -339,9 +309,9 @@ function shooter:load_objects()
|
||||||
end
|
end
|
||||||
|
|
||||||
function shooter:update_objects()
|
function shooter:update_objects()
|
||||||
if shooter.time - shooter.reload_time > SHOOTER_OBJECT_RELOAD_TIME then
|
if shooter.time - shooter.reload_time > config.object_reload_time then
|
||||||
shooter:load_objects()
|
shooter:load_objects()
|
||||||
elseif shooter.time - shooter.update_time > SHOOTER_OBJECT_UPDATE_TIME then
|
elseif shooter.time - shooter.update_time > config.object_update_time then
|
||||||
for i, ref in ipairs(shooter.objects) do
|
for i, ref in ipairs(shooter.objects) do
|
||||||
if ref.object then
|
if ref.object then
|
||||||
local pos = ref.object:getpos()
|
local pos = ref.object:getpos()
|
||||||
|
@ -365,8 +335,8 @@ function shooter:blast(pos, radius, fleshy, distance, user)
|
||||||
local p1 = vector.subtract(pos, radius)
|
local p1 = vector.subtract(pos, radius)
|
||||||
local p2 = vector.add(pos, radius)
|
local p2 = vector.add(pos, radius)
|
||||||
minetest.sound_play("tnt_explode", {pos=pos, gain=1})
|
minetest.sound_play("tnt_explode", {pos=pos, gain=1})
|
||||||
if SHOOTER_ALLOW_NODES and SHOOTER_ENABLE_BLASTING then
|
if config.allow_nodes and config.enable_blasting then
|
||||||
if SHOOTER_ENABLE_PROTECTION then
|
if config.enable_protection then
|
||||||
if not minetest.is_protected(pos, name) then
|
if not minetest.is_protected(pos, name) then
|
||||||
minetest.set_node(pos, {name="tnt:boom"})
|
minetest.set_node(pos, {name="tnt:boom"})
|
||||||
end
|
end
|
||||||
|
@ -374,7 +344,7 @@ function shooter:blast(pos, radius, fleshy, distance, user)
|
||||||
minetest.set_node(pos, {name="tnt:boom"})
|
minetest.set_node(pos, {name="tnt:boom"})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if SHOOTER_ENABLE_PARTICLE_FX == true then
|
if config.enable_particle_fx == true then
|
||||||
minetest.add_particlespawner(50, 0.1,
|
minetest.add_particlespawner(50, 0.1,
|
||||||
p1, p2, {x=-0, y=-0, z=-0}, {x=0, y=0, z=0},
|
p1, p2, {x=-0, y=-0, z=-0}, {x=0, y=0, z=0},
|
||||||
{x=-0.5, y=5, z=-0.5}, {x=0.5, y=5, z=0.5},
|
{x=-0.5, y=5, z=-0.5}, {x=0.5, y=5, z=0.5},
|
||||||
|
@ -383,8 +353,8 @@ function shooter:blast(pos, radius, fleshy, distance, user)
|
||||||
end
|
end
|
||||||
local objects = minetest.get_objects_inside_radius(pos, distance)
|
local objects = minetest.get_objects_inside_radius(pos, distance)
|
||||||
for _,obj in ipairs(objects) do
|
for _,obj in ipairs(objects) do
|
||||||
if (obj:is_player() and SHOOTER_ALLOW_PLAYERS == true) or
|
if (obj:is_player() and config.allow_players == true) or
|
||||||
(obj:get_luaentity() and SHOOTER_ALLOW_ENTITIES == true and
|
(obj:get_luaentity() and config.allow_entities == true and
|
||||||
obj:get_luaentity().name ~= "__builtin:item") then
|
obj:get_luaentity().name ~= "__builtin:item") then
|
||||||
local obj_pos = obj:getpos()
|
local obj_pos = obj:getpos()
|
||||||
local dist = vector.distance(obj_pos, pos)
|
local dist = vector.distance(obj_pos, pos)
|
||||||
|
@ -401,7 +371,7 @@ function shooter:blast(pos, radius, fleshy, distance, user)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if SHOOTER_ALLOW_NODES and SHOOTER_ENABLE_BLASTING then
|
if config.allow_nodes and config.enable_blasting then
|
||||||
local pr = PseudoRandom(os.time())
|
local pr = PseudoRandom(os.time())
|
||||||
local vm = VoxelManip()
|
local vm = VoxelManip()
|
||||||
local min, max = vm:read_from_map(p1, p2)
|
local min, max = vm:read_from_map(p1, p2)
|
||||||
|
@ -415,7 +385,7 @@ function shooter:blast(pos, radius, fleshy, distance, user)
|
||||||
for x = -radius, radius do
|
for x = -radius, radius do
|
||||||
if (x * x) + (y * y) + (z * z) <=
|
if (x * x) + (y * y) + (z * z) <=
|
||||||
(radius * radius) + pr:next(-radius, radius) then
|
(radius * radius) + pr:next(-radius, radius) then
|
||||||
if SHOOTER_ENABLE_PROTECTION then
|
if config.enable_protection then
|
||||||
if not minetest.is_protected(vp, name) then
|
if not minetest.is_protected(vp, name) then
|
||||||
data[vi] = c_air
|
data[vi] = c_air
|
||||||
end
|
end
|
||||||
|
@ -434,7 +404,7 @@ function shooter:blast(pos, radius, fleshy, distance, user)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if not singleplayer and SHOOTER_ADMIN_WEAPONS then
|
if not singleplayer and config.admin_weapons then
|
||||||
local timer = 0
|
local timer = 0
|
||||||
local shooting = false
|
local shooting = false
|
||||||
minetest.register_globalstep(function(dtime)
|
minetest.register_globalstep(function(dtime)
|
||||||
|
|
|
@ -1,7 +1,71 @@
|
||||||
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
local modname = minetest.get_current_modname()
|
||||||
|
local modpath = minetest.get_modpath(modname)
|
||||||
|
local worldpath = minetest.get_worldpath()
|
||||||
|
|
||||||
dofile(modpath.."/api.lua")
|
dofile(modpath.."/api.lua")
|
||||||
|
|
||||||
|
if minetest.is_singleplayer() then
|
||||||
|
shooter.config.enable_blasting = true
|
||||||
|
shooter.config.allow_entities = true
|
||||||
|
shooter.config.allow_players = false
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Legacy Config Support
|
||||||
|
|
||||||
|
local input = io.open(modpath.."/shooter.conf", "r")
|
||||||
|
if input then
|
||||||
|
dofile(modpath.."/shooter.conf")
|
||||||
|
input:close()
|
||||||
|
input = nil
|
||||||
|
end
|
||||||
|
input = io.open(worldpath.."/shooter.conf", "r")
|
||||||
|
if input then
|
||||||
|
dofile(worldpath.."/shooter.conf")
|
||||||
|
input:close()
|
||||||
|
input = nil
|
||||||
|
end
|
||||||
|
for name, _ in pairs(shooter.config) do
|
||||||
|
local global = "SHOOTER_"..name:upper()
|
||||||
|
if minetest.global_exists(global) then
|
||||||
|
shooter.config[name] = _G[global]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if minetest.global_exists("SHOOTER_PLAYER_OFFSET") then
|
||||||
|
shooter.player_offset = SHOOTER_PLAYER_OFFSET
|
||||||
|
end
|
||||||
|
if minetest.global_exists("SHOOTER_ENTITY_OFFSET") then
|
||||||
|
shooter.entity_offset = SHOOTER_ENTITY_OFFSET
|
||||||
|
end
|
||||||
|
if minetest.global_exists("SHOOTER_ENTITIES") then
|
||||||
|
for _, name in pairs(SHOOTER_ENTITIES) do
|
||||||
|
shooter:set_shootable_entity(name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Simple Mobs Support
|
||||||
|
|
||||||
|
for name, _ in pairs(minetest.registered_entities) do
|
||||||
|
if string.find(name, "^mobs") then
|
||||||
|
shooter:set_shootable_entity(name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Load Configuration
|
||||||
|
|
||||||
|
for name, config in pairs(shooter.config) do
|
||||||
|
local setting = minetest.settings:get("shooter_"..name)
|
||||||
|
if type(config) == "number" then
|
||||||
|
setting = tonumber(setting)
|
||||||
|
elseif type(config) == "boolean" then
|
||||||
|
setting = minetest.settings:get_bool("shooter_"..name)
|
||||||
|
end
|
||||||
|
if setting ~= nil then
|
||||||
|
shooter.config[name] = setting
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Legacy Entity Support
|
||||||
|
|
||||||
minetest.register_entity("shooter:turret_entity", {
|
minetest.register_entity("shooter:turret_entity", {
|
||||||
visual = "sprite",
|
visual = "sprite",
|
||||||
textures = {"blank.png"},
|
textures = {"blank.png"},
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
-- Simple Shooter config example
|
|
||||||
|
|
||||||
-- Global Constants (defaults)
|
|
||||||
|
|
||||||
-- Enable admin super weapons
|
|
||||||
-- This lets admins shoot guns automatically after 2 seconds without munition.
|
|
||||||
SHOOTER_ADMIN_WEAPONS = false
|
|
||||||
|
|
||||||
-- Enable node destruction with explosives
|
|
||||||
SHOOTER_ENABLE_BLASTING = true
|
|
||||||
|
|
||||||
-- Enable Crossbow
|
|
||||||
SHOOTER_ENABLE_CROSSBOW = true
|
|
||||||
|
|
||||||
-- Enable basic guns (Pistol, Rifle, Shotgun, Machine Gun)
|
|
||||||
SHOOTER_ENABLE_GUNS = true
|
|
||||||
|
|
||||||
-- Enable Flare Gun
|
|
||||||
SHOOTER_ENABLE_FLARES = true
|
|
||||||
|
|
||||||
-- Enable Grappling Hook
|
|
||||||
SHOOTER_ENABLE_HOOK = true
|
|
||||||
|
|
||||||
-- Enable Grenades
|
|
||||||
SHOOTER_ENABLE_GRENADES = true
|
|
||||||
|
|
||||||
-- Enable Rocket Gun
|
|
||||||
SHOOTER_ENABLE_ROCKETS = true
|
|
||||||
|
|
||||||
-- Enable Turrret Gun
|
|
||||||
SHOOTER_ENABLE_TURRETS = true
|
|
||||||
|
|
||||||
-- Enable Crafting
|
|
||||||
SHOOTER_ENABLE_CRAFTING = true
|
|
||||||
|
|
||||||
-- Enable particle effects
|
|
||||||
SHOOTER_ENABLE_PARTICLE_FX = true
|
|
||||||
|
|
||||||
-- Enable protection mod support, requires a protection mod that utilizes
|
|
||||||
-- minetest.is_protected(), tested with TenPlus1's version of [protector]
|
|
||||||
SHOOTER_ENABLE_PROTECTION = false
|
|
||||||
|
|
||||||
-- Particle texture used when a player or entity is hit
|
|
||||||
SHOOTER_EXPLOSION_TEXTURE = "shooter_hit.png"
|
|
||||||
|
|
||||||
-- Allow node destruction
|
|
||||||
SHOOTER_ALLOW_NODES = true
|
|
||||||
|
|
||||||
-- Allow entities in multiplayer mode
|
|
||||||
SHOOTER_ALLOW_ENTITIES = false
|
|
||||||
|
|
||||||
-- Allow players in multiplayer mode
|
|
||||||
SHOOTER_ALLOW_PLAYERS = true
|
|
||||||
|
|
||||||
-- How often objects are fully reloaded
|
|
||||||
SHOOTER_OBJECT_RELOAD_TIME = 1
|
|
||||||
|
|
||||||
-- How often object positions are updated
|
|
||||||
SHOOTER_OBJECT_UPDATE_TIME = 0.25
|
|
||||||
|
|
||||||
-- How often rounds are processed
|
|
||||||
SHOOTER_ROUNDS_UPDATE_TIME = 0.4
|
|
||||||
|
|
||||||
-- Player collision box offset (may require adjustment for some games)
|
|
||||||
SHOOTER_PLAYER_OFFSET = {x=0, y=1, z=0}
|
|
||||||
|
|
||||||
-- Entity collision box offset (may require adjustment for other mobs)
|
|
||||||
SHOOTER_ENTITY_OFFSET = {x=0, y=0, z=0}
|
|
||||||
|
|
||||||
-- Shootable entities (default support for Simple Mobs)
|
|
||||||
SHOOTER_ENTITIES = {
|
|
||||||
"mobs:dirt_monster",
|
|
||||||
"mobs:stone_monster",
|
|
||||||
"mobs:sand_monster",
|
|
||||||
"mobs:tree_monster",
|
|
||||||
"mobs:sheep",
|
|
||||||
"mobs:rat",
|
|
||||||
"mobs:oerkki",
|
|
||||||
"mobs:dungeon_master",
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,6 +1,25 @@
|
||||||
SHOOTER_CROSSBOW_USES = 50
|
local config = {
|
||||||
SHOOTER_ARROW_TOOL_CAPS = {damage_groups={fleshy=2}}
|
crossbow_uses = 50,
|
||||||
SHOOTER_ARROW_LIFETIME = 180 -- 3 minutes
|
arrow_lifetime = 180,
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Legacy Config Support
|
||||||
|
|
||||||
|
for name, _ in pairs(config) do
|
||||||
|
local global = "SHOOTER_"..name:upper()
|
||||||
|
if minetest.global_exists(global) then
|
||||||
|
config[name] = _G[global]
|
||||||
|
end
|
||||||
|
local setting = minetest.settings:get("shooter_"..name)
|
||||||
|
if type(setting) == "string" then
|
||||||
|
config[name] = tonumber(setting)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local arrow_tool_caps = {damage_groups={fleshy=2}}
|
||||||
|
if minetest.global_exists("SHOOTER_ARROW_TOOL_CAPS") then
|
||||||
|
arrow_tool_caps = table.copy(SHOOTER_ARROW_TOOL_CAPS)
|
||||||
|
end
|
||||||
|
|
||||||
minetest.register_alias("shooter_crossbow:arrow", "shooter_crossbow:arrow_white")
|
minetest.register_alias("shooter_crossbow:arrow", "shooter_crossbow:arrow_white")
|
||||||
minetest.register_alias("shooter:crossbow_loaded", "shooter:crossbow_loaded_white")
|
minetest.register_alias("shooter:crossbow_loaded", "shooter:crossbow_loaded_white")
|
||||||
|
@ -40,7 +59,7 @@ minetest.register_entity("shooter_crossbow:arrow_entity", {
|
||||||
},
|
},
|
||||||
color = "white",
|
color = "white",
|
||||||
timer = 0,
|
timer = 0,
|
||||||
lifetime = SHOOTER_ARROW_LIFETIME,
|
lifetime = config.arrow_lifetime,
|
||||||
player = nil,
|
player = nil,
|
||||||
state = "init",
|
state = "init",
|
||||||
node_pos = nil,
|
node_pos = nil,
|
||||||
|
@ -69,8 +88,8 @@ minetest.register_entity("shooter_crossbow:arrow_entity", {
|
||||||
local p1 = puncher:getpos()
|
local p1 = puncher:getpos()
|
||||||
local p2 = object:getpos()
|
local p2 = object:getpos()
|
||||||
local tpos = get_target_pos(p1, p2, dir, 0)
|
local tpos = get_target_pos(p1, p2, dir, 0)
|
||||||
shooter:spawn_particles(tpos, SHOOTER_EXPLOSION_TEXTURE)
|
shooter:spawn_particles(tpos, shooter.config.explosion_texture)
|
||||||
object:punch(puncher, nil, SHOOTER_ARROW_TOOL_CAPS, dir)
|
object:punch(puncher, nil, arrow_tool_caps, dir)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
self:stop(object:getpos())
|
self:stop(object:getpos())
|
||||||
|
@ -132,9 +151,9 @@ minetest.register_entity("shooter_crossbow:arrow_entity", {
|
||||||
for _,obj in ipairs(objects) do
|
for _,obj in ipairs(objects) do
|
||||||
if shooter:is_valid_object(obj) and obj ~= self.player then
|
if shooter:is_valid_object(obj) and obj ~= self.player then
|
||||||
local collisionbox = {-0.25,-1.0,-0.25, 0.25,0.8,0.25}
|
local collisionbox = {-0.25,-1.0,-0.25, 0.25,0.8,0.25}
|
||||||
local offset = SHOOTER_PLAYER_OFFSET
|
local offset = shooter.player_offset
|
||||||
if not obj:is_player() then
|
if not obj:is_player() then
|
||||||
offset = SHOOTER_ENTITY_OFFSET
|
offset = shooter.entity_offset
|
||||||
local ent = obj:get_luaentity()
|
local ent = obj:get_luaentity()
|
||||||
if ent then
|
if ent then
|
||||||
local def = minetest.registered_entities[ent.name]
|
local def = minetest.registered_entities[ent.name]
|
||||||
|
@ -180,7 +199,7 @@ for _, color in pairs(dye_basecolors) do
|
||||||
on_use = function(itemstack, user, pointed_thing)
|
on_use = function(itemstack, user, pointed_thing)
|
||||||
minetest.sound_play("shooter_click", {object=user})
|
minetest.sound_play("shooter_click", {object=user})
|
||||||
if not minetest.setting_getbool("creative_mode") then
|
if not minetest.setting_getbool("creative_mode") then
|
||||||
itemstack:add_wear(65535/SHOOTER_CROSSBOW_USES)
|
itemstack:add_wear(65535/config.crossbow_uses)
|
||||||
end
|
end
|
||||||
itemstack = "shooter_crossbow:crossbow 1 "..itemstack:get_wear()
|
itemstack = "shooter_crossbow:crossbow 1 "..itemstack:get_wear()
|
||||||
local pos = user:getpos()
|
local pos = user:getpos()
|
||||||
|
@ -262,7 +281,7 @@ minetest.register_tool("shooter_crossbow:crossbow", {
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
if SHOOTER_ENABLE_CRAFTING == true then
|
if shooter.config.enable_crafting == true then
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "shooter_crossbow:crossbow",
|
output = "shooter_crossbow:crossbow",
|
||||||
recipe = {
|
recipe = {
|
||||||
|
|
|
@ -129,7 +129,7 @@ minetest.register_tool("shooter_flaregun:flaregun", {
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
if SHOOTER_ENABLE_CRAFTING == true then
|
if shooter.config.enable_crafting == true then
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "shooter_flaregun:flare",
|
output = "shooter_flaregun:flare",
|
||||||
recipe = {
|
recipe = {
|
||||||
|
@ -145,7 +145,6 @@ if SHOOTER_ENABLE_CRAFTING == true then
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--Backwards compatibility
|
--Backwards compatibility
|
||||||
minetest.register_alias("shooter:flaregun", "shooter_flaregun:flaregun")
|
minetest.register_alias("shooter:flaregun", "shooter_flaregun:flaregun")
|
||||||
minetest.register_alias("shooter:flare", "shooter_flaregun:flare")
|
minetest.register_alias("shooter:flare", "shooter_flaregun:flare")
|
||||||
|
|
|
@ -69,7 +69,7 @@ minetest.register_tool("shooter_grenade:grenade", {
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
if SHOOTER_ENABLE_CRAFTING == true then
|
if shooter.config.enable_crafting == true then
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "shooter_grenade:grenade",
|
output = "shooter_grenade:grenade",
|
||||||
recipe = {
|
recipe = {
|
||||||
|
@ -78,6 +78,5 @@ if SHOOTER_ENABLE_CRAFTING == true then
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--Backwards compatibility
|
--Backwards compatibility
|
||||||
minetest.register_alias("shooter:grenade", "shooter_grenade:grenade")
|
minetest.register_alias("shooter:grenade", "shooter_grenade:grenade")
|
||||||
|
|
|
@ -60,7 +60,7 @@ minetest.register_craftitem("shooter_guns:ammo", {
|
||||||
inventory_image = "shooter_ammo.png",
|
inventory_image = "shooter_ammo.png",
|
||||||
})
|
})
|
||||||
|
|
||||||
if SHOOTER_ENABLE_CRAFTING == true then
|
if shooter.config.enable_crafting == true then
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "shooter_guns:pistol 1 65535",
|
output = "shooter_guns:pistol 1 65535",
|
||||||
recipe = {
|
recipe = {
|
||||||
|
@ -104,7 +104,7 @@ local rounds_update_time = 0
|
||||||
|
|
||||||
minetest.register_globalstep(function(dtime)
|
minetest.register_globalstep(function(dtime)
|
||||||
shooter.time = shooter.time + dtime
|
shooter.time = shooter.time + dtime
|
||||||
if shooter.time - rounds_update_time > SHOOTER_ROUNDS_UPDATE_TIME then
|
if shooter.time - rounds_update_time > shooter.config.rounds_update_time then
|
||||||
for i, round in ipairs(shooter.rounds) do
|
for i, round in ipairs(shooter.rounds) do
|
||||||
if shooter:process_round(round) or round.dist > round.def.range then
|
if shooter:process_round(round) or round.dist > round.def.range then
|
||||||
table.remove(shooter.rounds, i)
|
table.remove(shooter.rounds, i)
|
||||||
|
|
|
@ -112,7 +112,7 @@ minetest.register_tool("shooter_hook:grapple_gun_loaded", {
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
if SHOOTER_ENABLE_CRAFTING == true then
|
if shooter.config.enable_crafting == true then
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "shooter_hook:grapple_hook",
|
output = "shooter_hook:grapple_hook",
|
||||||
recipe = {
|
recipe = {
|
||||||
|
|
|
@ -96,7 +96,7 @@ minetest.register_tool("shooter_rocket:rocket_gun", {
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
if SHOOTER_ENABLE_CRAFTING == true then
|
if shooter.config.enable_crafting == true then
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "shooter_rocket:rocket_gun",
|
output = "shooter_rocket:rocket_gun",
|
||||||
recipe = {
|
recipe = {
|
||||||
|
|
|
@ -171,7 +171,7 @@ minetest.register_entity("shooter_turret:turret_entity", {
|
||||||
obj:setacceleration({x=dir.x * -3, y=-10, z=dir.z * -3})
|
obj:setacceleration({x=dir.x * -3, y=-10, z=dir.z * -3})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if SHOOTER_ENABLE_PARTICLE_FX == true then
|
if shooter.config.enable_particle_fx == true then
|
||||||
minetest.add_particlespawner(10, 0.1,
|
minetest.add_particlespawner(10, 0.1,
|
||||||
{x=pos.x - 1, y=pos.y - 1, z=pos.z - 1},
|
{x=pos.x - 1, y=pos.y - 1, z=pos.z - 1},
|
||||||
{x=pos.x + 1, y=pos.y + 1, z=pos.z + 1},
|
{x=pos.x + 1, y=pos.y + 1, z=pos.z + 1},
|
||||||
|
@ -264,7 +264,7 @@ minetest.register_abm({
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
if SHOOTER_ENABLE_CRAFTING == true then
|
if shooter.config.enable_crafting == true then
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "shooter_turret:turret",
|
output = "shooter_turret:turret",
|
||||||
recipe = {
|
recipe = {
|
||||||
|
@ -275,7 +275,6 @@ if SHOOTER_ENABLE_CRAFTING == true then
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--Backward compatibility
|
--Backward compatibility
|
||||||
minetest.register_alias("shooter:turret", "shooter_turret:turret")
|
minetest.register_alias("shooter:turret", "shooter_turret:turret")
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue