From ea58a71e17ad29a5e6b69cacf1d7ff2d424d18d6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 25 Feb 2017 02:04:15 +0100 Subject: [PATCH 01/17] Fix crash HP changed before player was registered --- init.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/init.lua b/init.lua index 6bcc624..89d8b1c 100644 --- a/init.lua +++ b/init.lua @@ -521,7 +521,11 @@ local function update_hud(player) end end -minetest.register_on_player_hpchange(update_health) +minetest.register_on_player_hpchange(function(player) + if hb.players[player:get_player_name()] ~= nil then + update_health(player) + end +end) minetest.register_on_respawnplayer(function(player) update_health(player) From fa82d2df1c20a6ce205acaf26ab003e1269be975 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 25 Feb 2017 02:06:02 +0100 Subject: [PATCH 02/17] Version 1.7.1 --- API.md | 4 ++-- README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/API.md b/API.md index 124da82..312be99 100644 --- a/API.md +++ b/API.md @@ -1,5 +1,5 @@ -API documentation for the HUD bars mod 1.7.0 -============================================ +API documentation for the HUD bars mod +====================================== ## Introduction This API allows you to add, change, hide and unhide custom HUD bars for this mod. diff --git a/README.md b/README.md index 6571b77..9a5500c 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ this mod will place them accordingly. position should be displayed correctly on every screen size. ## Current version -The current version is 1.7.0. +The current version is 1.7.1. This software uses [semantic versioning](http://semver.org), as defined by version 2.0.0 of the SemVer standard. From cfebd5138db3925e96eac05a8d15d16cd8171a94 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 29 May 2017 16:14:40 +0200 Subject: [PATCH 03/17] Explicitly set statbar size for progress bars --- init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.lua b/init.lua index 89d8b1c..db9072a 100644 --- a/init.lua +++ b/init.lua @@ -236,7 +236,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta local bar_image, bar_size if hb.settings.bar_type == "progress_bar" then bar_image = textures.bar - bar_size = nil + bar_size = {x=2, y=16} elseif hb.settings.bar_type == "statbar_classic" or hb.settings.bar_type == "statbar_modern" then bar_image = textures.icon bar_size = {x=24, y=24} From e5989f4c0dc279d3f5478a5ccc744b026470486a Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 29 May 2017 16:15:17 +0200 Subject: [PATCH 04/17] Version 1.7.2 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9a5500c..76e70b5 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ this mod will place them accordingly. position should be displayed correctly on every screen size. ## Current version -The current version is 1.7.1. +The current version is 1.7.2. This software uses [semantic versioning](http://semver.org), as defined by version 2.0.0 of the SemVer standard. From e4c8510282e18c4cdd82a9ef0136f2c583ac34c6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 29 May 2017 16:17:31 +0200 Subject: [PATCH 05/17] Add Turkish translation --- locale/tr.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 locale/tr.txt diff --git a/locale/tr.txt b/locale/tr.txt new file mode 100644 index 0000000..b49c7a0 --- /dev/null +++ b/locale/tr.txt @@ -0,0 +1,3 @@ +Health = Can +Breath = Nefes +%s: %d/%d = %s: %d/%d From f273a9e1f3790045ade80b0c5a3e86306e22b3d8 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 29 May 2017 16:18:35 +0200 Subject: [PATCH 06/17] Version 1.8.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 76e70b5..5d3d8e7 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ this mod will place them accordingly. position should be displayed correctly on every screen size. ## Current version -The current version is 1.7.2. +The current version is 1.8.0. This software uses [semantic versioning](http://semver.org), as defined by version 2.0.0 of the SemVer standard. From bd0641af52020a39adc885271d80fdbd66af9651 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 29 May 2017 16:20:32 +0200 Subject: [PATCH 07/17] Update credits in README file --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5d3d8e7..74c3dfa 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ Translations: * German: Wuzzy * Portuguese: BrunoMine +* Turkish: admicos This program is free software. It comes without any warranty, to the extent permitted by applicable law. You can redistribute it From e09eb8ab4f144c3f69de7734cf2f3f475c0e9a0d Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 20 Jun 2017 16:38:52 +0200 Subject: [PATCH 08/17] Use 0.4.16 settings syntax This breaks compability with Minetest 0.4.15, 0.4.14, 0.4.13 and 0.4.12 --- init.lua | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/init.lua b/init.lua index db9072a..0ecbe35 100644 --- a/init.lua +++ b/init.lua @@ -20,11 +20,11 @@ hb.settings = {} function hb.load_setting(sname, stype, defaultval, valid_values) local sval if stype == "string" then - sval = minetest.setting_get(sname) + sval = minetest.settings:get(sname) elseif stype == "bool" then - sval = minetest.setting_getbool(sname) + sval = minetest.settings:get_bool(sname) elseif stype == "number" then - sval = tonumber(minetest.setting_get(sname)) + sval = tonumber(minetest.settings:get(sname)) end if sval ~= nil then if valid_values ~= nil then @@ -83,7 +83,7 @@ hb.settings.forceload_default_hudbars = hb.load_setting("hudbars_forceload_defau hb.settings.alignment_pattern = hb.load_setting("hudbars_alignment_pattern", "string", "zigzag", {"zigzag", "stack_up", "stack_down"}) hb.settings.autohide_breath = hb.load_setting("hudbars_autohide_breath", "bool", true) -local sorting = minetest.setting_get("hudbars_sorting") +local sorting = minetest.settings:get("hudbars_sorting") if sorting ~= nil then hb.settings.sorting = {} hb.settings.sorting_reverse = {} @@ -464,7 +464,7 @@ function hb.get_hudbar_state(player, identifier) end --register built-in HUD bars -if minetest.setting_getbool("enable_damage") or hb.settings.forceload_default_hudbars then +if minetest.settings:get_bool("enable_damage") or hb.settings.forceload_default_hudbars then hb.register_hudbar("health", 0xFFFFFF, S("Health"), { bar = "hudbars_bar_health.png", icon = "hudbars_icon_health.png", bgicon = "hudbars_bgicon_health.png" }, 20, 20, false) hb.register_hudbar("breath", 0xFFFFFF, S("Breath"), { bar = "hudbars_bar_breath.png", icon = "hudbars_icon_breath.png", bgicon = "hudbars_bgicon_breath.png" }, 10, 10, true) end @@ -478,9 +478,9 @@ end local function custom_hud(player) - if minetest.setting_getbool("enable_damage") or hb.settings.forceload_default_hudbars then + if minetest.settings:get_bool("enable_damage") or hb.settings.forceload_default_hudbars then local hide - if minetest.setting_getbool("enable_damage") then + if minetest.settings:get_bool("enable_damage") then hide = false else hide = true @@ -500,7 +500,7 @@ end -- update built-in HUD bars local function update_hud(player) if not player_exists(player) then return end - if minetest.setting_getbool("enable_damage") then + if minetest.settings:get_bool("enable_damage") then if hb.settings.forceload_default_hudbars then hb.unhide_hudbar(player, "health") end @@ -550,7 +550,7 @@ minetest.register_globalstep(function(dtime) if main_timer > hb.settings.tick or timer > 4 then if main_timer > hb.settings.tick then main_timer = 0 end -- only proceed if damage is enabled - if minetest.setting_getbool("enable_damage") or hb.settings.forceload_default_hudbars then + if minetest.settings:get_bool("enable_damage") or hb.settings.forceload_default_hudbars then for _, player in pairs(hb.players) do -- update all hud elements update_hud(player) From 5e06b35e79003e6ae1c3253ec292918ad443ca84 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 2 Jul 2017 18:44:24 +0200 Subject: [PATCH 09/17] Add hb.get_hudbar_identifiers() --- API.md | 5 ++++- init.lua | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/API.md b/API.md index 312be99..a53344c 100644 --- a/API.md +++ b/API.md @@ -170,7 +170,7 @@ Makes a previously hidden HUD bar visible again to a player. ## Reading HUD bar information -It is also possible to read information about an active HUD bar. +It is also possible to read information about existing HUD bars. ### `hb.get_hudbar_state(player, identifier)` Returns the current state of the active player's HUD bar. @@ -191,3 +191,6 @@ hold by the table is only true for the moment you called this function. The fiel * `text`: The text shown on the HUD bar. This fiels is meaningless if the HUD bar is currently hidden. If the player does not exist, returns `nil` instead. + +### `hb.get_hudbar_identifiers()` +Returns a table of all currently registered HUD bar identifiers. diff --git a/init.lua b/init.lua index 0ecbe35..885baea 100644 --- a/init.lua +++ b/init.lua @@ -463,6 +463,14 @@ function hb.get_hudbar_state(player, identifier) return copy end +function hb.get_hudbar_identifiers() + local ids = {} + for id, _ in pairs(hb.hudtables) do + table.insert(ids, id) + end + return ids +end + --register built-in HUD bars if minetest.settings:get_bool("enable_damage") or hb.settings.forceload_default_hudbars then hb.register_hudbar("health", 0xFFFFFF, S("Health"), { bar = "hudbars_bar_health.png", icon = "hudbars_icon_health.png", bgicon = "hudbars_bgicon_health.png" }, 20, 20, false) From 9145f492e8e16e12499a4a55f90b1c6f5e351a42 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 2 Jul 2017 18:50:17 +0200 Subject: [PATCH 10/17] Move default settings into new Lua file --- default_settings.lua | 48 +++++++++++++++++++++++++++++++++++++++++++ init.lua | 49 ++------------------------------------------ 2 files changed, 50 insertions(+), 47 deletions(-) create mode 100644 default_settings.lua diff --git a/default_settings.lua b/default_settings.lua new file mode 100644 index 0000000..d2a325b --- /dev/null +++ b/default_settings.lua @@ -0,0 +1,48 @@ +-- (Hardcoded) default settings + +hb.settings.max_bar_length = 160 +hb.settings.statbar_length = 20 + +-- Statbar positions +hb.settings.pos_left = {} +hb.settings.pos_right = {} +hb.settings.start_offset_left = {} +hb.settings.start_offset_right= {} +hb.settings.pos_left.x = hb.load_setting("hudbars_pos_left_x", "number", 0.5) +hb.settings.pos_left.y = hb.load_setting("hudbars_pos_left_y", "number", 1) +hb.settings.pos_right.x = hb.load_setting("hudbars_pos_right_x", "number", 0.5) +hb.settings.pos_right.y = hb.load_setting("hudbars_pos_right_y", "number", 1) +hb.settings.bar_type = hb.load_setting("hudbars_bar_type", "string", "progress_bar", {"progress_bar", "statbar_classic", "statbar_modern"}) +if hb.settings.bar_type == "progress_bar" then + hb.settings.start_offset_left.x = hb.load_setting("hudbars_start_offset_left_x", "number", -175) + hb.settings.start_offset_left.y = hb.load_setting("hudbars_start_offset_left_y", "number", -86) + hb.settings.start_offset_right.x = hb.load_setting("hudbars_start_offset_right_x", "number", 15) + hb.settings.start_offset_right.y = hb.load_setting("hudbars_start_offset_right_y", "number", -86) +else + hb.settings.start_offset_left.x = hb.load_setting("hudbars_start_statbar_offset_left_x", "number", -265) + hb.settings.start_offset_left.y = hb.load_setting("hudbars_start_statbar_offset_left_y", "number", -90) + hb.settings.start_offset_right.x = hb.load_setting("hudbars_start_statbar_offset_right_x", "number", 25) + hb.settings.start_offset_right.y = hb.load_setting("hudbars_start_statbar_offset_right_y", "number", -90) +end +hb.settings.vmargin = hb.load_setting("hudbars_vmargin", "number", 24) +hb.settings.tick = hb.load_setting("hudbars_tick", "number", 0.1) + +-- Experimental setting: Changing this setting is not officially supported, do NOT rely on it! +hb.settings.forceload_default_hudbars = hb.load_setting("hudbars_forceload_default_hudbars", "bool", true) + +-- Misc. settings +hb.settings.alignment_pattern = hb.load_setting("hudbars_alignment_pattern", "string", "zigzag", {"zigzag", "stack_up", "stack_down"}) +hb.settings.autohide_breath = hb.load_setting("hudbars_autohide_breath", "bool", true) + +local sorting = minetest.settings:get("hudbars_sorting") +if sorting ~= nil then + hb.settings.sorting = {} + hb.settings.sorting_reverse = {} + for k,v in string.gmatch(sorting, "(%w+)=(%w+)") do + hb.settings.sorting[k] = tonumber(v) + hb.settings.sorting_reverse[tonumber(v)] = k + end +else + hb.settings.sorting = { ["health"] = 0, ["breath"] = 1 } + hb.settings.sorting_reverse = { [0] = "health", [1] = "breath" } +end diff --git a/init.lua b/init.lua index 885baea..4e9294b 100644 --- a/init.lua +++ b/init.lua @@ -48,53 +48,8 @@ function hb.load_setting(sname, stype, defaultval, valid_values) end end --- (hardcoded) default settings -hb.settings.max_bar_length = 160 -hb.settings.statbar_length = 20 - --- statbar positions -hb.settings.pos_left = {} -hb.settings.pos_right = {} -hb.settings.start_offset_left = {} -hb.settings.start_offset_right= {} -hb.settings.pos_left.x = hb.load_setting("hudbars_pos_left_x", "number", 0.5) -hb.settings.pos_left.y = hb.load_setting("hudbars_pos_left_y", "number", 1) -hb.settings.pos_right.x = hb.load_setting("hudbars_pos_right_x", "number", 0.5) -hb.settings.pos_right.y = hb.load_setting("hudbars_pos_right_y", "number", 1) -hb.settings.bar_type = hb.load_setting("hudbars_bar_type", "string", "progress_bar", {"progress_bar", "statbar_classic", "statbar_modern"}) -if hb.settings.bar_type == "progress_bar" then - hb.settings.start_offset_left.x = hb.load_setting("hudbars_start_offset_left_x", "number", -175) - hb.settings.start_offset_left.y = hb.load_setting("hudbars_start_offset_left_y", "number", -86) - hb.settings.start_offset_right.x = hb.load_setting("hudbars_start_offset_right_x", "number", 15) - hb.settings.start_offset_right.y = hb.load_setting("hudbars_start_offset_right_y", "number", -86) -else - hb.settings.start_offset_left.x = hb.load_setting("hudbars_start_statbar_offset_left_x", "number", -265) - hb.settings.start_offset_left.y = hb.load_setting("hudbars_start_statbar_offset_left_y", "number", -90) - hb.settings.start_offset_right.x = hb.load_setting("hudbars_start_statbar_offset_right_x", "number", 25) - hb.settings.start_offset_right.y = hb.load_setting("hudbars_start_statbar_offset_right_y", "number", -90) -end -hb.settings.vmargin = hb.load_setting("hudbars_vmargin", "number", 24) -hb.settings.tick = hb.load_setting("hudbars_tick", "number", 0.1) - --- experimental setting: Changing this setting is not officially supported, do NOT rely on it! -hb.settings.forceload_default_hudbars = hb.load_setting("hudbars_forceload_default_hudbars", "bool", true) - --- Misc. settings -hb.settings.alignment_pattern = hb.load_setting("hudbars_alignment_pattern", "string", "zigzag", {"zigzag", "stack_up", "stack_down"}) -hb.settings.autohide_breath = hb.load_setting("hudbars_autohide_breath", "bool", true) - -local sorting = minetest.settings:get("hudbars_sorting") -if sorting ~= nil then - hb.settings.sorting = {} - hb.settings.sorting_reverse = {} - for k,v in string.gmatch(sorting, "(%w+)=(%w+)") do - hb.settings.sorting[k] = tonumber(v) - hb.settings.sorting_reverse[tonumber(v)] = k - end -else - hb.settings.sorting = { ["health"] = 0, ["breath"] = 1 } - hb.settings.sorting_reverse = { [0] = "health", [1] = "breath" } -end +-- Load default settings +dofile(minetest.get_modpath("hudbars").."/default_settings.lua") local function player_exists(player) return player ~= nil and player:is_player() From f19a85c5375f47ca9faab2312e7ff45b4cc115d4 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 2 Jul 2017 18:56:32 +0200 Subject: [PATCH 11/17] Version 1.9.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 74c3dfa..4f72340 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ this mod will place them accordingly. position should be displayed correctly on every screen size. ## Current version -The current version is 1.8.0. +The current version is 1.9.0. This software uses [semantic versioning](http://semver.org), as defined by version 2.0.0 of the SemVer standard. From aa5fef12986993e818a36b5983ceba19c57d9243 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 6 Jul 2017 03:11:56 +0200 Subject: [PATCH 12/17] Replace deprecated intllib call: - 'Getter' with 'make_gettext_pair' if available Thanks, AntumDeluge! --- init.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/init.lua b/init.lua index 4e9294b..495dca6 100644 --- a/init.lua +++ b/init.lua @@ -1,6 +1,10 @@ local S -if (minetest.get_modpath("intllib")) then - S = intllib.Getter() +if minetest.global_exists("intllib") then + if intllib.make_gettext_pair then + S = intllib.make_gettext_pair() + else + S = intllib.Getter() + end else S = function ( s ) return s end end From 1e522e2896d3720dc150f29238aec260719ad847 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Sep 2017 16:17:42 +0200 Subject: [PATCH 13/17] Use MIT License --- README.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 4f72340..bd20305 100644 --- a/README.md +++ b/README.md @@ -38,20 +38,19 @@ Translations: This program is free software. It comes without any warranty, to the extent permitted by applicable law. You can redistribute it -and/or modify it under the terms of the Do What The Fuck You Want -To Public License (WTFPL), version 2, as published by Sam Hocevar. +and/or modify it under the terms of the MIT License. ### Licenses of textures * `hudbars_icon_health.png`—celeron55 (CC BY-SA 3.0), modified by BlockMen * `hudbars_bgicon_health.png`—celeron55 (CC BY-SA 3.0), modified by BlockMen -* `hudbars_icon_breath.png`—kaeza (WTFPL), modified by BlockMen, modified again by Wuzzy -* `hudbars_bgicon_breath.png`—based on previous image, edited by Wuzzy (WTFPL) -* `hudbars_bar_health.png`—Wuzzy (WTFPL) -* `hudbars_bar_breath.png`—Wuzzy (WTFPL) -* `hudbars_bar_background.png`—Wuzzy (WTFPL) +* `hudbars_icon_breath.png`—kaeza (MIT License), modified by BlockMen, modified again by Wuzzy +* `hudbars_bgicon_breath.png`—based on previous image, edited by Wuzzy (MIT License) +* `hudbars_bar_health.png`—Wuzzy (MIT License) +* `hudbars_bar_breath.png`—Wuzzy (MIT License) +* `hudbars_bar_background.png`—Wuzzy (MIT License) ### License references * [CC-BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/) -* [WTFPL](http://sam.zoy.org/wtfpl/COPYING) +* [MIT License](https://opensource.org/licenses/MIT) From ec238287cb8eac6a7b3560b46bf7c3502ddfaf60 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Sep 2017 16:28:38 +0200 Subject: [PATCH 14/17] No longer set progress bar image size explicitly This may fix problems with some people having the progress bar displaced. --- init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.lua b/init.lua index 495dca6..fc43f85 100644 --- a/init.lua +++ b/init.lua @@ -195,7 +195,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta local bar_image, bar_size if hb.settings.bar_type == "progress_bar" then bar_image = textures.bar - bar_size = {x=2, y=16} + bar_size = nil elseif hb.settings.bar_type == "statbar_classic" or hb.settings.bar_type == "statbar_modern" then bar_image = textures.icon bar_size = {x=24, y=24} From 99cdbddc64454a36e80aaced88ec2401edb3fd00 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Sep 2017 16:31:03 +0200 Subject: [PATCH 15/17] Add Italian locale by Hamlet --- locale/it.txt | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 locale/it.txt diff --git a/locale/it.txt b/locale/it.txt new file mode 100644 index 0000000..40558ac --- /dev/null +++ b/locale/it.txt @@ -0,0 +1,5 @@ +Health = Salute +Breath = Ossigeno + +# Default format string for progress bar-style HUD bars, e.g. “Health 5/20” +%s: %d/%d From b5e84b2b50fdd576bd4182a2d8dfb2bf4bad59cf Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Sep 2017 16:31:17 +0200 Subject: [PATCH 16/17] Add Dutch locale by kingoscargames --- locale/nl.txt | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 locale/nl.txt diff --git a/locale/nl.txt b/locale/nl.txt new file mode 100644 index 0000000..33e161e --- /dev/null +++ b/locale/nl.txt @@ -0,0 +1,5 @@ +Health = Gezondheid +Breath = Adem + +# Default format string for progress bar-style HUD bars, e.g. “Health 5/20” +%s: %d/%d From bec8afed8bff724c89ecca1d9eced0a1fa84e32c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 18 Sep 2017 17:49:48 +0200 Subject: [PATCH 17/17] Version 1.10.0, update credits --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bd20305..a3a1a96 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ this mod will place them accordingly. position should be displayed correctly on every screen size. ## Current version -The current version is 1.9.0. +The current version is 1.10.0. This software uses [semantic versioning](http://semver.org), as defined by version 2.0.0 of the SemVer standard. @@ -35,6 +35,8 @@ Translations: * German: Wuzzy * Portuguese: BrunoMine * Turkish: admicos +* Dutch: kingoscargames +* Italian: Hamlet This program is free software. It comes without any warranty, to the extent permitted by applicable law. You can redistribute it