]> git.lizzy.rs Git - hangglider.git/commitdiff
Added option to shoot down hanggliders flying in restricted airspace
authorGabriel Pérez-Cerezo <gabriel@gpcf.eu>
Sun, 9 Dec 2018 21:43:13 +0000 (22:43 +0100)
committerGabriel Pérez-Cerezo <gabriel@gpcf.eu>
Sun, 9 Dec 2018 21:43:13 +0000 (22:43 +0100)
Added a /area_flak command to declare areas as closed airspace. Any
hanggliders attempting to fly in such an area will get shot down
within two seconds, which will lead to a massive loss of health to the
occupant (death if flying higher than 6 meters) and the loss of the
hangglider. The closed airspace behaviour depends on the areas mod.

LICENSE.txt
depends.txt
init.lua
sounds/hangglider_flak_shot.ogg [new file with mode: 0644]

index 1dab26db807f7a5fc5d908fc3b73c102e37c1dd8..407255a33cf914b3b9c08b568aaed1c494417321 100755 (executable)
@@ -49,4 +49,5 @@ Textures:
        Default wood and wool textures from minetest-game.
 
 Models and sounds: 
-       CC BY-SA (4.0) by Piezo_.
\ No newline at end of file
+       CC BY-SA (4.0) by Piezo_.
+       hangglider_flak_shot: tnt_explode sound from minetest_game (CC BY-SA 3.0)
index f3e3b6d495a61fdc065870849ab920b3a9826b34..bcab691b9180eaaa1f1fad97e9352f6483254728 100755 (executable)
@@ -1,3 +1,4 @@
 default
 wool
-minetest_systemd?
\ No newline at end of file
+minetest_systemd?
+areas?
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
+})
diff --git a/sounds/hangglider_flak_shot.ogg b/sounds/hangglider_flak_shot.ogg
new file mode 100644 (file)
index 0000000..a414ea0
Binary files /dev/null and b/sounds/hangglider_flak_shot.ogg differ