diff --git a/DOCS.md b/DOCS.md index 10eb34f..52fbfbc 100644 --- a/DOCS.md +++ b/DOCS.md @@ -35,6 +35,7 @@ * [2.2.2.9 Timers](#2229-timers) * [2.2.2.10 Music](#22210-music) * [2.2.2.11 Celestial vault](#22211-celestial-vault) + * [2.2.2.12 Lighting](#22212-lighting) * [2.3 Arena phases](#23-arena-phases) * [2.4 Spectate mode](#24-spectate-mode) * [3. About the author(s)](#3-about-the-authors) @@ -443,6 +444,10 @@ By default, the arena's celestial vault reflects the celestial vault of the play will increase the size of the sun inside the arena and hide the sunrise texture. `params` can also be `nil`, and in that case will remove any custom setting previously set. Last but not least, the special element `"all"` allows you to change everything, and it needs a table with the following optional parameters: `{sky={...}, sun={...}, moon={...}, stars={...}, clouds={...}}`. If `params` is nil, it'll reset the whole celestial vault. +##### 2.2.2.12 Lighting +NOTE: EXPERIMENTAL FEATURE. EXPECT BREAKAGE IN THE FUTURE (according to the direction Minetest will choose to go with lighting) +By default, the arena's lighting settings reflect the lighting settings of the player before entering the match (meaning there are no default values inside arena_lib). +`arena_lib.set_lighting(sender, mod, arena_name, light_table)` allows you to override those settings. As for now, `light_table` only takes one field, `light`, a float between 0 and 1 that changes the intensity of the global lighting. If `light_table` is `nil`, it'll reset the whole lighting settings. ### 2.3 Arena phases An arena comes in 4 phases, each one of them linked to a specific function: diff --git a/init.lua b/init.lua index 95b6af9..82840d5 100755 --- a/init.lua +++ b/init.lua @@ -20,6 +20,7 @@ dofile(srcpath .. "/editor/editor_main.lua") dofile(srcpath .. "/editor/editor_icons.lua") dofile(srcpath .. "/editor/tools_bgm.lua") dofile(srcpath .. "/editor/tools_customise.lua") +dofile(srcpath .. "/editor/tools_lighting.lua") dofile(srcpath .. "/editor/tools_players.lua") dofile(srcpath .. "/editor/tools_settings.lua") dofile(srcpath .. "/editor/tools_sign.lua") diff --git a/locale/arena_lib.it.tr b/locale/arena_lib.it.tr index 0d3a2a5..b77a92c 100755 --- a/locale/arena_lib.it.tr +++ b/locale/arena_lib.it.tr @@ -37,6 +37,7 @@ Sign of arena @1 successfully removed=Cartello dell'arena @1 rimosso con success [!] There is already a sign for this arena!=[!] Esiste già un cartello per quest'arena! [!] There is no sign to remove assigned to @1!=[!] Non c'è nessun cartello da rimuovere assegnato a @1! Sign of arena @1 successfully set=Cartello dell'arena @1 impostato con successo +Lighting of arena @1 successfully overwritten=Illuminazione dell'arena @1 sovrascritta con successo All=Tutto Sky=Cielo Sun=Sole @@ -199,6 +200,11 @@ Pitch=Tono Apply=Applica [!] This audio track doesn't exist!=[!] Questa traccia audio non esiste! +# editor/tools_lighting.lua +Lighting=Illuminazione +Global light=Luce globale +Shadows=Ombre + # editor/tools_players.lua Change the current number=Cambia il numero attuale Teams: on (click to toggle off)=Squadre: attive (premi per disattivare) diff --git a/locale/template.txt b/locale/template.txt index 76e56d5..0d32744 100755 --- a/locale/template.txt +++ b/locale/template.txt @@ -37,6 +37,7 @@ Sign of arena @1 successfully removed= [!] There is already a sign for this arena!= [!] There is no sign to remove assigned to @1!= Sign of arena @1 successfully set= +Lighting of arena @1 successfully overwritten= All= Sky= Sun= @@ -199,6 +200,11 @@ Pitch= Apply= [!] This audio track doesn't exist!= +# editor/tools_lighting.lua +Lighting= +Global light= +Shadows= + # editor/tools_players.lua Change the current number= Teams: on (click to toggle off)= diff --git a/src/api/core.lua b/src/api/core.lua index e56d9a4..055dcbb 100755 --- a/src/api/core.lua +++ b/src/api/core.lua @@ -38,6 +38,7 @@ local arena_default = { max_players = 4, min_players = 2, celestial_vault = {}, -- sky = {...}, sun = {...}, moon = {...}, stars = {...}, clouds = {...} + lighting = nil, bgm = nil, initial_time = nil, current_time = nil, @@ -827,6 +828,29 @@ end +-- NOTE: è molto probabile che questa funzione verrà modificata con l'arrivo della 5.6, +-- dacché l'ho segnata come sperimentale (per esempio, arriverà set_lighting() +-- per modificare le ombre) +function arena_lib.set_lighting(sender, mod, arena_name, light_table, in_editor) + + local id, arena = arena_lib.get_arena_by_name(mod, arena_name) + + if not in_editor then + if not ARENA_LIB_EDIT_PRECHECKS_PASSED(sender, arena) then return end + end + + if light_table ~= nil and type(light_table) ~= "table" then + minetest.chat_send_player(sender, minetest.colorize("#e6482e", S("[!] Parameters don't seem right!"))) + return end + + arena.lighting = light_table + + update_storage(false, mod, id, arena) + minetest.chat_send_player(sender, arena_lib.mods[mod].prefix .. S("Lighting of arena @1 successfully overwritten", arena.name)) +end + + + function arena_lib.set_celestial_vault(sender, mod, arena_name, element, params, in_editor) local id, arena = arena_lib.get_arena_by_name(mod, arena_name) diff --git a/src/api/in_game.lua b/src/api/in_game.lua index bc1e9a2..7813d15 100755 --- a/src/api/in_game.lua +++ b/src/api/in_game.lua @@ -670,6 +670,20 @@ function operations_before_entering_arena(mod_ref, mod, arena, arena_ID, p_name) local player = minetest.get_player_by_name(p_name) + -- cambio eventuale illuminazione + if arena.lighting then + players_temp_storage[p_name].lighting = { + light = player:get_day_night_ratio() + } + + local lighting = arena.lighting + if lighting.light then + player:override_day_night_ratio(lighting.light) + end + + --TODO MT 5.6: set_lighting (shadows) + end + -- cambio eventuale volta celeste if next(arena.celestial_vault) then local celvault = arena.celestial_vault @@ -811,8 +825,18 @@ end -- reason parametro opzionale che passo solo quando potrebbe essersi disconnesso function operations_before_leaving_arena(mod_ref, arena, p_name, reason) + -- disattivo eventuale musica di sottofondo + if arena.bgm then + minetest.sound_stop(players_temp_storage[p_name].bgm_handle) + end + local player = minetest.get_player_by_name(p_name) + -- reimposto eventuale illuminazione + if arena.lighting then + player:override_day_night_ratio(players_temp_storage[p_name].lighting.light) + end + -- reimposto eventuale volta celeste if next(arena.celestial_vault) then local celvault = arena.celestial_vault @@ -907,11 +931,6 @@ function operations_before_leaving_arena(mod_ref, arena, p_name, reason) -- ripristino nomi player:set_nametag_attributes({color = {a = 255, r = 255, g = 255, b = 255}}) - -- disattivo eventuale musica di sottofondo - if arena.bgm then - minetest.sound_stop(players_temp_storage[p_name].bgm_handle) - end - -- svuoto lo storage temporaneo players_temp_storage[p_name] = nil end diff --git a/src/debug_utilities.lua b/src/debug_utilities.lua index 0e3d12c..102221b 100755 --- a/src/debug_utilities.lua +++ b/src/debug_utilities.lua @@ -155,6 +155,12 @@ function arena_lib.print_arena_info(sender, mod, arena_name) time = minetest.colorize("#eea160", S("Initial time: ")) .. minetest.colorize("#cfc6b8", arena.initial_time .. " (" .. S("current: ") .. current_time .. ")") .. "\n" end + -- calcolo eventuale illuminazione personalizzata + local lighting = "" + if arena.lighting then + lighting = minetest.serialize(arena.lighting) + end + --calcolo proprietà local properties = "" for property, _ in pairs(mod_ref.properties) do @@ -221,6 +227,7 @@ function arena_lib.print_arena_info(sender, mod, arena_name) minetest.colorize("#eea160", S("Spawn points: ")) .. minetest.colorize("#cfc6b8", #arena.spawn_points .. " ( " .. spawners_pos .. ")") .. "\n" .. time .. minetest.colorize("#eea160", S("Custom sky: ")) .. minetest.colorize("#cfc6b8", minetest.serialize(arena.celestial_vault)) .. "\n" .. + minetest.colorize("#eea160", S("Custom lighting: ")) .. minetest.colorize("#cfc6b8", lighting) .. "\n" .. minetest.colorize("#eea160", S("Properties: ")) .. minetest.colorize("#cfc6b8", properties) .. "\n" .. minetest.colorize("#eea160", S("Temp properties: ")) .. minetest.colorize("#cfc6b8", temp_properties) .. "\n" .. minetest.colorize("#eea160", S("Team properties: ")) .. minetest.colorize("#cfc6b8", team_properties) diff --git a/src/editor/editor_main.lua b/src/editor/editor_main.lua index 78fae57..681216e 100755 --- a/src/editor/editor_main.lua +++ b/src/editor/editor_main.lua @@ -102,6 +102,7 @@ function arena_lib.enter_editor(sender, mod, arena_name) inv = player:get_inventory():get_list("main"), pos = player:get_pos(), celvault = p_cvault, + lighting = {light = player:get_day_night_ratio()}, hotbar_slots = player:hud_get_hotbar_itemcount(), hotbar_bg = player:hud_get_hotbar_image() } @@ -127,6 +128,11 @@ function arena_lib.enter_editor(sender, mod, arena_name) if celvault.clouds then player:set_clouds(celvault.clouds) end end + -- imposto luce + if arena.lighting then + player:override_day_night_ratio(arena.lighting.light) + end + -- se c'è almeno uno spawner, teletrasporto if next(arena.spawn_points) then player:set_pos(arena.spawn_points[next(arena.spawn_points)].pos) @@ -154,6 +160,7 @@ function arena_lib.quit_editor(player) local inv = players_in_edit_mode[p_name].inv local pos = players_in_edit_mode[p_name].pos local celvault = table.copy(players_in_edit_mode[p_name].celvault) + local lighting = players_in_edit_mode[p_name].lighting local hotbar_slots = players_in_edit_mode[p_name].hotbar_slots local hotbar_bg = players_in_edit_mode[p_name].hotbar_bg @@ -184,6 +191,8 @@ function arena_lib.quit_editor(player) player:set_clouds(celvault.clouds) end + player:override_day_night_ratio(lighting.light) + -- restituisco l'inventario minetest.after(0, function() if not minetest.get_player_by_name(p_name) then return end diff --git a/src/editor/tools_customise.lua b/src/editor/tools_customise.lua index 71c6e6c..820430b 100644 --- a/src/editor/tools_customise.lua +++ b/src/editor/tools_customise.lua @@ -3,7 +3,7 @@ local S = minetest.get_translator("arena_lib") local customise_tools = { "arena_lib:customise_bgm", "arena_lib:customise_sky", - "", + "arena_lib:customise_lighting", "", "", "", diff --git a/src/editor/tools_lighting.lua b/src/editor/tools_lighting.lua new file mode 100644 index 0000000..33db399 --- /dev/null +++ b/src/editor/tools_lighting.lua @@ -0,0 +1,131 @@ +local S = minetest.get_translator("arena_lib") + +local function fill_templight() end +local function get_lighting_formspec() end + +local temp_light_settings = {} -- KEY = p_name; VALUE = {all the lighting settings} + + + +minetest.register_tool("arena_lib:customise_lighting", { + + description = S("Lighting"), + inventory_image = "arenalib_customise_lighting.png", + groups = {not_in_creative_inventory = 1, oddly_breakable_by_hand = "2"}, + on_place = function() end, + on_drop = function() end, + + on_use = function(itemstack, user, pointed_thing) + + local mod = user:get_meta():get_string("arena_lib_editor.mod") + local arena_name = user:get_meta():get_string("arena_lib_editor.arena") + local id, arena = arena_lib.get_arena_by_name(mod, arena_name) + local p_name = user:get_player_name() + + fill_templight(p_name, arena) + + minetest.show_formspec(p_name, "arena_lib:lighting", get_lighting_formspec(p_name)) + end +}) + + + + + +---------------------------------------------- +---------------FUNZIONI LOCALI---------------- +---------------------------------------------- + +function fill_templight(p_name, arena) + temp_light_settings[p_name] = not arena.lighting and {} or table.copy(arena.lighting) +end + + + +function get_lighting_formspec(p_name) + + local light = temp_light_settings[p_name].light or 50 + --TODO MT 5.6: local shadows = 0 + + local formspec = { + "formspec_version[4]", + "size[7,4.5]", + "bgcolor[;neither]", + -- parametri vari + "container[0.5,0.5]", + "label[0,0;" .. S("Global light") .. "]", + "label[0,0.41;0]", + "label[5.64,0.41;1]", + "scrollbaroptions[max=100;smallstep=1;largestep=10;arrows=hide]", + "scrollbar[0.4,0.3;5.2,0.2;;light;" .. light .. "]", + "label[0,1;" .. S("Shadows") .. "]", + "hypertext[-0.05,1.3;6,0.3;audio_info;]", + --[["label[0,1.41;0]", + "label[5.9,1.41;1]", + "scrollbar[0.4,1.3;5.2,0.2;;shadows;" .. shadows .. "]",]] + "container_end[]", + "button[1.95,3.7;1.5,0.5;reset;" .. S("Reset") .."]", + "button[3.55,3.7;1.5,0.5;apply;" .. S("Apply") .."]", + } + + return table.concat(formspec, "") +end + + + + + +---------------------------------------------- +---------------GESTIONE CAMPI----------------- +---------------------------------------------- + +minetest.register_on_player_receive_fields(function(player, formname, fields) + + if formname ~= "arena_lib:lighting" then return end + + local p_name = player:get_player_name() + local mod = player:get_meta():get_string("arena_lib_editor.mod") + local arena_name = player:get_meta():get_string("arena_lib_editor.arena") + local id, arena = arena_lib.get_arena_by_name(mod, arena_name) + local light_table = arena.lighting or {} + + -- se abbandona... + if fields.quit then + if next(light_table) then + player:override_day_night_ratio(light_table.light) + else + player:override_day_night_ratio(nil) + end + + temp_light_settings[p_name] = nil + return + + -- ...o se ripristina, non c'è bisogno di andare oltre + elseif fields.reset then + -- se la tabella non esiste, vuol dire che non c'è nulla da ripristinare (ed evito + -- che invii il messaggio di proprietà sovrascritte) + if arena.lighting then + arena_lib.set_lighting(p_name, mod, arena_name, nil, true) + end + + player:override_day_night_ratio(nil) + minetest.show_formspec(p_name, "arena_lib:lighting", get_lighting_formspec(p_name)) + return + end + + -- + -- aggiorna i vari parametri + -- + + if fields.light then + light_table.light = minetest.explode_scrollbar_event(fields.light).value / 100 + end + + + -- applica + if fields.apply then + arena_lib.set_lighting(p_name, mod, arena_name, light_table, true) + end + + player:override_day_night_ratio(light_table.light) +end) diff --git a/src/editor/tools_sky.lua b/src/editor/tools_sky.lua index eccfc63..d8d5882 100755 --- a/src/editor/tools_sky.lua +++ b/src/editor/tools_sky.lua @@ -649,7 +649,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end - -- controlla i vari campi che aggiornano il formspec + -- controlla i vari campi che necessitano di ricaricare il formspec (le spunte) if fields.sky_clouds then temp_sky.clouds = fields.sky_clouds == "true" and true or false diff --git a/textures/arenalib_customise_lighting.png b/textures/arenalib_customise_lighting.png new file mode 100644 index 0000000..1489b09 Binary files /dev/null and b/textures/arenalib_customise_lighting.png differ