From 4886ee35e99c6d03627134677322fbe64b576f6a Mon Sep 17 00:00:00 2001 From: Matthew Peng <54301439+MEEPofFaith@users.noreply.github.com> Date: Mon, 20 Sep 2021 06:32:30 -0700 Subject: [PATCH 01/45] Status Field Effect X/Y (#6009) * Status Field Effect X/Y * h * aaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA --- .../src/mindustry/entities/abilities/StatusFieldAbility.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/entities/abilities/StatusFieldAbility.java b/core/src/mindustry/entities/abilities/StatusFieldAbility.java index 4c1d2e3c78..73a9a614cb 100644 --- a/core/src/mindustry/entities/abilities/StatusFieldAbility.java +++ b/core/src/mindustry/entities/abilities/StatusFieldAbility.java @@ -1,6 +1,7 @@ package mindustry.entities.abilities; import arc.*; +import arc.math.*; import arc.util.*; import mindustry.content.*; import mindustry.entities.*; @@ -12,6 +13,7 @@ public class StatusFieldAbility extends Ability{ public float duration = 60, reload = 100, range = 20; public Effect applyEffect = Fx.none; public Effect activeEffect = Fx.overdriveWave; + public float effectX, effectY; public boolean parentizeEffects; protected float timer; @@ -40,7 +42,8 @@ public class StatusFieldAbility extends Ability{ applyEffect.at(other, parentizeEffects); }); - activeEffect.at(unit, parentizeEffects); + float x = unit.x + Angles.trnsx(unit.rotation, effectY, effectX), y = unit.y + Angles.trnsy(unit.rotation, effectY, effectX); + activeEffect.at(x, y, unit.rotation, parentizeEffects ? unit : null); timer = 0f; } From 8a6f3db20ecbc49cea7dcfee934d6b6a697fc039 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 20 Sep 2021 12:38:29 -0400 Subject: [PATCH 02/45] Fixed #6028 --- core/src/mindustry/logic/LExecutor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index 1fcf1b37d1..04482fb521 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -1,6 +1,7 @@ package mindustry.logic; import arc.*; +import arc.math.*; import arc.math.geom.*; import arc.struct.*; import arc.util.*; @@ -449,7 +450,7 @@ public class LExecutor{ case build -> { if(state.rules.logicUnitBuild && unit.canBuild() && exec.obj(p3) instanceof Block block && block.canBeBuilt()){ int x = World.toTile(x1 - block.offset/tilesize), y = World.toTile(y1 - block.offset/tilesize); - int rot = exec.numi(p4); + int rot = Mathf.mod(exec.numi(p4), 4); //reset state of last request when necessary if(ai.plan.x != x || ai.plan.y != y || ai.plan.block != block || unit.plans.isEmpty()){ From b60acf2c37ec9f429d7daf957f2443b1cb40cfb7 Mon Sep 17 00:00:00 2001 From: Matthew Peng <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 21 Sep 2021 05:36:34 -0700 Subject: [PATCH 03/45] Option to parentize status effect effects (#6030) --- core/src/mindustry/type/StatusEffect.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/type/StatusEffect.java b/core/src/mindustry/type/StatusEffect.java index 20d5b1809e..837c08b276 100644 --- a/core/src/mindustry/type/StatusEffect.java +++ b/core/src/mindustry/type/StatusEffect.java @@ -33,6 +33,8 @@ public class StatusEffect extends UnlockableContent{ public float damage; /** Chance of effect appearing. */ public float effectChance = 0.15f; + /** Should the effect be given a parent */ + public boolean parentizeEffect; /** If true, the effect never disappears. */ public boolean permanent; /** If true, this effect will only react with other effects and cannot be applied. */ @@ -120,7 +122,7 @@ public class StatusEffect extends UnlockableContent{ if(effect != Fx.none && Mathf.chanceDelta(effectChance)){ Tmp.v1.rnd(Mathf.range(unit.type.hitSize/2f)); - effect.at(unit.x + Tmp.v1.x, unit.y + Tmp.v1.y, color); + effect.at(unit.x + Tmp.v1.x, unit.y + Tmp.v1.y, 0, color, parentizeEffect ? unit : null); } } From 3a8ba568b5d0da14b73f19b79fa611021aea8f10 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 21 Sep 2021 09:42:19 -0400 Subject: [PATCH 04/45] Fixed main -> mainClass deprecation warning --- desktop/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/desktop/build.gradle b/desktop/build.gradle index 981815b7fc..0685daceb5 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -9,7 +9,7 @@ def ICON_DIR = new File("$rootDir/core/assets/icons/icon.icns") def platforms = ["Linux64", "Windows64", "Windows32", "MacOS"] task run(dependsOn: classes, type: JavaExec){ - main = project.mainClassName + mainClass = project.mainClassName classpath = sourceSets.main.runtimeClasspath standardInput = System.in workingDir = project.assetsDir @@ -30,7 +30,7 @@ task run(dependsOn: classes, type: JavaExec){ } if(args.contains("debug")){ - main = "mindustry.debug.DebugLauncher" + mainClass = "mindustry.debug.DebugLauncher" } } From 00cb441704c55b78554e01f4ac2d6bf546d5a112 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 21 Sep 2021 13:50:20 -0400 Subject: [PATCH 05/45] Fixed #6032 --- core/src/mindustry/ui/dialogs/SchematicsDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/ui/dialogs/SchematicsDialog.java b/core/src/mindustry/ui/dialogs/SchematicsDialog.java index a23dfd9881..dd16b937d0 100644 --- a/core/src/mindustry/ui/dialogs/SchematicsDialog.java +++ b/core/src/mindustry/ui/dialogs/SchematicsDialog.java @@ -35,7 +35,7 @@ public class SchematicsDialog extends BaseDialog{ private String search = ""; private TextField searchField; private Runnable rebuildPane = () -> {}, rebuildTags = () -> {}; - private Pattern ignoreSymbols = Pattern.compile("[`~!@#$%^&*()-_=+{}|;:'\",<.>/?]"); + private Pattern ignoreSymbols = Pattern.compile("[`~!@#$%^&*()\\-_=+{}|;:'\",<.>/?]"); private Seq tags, selectedTags = new Seq<>(); private boolean checkedTags; From deca57c2d90005a6d980000dd75040c4ff3d6f70 Mon Sep 17 00:00:00 2001 From: Darkness#3729 <79508138+Darkness6030@users.noreply.github.com> Date: Wed, 22 Sep 2021 20:33:18 +0300 Subject: [PATCH 06/45] Add a new gamemode, improve port (#6033) :-/ --- servers_v7.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers_v7.json b/servers_v7.json index 61dab76e3a..65d54ef732 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -21,7 +21,7 @@ }, { "name": "DarkDustry", - "address": ["darkdustry.ml", "darkdustry.ml:3000", "darkdustry.ml:7000", "darkdustry.ml:8000"] + "address": ["darkdustry.ml", "darkdustry.ml:6000", "darkdustry.ml:7000", "darkdustry.ml:8000", "darkdustry.ml:9000"] }, { "name": "Chaotic Neutral", From c92433c5f9cfa315b7cbf31081d3c86d0efc8022 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 22 Sep 2021 18:01:04 -0400 Subject: [PATCH 07/45] Attempting JDK 17 again --- .github/workflows/push.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 1409aef4ff..1b20252efb 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -17,9 +17,9 @@ jobs: git tag ${BNUM} git config --global user.name "Build Uploader" git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds ${BNUM} - - name: Set up JDK 16 + - name: Set up JDK 17 uses: actions/setup-java@v1 with: - java-version: 16 + java-version: 17 - name: Run unit tests run: ./gradlew clean cleanTest test From 4377eacfd53b64cfcfc86bac0a68842ca3ce40d5 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 22 Sep 2021 18:11:51 -0400 Subject: [PATCH 08/45] Updated Jabel for JDK 17 compatibility --- build.gradle | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 30e0ce32cb..b5f0cb1ada 100644 --- a/build.gradle +++ b/build.gradle @@ -375,7 +375,7 @@ project(":core"){ if(localArc() && debugged()) api arcModule("extensions:recorder") if(localArc()) api arcModule(":extensions:packer") - annotationProcessor 'com.github.Anuken:jabel:34e4c172e65b3928cd9eabe1993654ea79c409cd' + annotationProcessor 'com.github.Anuken:jabel:0.5.0' compileOnly project(":annotations") kapt project(":annotations") } diff --git a/gradle.properties b/gradle.properties index ed17ac9ae6..ddfe321771 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,4 +11,4 @@ android.useAndroidX=true #used for slow jitpack builds; TODO see if this actually works http.socketTimeout=80000 http.connectionTimeout=80000 -archash=6f56e0a3a33c0c7752c8aff868df035cf242e7aa +archash=3400de3323150ba91c94fc07a6d4ca1958f4d943 From ec886456c82cb36d9077aa4ad3a7e737e61fad6d Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 22 Sep 2021 18:15:27 -0400 Subject: [PATCH 09/45] really? From 83dc70b0547744017e2fc8e0d97706ee2faa37ed Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 22 Sep 2021 18:17:54 -0400 Subject: [PATCH 10/45] Run tests with --stacktrace --- .github/workflows/push.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 1b20252efb..98933cfe0f 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -22,4 +22,4 @@ jobs: with: java-version: 17 - name: Run unit tests - run: ./gradlew clean cleanTest test + run: ./gradlew clean cleanTest test --stacktrace From 45f6fde6891bb6a5b4b62d80269324f56af46459 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 22 Sep 2021 18:22:28 -0400 Subject: [PATCH 11/45] ??? --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index b5f0cb1ada..44b7a1954a 100644 --- a/build.gradle +++ b/build.gradle @@ -199,6 +199,7 @@ allprojects{ sourceCompatibility = JavaVersion.VERSION_16 options.encoding = "UTF-8" options.compilerArgs += ["-Xlint:deprecation"] + options.fork = true dependsOn clearCache options.forkOptions.jvmArgs += [ From 76e5c51a12e9b7478f1a3984b41d2009ca2b0177 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 22 Sep 2021 18:26:04 -0400 Subject: [PATCH 12/45] ???? --- build.gradle | 1 - gradle.properties | 9 ++++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 44b7a1954a..b5f0cb1ada 100644 --- a/build.gradle +++ b/build.gradle @@ -199,7 +199,6 @@ allprojects{ sourceCompatibility = JavaVersion.VERSION_16 options.encoding = "UTF-8" options.compilerArgs += ["-Xlint:deprecation"] - options.fork = true dependsOn clearCache options.forkOptions.jvmArgs += [ diff --git a/gradle.properties b/gradle.properties index ddfe321771..a8c970fa3d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,12 @@ org.gradle.daemon=true -org.gradle.jvmargs=-Xms256m -Xmx1024m --illegal-access=permit +org.gradle.jvmargs=-Xms256m -Xmx1024m \ +--add-opens jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED \ +--add-opens jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \ +--add-opens jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED \ +--add-opens jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED \ +--add-opens jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED \ +--add-opens jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED \ +--add-opens jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED # Multithreaded kapt.use.worker.api=true # Compilation avoidance (see https://kotlinlang.org/docs/kapt.html#compile-avoidance-for-kapt-since-1-3-20) From 6f8ae1b5a39797394813e9302a4d705dbd7ccdd0 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 22 Sep 2021 18:32:14 -0400 Subject: [PATCH 13/45] h --- build.gradle | 4 ++-- gradle.properties | 20 +++++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index b5f0cb1ada..edbc0af15b 100644 --- a/build.gradle +++ b/build.gradle @@ -23,8 +23,8 @@ buildscript{ } plugins{ - id 'org.jetbrains.kotlin.jvm' version '1.5.21' - id "org.jetbrains.kotlin.kapt" version "1.5.21" + id 'org.jetbrains.kotlin.jvm' version '1.5.31' + id "org.jetbrains.kotlin.kapt" version "1.5.31" } allprojects{ diff --git a/gradle.properties b/gradle.properties index a8c970fa3d..96873ac245 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,12 +1,18 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m \ ---add-opens jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED \ ---add-opens jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \ ---add-opens jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED \ ---add-opens jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED \ ---add-opens jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED \ ---add-opens jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED \ ---add-opens jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED +--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \ +--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED \ +--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED \ +--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED \ +--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED \ +--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED \ +--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \ +--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \ +--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED \ +--add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED \ +--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED \ +--add-opens=java.base/sun.reflect.annotation=ALL-UNNAMED + # Multithreaded kapt.use.worker.api=true # Compilation avoidance (see https://kotlinlang.org/docs/kapt.html#compile-avoidance-for-kapt-since-1-3-20) From dc2ff1e933d3cc7a966f310154f6f24e049fd2e8 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 22 Sep 2021 18:40:00 -0400 Subject: [PATCH 14/45] Switch to 'slightly faster' Jabel version --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index edbc0af15b..e351da8c9d 100644 --- a/build.gradle +++ b/build.gradle @@ -375,7 +375,7 @@ project(":core"){ if(localArc() && debugged()) api arcModule("extensions:recorder") if(localArc()) api arcModule(":extensions:packer") - annotationProcessor 'com.github.Anuken:jabel:0.5.0' + annotationProcessor 'com.github.Anuken:jabel:0.6.0' compileOnly project(":annotations") kapt project(":annotations") } From 0c4592fbc8b49f8d5fdaf47c76b4b4539ce72227 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 22 Sep 2021 18:43:13 -0400 Subject: [PATCH 15/45] ok jitpack From 6d41b894ab8d76554308c86593a92c2526c6cff5 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 22 Sep 2021 19:21:58 -0400 Subject: [PATCH 16/45] Slight difficulty increase of Desolate Rift --- core/assets/maps/desolateRift.msav | Bin 8835 -> 8980 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/core/assets/maps/desolateRift.msav b/core/assets/maps/desolateRift.msav index 71c433d81a8dccd0a4a4506408ed05691cbbda99..59c7d307feae8082df0d31acb62216a048e64caf 100644 GIT binary patch literal 8980 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 i5_YZ|7uI`E2 Date: Wed, 22 Sep 2021 19:35:15 -0400 Subject: [PATCH 17/45] Sync/save @tick/@time; make @time be based off of @tick Closes Anuken/Mindustry-Suggestions/issues/2976 --- core/src/mindustry/core/GameState.java | 2 ++ core/src/mindustry/core/Logic.java | 3 +++ core/src/mindustry/io/SaveVersion.java | 2 ++ core/src/mindustry/logic/LExecutor.java | 7 ++++--- core/src/mindustry/net/NetworkIO.java | 2 ++ 5 files changed, 13 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/core/GameState.java b/core/src/mindustry/core/GameState.java index 33050b996e..6ed3800eb1 100644 --- a/core/src/mindustry/core/GameState.java +++ b/core/src/mindustry/core/GameState.java @@ -16,6 +16,8 @@ public class GameState{ public int wave = 1; /** Wave countdown in ticks. */ public float wavetime; + /** Logic tick. */ + public double tick; /** Whether the game is in game over state. */ public boolean gameOver = false, serverPaused = false; /** Server ticks/second. Only valid in multiplayer. */ diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index d0a6b24a35..1facfa1c96 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -370,6 +370,9 @@ public class Logic implements ApplicationListener{ } if(!state.isPaused()){ + float delta = Core.graphics.getDeltaTime(); + state.tick += Float.isNaN(delta) || Float.isInfinite(delta) ? 0f : delta * 60f; + state.teams.updateTeamStats(); if(state.isCampaign()){ diff --git a/core/src/mindustry/io/SaveVersion.java b/core/src/mindustry/io/SaveVersion.java index 527742d836..ec3b09d0c5 100644 --- a/core/src/mindustry/io/SaveVersion.java +++ b/core/src/mindustry/io/SaveVersion.java @@ -92,6 +92,7 @@ public abstract class SaveVersion extends SaveFileReader{ "build", Version.build, "mapname", state.map.name(), "wave", state.wave, + "tick", state.tick, "wavetime", state.wavetime, "stats", JsonIO.write(state.stats), "rules", JsonIO.write(state.rules), @@ -110,6 +111,7 @@ public abstract class SaveVersion extends SaveFileReader{ state.wave = map.getInt("wave"); state.wavetime = map.getFloat("wavetime", state.rules.waveSpacing); + state.tick = map.getFloat("tick"); state.stats = JsonIO.read(GameStats.class, map.get("stats", "{}")); state.rules = JsonIO.read(Rules.class, map.get("rules", "{}")); if(state.rules.spawns.isEmpty()) state.rules.spawns = waves.get(); diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index 04482fb521..c0dc4df1c5 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -57,9 +57,10 @@ public class LExecutor{ /** Runs a single instruction. */ public void runOnce(){ - //set time - vars[varTime].numval = Time.millis(); - vars[varTick].numval = Time.time; + //set up time; note that @time is now only updated once every invocation and directly based off of @tick. + //having time be based off of user system time was a very bad idea. + vars[varTime].numval = state.tick / 60.0 * 1000.0; + vars[varTick].numval = state.tick; //reset to start if(vars[varCounter].numval >= instructions.length || vars[varCounter].numval < 0){ diff --git a/core/src/mindustry/net/NetworkIO.java b/core/src/mindustry/net/NetworkIO.java index 9253f71181..d81955fa42 100644 --- a/core/src/mindustry/net/NetworkIO.java +++ b/core/src/mindustry/net/NetworkIO.java @@ -40,6 +40,7 @@ public class NetworkIO{ stream.writeInt(state.wave); stream.writeFloat(state.wavetime); + stream.writeDouble(state.tick); stream.writeInt(player.id); player.write(Writes.get(stream)); @@ -61,6 +62,7 @@ public class NetworkIO{ state.wave = stream.readInt(); state.wavetime = stream.readFloat(); + state.tick = stream.readDouble(); Groups.clear(); int id = stream.readInt(); From 90d1770b3e3c129591224351821310b972f5c22e Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 22 Sep 2021 20:12:09 -0400 Subject: [PATCH 18/45] Attempt to synchronized logic random seed --- core/src/mindustry/core/NetClient.java | 8 +++++++- core/src/mindustry/core/NetServer.java | 4 +++- core/src/mindustry/logic/GlobalConstants.java | 3 +++ core/src/mindustry/logic/LogicOp.java | 4 ++-- core/src/mindustry/net/NetworkIO.java | 5 +++++ gradle.properties | 2 +- 6 files changed, 21 insertions(+), 5 deletions(-) diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index 6a0d0929d9..065cf8635c 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -19,6 +19,7 @@ import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.game.Teams.*; import mindustry.gen.*; +import mindustry.logic.*; import mindustry.net.Administration.*; import mindustry.net.*; import mindustry.net.Packets.*; @@ -452,7 +453,7 @@ public class NetClient implements ApplicationListener{ } @Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true) - public static void stateSnapshot(float waveTime, int wave, int enemies, boolean paused, boolean gameOver, int timeData, byte tps, byte[] coreData){ + public static void stateSnapshot(float waveTime, int wave, int enemies, boolean paused, boolean gameOver, int timeData, byte tps, long rand0, long rand1, byte[] coreData){ try{ if(wave > state.wave){ state.wave = wave; @@ -466,6 +467,11 @@ public class NetClient implements ApplicationListener{ state.serverPaused = paused; state.serverTps = tps & 0xff; + //note that this is far from a guarantee that random state is synced - tiny changes in delta and ping can throw everything off again. + //syncing will only make much of a difference when rand() is called infrequently + GlobalConstants.rand.seed0 = rand0; + GlobalConstants.rand.seed1 = rand1; + universe.updateNetSeconds(timeData); netClient.byteStream.setBytes(coreData); diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 9c6ae4cd83..d528f672f5 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -19,6 +19,7 @@ import mindustry.game.*; import mindustry.game.Teams.*; import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.logic.*; import mindustry.net.*; import mindustry.net.Administration.*; import mindustry.net.Packets.*; @@ -867,7 +868,8 @@ public class NetServer implements ApplicationListener{ dataStream.close(); //write basic state data. - Call.stateSnapshot(player.con, state.wavetime, state.wave, state.enemies, state.serverPaused, state.gameOver, universe.seconds(), tps, syncStream.toByteArray()); + Call.stateSnapshot(player.con, state.wavetime, state.wave, state.enemies, state.serverPaused, state.gameOver, + universe.seconds(), tps, GlobalConstants.rand.seed0, GlobalConstants.rand.seed1, syncStream.toByteArray()); syncStream.reset(); diff --git a/core/src/mindustry/logic/GlobalConstants.java b/core/src/mindustry/logic/GlobalConstants.java index e631906760..d86735f405 100644 --- a/core/src/mindustry/logic/GlobalConstants.java +++ b/core/src/mindustry/logic/GlobalConstants.java @@ -2,6 +2,7 @@ package mindustry.logic; import arc.*; import arc.files.*; +import arc.math.*; import arc.struct.*; import arc.util.*; import mindustry.*; @@ -18,6 +19,8 @@ import java.io.*; public class GlobalConstants{ public static final int ctrlProcessor = 1, ctrlPlayer = 2, ctrlFormation = 3; public static final ContentType[] lookableContent = {ContentType.block, ContentType.unit, ContentType.item, ContentType.liquid}; + /** Global random state. */ + public static final Rand rand = new Rand(); private ObjectIntMap namesToIds = new ObjectIntMap<>(); private Seq vars = new Seq<>(Var.class); diff --git a/core/src/mindustry/logic/LogicOp.java b/core/src/mindustry/logic/LogicOp.java index 9604279584..79e56b1ca8 100644 --- a/core/src/mindustry/logic/LogicOp.java +++ b/core/src/mindustry/logic/LogicOp.java @@ -34,13 +34,13 @@ public enum LogicOp{ angle("angle", true, (x, y) -> Angles.angle((float)x, (float)y)), len("len", true, (x, y) -> Mathf.dst((float)x, (float)y)), noise("noise", true, (x, y) -> Simplex.raw2d(0, x, y)), - abs("abs", a -> Math.abs(a)), + abs("abs", a -> Math.abs(a)), //not a method reference because it fails to compile for some reason log("log", Math::log), log10("log10", Math::log10), floor("floor", Math::floor), ceil("ceil", Math::ceil), sqrt("sqrt", Math::sqrt), - rand("rand", d -> Mathf.rand.nextDouble() * d), + rand("rand", d -> GlobalConstants.rand.nextDouble() * d), sin("sin", d -> Math.sin(d * Mathf.doubleDegRad)), cos("cos", d -> Math.cos(d * Mathf.doubleDegRad)), diff --git a/core/src/mindustry/net/NetworkIO.java b/core/src/mindustry/net/NetworkIO.java index d81955fa42..dee54a92d1 100644 --- a/core/src/mindustry/net/NetworkIO.java +++ b/core/src/mindustry/net/NetworkIO.java @@ -9,6 +9,7 @@ import mindustry.ctype.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.io.*; +import mindustry.logic.*; import mindustry.maps.Map; import mindustry.net.Administration.*; @@ -41,6 +42,8 @@ public class NetworkIO{ stream.writeInt(state.wave); stream.writeFloat(state.wavetime); stream.writeDouble(state.tick); + stream.writeLong(GlobalConstants.rand.seed0); + stream.writeLong(GlobalConstants.rand.seed1); stream.writeInt(player.id); player.write(Writes.get(stream)); @@ -63,6 +66,8 @@ public class NetworkIO{ state.wave = stream.readInt(); state.wavetime = stream.readFloat(); state.tick = stream.readDouble(); + GlobalConstants.rand.seed0 = stream.readLong(); + GlobalConstants.rand.seed1 = stream.readLong(); Groups.clear(); int id = stream.readInt(); diff --git a/gradle.properties b/gradle.properties index 96873ac245..10fbb45adc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,4 +24,4 @@ android.useAndroidX=true #used for slow jitpack builds; TODO see if this actually works http.socketTimeout=80000 http.connectionTimeout=80000 -archash=3400de3323150ba91c94fc07a6d4ca1958f4d943 +archash=bc9bbf8312f69d5e6882ce8dab4136d2126473e8 From 9e718b633ec951712f74c8917c18414ff4402dbf Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 22 Sep 2021 20:21:26 -0400 Subject: [PATCH 19/45] Increase dependency timeout for jitpack --- gradle.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index 10fbb45adc..9f87c549db 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,6 +22,6 @@ kotlin.stdlib.default.dependency=false #needed for android compilation android.useAndroidX=true #used for slow jitpack builds; TODO see if this actually works -http.socketTimeout=80000 -http.connectionTimeout=80000 -archash=bc9bbf8312f69d5e6882ce8dab4136d2126473e8 +org.gradle.internal.http.socketTimeout=100000 +org.gradle.internal.http.connectionTimeout=100000 +archash=e4ec2880dfdd5739ec75b5904d97ed3309c225d8 From c8ab2bd1ba2ef24bcc774ccc0ef82b8fdae1c468 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 22 Sep 2021 20:25:01 -0400 Subject: [PATCH 20/45] Inline SchematicsDialog#focusSearchField --- core/src/mindustry/ui/dialogs/SchematicsDialog.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/core/src/mindustry/ui/dialogs/SchematicsDialog.java b/core/src/mindustry/ui/dialogs/SchematicsDialog.java index dd16b937d0..187223139a 100644 --- a/core/src/mindustry/ui/dialogs/SchematicsDialog.java +++ b/core/src/mindustry/ui/dialogs/SchematicsDialog.java @@ -334,12 +334,6 @@ public class SchematicsDialog extends BaseDialog{ dialog.show(); } - public void focusSearchField(){ - if(searchField == null) return; - - Core.scene.setKeyboardFocus(searchField); - } - //adds all new tags to the global list of tags //alternatively, unknown tags could be discarded on import? @@ -635,8 +629,8 @@ public class SchematicsDialog extends BaseDialog{ public Dialog show(){ super.show(); - if(Core.app.isDesktop()){ - focusSearchField(); + if(Core.app.isDesktop() && searchField != null){ + Core.scene.setKeyboardFocus(searchField); } return this; From 22a93fc649992062708d2c282d7c173f9651d66c Mon Sep 17 00:00:00 2001 From: rmuchan Date: Fri, 24 Sep 2021 02:14:44 +0800 Subject: [PATCH 21/45] fix achievement Roboticist (#6037) --- core/src/mindustry/service/GameService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/mindustry/service/GameService.java b/core/src/mindustry/service/GameService.java index 97b4cd002b..a3890b6fc6 100644 --- a/core/src/mindustry/service/GameService.java +++ b/core/src/mindustry/service/GameService.java @@ -166,6 +166,7 @@ public class GameService{ if(campaign()){ if(unitsBuilt.add(e.unit.type.name)){ SStat.unitTypesBuilt.set(content.units().count(u -> unitsBuilt.contains(u.name) && !u.isHidden())); + save(); } if(t5s.contains(e.unit.type)){ From 29242249bd5727d8833deebf2832f8f2523e0aae Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 23 Sep 2021 19:44:42 -0400 Subject: [PATCH 22/45] Fixed #6039 --- .../src/mindustry/graphics/BlockRenderer.java | 20 +++++++++++++++++++ core/src/mindustry/world/Tile.java | 6 ++++++ 2 files changed, 26 insertions(+) diff --git a/core/src/mindustry/graphics/BlockRenderer.java b/core/src/mindustry/graphics/BlockRenderer.java index cc40a2c040..0bdd40bfa3 100644 --- a/core/src/mindustry/graphics/BlockRenderer.java +++ b/core/src/mindustry/graphics/BlockRenderer.java @@ -117,10 +117,30 @@ public class BlockRenderer{ lastCamY = lastCamX = -99; //invalidate camera position so blocks get updated } + invalidateTile(event.tile); recordIndex(event.tile); }); } + public void invalidateTile(Tile tile){ + int avgx = (int)(camera.position.x / tilesize); + int avgy = (int)(camera.position.y / tilesize); + int rangex = (int)(camera.width / tilesize / 2) + 3; + int rangey = (int)(camera.height / tilesize / 2) + 3; + + if(Math.abs(avgx - tile.x) <= rangex && Math.abs(avgy - tile.y) <= rangey){ + lastCamY = lastCamX = -99; //invalidate camera position so blocks get updated + } + } + + public void removeFloorIndex(Tile tile){ + if(indexFloor(tile)) floorTree.remove(tile); + } + + public void addFloorIndex(Tile tile){ + if(indexFloor(tile)) floorTree.insert(tile); + } + boolean indexBlock(Tile tile){ var block = tile.block(); return tile.isCenter() && block != Blocks.air && block.cacheLayer == CacheLayer.normal; diff --git a/core/src/mindustry/world/Tile.java b/core/src/mindustry/world/Tile.java index 93b53d4f81..4131a22c4e 100644 --- a/core/src/mindustry/world/Tile.java +++ b/core/src/mindustry/world/Tile.java @@ -269,6 +269,10 @@ public class Tile implements Position, QuadTreeObject, Displayable{ this.floor = type; this.overlay = (Floor)Blocks.air; + if(!headless && !world.isGenerating()){ + renderer.blocks.removeFloorIndex(this); + } + recache(); if(build != null){ build.onProximityUpdate(); @@ -305,6 +309,8 @@ public class Tile implements Position, QuadTreeObject, Displayable{ if(!headless && !world.isGenerating()){ renderer.blocks.floor.recacheTile(this); renderer.minimap.update(this); + renderer.blocks.invalidateTile(this); + renderer.blocks.addFloorIndex(this); //update neighbor tiles as well for(int i = 0; i < 8; i++){ Tile other = world.tile(x + Geometry.d8[i].x, y + Geometry.d8[i].y); From 50cc340b20c7d3d0d6445e14bbe3af6d3512dab0 Mon Sep 17 00:00:00 2001 From: Matthew Peng <54301439+MEEPofFaith@users.noreply.github.com> Date: Fri, 24 Sep 2021 18:28:20 -0700 Subject: [PATCH 23/45] Customizable Block Place Sound (#6043) --- core/src/mindustry/world/Block.java | 10 ++++++++-- core/src/mindustry/world/blocks/ConstructBlock.java | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index e03ed2c0b0..d0e900e479 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -202,10 +202,16 @@ public class Block extends UnlockableContent{ public int outlinedIcon = -1; /** Whether this block has a shadow under it. */ public boolean hasShadow = true; - /** Sounds made when this block is destroyed.*/ - public Sound destroySound = Sounds.boom; + /** Should the sound made when this block is built change in pitch. */ + public boolean placePitchChange = true; + /** Should the sound made when this block is deconstructed change in pitch. */ + public boolean breakPitchChange = true; + /** Sound made when this block is built. */ + public Sound placeSound = Sounds.place; /** Sound made when this block is deconstructed. */ public Sound breakSound = Sounds.breaks; + /** Sounds made when this block is destroyed.*/ + public Sound destroySound = Sounds.boom; /** How reflective this block is. */ public float albedo = 0f; /** Environmental passive light color. */ diff --git a/core/src/mindustry/world/blocks/ConstructBlock.java b/core/src/mindustry/world/blocks/ConstructBlock.java index 9113a840a1..ee42782485 100644 --- a/core/src/mindustry/world/blocks/ConstructBlock.java +++ b/core/src/mindustry/world/blocks/ConstructBlock.java @@ -58,7 +58,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()) block.breakSound.at(tile, calcPitch(false)); + if(shouldPlay()) block.breakSound.at(tile, block.breakPitchChange ? calcPitch(false) : 1f); } @Remote(called = Loc.server) @@ -97,7 +97,7 @@ public class ConstructBlock extends Block{ } Fx.placeBlock.at(tile.drawx(), tile.drawy(), block.size); - if(shouldPlay()) Sounds.place.at(tile, calcPitch(true)); + if(shouldPlay()) block.placeSound.at(tile, block.placePitchChange ? calcPitch(true) : 1f); Events.fire(new BlockBuildEndEvent(tile, builder, team, false, config)); } From d79ab3ec3ee68c738e612942befddfca7106712b Mon Sep 17 00:00:00 2001 From: Darkness#3729 <79508138+Darkness6030@users.noreply.github.com> Date: Sat, 25 Sep 2021 15:50:20 +0300 Subject: [PATCH 24/45] Make thruster cost some scrap (#6045) --- core/src/mindustry/content/Blocks.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 06a14b95a8..d944f433f0 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -874,6 +874,7 @@ public class Blocks implements ContentList{ }}; thruster = new Thruster("thruster"){{ + requirements(Category.defense, BuildVisibility.sandboxOnly, with(Items.scrap, 96)); health = 55 * 16 * wallHealthMultiplier; size = 4; }}; From 94d9ca472758bbc65f0f8c73c2b210bcb9d05dd7 Mon Sep 17 00:00:00 2001 From: Matthew Peng <54301439+MEEPofFaith@users.noreply.github.com> Date: Sun, 26 Sep 2021 05:31:21 -0700 Subject: [PATCH 25/45] Pull creating and dumping products out into their own methods (#6047) --- .../blocks/production/GenericCrafter.java | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/core/src/mindustry/world/blocks/production/GenericCrafter.java b/core/src/mindustry/world/blocks/production/GenericCrafter.java index c6c688ae18..6df7ff8eca 100644 --- a/core/src/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/mindustry/world/blocks/production/GenericCrafter.java @@ -127,24 +127,32 @@ public class GenericCrafter extends Block{ } if(progress >= 1f){ - consume(); - - if(outputItems != null){ - for(ItemStack output : outputItems){ - for(int i = 0; i < output.amount; i++){ - offload(output.item); - } - } - } - - if(outputLiquid != null){ - handleLiquid(this, outputLiquid.liquid, outputLiquid.amount); - } - - craftEffect.at(x, y); - progress %= 1f; + craft(); } + dumpOutputs(); + } + + public void craft(){ + consume(); + + if(outputItems != null){ + for(ItemStack output : outputItems){ + for(int i = 0; i < output.amount; i++){ + offload(output.item); + } + } + } + + if(outputLiquid != null){ + handleLiquid(this, outputLiquid.liquid, outputLiquid.amount); + } + + craftEffect.at(x, y); + progress %= 1f; + } + + public void dumpOutputs(){ if(outputItems != null && timer(timerDump, dumpTime / timeScale)){ for(ItemStack output : outputItems){ dump(output.item); From 0185f8bc5a4851f2a573da14a38dcbc1f3e1d343 Mon Sep 17 00:00:00 2001 From: Misaka <63801085+misaka0954@users.noreply.github.com> Date: Sun, 26 Sep 2021 15:33:05 +0300 Subject: [PATCH 26/45] shizashizashiza epic comeback (#6050) No description provided. --- servers_v7.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/servers_v7.json b/servers_v7.json index 65d54ef732..3ac3890c61 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -46,5 +46,9 @@ { "name": "SubZero", "address": ["minty-server.ddns.net"] + }, + { + "name": "Shiza Minigames", + "address": ["shizashizashiza.ml"] } ] From 5e0f4046023ade724e5ccef09e5051823105e89f Mon Sep 17 00:00:00 2001 From: Pietro <47507131+Pietro303HD@users.noreply.github.com> Date: Sun, 26 Sep 2021 12:40:15 -0300 Subject: [PATCH 27/45] row mod content dialog in mobile (#6051) * Row mod content dialog in mobile It's as simple as `Math.floor()` * type casting (int) --- core/src/mindustry/ui/dialogs/ModsDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index d31aa1694c..5a7bf4d692 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -381,7 +381,7 @@ public class ModsDialog extends BaseDialog{ }).tooltip(c.localizedName); - if(++i % Math.min(Core.graphics.getWidth() / Scl.scl(110), 14) == 0) cs.row(); + if(++i % (int)Math.min(Core.graphics.getWidth() / Scl.scl(110), 14) == 0) cs.row(); } }).grow(); d.addCloseButton(); From ed1557b5ac1490be6f780dba23a7b9e7cc001724 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 27 Sep 2021 09:18:46 -0400 Subject: [PATCH 28/45] Implemented Anuken/Mindustry-Suggestions/issues/3026 --- core/src/mindustry/content/UnitTypes.java | 23 +++++++++++++------ .../mindustry/entities/bullet/BulletType.java | 2 ++ .../mindustry/entities/comp/BulletComp.java | 13 +++++++++++ gradle.properties | 2 +- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 89aad70b9e..02642ecbf8 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -1784,7 +1784,6 @@ public class UnitTypes implements ContentList{ //endregion //region naval support retusa = new UnitType("retusa"){{ - defaultController = HugAI::new; speed = 0.9f; targetAir = false; drag = 0.14f; @@ -1818,7 +1817,8 @@ public class UnitTypes implements ContentList{ weapons.add(new Weapon(){{ mirror = false; - reload = 80f; + rotate = true; + reload = 90f; shots = 3; shotDelay = 7f; x = y = shootX = shootY = 0f; @@ -1826,7 +1826,7 @@ public class UnitTypes implements ContentList{ bullet = new BasicBulletType(){{ sprite = "mine-bullet"; - width = height = 11f; + width = height = 8f; layer = Layer.scorch; shootEffect = smokeEffect = Fx.none; @@ -1846,17 +1846,26 @@ public class UnitTypes implements ContentList{ collidesAir = false; - lifetime = 500f; + lifetime = 87f; hitEffect = new MultiEffect(Fx.blastExplosion, Fx.greenCloud); keepVelocity = false; shrinkX = shrinkY = 0f; - speed = 0f; + inaccuracy = 2f; + weaveMag = 5f; + weaveScale = 4f; + speed = 0.7f; + drag = -0.017f; + homingPower = 0.05f; + collideFloor = true; + trailColor = Pal.heal; + trailWidth = 3f; + trailLength = 8; - splashDamage = 55f; - splashDamageRadius = 45f; + splashDamage = 42f; + splashDamageRadius = 40f; }}; }}); }}; diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index a5eeca2d68..df4c835abd 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -91,6 +91,8 @@ public class BulletType extends Content implements Cloneable{ public boolean collidesAir = true, collidesGround = true; /** Whether this bullet types collides with anything at all. */ public boolean collides = true; + /** If true, this projectile collides with non-surface floors. */ + public boolean collideFloor = false; /** Whether velocity is inherited from the shooter. */ public boolean keepVelocity = true; /** Whether to scale lifetime (not actually velocity!) to disappear at the target position. Used for artillery. */ diff --git a/core/src/mindustry/entities/comp/BulletComp.java b/core/src/mindustry/entities/comp/BulletComp.java index d36a399150..5054694531 100644 --- a/core/src/mindustry/entities/comp/BulletComp.java +++ b/core/src/mindustry/entities/comp/BulletComp.java @@ -6,12 +6,14 @@ import arc.math.geom.*; import arc.struct.*; import arc.util.*; import mindustry.annotations.Annotations.*; +import mindustry.content.*; import mindustry.core.*; import mindustry.entities.bullet.*; import mindustry.game.*; import mindustry.game.Teams.*; import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.world.*; import static mindustry.Vars.*; @@ -137,6 +139,17 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw while(x >= 0 && y >= 0 && x < ww && y < wh){ Building build = world.build(x, y); + + if(type.collideFloor){ + Tile tile = world.tile(x, y); + if(tile == null || tile.floor().hasSurface() || tile.block() != Blocks.air){ + type.despawned(self()); + remove(); + hit = true; + return; + } + } + if(build != null && isAdded() && build.collide(self()) && type.testCollision(self(), build) && !build.dead() && (type.collidesTeam || build.team != team) && !(type.pierceBuilding && hasCollided(build.id))){ diff --git a/gradle.properties b/gradle.properties index 9f87c549db..00daf31a6e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,4 +24,4 @@ android.useAndroidX=true #used for slow jitpack builds; TODO see if this actually works org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 -archash=e4ec2880dfdd5739ec75b5904d97ed3309c225d8 +archash=b631e4ed8d93513a52ebee6f7e612f7d603062c8 From 2d2052e39f63050ac9cf55f4a1a2a82ea3f14de0 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 27 Sep 2021 11:00:33 -0400 Subject: [PATCH 29/45] "ok" --- core/assets-raw/sprites/units/antumbra.png | Bin 7559 -> 6405 bytes core/src/mindustry/audio/SoundControl.java | 2 ++ core/src/mindustry/game/EventType.java | 2 ++ 3 files changed, 4 insertions(+) diff --git a/core/assets-raw/sprites/units/antumbra.png b/core/assets-raw/sprites/units/antumbra.png index 10af20cfb977e37c43b6c32e6b4bd0e6b81e570b..bbbcb480fe751340e4f2c5ee0c41a2ba904e8f64 100644 GIT binary patch literal 6405 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 P7#KWV{an^LB{Ts5?b_>& literal 7559 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 diff --git a/core/src/mindustry/audio/SoundControl.java b/core/src/mindustry/audio/SoundControl.java index d407198f94..1441f42832 100644 --- a/core/src/mindustry/audio/SoundControl.java +++ b/core/src/mindustry/audio/SoundControl.java @@ -76,6 +76,8 @@ public class SoundControl{ sound.setBus(uiBus); } } + + Events.fire(new MusicRegisterEvent()); } public void loop(Sound sound, float volume){ diff --git a/core/src/mindustry/game/EventType.java b/core/src/mindustry/game/EventType.java index 66bc472c6f..91055acf87 100644 --- a/core/src/mindustry/game/EventType.java +++ b/core/src/mindustry/game/EventType.java @@ -70,6 +70,8 @@ public class EventType{ public static class ContentInitEvent{} /** Called when the client game is first loaded. */ public static class ClientLoadEvent{} + /** Called after SoundControl registers its music. */ + public static class MusicRegisterEvent{} /** Called *after* all the modded files have been added into Vars.tree */ public static class FileTreeInitEvent{} /** Called when a game begins and the world is loaded. */ From bf89ef1e5eb874481153e3cb4be91cd60018f384 Mon Sep 17 00:00:00 2001 From: TranquillyUnpleasant <62061444+TranquillyUnpleasant@users.noreply.github.com> Date: Mon, 27 Sep 2021 20:33:12 +0500 Subject: [PATCH 30/45] Map search (#6004) * Map search * Fix format * check and continue * icons and style * grow pane so search bar doesnt move * Inline focusing * Use boolean instead of checking size --- core/assets/bundles/bundle.properties | 3 + core/src/mindustry/ui/dialogs/MapsDialog.java | 110 +++++++++++++++--- 2 files changed, 99 insertions(+), 14 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 165fca2f8b..ec9d07e948 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -379,6 +379,9 @@ editor.ingame = Edit In-Game editor.publish.workshop = Publish On Workshop editor.newmap = New Map editor.center = Center +editor.search = Search Maps... +editor.filters = Filter Maps +editor.showAll = Show Default Maps workshop = Workshop waves.title = Waves waves.remove = Remove diff --git a/core/src/mindustry/ui/dialogs/MapsDialog.java b/core/src/mindustry/ui/dialogs/MapsDialog.java index ee25c0ae28..cc2fe7009f 100644 --- a/core/src/mindustry/ui/dialogs/MapsDialog.java +++ b/core/src/mindustry/ui/dialogs/MapsDialog.java @@ -2,11 +2,14 @@ package mindustry.ui.dialogs; import arc.*; import arc.graphics.*; +import arc.scene.style.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; import mindustry.*; import mindustry.game.EventType.*; +import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.io.*; @@ -17,6 +20,12 @@ import static mindustry.Vars.*; public class MapsDialog extends BaseDialog{ private BaseDialog dialog; + private String searchString; + private Seq modes = new Seq<>(); + private Table mapTable = new Table(); + private TextField searchField; + + private boolean showAll = Core.settings.getBool("editorShowAllMaps", true); public MapsDialog(){ super("@maps"); @@ -37,8 +46,10 @@ public class MapsDialog extends BaseDialog{ void setup(){ buttons.clearChildren(); + searchString = null; + if(Core.graphics.isPortrait()){ - buttons.button("@back", Icon.left, this::hide).size(210f*2f, 64f).colspan(2); + buttons.button("@back", Icon.left, this::hide).size(210f * 2f, 64f).colspan(2); buttons.row(); }else{ buttons.button("@back", Icon.left, this::hide).size(210f, 64f); @@ -108,26 +119,58 @@ public class MapsDialog extends BaseDialog{ }); }).size(210f, 64f); - cont.clear(); - Table maps = new Table(); - maps.marginRight(24); + rebuildMaps(); - ScrollPane pane = new ScrollPane(maps); + ScrollPane pane = new ScrollPane(mapTable); pane.setFadeScrollBars(false); + Table search = new Table(); + search.image(Icon.zoom); + searchField = search.field("", t -> { + searchString = t.length() > 0 ? t.toLowerCase() : null; + rebuildMaps(); + }).maxTextLength(50).growX().get(); + searchField.setMessageText("@editor.search"); + search.button(Icon.filter, Styles.emptyi, this::showMapFilters); + + cont.add(search).growX(); + cont.row(); + cont.add(pane).uniformX().growY(); + cont.row(); + cont.add(buttons).growX(); + } + + void rebuildMaps(){ + mapTable.clear(); + + mapTable.marginRight(24); + int maxwidth = Math.max((int)(Core.graphics.getWidth() / Scl.scl(230)), 1); float mapsize = 200f; + boolean noMapsShown = true; int i = 0; - for(Map map : Vars.maps.all()){ - if(i % maxwidth == 0){ - maps.row(); + Seq mapList = showAll ? Vars.maps.all() : Vars.maps.customMaps(); + for(Map map : mapList){ + + boolean invalid = false; + for(Gamemode mode : modes){ + invalid |= !mode.valid(map); + } + if(invalid || (searchString != null && !Strings.stripColors(map.name()).toLowerCase().contains(searchString))){ + continue; } - TextButton button = maps.button("", Styles.cleart, () -> showMapInfo(map)).width(mapsize).pad(8).get(); + noMapsShown = false; + + if(i % maxwidth == 0){ + mapTable.row(); + } + + TextButton button = mapTable.button("", Styles.cleart, () -> showMapInfo(map)).width(mapsize).pad(8).get(); button.clearChildren(); button.margin(9); button.add(map.name()).width(mapsize - 18f).center().get().setEllipsis(true); @@ -141,13 +184,41 @@ public class MapsDialog extends BaseDialog{ i++; } - if(Vars.maps.all().size == 0){ - maps.add("@maps.none"); + if(noMapsShown){ + mapTable.add("@maps.none"); } + } - cont.add(buttons).growX(); - cont.row(); - cont.add(pane).uniformX(); + void showMapFilters(){ + dialog = new BaseDialog("@editor.filters"); + dialog.addCloseButton(); + dialog.setFillParent(false); + dialog.cont.table(Tex.button, t -> { + int i = 0; + for(Gamemode mode : Gamemode.all){ + TextureRegionDrawable icon = Vars.ui.getIcon("mode" + Strings.capitalize(mode.name())); + if(Core.atlas.isFound(icon.getRegion())){ + t.button(mode.name(), icon, Styles.clearTogglet, () -> { + if(modes.contains(mode)){ + modes.remove(mode); + }else{ + modes.add(mode); + } + rebuildMaps(); + }).size(150f, 60f).checked(modes.contains(mode)); + if(++i % 3 == 0) t.row(); + } + } + t.row(); + t.button("@editor.showAll", Styles.clearTogglet, () -> { + showAll = !showAll; + Core.settings.put("editorShowAllMaps", showAll); + Core.settings.forceSave(); + rebuildMaps(); + }).checked(b -> showAll).colspan(3).growX().height(40f); + }); + + dialog.show(); } void showMapInfo(Map map){ @@ -213,4 +284,15 @@ public class MapsDialog extends BaseDialog{ dialog.show(); } + + @Override + public Dialog show(){ + super.show(); + + if(Core.app.isDesktop() && searchField != null){ + Core.scene.setKeyboardFocus(searchField); + } + + return this; + } } From a21942e40192148587853613ffb12e44654b3458 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 27 Sep 2021 11:36:03 -0400 Subject: [PATCH 31/45] Map dialog margin cleanup --- core/src/mindustry/content/UnitTypes.java | 6 +++--- core/src/mindustry/ui/dialogs/MapsDialog.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 02642ecbf8..386db5d9f1 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -1864,8 +1864,8 @@ public class UnitTypes implements ContentList{ trailWidth = 3f; trailLength = 8; - splashDamage = 42f; - splashDamageRadius = 40f; + splashDamage = 33f; + splashDamageRadius = 32f; }}; }}); }}; @@ -1940,7 +1940,7 @@ public class UnitTypes implements ContentList{ shootEffect = Fx.sparkShoot; hitEffect = Fx.pointHit; maxRange = 100f; - damage = 15f; + damage = 17f; }}; }}); diff --git a/core/src/mindustry/ui/dialogs/MapsDialog.java b/core/src/mindustry/ui/dialogs/MapsDialog.java index cc2fe7009f..af46fcba42 100644 --- a/core/src/mindustry/ui/dialogs/MapsDialog.java +++ b/core/src/mindustry/ui/dialogs/MapsDialog.java @@ -205,7 +205,7 @@ public class MapsDialog extends BaseDialog{ modes.add(mode); } rebuildMaps(); - }).size(150f, 60f).checked(modes.contains(mode)); + }).size(150f, 60f).marginLeft(6f).checked(modes.contains(mode)); if(++i % 3 == 0) t.row(); } } From 6fb7f4fe2688782b9c37b156e2e3ec0d8d31b021 Mon Sep 17 00:00:00 2001 From: buthed010203 Date: Mon, 27 Sep 2021 11:55:34 -0400 Subject: [PATCH 32/45] At least add a fastAA property (#6058) Since my other pr will never get merged, i will at least add this so i can use it myself --- tools/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/build.gradle b/tools/build.gradle index c9985b1612..781c80e821 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -17,7 +17,7 @@ def doAntialias = !project.hasProperty("disableAntialias") def colorMap = new IntMap>(), colorIndexMap = new IntIntMap() //on my machine, I have a native Nim AA implementation that is ~10x faster //it's not compiled for other platforms so they don't get it -def useFastAA = System.getProperty("user.name") == "anuke" +def useFastAA = project.hasProperty("fastAA") || System.getProperty("user.name") == "anuke" def transformColors = { List> list -> list.each{ colors -> @@ -281,4 +281,4 @@ task updateScripts(dependsOn: classes, type: JavaExec){ classpath = sourceSets.main.runtimeClasspath standardInput = System.in workingDir = "../" -} \ No newline at end of file +} From 083c21ea3f18f5b1b7bd4b792e43701b0e69a1aa Mon Sep 17 00:00:00 2001 From: Matthew Peng <54301439+MEEPofFaith@users.noreply.github.com> Date: Mon, 27 Sep 2021 08:55:56 -0700 Subject: [PATCH 33/45] Effect Rotate With Parent (#5999) * Effect Rotate With Parent * Use Rotc * Wording * Base Rotation * Rotate effect rotation with parent. --- .../revisions/EffectStateComp/6.json | 1 + core/src/mindustry/content/Fx.java | 8 +++---- core/src/mindustry/entities/Effect.java | 21 ++++++++++++++++-- .../mindustry/entities/comp/ChildComp.java | 22 ++++++++++++++----- 4 files changed, 41 insertions(+), 11 deletions(-) create mode 100644 annotations/src/main/resources/revisions/EffectStateComp/6.json diff --git a/annotations/src/main/resources/revisions/EffectStateComp/6.json b/annotations/src/main/resources/revisions/EffectStateComp/6.json new file mode 100644 index 0000000000..f8a361e105 --- /dev/null +++ b/annotations/src/main/resources/revisions/EffectStateComp/6.json @@ -0,0 +1 @@ +{version:6,fields:[{name:color,type:arc.graphics.Color},{name:data,type:java.lang.Object},{name:effect,type:mindustry.entities.Effect},{name:lifetime,type:float},{name:offsetPos,type:float},{name:offsetRot,type:float},{name:offsetX,type:float},{name:offsetY,type:float},{name:parent,type:mindustry.gen.Posc},{name:rotDirWithParent,type:boolean},{name:rotPosWithParent,type:boolean},{name:rotation,type:float},{name:time,type:float},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index dca9904588..9339df49ab 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -362,13 +362,13 @@ public class Fx{ Fill.circle(e.x, e.y, e.fin() * 10); Drawf.light(e.x, e.y, e.fin() * 20f, Pal.heal, 0.7f); - }).followParent(true), + }).followParent(true).rotWithParent(true), greenLaserChargeSmall = new Effect(40f, 100f, e -> { color(Pal.heal); stroke(e.fin() * 2f); Lines.circle(e.x, e.y, e.fout() * 50f); - }).followParent(true), + }).followParent(true).rotWithParent(true), greenCloud = new Effect(80f, e -> { color(Pal.heal); @@ -1943,7 +1943,7 @@ public class Fx{ } Lines.endLine(); - }).followParent(false), + }).followParent(false).rotWithParent(false), chainEmp = new Effect(30f, 300f, e -> { if(!(e.data instanceof Position p)) return; @@ -1980,5 +1980,5 @@ public class Fx{ } Lines.endLine(); - }).followParent(false); + }).followParent(false).rotWithParent(false); } diff --git a/core/src/mindustry/entities/Effect.java b/core/src/mindustry/entities/Effect.java index ba5def3822..4d298eb40f 100644 --- a/core/src/mindustry/entities/Effect.java +++ b/core/src/mindustry/entities/Effect.java @@ -30,8 +30,12 @@ public class Effect{ public float lifetime = 50f; /** Clip size. */ public float clip; + /** Amount added to rotation */ + public float baseRotation; /** If true, parent unit is data are followed. */ public boolean followParent; + /** If this and followParent are true, the effect will offset and rotate with the parent's rotation. */ + public boolean rotWithParent; public float layer = Layer.effect; public float layerDuration; @@ -61,11 +65,21 @@ public class Effect{ return this; } + public Effect rotWithParent(boolean follow){ + rotWithParent = follow; + return this; + } + public Effect layer(float l){ layer = l; return this; } + public Effect baseRotation(float d){ + baseRotation = d; + return this; + } + public Effect layer(float l, float duration){ layer = l; this.layerDuration = duration; @@ -156,12 +170,15 @@ public class Effect{ EffectState entity = EffectState.create(); entity.effect = effect; - entity.rotation = rotation; + entity.rotation = effect.baseRotation + rotation; entity.data = data; entity.lifetime = effect.lifetime; entity.set(x, y); entity.color.set(color); - if(effect.followParent && data instanceof Posc p) entity.parent = p; + if(effect.followParent && data instanceof Posc p){ + entity.parent = p; + entity.rotWithParent = effect.rotWithParent; + } entity.add(); } } diff --git a/core/src/mindustry/entities/comp/ChildComp.java b/core/src/mindustry/entities/comp/ChildComp.java index dae0c98814..f34a9198c9 100644 --- a/core/src/mindustry/entities/comp/ChildComp.java +++ b/core/src/mindustry/entities/comp/ChildComp.java @@ -1,29 +1,41 @@ package mindustry.entities.comp; +import arc.math.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.gen.*; @Component -abstract class ChildComp implements Posc{ - @Import float x, y; +abstract class ChildComp implements Posc, Rotc{ + @Import float x, y, rotation; @Nullable Posc parent; - float offsetX, offsetY; + boolean rotWithParent; + float offsetX, offsetY, offsetPos, offsetRot; @Override public void add(){ if(parent != null){ offsetX = x - parent.getX(); offsetY = y - parent.getY(); + if(rotWithParent && parent instanceof Rotc r){ + offsetPos = -r.rotation(); + offsetRot = rotation - r.rotation(); + } } } @Override public void update(){ if(parent != null){ - x = parent.getX() + offsetX; - y = parent.getY() + offsetY; + if(rotWithParent && parent instanceof Rotc r){ + x = parent.getX() + Angles.trnsx(r.rotation() + offsetPos, offsetX, offsetY); + y = parent.getY() + Angles.trnsy(r.rotation() + offsetPos, offsetX, offsetY); + rotation = r.rotation() + offsetRot; + }else{ + x = parent.getX() + offsetX; + y = parent.getY() + offsetY; + } } } } From dbd31b9031ba2c989283808d131e2268dbca2174 Mon Sep 17 00:00:00 2001 From: TranquillyUnpleasant <62061444+TranquillyUnpleasant@users.noreply.github.com> Date: Mon, 27 Sep 2021 23:46:28 +0500 Subject: [PATCH 34/45] Cryo tiles (#6054) * Cryo tile * tile name * Shader * Icon and property --- .../blocks/environment/pooled-cryofluid.png | Bin 0 -> 1335 bytes core/assets/bundles/bundle.properties | 1 + core/assets/icons/icons.properties | 1 + core/assets/shaders/cryofluid.frag | 35 ++++++++++++++++++ core/src/mindustry/content/Blocks.java | 18 ++++++++- core/src/mindustry/graphics/CacheLayer.java | 3 +- core/src/mindustry/graphics/Shaders.java | 3 +- 7 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 core/assets-raw/sprites/blocks/environment/pooled-cryofluid.png create mode 100644 core/assets/shaders/cryofluid.frag diff --git a/core/assets-raw/sprites/blocks/environment/pooled-cryofluid.png b/core/assets-raw/sprites/blocks/environment/pooled-cryofluid.png new file mode 100644 index 0000000000000000000000000000000000000000..9d50189fd901faa4516b6d23738f91ce5e1797d0 GIT binary patch literal 1335 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANM!KdM3^N`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsH`<9zE@e8c*B(NY`l%DlJEf45k-vYSyv0H(R&v)jQ9$Nj6Uw zo-s^N^xkCWSla&a_;{^J=4W zZuCc<)cZ--#qYUYE3Obzah|rz$$Liogd>~3YcoZfdmfFrusP+$M3pnH8VMdjWhx#g zPCvh!+;g6@%JY*g_x#QOXViMxUDuuNzw?Z>`;4014!>$YofomUoaXNGXIDbi>|e8< zSnfV=xo-VxP36Uv;UPTbW!J0&Y$g<0#-Gk;i#FW8S=6N8)a<~^jYpZ+1}d^mmDC7a z?lt+CrCAn-;m3r-C+;w0os8+>Hs5Kn@L~${UOm3LUU!CFDt|g!{q{foa{a`^ox&kA z6M8E*Ir@I>qeK5>M1ATHP+zaN*9KFFqgcn*I9`Vy_V@aK-p+ zAOD(X@VYk&$W1 zDOtxNp*PbK-t4J)EW0>(`cz|m!*gm40Vk6Zn*Xv!XllMXK522=sxGzAvstekyRYe3 zrk=Hoj%$xG-I$Vf^UR&DP;vit^X}f+TcI1nlD=SC%$f?#rD1%ceOfu8FTy?e?4EeE z%l+JNxWDL1+o#NxnWxXr+I}hPxt{ECm-BabeZTa2fk8n~k4eds#KZ2ArHigDJ7ZG% zEc0^u%&(5Q!GAB+HA>}X)l7=2`nG^A(_pvn1uMT2LuNximPgw-7A&YV?Do_AsI+~? z(L*;xPH_Z@&%Tf;$b878qx4eqUG|;xABkP5?~?v6yK}>Zzv54rF4R8##=CW2-Sbf|(bwG4@$ul(+Bx6PJ>2)3 zp?>k9kj>dL0j8%t)PI(wk4s&$+h$wJ}agx%BynVA8@H z2aDJ@Pg*GCFL+!eba74nwba(nV(D9hlGob(fCwZ%dOZLccuW)L8^5fwD2j6qf9(vL;Tf~duuKu>ahDeMoy@?% zVBqQE7!q;#?KwwA1_u@f1HBE)X1yp#`jNvq?ds>p7rK*~PyzR473Q?dpOSb%mU+7R KxvX 0.55 && noise < 0.56) { + color.rgb = S2; + } else if (noise > 0.50 && noise < 0.60){ + color.rgb = S1; + } + + gl_FragColor = color; +} diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index d944f433f0..acd40284f6 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -35,7 +35,7 @@ public class Blocks implements ContentList{ public static Block //environment - air, spawn, cliff, deepwater, water, taintedWater, deepTaintedWater, tar, slag, stone, craters, charr, sand, darksand, dirt, mud, ice, snow, darksandTaintedWater, space, + air, spawn, cliff, deepwater, water, taintedWater, deepTaintedWater, tar, slag, cryofluid, stone, craters, charr, sand, darksand, dirt, mud, ice, snow, darksandTaintedWater, space, dacite, stoneWall, dirtWall, sporeWall, iceWall, daciteWall, sporePine, snowPine, pine, shrubs, whiteTree, whiteTreeDead, sporeCluster, iceSnow, sandWater, darksandWater, duneWall, sandWall, moss, sporeMoss, shale, shaleWall, shaleBoulder, sandBoulder, daciteBoulder, boulder, snowBoulder, basaltBoulder, grass, salt, @@ -196,6 +196,22 @@ public class Blocks implements ContentList{ cacheLayer = CacheLayer.tar; }}; + cryofluid = new Floor("pooled-cryofluid"){{ + drownTime = 150f; + status = StatusEffects.freezing; + statusDuration = 240f; + speedMultiplier = 0.5f; + variants = 0; + liquidDrop = Liquids.cryofluid; + liquidMultiplier = 0.5f; + isLiquid = true; + cacheLayer = CacheLayer.cryofluid; + + emitLight = true; + lightRadius = 20f; + lightColor = Color.cyan.cpy().a(0.19f); + }}; + slag = new Floor("molten-slag"){{ drownTime = 150f; status = StatusEffects.melting; diff --git a/core/src/mindustry/graphics/CacheLayer.java b/core/src/mindustry/graphics/CacheLayer.java index a68b7f6e06..3921612853 100644 --- a/core/src/mindustry/graphics/CacheLayer.java +++ b/core/src/mindustry/graphics/CacheLayer.java @@ -10,7 +10,7 @@ import static mindustry.Vars.*; public class CacheLayer{ public static CacheLayer - water, mud, tar, slag, space, normal, walls; + water, mud, cryofluid, tar, slag, space, normal, walls; public static CacheLayer[] all = {}; @@ -37,6 +37,7 @@ public class CacheLayer{ mud = new ShaderLayer(Shaders.mud), tar = new ShaderLayer(Shaders.tar), slag = new ShaderLayer(Shaders.slag), + cryofluid = new ShaderLayer(Shaders.cryofluid), space = new ShaderLayer(Shaders.space), normal = new CacheLayer(), walls = new CacheLayer() diff --git a/core/src/mindustry/graphics/Shaders.java b/core/src/mindustry/graphics/Shaders.java index 7ea78a2549..33026d6fe1 100644 --- a/core/src/mindustry/graphics/Shaders.java +++ b/core/src/mindustry/graphics/Shaders.java @@ -21,7 +21,7 @@ public class Shaders{ public static UnitBuildShader build; public static DarknessShader darkness; public static LightShader light; - public static SurfaceShader water, mud, tar, slag, space, caustics; + public static SurfaceShader water, mud, tar, slag, cryofluid, space, caustics; public static PlanetShader planet; public static PlanetGridShader planetGrid; public static AtmosphereShader atmosphere; @@ -47,6 +47,7 @@ public class Shaders{ mud = new SurfaceShader("mud"); tar = new SurfaceShader("tar"); slag = new SurfaceShader("slag"); + cryofluid = new SurfaceShader("cryofluid"); space = new SpaceShader("space"); //caustics = new SurfaceShader("caustics"){ // @Override From 7c00b54191cc2782785b9f7b5ccbd31666061b31 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 27 Sep 2021 14:51:50 -0400 Subject: [PATCH 35/45] hgdf --- core/assets/icons/icons.properties | 362 ----------------------------- gradle.properties | 2 +- 2 files changed, 1 insertion(+), 363 deletions(-) delete mode 100755 core/assets/icons/icons.properties diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties deleted file mode 100755 index a7cba12f74..0000000000 --- a/core/assets/icons/icons.properties +++ /dev/null @@ -1,362 +0,0 @@ -63743=spawn|block-spawn-ui -63742=deepwater|block-deepwater-ui -63741=shallow-water|block-shallow-water-ui -63740=tainted-water|block-tainted-water-ui -63739=darksand-tainted-water|block-darksand-tainted-water-ui -63738=sand-water|block-sand-water-ui -63737=darksand-water|block-darksand-water-ui -63736=tar|block-tar-ui -63735=stone|block-stone-ui -63734=craters|block-craters-ui -63733=char|block-char-ui -63732=ignarock|block-ignarock-ui -63731=hotrock|block-hotrock-ui -63730=magmarock|block-magmarock-ui -63729=sand|block-sand-ui -63728=darksand|block-darksand-ui -63726=grass|block-grass-ui -63725=salt|block-salt-ui -63724=snow|block-snow-ui -63723=ice|block-ice-ui -63722=ice-snow|block-ice-snow-ui -63721=cliffs|block-cliffs-ui -63718=rock|block-rock-ui -63717=snowrock|block-snowrock-ui -63711=spore-pine|block-spore-pine-ui -63710=snow-pine|block-snow-pine-ui -63709=pine|block-pine-ui -63708=shrubs|block-shrubs-ui -63707=white-tree-dead|block-white-tree-dead-ui -63706=white-tree|block-white-tree-ui -63705=spore-cluster|block-spore-cluster-ui -63704=shale|block-shale-ui -63702=shale-boulder|block-shale-boulder-ui -63701=sand-boulder|block-sand-boulder-ui -63700=moss|block-moss-ui -63699=spore-moss|block-spore-moss-ui -63698=metal-floor|block-metal-floor-ui -63697=metal-floor-damaged|block-metal-floor-damaged-ui -63696=metal-floor-2|block-metal-floor-2-ui -63695=metal-floor-3|block-metal-floor-3-ui -63694=metal-floor-5|block-metal-floor-5-ui -63693=dark-panel-1|block-dark-panel-1-ui -63692=dark-panel-2|block-dark-panel-2-ui -63691=dark-panel-3|block-dark-panel-3-ui -63690=dark-panel-4|block-dark-panel-4-ui -63689=dark-panel-5|block-dark-panel-5-ui -63688=dark-panel-6|block-dark-panel-6-ui -63687=dark-metal|block-dark-metal-ui -63686=pebbles|block-pebbles-ui -63685=tendrils|block-tendrils-ui -63684=ore-copper|block-ore-copper-ui -63683=ore-lead|block-ore-lead-ui -63682=ore-scrap|block-ore-scrap-ui -63681=ore-coal|block-ore-coal-ui -63680=ore-titanium|block-ore-titanium-ui -63679=ore-thorium|block-ore-thorium-ui -63678=graphite-press|block-graphite-press-ui -63677=multi-press|block-multi-press-ui -63676=silicon-smelter|block-silicon-smelter-ui -63675=kiln|block-kiln-ui -63674=plastanium-compressor|block-plastanium-compressor-ui -63673=phase-weaver|block-phase-weaver-ui -63672=alloy-smelter|block-alloy-smelter-ui -63671=cryofluid-mixer|block-cryofluid-mixer-ui -63670=blast-mixer|block-blast-mixer-ui -63669=pyratite-mixer|block-pyratite-mixer-ui -63668=melter|block-melter-ui -63667=separator|block-separator-ui -63666=spore-press|block-spore-press-ui -63665=pulverizer|block-pulverizer-ui -63664=coal-centrifuge|block-coal-centrifuge-ui -63663=incinerator|block-incinerator-ui -63662=copper-wall|block-copper-wall-ui -63661=copper-wall-large|block-copper-wall-large-ui -63660=titanium-wall|block-titanium-wall-ui -63659=titanium-wall-large|block-titanium-wall-large-ui -63658=plastanium-wall|block-plastanium-wall-ui -63657=plastanium-wall-large|block-plastanium-wall-large-ui -63656=thorium-wall|block-thorium-wall-ui -63655=thorium-wall-large|block-thorium-wall-large-ui -63654=phase-wall|block-phase-wall-ui -63653=phase-wall-large|block-phase-wall-large-ui -63652=surge-wall|block-surge-wall-ui -63651=surge-wall-large|block-surge-wall-large-ui -63650=door|block-door-ui -63649=door-large|block-door-large-ui -63648=scrap-wall|block-scrap-wall-ui -63647=scrap-wall-large|block-scrap-wall-large-ui -63646=scrap-wall-huge|block-scrap-wall-huge-ui -63645=scrap-wall-gigantic|block-scrap-wall-gigantic-ui -63644=thruster|block-thruster-ui -63643=mender|block-mender-ui -63642=mend-projector|block-mend-projector-ui -63641=overdrive-projector|block-overdrive-projector-ui -63640=force-projector|block-force-projector-ui -63639=shock-mine|block-shock-mine-ui -63638=conveyor|block-conveyor-ui -63637=titanium-conveyor|block-titanium-conveyor-ui -63636=armored-conveyor|block-armored-conveyor-ui -63635=junction|block-junction-ui -63634=bridge-conveyor|block-bridge-conveyor-ui -63633=phase-conveyor|block-phase-conveyor-ui -63632=sorter|block-sorter-ui -63631=inverted-sorter|block-inverted-sorter-ui -63630=router|block-router-ui -63629=distributor|block-distributor-ui -63628=overflow-gate|block-overflow-gate-ui -63627=mass-driver|block-mass-driver-ui -63626=mechanical-pump|block-mechanical-pump-ui -63625=rotary-pump|block-rotary-pump-ui -63624=thermal-pump|block-thermal-pump-ui -63623=conduit|block-conduit-ui -63622=pulse-conduit|block-pulse-conduit-ui -63621=plated-conduit|block-plated-conduit-ui -63620=liquid-router|block-liquid-router-ui -63619=liquid-tank|block-liquid-tank-ui -63618=liquid-junction|block-liquid-junction-ui -63617=bridge-conduit|block-bridge-conduit-ui -63616=phase-conduit|block-phase-conduit-ui -63615=power-node|block-power-node-ui -63614=power-node-large|block-power-node-large-ui -63613=surge-tower|block-surge-tower-ui -63612=diode|block-diode-ui -63611=battery|block-battery-ui -63610=battery-large|block-battery-large-ui -63609=combustion-generator|block-combustion-generator-ui -63608=thermal-generator|block-thermal-generator-ui -63607=steam-generator|block-steam-generator-ui -63606=differential-generator|block-differential-generator-ui -63605=rtg-generator|block-rtg-generator-ui -63604=solar-panel|block-solar-panel-ui -63603=solar-panel-large|block-solar-panel-large-ui -63602=thorium-reactor|block-thorium-reactor-ui -63601=impact-reactor|block-impact-reactor-ui -63600=mechanical-drill|block-mechanical-drill-ui -63599=pneumatic-drill|block-pneumatic-drill-ui -63598=laser-drill|block-laser-drill-ui -63597=blast-drill|block-blast-drill-ui -63596=water-extractor|block-water-extractor-ui -63595=cultivator|block-cultivator-ui -63594=oil-extractor|block-oil-extractor-ui -63593=core-shard|block-core-shard-ui -63592=core-foundation|block-core-foundation-ui -63591=core-nucleus|block-core-nucleus-ui -63590=vault|block-vault-ui -63589=container|block-container-ui -63588=unloader|block-unloader-ui -63587=launch-pad|block-launch-pad-ui -63586=launch-pad-large|block-launch-pad-large-ui -63585=duo|block-duo-ui -63584=scatter|block-scatter-ui -63583=scorch|block-scorch-ui -63582=hail|block-hail-ui -63581=wave|block-wave-ui -63580=lancer|block-lancer-ui -63579=arc|block-arc-ui -63578=swarmer|block-swarmer-ui -63577=salvo|block-salvo-ui -63576=fuse|block-fuse-ui -63575=ripple|block-ripple-ui -63574=cyclone|block-cyclone-ui -63573=spectre|block-spectre-ui -63572=meltdown|block-meltdown-ui -63571=draug-factory|block-draug-factory-ui -63570=spirit-factory|block-spirit-factory-ui -63569=phantom-factory|block-phantom-factory-ui -63568=command-center|block-command-center-ui -63567=wraith-factory|block-wraith-factory-ui -63566=ghoul-factory|block-ghoul-factory-ui -63565=revenant-factory|block-revenant-factory-ui -63564=dagger-factory|block-dagger-factory-ui -63563=crawler-factory|block-crawler-factory-ui -63562=titan-factory|block-titan-factory-ui -63561=fortress-factory|block-fortress-factory-ui -63560=repair-point|block-repair-point-ui -63559=dart-mech-pad|block-dart-mech-pad-ui -63558=delta-mech-pad|block-delta-mech-pad-ui -63557=tau-mech-pad|block-tau-mech-pad-ui -63556=omega-mech-pad|block-omega-mech-pad-ui -63555=javelin-ship-pad|block-javelin-ship-pad-ui -63554=trident-ship-pad|block-trident-ship-pad-ui -63553=glaive-ship-pad|block-glaive-ship-pad-ui -63552=power-source|block-power-source-ui -63551=power-void|block-power-void-ui -63550=item-source|block-item-source-ui -63549=item-void|block-item-void-ui -63548=liquid-source|block-liquid-source-ui -63547=liquid-void|block-liquid-void-ui -63546=message|block-message-ui -63545=illuminator|block-illuminator-ui -63544=copper|item-copper-ui -63543=lead|item-lead-ui -63542=metaglass|item-metaglass-ui -63541=graphite|item-graphite-ui -63540=sand|item-sand-ui -63539=coal|item-coal-ui -63538=titanium|item-titanium-ui -63537=thorium|item-thorium-ui -63536=scrap|item-scrap-ui -63535=silicon|item-silicon-ui -63534=plastanium|item-plastanium-ui -63533=phase-fabric|item-phase-fabric-ui -63532=surge-alloy|item-surge-alloy-ui -63531=spore-pod|item-spore-pod-ui -63530=blast-compound|item-blast-compound-ui -63529=pyratite|item-pyratite-ui -63528=water|liquid-water-ui -63527=slag|liquid-slag-ui -63526=oil|liquid-oil-ui -63525=cryofluid|liquid-cryofluid-ui -63524=underflow-gate|block-underflow-gate-ui -63523=dart-ship-pad|block-dart-ship-pad-ui -63522=alpha-mech-pad|block-alpha-mech-pad-ui -63521=cliff|block-cliff-ui -63520=legacy-mech-pad|block-legacy-mech-pad-ui -63519=ground-factory|block-ground-factory-ui -63518=legacy-unit-factory|block-legacy-unit-factory-ui -63517=mass-conveyor|block-mass-conveyor-ui -63516=legacy-command-center|block-legacy-command-center-ui -63515=block-forge|block-block-forge-ui -63514=block-launcher|block-block-launcher-ui -63513=plastanium-conveyor|block-plastanium-conveyor-ui -63512=crater|crater -63511=naval-factory|block-naval-factory-ui -63510=air-factory|block-air-factory-ui -63509=basic-reconstructor|block-basic-reconstructor-ui -63508=block-loader|block-block-loader-ui -63507=block-unloader|block-block-unloader-ui -63506=core-silo|block-core-silo-ui -63505=data-processor|block-data-processor-ui -63504=payload-router|block-payload-router-ui -63503=silicon-crucible|block-silicon-crucible-ui -63502=segment|block-segment-ui -63501=large-overdrive-projector|block-large-overdrive-projector-ui -63500=disassembler|block-disassembler-ui -63499=advanced-reconstructor|block-advanced-reconstructor-ui -63498=reconstructor-basis|block-reconstructor-basis-ui -63497=reconstructor-morphism|block-reconstructor-morphism-ui -63496=reconstructor-functor|block-reconstructor-functor-ui -63495=reconstructor-prime|block-reconstructor-prime-ui -63494=additive-reconstructor|block-additive-reconstructor-ui -63493=multiplicative-reconstructor|block-multiplicative-reconstructor-ui -63492=exponential-reconstructor|block-exponential-reconstructor-ui -63491=tetrative-reconstructor|block-tetrative-reconstructor-ui -63490=resupply-point|block-resupply-point-ui -63489=parallax|block-parallax-ui -63488=dagger|unit-dagger-ui -63487=mace|unit-mace-ui -63486=fortress|unit-fortress-ui -63485=nova|unit-nova-ui -63484=pulsar|unit-pulsar-ui -63483=quasar|unit-quasar-ui -63482=crawler|unit-crawler-ui -63481=atrax|unit-atrax-ui -63480=spiroct|unit-spiroct-ui -63479=arkyid|unit-arkyid-ui -63478=flare|unit-flare-ui -63477=horizon|unit-horizon-ui -63476=zenith|unit-zenith-ui -63475=antumbra|unit-antumbra-ui -63474=eclipse|unit-eclipse-ui -63473=mono|unit-mono-ui -63472=poly|unit-poly-ui -63471=mega|unit-mega-ui -63470=risse|unit-risse-ui -63469=minke|unit-minke-ui -63468=bryde|unit-bryde-ui -63467=alpha|unit-alpha-ui -63466=beta|unit-beta-ui -63465=gamma|unit-gamma-ui -63464=block|unit-block-ui -63463=risso|unit-risso-ui -63462=overdrive-dome|block-overdrive-dome-ui -63461=logic-processor|block-logic-processor-ui -63460=micro-processor|block-micro-processor-ui -63459=logic-display|block-logic-display-ui -63458=switch|block-switch-ui -63457=memory-cell|block-memory-cell-ui -63456=payload-conveyor|block-payload-conveyor-ui -63455=hyper-processor|block-hyper-processor-ui -63454=toxopid|unit-toxopid-ui -63453=vestige|unit-vestige-ui -63452=cataclyst|unit-cataclyst-ui -63451=scepter|unit-scepter-ui -63450=reign|unit-reign-ui -63449=dirt|block-dirt-ui -63447=stone-wall|block-stone-wall-ui -63446=spore-wall|block-spore-wall-ui -63445=ice-wall|block-ice-wall-ui -63444=snow-wall|block-snow-wall-ui -63443=dune-wall|block-dune-wall-ui -63442=sand-wall|block-sand-wall-ui -63441=salt-wall|block-salt-wall-ui -63440=shale-wall|block-shale-wall-ui -63439=dirt-wall|block-dirt-wall-ui -63437=basalt|block-basalt-ui -63436=dacite|block-dacite-ui -63435=boulder|block-boulder-ui -63434=snow-boulder|block-snow-boulder-ui -63433=dacite-wall|block-dacite-wall-ui -63432=dacite-boulder|block-dacite-boulder-ui -63431=large-logic-display|block-large-logic-display-ui -63430=omura|unit-omura-ui -63429=mud|block-mud-ui -63428=sei|unit-sei-ui -63427=quad|unit-quad-ui -63426=oct|unit-oct-ui -63425=vela|unit-vela-ui -63424=corvus|unit-corvus-ui -63423=memory-bank|block-memory-bank-ui -63422=foreshadow|block-foreshadow-ui -63421=tsunami|block-tsunami-ui -63420=space|block-space-ui -63419=legacy-unit-factory-air|block-legacy-unit-factory-air-ui -63418=legacy-unit-factory-ground|block-legacy-unit-factory-ground-ui -63417=interplanetary-accelerator|block-interplanetary-accelerator-ui -63416=basalt-boulder|block-basalt-boulder-ui -63415=none|status-none-ui -63414=burning|status-burning-ui -63413=freezing|status-freezing-ui -63412=unmoving|status-unmoving-ui -63411=slow|status-slow-ui -63410=wet|status-wet-ui -63409=muddy|status-muddy-ui -63408=melting|status-melting-ui -63407=sapped|status-sapped-ui -63406=spore-slowed|status-spore-slowed-ui -63405=tarred|status-tarred-ui -63404=overdrive|status-overdrive-ui -63403=overclock|status-overclock-ui -63402=shielded|status-shielded-ui -63401=boss|status-boss-ui -63400=shocked|status-shocked-ui -63399=blasted|status-blasted-ui -63398=corroded|status-corroded-ui -63397=disarmed|status-disarmed-ui -63385=duct|block-duct-ui -63376=repair-turret|block-repair-turret-ui -63375=payload-propulsion-tower|block-payload-propulsion-tower-ui -63374=payload-incinerator|block-payload-incinerator-ui -63373=payload-void|block-payload-void-ui -63372=payload-source|block-payload-source-ui -63368=retusa|unit-retusa-ui -63367=directional-item-bridge|block-directional-item-bridge-ui -63366=duct-router|block-duct-router-ui -63365=duct-bridge|block-duct-bridge-ui -63364=oxynoe|unit-oxynoe-ui -63363=cyerce|unit-cyerce-ui -63362=aegires|unit-aegires-ui -63361=electrified|status-electrified-ui -63360=navanax|unit-navanax-ui -63354=payload-launch-pad|block-payload-launch-pad-ui -63353=silicon-arc-furnace|block-silicon-arc-furnace-ui -63352=metal-floor-4|block-metal-floor-4-ui -63351=invincible|status-invincible-ui -63356=sharded|team-sharded -63357=crux|team-crux -63358=derelict|team-derelict -63350=deep-water|block-deep-water-ui -63348=molten-slag|block-molten-slag-ui -63347=crater-stone|block-crater-stone-ui -63346=deep-tainted-water|block-deep-tainted-water-ui diff --git a/gradle.properties b/gradle.properties index 00daf31a6e..dd8fe4d610 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,4 +24,4 @@ android.useAndroidX=true #used for slow jitpack builds; TODO see if this actually works org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 -archash=b631e4ed8d93513a52ebee6f7e612f7d603062c8 +archash=57b15a1b73cf0d6f19a50d2111f43d993e57c7f1 From 13b92519f17eed61f58835e2f675099abcb0517e Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 27 Sep 2021 15:07:34 -0400 Subject: [PATCH 36/45] Added missing revision --- annotations/src/main/resources/revisions/EffectStateComp/6.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 annotations/src/main/resources/revisions/EffectStateComp/6.json diff --git a/annotations/src/main/resources/revisions/EffectStateComp/6.json b/annotations/src/main/resources/revisions/EffectStateComp/6.json new file mode 100644 index 0000000000..fbac2089b0 --- /dev/null +++ b/annotations/src/main/resources/revisions/EffectStateComp/6.json @@ -0,0 +1 @@ +{version:6,fields:[{name:color,type:arc.graphics.Color},{name:data,type:java.lang.Object},{name:effect,type:mindustry.entities.Effect},{name:lifetime,type:float},{name:offsetPos,type:float},{name:offsetRot,type:float},{name:offsetX,type:float},{name:offsetY,type:float},{name:parent,type:mindustry.gen.Posc},{name:rotWithParent,type:boolean},{name:rotation,type:float},{name:time,type:float},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file From 2f9bf6e13fb602b1424c0553299973f044b736b6 Mon Sep 17 00:00:00 2001 From: Matthew Peng <54301439+MEEPofFaith@users.noreply.github.com> Date: Mon, 27 Sep 2021 12:11:36 -0700 Subject: [PATCH 37/45] collideTerrain (#6059) * collideTerrain * Combine code --- core/src/mindustry/entities/bullet/BulletType.java | 2 ++ core/src/mindustry/entities/comp/BulletComp.java | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index df4c835abd..062c8cc965 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -93,6 +93,8 @@ public class BulletType extends Content implements Cloneable{ public boolean collides = true; /** If true, this projectile collides with non-surface floors. */ public boolean collideFloor = false; + /** If true, this projectile collides with static walls */ + public boolean collideTerrain = false; /** Whether velocity is inherited from the shooter. */ public boolean keepVelocity = true; /** Whether to scale lifetime (not actually velocity!) to disappear at the target position. Used for artillery. */ diff --git a/core/src/mindustry/entities/comp/BulletComp.java b/core/src/mindustry/entities/comp/BulletComp.java index 5054694531..788cfaeb8c 100644 --- a/core/src/mindustry/entities/comp/BulletComp.java +++ b/core/src/mindustry/entities/comp/BulletComp.java @@ -14,6 +14,7 @@ import mindustry.game.Teams.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.world.*; +import mindustry.world.blocks.environment.*; import static mindustry.Vars.*; @@ -140,9 +141,12 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw while(x >= 0 && y >= 0 && x < ww && y < wh){ Building build = world.build(x, y); - if(type.collideFloor){ + if(type.collideFloor || type.collideTerrain){ Tile tile = world.tile(x, y); - if(tile == null || tile.floor().hasSurface() || tile.block() != Blocks.air){ + if( + type.collideFloor && (tile == null || tile.floor().hasSurface() || tile.block() != Blocks.air) || + type.collideTerrain && tile != null && tile.block() instanceof StaticWall + ){ type.despawned(self()); remove(); hit = true; From f5a2ed900d9c9eabbdf7f72296ea6c1c86826a64 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 27 Sep 2021 19:02:06 -0400 Subject: [PATCH 38/45] Make hint.presetLaunch more likely to show up --- core/src/mindustry/ui/fragments/HintsFragment.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/src/mindustry/ui/fragments/HintsFragment.java b/core/src/mindustry/ui/fragments/HintsFragment.java index 05fc098f9d..26992df73d 100644 --- a/core/src/mindustry/ui/fragments/HintsFragment.java +++ b/core/src/mindustry/ui/fragments/HintsFragment.java @@ -177,9 +177,7 @@ public class HintsFragment extends Fragment{ && state.rules.defaultTeam.core().items.has(Blocks.coreFoundation.requirements), () -> ui.hints.placedBlocks.contains(Blocks.coreFoundation)), presetLaunch(() -> state.isCampaign() - && state.getSector().preset == null - && SectorPresets.frozenForest.unlocked() - && SectorPresets.frozenForest.sector.save == null, + && state.getSector().preset == null, () -> state.isCampaign() && state.getSector().preset == SectorPresets.frozenForest), presetDifficulty(() -> state.isCampaign() && state.getSector().preset == null From 30e6bb2625f7201c710f5a532da2610f04431645 Mon Sep 17 00:00:00 2001 From: SoMall-dumpling <57857764+SoMall-dumpling@users.noreply.github.com> Date: Tue, 28 Sep 2021 07:11:48 +0800 Subject: [PATCH 39/45] Retusa Description Change (#6061) Now that Retusa has been remaked, the description needs to be changed too. --- 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 b1d30ffb15..3dab21b6e4 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1614,7 +1614,7 @@ unit.omura.description = Fires a long-range piercing railgun bolt at enemies. Co unit.alpha.description = Defends the Shard core from enemies. Builds structures. unit.beta.description = Defends the Foundation core from enemies. Builds structures. unit.gamma.description = Defends the Nucleus core from enemies. Builds structures. -unit.retusa.description = Places proximity mines. Repairs allied units. +unit.retusa.description = Fires homing torpedos at nearby enemies. Repairs allied units. unit.oxynoe.description = Fires structure-repairing streams of flame at nearby enemies. Targets nearby enemy projectiles with a point defense turret. unit.cyerce.description = Fires seeking cluster-missiles at enemies. Repairs allied units. unit.aegires.description = Shocks all enemy units and structures that enter its energy field. Repairs all allies. From c814ef0012ba2645090313b2e5b4a46b023af700 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 27 Sep 2021 21:11:21 -0400 Subject: [PATCH 40/45] Slightly increased item charge damage --- core/src/mindustry/entities/comp/BuildingComp.java | 2 +- core/src/mindustry/entities/comp/UnitComp.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index 1462800774..d1f5cf3202 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -1037,7 +1037,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, int amount = Math.min(items.get(item), explosionItemCap()); explosiveness += item.explosiveness * amount; flammability += item.flammability * amount; - power += item.charge * amount * 100f; + power += item.charge * Mathf.pow(amount, 1.1f) * 150f; } } diff --git a/core/src/mindustry/entities/comp/UnitComp.java b/core/src/mindustry/entities/comp/UnitComp.java index e72041a8da..3d1d808685 100644 --- a/core/src/mindustry/entities/comp/UnitComp.java +++ b/core/src/mindustry/entities/comp/UnitComp.java @@ -476,7 +476,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I float explosiveness = 2f + item().explosiveness * stack().amount * 1.53f; float flammability = item().flammability * stack().amount / 1.9f; - float power = item().charge * stack().amount * 150f; + float power = item().charge * Mathf.pow(stack().amount, 1.11f) * 160f; if(!spawnedByCore){ Damage.dynamicExplosion(x, y, flammability, explosiveness, power, bounds() / 2f, state.rules.damageExplosions, item().flammability > 1, team, type.deathExplosionEffect); From 366822e4d19a5f449aca523f1dc47515388fc2bf Mon Sep 17 00:00:00 2001 From: TranquillyUnpleasant <62061444+TranquillyUnpleasant@users.noreply.github.com> Date: Tue, 28 Sep 2021 07:25:22 +0500 Subject: [PATCH 41/45] Remove unused variable (#6063) This got leftover from some other shader testing I did. --- core/assets/shaders/cryofluid.frag | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/assets/shaders/cryofluid.frag b/core/assets/shaders/cryofluid.frag index 4299a0b8b1..6bfac12520 100644 --- a/core/assets/shaders/cryofluid.frag +++ b/core/assets/shaders/cryofluid.frag @@ -14,8 +14,6 @@ uniform float u_time; varying vec2 v_texCoords; -const float shakeScl = 20.0; - void main(){ vec2 c = v_texCoords.xy; vec2 coords = vec2(c.x * u_resolution.x + u_campos.x, c.y * u_resolution.y + u_campos.y); From 182dfc5f384033c6f66563d880d334f64316ddf0 Mon Sep 17 00:00:00 2001 From: Matthew Peng <54301439+MEEPofFaith@users.noreply.github.com> Date: Tue, 28 Sep 2021 05:41:40 -0700 Subject: [PATCH 42/45] delta in reload for a LaserTurret isn't properly calculated (#6068) --- .../src/mindustry/world/blocks/defense/turrets/LaserTurret.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java b/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java index 0d0a912a5e..8106aa836a 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java @@ -67,7 +67,7 @@ public class LaserTurret extends PowerTurret{ Liquid liquid = liquids.current(); float maxUsed = consumes.get(ConsumeType.liquid).amount; - float used = (cheating() ? maxUsed * Time.delta : Math.min(liquids.get(liquid), maxUsed * Time.delta)); + float used = (cheating() ? maxUsed : Math.min(liquids.get(liquid), maxUsed)) * Time.delta; reload -= used * liquid.heatCapacity * coolantMultiplier; liquids.remove(liquid, used); From d226ffe633db897e92f0348f74d0bca412dc5b20 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 28 Sep 2021 11:28:53 -0400 Subject: [PATCH 43/45] Fixed #6071 --- core/assets/shaders/slag.frag | 2 +- core/src/mindustry/content/UnitTypes.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/assets/shaders/slag.frag b/core/assets/shaders/slag.frag index c038baf292..2750d32ecd 100755 --- a/core/assets/shaders/slag.frag +++ b/core/assets/shaders/slag.frag @@ -18,7 +18,7 @@ void main(){ vec2 c = v_texCoords.xy; vec2 coords = vec2(c.x * u_resolution.x + u_campos.x, c.y * u_resolution.y + u_campos.y); - float btime = u_time / 4000.0; + float btime = u_time / 5000.0; float noise = (texture2D(u_noise, (coords) / NSCALE + vec2(btime) * vec2(-0.9, 0.8)).r + texture2D(u_noise, (coords) / NSCALE + vec2(btime * 1.1) * vec2(0.8, -1.0)).r) / 2.0; vec4 color = texture2D(u_texture, c); diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 386db5d9f1..9874f66516 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -1823,6 +1823,7 @@ public class UnitTypes implements ContentList{ shotDelay = 7f; x = y = shootX = shootY = 0f; shootSound = Sounds.mineDeploy; + rotateSpeed = 180f; bullet = new BasicBulletType(){{ sprite = "mine-bullet"; @@ -1840,7 +1841,6 @@ public class UnitTypes implements ContentList{ hitSound = Sounds.plasmaboom; - shootCone = 360f; ejectEffect = Fx.none; hitSize = 22f; From 7f415588f4f413922ed7997e37948b3104dbe77a Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 28 Sep 2021 14:41:35 -0400 Subject: [PATCH 44/45] Cleaned up duplicate SettingsMenuDialog code --- core/src/mindustry/type/Weapon.java | 30 ++++++++-------- .../ui/dialogs/SettingsMenuDialog.java | 34 ++++--------------- 2 files changed, 22 insertions(+), 42 deletions(-) diff --git a/core/src/mindustry/type/Weapon.java b/core/src/mindustry/type/Weapon.java index f72e60f3a3..c96482d15d 100644 --- a/core/src/mindustry/type/Weapon.java +++ b/core/src/mindustry/type/Weapon.java @@ -200,6 +200,18 @@ public class Weapon implements Cloneable{ boolean can = unit.canShoot(); mount.reload = Math.max(mount.reload - Time.delta * unit.reloadMultiplier, 0); + //rotate if applicable + if(rotate && (mount.rotate || mount.shoot) && can){ + float axisX = unit.x + Angles.trnsx(unit.rotation - 90, x, y), + axisY = unit.y + Angles.trnsy(unit.rotation - 90, x, y); + + mount.targetRotation = Angles.angle(axisX, axisY, mount.aimX, mount.aimY) - unit.rotation; + mount.rotation = Angles.moveToward(mount.rotation, mount.targetRotation, rotateSpeed * Time.delta); + }else if(!rotate){ + mount.rotation = 0; + mount.targetRotation = unit.angleTo(mount.aimX, mount.aimY); + } + float weaponRotation = unit.rotation - 90 + (rotate ? mount.rotation : 0), mountX = unit.x + Angles.trnsx(unit.rotation - 90, x, y), @@ -256,7 +268,7 @@ public class Weapon implements Cloneable{ } }else{ //heat decreases when not firing - mount.heat = Math.max(mount.heat - Time.delta * unit.reloadMultiplier / mount.weapon.cooldownTime, 0); + mount.heat = Math.max(mount.heat - Time.delta * unit.reloadMultiplier / cooldownTime, 0); if(mount.sound != null){ mount.sound.update(bulletX, bulletY, false); @@ -270,26 +282,14 @@ public class Weapon implements Cloneable{ mount.side = !mount.side; } - //rotate if applicable - if(rotate && (mount.rotate || mount.shoot) && can){ - float axisX = unit.x + Angles.trnsx(unit.rotation - 90, x, y), - axisY = unit.y + Angles.trnsy(unit.rotation - 90, x, y); - - mount.targetRotation = Angles.angle(axisX, axisY, mount.aimX, mount.aimY) - unit.rotation; - mount.rotation = Angles.moveToward(mount.rotation, mount.targetRotation, rotateSpeed * Time.delta); - }else if(!rotate){ - mount.rotation = 0; - mount.targetRotation = unit.angleTo(mount.aimX, mount.aimY); - } - //shoot if applicable if(mount.shoot && //must be shooting can && //must be able to shoot (!useAmmo || unit.ammo > 0 || !state.rules.unitAmmo || unit.team.rules().infiniteAmmo) && //check ammo (!alternate || mount.side == flipSprite) && - unit.vel.len() >= mount.weapon.minShootVelocity && //check velocity requirements + unit.vel.len() >= 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 + Angles.within(rotate ? mount.rotation : unit.rotation, mount.targetRotation, shootCone) //has to be within the cone ){ shoot(unit, mount, bulletX, bulletY, mount.aimX, mount.aimY, mountX, mountY, shootAngle, Mathf.sign(x)); diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index d8d0b40826..ea864a0064 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -17,7 +17,6 @@ import arc.util.*; import arc.util.io.*; import mindustry.content.*; import mindustry.content.TechTree.*; -import mindustry.core.GameState.*; import mindustry.core.*; import mindustry.ctype.*; import mindustry.game.EventType.*; @@ -32,7 +31,7 @@ import java.util.zip.*; import static arc.Core.*; import static mindustry.Vars.*; -public class SettingsMenuDialog extends Dialog{ +public class SettingsMenuDialog extends BaseDialog{ public SettingsTable graphics; public SettingsTable game; public SettingsTable sound; @@ -48,39 +47,20 @@ public class SettingsMenuDialog extends Dialog{ addCloseButton(); cont.add(main = new SettingsTable()); - - hidden(() -> { - Sounds.back.play(); - if(state.isGame()){ - if(!wasPaused || net.active()) - state.set(State.playing); - } - }); + shouldPause = true; shown(() -> { back(); - if(state.isGame()){ - wasPaused = state.is(State.paused); - state.set(State.paused); - } - rebuildMenu(); }); - Events.on(ResizeEvent.class, event -> { - if(isShown() && Core.scene.getDialog() == this){ - graphics.rebuild(); - sound.rebuild(); - game.rebuild(); - updateScrollFocus(); - } + onResize(() -> { + graphics.rebuild(); + sound.rebuild(); + game.rebuild(); + updateScrollFocus(); }); - setFillParent(true); - title.setAlignment(Align.center); - titleTable.row(); - titleTable.add(new Image()).growX().height(3f).pad(4f).get().setColor(Pal.accent); - cont.clearChildren(); cont.remove(); buttons.remove(); From 71543f2ab25c59956cde5e4eca8553fbe71fb6d9 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 28 Sep 2021 17:20:20 -0400 Subject: [PATCH 45/45] Improved Serpulo water edge generation --- core/src/mindustry/ai/Astar.java | 17 +++++++---- .../maps/planet/SerpuloPlanetGenerator.java | 29 ++++++++++++++++++- core/src/mindustry/world/Tile.java | 5 ++++ 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/core/src/mindustry/ai/Astar.java b/core/src/mindustry/ai/Astar.java index df50547d22..76d73d84b0 100644 --- a/core/src/mindustry/ai/Astar.java +++ b/core/src/mindustry/ai/Astar.java @@ -6,6 +6,8 @@ import arc.struct.*; import arc.util.*; import mindustry.world.*; +import java.util.*; + import static mindustry.Vars.*; public class Astar{ @@ -13,7 +15,7 @@ public class Astar{ private static final Seq out = new Seq<>(); private static final PQueue queue = new PQueue<>(200 * 200 / 4, (a, b) -> 0); - private static final IntFloatMap costs = new IntFloatMap(); + private static float[] costs; private static byte[][] rotations; public static Seq pathfind(Tile from, Tile to, TileHueristic th, Boolf passable){ @@ -32,9 +34,14 @@ public class Astar{ GridBits closed = new GridBits(tiles.width, tiles.height); - costs.clear(); + if(costs == null || costs.length != tiles.width * tiles.height){ + costs = new float[tiles.width * tiles.height]; + } + + Arrays.fill(costs, 0); + queue.clear(); - queue.comparator = Structs.comparingFloat(a -> costs.get(a.pos(), 0f) + dh.cost(a.x, a.y, end.x, end.y)); + queue.comparator = Structs.comparingFloat(a -> costs[a.array()] + dh.cost(a.x, a.y, end.x, end.y)); queue.add(start); if(rotations == null || rotations.length != world.width() || rotations[0].length != world.height()){ rotations = new byte[world.width()][world.height()]; @@ -43,7 +50,7 @@ public class Astar{ boolean found = false; while(!queue.empty()){ Tile next = queue.poll(); - float baseCost = costs.get(next.pos(), 0f); + float baseCost = costs[next.array()]; if(next == end){ found = true; break; @@ -58,7 +65,7 @@ public class Astar{ if(!closed.get(child.x, child.y)){ closed.set(child.x, child.y); rotations[child.x][child.y] = child.relativeTo(next.x, next.y); - costs.put(child.pos(), newCost); + costs[child.array()] = newCost; queue.add(child); } } diff --git a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java index 862835f2e9..adcc67c603 100644 --- a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java @@ -262,9 +262,36 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ for(Room room : roomseq){ spawn.connect(room); } + Room fspawn = spawn; cells(1); + + //shoreline setup + int deepRadius = 4; + + pass((x, y) -> { + if(floor.asFloor().isLiquid && !floor.asFloor().isDeep()){ + + for(int cx = -deepRadius; cx <= deepRadius; cx++){ + for(int cy = -deepRadius; cy <= deepRadius; cy++){ + + if((cx) * (cx) + (cy) * (cy) <= deepRadius * deepRadius){ + int wx = cx + x, wy = cy + y; + + Tile tile = tiles.get(wx, wy); + if(tile != null && (!tile.floor().isLiquid || tile.block() != Blocks.air)){ + //found something solid, skip replacing anything + return; + } + } + } + } + + floor = floor == Blocks.darksandTaintedWater ? Blocks.taintedWater : Blocks.water; + } + }); + distort(10f, 6f); //rivers @@ -286,7 +313,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ floor = spore ? (deep ? Blocks.taintedWater : Blocks.darksandTaintedWater) : (deep ? Blocks.water : - (floor == Blocks.sand ? Blocks.sandWater : Blocks.darksandWater)); + (floor == Blocks.sand || floor == Blocks.salt ? Blocks.sandWater : Blocks.darksandWater)); } } }); diff --git a/core/src/mindustry/world/Tile.java b/core/src/mindustry/world/Tile.java index 4131a22c4e..300e8d0e2d 100644 --- a/core/src/mindustry/world/Tile.java +++ b/core/src/mindustry/world/Tile.java @@ -62,6 +62,11 @@ public class Tile implements Position, QuadTreeObject, Displayable{ return Point2.pack(x, y); } + /** @return this tile's position, packed to the world width - for use in width*height arrays. */ + public int array(){ + return x + y * world.tiles.width; + } + public byte relativeTo(Tile tile){ return relativeTo(tile.x, tile.y); }