diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
index d936e4b346..9076c9ac22 100644
--- a/android/AndroidManifest.xml
+++ b/android/AndroidManifest.xml
@@ -25,6 +25,7 @@
android:label="@string/app_name"
android:screenOrientation="user"
android:exported="true"
+ android:launchMode="singleTask"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout">
@@ -39,6 +40,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/src/mindustry/android/AndroidLauncher.java b/android/src/mindustry/android/AndroidLauncher.java
index 0c9143dc42..dcb356517c 100644
--- a/android/src/mindustry/android/AndroidLauncher.java
+++ b/android/src/mindustry/android/AndroidLauncher.java
@@ -16,8 +16,7 @@ import arc.struct.*;
import arc.util.*;
import dalvik.system.*;
import mindustry.*;
-import mindustry.game.Saves.*;
-import mindustry.io.*;
+import mindustry.game.EventType.*;
import mindustry.net.*;
import mindustry.ui.*;
import mindustry.ui.FileChooser.*;
@@ -221,7 +220,9 @@ public class AndroidLauncher extends AndroidApplication{
useImmersiveMode = true;
hideStatusBar = true;
}});
- checkFiles(getIntent());
+
+ var intent = getIntent();
+ Events.on(ClientLoadEvent.class, u -> handleIntent(intent));
try{
//new external folder
@@ -279,54 +280,45 @@ public class AndroidLauncher extends AndroidApplication{
}
}
- private void checkFiles(Intent intent){
+ @Override
+ protected void onNewIntent(Intent intent){
+ super.onNewIntent(intent);
+
+ handleIntent(intent);
+ }
+
+ private void handleIntent(Intent intent){
+ if(intent == null) return;
+
try{
Uri uri = intent.getData();
if(uri != null){
- File myFile = null;
String scheme = uri.getScheme();
- if(scheme.equals("file")){
- String fileName = uri.getEncodedPath();
- myFile = new File(fileName);
- }else if(!scheme.equals("content")){
- //error
- return;
- }
- boolean save = uri.getPath().endsWith(saveExtension);
- boolean map = uri.getPath().endsWith(mapExtension);
- InputStream inStream;
- if(myFile != null) inStream = new FileInputStream(myFile);
- else inStream = getContentResolver().openInputStream(uri);
- Core.app.post(() -> Core.app.post(() -> {
- if(save){ //open save
- System.out.println("Opening save.");
- Fi file = Core.files.local("temp-save." + saveExtension);
- file.write(inStream, false);
- if(SaveIO.isSaveValid(file)){
- try{
- SaveSlot slot = control.saves.importSave(file);
- ui.load.runLoadSave(slot);
- }catch(IOException e){
- ui.showException("@save.import.fail", e);
- }
- }else{
- ui.showErrorMessage("@save.import.invalid");
- }
- }else if(map){ //open map
- Fi file = Core.files.local("temp-map." + mapExtension);
- file.write(inStream, false);
+
+ //clear data (not sure if necessary?)
+ intent.setAction(Intent.ACTION_MAIN);
+ intent.setData(null);
+ setIntent(intent);
+
+ if("mindustry".equalsIgnoreCase(scheme)){ //open a server URL
+
+ String host = uri.getHost();
+ int port = uri.getPort();
+
+ if(host != null && !host.isEmpty()){
Core.app.post(() -> {
- System.out.println("Opening map.");
- if(!ui.editor.isShown()){
- ui.editor.show();
- }
- ui.editor.beginEditMap(file);
+ ui.showConfirm(Core.bundle.format("servers.connect.confirm", host), () -> ui.join.connect(host, port != -1 ? port : 6567));
});
}
- }));
+ }else{ //open a save file
+ Fi file = Core.files.cache("imported");
+ file.write(getContentResolver().openInputStream(uri), false);
+
+ ClientLauncher.handleFileImport(file);
+ }
}
- }catch(IOException e){
- e.printStackTrace();
+ }catch(Throwable e){
+ Log.err(e);
}
}
diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties
index b0772df891..e2130f93f3 100644
--- a/core/assets/bundles/bundle.properties
+++ b/core/assets/bundles/bundle.properties
@@ -283,6 +283,7 @@ servers.remote = Remote Servers
servers.global = Community Servers
servers.disclaimer = Community servers are [accent]not[] owned or controlled by the developer.\n\nServers may contain user-generated content that is not appropriate for all ages.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Show Hidden Servers
server.shown = Shown
server.hidden = Hidden
diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties
index 68266616b7..3a01f8fd7e 100644
--- a/core/assets/bundles/bundle_be.properties
+++ b/core/assets/bundles/bundle_be.properties
@@ -281,6 +281,7 @@ servers.remote = Выдаленыя серверы
servers.global = Глабальныя серверы
servers.disclaimer = Супольныя Серверы [accent]не[] звязаны або не кантралююцца распрацоўшчыкам.\n\nГэтыя серверы могуць утрымліваць згенераваны карыстальнікамі кантэнт які можа падыйсці не да усіх узростаў.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Паказаць Схаваныя Серверы
server.shown = Бачныя
server.hidden = Схаваныя
diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties
index 01b4678372..cab2c8acac 100644
--- a/core/assets/bundles/bundle_bg.properties
+++ b/core/assets/bundles/bundle_bg.properties
@@ -281,6 +281,7 @@ servers.remote = Отдалечени Сървъри
servers.global = Публични Сървъри
servers.disclaimer = Публичните сървъри [accent]не[] са притежавани от разработчика.\n\nТе може да имат потребителско съдържание неподходящо за всички възрасти.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Покажи Скритите Сървъри
server.shown = Показан
server.hidden = Скрит
diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties
index 39d547d1b9..db0b4c1dd3 100644
--- a/core/assets/bundles/bundle_ca.properties
+++ b/core/assets/bundles/bundle_ca.properties
@@ -281,6 +281,7 @@ servers.remote = Servidors remots
servers.global = Servidors de la comunitat
servers.disclaimer = Els servidors de la comunitat [accent]no[] són ni els controla el desenvolupador.\n\nEls servidors poden tenir continguts generats per usuaris que no són adequats per a totes les edats.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Mostra els servidors ocults
server.shown = Mostra
server.hidden = Amaga
diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties
index 2d8fd8ee44..21f894e000 100644
--- a/core/assets/bundles/bundle_cs.properties
+++ b/core/assets/bundles/bundle_cs.properties
@@ -281,6 +281,7 @@ servers.remote = Vzdálené servery
servers.global = Komunitní servery
servers.disclaimer = Komunitní servery [accent]nejsou[] vlastněny ani kontrolovány vývojářem této hry.\n\nServery mohou obsahovat obsah vytvořený uživateli, který může na některé uživatele působit nepatřičně či nevhodně.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Zobraz skryté servery
server.shown = Zobrazené
server.hidden = Skryté
diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties
index cddb588535..be5588e564 100644
--- a/core/assets/bundles/bundle_da.properties
+++ b/core/assets/bundles/bundle_da.properties
@@ -281,6 +281,7 @@ servers.remote = Afsides Servere
servers.global = Globale Servere
servers.disclaimer = Community servers are [accent]not[] owned or controlled by the developer.\n\nServers may contain user-generated content that is not appropriate for all ages.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Show Hidden Servers
server.shown = Shown
server.hidden = Hidden
diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties
index de0ff2dbd8..59e910d448 100644
--- a/core/assets/bundles/bundle_de.properties
+++ b/core/assets/bundles/bundle_de.properties
@@ -281,6 +281,7 @@ servers.remote = Andere Server
servers.global = Community-Server
servers.disclaimer = Community-Server werden vom Entwickler [accent]nicht[] geprüft.\nSie können Inhalte, die nicht für jedes Alter geeignet sind, enthalten.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Versteckte Server anzeigen
server.shown = Angezeigt
server.hidden = Versteckt
diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties
index 0a6fb2ddfc..ee6f4c82e3 100644
--- a/core/assets/bundles/bundle_es.properties
+++ b/core/assets/bundles/bundle_es.properties
@@ -281,6 +281,7 @@ servers.remote = Servidores remotos
servers.global = Servidores de la comunidad
servers.disclaimer = Los servidores de la comunidad [accent]no[] son propiedad del desarrollador, ni administrados por el mismo.\n\nLos servidores podrían tener contenido generado por los usuarios no apropiado para todas las edades.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Mostrar servidores ocultos
server.shown = Visibles
server.hidden = Ocultos
diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties
index 4ed18ea0b4..91a9901aee 100644
--- a/core/assets/bundles/bundle_et.properties
+++ b/core/assets/bundles/bundle_et.properties
@@ -281,6 +281,7 @@ servers.remote = Remote Servers
servers.global = Community Servers
servers.disclaimer = Community servers are [accent]not[] owned or controlled by the developer.\n\nServers may contain user-generated content that is not appropriate for all ages.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Show Hidden Servers
server.shown = Shown
server.hidden = Hidden
diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties
index 9a9057d4d9..9d6b51dd2c 100644
--- a/core/assets/bundles/bundle_eu.properties
+++ b/core/assets/bundles/bundle_eu.properties
@@ -281,6 +281,7 @@ servers.remote = Urruneko zerbitzariak
servers.global = Komunitatearen zerbitzariak
servers.disclaimer = Komunitatearen zerbitzariak [accent]ez[] ditu garatzaileak kontrolatzen.\n\nZerbitzari hauek erabiltzaileek sortutako edukia izan dezakete, eta ez du zertan adin guztientzat egokia izan behar.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Erakutsi ezkutatutako zerbitzariak
server.shown = Erakutsita
server.hidden = Ezkutatuta
diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties
index 9d99138245..bd94c46ee4 100644
--- a/core/assets/bundles/bundle_fi.properties
+++ b/core/assets/bundles/bundle_fi.properties
@@ -281,6 +281,7 @@ servers.remote = Etäpalvelimet
servers.global = Yhteisön palvelimet
servers.disclaimer = Yhteisön palvelimet [accent]eivät ole[] kehittäjän omistuksessa tai hallinnassa.\n\nPalvelimet voivat sisältää käyttäjien luomaa sisältöä, joka ei sovellu kaikille ikäluokille.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Näytä piilotetut palvelimet
server.shown = Näytetty
server.hidden = Piilotettu
diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties
index bf0f144658..6e486b005c 100644
--- a/core/assets/bundles/bundle_fil.properties
+++ b/core/assets/bundles/bundle_fil.properties
@@ -281,6 +281,7 @@ servers.remote = Remote Servers
servers.global = Server ng Komunidad
servers.disclaimer = Ang mga server ng komunidad ay [accent]hindi pagmamay-ari o kinokontrol[] ng developer.\n\nAng mga Server ay may merong content na user-generated hindi bagay sa lahat ng taon.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Ipakita ang mga tinagong server
server.shown = Ipinapakita
server.hidden = Tinatago
diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties
index 4d47867262..64e4512edd 100644
--- a/core/assets/bundles/bundle_fr.properties
+++ b/core/assets/bundles/bundle_fr.properties
@@ -281,6 +281,7 @@ servers.remote = Serveurs distants
servers.global = Serveurs communautaires
servers.disclaimer = Les serveurs communautaires ne sont [accent]pas[] gérés, ni contrôlés par le développeur.\n\nCes serveurs peuvent contenir du contenu qui ne convient pas à tous les âges.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Montrer les serveurs cachés
server.shown = Visible
server.hidden = Caché
diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties
index 5c6455c700..7c8f5abb63 100644
--- a/core/assets/bundles/bundle_hu.properties
+++ b/core/assets/bundles/bundle_hu.properties
@@ -281,6 +281,7 @@ servers.remote = Távoli kiszolgálók
servers.global = Közösségi kiszolgálók
servers.disclaimer = A közösségi kiszolgálókat [accent]nem[] a fejlesztő birtokolja és ellenőrzi.\n\nA kiszolgálók tartalmazhatnak olyan felhasználók által létrehozott tartalmat, amely nem minden korosztály számára megfelelő.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Rejtett kiszolgálók megjelenítése
server.shown = Látható
server.hidden = Rejtett
diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties
index daeb72f070..096a5b747b 100644
--- a/core/assets/bundles/bundle_id_ID.properties
+++ b/core/assets/bundles/bundle_id_ID.properties
@@ -281,6 +281,7 @@ servers.remote = Server Jarak Jauh
servers.global = Server Komunitas
servers.disclaimer = Server komunitas [accent]tidak[] dimiliki atau diatur oleh pengembang.\n\nServer dapat berisi konten buatan pemain lain yang mungkin tidak sesuai untuk semua umur.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Tampilkan Server Tersembunyi
server.shown = Ditampilkan
server.hidden = Disembunyikan
diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties
index 2086892b53..0bf906cebd 100644
--- a/core/assets/bundles/bundle_it.properties
+++ b/core/assets/bundles/bundle_it.properties
@@ -281,6 +281,7 @@ servers.remote = Server Remoti
servers.global = Server Community
servers.disclaimer = I server della Community [accent]non[] appartengono o sono controllati dallo sviluppatore.\n\nI servers potrebbero contenere del contenuto generato dall'utente che non è appropriato per tutte le età.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Mostra Server Nascosti
server.shown = Visibile
server.hidden = Nascosto
diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties
index 3a50b3484b..b573525910 100644
--- a/core/assets/bundles/bundle_ja.properties
+++ b/core/assets/bundles/bundle_ja.properties
@@ -281,6 +281,7 @@ servers.remote = リモートサーバー
servers.global = コミュニティサーバー
servers.disclaimer = コミュニティサーバーは、[accent]開発者が所有、管理していません。[] \n\nサーバーには全ての年齢層に適さないコンテンツが存在する可能性があります。
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = 非表示のサーバーを表示する
server.shown = 表示
server.hidden = 非表示
diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties
index df5c042bad..25283bcee0 100644
--- a/core/assets/bundles/bundle_ko.properties
+++ b/core/assets/bundles/bundle_ko.properties
@@ -281,6 +281,7 @@ servers.remote = 원격 서버
servers.global = 커뮤니티 서버
servers.disclaimer = 커뮤니티 서버는 개발자가 소유하거나 제어하지 [accent]않습니다[].\n\n일부 서버는 전연령대에 적합하지 않은 사용자 지정 콘텐츠를 보유할 수도 있습니다.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = 숨겨진 서버 보이기/숨기기
server.shown = 서버 숨기기
server.hidden = 서버 보이기
diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties
index 4c1dda2cad..a11f8b37e1 100644
--- a/core/assets/bundles/bundle_lt.properties
+++ b/core/assets/bundles/bundle_lt.properties
@@ -281,6 +281,7 @@ servers.remote = Nuotoliniai Serveriai
servers.global = Globalūs Serveriai
servers.disclaimer = Community servers are [accent]not[] owned or controlled by the developer.\n\nServers may contain user-generated content that is not appropriate for all ages.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Rodyti paslėtus serverius
server.shown = Rodoma
server.hidden = Paslėpta
diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties
index ff7da7dc2b..4e38419e42 100644
--- a/core/assets/bundles/bundle_nl.properties
+++ b/core/assets/bundles/bundle_nl.properties
@@ -281,6 +281,7 @@ servers.remote = Externe servers
servers.global = Community Servers
servers.disclaimer = Community servers zijn [accent]niet[] in bezit of worden controlleerd door de ontwikkelaar.\n\nServers kunnen door gebruikers gegenereerde inhoud bevatten die niet geschikt is voor alle leeftijden.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Toon Verborgen Servers
server.shown = Weergegeven
server.hidden = Verborgen
diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties
index ccc6bb2e36..64bce4c126 100644
--- a/core/assets/bundles/bundle_nl_BE.properties
+++ b/core/assets/bundles/bundle_nl_BE.properties
@@ -281,6 +281,7 @@ servers.remote = Remote Servers
servers.global = Community Servers
servers.disclaimer = Community servers are [accent]not[] owned or controlled by the developer.\n\nServers may contain user-generated content that is not appropriate for all ages.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Show Hidden Servers
server.shown = Shown
server.hidden = Hidden
diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties
index f7577a1143..6b6278a634 100644
--- a/core/assets/bundles/bundle_pl.properties
+++ b/core/assets/bundles/bundle_pl.properties
@@ -281,6 +281,7 @@ servers.remote = Serwery Zdalne
servers.global = Serwery Publiczne
servers.disclaimer = Serwery społeczności [accent]nie są[] w posiadaniu ani nie moderuje nimi twórca gry.\n\nSerwery mogą posiadać zawartość stworzoną przez graczy, która może być nieodpowiednia dla wszystkich grup wiekowych.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Pokaż Ukryte Serwery
server.shown = Pokazane
server.hidden = Ukryte
diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties
index d9da19096c..b15fcd7bfc 100644
--- a/core/assets/bundles/bundle_pt_BR.properties
+++ b/core/assets/bundles/bundle_pt_BR.properties
@@ -281,6 +281,7 @@ servers.remote = Servidores Remotos
servers.global = Servidores da Comunidade
servers.disclaimer = Servidores da comunidade [accent]não[] controlados pelo desenvolvedor.\n\nOs servidores podem conter conteúdo não apropriado para todas as idades.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Mostrar servidores ocultos
server.shown = Mostrar
server.hidden = Ocultar
diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties
index 8a6d56b712..81b0c58d29 100644
--- a/core/assets/bundles/bundle_pt_PT.properties
+++ b/core/assets/bundles/bundle_pt_PT.properties
@@ -281,6 +281,7 @@ servers.remote = Servidores Remotos
servers.global = Servidores da Comunidade
servers.disclaimer = Servidores da comunidade [accent]não[] são controlados pelo desenvolvedor.\n\nOs servidores podem conter conteúdo não apropriado para todas as idades.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Mostrar servidores escondidos
server.shown = Mostrar
server.hidden = Esconder
diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties
index 9f37c25191..53f181e1cd 100644
--- a/core/assets/bundles/bundle_ro.properties
+++ b/core/assets/bundles/bundle_ro.properties
@@ -281,6 +281,7 @@ servers.remote = Servere de la Distanță
servers.global = Servere ale Comunității
servers.disclaimer = Serverele comunității [accent]nu[] sunt deținute sau controlate de către dezvoltator.\n\nServerele pot prezenta conținut generat de utilizatori care nu este potrivit tuturor vârstelor.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Vezi Serverele Ascunse
server.shown = Afișate
server.hidden = Ascunse
diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties
index f69daf4a5d..636997cc8e 100644
--- a/core/assets/bundles/bundle_ru.properties
+++ b/core/assets/bundles/bundle_ru.properties
@@ -281,6 +281,7 @@ servers.remote = Удалённые серверы
servers.global = Серверы сообщества
servers.disclaimer = Серверы сообщества [accent]не[] принадлежат разработчику и [accent]не[] контролируются им.\n\nСерверы могут содержать пользовательский контент, который не подходит для всех возрастов.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Отображать скрытые серверы
server.shown = Отображается
server.hidden = Скрыт
diff --git a/core/assets/bundles/bundle_sr.properties b/core/assets/bundles/bundle_sr.properties
index d2518bbf5b..954944ec29 100644
--- a/core/assets/bundles/bundle_sr.properties
+++ b/core/assets/bundles/bundle_sr.properties
@@ -281,6 +281,7 @@ servers.remote = Dalji Serveri
servers.global = Zadružni Serveri
servers.disclaimer = Zadružni serveri [accent]nisu[] pod vlasništvom ili upravljani od strane tvorca igre.\n\nServeri mogu da sadrže sadržaj napravljen od strane korisnika koji nisu prikladni za svakog.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Prikaži Skrivene Servere
server.shown = Prikazano
server.hidden = Skriveno
diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties
index 2e09329f9d..2b9c68f992 100644
--- a/core/assets/bundles/bundle_sv.properties
+++ b/core/assets/bundles/bundle_sv.properties
@@ -281,6 +281,7 @@ servers.remote = Fjärr Servrar
servers.global = Gemenskaps Servrar
servers.disclaimer = Gemenskaps servrar är [accent]inte[] ägda eller kontrollerade av utvecklaren.\n\nServrar kan innehålla användargenererat innehåll som inte är lämpligt för alla åldrar.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Visa Dolda Servrar
server.shown = Visade
server.hidden = Dolda
diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties
index eb52eddab7..f74aac3d2a 100644
--- a/core/assets/bundles/bundle_th.properties
+++ b/core/assets/bundles/bundle_th.properties
@@ -281,6 +281,7 @@ servers.remote = เซิร์ฟเวอร์ทางไกล
servers.global = เซิร์ฟเวอร์ของชุมชน
servers.disclaimer = ผู้พัฒนา[accent]ไม่ได้[]เป็นเจ้าของหรือควบคุมเซิร์ฟเวอร์ของชุมชน\n\nในเซิร์ฟเวอร์อาจมีเนื้อหาของผู้เล่นที่ไม่เหมาะกับทุกเพศทุกวัย
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = แสดงเซิร์ฟเวอร์ที่ซ่อนไว้
server.shown = แสดง
server.hidden = ซ่อน
diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties
index 68b45398dc..47c03a80c2 100644
--- a/core/assets/bundles/bundle_tk.properties
+++ b/core/assets/bundles/bundle_tk.properties
@@ -281,6 +281,7 @@ servers.remote = Remote Servers
servers.global = Community Servers
servers.disclaimer = Community servers are [accent]not[] owned or controlled by the developer.\n\nServers may contain user-generated content that is not appropriate for all ages.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Show Hidden Servers
server.shown = Shown
server.hidden = Hidden
diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties
index f24309c74f..f75e676872 100644
--- a/core/assets/bundles/bundle_tr.properties
+++ b/core/assets/bundles/bundle_tr.properties
@@ -281,6 +281,7 @@ servers.remote = Uzak Sunucular
servers.global = Topluluk Sunucuları
servers.disclaimer = Topluluk Sunucuları, [accent]Yapımcı tarafından yönetilmiyor!\n\nSunucularda, her yaşa uygun olmayan yapı ve içerikler içerebilir!
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Gizli Sunucuları Göster
server.shown = Görünür
server.hidden = Gizli
diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties
index cd42bd96ef..1777a27164 100644
--- a/core/assets/bundles/bundle_uk_UA.properties
+++ b/core/assets/bundles/bundle_uk_UA.properties
@@ -281,6 +281,7 @@ servers.remote = Віддалені сервери
servers.global = Глобальні сервери
servers.disclaimer = Сервери спільноти [accent]не[] належать чи контролюються власником.\n\nСервери можуть містити користувацький вміст, що не підходить для якогось віку.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Показати приховані сервери
server.shown = Показано
server.hidden = Приховано
diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties
index ebae6aa546..ddd502a755 100644
--- a/core/assets/bundles/bundle_vi.properties
+++ b/core/assets/bundles/bundle_vi.properties
@@ -281,6 +281,7 @@ servers.remote = Máy chủ từ xa
servers.global = Máy chủ cộng đồng
servers.disclaimer = Các máy chủ cộng đồng [accent]không[] được sở hữu và kiểm soát bởi nhà phát triển.\n\nMáy chủ có thể chứa nội dung do người dùng tạo và không phù hợp với mọi lứa tuổi.
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = Hiện máy chủ ẩn
server.shown = Đã hiện
server.hidden = Đã ẩn
diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties
index 7fb93ec95d..d600e43690 100644
--- a/core/assets/bundles/bundle_zh_CN.properties
+++ b/core/assets/bundles/bundle_zh_CN.properties
@@ -281,6 +281,7 @@ servers.remote = 远程服务器
servers.global = 社区服务器
servers.disclaimer = 社区服务器[accent]不由开发者拥有或管理[]。\n\n这些服务器可能包含并不适合所有年龄段的玩家生成内容。
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = 显示隐藏服务器
server.shown = 已显示
server.hidden = 已隐藏
diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties
index 8dd97a5358..acdee9f5d9 100644
--- a/core/assets/bundles/bundle_zh_TW.properties
+++ b/core/assets/bundles/bundle_zh_TW.properties
@@ -281,6 +281,7 @@ servers.remote = 遠端伺服器
servers.global = 社群伺服器
servers.disclaimer = 社群伺服器[accent]不是[]由開發者擁有或管理。\n\n伺服器可能會出現由其他玩家製作的不適當內容。
+servers.connect.confirm = Join the following server?\n\n[accent]{0}[]\n\nOnly connect to servers you trust!
servers.showhidden = 顯示被隱藏的伺服器
server.shown = 已顯示
server.hidden = 已隱藏
diff --git a/core/src/mindustry/ClientLauncher.java b/core/src/mindustry/ClientLauncher.java
index ae24e47e64..9aa6fae840 100644
--- a/core/src/mindustry/ClientLauncher.java
+++ b/core/src/mindustry/ClientLauncher.java
@@ -6,11 +6,11 @@ import arc.assets.loaders.*;
import arc.audio.*;
import arc.files.*;
import arc.graphics.*;
+import arc.graphics.Texture.*;
import arc.graphics.g2d.*;
import arc.graphics.gl.*;
import arc.math.*;
import arc.util.*;
-import arc.util.io.*;
import mindustry.ai.*;
import mindustry.audio.*;
import mindustry.core.*;
@@ -26,9 +26,6 @@ import mindustry.mod.*;
import mindustry.net.*;
import mindustry.ui.*;
-import java.io.*;
-import java.util.zip.*;
-
import static arc.Core.*;
import static mindustry.Vars.*;
@@ -182,6 +179,8 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
Fonts.loadModContentIcons();
});
assets.loadRun("baseparts", BaseRegistry.class, () -> {}, () -> bases.load());
+
+ Core.assets.load("sprites/schematic-background.png", Texture.class).loaded = t -> t.setWrap(TextureWrap.repeat);
}
@Override
@@ -307,32 +306,49 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
@Override
public void fileDropped(Fi file){
- if(OS.isIos) return;
+ if(OS.isIos || OS.isAndroid) return;
- if(file.extension().equalsIgnoreCase(saveExtension)){ //open save
+ if(file.extEquals(saveExtension) || file.extEquals(schematicExtension)){
+ handleFileImport(file);
+ }
+ }
+
+ public static void runOnClientLoad(Runnable run){
+ if(clientLoaded){
+ run.run();
+ }else{
+ Events.on(ClientLoadEvent.class, e -> run.run());
+ }
+ }
+
+ /** Can be called from any thread. The file must exist and not have any permission nonsense guarding it. */
+ public static void handleFileImport(Fi file){
+ Core.app.post(() -> {
try{
- if(SaveIO.isSaveValid(file)){
- SaveMeta meta = SaveIO.getMeta(new DataInputStream(new InflaterInputStream(file.read(Streams.defaultBufferSize))));
- if(meta.tags.containsKey("name")){
- //is map
- if(!ui.editor.isShown()){
- ui.editor.show();
- }
-
- ui.editor.beginEditMap(file);
- }else if(meta.rules.sector == null){ //don't allow importing campaign saves, they are broken
- SaveSlot slot = control.saves.importSave(file);
- ui.load.runLoadSave(slot);
- }else{
- ui.showErrorMessage("@save.nocampaign");
- }
+ if(Schematics.isSchematic(file)){
+ ui.schematics.show();
+ ui.schematics.importAndShow(file);
}else{
- ui.showErrorMessage("@save.import.invalid");
+ SaveMeta meta = SaveIO.getMeta(file);
+ if(!meta.isMap()){ //open save
+ //not sure if this is a great idea but leaving the editor open would lead to catastrophic bugs
+ if(ui.editor.isShown()) ui.editor.hide();
+
+ if(meta.rules.sector == null){
+ SaveSlot slot = control.saves.importSave(file);
+ ui.load.runLoadSave(slot);
+ }else{
+ ui.showErrorMessage("@save.nocampaign");
+ }
+ }else{ //open map
+ if(!ui.maps.isShown()) ui.maps.show();
+ ui.maps.tryImportMap(file, result -> ui.maps.showMap(result));
+ }
}
}catch(Throwable e){
- ui.showException("@save.import.fail", e);
+ Log.err("Failed to import file", e);
+ ui.showException("@save.import.invalid", e);
}
- }
-
+ });
}
}
diff --git a/core/src/mindustry/game/Schematics.java b/core/src/mindustry/game/Schematics.java
index fe816418a1..7d99e43d58 100644
--- a/core/src/mindustry/game/Schematics.java
+++ b/core/src/mindustry/game/Schematics.java
@@ -246,7 +246,15 @@ public class Schematics implements Loadable{
Draw.rect(Tmp.tr1, buffer.width /2f, buffer.height /2f, buffer.width, -buffer.height);
Draw.color();
- Seq plans = schematic.tiles.map(t -> new BuildPlan(t.x, t.y, t.rotation, t.block, t.config));
+ Seq plans = schematic.tiles.map(t -> new BuildPlan(t.x, t.y, t.rotation, t.block, t.config){
+ @Override
+ public Tile tile(){
+ //fake tile to return for previews to work properly
+ emptyTile.x = (short)x;
+ emptyTile.y = (short)y;
+ return emptyTile;
+ }
+ });
Draw.flush();
//scale each plan to fit schematic
@@ -263,6 +271,10 @@ public class Schematics implements Loadable{
plans.each(req -> req.block.drawPlanConfigTop(req, eachPlans));
+ //reset state
+ emptyTile.x = 0;
+ emptyTile.y = 0;
+
Draw.flush();
Draw.trans().idt();
@@ -521,6 +533,21 @@ public class Schematics implements Loadable{
//region IO methods
+ public static boolean isSchematic(Fi file){
+ try{
+ try(InputStream input = file.read()){
+ for(byte b : header){
+ if(input.read() != b){
+ return false;
+ }
+ }
+ }
+ return true;
+ }catch(Throwable t){
+ return false;
+ }
+ }
+
/** Loads a schematic from base64. May throw an exception. */
public static Schematic readBase64(String schematic){
try{
diff --git a/core/src/mindustry/io/SaveMeta.java b/core/src/mindustry/io/SaveMeta.java
index 46b94ff978..30e536d228 100644
--- a/core/src/mindustry/io/SaveMeta.java
+++ b/core/src/mindustry/io/SaveMeta.java
@@ -28,4 +28,8 @@ public class SaveMeta{
this.tags = tags;
this.mods = JsonIO.read(String[].class, tags.get("mods", "[]"));
}
+
+ public boolean isMap(){
+ return tags.containsKey("name");
+ }
}
diff --git a/core/src/mindustry/logic/LCanvas.java b/core/src/mindustry/logic/LCanvas.java
index 56f52b1bb9..320b8e59ca 100644
--- a/core/src/mindustry/logic/LCanvas.java
+++ b/core/src/mindustry/logic/LCanvas.java
@@ -212,7 +212,7 @@ public class LCanvas extends Table{
seq.clear();
float totalHeight = getChildren().sumf(e -> e.getPrefHeight() + space);
- if(height != totalHeight || width != Scl.scl(targetWidth)){
+ if(!Mathf.equal(height, totalHeight, 1f) || !Mathf.equal(width, Scl.scl(targetWidth), 1f)){
height = prefHeight = totalHeight;
width = prefWidth = Scl.scl(targetWidth);
invalidateHierarchy();
diff --git a/core/src/mindustry/maps/Maps.java b/core/src/mindustry/maps/Maps.java
index 12859cc2c4..93b0e1fe92 100644
--- a/core/src/mindustry/maps/Maps.java
+++ b/core/src/mindustry/maps/Maps.java
@@ -267,8 +267,8 @@ public class Maps{
}
}
- /** Import a map, then save it. This updates all values and stored data necessary. */
- public void importMap(Fi file) throws IOException{
+ /** Imports a map, then saves it. This updates all values and stored data necessary. */
+ public Map importMap(Fi file) throws IOException{
Fi dest = findFile(file.name());
file.copyTo(dest);
@@ -288,6 +288,8 @@ public class Maps{
if(error[0] != null){
throw new IOException(error[0]);
}
+
+ return map;
}
/** Attempts to run the following code;
diff --git a/core/src/mindustry/ui/FileChooser.java b/core/src/mindustry/ui/FileChooser.java
index a76fb241d7..4dd1482210 100644
--- a/core/src/mindustry/ui/FileChooser.java
+++ b/core/src/mindustry/ui/FileChooser.java
@@ -14,7 +14,7 @@ public class FileChooser{
public static void export(String name, String extension, FileWriter writer){
if(!ios){
- FileChooser.save(extension).name(name).submit(file -> {
+ FileChooser.save(extension).name(name.endsWith("." + extension) ? name : name + "." + extension).submit(file -> {
ui.loadAnd(() -> {
try{
writer.write(file);
diff --git a/core/src/mindustry/ui/dialogs/EditorMapsDialog.java b/core/src/mindustry/ui/dialogs/EditorMapsDialog.java
index 017381f263..b1ece85c3d 100644
--- a/core/src/mindustry/ui/dialogs/EditorMapsDialog.java
+++ b/core/src/mindustry/ui/dialogs/EditorMapsDialog.java
@@ -2,6 +2,7 @@ package mindustry.ui.dialogs;
import arc.*;
import arc.files.*;
+import arc.func.*;
import arc.graphics.*;
import arc.scene.ui.*;
import arc.scene.ui.layout.*;
@@ -44,53 +45,60 @@ public class EditorMapsDialog extends MapListDialog{
FileChooser.open(mapExtension).submitMulti(files -> {
ui.loadAnd(() -> {
for(Fi file : files){
- maps.tryCatchMapError(() -> {
- if(MapIO.isImage(file)){
- ui.showErrorMessage("@editor.errorimage");
- return;
- }
-
- Map map = MapIO.createMap(file, true);
-
- //when you attempt to import a save, it will have no name, so generate one
- String name = map.tags.get("name", () -> {
- String result = "unknown";
- int number = 0;
- while(maps.byName(result + number++) != null) ;
- return result + number;
- });
-
- //this will never actually get called, but it remains just in case
- if(name == null){
- ui.showErrorMessage("@editor.errorname");
- return;
- }
-
- Map conflict = maps.all().find(m -> m.name().equalsIgnoreCase(name));
-
- if(conflict != null && !conflict.custom){
- ui.showInfo(Core.bundle.format("editor.import.exists", name));
- }else if(conflict != null){
- ui.showConfirm("@confirm", Core.bundle.format("editor.overwrite.confirm", map.name()), () -> {
- maps.tryCatchMapError(() -> {
- maps.removeMap(conflict);
- maps.importMap(map.file);
- setup();
- });
- });
- }else{
- maps.importMap(map.file);
- setup();
- }
- });
+ tryImportMap(file, null);
}
});
});
}).size(210f, 64f);
}
+ public void tryImportMap(Fi file, @Nullable Cons