Add basic protection support

This commit is contained in:
stujones11 2014-10-01 20:43:33 +01:00
parent c8dd9aa002
commit 4b34151f1d
5 changed files with 66 additions and 30 deletions

View file

@ -25,7 +25,7 @@ minetest.register_entity("shooter:grenade_entity", {
local below = {x=pos.x, y=pos.y - 1, z=pos.z} local below = {x=pos.x, y=pos.y - 1, z=pos.z}
if minetest.get_node(below).name ~= "air" then if minetest.get_node(below).name ~= "air" then
self.object:remove() self.object:remove()
shooter:blast(pos, 1, 25, 5) shooter:blast(pos, 1, 25, 5, self.player)
end end
self.timer = 0 self.timer = 0
end end

View file

@ -30,7 +30,7 @@ minetest.register_entity("shooter:rocket_entity", {
local pos = self.object:getpos() local pos = self.object:getpos()
if minetest.get_node(pos).name ~= "air" then if minetest.get_node(pos).name ~= "air" then
self.object:remove() self.object:remove()
shooter:blast(pos, 2, 50, 7) shooter:blast(pos, 2, 50, 7, self.player)
end end
self.timer = 0 self.timer = 0
end end

View file

@ -2,6 +2,9 @@
-- Global Constants (defaults) -- Global Constants (defaults)
-- Enable node destruction with explosives
SHOOTER_ENABLE_BLASTING = true
-- Enable basic guns (Pistol, Rifle, Shotgun, Machine Gun) -- Enable basic guns (Pistol, Rifle, Shotgun, Machine Gun)
SHOOTER_ENABLE_GUNS = true SHOOTER_ENABLE_GUNS = true
@ -26,6 +29,10 @@ SHOOTER_ENABLE_CRAFTING = true
-- Enable particle effects -- Enable particle effects
SHOOTER_ENABLE_PARTICLE_FX = true 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 -- Particle texture used when a player or entity is hit
SHOOTER_EXPLOSION_TEXTURE = "shooter_hit.png" SHOOTER_EXPLOSION_TEXTURE = "shooter_hit.png"

View file

@ -7,6 +7,7 @@ shooter = {
reload_time = 0, reload_time = 0,
} }
SHOOTER_ENABLE_BLASTING = true
SHOOTER_ENABLE_GUNS = true SHOOTER_ENABLE_GUNS = true
SHOOTER_ENABLE_FLARES = true SHOOTER_ENABLE_FLARES = true
SHOOTER_ENABLE_HOOK = true SHOOTER_ENABLE_HOOK = true
@ -15,6 +16,7 @@ SHOOTER_ENABLE_ROCKETS = true
SHOOTER_ENABLE_TURRETS = true SHOOTER_ENABLE_TURRETS = true
SHOOTER_ENABLE_CRAFTING = true SHOOTER_ENABLE_CRAFTING = true
SHOOTER_ENABLE_PARTICLE_FX = true SHOOTER_ENABLE_PARTICLE_FX = true
SHOOTER_ENABLE_PROTECTION = false
SHOOTER_EXPLOSION_TEXTURE = "shooter_hit.png" SHOOTER_EXPLOSION_TEXTURE = "shooter_hit.png"
SHOOTER_ALLOW_NODES = true SHOOTER_ALLOW_NODES = true
SHOOTER_ALLOW_ENTITIES = false SHOOTER_ALLOW_ENTITIES = false
@ -36,6 +38,7 @@ SHOOTER_ENTITIES = {
} }
if minetest.is_singleplayer() == true then if minetest.is_singleplayer() == true then
SHOOTER_ENABLE_BLASTING = true
SHOOTER_ALLOW_ENTITIES = true SHOOTER_ALLOW_ENTITIES = true
SHOOTER_ALLOW_PLAYERS = false SHOOTER_ALLOW_PLAYERS = false
end end
@ -104,6 +107,12 @@ local function punch_node(pos, def)
if not item then if not item then
return return
end end
if SHOOTER_ENABLE_PROTECTION then
if minetest.is_protected(pos, def.name) then
print(dump(def))
return
end
end
if item.groups then if item.groups then
for k, v in pairs(def.groups) do for k, v in pairs(def.groups) do
local level = item.groups[k] or 0 local level = item.groups[k] or 0
@ -338,14 +347,24 @@ function shooter:update_objects()
end end
end end
function shooter:blast(pos, radius, fleshy, distance) function shooter:blast(pos, radius, fleshy, distance, user)
if not user then
return
end
local name = user:get_player_name()
local pos = vector.round(pos) local pos = vector.round(pos)
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 == true then if SHOOTER_ALLOW_NODES == true then
if SHOOTER_ENABLE_PROTECTION 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
else
minetest.set_node(pos, {name="tnt:boom"})
end
end
if SHOOTER_ENABLE_PARTICLE_FX == true then if SHOOTER_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},
@ -373,9 +392,7 @@ function shooter:blast(pos, radius, fleshy, distance)
end end
end end
end end
if SHOOTER_ALLOW_NODES == false then if SHOOTER_ALLOW_NODES and SHOOTER_ENABLE_BLASTING then
return
end
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)
@ -384,12 +401,19 @@ function shooter:blast(pos, radius, fleshy, distance)
local c_air = minetest.get_content_id("air") local c_air = minetest.get_content_id("air")
for z = -radius, radius do for z = -radius, radius do
for y = -radius, radius do for y = -radius, radius do
local vi = area:index(pos.x - radius, pos.y + y, pos.z + z) local vp = {x=pos.x - radius, y=pos.y + y, z=pos.z + z}
local vi = area:index(vp.x, vp.y, vp.z)
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 not minetest.is_protected(vp, name) then
data[vi] = c_air data[vi] = c_air
end end
else
data[vi] = c_air
end
end
vi = vi + 1 vi = vi + 1
end end
end end
@ -398,5 +422,6 @@ function shooter:blast(pos, radius, fleshy, distance)
vm:update_liquids() vm:update_liquids()
vm:write_to_map() vm:write_to_map()
vm:update_map() vm:update_map()
end
end end

View file

@ -43,7 +43,7 @@ minetest.register_entity("shooter:tnt_entity", {
local pos = self.object:getpos() local pos = self.object:getpos()
if minetest.get_node(pos).name ~= "air" then if minetest.get_node(pos).name ~= "air" then
self.object:remove() self.object:remove()
shooter:blast(pos, 4, 80, 10) shooter:blast(pos, 4, 80, 10, self.player)
end end
self.timer = 0 self.timer = 0
end end
@ -172,11 +172,15 @@ minetest.register_entity("shooter:turret_entity", {
pos = vector.add(pos, {x=dir.x * 1.5, y=dir.y * 1.5, z=dir.z * 1.5}) pos = vector.add(pos, {x=dir.x * 1.5, y=dir.y * 1.5, z=dir.z * 1.5})
local obj = minetest.add_entity(pos, "shooter:tnt_entity") local obj = minetest.add_entity(pos, "shooter:tnt_entity")
if obj then if obj then
local ent = obj:get_luaentity()
if ent then
minetest.sound_play("shooter_rocket_fire", {object=obj}) minetest.sound_play("shooter_rocket_fire", {object=obj})
ent.player = self.player
obj:setyaw(self.yaw) obj:setyaw(self.yaw)
obj:setvelocity({x=dir.x * 20, y=dir.y * 20, z=dir.z * 20}) obj:setvelocity({x=dir.x * 20, y=dir.y * 20, z=dir.z * 20})
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
if SHOOTER_ENABLE_PARTICLE_FX == true then if SHOOTER_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},