]> git.lizzy.rs Git - hangglider.git/blobdiff - init.lua
Added option to shoot down hanggliders flying in restricted airspace
[hangglider.git] / init.lua
index b2469068aedfeeeaf6849d4f9b2c67902915a0cf..83a91bca2facf1e614e10c3926be90ea481b9d30 100644 (file)
--- a/init.lua
+++ b/init.lua
 -- Removed airbreak penalty, as any 'advantage' seems minimal after new adjustments
 
 
+-- 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
@@ -87,6 +94,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) 
@@ -102,6 +134,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",
@@ -110,7 +164,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")
@@ -139,6 +193,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,
@@ -267,4 +335,4 @@ minetest.register_craft({
                {"default:stick", "", "default:stick"},
                {"", "default:stick", ""},
        }
-})
\ No newline at end of file
+})