This commit is contained in:
Piezo_ 2018-12-28 17:52:01 -08:00
commit 954ce03435
4 changed files with 74 additions and 4 deletions

View File

@ -50,3 +50,4 @@ Textures:
Models and sounds:
CC BY-SA (4.0) by Piezo_.
hangglider_flak_shot: tnt_explode sound from minetest_game (CC BY-SA 3.0)

View File

@ -1,3 +1,4 @@
default
wool
minetest_systemd?
areas?

View File

@ -40,6 +40,13 @@
-- Removed airbreak until minetest devs are smart enough to implement better serverside players.
-- Simplified liquid check.
-- Modifications by gpcf
-- 2018-12-09
-- get shot down while flying over protected areas marked as no-fly-zones (flak, from German Flugabwehrkanone)
-- set these areas with the /area_flak command
local HUD_Overlay = true --show glider struts as overlay on HUD
local debug = false --show debug info in top-center of hud
local moveModelUp = false
@ -88,6 +95,31 @@ minetest.register_entity("hangglider:airstopper", { --A one-instant entity that
end
})]]
if areas then
hangglider.flak = true
-- chat command definition essentially copied from areas mod.
minetest.register_chatcommand("area_flak",{
params = "<ID>",
description = "Toggle airspace restrictions for area <ID>",
func = function(name, param)
local id = tonumber(param)
if not id then
return false, "Invalid usage, see /help area_flak."
end
if not areas:isAreaOwner(id, name) then
return false, "Area "..id.." does not exist"
.." or is not owned by you."
end
local open = not areas.areas[id].flak
-- Save false as nil to avoid inflating the DB.
areas.areas[id].flak = open or nil
areas:save()
return true, ("Area's airspace %s."):format(open and "closed" or "opened")
end
})
end
if minetestd and minetestd.services.gravityctl.enabled then
minetestd.gravityctl.register_gravity_effect("hangglider",
function(player)
@ -103,6 +135,28 @@ minetestd.gravityctl.register_gravity_effect("hangglider",
)
end
hangglider.can_fly = function (pname, pos)
-- Checks if the player will get shot down at the position
if minetest.is_protected(vector.round(pos), pname) then
if hangglider.flak then
for id, area in pairs(areas:getAreasAtPos(pos)) do
if area.flak then
return false
end
end
end
end
return true
end
hangglider.shot_sound = function (pos)
minetest.sound_play("hangglider_flak_shot", {
pos = pos,
max_hear_distance = 30,
gain = 10.0,
})
end
local step_v
minetest.register_entity("hangglider:glider", {
visual = "mesh",
@ -111,7 +165,7 @@ minetest.register_entity("hangglider:glider", {
immortal = true,
static_save = false,
textures = {"wool_white.png","default_wood.png"},
on_step = function(self, _)
on_step = function(self, dtime)
local canExist = false
if self.object:get_attach() then
local player = self.object:get_attach("parent")
@ -142,6 +196,20 @@ minetest.register_entity("hangglider:glider", {
]]end
end
end
if not hangglider.can_fly(pname,pos) then
if not self.warned then -- warning shot
self.warned = 0
hangglider.shot_sound(pos)
minetest.chat_send_player(pname, "Protected area! You will be shot down in two seconds by anti-aircraft guns!")
end
self.warned = self.warned + dtime
if self.warned > 2 then -- shoot down
player:set_hp(1)
player:get_inventory():remove_item("main", ItemStack("hangglider:hangglider"))
hangglider.shot_sound(pos)
canExist = false
end
end
if not canExist then
player:set_physics_override({
jump = 1,

Binary file not shown.