diff --git a/android/app/build.gradle b/android/app/build.gradle index 85c8e830c..6bacc3d55 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -81,7 +81,7 @@ task prepareAssets() { from "${projRoot}/fonts" include "*.ttf" into "${assetsFolder}/fonts" } copy { - from "${projRoot}/textures" into "${assetsFolder}/textures" + from "${projRoot}/textures/base/pack" into "${assetsFolder}/textures/base/pack" } // compile translations diff --git a/builtin/locale/__builtin.de.tr b/builtin/locale/__builtin.de.tr index d64e9c94d..29407c0a8 100644 --- a/builtin/locale/__builtin.de.tr +++ b/builtin/locale/__builtin.de.tr @@ -207,7 +207,7 @@ Available commands: (see also: /help )=Verfügbare Befehle: (siehe auch: /h Close=Schließen Privilege=Privileg Description=Beschreibung -print [] | dump [] | save [ []] | reset=print [] | dump [] | save [ []] +print [] | dump [] | save [ []] | reset=print [] | dump [] | save [ []] | reset Handle the profiler and profiling data=Den Profiler und Profilingdaten verwalten Statistics written to action log.=Statistiken zum Aktionsprotokoll geschrieben. Statistics were reset.=Statistiken wurden zurückgesetzt. diff --git a/builtin/locale/__builtin.id.tr b/builtin/locale/__builtin.id.tr index 43ce79058..139d2a4b8 100644 --- a/builtin/locale/__builtin.id.tr +++ b/builtin/locale/__builtin.id.tr @@ -2,8 +2,8 @@ Empty command.=Perintah kosong. Invalid command: @1=Perintah tidak sah: @1 Invalid command usage.=Penggunaan perintah tidak sah. - (@1 s)= (@1 detik) -Command execution took @1 s=Pelaksanaan perintah memerlukan @1 detik + (@1 s)= (@1 detik) +Command execution took @1 s=Pelaksanaan perintah memerlukan @1 detik You don't have permission to run this command (missing privileges: @1).=Anda tidak memiliki izin untuk menjalankan perintah ini (hak tidak ada: @1). Unable to get position of player @1.=Tidak dapat mengambil letak pemain @1. Incorrect area format. Expected: (x1,y1,z1) (x2,y2,z2)=Format daerah tidak sah. Diharapkan: (x1,y1,z1) (x2,y2,z2) diff --git a/builtin/locale/__builtin.it.tr b/builtin/locale/__builtin.it.tr index e88cd5532..438193993 100644 --- a/builtin/locale/__builtin.it.tr +++ b/builtin/locale/__builtin.it.tr @@ -1,78 +1,79 @@ # textdomain: __builtin +# note for transaltors: sono state seguite le norme di https://italianoinclusivo.it/ a parte per il suffisso -tore -trice, con l'intento di trasformarlo in un epiceno Empty command.=Comando vuoto. Invalid command: @1=Comando non valido: @1 Invalid command usage.=Utilizzo del comando non valido. - (@1 s)= -Command execution took @1 s= + (@1 s)= (@1 s) +Command execution took @1 s=L'esecuzione del comando ha richiesto @1 s You don't have permission to run this command (missing privileges: @1).=Non hai il permesso di eseguire questo comando (privilegi mancanti: @1). -Unable to get position of player @1.=Impossibile ottenere la posizione del giocatore @1. +Unable to get position of player @1.=Impossibile ottenere la posizione dellə giocatore @1. Incorrect area format. Expected: (x1,y1,z1) (x2,y2,z2)=Formato dell'area non corretto. Richiesto: (x1,y1,z1) (x2,y2,z2) = Show chat action (e.g., '/me orders a pizza' displays ' orders a pizza')=Mostra un'azione in chat (es. `/me ordina una pizza` mostra ` ordina una pizza`) -Show the name of the server owner=Mostra il nome del proprietario del server +Show the name of the server owner=Mostra il nome di chi possiede il server The administrator of this server is @1.=L'amministratore di questo server è @1. -There's no administrator named in the config file.=Non c'è nessun amministratore nel file di configurazione. -@1 does not have any privileges.= +There's no administrator named in the config file.=Non c'è nessun*amministratore nel file di configurazione. +@1 does not have any privileges.=@1 non ha nessun privilegio Privileges of @1: @2=Privilegi di @1: @2 []=[] -Show privileges of yourself or another player=Mostra i privilegi propri o di un altro giocatore -Player @1 does not exist.=Il giocatore @1 non esiste. +Show privileges of yourself or another player=Mostra i privilegi propri o di un*altrə giocatore +Player @1 does not exist.=Lə giocatore @1 non esiste. = -Return list of all online players with privilege=Ritorna una lista di tutti i giocatori connessi col tale privilegio +Return list of all online players with privilege=Ritorna una lista di tuttɜ lɜ giocatori connessɜ col tale privilegio Invalid parameters (see /help haspriv).=Parametri non validi (vedi /help haspriv). Unknown privilege!=Privilegio sconosciuto! -No online player has the "@1" privilege.= -Players online with the "@1" privilege: @2=Giocatori connessi con il privilegio "@1": @2 +No online player has the "@1" privilege.=Nessunə giocatore ha il privilegio "@1". +Players online with the "@1" privilege: @2=Giocatori connessɜ con il privilegio "@1": @2 Your privileges are insufficient.=I tuoi privilegi sono insufficienti. -Your privileges are insufficient. '@1' only allows you to grant: @2= +Your privileges are insufficient. '@1' only allows you to grant: @2=I tuoi privilegi sono insufficienti. '@1' ti permette soltanto di elargire: @2 Unknown privilege: @1=Privilegio sconosciuto: @1 @1 granted you privileges: @2=@1 ti ha assegnato i seguenti privilegi: @2 - ( [, [<...>]] | all)= -Give privileges to player=Dà privilegi al giocatore + ( [, [<...>]] | all)= ( [, [<...>]] | all) +Give privileges to player=Dà privilegi allə giocatore Invalid parameters (see /help grant).=Parametri non validi (vedi /help grant). - [, [<...>]] | all= + [, [<...>]] | all= [, [<...>]] | all Grant privileges to yourself=Assegna dei privilegi a te stessǝ Invalid parameters (see /help grantme).=Parametri non validi (vedi /help grantme). -Your privileges are insufficient. '@1' only allows you to revoke: @2= -Note: Cannot revoke in singleplayer: @1= -Note: Cannot revoke from admin: @1= -No privileges were revoked.= +Your privileges are insufficient. '@1' only allows you to revoke: @2=I tuoi privilegi sono insufficienti. '@1' ti permette soltanto di revocare: @2 +Note: Cannot revoke in singleplayer: @1=N.B.: Non si può revocare in locale: @1 +Note: Cannot revoke from admin: @1=N.B.: Non si può revocare a un*amministratore: @1 +No privileges were revoked.=Nessun privilegio è stato revocato. @1 revoked privileges from you: @2=@1 ti ha revocato i seguenti privilegi: @2 -Remove privileges from player=Rimuove privilegi dal giocatore +Remove privileges from player=Rimuove privilegi dallə giocatore Invalid parameters (see /help revoke).=Parametri non validi (vedi /help revoke). Revoke privileges from yourself=Revoca privilegi a te stessǝ Invalid parameters (see /help revokeme).=Parametri non validi (vedi /help revokeme). = -Set player's password (sent unencrypted, thus insecure)= +Set player's password (sent unencrypted, thus insecure)=Imposta la password dellə giocatore (non crittografata, ergo insicura) Name field required.=Campo "nome" richiesto. Your password was cleared by @1.=La tua password è stata resettata da @1. -Password of player "@1" cleared.=Password del giocatore "@1" resettata. +Password of player "@1" cleared.=Password dellə giocatore "@1" resettata. Your password was set by @1.=La tua password è stata impostata da @1. -Password of player "@1" set.=Password del giocatore "@1" impostata. +Password of player "@1" set.=Password dellə giocatore "@1" impostata. = Set empty password for a player=Imposta una password vuota a un giocatore Reload authentication data=Ricarica i dati d'autenticazione Done.=Fatto. Failed.=Errore. -Remove a player's data=Rimuove i dati di un giocatore +Remove a player's data=Rimuove i dati di unə giocatore Player "@1" removed.=Giocatore "@1" rimosso. -No such player "@1" to remove.=Non è presente nessun giocatore "@1" da rimuovere. -Player "@1" is connected, cannot remove.=Il giocatore "@1" è connesso, non può essere rimosso. +No such player "@1" to remove.=Non è presente nessunə giocatore "@1" da rimuovere. +Player "@1" is connected, cannot remove.=Lə giocatore "@1" è connessə, non può essere rimossə. Unhandled remove_player return code @1.=Codice ritornato da remove_player non gestito (@1). Cannot teleport out of map bounds!=Non ci si può teletrasportare fuori dai limiti della mappa! -Cannot get player with name @1.=Impossibile trovare il giocatore chiamato @1. -Cannot teleport, @1 is attached to an object!=Impossibile teletrasportare, @1 è attaccato a un oggetto! +Cannot get player with name @1.=Impossibile trovare lə giocatore chiamato @1. +Cannot teleport, @1 is attached to an object!=Impossibile teletrasportare, @1 è attaccatə a un oggetto! Teleporting @1 to @2.=Teletrasportando @1 da @2. -One does not teleport to oneself.=Non ci si può teletrasportare su se stessi. -Cannot get teleportee with name @1.=Impossibile trovare il giocatore chiamato @1 per il teletrasporto -Cannot get target player with name @1.=Impossibile trovare il giocatore chiamato @1 per il teletrasporto +One does not teleport to oneself.=Non ci si può teletrasportare su se stessɜ. +Cannot get teleportee with name @1.=Impossibile trovare lə giocatore chiamatə @1 per il teletrasporto +Cannot get target player with name @1.=Impossibile trovare lə giocatore chiamato @1 per il teletrasporto Teleporting @1 to @2 at @3.=Teletrasportando @1 da @2 a @3 ,, | | ,, | =,, | | ,, | -Teleport to position or player=Teletrasporta a una posizione o da un giocatore -You don't have permission to teleport other players (missing privilege: @1).=Non hai il permesso di teletrasportare altri giocatori (privilegio mancante: @1). +Teleport to position or player=Teletrasporta a una posizione o da unə giocatore +You don't have permission to teleport other players (missing privilege: @1).=Non hai il permesso di teletrasportare altrɜ giocatori (privilegio mancante: @1). ([-n] ) | =([-n] ) | Set or read server configuration setting=Imposta o ottieni le configurazioni del server -Failed. Cannot modify secure settings. Edit the settings file manually.= +Failed. Cannot modify secure settings. Edit the settings file manually.=Errore. Non è possibile modificare le impostazioni di sicurezza. Modifica manualmente il file d'impostazioni. Failed. Use '/set -n ' to create a new setting.=Errore. Usa 'set -n ' per creare una nuova impostazione @1 @= @2=@1 @= @2 = @@ -89,11 +90,11 @@ Resets lighting in the area between pos1 and pos2 ( and must be in Successfully reset light in the area ranging from @1 to @2.=Luce nell'area tra @1 e @2 reimpostata con successo. Failed to load one or more blocks in area.=Errore nel caricare uno o più blocchi mappa nell'area. List mods installed on the server=Elenca le mod installate nel server -No mods installed.= +No mods installed.=Nessuna mod installata. Cannot give an empty item.=Impossibile dare un oggetto vuoto. Cannot give an unknown item.=Impossibile dare un oggetto sconosciuto. Giving 'ignore' is not allowed.=Non è permesso dare 'ignore'. -@1 is not a known player.=@1 non è un giocatore conosciuto. +@1 is not a known player.=@1 non è unə giocatore conosciutə. @1 partially added to inventory.=@1 parzialmente aggiunto all'inventario. @1 could not be added to inventory.=@1 non può essere aggiunto all'inventario. @1 added to inventory.=@1 aggiunto all'inventario. @@ -101,7 +102,7 @@ Giving 'ignore' is not allowed.=Non è permesso dare 'ignore'. @1 could not be added to inventory of @2.=Non è stato possibile aggiungere @1 all'inventario di @2. @1 added to inventory of @2.=@1 aggiunto all'inventario di @2. [ []]= [ []] -Give item to player=Dà oggetti ai giocatori +Give item to player=Dà oggetti allɜ giocatori Name and ItemString required.=Richiesti nome e NomeOggetto. [ []]= [ []] Give item to yourself=Dà oggetti a te stessǝ @@ -109,29 +110,29 @@ ItemString required.=Richiesto NomeOggetto. [,,]= [,,] Spawn entity at given (or your) position=Genera un'entità alla data coordinata (o la tua) EntityName required.=Richiesto NomeEntità -Unable to spawn entity, player is nil.=Impossibile generare l'entità, il giocatore è nil. +Unable to spawn entity, player is nil.=Impossibile generare l'entità, lə giocatore è nil. Cannot spawn an unknown entity.=Impossibile generare un'entità sconosciuta. Invalid parameters (@1).=Parametri non validi (@1). @1 spawned.=Generata entità @1. @1 failed to spawn.=Errore nel generare @1 Destroy item in hand=Distrugge l'oggetto in mano -Unable to pulverize, no player.=Impossibile polverizzare, nessun giocatore. +Unable to pulverize, no player.=Impossibile polverizzare, nessunə giocatore. Unable to pulverize, no item in hand.=Impossibile polverizzare, nessun oggetto in mano. An item was pulverized.=Un oggetto è stato polverizzato. [] [] []=[] [] [] -Check who last touched a node or a node near it within the time specified by . Default: range @= 0, seconds @= 86400 @= 24h, limit @= 5. Set to inf for no time limit=Controlla chi è l'ultimo giocatore che ha toccato un nodo o un nodo nelle sue vicinanze, negli ultimi secondi indicati. Di base: raggio @= 0, secondi @= 86400 @= 24h, limite @= 5. +Check who last touched a node or a node near it within the time specified by . Default: range @= 0, seconds @= 86400 @= 24h, limit @= 5. Set to inf for no time limit=Controlla chi è l'ultimə giocatore che ha toccato un nodo o un nodo nelle sue vicinanze, negli ultimi secondi indicati. Di base: raggio @= 0, secondi @= 86400 @= 24h, limite @= 5. Rollback functions are disabled.=Le funzioni di rollback sono disabilitate. That limit is too high!=Il limite è troppo alto! Checking @1 ...=Controllando @1 ... -Nobody has touched the specified location in @1 seconds.=Nessuno ha toccato il punto specificato negli ultimi @1 secondi. +Nobody has touched the specified location in @1 seconds.=Nessunə ha toccato il punto specificato negli ultimi @1 secondi. @1 @2 @3 -> @4 @5 seconds ago.=@1 @2 @3 -> @4 @5 secondi fa. Punch a node (range@=@1, seconds@=@2, limit@=@3).=Colpisce un nodo (raggio@=@1, secondi@=@2, limite@=@3) ( []) | (: [])=( []) | (: []) -Revert actions of a player. Default for is 60. Set to inf for no time limit=Riavvolge le azioni di un giocatore. Di base, è 60. Imposta a inf per nessun limite di tempo +Revert actions of a player. Default for is 60. Set to inf for no time limit=Riavvolge le azioni di unə giocatore. Di base, è 60. Imposta a inf per nessun limite di tempo Invalid parameters. See /help rollback and /help rollback_check.=Parametri non validi. Vedi /help rollback e /help rollback_check. -Reverting actions of player '@1' since @2 seconds.=Riavvolge le azioni del giocatore '@1' avvenute negli ultimi @2 secondi. +Reverting actions of player '@1' since @2 seconds.=Riavvolge le azioni dellə giocatore '@1' avvenute negli ultimi @2 secondi. Reverting actions of @1 since @2 seconds.=Riavvolge le azioni di @1 avvenute negli ultimi @2 secondi. -(log is too long to show)=(il log è troppo lungo per essere mostrato) +(log is too long to show)=(lo storico è troppo lungo per essere mostrato) Reverting actions succeeded.=Riavvolgimento azioni avvenuto con successo. Reverting actions FAILED.=Errore nel riavvolgere le azioni. Show server status=Mostra lo stato del server @@ -140,68 +141,68 @@ This command was disabled by a mod or game.=Questo comando è stato disabilitato Show or set time of day=Mostra o imposta l'orario della giornata Current time is @1:@2.=Orario corrente: @1:@2. You don't have permission to run this command (missing privilege: @1).=Non hai il permesso di eseguire questo comando (privilegio mancante: @1) -Invalid time (must be between 0 and 24000).= +Invalid time (must be between 0 and 24000).=Orario non valido (deve essere tra 0 e 24000). Time of day changed.=Orario della giornata cambiato. Invalid hour (must be between 0 and 23 inclusive).=Ora non valida (deve essere tra 0 e 23 inclusi) Invalid minute (must be between 0 and 59 inclusive).=Minuto non valido (deve essere tra 0 e 59 inclusi) Show day count since world creation=Mostra il conteggio dei giorni da quando il mondo è stato creato Current day is @1.=Giorno attuale: @1. -[ | -1] [-r] []= -Shutdown server (-1 cancels a delayed shutdown, -r allows players to reconnect)= +[ | -1] [-r] []=[ | -1] [-r] [] +Shutdown server (-1 cancels a delayed shutdown, -r allows players to reconnect)=Arresta il server (-1 cancella un arresto programmato, -r permette allɜ giocatori di riconnettersi) Server shutting down (operator request).=Arresto del server in corso (per richiesta dell'operatore) -Ban the IP of a player or show the ban list=Bandisce l'IP del giocatore o mostra la lista di quelli banditi -The ban list is empty.=La lista banditi è vuota. -Ban list: @1=Lista banditi: @1 -You cannot ban players in singleplayer!= -Player is not online.=Il giocatore non è connesso. -Failed to ban player.=Errore nel bandire il giocatore. +Ban the IP of a player or show the ban list=Bandisce l'IP dellə giocatore o mostra la lista di quellɜ banditɜ +The ban list is empty.=La lista banditɜ è vuota. +Ban list: @1=Lista banditɜ: @1 +You cannot ban players in singleplayer!=Non puoi bandire giocatori in locale! +Player is not online.=Lə giocatore non è connessə. +Failed to ban player.=Errore nel bandire lə giocatore. Banned @1.=@1 banditǝ. | = | -Remove IP ban belonging to a player/IP=Perdona l'IP appartenente a un giocatore/IP -Failed to unban player/IP.=Errore nel perdonare il giocatore/IP +Remove IP ban belonging to a player/IP=Perdona l'IP appartenente a unə giocatore/IP +Failed to unban player/IP.=Errore nel perdonare lə giocatore/IP Unbanned @1.=@1 perdonatǝ []= [] -Kick a player=Caccia un giocatore -Failed to kick player @1.=Errore nel cacciare il giocatore @1. +Kick a player=Caccia unə giocatore +Failed to kick player @1.=Errore nel cacciare lə giocatore @1. Kicked @1.=@1 cacciatǝ. [full | quick]=[full | quick] Clear all objects in world=Elimina tutti gli oggetti/entità nel mondo Invalid usage, see /help clearobjects.=Uso incorretto, vedi /help clearobjects. -Clearing all objects. This may take a long time. You may experience a timeout. (by @1)=Eliminando tutti gli oggetti/entità. Questo potrebbe richiedere molto tempo e farti eventualmente crashare. (di @1) +Clearing all objects. This may take a long time. You may experience a timeout. (by @1)=Eliminando tutti gli oggetti/entità. Questo potrebbe richiedere molto tempo e farti disconnettere. (di @1) Cleared all objects.=Tutti gli oggetti sono stati eliminati. = -Send a direct message to a player=Invia un messaggio privato al giocatore +Send a direct message to a player=Invia un messaggio privato a unə giocatore Invalid usage, see /help msg.=Uso incorretto, vedi /help msg -The player @1 is not online.=Il giocatore @1 non è connesso. +The player @1 is not online.=Lə giocatore @1 non è connessə. DM from @1: @2=Messaggio privato da @1: @2 Message sent.=Messaggio inviato. -Get the last login time of a player or yourself=Ritorna l'ultimo accesso di un giocatore o di te stessǝ -@1's last login time was @2.=L'ultimo accesso di @1 è avvenuto il @2 -@1's last login time is unknown.=L'ultimo accesso di @1 non è conosciuto -Clear the inventory of yourself or another player=Svuota l'inventario tuo o di un altro giocatore -You don't have permission to clear another player's inventory (missing privilege: @1).=Non hai il permesso di svuotare l'inventario di un altro giocatore (privilegio mancante: @1). +Get the last login time of a player or yourself=Ritorna l'ultimo accesso di unə giocatore o di te stessǝ +@1's last login time was @2.=L'ultimo accesso di @1 è avvenuto il @2. +@1's last login time is unknown.=L'ultimo accesso di @1 è ignoto. +Clear the inventory of yourself or another player=Svuota l'inventario tuo o di un*altrə giocatore +You don't have permission to clear another player's inventory (missing privilege: @1).=Non hai il permesso di svuotare l'inventario di un*altrə giocatore (privilegio mancante: @1). @1 cleared your inventory.=@1 ha svuotato il tuo inventario. Cleared @1's inventory.=L'inventario di @1 è stato svuotato. -Player must be online to clear inventory!=Il giocatore deve essere connesso per svuotarne l'inventario! -Players can't be killed, damage has been disabled.=I giocatori non possono essere uccisi, il danno è disabilitato. -Player @1 is not online.=Il giocatore @1 non è connesso. +Player must be online to clear inventory!=Lə giocatore deve essere connessə per svuotarne l'inventario! +Players can't be killed, damage has been disabled.=Lɜ giocatori non possono essere uccisɜ, il danno è disabilitato. +Player @1 is not online.=Lə giocatore @1 non è connesso. You are already dead.=Sei già mortǝ. @1 is already dead.=@1 è già mortǝ. @1 has been killed.=@1 è stato uccisǝ. -Kill player or yourself=Uccide un giocatore o te stessǝ -Invalid parameters (see /help @1).= -Too many arguments, try using just /help = +Kill player or yourself=Uccide unə giocatore o te stessǝ +Invalid parameters (see /help @1).=Parametri non validi (vedi /help @1) +Too many arguments, try using just /help =Troppi argomenti, prova a usare /help Available commands: @1=Comandi disponibili: @1 Use '/help ' to get more information, or '/help all' to list everything.=Usa '/help ' per ottenere più informazioni, o '/help all' per elencare tutti i comandi. Available commands:=Comandi disponibili: Command not available: @1=Comando non disponibile: @1 -[all | privs | ] [-t]= -Get help for commands or list privileges (-t: output in chat)= +[all | privs | ] [-t]=[all | privs | ] [-t] +Get help for commands or list privileges (-t: output in chat)=Richiama la finestra d'aiuto dei comandi o dei privilegi (-t: mostra in chat) Available privileges:=Privilegi disponibili: Command=Comando Parameters=Parametri For more information, click on any entry in the list.=Per più informazioni, clicca su una qualsiasi voce dell'elenco. -Double-click to copy the entry to the chat history.=Doppio click per copiare la voce nella cronologia della chat. +Double-click to copy the entry to the chat history.=Doppio clic per copiare la voce nella cronologia della chat. Command: @1 @2=Comando: @1 @2 Available commands: (see also: /help )=Comandi disponibili: (vedi anche /help ) Close=Chiudi @@ -209,52 +210,38 @@ Privilege=Privilegio Description=Descrizione print [] | dump [] | save [ []] | reset=print [] | dump [] | save [ []] | reset Handle the profiler and profiling data=Gestisce il profiler e i dati da esso elaborati -Statistics written to action log.=Statistiche scritte nel log delle azioni. +Statistics written to action log.=Statistiche scritte nel registro delle azioni. Statistics were reset.=Le statistiche sono state resettate. Usage: @1=Utilizzo: @1 Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).=I formati supportati sono txt, csv, lua, json e json_pretty (le strutture potrebbero essere soggetti a cambiamenti). -@1 joined the game.= -@1 left the game.= -@1 left the game (timed out).= +@1 joined the game.=@1 si è connessə. +@1 left the game.=@1 si è disconnessə. +@1 left the game (timed out).=@1 si è disconnessə (connessione scaduta). (no description)=(nessuna descrizione) Can interact with things and modify the world=Si può interagire con le cose e modificare il mondo Can speak in chat=Si può parlare in chat -Can modify basic privileges (@1)= +Can modify basic privileges (@1)=Si possono modificare i privilegi di base (@1) Can modify privileges=Si possono modificare i privilegi Can teleport self=Si può teletrasportare se stessз -Can teleport other players=Si possono teletrasportare gli altri giocatori +Can teleport other players=Si possono teletrasportare lɜ altrɜ giocatori Can set the time of day using /time=Si può impostate l'orario della giornata tramite /time Can do server maintenance stuff=Si possono eseguire operazioni di manutenzione del server Can bypass node protection in the world=Si può aggirare la protezione dei nodi nel mondo -Can ban and unban players=Si possono bandire e perdonare i giocatori -Can kick players=Si possono cacciare i giocatori +Can ban and unban players=Si possono bandire e perdonare lɜ giocatori +Can kick players=Si possono cacciare lɜ giocatori Can use /give and /giveme=Si possono usare /give e /give me Can use /setpassword and /clearpassword=Si possono usare /setpassword e /clearpassword Can use fly mode=Si può usare la modalità volo Can use fast mode=Si può usare la modalità rapida Can fly through solid nodes using noclip mode=Si può volare attraverso i nodi solidi con la modalità incorporea Can use the rollback functionality=Si può usare la funzione di rollback -Can enable wireframe= +Can enable wireframe=Si può abilitare la vista reticolata Unknown Item=Oggetto sconosciuto Air=Aria Ignore=Ignora You can't place 'ignore' nodes!=Non puoi piazzare nodi 'ignore'! -Values below show absolute/relative times spend per server step by the instrumented function.= -A total of @1 sample(s) were taken.= -The output is limited to '@1'.= -Saving of profile failed: @1= -Profile saved to @1= - - -##### not used anymore ##### - -Set player's password=Imposta la password del giocatore -Invalid time.=Orario non valido. -[all | privs | ]=[all | privs | ] -Get help for commands or list privileges=Richiama la finestra d'aiuto dei comandi o dei privilegi -Allows enabling various debug options that may affect gameplay=Permette di abilitare varie opzioni di debug che potrebbero influenzare l'esperienza di gioco -[ | -1] [reconnect] []=[ | -1] [reconnect] [] -Shutdown server (-1 cancels a delayed shutdown)=Arresta il server (-1 annulla un arresto programmato) - ( | all)= ( | all) - | all= | all -Can modify 'shout' and 'interact' privileges=Si possono modificare i privilegi 'shout' e 'interact' +Values below show absolute/relative times spend per server step by the instrumented function.=I valori sottostanti mostrano i tempi assoluti/relativi impiegati su ogni singolo step dalla funzione analizzata +A total of @1 sample(s) were taken.=Son stati ottenuti campioni per un totale di @1. +The output is limited to '@1'.=L'output è limitato a '@1'. +Saving of profile failed: @1=Errore nel salvare il profilo: @1 +Profile saved to @1=Profilo salvato in @1 diff --git a/builtin/mainmenu/content/dlg_contentstore.lua b/builtin/mainmenu/content/dlg_contentstore.lua index fa8f0b85c..e567fcef7 100644 --- a/builtin/mainmenu/content/dlg_contentstore.lua +++ b/builtin/mainmenu/content/dlg_contentstore.lua @@ -695,10 +695,11 @@ local function resolve_auto_install_spec() return nil end + local spec = store.aliases[auto_install_spec] or auto_install_spec local resolved = nil for _, pkg in ipairs(store.packages_full_unordered) do - if pkg.id == auto_install_spec then + if pkg.id == spec then resolved = pkg break end diff --git a/builtin/mainmenu/tab_about.lua b/builtin/mainmenu/tab_about.lua index c79a498ce..8c5573399 100644 --- a/builtin/mainmenu/tab_about.lua +++ b/builtin/mainmenu/tab_about.lua @@ -27,9 +27,9 @@ local core_developers = { "Krock/SmallJoker ", "Lars Hofhansl ", "v-rob ", - "Hugues Ross ", - "Dmitry Kostenko (x2048) ", - "Desour", + "Desour/DS", + "srifqi", + "Gregor Parzefall (grorp)", } -- currently only https://github.com/orgs/minetest/teams/triagers/members @@ -43,18 +43,19 @@ local core_team = { -- For updating active/previous contributors, see the script in ./util/gather_git_credits.py local active_contributors = { - "Wuzzy [Features, translations, devtest]", - "Lars Müller [Bugfixes and entity features]", - "paradust7 [Bugfixes]", - "ROllerozxa [Bugfixes, Android]", - "srifqi [Android, translations]", - "Lexi Hale [Particlespawner animation]", + "Wuzzy [Features, translations, documentation]", + "numzero [Optimizations, work on OpenGL driver]", + "ROllerozxa [Bugfixes, Mainmenu]", + "Lars Müller [Bugfixes]", + "AFCMS [Documentation]", "savilli [Bugfixes]", "fluxionary [Bugfixes]", - "Gregor Parzefall [Bugfixes]", + "Bradley Pierce (Thresher) [Documentation]", + "Stvk imension [Android]", + "JosiahWI [Code cleanups]", + "OgelGames [UI, Bugfixes]", + "ndren [Bugfixes]", "Abdou-31 [Documentation]", - "pecksin [Bouncy physics]", - "Daroc Alden [Fixes]", } local previous_core_developers = { @@ -75,13 +76,14 @@ local previous_core_developers = { "Pierre-Yves Rollo ", "hecks", "Jude Melton-Houghton (TurkeyMcMac) [RIP]", + "Hugues Ross ", + "Dmitry Kostenko (x2048) ", } local previous_contributors = { "Nils Dagsson Moskopp (erlehmann) [Minetest logo]", "red-001 ", "Giuseppe Bilotta", - "numzero", "HybridDog", "ClobberXD", "Dániel Juhász (juhdanad) ", @@ -126,12 +128,6 @@ return { } table.insert_all(hypertext, { - "\n", - "The 5.7.0 release is dedicated to the memory of\n", - "Minetest developer Jude Melton-Houghton (TurkeyMcMac)\n", - "who died on February 1, 2023.\n", - "Our thoughts are with his family and friends.\n", - "\n", "", fgettext_ne("Core Developers"), "\n", }) prepare_credits(hypertext, core_developers) diff --git a/src/gui/guiEngine.cpp b/src/gui/guiEngine.cpp index 64b2e9fa5..fd1121346 100644 --- a/src/gui/guiEngine.cpp +++ b/src/gui/guiEngine.cpp @@ -283,11 +283,16 @@ void GUIEngine::run() else drawBackground(driver); - drawHeader(driver); drawFooter(driver); m_rendering_engine->get_gui_env()->drawAll(); + // The header *must* be drawn after the menu because it uses + // GUIFormspecMenu::getAbsoluteRect(). + // The header *can* be drawn after the menu because it never intersects + // the menu. + drawHeader(driver); + driver->endScene(); IrrlichtDevice *device = m_rendering_engine->get_raw_device(); @@ -478,29 +483,56 @@ void GUIEngine::drawHeader(video::IVideoDriver *driver) video::ITexture* texture = m_textures[TEX_LAYER_HEADER].texture; - /* If no texture, draw nothing */ - if(!texture) + // If no texture, draw nothing + if (!texture) return; + /* + * Calculate the maximum rectangle + */ + core::rect formspec_rect = m_menu->getAbsoluteRect(); + // 4 px of padding on each side + core::rect max_rect(4, 4, screensize.Width - 8, formspec_rect.UpperLeftCorner.Y - 8); + + // If no space (less than 16x16 px), draw nothing + if (max_rect.getWidth() < 16 || max_rect.getHeight() < 16) + return; + + /* + * Calculate the preferred rectangle + */ f32 mult = (((f32)screensize.Width / 2.0)) / ((f32)texture->getOriginalSize().Width); v2s32 splashsize(((f32)texture->getOriginalSize().Width) * mult, ((f32)texture->getOriginalSize().Height) * mult); - // Don't draw the header if there isn't enough room s32 free_space = (((s32)screensize.Height)-320)/2; - if (free_space > splashsize.Y) { - core::rect splashrect(0, 0, splashsize.X, splashsize.Y); - splashrect += v2s32((screensize.Width/2)-(splashsize.X/2), - ((free_space/2)-splashsize.Y/2)+10); + core::rect desired_rect(0, 0, splashsize.X, splashsize.Y); + desired_rect += v2s32((screensize.Width/2)-(splashsize.X/2), + ((free_space/2)-splashsize.Y/2)+10); - draw2DImageFilterScaled(driver, texture, splashrect, + /* + * Make the preferred rectangle fit into the maximum rectangle + */ + // 1. Scale + f32 scale = std::min((f32)max_rect.getWidth() / (f32)desired_rect.getWidth(), + (f32)max_rect.getHeight() / (f32)desired_rect.getHeight()); + if (scale < 1.0f) { + v2s32 old_center = desired_rect.getCenter(); + desired_rect.LowerRightCorner.X = desired_rect.UpperLeftCorner.X + desired_rect.getWidth() * scale; + desired_rect.LowerRightCorner.Y = desired_rect.UpperLeftCorner.Y + desired_rect.getHeight() * scale; + desired_rect += old_center - desired_rect.getCenter(); + } + + // 2. Move + desired_rect.constrainTo(max_rect); + + draw2DImageFilterScaled(driver, texture, desired_rect, core::rect(core::position2d(0,0), core::dimension2di(texture->getOriginalSize())), NULL, NULL, true); - } } /******************************************************************************/ diff --git a/src/gui/guiFormSpecMenu.cpp b/src/gui/guiFormSpecMenu.cpp index a51a02669..84ade453f 100644 --- a/src/gui/guiFormSpecMenu.cpp +++ b/src/gui/guiFormSpecMenu.cpp @@ -247,6 +247,14 @@ std::vector* GUIFormSpecMenu::getDropDownValues(const std::string & return NULL; } +// This will only return a meaningful value if called after drawMenu(). +core::rect GUIFormSpecMenu::getAbsoluteRect() +{ + core::rect rect = AbsoluteRect; + rect.UpperLeftCorner.Y += m_tabheader_upper_edge; + return rect; +} + v2s32 GUIFormSpecMenu::getElementBasePos(const std::vector *v_pos) { v2f32 pos_f = v2f32(padding.X, padding.Y) + pos_offset * spacing; @@ -2104,6 +2112,7 @@ void GUIFormSpecMenu::parseTabHeader(parserData* data, const std::string &elemen e->setActiveTab(tab_index); m_fields.push_back(spec); + m_tabheader_upper_edge = MYMIN(m_tabheader_upper_edge, rect.UpperLeftCorner.Y); } void GUIFormSpecMenu::parseItemImageButton(parserData* data, const std::string &element) @@ -3105,6 +3114,7 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) m_formspec_version = 1; m_bgcolor = video::SColor(140, 0, 0, 0); + m_tabheader_upper_edge = 0; { v3f formspec_bgcolor = g_settings->getV3F("formspec_fullscreen_bg_color"); @@ -3633,7 +3643,7 @@ void GUIFormSpecMenu::drawMenu() NULL, m_client, IT_ROT_HOVERED); } -/* TODO find way to show tooltips on touchscreen */ + // On touchscreens, m_pointer is set by GUIModalMenu::preprocessEvent instead. #ifndef HAVE_TOUCHSCREENGUI m_pointer = RenderingEngine::get_raw_device()->getCursorControl()->getPosition(); #endif @@ -4190,14 +4200,16 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) } /* Mouse event other than movement, or crossing the border of inventory - field while holding left, right, or middle mouse button + field while holding left, right, or middle mouse button + or touch event (for touch screen devices) */ - if (event.EventType == EET_MOUSE_INPUT_EVENT && - (event.MouseInput.Event != EMIE_MOUSE_MOVED || - ((event.MouseInput.isLeftPressed() || - event.MouseInput.isRightPressed() || - event.MouseInput.isMiddlePressed()) && - getItemAtPos(m_pointer).i != getItemAtPos(m_old_pointer).i))) { + if ((event.EventType == EET_MOUSE_INPUT_EVENT && + (event.MouseInput.Event != EMIE_MOUSE_MOVED || + ((event.MouseInput.isLeftPressed() || + event.MouseInput.isRightPressed() || + event.MouseInput.isMiddlePressed()) && + getItemAtPos(m_pointer).i != getItemAtPos(m_old_pointer).i))) || + event.EventType == EET_TOUCH_INPUT_EVENT) { // Get selected item and hovered/clicked item (s) @@ -4266,37 +4278,50 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) ButtonEventType button = BET_OTHER; ButtonEventType updown = BET_OTHER; - switch (event.MouseInput.Event) { - case EMIE_LMOUSE_PRESSED_DOWN: - button = BET_LEFT; updown = BET_DOWN; - break; - case EMIE_RMOUSE_PRESSED_DOWN: - button = BET_RIGHT; updown = BET_DOWN; - break; - case EMIE_MMOUSE_PRESSED_DOWN: - button = BET_MIDDLE; updown = BET_DOWN; - break; - case EMIE_MOUSE_WHEEL: - button = (event.MouseInput.Wheel > 0) ? - BET_WHEEL_UP : BET_WHEEL_DOWN; - updown = BET_DOWN; - break; - case EMIE_LMOUSE_LEFT_UP: - button = BET_LEFT; updown = BET_UP; - break; - case EMIE_RMOUSE_LEFT_UP: - button = BET_RIGHT; updown = BET_UP; - break; - case EMIE_MMOUSE_LEFT_UP: - button = BET_MIDDLE; updown = BET_UP; - break; - case EMIE_MOUSE_MOVED: - updown = BET_MOVE; - break; - default: - break; + bool mouse_shift = false; + if (event.EventType == EET_MOUSE_INPUT_EVENT) { + mouse_shift = event.MouseInput.Shift; + switch (event.MouseInput.Event) { + case EMIE_LMOUSE_PRESSED_DOWN: + button = BET_LEFT; updown = BET_DOWN; + break; + case EMIE_RMOUSE_PRESSED_DOWN: + button = BET_RIGHT; updown = BET_DOWN; + break; + case EMIE_MMOUSE_PRESSED_DOWN: + button = BET_MIDDLE; updown = BET_DOWN; + break; + case EMIE_MOUSE_WHEEL: + button = (event.MouseInput.Wheel > 0) ? + BET_WHEEL_UP : BET_WHEEL_DOWN; + updown = BET_DOWN; + break; + case EMIE_LMOUSE_LEFT_UP: + button = BET_LEFT; updown = BET_UP; + break; + case EMIE_RMOUSE_LEFT_UP: + button = BET_RIGHT; updown = BET_UP; + break; + case EMIE_MMOUSE_LEFT_UP: + button = BET_MIDDLE; updown = BET_UP; + break; + case EMIE_MOUSE_MOVED: + updown = BET_MOVE; + break; + default: + break; + } } +#ifdef HAVE_TOUCHSCREENGUI + // The second touch (see GUIModalMenu::preprocessEvent() function) + ButtonEventType touch = BET_OTHER; + if (event.EventType == EET_TOUCH_INPUT_EVENT) { + if (event.TouchInput.Event == ETIE_LEFT_UP) + touch = BET_RIGHT; + } +#endif + // Set this number to a positive value to generate a move action // from m_selected_item to s. u32 move_amount = 0; @@ -4322,6 +4347,7 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) if (m_held_mouse_button != BET_OTHER) break; + if (button == BET_LEFT || button == BET_RIGHT || button == BET_MIDDLE) m_held_mouse_button = button; @@ -4341,13 +4367,13 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) // Craft preview has been clicked: craft if (button == BET_MIDDLE) craft_amount = 10; - else if (event.MouseInput.Shift && button == BET_LEFT) + else if (mouse_shift && button == BET_LEFT) craft_amount = list_s->getItem(s.i).getStackMax(m_client->idef()); else craft_amount = 1; // Holding shift moves the crafted item to the inventory - m_shift_move_after_craft = event.MouseInput.Shift; + m_shift_move_after_craft = mouse_shift; } else if (!m_selected_item && button != BET_WHEEL_UP && !empty) { // Non-empty stack has been clicked: select or shift-move it @@ -4361,7 +4387,7 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) else if (button == BET_LEFT) count = s_count; - if (event.MouseInput.Shift) { + if (mouse_shift) { // Shift pressed: move item, right click moves 1 shift_move_amount = button == BET_RIGHT ? 1 : count; } else { @@ -4382,7 +4408,7 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) else if (button == BET_LEFT) move_amount = m_selected_amount; - if (event.MouseInput.Shift && !identical && matching) { + if (mouse_shift && !identical && matching) { // Shift-move all items the same as the selected item to the next list move_amount = 0; @@ -4520,7 +4546,7 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) if (!s.isValid() || s.listname == "craftpreview") break; - if (!m_selected_item && event.MouseInput.Shift) { + if (!m_selected_item && mouse_shift) { // Shift-move items while dragging if (m_held_mouse_button == BET_RIGHT) shift_move_amount = 1; @@ -4570,7 +4596,8 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) case BET_OTHER: { // Some other mouse event has occured // Currently only left-double-click should trigger this - if (!s.isValid() || event.MouseInput.Event != EMIE_LMOUSE_DOUBLE_CLICK) + if (!s.isValid() || event.EventType != EET_MOUSE_INPUT_EVENT || + event.MouseInput.Event != EMIE_LMOUSE_DOUBLE_CLICK) break; // Only do the pickup all thing when putting down an item. @@ -4638,6 +4665,28 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) break; } +#ifdef HAVE_TOUCHSCREENGUI + if (touch == BET_RIGHT && m_selected_item && !m_left_dragging) { + if (!s.isValid()) { + // Not a valid slot + if (!getAbsoluteClippingRect().isPointInside(m_pointer)) + // Is outside the menu + drop_amount = 1; + } else { + // Over a valid slot + move_amount = 1; + if (identical) { + // Change the selected amount instead of moving + if (move_amount >= m_selected_amount) + m_selected_amount = 0; + else + m_selected_amount -= move_amount; + move_amount = 0; + } + } + } +#endif + // Update left-dragged slots if (m_left_dragging && m_left_drag_stacks.size() > 1) { // The split amount will always at least one, because the number @@ -5004,6 +5053,11 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event) } } +#ifdef HAVE_TOUCHSCREENGUI + if (m_second_touch) + return true; // Stop propagating the event +#endif + return Parent ? Parent->OnEvent(event) : false; } diff --git a/src/gui/guiFormSpecMenu.h b/src/gui/guiFormSpecMenu.h index 5641e39a9..eb464747f 100644 --- a/src/gui/guiFormSpecMenu.h +++ b/src/gui/guiFormSpecMenu.h @@ -282,6 +282,9 @@ public: GUITable* getTable(const std::string &tablename); std::vector* getDropDownValues(const std::string &name); + // This will only return a meaningful value if called after drawMenu(). + core::rect getAbsoluteRect(); + #ifdef __ANDROID__ bool getAndroidUIInput(); #endif @@ -499,6 +502,9 @@ private: int m_btn_height; gui::IGUIFont *m_font = nullptr; + + // used by getAbsoluteRect + s32 m_tabheader_upper_edge = 0; }; class FormspecFormSource: public IFormSource diff --git a/src/gui/guiInventoryList.cpp b/src/gui/guiInventoryList.cpp index b84a13290..6f1d28e0b 100644 --- a/src/gui/guiInventoryList.cpp +++ b/src/gui/guiInventoryList.cpp @@ -99,6 +99,7 @@ void GUIInventoryList::draw() (i / m_geom.X) * m_slot_spacing.Y); core::rect rect = imgrect + base_pos + p; ItemStack item = ilist->getItem(item_i); + ItemStack orig_item = item; bool selected = selected_item && m_invmgr->getInventory(selected_item->inventoryloc) == inv @@ -147,13 +148,19 @@ void GUIInventoryList::draw() // Draw item stack drawItemStack(driver, m_font, item, rect, &AbsoluteClippingRect, client, rotation_kind); - // Add hovering tooltip - if (hovering && !selected_item) { - std::string tooltip = item.getDescription(client->idef()); - if (m_fs_menu->doTooltipAppendItemname()) - tooltip += "\n[" + item.name + "]"; - m_fs_menu->addHoveredItemTooltip(tooltip); - } + } + + // Add hovering tooltip + bool show_tooltip = !item.empty() && hovering && !selected_item; +#ifdef HAVE_TOUCHSCREENGUI + // Make it possible to see item tooltips on touchscreens + show_tooltip |= hovering && selected && m_fs_menu->getSelectedAmount() != 0; +#endif + if (show_tooltip) { + std::string tooltip = orig_item.getDescription(client->idef()); + if (m_fs_menu->doTooltipAppendItemname()) + tooltip += "\n[" + orig_item.name + "]"; + m_fs_menu->addHoveredItemTooltip(tooltip); } } diff --git a/src/gui/modalMenu.cpp b/src/gui/modalMenu.cpp index c231f1e72..0f5ec787a 100644 --- a/src/gui/modalMenu.cpp +++ b/src/gui/modalMenu.cpp @@ -278,12 +278,9 @@ bool GUIModalMenu::preprocessEvent(const SEvent &event) irr_ptr holder; holder.grab(this); // keep this alive until return (it might be dropped downstream [?]) - switch ((int)event.TouchInput.touchedCount) { - case 1: { + if (event.TouchInput.ID == 0) { if (event.TouchInput.Event == ETIE_PRESSED_DOWN || event.TouchInput.Event == ETIE_MOVED) m_pointer = v2s32(event.TouchInput.X, event.TouchInput.Y); - if (event.TouchInput.Event == ETIE_PRESSED_DOWN) - m_down_pos = m_pointer; gui::IGUIElement *hovered = Environment->getRootGUIElement()->getElementFromPoint(core::position2d(m_pointer)); if (event.TouchInput.Event == ETIE_PRESSED_DOWN) Environment->setFocus(hovered); @@ -298,26 +295,19 @@ bool GUIModalMenu::preprocessEvent(const SEvent &event) if (event.TouchInput.Event == ETIE_LEFT_UP) leave(); return ret; - } - case 2: { - if (event.TouchInput.Event != ETIE_PRESSED_DOWN) + } else if (event.TouchInput.ID == 1) { + if (event.TouchInput.Event != ETIE_LEFT_UP) return true; // ignore auto focused = Environment->getFocus(); if (!focused) return true; - SEvent rclick_event{}; - rclick_event.EventType = EET_MOUSE_INPUT_EVENT; - rclick_event.MouseInput.Event = EMIE_RMOUSE_PRESSED_DOWN; - rclick_event.MouseInput.ButtonStates = EMBSM_LEFT | EMBSM_RIGHT; - rclick_event.MouseInput.X = m_pointer.X; - rclick_event.MouseInput.Y = m_pointer.Y; - focused->OnEvent(rclick_event); - rclick_event.MouseInput.Event = EMIE_RMOUSE_LEFT_UP; - rclick_event.MouseInput.ButtonStates = EMBSM_LEFT; - focused->OnEvent(rclick_event); + // The second-touch event is propagated as is (not converted). + m_second_touch = true; + focused->OnEvent(event); + m_second_touch = false; return true; - } - default: // ignored + } else { + // Any other touch after the second touch is ignored. return true; } } diff --git a/src/gui/modalMenu.h b/src/gui/modalMenu.h index e37c41533..f811bafc9 100644 --- a/src/gui/modalMenu.h +++ b/src/gui/modalMenu.h @@ -77,7 +77,8 @@ protected: std::string m_jni_field_name; #endif #ifdef HAVE_TOUCHSCREENGUI - v2s32 m_down_pos; + // This is set to true if the menu is currently processing a second-touch event. + bool m_second_touch = false; bool m_touchscreen_visible = true; #endif diff --git a/util/gather_git_credits.py b/util/gather_git_credits.py index 1b2865182..7bbcf402d 100755 --- a/util/gather_git_credits.py +++ b/util/gather_git_credits.py @@ -6,7 +6,7 @@ from collections import defaultdict codefiles = r"(\.[ch](pp)?|\.lua|\.md|\.cmake|\.java|\.gradle|Makefile|CMakeLists\.txt)$" # two minor versions back, for "Active Contributors" -REVS_ACTIVE = "5.2.0..HEAD" +REVS_ACTIVE = "5.6.0..HEAD" # all time, for "Previous Contributors" REVS_PREVIOUS = "HEAD"