1
0
mirror of https://github.com/mt-mods/hangglider.git synced 2025-11-06 10:45:22 +01:00

6 Commits

Author SHA1 Message Date
Medley
17419f721e Add support for games without default game (MTG) (#25)
* Add support for games without `default`

This adds support for games like Mineclonia, and any game xcompat adds
support for. The only asterix is dye support, the pattern for dyes has
been expanded for common dye mods, but if a new dye mod has different
dye names those might not work without an update to the pattern.

* Refactor & fix Farlands dye support

* Add some mcl colors, make names & their order consistent

* Fix old crafting bug & refacfor crafting

* Minor refactor & reorder for clarity

* Fix for Farlands `get_name` returning "" not nil

Farlands seems to return "" instead of nil/0 when no item is present.
By accounting for this, this commit fixes an issue where any empty slot
repaired the glider.

* Separate color handling to new module

* Luacheck fix

* Ignore empty `do end` luacheck warnings

* Replace `minetest.` with `core.`
2025-10-19 10:22:36 -04:00
Niklp
6c23c135dc Improve interoperability without player_monoids and pova (#24)
* Import noobdigital87's changes

Co-authored-by: noobdigital87 <noobdigital87@gmail.com>

* Fix hud type; remove useless code; style

---------

Co-authored-by: noobdigital87 <noobdigital87@gmail.com>
2025-07-11 08:53:07 +02:00
Niklp
f970874855 Cleanup HUD code (#21) 2025-05-24 17:49:24 -04:00
tenplus1
071fe93cf5 add pova support (#20)
* Update mod.conf

add pova optional dependency

* Update init.lua

add support for pova

* Update .luacheckrc

---------

Co-authored-by: Luke aka SwissalpS <161979+SwissalpS@users.noreply.github.com>
2025-01-18 17:42:39 +01:00
Niklp
49a878aa03 Optimize remove_physics_overrides() a bit (#19) 2024-04-28 21:26:12 +02:00
Luke aka SwissalpS
3e304e3e5d Add translation support and ca, de and es translations (#18) 2024-04-25 14:23:20 +10:00
9 changed files with 397 additions and 134 deletions

View File

@@ -1,11 +1,20 @@
globals = { globals = {
"areas", "areas",
"hangglider",
} }
read_globals = { read_globals = {
"minetest", "minetest",
"core",
"vector", "ItemStack", "vector", "ItemStack",
"player_monoids", "player_monoids",
"pova",
"unifieddyes", "unifieddyes",
"xcompat",
} }
ignore = {
"541", -- Empty "do end" block warning
}

91
colors.lua Normal file
View File

@@ -0,0 +1,91 @@
local S = hangglider.translator
local module = {}
local has_unifieddyes = core.get_modpath("unifieddyes")
local dye_prefix_pattern_universal = "^.*dyes?:" -- Known dye prefix matches: dyes, mcl_dyes, mcl_dye, fl_dyes.
local dye_suffix_pattern_farlands = "_dye$" -- A suffix appended to dye names in the Farlands game.
local dye_colors = {
black = "111111",
blue = "0000ff",
brown = "592c00",
cyan = "00ffff",
dark_green = "005900",
dark_grey = "444444",
green = "00ff00",
grey = "888888",
light_blue = "258ec9",
lime = "60ac19",
magenta = "ff00ff",
orange = "ff7f00",
pink = "ff7f9f",
purple = "6821a0",
red = "ff0000",
silver = "818177",
violet = "8000ff",
white = "ffffff",
yellow = "ffff00",
}
local translated_colors = {
black = S("Black"),
blue = S("Blue"),
brown = S("Brown"),
cyan = S("Cyan"),
dark_green = S("Dark Green"),
dark_grey = S("Dark Grey"),
green = S("Green"),
grey = S("Grey"),
light_blue = S("Light Blue"),
lime = S("Lime"),
magenta = S("Magenta"),
orange = S("Orange"),
pink = S("Pink"),
purple = S("Purple"),
red = S("Red"),
silver = S("Light Grey"),
violet = S("Violet"),
white = S("White"),
yellow = S("Yellow"),
}
function module.get_dye_name(name)
-- Remove prefix and potential suffix
name = string.gsub(name, dye_suffix_pattern_farlands, "")
name = string.match(name, dye_prefix_pattern_universal.."(.+)$")
return name
end
function module.get_dye_color(name)
local color
if has_unifieddyes then
color = unifieddyes.get_color_from_dye_name(name)
end
if not color then
color = module.get_dye_name(name)
if color then
color = dye_colors[color]
end
end
return color
end
function module.get_color_name(name)
return translated_colors[module.get_dye_name(name)]
end
function module.get_color_name_from_color(color)
for name, color_hex in pairs(dye_colors) do
if color == color_hex then
return translated_colors[name]
end
end
return nil
end
return module

View File

@@ -1,120 +1,102 @@
local S = hangglider.translator
local colors = assert(dofile(core.get_modpath("hangglider").."/colors.lua"))
local has_unifieddyes = minetest.get_modpath("unifieddyes") local repair_items = {"group:wool", xcompat.materials.paper}
local repair_percentage = 100
local dye_colors = {
white = "ffffff",
grey = "888888",
dark_grey = "444444",
black = "111111",
violet = "8000ff",
blue = "0000ff",
cyan = "00ffff",
dark_green = "005900",
green = "00ff00",
yellow = "ffff00",
brown = "592c00",
orange = "ff7f00",
red = "ff0000",
magenta = "ff00ff",
pink = "ff7f9f",
}
local function get_dye_color(name) -- Placeholder repairing recipes (Doesn't directly apply repair, see handler)
local color core.register_craft({
if has_unifieddyes then output = "hangglider:hangglider",
color = unifieddyes.get_color_from_dye_name(name) recipe = {
end {xcompat.materials.paper, xcompat.materials.paper, xcompat.materials.paper},
if not color then {xcompat.materials.paper, "hangglider:hangglider", xcompat.materials.paper},
color = string.match(name, "^dye:(.+)$") {xcompat.materials.paper, xcompat.materials.paper, xcompat.materials.paper},
if color then },
color = dye_colors[color] })
end
end
return color
end
local function get_color_name(name) core.register_craft({
name = string.gsub(name, "^dye:", "") output = "hangglider:hangglider",
name = string.gsub(name, "_", " ") recipe = {"hangglider:hangglider", "group:wool"},
name = string.gsub(name, "(%l)(%w*)", function(a, b) return string.upper(a)..b end) type = "shapeless",
return name })
end
local function get_color_name_from_color(color) -- Placeholder color recipe (Doesn't drectly apply color, see handler)
for name, color_hex in pairs(dye_colors) do
if color == color_hex then
return name
end
end
end
-- This recipe is just a placeholder
do do
local item = ItemStack("hangglider:hangglider") local item = ItemStack("hangglider:hangglider")
item:get_meta():set_string("description", "Colored Glider") item:get_meta():set_string("description", S("Colored Glider"))
minetest.register_craft({ core.register_craft({
output = item:to_string(), output = item:to_string(),
recipe = {"hangglider:hangglider", "group:dye"}, recipe = {"hangglider:hangglider", "group:dye"},
type = "shapeless", type = "shapeless",
}) })
end end
-- This is what actually creates the colored hangglider -- Recipe handler (This is what applies color and repair)
minetest.register_on_craft(function(crafted_item, _, old_craft_grid) local function crafting_callback_handle_placeholder_recipe(crafted_item, _, old_craft_grid)
if crafted_item:get_name() ~= "hangglider:hangglider" then if crafted_item:get_name() ~= "hangglider:hangglider" then
-- Function called for an unrelated crafting recipe
return return
end end
local wear, color, color_name -- Get existing state and present materials
local wear, repaired, dye_name, color, color_name = 0, false, nil, nil, nil
for _,stack in ipairs(old_craft_grid) do for _,stack in ipairs(old_craft_grid) do
local name = stack:get_name() local name = stack:get_name()
if name == "hangglider:hangglider" then if not name or name == "" then
wear = stack:get_wear() do end -- The stack is empty, do nothing and skip all checks for this stack.
color = stack:get_meta():get("hangglider_color") elseif name == "hangglider:hangglider" then
color_name = get_color_name_from_color(color) wear = stack:get_wear()
elseif minetest.get_item_group(name, "dye") ~= 0 then color = stack:get_meta():get("hangglider_color")
color = get_dye_color(name) color_name = colors.get_color_name_from_color(color)
color_name = get_color_name(name) elseif core.get_item_group(name, "dye") ~= 0 then
elseif "wool:white" == stack:get_name() dye_name = name
or "default:paper" == stack:get_name() else
then for _,repair_item in ipairs(repair_items) do
wear = 0 if name == repair_item
or core.get_item_group(name, string.match(repair_item, "^group:(.*)$")) ~= 0
then
repaired = true
end
end
end end
end end
-- Overwrite color with dye if present
if dye_name then
color = colors.get_dye_color(dye_name)
color_name = colors.get_color_name(dye_name)
end
-- Repair if any repair item present
if repaired then
wear = wear - (65535 * (repair_percentage / 100))
if wear < 0 then wear = 0 end
end
-- Apply item changes if valid
if wear and color and color_name then if wear and color and color_name then
if color == "ffffff" then if color == "ffffff" then
-- Return an uncolored glider
return ItemStack({name = "hangglider:hangglider", wear = wear}) return ItemStack({name = "hangglider:hangglider", wear = wear})
end end
local meta = crafted_item:get_meta() local meta = crafted_item:get_meta()
meta:set_string("description", color_name.." Glider") meta:set_string("description", S("@1 Glider", color_name))
meta:set_string("inventory_image", "hangglider_item.png^(hangglider_color.png^[multiply:#"..color..")") meta:set_string("inventory_image", "hangglider_item.png^(hangglider_color.png^[multiply:#"..color..")")
meta:set_string("hangglider_color", color) meta:set_string("hangglider_color", color)
crafted_item:set_wear(wear) crafted_item:set_wear(wear)
return crafted_item return crafted_item
end end
end) end
-- Register handler as a callback for any crafting action
core.register_on_craft(crafting_callback_handle_placeholder_recipe)
-- Repairing
minetest.register_craft({
output = "hangglider:hangglider",
recipe = {
{"default:paper", "default:paper", "default:paper"},
{"default:paper", "hangglider:hangglider", "default:paper"},
{"default:paper", "default:paper", "default:paper"},
},
})
minetest.register_craft({
output = "hangglider:hangglider",
recipe = {
{"hangglider:hangglider", "wool:white"},
},
})
-- Main craft -- Hangglider recipe
minetest.register_craft({ core.register_craft({
output = "hangglider:hangglider", output = "hangglider:hangglider",
recipe = { recipe = {
{"wool:white", "wool:white", "wool:white"}, {"group:wool", "group:wool", "group:wool"},
{"default:stick", "", "default:stick"}, {xcompat.materials.stick, "", xcompat.materials.stick},
{"", "default:stick", ""}, {"", xcompat.materials.stick, ""},
} }
}) })

165
init.lua
View File

@@ -1,74 +1,141 @@
local has_player_monoids = minetest.get_modpath("player_monoids") hangglider = {
local has_areas = minetest.get_modpath("areas") translator = core.get_translator('hangglider'),
}
local S = hangglider.translator
local enable_hud_overlay = minetest.settings:get_bool("hangglider.enable_hud_overlay", true) local has_player_monoids = core.get_modpath("player_monoids")
local enable_flak = has_areas and minetest.settings:get_bool("hangglider.enable_flak", true) local has_pova = core.get_modpath("pova")
local flak_warning_time = tonumber(minetest.settings:get("hangglider.flak_warning_time")) or 2 local has_areas = core.get_modpath("areas")
local hangglider_uses = tonumber(minetest.settings:get("hangglider.uses")) or 250
local flak_warning = "You have entered restricted airspace!\n".. local enable_hud_overlay = core.settings:get_bool("hangglider.enable_hud_overlay", true)
"You will be shot down in "..flak_warning_time.." seconds by anti-aircraft guns!" local enable_flak = has_areas and core.settings:get_bool("hangglider.enable_flak", true)
local flak_warning_time = tonumber(core.settings:get("hangglider.flak_warning_time")) or 2
local hangglider_uses = tonumber(core.settings:get("hangglider.uses")) or 250
local flak_warning = S("You have entered restricted airspace!@n"
.. "You will be shot down in @1 seconds by anti-aircraft guns!",
flak_warning_time)
local hanggliding_players = {} local hanggliding_players = {}
local physics_overrides = {}
local hud_overlay_ids = {} local hud_overlay_ids = {}
if enable_flak then if enable_flak then
minetest.register_chatcommand("area_flak", { core.register_chatcommand("area_flak", {
params = "<ID>", params = S("<ID>"),
description = "Toggle airspace restrictions for area <ID>", description = S("Toggle airspace restrictions for area <ID>."),
func = function(name, param) func = function(name, param)
local id = tonumber(param) local id = tonumber(param)
if not id then if not id then
return false, "Invalid usage, see /help area_flak." return false, S("Invalid usage, see /help area_flak.")
end end
if not areas:isAreaOwner(id, name) then if not areas:isAreaOwner(id, name) then
return false, "Area "..id.." does not exist or is not owned by you." return false, S("Area @1 does not exist or is not owned by you.", id)
end end
local open = not areas.areas[id].flak local open = not areas.areas[id].flak
-- Save false as nil to avoid inflating the DB. -- Save false as nil to avoid inflating the DB.
areas.areas[id].flak = open or nil areas.areas[id].flak = open or nil
areas:save() areas:save()
return true, "Area "..id.." airspace "..(open and "closed" or "opened") return true, S("Area @1 airspace is @2.", id,
open and S("closed") or S("opened"))
end end
}) })
end end
local function set_hud_overlay(player, name, image) function hangglider.is_gliding(player)
if not player then
return false
end
return hanggliding_players[player:get_player_name()]
end
local function set_hud_overlay(player, name, show)
if not enable_hud_overlay then if not enable_hud_overlay then
return return
end end
if not hud_overlay_ids[name] then if not hud_overlay_ids[name] and show == true then
hud_overlay_ids[name] = player:hud_add({ hud_overlay_ids[name] = player:hud_add({
hud_elem_type = "image", [core.features.hud_def_type_field and "type" or "hud_elem_type"] = "image",
text = image, text = "hangglider_overlay.png",
position = {x = 0, y = 0}, position = {x = 0, y = 0},
scale = {x = -100, y = -100}, scale = {x = -100, y = -100},
alignment = {x = 1, y = 1}, alignment = {x = 1, y = 1},
offset = {x = 0, y = 0}, offset = {x = 0, y = 0},
z_index = -150 z_index = -150
}) })
else elseif hud_overlay_ids[name] and show == false then
player:hud_change(hud_overlay_ids[name], "text", image) player:hud_remove(hud_overlay_ids[name])
hud_overlay_ids[name] = nil
end end
end end
local function set_physics_overrides(player, overrides) local function set_physics_overrides(player, overrides)
local player_name = player:get_player_name()
if has_player_monoids then if has_player_monoids then
for name, value in pairs(overrides) do for name, value in pairs(overrides) do
player_monoids[name]:add_change(player, value, "hangglider:glider") player_monoids[name]:add_change(player, value, "hangglider:glider")
end end
elseif has_pova then
pova.add_override(player_name, "hangglider:glider",
{jump = 0, speed = overrides.speed, gravity = overrides.gravity})
pova.do_override(player)
else else
player:set_physics_override(overrides) local def = player:get_physics_override()
if not physics_overrides[player_name] then
physics_overrides[player_name] = {
physics = {
speed = def.speed,
jump = def.jump,
gravity = def.gravity,
},
deltas = {speed = 0, jump = 0, gravity = 0},
}
end
-- Compute the new delta to apply (relative to current physics)
local delta = {
speed = (overrides.speed or def.speed) - def.speed,
jump = (overrides.jump or def.jump) - def.jump,
gravity = (overrides.gravity or def.gravity) - def.gravity,
}
-- Track the sum of all deltas for this session.
physics_overrides[player_name].deltas.speed = physics_overrides[player_name].deltas.speed + delta.speed
physics_overrides[player_name].deltas.jump = physics_overrides[player_name].deltas.jump + delta.jump
physics_overrides[player_name].deltas.gravity = physics_overrides[player_name].deltas.gravity + delta.gravity
-- Apply new delta on top of current physics
player:set_physics_override({
speed = def.speed + delta.speed,
jump = def.jump + delta.jump,
gravity = def.gravity + delta.gravity,
})
end end
end end
local function remove_physics_overrides(player) local function remove_physics_overrides(player)
for _, name in pairs({"jump", "speed", "gravity"}) do local player_name = player:get_player_name()
if has_player_monoids then if has_player_monoids then
for _, name in pairs({"jump", "speed", "gravity"}) do
player_monoids[name]:del_change(player, "hangglider:glider") player_monoids[name]:del_change(player, "hangglider:glider")
end
elseif has_pova then
pova.del_override(player_name, "hangglider:glider")
pova.do_override(player)
else
local def = player:get_physics_override()
if physics_overrides[player_name]
and physics_overrides[player_name].physics
and physics_overrides[player_name].deltas then
-- Subtract total delta from current values
player:set_physics_override({
speed = def.speed - physics_overrides[player_name].deltas.speed,
jump = def.jump - physics_overrides[player_name].deltas.jump,
gravity = def.gravity - physics_overrides[player_name].deltas.gravity,
})
physics_overrides[player_name] = nil
else else
player:set_physics_override({[name] = 1}) player:set_physics_override({speed = 1, jump = 1, gravity = 1})
end end
end end
end end
@@ -92,11 +159,11 @@ local function can_fly(pos, name)
end end
local function safe_node_below(pos) local function safe_node_below(pos)
local node = minetest.get_node_or_nil(vector.new(pos.x, pos.y - 0.5, pos.z)) local node = core.get_node_or_nil(vector.new(pos.x, pos.y - 0.5, pos.z))
if not node then if not node then
return false return false
end end
local def = minetest.registered_nodes[node.name] local def = core.registered_nodes[node.name]
if def and (def.walkable or (def.liquidtype ~= "none" and def.damage_per_second <= 0)) then if def and (def.walkable or (def.liquidtype ~= "none" and def.damage_per_second <= 0)) then
return true return true
end end
@@ -104,7 +171,7 @@ local function safe_node_below(pos)
end end
local function shoot_flak_sound(pos) local function shoot_flak_sound(pos)
minetest.sound_play("hangglider_flak_shot", { core.sound_play("hangglider_flak_shot", {
pos = pos, pos = pos,
max_hear_distance = 30, max_hear_distance = 30,
gain = 10.0, gain = 10.0,
@@ -146,7 +213,7 @@ local function hangglider_step(self, dtime)
if not self.flak_timer then if not self.flak_timer then
self.flak_timer = 0 self.flak_timer = 0
shoot_flak_sound(pos) shoot_flak_sound(pos)
minetest.chat_send_player(name, flak_warning) core.chat_send_player(name, flak_warning)
else else
self.flak_timer = self.flak_timer + dtime self.flak_timer = self.flak_timer + dtime
end end
@@ -160,7 +227,7 @@ local function hangglider_step(self, dtime)
if not gliding then if not gliding then
remove_physics_overrides(player) remove_physics_overrides(player)
hanggliding_players[name] = nil hanggliding_players[name] = nil
set_hud_overlay(player, name, "blank.png") set_hud_overlay(player, name, false)
end end
end end
end end
@@ -177,17 +244,17 @@ local function hangglider_use(stack, player)
local pos = player:get_pos() local pos = player:get_pos()
local name = player:get_player_name() local name = player:get_player_name()
if not hanggliding_players[name] then if not hanggliding_players[name] then
minetest.sound_play("hanggliger_equip", {pos = pos, max_hear_distance = 8, gain = 1.0}, true) core.sound_play("hanggliger_equip", {pos = pos, max_hear_distance = 8, gain = 1.0}, true)
local entity = minetest.add_entity(pos, "hangglider:glider") local entity = core.add_entity(pos, "hangglider:glider")
if entity then if entity then
entity:set_attach(player, "", vector.new(0, 10, 0), vector.new(0, 0, 0)) entity:set_attach(player, "", vector.new(0, 10, 0), vector.new(0, 0, 0))
local color = stack:get_meta():get("hangglider_color") local color = stack:get_meta():get("hangglider_color")
if color then if color then
entity:set_properties({ entity:set_properties({
textures = {"wool_white.png^[multiply:#"..color, "default_wood.png"} textures = {xcompat.textures.wool.white.."^[multiply:#"..color, xcompat.textures.wood.apple.planks}
}) })
end end
set_hud_overlay(player, name, "hangglider_overlay.png") set_hud_overlay(player, name, true)
set_physics_overrides(player, {jump = 0, gravity = 0.25}) set_physics_overrides(player, {jump = 0, gravity = 0.25})
hanggliding_players[name] = true hanggliding_players[name] = true
if hangglider_uses > 0 then if hangglider_uses > 0 then
@@ -196,26 +263,26 @@ local function hangglider_use(stack, player)
return stack return stack
end end
else else
set_hud_overlay(player, name, "blank.png") set_hud_overlay(player, name, false)
remove_physics_overrides(player) remove_physics_overrides(player)
hanggliding_players[name] = nil hanggliding_players[name] = nil
end end
end end
minetest.register_on_dieplayer(function(player) core.register_on_dieplayer(function(player)
local name = player:get_player_name() local name = player:get_player_name()
hanggliding_players[name] = nil hanggliding_players[name] = nil
remove_physics_overrides(player) remove_physics_overrides(player)
end) end)
minetest.register_on_leaveplayer(function(player) core.register_on_leaveplayer(function(player)
local name = player:get_player_name() local name = player:get_player_name()
hanggliding_players[name] = nil hanggliding_players[name] = nil
hud_overlay_ids[name] = nil hud_overlay_ids[name] = nil
remove_physics_overrides(player) remove_physics_overrides(player)
end) end)
minetest.register_on_player_hpchange(function(player, hp_change, reason) core.register_on_player_hpchange(function(player, hp_change, reason)
local name = player:get_player_name() local name = player:get_player_name()
if hanggliding_players[name] and reason.type == "fall" then if hanggliding_players[name] and reason.type == "fall" then
-- Stop all fall damage when hanggliding -- Stop all fall damage when hanggliding
@@ -224,22 +291,24 @@ minetest.register_on_player_hpchange(function(player, hp_change, reason)
return hp_change return hp_change
end, true) end, true)
minetest.register_entity("hangglider:glider", { core.register_entity("hangglider:glider", {
visual = "mesh", initial_properties = {
visual_size = {x = 12, y = 12}, visual = "mesh",
collisionbox = {0,0,0,0,0,0}, visual_size = {x = 12, y = 12},
mesh = "hangglider.obj", collisionbox = {0,0,0,0,0,0},
immortal = true, mesh = "hangglider.obj",
static_save = false, textures = {xcompat.textures.wool.white, xcompat.textures.wood.apple.planks},
textures = {"wool_white.png", "default_wood.png"}, immortal = true,
static_save = false,
},
on_step = hangglider_step, on_step = hangglider_step,
}) })
minetest.register_tool("hangglider:hangglider", { core.register_tool("hangglider:hangglider", {
description = "Glider", description = S("Glider"),
inventory_image = "hangglider_item.png", inventory_image = "hangglider_item.png",
sound = {breaks = "default_tool_breaks"}, sound = {breaks = "default_tool_breaks"},
on_use = hangglider_use, on_use = hangglider_use,
}) })
dofile(minetest.get_modpath("hangglider").."/crafts.lua") dofile(core.get_modpath("hangglider").."/crafts.lua")

28
locale/hangglider.ca.tr Normal file
View File

@@ -0,0 +1,28 @@
# textdomain: hangglider
White=blanc
Grey=gris
Dark_grey=gris fosc
Black=negre
Violet=violeta
Blue=blau
Cyan=cian
Dark_green=verd fosc
Green=verd
Yellow=groc
Brown=marró
Orange=taronja
Red=vermell
Magenta=magenta
Pink=rosa
Colored Glider=Planador de color
@1 Glider=Planador @1
You have entered restricted airspace!@@You will be shot down in @1 seconds by anti-aircraft guns!=Has entrat a l'espai aeri restringit!@@Seràs abatut en @1 segons per canons antiaeris!
<ID>=
Toggle airspace restrictions for area <ID>.=Activa o desactiva les restriccions d'espai aeri per a l'àrea <ID>.
Invalid usage, see /help area_flak.=Ús no vàlid, consulta /help area_flak.
Area @1 does not exist or is not owned by you.=L'àrea @1 no existeix o no és propietat teva.
Area @1 airspace is @2.=L'àrea @1 espai aeri és @2.
closed=tancat
opened=obert
Glider=Planador

28
locale/hangglider.de.tr Normal file
View File

@@ -0,0 +1,28 @@
# textdomain: hangglider
White=Weisser
Grey=Grauer
Dark_grey=Dunkelgrauer
Black=Schwarzer
Violet=Violeter
Blue=Blauer
Cyan=Cyan farbener
Dark_green=Dunkelgrüner
Green=Grüner
Yellow=Gelber
Brown=Brauner
Orange=Orange farbener
Red=Roter
Magenta=Magenta farbener
Pink=Rosa
Colored Glider=Farbiger Gleitschirm
@1 Glider=@1 Gleitschirm
You have entered restricted airspace!@@You will be shot down in @1 seconds by anti-aircraft guns!=Du bist in eingeschränktem Luftraum eingedrungen!@nDu wirst in @1 Sekunden von FLAK abgeschossen.
<ID>=
Toggle airspace restrictions for area <ID>.=Luftraumbeschränkungen für Gebiet <ID> umschalten.
Invalid usage, see /help area_flak.=Ungültige Verwendung, siehe /help area_flak.=
Area @1 does not exist or is not owned by you.=Gebiet @1 existiert nicht oder es gehört dir nicht.
Area @1 airspace is @2.=Gebiet @1 Luftraum ist @2.
closed=eingeschränkt
opened=geöffnet
Glider=Gleitschirm

28
locale/hangglider.es.tr Normal file
View File

@@ -0,0 +1,28 @@
# textdomain: hangglider
White=blanco
Grey=gris
Dark_grey=gris oscuro
Black=negro
Violet=violeta
Blue=azul
Cyan=cian
Dark_green=verde oscuro
Green=verde
Yellow=amarillo
Brown=marrón
Orange=naranja
Red=rojo
Magenta=magenta
Pink=rosa
Colored Glider=Planeador Colorizado
@1 Glider=Planeador @1
You have entered restricted airspace!@@You will be shot down in @1 seconds by anti-aircraft guns!=¡Has entrado en espacio aéreo restringido!@n¡Serás derribado en @1 segundos por cañones antiaéreos!
<ID>=
Toggle airspace restrictions for area <ID>.=Alternar restricciones de espacio aéreo para el área <ID>.
Invalid usage, see /help area_flak.=Uso no válido, consulta /help area_flak.
Area @1 does not exist or is not owned by you.=El área @1 no existe o no es tuya.
Area @1 airspace is @2.=Área @1 espacio aéreo está @2.
closed=cerrado
opened=abierto
Glider=Planeador

28
locale/template.txt Normal file
View File

@@ -0,0 +1,28 @@
# textdomain: hangglider
White=
Grey=
Dark_grey=
Black=
Violet=
Blue=
Cyan=
Dark_green=
Green=
Yellow=
Brown=
Orange=
Red=
Magenta=
Pink=
Colored Glider=
@1 Glider=
You have entered restricted airspace!@@You will be shot down in @1 seconds by anti-aircraft guns!=
<ID>=
Toggle airspace restrictions for area <ID>.=
Invalid usage, see /help area_flak.=
Area @1 does not exist or is not owned by you.=
Area @1 airspace is @2.=
closed=
opened=
Glider=

View File

@@ -1,5 +1,5 @@
name = hangglider name = hangglider
description = Adds a functional hang glider for exploring description = Adds a functional hang glider for exploring
depends = default, wool, dye depends = xcompat
optional_depends = areas, player_monoids, unifieddyes optional_depends = areas, player_monoids, pova, unifieddyes
min_minetest_version = 5.0 min_minetest_version = 5.0