From c156968be6f89fb4695b4500c9e307282509d0bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=82=A4=EC=97=90=EB=A5=B4?= <44261958+Kieaer@users.noreply.github.com> Date: Sat, 10 Jul 2021 21:32:05 +0900 Subject: [PATCH 01/42] update kr server list & Fix json format (#5559) --- servers_v6.json | 2 +- servers_v7.json | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/servers_v6.json b/servers_v6.json index 1be97e5f26..d1e30d78be 100644 --- a/servers_v6.json +++ b/servers_v6.json @@ -61,7 +61,7 @@ }, { "name": "Korea", - "address": ["mindustry.kr", "mindustry.initd.kr"] + "address": ["mindustry.initd.kr"] }, { "name": "hexpvp.ml", diff --git a/servers_v7.json b/servers_v7.json index 6342cdb659..a67d1424e1 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -9,7 +9,7 @@ { "name": "C.A.M.S.", "address": ["baseduser.eu.org:6569", "v7.thedimas.pp.ua"] - } + }, { "name": "hexpvp.ml", "address": "hexpvp.ml" @@ -45,5 +45,9 @@ { "name": "io", "address": ["mindustry.io.community", "mindustry.io.community:1000", "mindustry.io.community:2000", "mindustry.io.community:3000"] + }, + { + "name": "Korea", + "address": ["mindustry.kr"] } ] From ae83e604ba987bda3aeeb62ddf04c3d31972a31f Mon Sep 17 00:00:00 2001 From: RebornTrack970 <62565267+RebornTrack970@users.noreply.github.com> Date: Sat, 10 Jul 2021 15:32:57 +0300 Subject: [PATCH 02/42] Added Rush V7 (#5557) * Added Rush V7 Hosted by Red. * Fixed * Update servers_v7.json --- servers_v7.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers_v7.json b/servers_v7.json index a67d1424e1..f66d3d631d 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -20,7 +20,7 @@ }, { "name": "Omega", - "address": "157.90.180.53:25777" + "address": ["157.90.180.53:25777", "redstonneur1256.ml"] }, { "name": "MeowLand", From 48d9ea6aa19a19074943432796345c9189ab38d0 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 10 Jul 2021 08:39:32 -0400 Subject: [PATCH 03/42] Deleted all v6 servers with incorrect versions --- servers_v6.json | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/servers_v6.json b/servers_v6.json index d1e30d78be..dfe95bd8eb 100644 --- a/servers_v6.json +++ b/servers_v6.json @@ -7,10 +7,6 @@ "name": "SMokeOfAnarchy.duckdns.org", "address": ["smokeofanarchy.duckdns.org:6853"] }, - { - "name": "mindustry.pl", - "address": ["mindustry.pl:6000", "mindustry.pl:6666", "mindustry.pl", "mindustry.pl:6966"] - }, { "name": "{AA}", "address": ["aamindustry.play.ai", "aamindustry.play.ai:6571", "aamindustry.play.ai:6572", "aamindustry.play.ai:6573", "aamindustry.play.ai:6574"] @@ -23,17 +19,13 @@ "name": "C.A.M.S.", "address": ["baseduser.eu.org:6568", "nikochio.ddns.net", "play.thedimas.pp.ua"] }, - { - "name": "BE6.RUN", - "address": ["be6.run", "mindustrycn.top"] - }, { "name": "ECAN", "address": ["mindustry.ecansol.com:6597", "mindustry.ecansol.com:6499", "mindustry.ecansol.com:6599"] }, { "name": "Chaotic Neutral", - "address": ["Chaotic-Neutral.ddns.net:1111", "Chaotic-Neutral.ddns.net:2222", "Chaotic-Neutral.ddns.net:5555", "Chaotic-Neutral.ddns.net:6666", "Chaotic-Neutral.ddns.net:7777"] + "address": ["Chaotic-Neutral.ddns.net:1111", "Chaotic-Neutral.ddns.net:2222", "Chaotic-Neutral.ddns.net:7777"] }, { "name": "Ranked", @@ -63,17 +55,13 @@ "name": "Korea", "address": ["mindustry.initd.kr"] }, - { - "name": "hexpvp.ml", - "address": ["hexpvp.ml"] - }, { "name": "Omega", "address": ["178.170.47.34:20204", "157.90.213.2:30308", "157.90.180.53:25738"] }, { "name": "md.obvilionnetwork.ru", - "address": ["obvilionnetwork.ru", "obvilionnetwork.ru:7001", "obvilionnetwork.ru:7002", "obvilionnetwork.ru:7003"] + "address": ["obvilionnetwork.ru", "obvilionnetwork.ru:7001", "obvilionnetwork.ru:7002"] }, { "name": "Mindustry PLAY", @@ -83,10 +71,6 @@ "name": "Nydus", "address": ["v6.mindustry.nydus.app:6566"] }, - { - "name": "MD Community", - "address": ["mindurka.tk", "mindurka.tk:4000"] - }, { "name": "Mindustry.Party", "address": ["game.mindustry.party"] From 7d845951e9bd0317ac80d41ba44360f5435c6c1b Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 10 Jul 2021 11:33:05 -0400 Subject: [PATCH 04/42] Fixed #5560 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 1fb03444fd..da0672c650 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,4 +10,4 @@ kapt.include.compile.classpath=false kotlin.stdlib.default.dependency=false #needed for android compilation android.useAndroidX=true -archash=db46767773d489cf16c02dcb19cad5de21c33eef +archash=1eae35c804b2dd46d6755f750867925f894f5818 From beec1eeaba8722963a7e7c0cd99aa0929c8f5863 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 10 Jul 2021 12:32:29 -0400 Subject: [PATCH 05/42] Fixed #5561 --- desktop/build.gradle | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/desktop/build.gradle b/desktop/build.gradle index 347ffeee07..dfcc365f79 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -119,13 +119,14 @@ platforms.each{ platform -> "--removelibs", "$rootDir/desktop/build/packr/desktop.jar".toString() ] + args += "--vmargs" + if(platform == "MacOS"){ - args += ["--vmargs", "XstartOnFirstThread"] as String[] - }else{ - //TODO unneeded for windows? - args += ["--vmargs", "Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1"] + args += "XstartOnFirstThread" } + args += "Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1" + exec{ commandLine args.toList() standardOutput = System.out From 158d11d3ba752503f06c2c43824bbdf0a11f1ae1 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 10 Jul 2021 18:54:22 -0400 Subject: [PATCH 06/42] arc --- gradle.properties | 2 +- tests/src/test/java/ApplicationTests.java | 24 +++++++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index da0672c650..69dad80b1d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,4 +10,4 @@ kapt.include.compile.classpath=false kotlin.stdlib.default.dependency=false #needed for android compilation android.useAndroidX=true -archash=1eae35c804b2dd46d6755f750867925f894f5818 +archash=4b1c4b4565f24298c9c5c7e9b40d94957d4aa226 diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index ab16bf6597..3284377f0a 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -20,7 +20,7 @@ import mindustry.io.SaveIO.*; import mindustry.maps.*; import mindustry.mod.*; import mindustry.mod.Mods.*; -import mindustry.net.Net; +import mindustry.net.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.storage.*; @@ -28,6 +28,7 @@ import org.junit.jupiter.api.*; import org.junit.jupiter.params.*; import org.junit.jupiter.params.provider.*; +import java.io.*; import java.nio.*; import static mindustry.Vars.*; @@ -134,13 +135,32 @@ public class ApplicationTests{ @NullSource @ValueSource(strings = { "asd asd asd asd asdagagasasjakbgeah;jwrej 23424234", - "这个服务器可以用自己的语言说话" + "这个服务器可以用自己的语言说话", + "\uD83D\uDEA3" }) void writeStringTest(String string){ ByteBuffer buffer = ByteBuffer.allocate(500); TypeIO.writeString(buffer, string); buffer.position(0); assertEquals(TypeIO.readString(buffer), string); + + ByteArrayOutputStream ba = new ByteArrayOutputStream(); + + TypeIO.writeString(new Writes(new DataOutputStream(ba)), string); + assertEquals(TypeIO.readString(new Reads(new DataInputStream(new ByteArrayInputStream(ba.toByteArray())))), string); + + SendChatMessageCallPacket pack = new SendChatMessageCallPacket(); + pack.message = string; + + buffer.position(0); + pack.write(new Writes(new ByteBufferOutput(buffer))); + int len = buffer.position(); + buffer.position(0); + pack.message = "INVALID"; + pack.read(new Reads(new ByteBufferInput(buffer)), len); + pack.handled(); + + assertEquals(string, pack.message); } @Test From 8a84ebb58d44ecc8af1ba90332e6d1f4bb77132a Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 10 Jul 2021 22:18:58 -0400 Subject: [PATCH 07/42] Fixed server IO errors / Fixed kick IP tracing --- core/src/mindustry/core/NetServer.java | 3 +- .../mindustry/entities/comp/PlayerComp.java | 4 ++ core/src/mindustry/net/NetConnection.java | 42 +++++++++---------- gradle.properties | 2 +- tests/src/test/java/ApplicationTests.java | 24 +++++++++++ 5 files changed, 51 insertions(+), 24 deletions(-) diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 905425f1c9..64cd73c4ad 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -344,8 +344,7 @@ public class NetServer implements ApplicationListener{ boolean checkPass(){ if(votes >= votesRequired()){ Call.sendMessage(Strings.format("[orange]Vote passed.[scarlet] @[orange] will be banned from the server for @ minutes.", target.name, (kickDuration / 60))); - target.getInfo().lastKicked = Time.millis() + kickDuration * 1000; - Groups.player.each(p -> p.uuid().equals(target.uuid()), p -> p.kick(KickReason.vote)); + Groups.player.each(p -> p.uuid().equals(target.uuid()), p -> p.kick(KickReason.vote, kickDuration * 1000)); map[0] = null; task.cancel(); return true; diff --git a/core/src/mindustry/entities/comp/PlayerComp.java b/core/src/mindustry/entities/comp/PlayerComp.java index 14cb71c10f..057687ada8 100644 --- a/core/src/mindustry/entities/comp/PlayerComp.java +++ b/core/src/mindustry/entities/comp/PlayerComp.java @@ -238,6 +238,10 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra con.kick(reason); } + void kick(KickReason reason, long duration){ + con.kick(reason, duration); + } + void kick(String reason){ con.kick(reason); } diff --git a/core/src/mindustry/net/NetConnection.java b/core/src/mindustry/net/NetConnection.java index a7bcc9b7fd..87eedd6675 100644 --- a/core/src/mindustry/net/NetConnection.java +++ b/core/src/mindustry/net/NetConnection.java @@ -4,7 +4,6 @@ import arc.struct.*; import arc.util.*; import mindustry.entities.units.*; import mindustry.gen.*; -import mindustry.net.Administration.*; import mindustry.net.Packets.*; import java.io.*; @@ -37,38 +36,39 @@ public abstract class NetConnection{ /** Kick with a special, localized reason. Use this if possible. */ public void kick(KickReason reason){ - if(kicked) return; + kick(reason, (reason == KickReason.kick || reason == KickReason.banned || reason == KickReason.vote) ? 30 * 1000 : 0); + } - Log.info("Kicking connection @ / @; Reason: @", address, uuid, reason.name()); - - if((reason == KickReason.kick || reason == KickReason.banned || reason == KickReason.vote)){ - PlayerInfo info = netServer.admins.getInfo(uuid); - info.timesKicked++; - info.lastKicked = Math.max(Time.millis() + 30 * 1000, info.lastKicked); - } - - Call.kick(this, reason); - - close(); - - netServer.admins.save(); - kicked = true; + /** Kick with a special, localized reason. Use this if possible. */ + public void kick(KickReason reason, long kickDuration){ + kick(null, reason, kickDuration); } /** Kick with an arbitrary reason. */ public void kick(String reason){ - kick(reason, 30 * 1000); + kick(reason, null, 30 * 1000); + } + + /** Kick with an arbitrary reason. */ + public void kick(String reason, long duration){ + kick(reason, null, duration); } /** Kick with an arbitrary reason, and a kick duration in milliseconds. */ - public void kick(String reason, long kickDuration){ + private void kick(String reason, KickReason kickType, long kickDuration){ if(kicked) return; - Log.info("Kicking connection @ / @; Reason: @", address, uuid, reason.replace("\n", " ")); + Log.info("Kicking connection @ / @; Reason: @", address, uuid, reason == null ? kickType.name() : reason.replace("\n", " ")); - netServer.admins.handleKicked(uuid, address, kickDuration); + if(kickDuration > 0){ + netServer.admins.handleKicked(uuid, address, kickDuration); + } - Call.kick(this, reason); + if(reason == null){ + Call.kick(this, kickType); + }else{ + Call.kick(this, reason); + } close(); diff --git a/gradle.properties b/gradle.properties index 69dad80b1d..d732f03f20 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,4 +10,4 @@ kapt.include.compile.classpath=false kotlin.stdlib.default.dependency=false #needed for android compilation android.useAndroidX=true -archash=4b1c4b4565f24298c9c5c7e9b40d94957d4aa226 +archash=52cd02b71205949b68e9b620b6a02fed3622bac0 diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 3284377f0a..01dce8947e 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -21,6 +21,7 @@ import mindustry.maps.*; import mindustry.mod.*; import mindustry.mod.Mods.*; import mindustry.net.*; +import mindustry.net.Packets.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.storage.*; @@ -134,6 +135,7 @@ public class ApplicationTests{ @ParameterizedTest @NullSource @ValueSource(strings = { + "a", "asd asd asd asd asdagagasasjakbgeah;jwrej 23424234", "这个服务器可以用自己的语言说话", "\uD83D\uDEA3" @@ -161,6 +163,28 @@ public class ApplicationTests{ pack.handled(); assertEquals(string, pack.message); + + buffer.position(0); + Writes writes = new Writes(new ByteBufferOutput(buffer)); + TypeIO.writeString(writes, string); + + buffer.position(0); + + assertEquals(string, TypeIO.readString(new Reads(new ByteBufferInput(buffer)))); + + buffer.position(0); + ConnectPacket con = new ConnectPacket(); + con.name = string; + con.uuid = "AAAAAAAA"; + con.usid = "AAAAAAAA"; + con.mods = new Seq<>(); + con.write(new Writes(new ByteBufferOutput(buffer))); + + con.name = "INVALID"; + buffer.position(0); + con.read(new Reads(new ByteBufferInput(buffer))); + + assertEquals(string, con.name); } @Test From 308176ee8195e1fc5c590791e682c007e5463775 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 11 Jul 2021 10:13:34 -0400 Subject: [PATCH 08/42] Revert theme removal / Android jar import bugfixes --- android/AndroidManifest.xml | 1 + android/res/values-v21/styles.xml | 11 +++++++++++ android/res/values/styles.xml | 10 ++++++++++ core/src/mindustry/mod/Mods.java | 13 +++++++------ 4 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 android/res/values-v21/styles.xml create mode 100644 android/res/values/styles.xml diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 13405ba012..08422736a2 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -14,6 +14,7 @@ android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:isGame="true" + android:theme="@style/ArcTheme" android:usesCleartextTraffic="true" android:appCategory="game" android:label="@string/app_name" diff --git a/android/res/values-v21/styles.xml b/android/res/values-v21/styles.xml new file mode 100644 index 0000000000..9ddd5ffb6c --- /dev/null +++ b/android/res/values-v21/styles.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/android/res/values/styles.xml b/android/res/values/styles.xml new file mode 100644 index 0000000000..ac57c806dd --- /dev/null +++ b/android/res/values/styles.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 1380251730..715e340ed3 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -86,7 +86,8 @@ public class Mods implements Loadable{ /** Imports an external mod file. Folders are not supported here. */ public LoadedMod importMod(Fi file) throws IOException{ - String baseName = file.nameWithoutExtension(); + //for some reason, android likes to add colons to file names, e.g. primary:ExampleJavaMod.jar, which breaks dexing + String baseName = file.nameWithoutExtension().replace(':', '_'); String finalName = baseName; //find a name to prevent any name conflicts int count = 1; @@ -300,12 +301,12 @@ public class Mods implements Loadable{ } private PageType getPage(Fi file){ - String parent = file.parent().name(); + String path = file.path(); return - parent.equals("environment") ? PageType.environment : - parent.equals("editor") ? PageType.editor : - parent.equals("rubble") ? PageType.editor : - parent.equals("ui") || file.parent().parent().name().equals("ui") ? PageType.ui : + path.contains("sprites/environment") ? PageType.environment : + path.contains("sprites/editor") ? PageType.editor : + path.contains("sprites/rubble") ? PageType.editor : + path.contains("sprites/ui") ? PageType.ui : PageType.main; } From 3b400ac3f360329b8f8b7390b11d52e4a23c6782 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 11 Jul 2021 10:15:53 -0400 Subject: [PATCH 09/42] just in case --- core/src/mindustry/mod/Mods.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 715e340ed3..35dcd90fde 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -87,7 +87,7 @@ public class Mods implements Loadable{ /** Imports an external mod file. Folders are not supported here. */ public LoadedMod importMod(Fi file) throws IOException{ //for some reason, android likes to add colons to file names, e.g. primary:ExampleJavaMod.jar, which breaks dexing - String baseName = file.nameWithoutExtension().replace(':', '_'); + String baseName = file.nameWithoutExtension().replace(':', '_').replace(' ', '_'); String finalName = baseName; //find a name to prevent any name conflicts int count = 1; From 5d1af6fb76419df1f6cee7005ee4a52cb235e1e7 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 11 Jul 2021 11:54:07 -0400 Subject: [PATCH 10/42] Android release debuggable; fixes default interfaces --- android/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/android/build.gradle b/android/build.gradle index 672dfc81f4..928e3bf28f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -100,6 +100,7 @@ android{ all{ minifyEnabled = true shrinkResources = true + debuggable = true proguardFiles("proguard-rules.pro") } } From c94e7aa031bde0fd330789ec6092f5e1eef94ce0 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 11 Jul 2021 12:03:10 -0400 Subject: [PATCH 11/42] Mod bugfixes --- android/build.gradle | 2 ++ core/src/mindustry/mod/Mods.java | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index 928e3bf28f..5f355a0ec7 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -100,6 +100,8 @@ android{ all{ minifyEnabled = true shrinkResources = true + //this is the ONLY WAY I could find to force r8 to keep its filthy hands off of my default interfaces. + //may have undesirable side effects debuggable = true proguardFiles("proguard-rules.pro") } diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 35dcd90fde..693ac2222a 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -303,7 +303,7 @@ public class Mods implements Loadable{ private PageType getPage(Fi file){ String path = file.path(); return - path.contains("sprites/environment") ? PageType.environment : + path.contains("sprites/blocks/environment") ? PageType.environment : path.contains("sprites/editor") ? PageType.editor : path.contains("sprites/rubble") ? PageType.editor : path.contains("sprites/ui") ? PageType.ui : From e5e2d0ab037ed052f527394661c3918061e9ea08 Mon Sep 17 00:00:00 2001 From: buthed010203 Date: Sun, 11 Jul 2021 14:39:33 -0400 Subject: [PATCH 12/42] Fix payload driver crash (#5565) Similar to the mass driver one, https://i-dont.go-outsi.de/53ZwBY_YS.png --- core/src/mindustry/world/blocks/payloads/PayloadMassDriver.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/mindustry/world/blocks/payloads/PayloadMassDriver.java b/core/src/mindustry/world/blocks/payloads/PayloadMassDriver.java index 71a1aa1f23..5e04456ac3 100644 --- a/core/src/mindustry/world/blocks/payloads/PayloadMassDriver.java +++ b/core/src/mindustry/world/blocks/payloads/PayloadMassDriver.java @@ -456,6 +456,7 @@ public class PayloadMassDriver extends PayloadBlock{ @Override public Point2 config(){ + if(tile == null) return null; return Point2.unpack(link).sub(tile.x, tile.y); } From 1ea545ccb2ee1554e54990810546a75ea957f6cb Mon Sep 17 00:00:00 2001 From: TranquillyUnpleasant <62061444+TranquillyUnpleasant@users.noreply.github.com> Date: Mon, 12 Jul 2021 18:23:20 +0500 Subject: [PATCH 13/42] fix (#5567) --- core/src/mindustry/ui/fragments/PlayerListFragment.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/ui/fragments/PlayerListFragment.java b/core/src/mindustry/ui/fragments/PlayerListFragment.java index 7be7e6d090..67b101c6ab 100644 --- a/core/src/mindustry/ui/fragments/PlayerListFragment.java +++ b/core/src/mindustry/ui/fragments/PlayerListFragment.java @@ -83,13 +83,15 @@ public class PlayerListFragment extends Fragment{ Groups.player.copy(players); players.sort(Structs.comps(Structs.comparing(Player::team), Structs.comparingBool(p -> !p.admin))); + if(sField.getText().length() > 0){ + players.filter(p -> Strings.stripColors(p.name().toLowerCase()).contains(sField.getText().toLowerCase())); + } for(var user : players){ found = true; NetConnection connection = user.con; if(connection == null && net.server() && !user.isLocal()) return; - if(sField.getText().length() > 0 && !user.name().toLowerCase().contains(sField.getText().toLowerCase()) && !Strings.stripColors(user.name().toLowerCase()).contains(sField.getText().toLowerCase())) return; Table button = new Table(); button.left(); From 7fea7e91aa96b6bd04f36cf57da536f8a120d276 Mon Sep 17 00:00:00 2001 From: Antsiferov Andrew Date: Mon, 12 Jul 2021 16:23:36 +0300 Subject: [PATCH 14/42] Correct comment (#5568) This is `UI.packer`, not `Fonts.packer`. --- core/src/mindustry/ui/Fonts.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/ui/Fonts.java b/core/src/mindustry/ui/Fonts.java index 3c6c1b175c..295a292c98 100644 --- a/core/src/mindustry/ui/Fonts.java +++ b/core/src/mindustry/ui/Fonts.java @@ -203,7 +203,7 @@ public class Fonts{ /** Merges the UI and font atlas together for better performance. */ public static void mergeFontAtlas(TextureAtlas atlas){ - //grab all textures from the ui page, remove all the regions assigned to it, then copy them over to Fonts.packer and replace the texture in this atlas. + //grab all textures from the ui page, remove all the regions assigned to it, then copy them over to UI.packer and replace the texture in this atlas. //grab old UI texture and regions... Texture texture = atlas.find("logo").texture; From ec3dc867c145630303762d97a491b465b5dddb71 Mon Sep 17 00:00:00 2001 From: Arik Date: Mon, 12 Jul 2021 09:33:17 -0700 Subject: [PATCH 15/42] Always increment launchpad counter (#5569) --- core/src/mindustry/world/blocks/campaign/LaunchPad.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/world/blocks/campaign/LaunchPad.java b/core/src/mindustry/world/blocks/campaign/LaunchPad.java index 03dc5e1f8f..0fa14dcce1 100644 --- a/core/src/mindustry/world/blocks/campaign/LaunchPad.java +++ b/core/src/mindustry/world/blocks/campaign/LaunchPad.java @@ -133,8 +133,8 @@ public class LaunchPad extends Block{ public void updateTile(){ if(!state.isCampaign()) return; - //launch when full and base conditions are met - if(items.total() >= itemCapacity && efficiency() >= 1f && (launchCounter += edelta()) >= launchTime){ + //increment launchCounter then launch when full and base conditions are met + if((launchCounter += edelta()) >= launchTime && items.total() >= itemCapacity){ launchSound.at(x, y); LaunchPayload entity = LaunchPayload.create(); items.each((item, amount) -> entity.stacks.add(new ItemStack(item, amount))); From 4f98bc95a20c1f0be50b822cceb304baa6b6869a Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 12 Jul 2021 12:36:45 -0400 Subject: [PATCH 16/42] Better sliders --- core/assets-raw/sprites/ui/slider-back.9.png | Bin 0 -> 197 bytes .../sprites/ui/slider-knob-down.png | Bin 118 -> 117 bytes .../sprites/ui/slider-knob-over.png | Bin 123 -> 120 bytes core/assets-raw/sprites/ui/slider-knob.png | Bin 122 -> 120 bytes .../assets-raw/sprites/ui/slider-vertical.png | Bin 72 -> 0 bytes core/src/mindustry/content/UnitTypes.java | 1 - .../abilities/EnergyFieldAbility.java | 4 ++-- .../mindustry/maps/filters/FilterOption.java | 21 +++++++++++++----- core/src/mindustry/ui/Styles.java | 10 ++------- .../ui/dialogs/SettingsMenuDialog.java | 21 +++++++++--------- gradle.properties | 2 +- 11 files changed, 31 insertions(+), 28 deletions(-) create mode 100644 core/assets-raw/sprites/ui/slider-back.9.png delete mode 100644 core/assets-raw/sprites/ui/slider-vertical.png diff --git a/core/assets-raw/sprites/ui/slider-back.9.png b/core/assets-raw/sprites/ui/slider-back.9.png new file mode 100644 index 0000000000000000000000000000000000000000..71762a216384c9f8d41ed1f374acc675ea8138a7 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0y~yU{GUVV36ftV_;x7)*yF)fq{XsILO_JVcj{ImkbOH z^`0({ArY-_uP+olV!-2aG4xrK@ExOc|NY2u!%=AQs$I(u z+bc;PuBl;I@cp0gq?y{gm;GdT6cMFRFhh&s&SSr=*VauHoLR~Dd2g~&`%0N*MKew% yYQY$*6n=iGt-5;8|MjY>-48ErGvBsWKd4yY{n_1o%NZCL7(8A5T-G@yGywplA5d)o literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/ui/slider-knob-down.png b/core/assets-raw/sprites/ui/slider-knob-down.png index 7eac1c0f51aa97cc11b024fdf3e5d7be6ad84720..72ff323d0bc28a74d749159c4070c9e0dc21b77b 100644 GIT binary patch delta 99 zcmXRbogf~k#lgnFz~KKTK#GBZfw4Hq-HBn{IhmIX3=I07E{-7)t#8j7GBPl5Fe_}W ye;#@8G&k1;&!F?qtfzP_4O$tZH5Ep!7hCVi5^yu_%5(+>1_n=8KbLh*2~7YE93jvE delta 100 zcmXRdn;;&q#=*wGz+j;_A(4TB!Pe8oF{I+w+p8Nn84NfW9K}oi7YcbuMF-z_BA3Im z^U{ekFZ|v(N0F5it8=V$jkiXEmGWVHB^2Gnz267Ax3=E#GelF{r G5}E)DlO|sP diff --git a/core/assets-raw/sprites/ui/slider-knob-over.png b/core/assets-raw/sprites/ui/slider-knob-over.png index a4bb61170bfd8db0a3593fcf2ca8c0f0d3ad3b0b..d7ca8fb4eaf731b98a183d7a63fb32bb9fdb380a 100644 GIT binary patch delta 102 zcmb=fm>{00#lgnFz~KKTK#GBZfw4Hq-HBn{IhmIX3=Bq|E{-7)t#8j7GBOx&Ff7>l zsLfyUKye_)oW=Gj4H`yICYG9iKvYGJq88_22WQ%mvv4FO#r$6 BBlG|O delta 105 zcmb=Zo*7^FVdQ&MBb@01A640ssI2 diff --git a/core/assets-raw/sprites/ui/slider-knob.png b/core/assets-raw/sprites/ui/slider-knob.png index 6e643e0dc690a0a7a2d48938ed7df4646bfaad39..7c4e35233e6c2f47ac712e89c48c07aa25c435b5 100644 GIT binary patch delta 102 zcmb=bm>{00#lgnFz~KKTK#GBZfw4Hq-HBn{IhmIX3=Bq|E{-7)t#8j7GBPOeFmEu- z|EkZaQ}ES`=ZVVB;B9XMw5ED34O$rjqyBznxMj?wblc`iI0FL%gQu&X%Q~loCID@U BBH91| delta 104 zcmb=ZnjoI6#=*wGz+j;_A(4TB!O_#jF{I+w+pC6L3<^BV4))hK{;%(A(u*y9@rZSk z$e~`@nU;CcpEuoX@0bzW>a;N61*ZsCt5dC{h6vYR# all = new Seq<>(); - public float damage = 1, repair = 20f, reload = 100, range = 60; + public float damage = 1, reload = 100, range = 60; public Effect healEffect = Fx.heal, hitEffect = Fx.hitLaserBlast, damageEffect = Fx.chainLightning; public StatusEffect status = StatusEffects.electrified; public float statusDuration = 60f * 6f; public float x, y; public boolean hitBuildings = true; public int maxTargets = 25; - public float healPercent = 3f; + public float healPercent = 2.5f; public float layer = Layer.bullet - 0.001f, blinkScl = 20f; public float effectRadius = 5f, sectorRad = 0.14f, rotateSpeed = 0.5f; diff --git a/core/src/mindustry/maps/filters/FilterOption.java b/core/src/mindustry/maps/filters/FilterOption.java index ea97157abf..6b2e3aa1f1 100644 --- a/core/src/mindustry/maps/filters/FilterOption.java +++ b/core/src/mindustry/maps/filters/FilterOption.java @@ -3,12 +3,15 @@ package mindustry.maps.filters; import arc.*; import arc.func.*; +import arc.scene.event.*; import arc.scene.style.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; +import arc.util.*; import mindustry.*; import mindustry.content.*; import mindustry.gen.*; +import mindustry.ui.*; import mindustry.ui.dialogs.*; import mindustry.world.*; import mindustry.world.blocks.environment.*; @@ -35,7 +38,7 @@ public abstract class FilterOption{ final Floatc setter; final float min, max, step; - boolean display; + boolean display = true; SliderOption(String name, Floatp getter, Floatc setter, float min, float max){ this(name, getter, setter, min, max, (max - min) / 200); @@ -57,19 +60,27 @@ public abstract class FilterOption{ @Override public void build(Table table){ + Label label; if(!display){ - table.add("@filter.option." + name); + label = new Label("@filter.option." + name); }else{ - table.label(() -> Core.bundle.get("filter.option." + name) + ": " + (int)getter.get()); + label = new Label(() -> Core.bundle.get("filter.option." + name) + ": " + Strings.autoFixed(getter.get(), 2)); } - table.row(); - Slider slider = table.slider(min, max, step, setter).growX().get(); + label.setWrap(true); + label.setAlignment(Align.center); + label.touchable = Touchable.disabled; + label.setStyle(Styles.outlineLabel); + + Slider slider = new Slider(min, max, step, false); + slider.moved(setter); slider.setValue(getter.get()); if(updateEditorOnChange){ slider.changed(changed); }else{ slider.released(changed); } + + table.stack(slider, label).colspan(2).pad(3).growX().row(); } } diff --git a/core/src/mindustry/ui/Styles.java b/core/src/mindustry/ui/Styles.java index 4e7042fe80..36a3ace7d2 100644 --- a/core/src/mindustry/ui/Styles.java +++ b/core/src/mindustry/ui/Styles.java @@ -31,7 +31,7 @@ public class Styles{ public static ImageButtonStyle defaulti, nodei, righti, emptyi, emptytogglei, selecti, logici, geni, colori, accenti, cleari, clearFulli, clearPartiali, clearPartial2i, clearTogglei, clearTransi, clearToggleTransi, clearTogglePartiali; public static ScrollPaneStyle defaultPane, horizontalPane, smallPane, nonePane; public static KeybindDialog.KeybindDialogStyle defaultKeybindDialog; - public static SliderStyle defaultSlider, vSlider; + public static SliderStyle defaultSlider; public static LabelStyle defaultLabel, outlineLabel, techLabel; public static TextFieldStyle defaultField, nodeField, areaField, nodeArea; public static CheckBoxStyle defaultCheck; @@ -320,13 +320,7 @@ public class Styles{ }}; defaultSlider = new SliderStyle(){{ - background = slider; - knob = sliderKnob; - knobOver = sliderKnobOver; - knobDown = sliderKnobDown; - }}; - vSlider = new SliderStyle(){{ - background = sliderVertical; + background = sliderBack; knob = sliderKnob; knobOver = sliderKnobOver; knobDown = sliderKnobDown; diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index 168ae4b451..dccf2dadcb 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -6,6 +6,7 @@ import arc.func.*; import arc.graphics.*; import arc.graphics.Texture.*; import arc.input.*; +import arc.scene.event.*; import arc.scene.ui.*; import arc.scene.ui.TextButton.*; import arc.scene.ui.layout.*; @@ -686,23 +687,21 @@ public class SettingsMenuDialog extends Dialog{ slider.setValue(settings.getInt(name)); - Label label = new Label(title); + Label value = new Label(""); + value.setStyle(Styles.outlineLabel); + value.touchable = Touchable.disabled; + slider.changed(() -> { settings.put(name, (int)slider.getValue()); - label.setText(title + ": " + sp.get((int)slider.getValue())); + value.setText(title + ": " + sp.get((int)slider.getValue())); }); + value.setAlignment(Align.center); + value.setWrap(true); + slider.change(); - table.table(t -> { - t.left().defaults().left(); - t.add(label).minWidth(label.getPrefWidth() / Scl.scl(1f) + 50); - if(Core.graphics.isPortrait()){ - t.row(); - } - t.add(slider).width(180); - }).left().padTop(3); - + table.stack(slider, value).width(420f).left().padTop(4); table.row(); } } diff --git a/gradle.properties b/gradle.properties index d732f03f20..a0c542efe2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,4 +10,4 @@ kapt.include.compile.classpath=false kotlin.stdlib.default.dependency=false #needed for android compilation android.useAndroidX=true -archash=52cd02b71205949b68e9b620b6a02fed3622bac0 +archash=ca3a52e9571ff20f9dd6c43337740539f407d3dd From f856ad16ba89a6c765496adab6b24c55f568b6a3 Mon Sep 17 00:00:00 2001 From: Antsiferov Andrew Date: Mon, 12 Jul 2021 21:46:36 +0300 Subject: [PATCH 17/42] Fixed a typo (#5532) --- core/assets/bundles/bundle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 523225dc98..c38e4b930f 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1593,7 +1593,7 @@ lst.set = Set a variable. lst.operation = Perform an operation on 1-2 variables. lst.end = Jump to the top of the instruction stack. lst.wait = Wait a certain number of seconds. -lst.lookup = Look up a item/liquid/unit/block type by ID.\nTotal counts of each type can be accessed with:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[] +lst.lookup = Look up an item/liquid/unit/block type by ID.\nTotal counts of each type can be accessed with:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[] lst.jump = Conditionally jump to another statement. lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[]. lst.unitcontrol = Control the currently bound unit. From 2b88396aacb96a4c91fb770c83ddff8289cbd993 Mon Sep 17 00:00:00 2001 From: Antsiferov Andrew Date: Mon, 12 Jul 2021 21:46:46 +0300 Subject: [PATCH 18/42] [Bundle][RU] Update (#5531) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * double newline fix hint.guardian * 13 changed lines mod.enabled mod.disabled status.burning.name status.freezing.name status.wet.name status.melting.name status.sapped.name status.spore-slowed.name status.tarred.name status.overclock.name status.shocked.name status.blasted.name status.unmoving.name * yon't * x'nt * Update bundle_ru.properties * 1 new, 1 changed New: stat.healing Changed: bullet.healpercent * Inverse trig logic functions See https://github.com/Anuken/Mindustry/commit/00ca247d0f40534b373209f578ef2f617c5da88a * new v7 stuff, long list New: schematic.tags schematic.edittags schematic.addtag schematic.texttag schematic.icontag schematic.renametag schematic.tagdelconfirm schematic.tagexists tps guardian sector.changeicon status.electrified.name unsupported.environment stat.repairspeed ability.energyfield bar.strength rules.corecapture block.rhyolite.name block.repair-turret.name hint.blockInfo lenum.config laccess.progress unit.retusa.name unit.oxynoe.name unit.cyerce.name unit.aegires.name unit.navanax.name block.duct.name block.duct-router.name block.duct-bridge.name block.payload-propulsion-tower.name block.payload-void.name block.payload-source.name filter.option.rotate Changed: stat.repairtime bullet.pierce team.crux.name team.sharded.name item.titanium.description Deleted: quit.confirm.tutorial boss.health team.orange.name lenum.configure * Update bundle_ru.properties * 1 line changed unit.oxynoe.name * роутер-marshrutizator ibglish * 2 lines changed block.surge-wall.name block.surge-wall-large.name * 3 new, 2 changed New: stat.showinmap block.metal-floor-4.name block.metal-floor-5.name Changed: stat.affinities stat.opposites * undone the dumb * 1 new line filter.option.replacement * 1 new, 1 changed New: rules.polygoncoreprotection Changed: hint.respawn * Fixed outdated minke description unit.minke.description: "зажигательными" -> "артиллерийскими" * 3 new lines unit.tilessecond (ec59cb602cfe980bf4697399218647e1e2e11baa) lst.wait, lst.lookup (094985275810620e9d53a4f788886d3bd483bae1) * typo еденицы -> единицы Co-authored-by: Vanguard <55051135+XEN0PHIL@users.noreply.github.com> --- core/assets/bundles/bundle_ru.properties | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 6162508307..8a8c1924de 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -806,6 +806,7 @@ bullet.reload = [stat]{0}[lightgray]x скорость стрельбы unit.blocks = блоков unit.blockssquared = блоков² unit.powersecond = единиц энергии/секунду +unit.tilessecond = плиток/секунду unit.liquidsecond = жидкостных единиц/секунду unit.itemssecond = предметов/секунду unit.liquidunits = жидкостных единиц @@ -1570,7 +1571,7 @@ unit.mega.description = Автоматически ремонтирует пов unit.quad.description = Сбрасывает большие бомбы на наземные цели, восстанавливая союзные постройки и повреждая врагов. Может переносить единицы среднего размера. unit.oct.description = Защищает союзников поблизости при помощи своего восстанавливающегося щита. Может переносить большинство наземных единиц. unit.risso.description = Стреляет залпами ракет и пуль по всем врагам поблизости. -unit.minke.description = Стреляет зажигательными снарядами и стандартными пулями по наземным целям. +unit.minke.description = Стреляет артиллерийскими снарядами и стандартными пулями по наземным целям. unit.bryde.description = Стреляет дальнобойными артиллерийскими снарядами и ракетами по врагам. unit.sei.description = Стреляет залпами ракет и бронебойных пуль по врагам. unit.omura.description = Стреляет дальнобойным пробивающим снарядом из рельсотрона по врагам. Производит единицы «Вспышка». @@ -1591,6 +1592,8 @@ lst.sensor = Получает данные из постройки или еди lst.set = Устанавливает переменную. lst.operation = Совершает операцию над 1-2 переменными. lst.end = Переходит к началу стека операций. +lst.wait = Ждёт определённое количество секунд. +lst.lookup = Находит тип предмета/жидкости/единицы/блока по ID.\nОбщее количество каждого типа может быть получено при помощи:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[] lst.jump = Условно переходит к другой операции. lst.unitbind = Привязывается к единице определённого типа и сохраняет её в [accent]@unit[]. lst.unitcontrol = Управляет привязанной в данный момент единицей. From a8d78453ff43989f1aaef3432707f39ce07c9f04 Mon Sep 17 00:00:00 2001 From: Sharlotte <60801210+Sharlottes@users.noreply.github.com> Date: Tue, 13 Jul 2021 03:47:05 +0900 Subject: [PATCH 19/42] Update bundle_ko.properties (#5527) --- core/assets/bundles/bundle_ko.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 917ef699f4..ef57409e9d 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -806,6 +806,7 @@ bullet.reload = [stat]{0}[lightgray]배 발사 속도 unit.blocks = 블록 unit.blockssquared = 블록² unit.powersecond = 전력/초 +unit.tilessecond = 타일/초 unit.liquidsecond = 액체/초 unit.itemssecond = 자원/초 unit.liquidunits = 액체 From 2b757fe1072e86fd18c96a8dbf2ccffd7a69fb7a Mon Sep 17 00:00:00 2001 From: Angel-24 <57916262+Angel-24@users.noreply.github.com> Date: Mon, 12 Jul 2021 20:47:17 +0200 Subject: [PATCH 20/42] Update bundle_es.properties (#5526) Updated Spanish trasnlations to the 1 - Jul - 2021 changes in "bundle.properties". --- core/assets/bundles/bundle_es.properties | 378 ++++++++++++++++++----- 1 file changed, 303 insertions(+), 75 deletions(-) diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index e9d0f796e3..8701bc0531 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -41,11 +41,13 @@ be.ignore = Ignorar be.noupdates = No se encontraron actualizaciones. be.check = Buscar actualizaciones -mod.featured.title = Explorador de mods -mod.featured.dialog.title = Explorador de Mods +mods.browser = Explorador de Mods mods.browser.selected = Mod seleccionado -mods.browser.add = Installar Mod -mods.github.open = Abrir en Github +mods.browser.add = Instalar +mods.browser.reinstall = Reinstalar +mods.github.open = Repositorio +mods.browser.sortdate = Más recientes +mods.browser.sortstars = Mejor valorados schematic = Plantilla schematic.add = Guardar plantilla... @@ -55,16 +57,24 @@ schematic.exists = Ya existe una plantilla con ese nombre. schematic.import = Importar plantilla... schematic.exportfile = Exportar archivo schematic.importfile = Importar archivo -schematic.browseworkshop = Buscar en el Steam Workshop +schematic.browseworkshop = Buscar en Steam Workshop schematic.copy = Copiar al portapapeles. schematic.copy.import = Importar desde el portapapeles. -schematic.shareworkshop = Compartir en el Steam Workshop +schematic.shareworkshop = Compartir en Steam Workshop schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Girar plantilla schematic.saved = Plantilla guardada. schematic.delete.confirm = Se borrará ésta plantilla. schematic.rename = Renombrar plantilla schematic.info = {0}x{1}, {2} bloques schematic.disabled = [scarlet]Plantillas desactivadas.[]\nNo puedes usar plantillas en este [accent]mapa[] o [accent]servidor. +schematic.tags = Etiquetas: +schematic.edittags = Editar Etiquetas +schematic.addtag = Añadir Etiqueta +schematic.texttag = Texto de Etiqueta +schematic.icontag = Icono de Etiqueta +schematic.renametag = Renombrar Etiqueta +schematic.tagdelconfirm = ¿Eliminar ésta etiqueta? +schematic.tagexists = Esa etiqueta ya existe. stats = Estadísticas stat.wave = Oleadas Derrotadas:[accent] {0} @@ -77,12 +87,12 @@ stat.playtime = Tiempo jugado:[accent] {0} stat.rank = Rango final: [accent]{0} globalitems = [accent]Recursos Totales -map.delete = ¿Estás seguro de que quieres borrar el mapa "[accent]{0}[]"? +map.delete = ¿Quieres borrar el mapa "[accent]{0}[]"? level.highscore = Puntuación más alta: [accent]{0} -level.select = Selección de nivel +level.select = Selección de Nivel level.mode = Modo de juego: coreattack = < ¡El núcleo está bajo ataque! > -nearpoint = [[ [scarlet]ABANDONA EL PUNTO DE APARICIÓN INMEDIATAMENTE[] ]\nRiesgo de aniquilación inminente +nearpoint = [[ [scarlet]ABANDONA EL PUNTO DE ATERRIZAJE INMEDIATAMENTE[] ]\nRiesgo de aniquilación inminente database = Base de datos savegame = Guardar Partida loadgame = Cargar Partida @@ -90,6 +100,7 @@ joingame = Unirse a Partida customgame = Crear Partida newgame = Nueva Partida none = +none.found = [lightgray] minimap = Minimapa position = Posición close = Cerrar @@ -110,17 +121,20 @@ committingchanges = Confirmando Cambios done = Hecho feature.unsupported = Tu dispositivo no es compatible con esta función. -mods.alphainfo = Ten en cuenta que los mods estan en fase Alpha, y[scarlet] pueden tener varios errores[].\nReporta cualquier error que encuentres en la página de GitHub de Mindustry. +mods.initfailed = [red]⚠[] La anterior ejecución de Mindustry encontró un fallo al inicializarse. Seguramente fue causado por algún mod erróneo.\n\nPara evitar un bucle de erroes al iniciar el juego, [red]se han desactivado todos los mods.[]\n\nPuedes desactivar ésta medida de seguridad desde [accent]Opciones->Juego->Desactivar mods si el juego encuentra un error al iniciarse.[]. mods = Mods mods.none = [lightgray]¡No se encontraron Mods! -mods.guide = Guía de Modding +mods.guide = Guía sobre Mods mods.report = Reportar Error mods.openfolder = Abrir carpeta de mods +mods.viewcontent = Ver Contenido mods.reload = Recargar mods.reloadexit = A continuación se cerrará el juego para recargar los mods. +mod.installed = [[Instalado] mod.display = [gray]Mod:[orange] {0} mod.enabled = [lightgray]Activado mod.disabled = [scarlet]Desactivado +mod.multiplayer.compatible = [gray]Compatible con Multijugador mod.disable = Desactivar mod.content = Contenido: mod.delete.error = No se pudo elminar el mod. Tal vez esté en uso por el juego. @@ -130,20 +144,20 @@ mod.missingdependencies = [scarlet]Dependencias faltantes: {0} mod.erroredcontent = [scarlet]Contenido erróneo mod.errors = Ha ocurrido un fallo al cargar el contenido. mod.noerrorplay = [scarlet]Se están ejecutando algunos mods con fallos.[]Deshabilítalos o arregla los errores antes de jugar. -mod.nowdisabled = [scarlet]Al/Los Mod/s '{0}'le esta/n faltando dependencias:[accent] {1}\n[lightgray]Estos mods necesitan descargarse primero.\nEste mod será automaticamente desactivado. +mod.nowdisabled = [scarlet]El mod '{0}' necesita ejecutarse junto a otros mods de los que depende:[accent] {1}\n[lightgray]Es necesario descargar primero estos mods.\nEste mod será automaticamente desactivado. mod.enable = Activar mod.requiresrestart = El juego se cerrará para aplicar los mods. -mod.reloadrequired = [scarlet]Se requiere volver a cargar +mod.reloadrequired = [scarlet]Es necesario Reiniciar mod.import = Importar mod mod.import.file = Importar archivo -mod.import.github = Importar Mod de Github +mod.import.github = Importar desde Github mod.jarwarn = [scarlet]Los mods JAR pueden no ser seguros.[]\n¡Asegúrate de haberlos descargado de una fuente en la que confíes! mod.item.remove = Este objeto es parte del[accent] '{0}'[] mod. Para eliminarlo, desinstala ese mod. mod.remove.confirm = Este mod va a ser eliminado.\n¿Quieres continuar? mod.author = [lightgray]Autor:[] {0} mod.missing = Esta partida guardada usa mods que has actualizado recientemente o que no tienes instalados. Se puede corromper la partida guardada. ¿Quieres cargarla a pesar de ello?\n[lightgray]Mods:\n{0} -mod.preview.missing = Antes de publicar este mod en el Steam Workshop, debe añadir una imagen de vista previa.\nAñada una imagen con nombre[accent] preview.png[] en la carpeta del mod e intente nuevamente. -mod.folder.missing = Solo los mods en forma de carpeta se pueden publicar en el Steam Workshop.\nPara convertir cualquier mod en una carpeta, simplemente descomprima su archivo a una carpeta y elimine el zip anterior, luego reinicie su juego o vuelva a cargar sus mods. +mod.preview.missing = Antes de publicar este mod en Steam Workshop, debes añadir una imagen de vista previa.\nAñade una imagen llamada[accent] preview.png[] en la carpeta del mod e inténtalo de nuevo. +mod.folder.missing = Sólo los mods en forma de carpeta se pueden publicar en Steam Workshop.\nPara convertir cualquier mod en una carpeta, descomprime su archivo a una carpeta y elimina el zip anterior, luego reinicia el juego o vuelve a cargar tus mods. mod.scripts.disable = Tu dispositivo no es compatible con mods con scripts. Debes deshabilitar esos mods para jugar. about.button = Acerca de... @@ -214,6 +228,8 @@ trace.ip = IP: [accent]{0} trace.id = ID Única: [accent]{0} trace.mobile = Cliente de móvil: [accent]{0} trace.modclient = Cliente Personalizado: [accent]{0} +trace.times.joined = Se ha unido [accent]{0} []veces +trace.times.kicked = Fue expulsado [accent]{0} []veces invalidid = ¡ID de cliente inválida! Por favor, envía un informe del error. server.bans = Expulsiones server.bans.none = No se ha baneado a ningún usuario aún @@ -222,16 +238,16 @@ server.admins.none = ¡No hay ningún administrador! server.add = Agregar Servidor server.delete = ¿Estás seguro de querer borrar este servidor? server.edit = Editar Servidor -server.outdated = [crimson]¡Servidor desactualizado![] -server.outdated.client = [crimson]¡Cliente desactualizado![] -server.version = [lightgray]Versión: {0} -server.custombuild = [accent]Versión personalizada -confirmban = ¿Quieres banear a este jugador? -confirmkick = ¿Estás seguro de querer expulsar este jugador? -confirmvotekick = ¿Estás de acuerdo en expulsar este jugador? +server.outdated = [scarlet]¡Servidor Desactualizado![] +server.outdated.client = [scarlet]¡Cliente Desactualizado![] +server.version = [gray]v{0} {1} +server.custombuild = [accent]Versión Personalizada +confirmban = ¿Quieres banear a "{0}[white]"? +confirmkick = ¿Quieres expulsar a "{0}[white]"? +confirmvotekick = ¿Estás a favor de expulsar a "{0}[white]"? confirmunban = ¿Quieres desbanear a este jugador? -confirmadmin = ¿Quieres hacer administrador a este jugador? -confirmunadmin = ¿Quieres quitar los permisos de administrador a este jugador? +confirmadmin = ¿Quieres hacer administrador a "{0}[white]"? +confirmunadmin = ¿Quieres quitarle los permisos de administrador a "{0}[white]"? joingame.title = Unirse a Partida joingame.ip = IP: disconnect = Desconectado. @@ -287,6 +303,7 @@ cancel = Cancelar openlink = Abrir Enlace copylink = Copiar Enlace back = Atrás +max = Máximo crash.export = Exportar Registros de errores crash.none = No se encontraron Registros de errores. crash.exported = Registros de errores exportados. @@ -361,7 +378,6 @@ editor.center = Centrar workshop = Steam Workshop waves.title = Oleadas waves.remove = Borrar -waves.never = waves.every = cada waves.waves = oleada(s) waves.perspawn = por lugar de aparición @@ -444,6 +460,7 @@ toolmode.drawteams = Dibujar Equipos toolmode.drawteams.description = Dibuja equipos en lugar de bloques. filters.empty = [lightgray]¡No hay filtros! Añade uno con el botón de abajo. + filter.distort = Distorsionar filter.noise = Ruido filter.enemyspawn = Punto de aparición enemigo @@ -460,19 +477,22 @@ filter.clear = Despejar filter.option.ignore = Ignorar filter.scatter = Dispersar filter.terrain = Terreno + filter.option.scale = Escala filter.option.chance = Probabilidad filter.option.mag = Magnitud filter.option.threshold = Umbral filter.option.circle-scale = Escala del círculo filter.option.octaves = Continuidad -filter.option.falloff = Aterrizaje +filter.option.falloff = Caída filter.option.angle = Ángulo +filter.option.rotate = Rotación filter.option.amount = Cantidad filter.option.block = Bloque filter.option.floor = Suelo filter.option.flooronto = Suelo objetivo -filter.option.target = Target +filter.option.target = Objetivo +filter.option.replacement = Reemplazo filter.option.wall = Muro filter.option.ore = Veta filter.option.floor2 = Terreno secundario @@ -484,11 +504,12 @@ width = Ancho: height = Alto: menu = Menú play = Jugar -campaign = Continuar Campaña +campaign = Campaña load = Cargar save = Guardar fps = FPS: {0} -ping = Ping: {0} ms +ping = Ping: {0}ms +tps = TPS: {0} memory = Mem: {0}mb memory2 = Mem:\n {0}mb +\n {1}mb language.restart = Reinicia el juego para que los cambios en el idioma tengan efecto. @@ -565,6 +586,7 @@ sector.attacked = Sector [accent]{0}[white] bajo ataque[]! sector.lost = ¡Sector [accent]{0}[white] perdido[]! #nota: el espacio en blanco en la línea siguiente es intencionado sector.captured = ¡Sector [accent]{0}[white] capturado[]! +sector.changeicon = Cambiar Icono threat.low = Baja threat.medium = Media @@ -611,6 +633,20 @@ sector.extractionOutpost.description = Una base remota, construida por el enemig sector.impact0078.description = Aquí yacen las ruinas de la primera estación de transporte interestelar en estar operativa del sistema.\n\nRecupera todo lo posible de los escombros. Investiga cualquier tecnología intacta. sector.planetaryTerminal.description = El objetivo final.\n\nÉsta base costera alberga una estructura capaz de lanzar Núcleos a planeteas locales. Está extremadamente bien protegida.\n\nProduce unidades navales. Acaba con el enemigo lo antes posible. Analiza la estructura de lanzamiento. +status.burning.name = En llamas +status.freezing.name = Congelado +status.wet.name = Húmedo +status.muddy.name = Fangoso +status.melting.name = Fundido +status.sapped.name = Debilitado +status.electrified.name = Electrificado +status.spore-slowed.name = Ralentizado +status.tarred.name = Alquitranado +status.overclock.name = Sobrecargado +status.shocked.name = Aturdido +status.blasted.name = Explotado +status.unmoving.name = Inmóvil + settings.language = Idioma settings.data = Datos del Juego settings.reset = Reiniciar a los valores por defecto @@ -632,6 +668,7 @@ settings.clearcampaignsaves.confirm = ¿Quieres borrar tus partidas guardadas en paused = [accent] < Pausado > clear = Vaciar banned = [scarlet]Baneado +unsupported.environment = [scarlet]Entorno no válido yes = Sí no = No info.title = Información @@ -641,12 +678,14 @@ unit.nobuild = [scarlet]Esta unidad no puede construir lastaccessed = [lightgray]Último usado: {0} block.unknown = [lightgray]??? +stat.showinmap = stat.description = Objetivo stat.input = Entrada stat.output = Salida stat.booster = Potenciador stat.tiles = Terreno requerido stat.affinities = Afinidades +stat.opposites = Opuestos stat.powercapacity = Capacidad de Energía stat.powershot = Energía/Disparo stat.damage = Daño @@ -669,6 +708,7 @@ stat.memorycapacity = Capacidad de memoria stat.basepowergeneration = Generación de energía stat.productiontime = Tiempo de producción stat.repairtime = Tiempo para Reparar Bloque Completamente +stat.repairspeed = Velocidad de Reparación stat.weapons = Armas stat.bullet = Proyectil stat.speedincrease = Aumento de Velocidad @@ -705,15 +745,24 @@ stat.minetier = Nivel de taladro stat.payloadcapacity = Capacidad de carga stat.commandlimit = Límite de comando stat.abilities = Habilidades -stat.canboost = Tiene Propulsores +stat.canboost = Potenciador stat.flying = Aéreo +stat.ammouse = Usa Munición +stat.damagemultiplier = Multiplicador de Daño +stat.healthmultiplier = Multiplicador de Vida +stat.speedmultiplier = Multiplicador de Velocidad +stat.reloadmultiplier = Multiplicador de Recarga +stat.buildspeedmultiplier = Multiplicador de Velocidad de Construcción +stat.reactive = Reacciona +stat.healing = Sanador -ability.forcefield = Campo de Fuerza +ability.forcefield = Campo de Escudo ability.repairfield = Campo de Reparación -ability.statusfield = Campo de Estado -ability.unitspawn = {0} Fábrica de Drones -ability.shieldregenfield = Campo de Regeneración de Escudos +ability.statusfield = {0} Campo de aceleración +ability.unitspawn = {0} Fábrica +ability.shieldregenfield = Regeneración de Armaduras ability.movelightning = Movimiento Relámpago +ability.energyfield = Campo de Energía: [accent]{0}[] daño ~ [accent]{1}[] bloques / [accent]{2}[] objetivos bar.drilltierreq = Requiere un taladro mejor bar.noresources = Recursos insuficientes @@ -736,29 +785,28 @@ bar.power = Energía bar.progress = Progreso de construcción bar.input = Entrada bar.output = Salida +bar.strength = [stat]{0}[lightgray]x fuerza units.processorcontrol = [lightgray]Controlado por Procesador bullet.damage = [stat]{0}[lightgray] Daño -bullet.splashdamage = [stat]{0}[lightgray] daño de área ~[stat] {1}[lightgray] casillas +bullet.splashdamage = [stat]{0}[lightgray] área daño ~[stat] {1}[lightgray] bloques bullet.incendiary = [stat]Incendiaria -bullet.sapping = [stat]Oxidante bullet.homing = [stat]Rastreadora -bullet.shock = [stat]Electrizante bullet.frag = [stat]De fragmentación -bullet.buildingdamage = [stat]{0}%[lightgray]daño a estructuras -bullet.knockback = [stat]{0}[lightgray] Empuje -bullet.pierce = [stat]{0}[lightgray]x penetración -bullet.infinitepierce = [stat]Penetrante +bullet.lightning = [stat]{0}[lightgray]x rayo ~ [stat]{1}[lightgray] daño +bullet.buildingdamage = [stat]{0}%[lightgray] daño a estructuras +bullet.knockback = [stat]{0}[lightgray] empuje +bullet.pierce = [stat]{0}[lightgray]x perforación +bullet.infinitepierce = [stat]Perforante bullet.healpercent = [stat]{0}[lightgray]% reparación -bullet.freezing = [stat]Congelación -bullet.tarred = [stat]Ralentizado bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munición bullet.reload = [stat]{0}[lightgray]x cadencia de fuego unit.blocks = bloques unit.blockssquared = bloques² unit.powersecond = unidades de energía/segundo +unit.tilessecond = bloques/segundo unit.liquidsecond = unidades de líquido/segundo unit.itemssecond = objetos/segundo unit.liquidunits = unidades de líquido @@ -775,6 +823,7 @@ unit.items = objetos unit.thousands = k unit.millions = M unit.billions = b +unit.pershot = /disparo category.purpose = Objetivo category.general = General category.power = Energía @@ -788,10 +837,13 @@ setting.shadows.name = Sombras setting.blockreplace.name = Sugerir bloques al construir setting.linear.name = Filtrado Lineal setting.hints.name = Consejos +setting.logichints.name = Consejos sobre "Bloques Lógicos" setting.flow.name = Mostrar tasa de flujo de recursos setting.backgroundpause.name = Pausar en segundo plano setting.buildautopause.name = Auto-pausar construcción -setting.animatedwater.name = Animaciones de Terreno +setting.doubletapmine.name = Doble-Click para Extraer minerales +setting.modcrashdisable.name = Desactivar Mods si se cuelga el juego +setting.animatedwater.name = Animación de Terreno setting.animatedshields.name = Animación de Escudos setting.antialias.name = Antialias[lightgray] (necesita un reinicio)[] setting.playerindicators.name = Indicadores de Jugadores @@ -844,6 +896,7 @@ setting.bridgeopacity.name = Opacidad de Puentes Transportadores setting.playerchat.name = Mostrar el chat de burbuja setting.showweather.name = Efectos visuales climáticos public.confirm = ¿Quieres hacer pública tu partida?\n[lightgray]Esto se puede cambiar más tarde en "Configuración->Juego->Visibilidad pública de la partida". +public.confirm.really = ¡Si quieres jugar con amigos, usa [green]Invitar a Amigos[] en lugar de un [scarlet]Servidor Público[]!\n¿De verdad quieres hacer [scarlet]pública[] tu partida? public.beta = Recuerda que no puedes crear partidas públicas en las versiones beta del juego. uiscale.reset = La escala de la interfaz ha sido modificada.\nPulsa "OK" para conservar esta escala.\n[scarlet]Se desharán los cambios automáticamente en [accent] {0}[] segundos... uiscale.cancel = Cancelar y Salir @@ -908,7 +961,8 @@ keybind.pause.name = Pausa keybind.pause_building.name = Pausar/Reanudar construcción keybind.minimap.name = Minimapa keybind.planet_map.name = Mapa del Planeta -keybind.research.name = Investigaciones +keybind.research.name = Investigar +keybind.block_info.name = Información del Bloque keybind.chat.name = Chat keybind.player_list.name = Lista de jugadores keybind.console.name = Consola @@ -935,18 +989,23 @@ mode.custom = Normas personalizadas rules.infiniteresources = Recursos infinitos rules.reactorexplosions = Los reactores pueden explotar +rules.coreincinerates = Núcleos inceran exceso de recursos rules.schematic = Permitir Plantillas rules.wavetimer = Temporizador de Oleadas rules.waves = Oleadas -rules.attack = Ataque -rules.buildai = La IA enemiga puede construir -rules.enemyCheat = La IA enemiga tiene recursos infinitos -rules.blockhealthmultiplier = Multiplicador de salud de bloque -rules.blockdamagemultiplier = Multiplicador de daño de bloque +rules.attack = Asalto +rules.buildai = Contrucción de IA +rules.corecapture = Capturar Núcleo al Destruirlo +rules.polygoncoreprotection = Protección de Núcleo Poligonal +rules.enemyCheat = La IA (Equipo Rojo) tiene recursos infinitos +rules.blockhealthmultiplier = Multiplicador de Salud de Bloque +rules.blockdamagemultiplier = Multiplicador de Daño de Bloque rules.unitbuildspeedmultiplier = Multiplicador de velocidad de creación de unidades -rules.unithealthmultiplier = Multiplicador de la vida de las unidades -rules.unitdamagemultiplier = Multiplicador del daño de unidades -rules.enemycorebuildradius = Radio de No-Construcción del Núcleo Enemigo:[lightgray] (casillas) +rules.unithealthmultiplier = Multiplicador de Vida de Unidades +rules.unitdamagemultiplier = Multiplicador de Daño de Unidades +rules.unitcapvariable = Núcleos alteran el Límite de Unidades +rules.unitcap = Límite Base de Unidades +rules.enemycorebuildradius = Radio de No-Construcción del Núcleo Enemigo:[lightgray] (bloques) rules.wavespacing = Tiempo entre oleadas:[lightgray] (seg) rules.buildcostmultiplier = Multiplicador de coste de construcción rules.buildspeedmultiplier = Multiplicador de velocidad de construcción @@ -967,12 +1026,14 @@ rules.explosions = Daño de explosiones de Bloques/Unidades rules.ambientlight = Iluminación ambiental rules.weather = Clima rules.weather.frequency = Frequencia: +rules.weather.always = Siempre rules.weather.duration = Duracion: content.item.name = Objetos content.liquid.name = Líquidos content.unit.name = Unidades content.block.name = Bloques +content.status.name = Alteraciones de Estado content.sector.name = Sectores item.copper.name = Cobre @@ -983,7 +1044,7 @@ item.titanium.name = Titanio item.thorium.name = Torio item.silicon.name = Silicio item.plastanium.name = Plastanio -item.phase-fabric.name = Tejido de fase +item.phase-fabric.name = Tejido de Fase item.surge-alloy.name = Aleación Eléctrica item.spore-pod.name = Vaina de Esporas item.sand.name = Arena @@ -991,11 +1052,12 @@ item.blast-compound.name = Compuesto Explosivo item.pyratite.name = Pirotita item.metaglass.name = Metacristal item.scrap.name = Chatarra + liquid.water.name = Agua liquid.slag.name = Magma liquid.oil.name = Petróleo liquid.cryofluid.name = Líquido criogénico -#Names of Units and Turrets look better untranslated, since they are propper/own names +#Names of Units and Turrets looks better untranslated, since they are propper/own names unit.dagger.name = Dagger unit.mace.name = Mace unit.fortress.name = Fortress @@ -1022,6 +1084,11 @@ unit.minke.name = Minke unit.bryde.name = Bryde unit.sei.name = Sei unit.omura.name = Omura +unit.retusa.name = Retusa +unit.oxynoe.name = Oxynoe +unit.cyerce.name = Cyerce +unit.aegires.name = Aegires +unit.navanax.name = Navanax unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma @@ -1082,23 +1149,25 @@ block.sand-water.name = Agua con arena block.darksand-water.name = Agua con arena oscura block.char.name = Cenizas block.dacite.name = Dacita -block.dacite-wall.name = Bloque de dacita -block.dacite-boulder.name = Roca de dacita +block.rhyolite.name = Riolita +block.dacite-wall.name = Bloque de Dacita +block.dacite-boulder.name = Roca de Dacita block.ice-snow.name = Hielo-Nieve -block.stone-wall.name = Bloque de piedra -block.ice-wall.name = Bloque de hielo -block.snow-wall.name = Bloque de nieve -block.dune-wall.name = Bloque de arena +block.stone-wall.name = Bloque de Piedra +block.ice-wall.name = Bloque de Hielo +block.snow-wall.name = Bloque de Nieve +block.dune-wall.name = Bloque de Arena block.pine.name = Pino block.dirt.name = Tierra block.dirt-wall.name = Bloque de tierra block.mud.name = Lodo block.white-tree-dead.name = Árbol Blanco Muerto block.white-tree.name = Árbol Blanco -block.spore-cluster.name = Concentración de Esporas -block.metal-floor.name = Suelo de Metal +block.spore-cluster.name = Esporas +block.metal-floor.name = Suelo de Metal 1 block.metal-floor-2.name = Suelo de Metal 2 block.metal-floor-3.name = Suelo de Metal 3 +block.metal-floor-4.name = Suelo de Metal 4 block.metal-floor-5.name = Suelo de Metal 5 block.metal-floor-damaged.name = Suelo de Metal dañado block.dark-panel-1.name = Panel Oscuro 1 @@ -1189,6 +1258,7 @@ block.solar-panel.name = Panel Solar block.solar-panel-large.name = Panel Solar Grande block.oil-extractor.name = Extractor de Petróleo block.repair-point.name = Punto de Reparación de Unidades +block.repair-turret.name = Torreta Reparadora block.pulse-conduit.name = Conducto de Pulso block.plated-conduit.name = Conducto Acorazado block.phase-conduit.name = Conducto de Fase @@ -1221,16 +1291,22 @@ block.container.name = Contenedor block.launch-pad.name = Plataforma de Lanzamiento block.launch-pad-large.name = Plataforma de Lanzamiento Grande block.segment.name = Segment -block.command-center.name = Centro de comando -block.ground-factory.name = Fábrica terrestre -block.air-factory.name = Fábrica aérea +block.command-center.name = Centro de Comando +block.ground-factory.name = Fábrica Terrestre +block.air-factory.name = Fábrica Aérea block.naval-factory.name = Fábrica naval -block.additive-reconstructor.name = Reconstructor aditivo -block.multiplicative-reconstructor.name = Reconstructor multiplicativo -block.exponential-reconstructor.name = Reconstructor exponencial -block.tetrative-reconstructor.name = Reconstructor tetrativo -block.payload-conveyor.name = Transportador de carga -block.payload-router.name = Enrutador de carga +block.additive-reconstructor.name = Reconstructor Aditivo +block.multiplicative-reconstructor.name = Reconstructor Multiplicativo +block.exponential-reconstructor.name = Reconstructor Exponencial +block.tetrative-reconstructor.name = Reconstructor Tetrativo +block.payload-conveyor.name = Cinta Transportadora de Carga +block.payload-router.name = Enrutador de Carga +block.duct.name = Túnel +block.duct-router.name = Túnel Enrutador +block.duct-bridge.name = Túnel Puente +block.payload-propulsion-tower.name = Torre de Propulsión de Bloques +block.payload-void.name = Vacío de Bloques +block.payload-source.name = Fuente de Bloques block.disassembler.name = Desensamblador block.silicon-crucible.name = Crisol de silicio block.overdrive-dome.name = Campo de Aceleración @@ -1252,7 +1328,6 @@ block.memory-bank.name = Servidor de memoria team.blue.name = azul team.crux.name = crux team.sharded.name = sharded -team.orange.name = naranja team.derelict.name = delerict team.green.name = verde team.purple.name = morado @@ -1273,6 +1348,7 @@ hint.placeConveyor.mobile = Las cintas transportadoras pueden mover objetos de l hint.placeTurret = Construye \uf861 [accent]Torretas[] para defender tu base de los enemigos.\n\nLas torretas necesitan munición - en este caso, \uf838cobre.\nUsa cintas transportadoras y taladros para abastecerlas con cobre. hint.breaking = Pulsa [accent]Clic-derecho[] y arrastra para destruir bloques. hint.breaking.mobile = Activa el botón con el \ue817 [accent]martillo[] situado abajo a la derecha y selecciona bloques para eliminarlos.\n\nMantén el dedo un segundo y arrastra para eliminar bloques directamente en esa selección. +hint.blockInfo = Puedes visualizar información de un bloque seleccionándolo en el [accent]menú de construcción[], mediante el botón [accent][[?][] en la derecha. hint.research = Usa el botón \ue875 [accent]Investigación[] para acceder al menú de descubrimientos tecnológicos. hint.research.mobile = Usa el botón \ue875 [accent]Investigación[] para acceder al menú de descubrimientos tecnológicos. hint.unitControl = Mantén [accent][[L-ctrl][] y [accent]haz clic[] sobre unidades o torretas aliadas para controlarlas manualmente. @@ -1319,7 +1395,7 @@ item.spore-pod.details = Esporas. Es algo parecido a una forma de vida sintétic item.blast-compound.description = Usado en bombas y munición explosiva. item.pyratite.description = Usado en armas incendiarias y generadores de combustión. -liquid.water.description = Usada comúnmente para enfriar máquinas y para procesar residuos. +liquid.water.description = Usada para enfriar máquinas y para procesar residuos. liquid.slag.description = Diferentes tipos de metales fundidos mezclados. Puede ser separado en sus minerales constituyentes, o disparado a unidades enemigas como arma. liquid.oil.description = Se utiliza en producción de materiales avanzados, y en munición incendiaria. liquid.cryofluid.description = Usado como refrigerante para reactores, torretas, y fábricas. @@ -1502,3 +1578,155 @@ unit.omura.description = Dispara rayos contínuos perforantes. Construye unidade unit.alpha.description = Defiende el núcleo Shard de los enemigos. Construye estructuras. unit.beta.description = Defiende el núcleo Foundation de los enemigos. Construye estructuras. unit.gamma.description = Defiende el núcleo Nucleus de los enemigos. Construye estructuras. + +lst.read = Lee un número desde una unidad de memoria conectada. +lst.write = Escribe un número en una unidad de memoria conectada. +lst.print = Añade texto a la cola para impresión.\nNo mostrará nada hasta que se use [accent]Ejecutar Imprimir[]. +lst.draw = Añade una operación a la cola de gráfico.\nNo mostrará nada hasta que se use [accent]Ejecutar Gráfico[]. +lst.drawflush = Ejecución en cola de operaciones [accent]Gráfico[] a un monitor gráfico. +lst.printflush = Ejecución en cola de operaciones [accent]Imprimir[] a un bloque de mensaje. +lst.getlink = Obtiene el número de enlace de procesador. Inicia en 0. +lst.control = Controla el estado de un bloque. +lst.radar = Localiza unidades alrededor de un bloque con rango. +lst.sensor = Recopila datos de un bloque o unidad. +lst.set = Establece una variable. +lst.operation = Realiza una operación sobre 1-2 variables. +lst.end = Salta al inicio de la lista de instrucciones. +lst.wait = Espera unos segundos. +lst.lookup = Busca un objeto/líquido/unidad/tipo de bloque por ID.\nSe puede acceder al número total de cada tipo con:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[] +lst.jump = Salta a otra instrucción. +lst.unitbind = Se enlaza a la siguiente unidad de un tipo, y la almacena en [accent]@unit[]. +lst.unitcontrol = Controla la unidad actualmente enlazada. +lst.unitradar = Localiza unidades alrededor de la unidad actualmente enlazada. +lst.unitlocate = Localiza un tipo específico de posición/bloque en cualquier lugar del mapa.\nRequiere una unidad enlazada. + +logic.nounitbuild = [red]No se permite la construcción de bloques de categoría lógica. + +lenum.type = El tipo de bloque/unidad\nEjemplo: "para cualquier enrutador", devolverá [accent]@router[].\nNo es una cadena de texto. +lenum.shoot = Dispara a una posición. +lenum.shootp = Dispara a una unidad/bloque con predicción de velocidad. +lenum.config = Configuración de bloque, por ejemplo: clasificador. +lenum.enabled = Si el bloque está activado o no. + +laccess.color = Color del iluminador. +laccess.controller = Controlador de unidad. Si se controla mediante un procesador, devuelve dicho procesador.\nSi está en formación, devuelve su líder.\nDe otra forma, devuelve la misma unidad. +laccess.dead = Si una unidad/bloque es destruída o inválida. +laccess.controlled = Devuelve:\n[accent]@ctrlProcessor[] si el control de la unidad lo tiene un procesador\n[accent]@ctrlPlayer[] si el control de la unidad/bloque lo tiene un jugador\n[accent]@ctrlFormation[] si la unidad está en formación\nDe otra forma, devuelve 0. +laccess.commanded = [red]En desuso. ¡Será eliminado![]\nUsa [accent]controlado[] en su lugar. +laccess.progress = Progreso de una acción, 0 a 1.\nDevuelve de una producción, recarga de una torreta o progreso de una construcción. + +graphicstype.clear = Llena el monitor con un color. +graphicstype.color = Establece el color para próximas operaciones de gráficos. +graphicstype.stroke = Establece el ancho de la línea. +graphicstype.line = Segmento de la línea del gráfico. +graphicstype.rect = Rellena un rectángulo. +graphicstype.linerect = Dibuja las aristas de un rectángulo. +graphicstype.poly = Rellena un polígono regular. +graphicstype.linepoly = Dibuja las aristas de un polígono regular. +graphicstype.triangle = Rellena un triángulo. +graphicstype.image = Dibuja una imágen de un contenido.\nEjemplo: [accent]@router[] o [accent]@dagger[]. + +lenum.always = Siempre "true". +lenum.idiv = División de un número entero. +lenum.div = División.\nDevuelve [accent]null[] al dividir entre cero. +lenum.mod = Modulo. +lenum.equal = Igual. Coacciona tipos.\nObjetos no-nulos coaccionados con números pasan a 1, si no coinciden pasan a 0. +lenum.notequal = No igual. Coacciona tipos. +lenum.strictequal = Igualdad estricta. No coacciona tipos.\nSe puede usar para comprobar si un resultado es [accent]null[]. +lenum.shl = Cambia bits a izquierda. +lenum.shr = Cambia bits a derecha. +lenum.or = Comprobación bit a bit OR. +lenum.land = Comprobación lógica AND. +lenum.and = Comprobación bit a bit AND. +lenum.not = Comprobación bit a bit invertida. +lenum.xor = Comprobación bit a bit XOR. + +lenum.min = Mínimo de dos números. +lenum.max = Máximo de dos números. +lenum.angle = Ángulo del vector en grados. +lenum.len = Longitud del vector. + +lenum.sin = Seno, en grados. +lenum.cos = Coseno, en grados. +lenum.tan = Tangente, en grados. + +lenum.asin = Arco seno, en grados. +lenum.acos = Arco coseno, en grados. +lenum.atan = Arco tangente, en grados. + +#not a typo, look up 'range notation' +lenum.rand = Número decimal aleatorio en un rango [0, valor). +lenum.log = Logaritmo natural (ln). +lenum.log10 = Logaritmo en base 10. +lenum.noise = Ruido simplex 2D. +lenum.abs = Valor absoluto. +lenum.sqrt = Raíz cuadrada. + +lenum.any = Cualquier unidad. +lenum.ally = Unidad aliada. +lenum.attacker = Unidad con un arma. +lenum.enemy = Unidad enemiga. +lenum.boss = Unidad guardián (Jefe). +lenum.flying = Unidad aérea. +lenum.ground = Unidad terrestre. +lenum.player = Unidad controlada por un jugador. + +lenum.ore = Depósito mineral. +lenum.damaged = Bloque aliado dañado. +lenum.spawn = Punto de aterrizaje enemigo.\nPuede ser un núcleo o una posición. +lenum.building = Un bloque de una categoría específica. + +lenum.core = Cualquier núcleo. +lenum.storage = Bloque de almacenamiento, ejemplo: Contenedor. +lenum.generator = Bloques que generan energía. +lenum.factory = Bloques que transforman recursos. +lenum.repair = Puntos de reparación. +lenum.rally = Centro de comando. +lenum.battery = Cualquier batería. +lenum.resupply = Puntos de reabastecimiento.\nSólo es relevante cuando [accent]"Unidades necesitan munición"[] está activada. +lenum.reactor = Reactor de Impacto/Torio. +lenum.turret = Cualquier torreta. + +sensor.in = El bloque/unidad a detectar. + +radar.from = Bloque del que detectar.\nEl rango del sensor está limitado por el rango de dicha construcción. +radar.target = Filtro de unidades a detectar. +radar.and = Filtros adicionales. +radar.order = Orden para ordenar. 0 para invertir. +radar.sort = Métrica a usar al ordenar resultados. +radar.output = Variable en la que escribir la salida de una unidad. + +unitradar.target = Filtro para detectar unidades. +unitradar.and = Filtros adicionales. +unitradar.order = Orden para ordenar. 0 para invertir. +unitradar.sort = Métrica a usar al ordenar resultados. +unitradar.output = Variable en la que escribir la salida de una unidad. + +control.of = Bloque a controlar. +control.unit = Unidad/bloque al que apuntar. +control.shoot = Cuándo disparar. + +unitlocate.enemy = Cuándo localizar construcciones enemigas. +unitlocate.found = Cuándo el objeto es encontrado. +unitlocate.building = Variable de salida para contrucciones localizadas. +unitlocate.outx = Coordenada X devuelta. +unitlocate.outy = Coordenada Y devuelta. +unitlocate.group = Grupo de bloque a buscar. + +lenum.idle = No se mueve, pero seguirá construyendo/extrayendo minerales.\nEs el estado por defecto. +lenum.stop = Deja de moverse/extraer minerales/contruir. +lenum.move = Moverse a una posición exacta. +lenum.approach = Aproximarse a una posición con un radio. +lenum.pathfind = Establece una ruta hasta el punto de aterrizaje enemigo. +lenum.target = Dispara a una posición. +lenum.targetp = Dispara a un objetivo con predicción de velocidad. +lenum.itemdrop = Suelta un objeto. +lenum.itemtake = Recoge un objeto de una construcción. +lenum.paydrop = Suelta la carga actual. +lenum.paytake = Recoge bloques o unidades en la posición actual como carga a trasnportar. +lenum.flag = Etiqueta numérica de la unidad. +lenum.mine = Extrae minerales de una posición. +lenum.build = Construye una estructura. +lenum.getblock = Obtiene la construcción y su categoría en unas coordenadas específicas.\nLa unidad debe estar en el rango de su posición.\nLos bloques no-construcciones tendrán el tipo [accent]@solid[]. +lenum.within = Comprueba si una unidad se encuentra cerca de una posición. +lenum.boost = Inicia/Detiene potenciación. From 2a1fdded72022fe50c17742b16426c4d922c2c2d Mon Sep 17 00:00:00 2001 From: VizardAlpha <43859764+VizardAlpha@users.noreply.github.com> Date: Mon, 12 Jul 2021 20:49:24 +0200 Subject: [PATCH 21/42] bundle_fr.properties Updates (#5558) * bundle_fr.properties Updates Add new commits * Update Bundle --- core/assets/bundles/bundle_fr.properties | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index d89400769f..942ae5c750 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -807,6 +807,7 @@ bullet.reload = [stat]{0}[lightgray]x vitesse de tir unit.blocks = blocs unit.blockssquared = blocs² unit.powersecond = unités d'énergie/seconde +unit.tilessecond = tuiles/seconde unit.liquidsecond = unités de liquide/seconde unit.itemssecond = objets/seconde unit.liquidunits = unités de liquide @@ -1601,6 +1602,8 @@ lst.sensor = Récupère des données depuis un bâtiment ou une unité. lst.set = Définit une variable. lst.operation = Effectue une opération sur 1 ou 2 variables. lst.end = Saute au sommet de la série d’instructions. +lst.wait = Attendre un certain nombre de secondes. +lst.lookup = Recherche d'un type d'objet/liquide/unité/bloc par ID.\nLe nombre total de chaque type peut être consulté avec:\n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[] lst.jump = Saute conditionnellement vers une autre instruction. lst.unitbind = Se lie à une unité du type donné et la stocke dans [accent]@unit[]. lst.unitcontrol = Contrôle l'unité actuellement liée. From ce6c39b7aa08712ddf6f4be7200abe0ca5f73bab Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 12 Jul 2021 15:06:41 -0400 Subject: [PATCH 22/42] Reorganized settings --- .../src/mindustry/ui/dialogs/SettingsMenuDialog.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index dccf2dadcb..7c6ed01a38 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -287,7 +287,8 @@ public class SettingsMenuDialog extends Dialog{ sound.sliderPref("sfxvol", bundle.get("setting.sfxvol.name", "SFX Volume"), 100, 0, 100, 1, i -> i + "%"); sound.sliderPref("ambientvol", bundle.get("setting.ambientvol.name", "Ambient Volume"), 100, 0, 100, 1, i -> i + "%"); - game.screenshakePref(); + game.sliderPref("saveinterval", 60, 10, 5 * 120, 10, i -> Core.bundle.format("setting.seconds", i)); + if(mobile){ game.checkPref("autotarget", true); game.checkPref("keyboard", false, val -> { @@ -308,7 +309,6 @@ public class SettingsMenuDialog extends Dialog{ control.setInput(new MobileInput()); } }*/ - game.sliderPref("saveinterval", 60, 10, 5 * 120, 10, i -> Core.bundle.format("setting.seconds", i)); if(!mobile){ game.checkPref("crashreport", true); @@ -351,6 +351,8 @@ public class SettingsMenuDialog extends Dialog{ Core.settings.put("uiscalechanged", s != lastUiScale[0]); return s + "%"; }); + + graphics.sliderPref("screenshake", 4, 0, 8, i -> (i / 4f) + "x"); graphics.sliderPref("fpscap", 240, 15, 245, 5, s -> (s > 240 ? Core.bundle.get("setting.fpscap.none") : Core.bundle.format("setting.fpscap.text", s))); graphics.sliderPref("chatopacity", 100, 0, 100, 5, s -> s + "%"); graphics.sliderPref("lasersopacity", 100, 0, 100, 5, s -> { @@ -560,10 +562,6 @@ public class SettingsMenuDialog extends Dialog{ rebuild(); } - public void screenshakePref(){ - sliderPref("screenshake", bundle.get("setting.screenshake.name", "Screen Shake"), 4, 0, 8, i -> (i / 4f) + "x"); - } - public SliderSetting sliderPref(String name, String title, int def, int min, int max, StringProcessor s){ return sliderPref(name, title, def, min, max, 1, s); } @@ -701,7 +699,7 @@ public class SettingsMenuDialog extends Dialog{ slider.change(); - table.stack(slider, value).width(420f).left().padTop(4); + table.stack(slider, value).width(Math.min(Core.graphics.getWidth() / 1.2f, 460f)).left().padTop(4); table.row(); } } From 3c688d3fecad36b9df99e4ddbc426fd580d27a9a Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 12 Jul 2021 15:35:08 -0400 Subject: [PATCH 23/42] arc --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index a0c542efe2..da2c038cd7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,4 +10,4 @@ kapt.include.compile.classpath=false kotlin.stdlib.default.dependency=false #needed for android compilation android.useAndroidX=true -archash=ca3a52e9571ff20f9dd6c43337740539f407d3dd +archash=b8db131172548e1f10ba86392e09819c34296711 From a1f5982a85d076bba4f9a8819f1019ce8459d867 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 12 Jul 2021 15:36:43 -0400 Subject: [PATCH 24/42] Fixed loading bar stroke not scaling correctly --- core/src/mindustry/ui/WarningBar.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/ui/WarningBar.java b/core/src/mindustry/ui/WarningBar.java index efa124f8ab..c528c308a5 100644 --- a/core/src/mindustry/ui/WarningBar.java +++ b/core/src/mindustry/ui/WarningBar.java @@ -2,6 +2,7 @@ package mindustry.ui; import arc.graphics.g2d.*; import arc.scene.*; +import arc.scene.ui.layout.*; import mindustry.graphics.*; public class WarningBar extends Element{ @@ -27,7 +28,7 @@ public class WarningBar extends Element{ rx + barWidth, y ); } - Lines.stroke(3f); + Lines.stroke(Scl.scl(3f)); Lines.line(x, y, x + width, y); Lines.line(x, y + height, x + width, y + height); From e0d249898e5bfffab7602207ff506e85fd98d35d Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 12 Jul 2021 16:18:29 -0400 Subject: [PATCH 25/42] Fixed mod dialog width... again. --- core/src/mindustry/ui/dialogs/ModsDialog.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index 944995a20c..abad12a00a 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -80,9 +80,7 @@ public class ModsDialog extends BaseDialog{ } shown(this::setup); - if(mobile){ - onResize(this::setup); - } + onResize(this::setup); Events.on(ResizeEvent.class, event -> { if(currentContent != null){ @@ -144,10 +142,10 @@ public class ModsDialog extends BaseDialog{ void setup(){ float h = 110f; - float w = Math.min(Core.graphics.getWidth() / 1.1f, 520f); + float w = Math.min(Core.graphics.getWidth() / Scl.scl(1.05f), 520f); cont.clear(); - cont.defaults().width(Math.min(Core.graphics.getWidth() / 1.2f, 556f)).pad(4); + cont.defaults().width(Math.min(Core.graphics.getWidth() / Scl.scl(1.05f), 556f)).pad(4); cont.add("@mod.reloadrequired").visible(mods::requiresReload).center().get().setAlignment(Align.center); cont.row(); From 8041c305ad3a4a2f046b835b4acc533b33c471b7 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 13 Jul 2021 10:28:35 -0400 Subject: [PATCH 26/42] Misc bugfixes --- core/assets/bundles/bundle.properties | 1 + core/src/mindustry/Vars.java | 5 ----- core/src/mindustry/entities/bullet/BulletType.java | 4 ++-- core/src/mindustry/entities/comp/BuildingComp.java | 1 - core/src/mindustry/entities/comp/PhysicsComp.java | 1 + core/src/mindustry/world/meta/StatValues.java | 2 +- 6 files changed, 5 insertions(+), 9 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index c38e4b930f..89e7c59f2c 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -101,6 +101,7 @@ customgame = Custom Game newgame = New Game none = none.found = [lightgray] +none.inmap = [lightgray] minimap = Minimap position = Position close = Close diff --git a/core/src/mindustry/Vars.java b/core/src/mindustry/Vars.java index ac5268e59b..a167606c00 100644 --- a/core/src/mindustry/Vars.java +++ b/core/src/mindustry/Vars.java @@ -24,10 +24,8 @@ import mindustry.logic.*; import mindustry.maps.Map; import mindustry.maps.*; import mindustry.mod.*; -import mindustry.net.Net; import mindustry.net.*; import mindustry.service.*; -import mindustry.world.*; import java.io.*; import java.nio.charset.*; @@ -113,8 +111,6 @@ public class Vars implements Loadable{ public static final float tilePayload = tilesize * tilesize; /** icon sizes for UI */ public static final float iconXLarge = 8*6f, iconLarge = 8*5f, iconMed = 8*4f, iconSmall = 8*3f; - /** tile used in certain situations, instead of null */ - public static Tile emptyTile; /** for map generator dialog */ public static boolean updateEditorOnChange = false; /** all choosable player colors in join/host dialog */ @@ -278,7 +274,6 @@ public class Vars implements Loadable{ schematicDirectory = dataDirectory.child("schematics/"); bebuildDirectory = dataDirectory.child("be_builds/"); emptyMap = new Map(new StringMap()); - emptyTile = null; if(tree == null) tree = new FileTree(); if(mods == null) mods = new Mods(); diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index ebe84d0f24..4a1df75e62 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -232,8 +232,8 @@ public class BulletType extends Content implements Cloneable{ } if(entity instanceof Unit unit){ - Tmp.v3.set(unit).sub(b.x, b.y).nor().scl(knockback * 80f); - if(impact) Tmp.v3.setAngle(b.rotation()); + Tmp.v3.set(unit).sub(b).nor().scl(knockback * 80f); + if(impact) Tmp.v3.setAngle(b.rotation() + (knockback < 0 ? 180f : 0f)); unit.impulse(Tmp.v3); unit.apply(status, statusDuration); } diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index 83c20b40ab..24d4e5cb3e 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -106,7 +106,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, /** Sets up all the necessary variables, but does not add this entity anywhere. */ public Building create(Block block, Team team){ - this.tile = emptyTile; this.block = block; this.team = team; diff --git a/core/src/mindustry/entities/comp/PhysicsComp.java b/core/src/mindustry/entities/comp/PhysicsComp.java index 1924de8eb9..a3009fe2a8 100644 --- a/core/src/mindustry/entities/comp/PhysicsComp.java +++ b/core/src/mindustry/entities/comp/PhysicsComp.java @@ -2,6 +2,7 @@ package mindustry.entities.comp; import arc.math.*; import arc.math.geom.*; +import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.async.PhysicsProcess.*; import mindustry.gen.*; diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index 4a7704e36f..fc2ff2609d 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -143,7 +143,7 @@ public class StatValues{ } } }else{ - c.add("@none.found"); + c.add("@none.inmap"); } }else{ c.add("@stat.showinmap"); From 47038ac06d157cedbd73665c3cc69742373287ef Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 13 Jul 2021 10:33:44 -0400 Subject: [PATCH 27/42] Longer mod test timeout --- tests/src/test/java/GenericModTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/src/test/java/GenericModTest.java b/tests/src/test/java/GenericModTest.java index 46843116f7..10b75c1d24 100644 --- a/tests/src/test/java/GenericModTest.java +++ b/tests/src/test/java/GenericModTest.java @@ -13,7 +13,7 @@ public class GenericModTest{ static void grabMod(String url){ //clear older mods ApplicationTests.testDataFolder.deleteDirectory(); - Http.get(url).error(Assertions::fail).block(httpResponse -> { + Http.get(url).error(Assertions::fail).timeout(20000).block(httpResponse -> { try{ ApplicationTests.testDataFolder.child("mods").child("test_mod." + (url.endsWith("jar") ? "jar" : "zip")).writeBytes(Streams.copyBytes(httpResponse.getResultAsStream())); }catch(IOException e){ From 0eec955a3d485305b8a4de94564c70484605f7dc Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 13 Jul 2021 10:42:00 -0400 Subject: [PATCH 28/42] #5563 --- .../blocks/production/GenericCrafter.java | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/core/src/mindustry/world/blocks/production/GenericCrafter.java b/core/src/mindustry/world/blocks/production/GenericCrafter.java index bd684fcf8a..31e3093140 100644 --- a/core/src/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/mindustry/world/blocks/production/GenericCrafter.java @@ -15,7 +15,10 @@ import mindustry.world.draw.*; import mindustry.world.meta.*; public class GenericCrafter extends Block{ + /** Written to outputItems as a single-element array if outputItems is null. */ public @Nullable ItemStack outputItem; + /** Overwrites outputItem if not null. */ + public @Nullable ItemStack[] outputItems; public @Nullable LiquidStack outputLiquid; public float craftTime = 80; @@ -45,8 +48,8 @@ public class GenericCrafter extends Block{ super.setStats(); stats.add(Stat.productionTime, craftTime / 60f, StatUnit.seconds); - if(outputItem != null){ - stats.add(Stat.output, StatValues.items(craftTime, outputItem)); + if(outputItems != null){ + stats.add(Stat.output, StatValues.items(craftTime, outputItems)); } if(outputLiquid != null){ @@ -64,6 +67,9 @@ public class GenericCrafter extends Block{ @Override public void init(){ outputsLiquid = outputLiquid != null; + if(outputItems == null && outputItem != null){ + outputItems = new ItemStack[]{outputItem}; + } super.init(); } @@ -74,7 +80,7 @@ public class GenericCrafter extends Block{ @Override public boolean outputsItems(){ - return outputItem != null; + return outputItems != null; } public class GenericCrafterBuild extends Building{ @@ -95,8 +101,12 @@ public class GenericCrafter extends Block{ @Override public boolean shouldConsume(){ - if(outputItem != null && items.get(outputItem.item) + outputItem.amount > itemCapacity){ - return false; + if(outputItems != null){ + for(ItemStack output : outputItems){ + if(items.get(output.item) + output.amount > itemCapacity){ + return false; + } + } } return (outputLiquid == null || !(liquids.get(outputLiquid.liquid) >= liquidCapacity - 0.001f)) && enabled; } @@ -119,9 +129,11 @@ public class GenericCrafter extends Block{ if(progress >= 1f){ consume(); - if(outputItem != null){ - for(int i = 0; i < outputItem.amount; i++){ - offload(outputItem.item); + if(outputItems != null){ + for(ItemStack output : outputItems){ + for(int i = 0; i < output.amount; i++){ + offload(output.item); + } } } @@ -133,8 +145,10 @@ public class GenericCrafter extends Block{ progress %= 1f; } - if(outputItem != null && timer(timerDump, dumpTime / timeScale)){ - dump(outputItem.item); + if(outputItems != null && timer(timerDump, dumpTime / timeScale)){ + for(ItemStack output : outputItems){ + dump(output.item); + } } if(outputLiquid != null){ @@ -174,4 +188,4 @@ public class GenericCrafter extends Block{ if(legacyReadWarmup) read.f(); } } -} +} \ No newline at end of file From e5412aeb1ba0b9ba2689bfd6303d2ac3e902bccb Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 13 Jul 2021 17:38:42 -0400 Subject: [PATCH 29/42] Inventory constant cleanup --- core/src/mindustry/core/UI.java | 2 +- core/src/mindustry/type/Weapon.java | 3 +-- core/src/mindustry/ui/fragments/BlockInventoryFragment.java | 5 +++-- core/src/mindustry/world/blocks/storage/CoreBlock.java | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/mindustry/core/UI.java b/core/src/mindustry/core/UI.java index d6aff3d11d..e2902bca83 100644 --- a/core/src/mindustry/core/UI.java +++ b/core/src/mindustry/core/UI.java @@ -33,7 +33,7 @@ import static arc.scene.actions.Actions.*; import static mindustry.Vars.*; public class UI implements ApplicationListener, Loadable{ - private static String billions, millions, thousands; + public static String billions, millions, thousands; public static PixmapPacker packer; diff --git a/core/src/mindustry/type/Weapon.java b/core/src/mindustry/type/Weapon.java index ca002353bc..4fb99cf01a 100644 --- a/core/src/mindustry/type/Weapon.java +++ b/core/src/mindustry/type/Weapon.java @@ -285,8 +285,7 @@ public class Weapon implements Cloneable{ can && //must be able to shoot (!useAmmo || unit.ammo > 0 || !state.rules.unitAmmo || unit.team.rules().infiniteAmmo) && //check ammo (!alternate || mount.side == flipSprite) && - //TODO checking for velocity this way isn't entirely correct - (unit.vel.len() >= mount.weapon.minShootVelocity || (net.active() && !unit.isLocal())) && //check velocity requirements + unit.vel.len() >= mount.weapon.minShootVelocity && //check velocity requirements mount.reload <= 0.0001f && //reload has to be 0 Angles.within(rotate ? mount.rotation : unit.rotation, mount.targetRotation, mount.weapon.shootCone) //has to be within the cone ){ diff --git a/core/src/mindustry/ui/fragments/BlockInventoryFragment.java b/core/src/mindustry/ui/fragments/BlockInventoryFragment.java index e63acaac4e..ecad1514fa 100644 --- a/core/src/mindustry/ui/fragments/BlockInventoryFragment.java +++ b/core/src/mindustry/ui/fragments/BlockInventoryFragment.java @@ -14,6 +14,7 @@ import arc.scene.ui.layout.Stack; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; +import mindustry.core.*; import mindustry.game.EventType.*; import mindustry.gen.*; import mindustry.type.*; @@ -200,9 +201,9 @@ public class BlockInventoryFragment extends Fragment{ private String round(float f){ f = (int)f; if(f >= 1000000){ - return (int)(f / 1000000f) + "[gray]" + Core.bundle.getOrNull("unit.millions") + "[]"; + return (int)(f / 1000000f) + "[gray]" + UI.millions; }else if(f >= 1000){ - return (int)(f / 1000) + Core.bundle.getOrNull("unit.thousands"); + return (int)(f / 1000) + UI.thousands; }else{ return (int)f + ""; } diff --git a/core/src/mindustry/world/blocks/storage/CoreBlock.java b/core/src/mindustry/world/blocks/storage/CoreBlock.java index 52844719d7..4106277667 100644 --- a/core/src/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/mindustry/world/blocks/storage/CoreBlock.java @@ -281,7 +281,7 @@ public class CoreBlock extends StorageBlock{ @Override public void afterDestroyed(){ if(state.rules.coreCapture){ - tile.setBlock(block, lastDamage); + tile.setNet(block, lastDamage, 0); //core is invincible for several seconds to prevent recapture ((CoreBuild)tile.build).iframes = captureInvicibility; } From 173dd0a90e93b15e5a676a06489a4f2e5daf9214 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 14 Jul 2021 09:07:17 -0400 Subject: [PATCH 30/42] Fixed #5577 --- core/src/mindustry/ai/BlockIndexer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/ai/BlockIndexer.java b/core/src/mindustry/ai/BlockIndexer.java index 2fb2467437..430630f5d3 100644 --- a/core/src/mindustry/ai/BlockIndexer.java +++ b/core/src/mindustry/ai/BlockIndexer.java @@ -106,7 +106,7 @@ public class BlockIndexer{ public void removeIndex(Tile tile){ var team = tile.team(); - if(team != Team.derelict && tile.isCenter()){ + if(tile.build != null && tile.isCenter()){ var flags = tile.block().flags; var data = team.data(); From 2801e4ed80289642e5a20682d3337313aab60d3f Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 14 Jul 2021 09:14:19 -0400 Subject: [PATCH 31/42] Fixed #5579 --- core/src/mindustry/logic/LExecutor.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index 73a83c00b2..c2b3fac347 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -363,6 +363,9 @@ public class LExecutor{ float x1 = World.unconv(exec.numf(p1)), y1 = World.unconv(exec.numf(p2)), d1 = World.unconv(exec.numf(p3)); switch(type){ + case idle -> { + ai.control = type; + } case move, stop, approach -> { ai.control = type; ai.moveX = x1; From 353ef05b93b9d4b50c93d00a6435002437689c56 Mon Sep 17 00:00:00 2001 From: RebornTrack970 <62565267+RebornTrack970@users.noreply.github.com> Date: Wed, 14 Jul 2021 16:23:41 +0300 Subject: [PATCH 32/42] OmegaHub is back (kinda) (#5578) --- servers_v7.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers_v7.json b/servers_v7.json index f66d3d631d..9dc02e7370 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -20,7 +20,7 @@ }, { "name": "Omega", - "address": ["157.90.180.53:25777", "redstonneur1256.ml"] + "address": ["157.90.180.53:25777", "redstonneur1256.ml", "185.86.230.61:25571"] }, { "name": "MeowLand", From 7619e7643d002a24607898b33074a857d3c0bed9 Mon Sep 17 00:00:00 2001 From: alex <67626131+alexpvpmindustry@users.noreply.github.com> Date: Wed, 14 Jul 2021 21:23:53 +0800 Subject: [PATCH 33/42] Update v6 servers for alex servers (#5576) --- servers_v6.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers_v6.json b/servers_v6.json index dfe95bd8eb..6d1bad5a2a 100644 --- a/servers_v6.json +++ b/servers_v6.json @@ -45,7 +45,7 @@ }, { "name": "ALEX", - "address": ["alexmindustryhub.ddns.net:6568", "alexmindustry.ddns.net:6568", "alexmindustry.ddns.net:6569", "alexmindustryattac.ddns.net:25800","alexmindustryturbo.ddns.net:25854","alexmindustryhex.ddns.net:25587"] + "address": ["alexmindustryhub.ddns.net:6568", "alexmindustry.ddns.net:25586", "alexmindustry.ddns.net:25587", "alexmindustryattac.ddns.net:25800","alexmindustryturbo.ddns.net:25581","alexmindustryhex.ddns.net:25583"] }, { "name": "Minty [subzero]", From 44aff82a6c8b6d7023d834ee5a030f26c7d24c87 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 14 Jul 2021 09:27:59 -0400 Subject: [PATCH 34/42] "Fixed" #5580 --- core/src/mindustry/world/blocks/payloads/Payload.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/src/mindustry/world/blocks/payloads/Payload.java b/core/src/mindustry/world/blocks/payloads/Payload.java index 5cc05471b5..9563db51d3 100644 --- a/core/src/mindustry/world/blocks/payloads/Payload.java +++ b/core/src/mindustry/world/blocks/payloads/Payload.java @@ -6,6 +6,7 @@ import arc.util.*; import arc.util.io.*; import mindustry.game.*; import mindustry.gen.*; +import mindustry.ui.*; import mindustry.world.*; import static mindustry.Vars.*; @@ -47,6 +48,12 @@ public interface Payload extends Position{ /** @return icon describing the contents. */ TextureRegion icon(); + /** @deprecated use icon() instead. */ + @Deprecated + default TextureRegion icon(Cicon icon){ + return icon(); + } + @Override default float getX(){ return x(); From 2f6846d8c386144789172adb46f7064c1a55f031 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 14 Jul 2021 15:12:00 -0400 Subject: [PATCH 35/42] Conveyor tweaks --- core/src/mindustry/world/blocks/distribution/Conveyor.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/world/blocks/distribution/Conveyor.java b/core/src/mindustry/world/blocks/distribution/Conveyor.java index a5608bd1f6..1714e038df 100644 --- a/core/src/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/mindustry/world/blocks/distribution/Conveyor.java @@ -14,7 +14,6 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.input.*; import mindustry.type.*; -import mindustry.ui.*; import mindustry.world.*; import mindustry.world.blocks.*; import mindustry.world.meta.*; @@ -247,7 +246,7 @@ public class Conveyor extends Block implements Autotiler{ if(ys[i] > nextMax) ys[i] = nextMax; if(ys[i] > 0.5 && i > 0) mid = i - 1; - xs[i] = Mathf.approachDelta(xs[i], 0, speed*2); + xs[i] = Mathf.approach(xs[i], 0, moved*2); if(ys[i] >= 1f && pass(ids[i])){ //align X position if passing forwards @@ -263,7 +262,7 @@ public class Conveyor extends Block implements Autotiler{ } if(minitem < itemSpace + (blendbits == 1 ? 0.3f : 0f)){ - clogHeat = Mathf.lerpDelta(clogHeat, 1f, 0.02f); + clogHeat = Mathf.approachDelta(clogHeat, 1f, 1f / 60f); }else{ clogHeat = 0f; } From 9de4c89e76beb13fb3e6cc0214cfdc98adc48cc4 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 14 Jul 2021 15:55:40 -0400 Subject: [PATCH 36/42] Fixed #5582 --- core/src/mindustry/content/StatusEffects.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/src/mindustry/content/StatusEffects.java b/core/src/mindustry/content/StatusEffects.java index 2ea8af6c9d..bc0a7e4864 100644 --- a/core/src/mindustry/content/StatusEffects.java +++ b/core/src/mindustry/content/StatusEffects.java @@ -47,7 +47,6 @@ public class StatusEffects implements ContentList{ affinity(blasted, ((unit, result, time) -> { unit.damagePierce(transitionDamage); - result.set(freezing, time); })); }); }}; @@ -75,7 +74,6 @@ public class StatusEffects implements ContentList{ if(unit.team == state.rules.waveTeam){ Events.fire(Trigger.shock); } - result.set(wet, time); })); opposite(burning, melting); }); From ac25e172865559e402eee8dca2e2823d3fc622da Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 14 Jul 2021 16:06:03 -0400 Subject: [PATCH 37/42] Unused property cleanup --- core/src/mindustry/content/Blocks.java | 1 - core/src/mindustry/world/blocks/environment/Floor.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 5971ae6bde..fcadf439f9 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -235,7 +235,6 @@ public class Blocks implements ContentList{ magmarock = new Floor("magmarock"){{ attributes.set(Attribute.heat, 0.75f); attributes.set(Attribute.water, -0.75f); - updateEffect = Fx.magmasmoke; blendGroup = basalt; emitLight = true; diff --git a/core/src/mindustry/world/blocks/environment/Floor.java b/core/src/mindustry/world/blocks/environment/Floor.java index 762a5e4f9d..9bb4cc5aed 100644 --- a/core/src/mindustry/world/blocks/environment/Floor.java +++ b/core/src/mindustry/world/blocks/environment/Floor.java @@ -52,8 +52,6 @@ public class Floor extends Block{ public boolean playerUnmineable = false; /** Group of blocks that this block does not draw edges on. */ public Block blendGroup = this; - /** Effect displayed when randomly updated. */ - public Effect updateEffect = Fx.none; /** Array of affinities to certain things. */ public Attributes attributes = new Attributes(); /** Whether this ore generates in maps by default. */ From dd5389c738bcc1cdb6694670552bda3fdf1589ef Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 14 Jul 2021 17:22:21 -0400 Subject: [PATCH 38/42] New sound for rock/plant breaking --- core/assets/sounds/plantBreak.ogg | Bin 0 -> 8270 bytes core/assets/sounds/rockBreak.ogg | Bin 0 -> 16627 bytes core/src/mindustry/content/Blocks.java | 1 + .../mindustry/entities/comp/BuildingComp.java | 2 +- core/src/mindustry/world/Block.java | 6 ++++-- .../mindustry/world/blocks/ConstructBlock.java | 4 ++-- .../world/blocks/environment/Prop.java | 3 +++ 7 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 core/assets/sounds/plantBreak.ogg create mode 100644 core/assets/sounds/rockBreak.ogg diff --git a/core/assets/sounds/plantBreak.ogg b/core/assets/sounds/plantBreak.ogg new file mode 100644 index 0000000000000000000000000000000000000000..08d911b3e7c45509c5632405d675d71502087fa6 GIT binary patch literal 8270 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 RI>C(X)~dGKFKt#Z0RW2)q4@v+ literal 0 HcmV?d00001 diff --git a/core/assets/sounds/rockBreak.ogg b/core/assets/sounds/rockBreak.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6a17a5edc2516b33dbb4fcd5f3082b70aec13f93 GIT binary patch literal 16627 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©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 maxBlockSize) throw new IllegalArgumentException("No. Don't place ConstructBlock of size greater than " + maxBlockSize); + if(size > maxBlockSize) throw new IllegalArgumentException("No. Don't place ConstructBlocks of size greater than " + maxBlockSize); return consBlocks[size - 1]; } @@ -57,7 +57,7 @@ public class ConstructBlock extends Block{ block.breakEffect.at(tile.drawx(), tile.drawy(), block.size, block.mapColor); Events.fire(new BlockBuildEndEvent(tile, builder, team, true, null)); tile.remove(); - if(shouldPlay()) Sounds.breaks.at(tile, calcPitch(false)); + if(shouldPlay()) block.breakSound.at(tile, calcPitch(false)); } @Remote(called = Loc.server) diff --git a/core/src/mindustry/world/blocks/environment/Prop.java b/core/src/mindustry/world/blocks/environment/Prop.java index 45da9aae88..0e7807acdd 100644 --- a/core/src/mindustry/world/blocks/environment/Prop.java +++ b/core/src/mindustry/world/blocks/environment/Prop.java @@ -4,15 +4,18 @@ import arc.*; import arc.graphics.g2d.*; import arc.math.*; import mindustry.content.*; +import mindustry.gen.*; import mindustry.world.*; public class Prop extends Block{ + public Prop(String name){ super(name); breakable = true; alwaysReplace = true; instantDeconstruct = true; breakEffect = Fx.breakProp; + breakSound = Sounds.rockBreak; } @Override From a559c3581e93194636ceefdce8ae269548fd7fbf Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 14 Jul 2021 18:46:51 -0400 Subject: [PATCH 39/42] Fixed continuous weapon sounds / Improved naval support audio --- core/assets/sounds/mineDeploy.ogg | Bin 0 -> 8428 bytes core/src/mindustry/content/UnitTypes.java | 4 ++++ .../entities/abilities/EnergyFieldAbility.java | 6 ++++++ core/src/mindustry/type/Weapon.java | 5 ++++- 4 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 core/assets/sounds/mineDeploy.ogg diff --git a/core/assets/sounds/mineDeploy.ogg b/core/assets/sounds/mineDeploy.ogg new file mode 100644 index 0000000000000000000000000000000000000000..69fb5d2f984c2d83d49e36ea43e01b795c1d480b GIT binary patch literal 8428 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 { color(Pal.heal); diff --git a/core/src/mindustry/entities/abilities/EnergyFieldAbility.java b/core/src/mindustry/entities/abilities/EnergyFieldAbility.java index 0109128f38..8681e37843 100644 --- a/core/src/mindustry/entities/abilities/EnergyFieldAbility.java +++ b/core/src/mindustry/entities/abilities/EnergyFieldAbility.java @@ -1,6 +1,7 @@ package mindustry.entities.abilities; import arc.*; +import arc.audio.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; @@ -19,6 +20,7 @@ public class EnergyFieldAbility extends Ability{ public float damage = 1, reload = 100, range = 60; public Effect healEffect = Fx.heal, hitEffect = Fx.hitLaserBlast, damageEffect = Fx.chainLightning; public StatusEffect status = StatusEffects.electrified; + public Sound shootSound = Sounds.spark; public float statusDuration = 60f * 6f; public float x, y; public boolean hitBuildings = true; @@ -139,6 +141,10 @@ public class EnergyFieldAbility extends Ability{ } } + if(anyNearby){ + shootSound.at(unit); + } + timer = 0f; } } diff --git a/core/src/mindustry/type/Weapon.java b/core/src/mindustry/type/Weapon.java index 4fb99cf01a..33729c9636 100644 --- a/core/src/mindustry/type/Weapon.java +++ b/core/src/mindustry/type/Weapon.java @@ -249,7 +249,7 @@ public class Weapon implements Cloneable{ unit.vel.add(Tmp.v1.trns(unit.rotation + 180f, mount.bullet.type.recoil)); if(shootSound != Sounds.none && !headless){ if(mount.sound == null) mount.sound = new SoundLoop(shootSound, 1f); - mount.sound.update(x, y, true); + mount.sound.update(bulletX, bulletY, true); } } }else{ @@ -323,6 +323,9 @@ public class Weapon implements Cloneable{ Time.run(sequenceNum * shotDelay + firstShotDelay, () -> { if(!unit.isAdded()) return; mount.bullet = bullet(unit, shootX + unit.x - baseX, shootY + unit.y - baseY, f + Mathf.range(inaccuracy), lifeScl); + if(!continuous){ + shootSound.at(shootX, shootY, Mathf.random(soundPitchMin, soundPitchMax)); + } }); sequenceNum++; }); From a9f9ddcacfbd4f801f65e865443a547116a6cc98 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 14 Jul 2021 19:52:43 -0400 Subject: [PATCH 40/42] AnnotationProxyMaker workaround cleanup --- .../util/AnnotationProxyMaker.java | 47 +++---------------- .../mindustry/annotations/util/Selement.java | 4 ++ tools/src/mindustry/tools/Generators.java | 2 +- 3 files changed, 12 insertions(+), 41 deletions(-) diff --git a/annotations/src/main/java/mindustry/annotations/util/AnnotationProxyMaker.java b/annotations/src/main/java/mindustry/annotations/util/AnnotationProxyMaker.java index c3398f3ae8..64d86a4346 100644 --- a/annotations/src/main/java/mindustry/annotations/util/AnnotationProxyMaker.java +++ b/annotations/src/main/java/mindustry/annotations/util/AnnotationProxyMaker.java @@ -7,6 +7,7 @@ import com.sun.tools.javac.code.Attribute.Enum; import com.sun.tools.javac.code.Attribute.Error; import com.sun.tools.javac.code.Attribute.Visitor; import com.sun.tools.javac.code.Attribute.*; +import com.sun.tools.javac.code.Scope.*; import com.sun.tools.javac.code.Type; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type.ArrayType; @@ -64,36 +65,13 @@ public class AnnotationProxyMaker{ LinkedHashMap map = new LinkedHashMap(); ClassSymbol cl = (ClassSymbol)this.anno.type.tsym; - //try to use Java 8 API for this if possible - try{ - Class entryClass = Class.forName("com.sun.tools.javac.code.Scope$Entry"); - Object members = cl.members(); - Field field = members.getClass().getField("elems"); - Object elems = field.get(members); - Field siblingField = entryClass.getField("sibling"); - Field symField = entryClass.getField("sym"); - for(Object currEntry = elems; currEntry != null; currEntry = siblingField.get(currEntry)){ - handleSymbol((Symbol)symField.get(currEntry), map); - } - - }catch(Throwable e){ - //otherwise try other API - - try{ - Class lookupClass = Class.forName("com.sun.tools.javac.code.Scope$LookupKind"); - Field nonRecField = lookupClass.getField("NON_RECURSIVE"); - Object nonRec = nonRecField.get(null); - Scope scope = cl.members(); - Method getSyms = scope.getClass().getMethod("getSymbols", lookupClass); - Iterable it = (Iterable)getSyms.invoke(scope, nonRec); - Iterator i = it.iterator(); - while(i.hasNext()){ - handleSymbol(i.next(), map); + for(Symbol s : cl.members().getSymbols(LookupKind.NON_RECURSIVE)){ + if(s.getKind() == ElementKind.METHOD){ + MethodSymbol var4 = (MethodSymbol)s; + Attribute var5 = var4.getDefaultValue(); + if(var5 != null){ + map.put(var4, var5); } - - }catch(Throwable death){ - //I tried - throw new RuntimeException(death); } } @@ -104,17 +82,6 @@ public class AnnotationProxyMaker{ return map; } - private void handleSymbol(Symbol sym, LinkedHashMap map){ - - if(sym.getKind() == ElementKind.METHOD){ - MethodSymbol var4 = (MethodSymbol)sym; - Attribute var5 = var4.getDefaultValue(); - if(var5 != null){ - map.put(var4, var5); - } - } - } - private Object generateValue(MethodSymbol var1, Attribute var2){ AnnotationProxyMaker.ValueVisitor var3 = new AnnotationProxyMaker.ValueVisitor(var1); return var3.getValue(var2); diff --git a/annotations/src/main/java/mindustry/annotations/util/Selement.java b/annotations/src/main/java/mindustry/annotations/util/Selement.java index ca7a9ce5ad..c416f83b0a 100644 --- a/annotations/src/main/java/mindustry/annotations/util/Selement.java +++ b/annotations/src/main/java/mindustry/annotations/util/Selement.java @@ -12,6 +12,10 @@ import java.lang.Class; import java.lang.annotation.*; import java.lang.reflect.*; +/** + * Wrapper over Element with added utility functions. + * I would have preferred to use extension methods for this, but Java doesn't have any. + * */ public class Selement{ public final T e; diff --git a/tools/src/mindustry/tools/Generators.java b/tools/src/mindustry/tools/Generators.java index 2c188946b3..c78e7dbb5f 100644 --- a/tools/src/mindustry/tools/Generators.java +++ b/tools/src/mindustry/tools/Generators.java @@ -598,7 +598,7 @@ public class Generators{ }); } - /** Generates a scorch pixmap based on parameters. Thread safe, unless multiple scorch generators are running in parallel. */ + /** Generates a scorch pixmap based on parameters. Thread safe. */ public static class ScorchGenerator{ public int size = 80, seed = 0, color = Color.whiteRgba; public double scale = 18, pow = 2, octaves = 4, pers = 0.4, add = 2, nscl = 4.5f; From 0c3d7e09e0f3e82fcf980745f2246ae98a3352b9 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 14 Jul 2021 21:40:47 -0400 Subject: [PATCH 41/42] Don't crash when font glyphs are missing --- core/src/mindustry/ui/Fonts.java | 8 ++++++-- gradle.properties | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/ui/Fonts.java b/core/src/mindustry/ui/Fonts.java index 295a292c98..7beff27396 100644 --- a/core/src/mindustry/ui/Fonts.java +++ b/core/src/mindustry/ui/Fonts.java @@ -236,8 +236,12 @@ public class Fonts{ } public static TextureRegionDrawable getGlyph(Font font, char glyph){ - Glyph g = font.getData().getGlyph(glyph); - if(g == null) throw new IllegalArgumentException("No glyph: " + glyph + " (" + (int)glyph + ")"); + Glyph found = font.getData().getGlyph(glyph); + if(found == null){ + Log.warn("No icon found for glyph: @ (@)", glyph, (int)glyph); + found = font.getData().getGlyph('F'); + } + Glyph g = found; float size = Math.max(g.width, g.height); TextureRegionDrawable draw = new TextureRegionDrawable(new TextureRegion(font.getRegion().texture, g.u, g.v2, g.u2, g.v)){ diff --git a/gradle.properties b/gradle.properties index da2c038cd7..642357fb9e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,4 +10,4 @@ kapt.include.compile.classpath=false kotlin.stdlib.default.dependency=false #needed for android compilation android.useAndroidX=true -archash=b8db131172548e1f10ba86392e09819c34296711 +archash=fbdfa0307101b881e208f53666c1f4b7ebf0fe90 From 61d81046aefc10834296f56e755dcbfc2106f359 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 15 Jul 2021 08:46:56 -0400 Subject: [PATCH 42/42] Fixed #5583 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a20b848221..95b6c068ad 100644 --- a/build.gradle +++ b/build.gradle @@ -57,7 +57,7 @@ allprojects{ if(!project.hasProperty("versionType")) versionType = 'official' appName = 'Mindustry' steamworksVersion = '0b86023401880bb5e586bc404bedbaae9b1f1c94' - rhinoVersion = '55bf0dac1cfa7770672fd26112512c733ca9d5dc' + rhinoVersion = '0601de1f37d55b25d2a6e647acba336f40cdefe4' loadVersionProps = { return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p }