From c3a073fbbf3dac4429cf004fea87d9e3e641ed87 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 30 Jul 2020 10:51:43 -0400 Subject: [PATCH] Bugfixes --- build.gradle | 2 - core/assets/maps/groundZero.msav | Bin 13562 -> 13542 bytes core/assets/scripts/global.js | 66 ++++++++++++++++- core/src/mindustry/graphics/Shaders.java | 3 +- .../io/legacy/LegacySaveVersion.java | 2 +- core/src/mindustry/maps/Maps.java | 8 +-- .../mindustry/world/blocks/BuildBlock.java | 6 +- .../blocks/defense/OverdriveProjector.java | 2 +- .../world/blocks/defense/turrets/Turret.java | 1 + .../mindustry/tools/ScriptStubGenerator.java | 68 +++++++++++------- 10 files changed, 119 insertions(+), 39 deletions(-) diff --git a/build.gradle b/build.gradle index a986b4e058..9146c9160c 100644 --- a/build.gradle +++ b/build.gradle @@ -324,8 +324,6 @@ project(":tools"){ implementation arcModule("natives:natives-freetype-desktop") implementation arcModule("natives:natives-box2d-desktop") implementation arcModule("backends:backend-headless") - - implementation "org.reflections:reflections:0.9.11" } } diff --git a/core/assets/maps/groundZero.msav b/core/assets/maps/groundZero.msav index c2d66b2cc86a76cf2136e7797671e825261a1fe0..b6d02df43cd630b51c8d763cfe9f23988b54133a 100644 GIT binary patch literal 13542 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 literal 13562 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 A2mk;8 diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index 4bbf0aa1c5..4f2843c3a1 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -30,11 +30,73 @@ const extend = function(classType, params){ const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer})) Call = Packages.mindustry.gen.Call -importPackage(Packages.arc.graphics.g2d) +importPackage(Packages.mindustry.maps) +importPackage(Packages.mindustry.world.blocks.production) +importPackage(Packages.mindustry.graphics.g3d) +importPackage(Packages.mindustry.ai.types) +importPackage(Packages.mindustry.world.draw) +importPackage(Packages.mindustry.game) +importPackage(Packages.mindustry.logic) +importPackage(Packages.mindustry.entities.comp) +importPackage(Packages.mindustry.world.blocks.sandbox) +importPackage(Packages.mindustry.world.consumers) +importPackage(Packages.mindustry.type) +importPackage(Packages.mindustry.maps.filters) +importPackage(Packages.arc.struct) +importPackage(Packages.mindustry.world.meta.values) +importPackage(Packages.mindustry.world.blocks.distribution) +importPackage(Packages.mindustry.ui.dialogs) importPackage(Packages.mindustry.gen) +importPackage(Packages.mindustry.graphics) +importPackage(Packages.arc.scene.ui) +importPackage(Packages.mindustry.ai) +importPackage(Packages.mindustry.content) +importPackage(Packages.mindustry.ctype) +importPackage(Packages.arc.scene.event) +importPackage(Packages.mindustry.entities.bullet) +importPackage(Packages.arc.math.geom) +importPackage(Packages.mindustry.ui) +importPackage(Packages.mindustry.ai.formations) +importPackage(Packages.arc.func) +importPackage(Packages.mindustry.ui.fragments) +importPackage(Packages.mindustry.world.blocks.units) +importPackage(Packages.mindustry.world.modules) +importPackage(Packages.mindustry.world.blocks.power) +importPackage(Packages.arc.scene.utils) +importPackage(Packages.mindustry.entities) +importPackage(Packages.mindustry.audio) importPackage(Packages.arc.math) -importPackage(Packages.arc.graphics) +importPackage(Packages.arc.scene.ui.layout) +importPackage(Packages.arc.scene.actions) +importPackage(Packages.arc.scene.style) +importPackage(Packages.mindustry.world.blocks.defense.turrets) +importPackage(Packages.mindustry.core) +importPackage(Packages.arc.scene) +importPackage(Packages.mindustry.entities.units) +importPackage(Packages.mindustry.world.blocks.defense) +importPackage(Packages.mindustry.world) +importPackage(Packages.mindustry.world.blocks) +importPackage(Packages.mindustry.editor) +importPackage(Packages.mindustry.world.blocks.storage) +importPackage(Packages.mindustry.world.blocks.environment) +importPackage(Packages.mindustry.async) +importPackage(Packages.mindustry.maps.planet) +importPackage(Packages.mindustry.world.blocks.liquid) +importPackage(Packages.mindustry.ai.formations.patterns) +importPackage(Packages.mindustry.ui.layout) +importPackage(Packages.mindustry.input) +importPackage(Packages.mindustry.world.blocks.legacy) +importPackage(Packages.mindustry.entities.abilities) +importPackage(Packages.mindustry) +importPackage(Packages.mindustry.world.meta) +importPackage(Packages.mindustry.world.blocks.experimental) +importPackage(Packages.mindustry.world.blocks.payloads) +importPackage(Packages.mindustry.maps.generators) +importPackage(Packages.arc.graphics.g2d) importPackage(Packages.arc.util) +importPackage(Packages.mindustry.world.blocks.campaign) +importPackage(Packages.arc.graphics) +importPackage(Packages.mindustry.world.producers) importPackage(Packages.arc) const PlayerIpUnbanEvent = Packages.mindustry.game.EventType.PlayerIpUnbanEvent const PlayerIpBanEvent = Packages.mindustry.game.EventType.PlayerIpBanEvent diff --git a/core/src/mindustry/graphics/Shaders.java b/core/src/mindustry/graphics/Shaders.java index fd418c9673..884f70b84e 100644 --- a/core/src/mindustry/graphics/Shaders.java +++ b/core/src/mindustry/graphics/Shaders.java @@ -24,11 +24,12 @@ public class Shaders{ public static PlanetShader planet; public static PlanetGridShader planetGrid; public static AtmosphereShader atmosphere; - public static MeshShader mesh = new MeshShader(); + public static MeshShader mesh; public static Shader unlit; public static Shader screenspace; public static void init(){ + mesh = new MeshShader(); blockbuild = new BlockBuild(); try{ shield = new ShieldShader(); diff --git a/core/src/mindustry/io/legacy/LegacySaveVersion.java b/core/src/mindustry/io/legacy/LegacySaveVersion.java index 9dac92b8de..7e78855f7e 100644 --- a/core/src/mindustry/io/legacy/LegacySaveVersion.java +++ b/core/src/mindustry/io/legacy/LegacySaveVersion.java @@ -66,7 +66,7 @@ public abstract class LegacySaveVersion extends SaveVersion{ readChunk(stream, true, in -> { byte version = in.readByte(); //legacy impl of Building#read() - tile.build.health(stream.readUnsignedShort()); + tile.build.health = stream.readUnsignedShort(); byte packedrot = stream.readByte(); byte team = Pack.leftByte(packedrot) == 8 ? stream.readByte() : Pack.leftByte(packedrot); byte rotation = Pack.rightByte(packedrot); diff --git a/core/src/mindustry/maps/Maps.java b/core/src/mindustry/maps/Maps.java index e71425539f..8fe2910eeb 100644 --- a/core/src/mindustry/maps/Maps.java +++ b/core/src/mindustry/maps/Maps.java @@ -3,11 +3,11 @@ package mindustry.maps; import arc.*; import arc.assets.*; import arc.assets.loaders.*; -import arc.struct.*; -import arc.struct.IntSet.*; import arc.files.*; import arc.func.*; import arc.graphics.*; +import arc.struct.IntSet.*; +import arc.struct.*; import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.async.*; @@ -15,7 +15,7 @@ import arc.util.io.*; import arc.util.serialization.*; import mindustry.*; import mindustry.content.*; -import mindustry.ctype.*; +import mindustry.core.*; import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.io.*; @@ -87,7 +87,7 @@ public class Maps{ }); if(Core.assets != null){ - ((CustomLoader) Core.assets.getLoader(Content.class)).loaded = this::createAllPreviews; + ((CustomLoader)Core.assets.getLoader(ContentLoader.class)).loaded = this::createAllPreviews; } } diff --git a/core/src/mindustry/world/blocks/BuildBlock.java b/core/src/mindustry/world/blocks/BuildBlock.java index b664d5d099..50a6d45688 100644 --- a/core/src/mindustry/world/blocks/BuildBlock.java +++ b/core/src/mindustry/world/blocks/BuildBlock.java @@ -190,7 +190,7 @@ public class BuildBlock extends Block{ }); } - public boolean construct(Unitc builder, @Nullable Building core, float amount, boolean configured){ + public boolean construct(Unit builder, @Nullable Building core, float amount, boolean configured){ if(cblock == null){ kill(); return false; @@ -211,10 +211,10 @@ public class BuildBlock extends Block{ maxProgress = core == null || team.rules().infiniteResources ? maxProgress : checkRequired(core.items, maxProgress, true); progress = Mathf.clamp(progress + maxProgress); - builderID = builder.id(); + builderID = builder.id; if(progress >= 1f || state.rules.infiniteResources){ - constructed(tile, cblock, builderID, (byte)rotation, builder.team(), configured); + constructed(tile, cblock, builderID, (byte)rotation, builder.team, configured); return true; } return false; diff --git a/core/src/mindustry/world/blocks/defense/OverdriveProjector.java b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java index c42543266a..8af0b723c2 100644 --- a/core/src/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java @@ -79,7 +79,7 @@ public class OverdriveProjector extends Block{ phaseHeat = Mathf.lerpDelta(phaseHeat, Mathf.num(cons.optionalValid()), 0.1f); } - if(timer(timerUse, useTime) && efficiency() > 0){ + if(timer(timerUse, useTime) && efficiency() > 0 && consValid()){ consume(); } diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 73b478d582..a14b2bc2f9 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -395,6 +395,7 @@ public abstract class Turret extends Block{ @Override public void read(Reads read, byte revision){ super.read(read, revision); + if(revision == 1){ reload = read.f(); rotation = read.f(); diff --git a/tools/src/mindustry/tools/ScriptStubGenerator.java b/tools/src/mindustry/tools/ScriptStubGenerator.java index 560047b112..46fcf6a7bb 100644 --- a/tools/src/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/mindustry/tools/ScriptStubGenerator.java @@ -1,22 +1,19 @@ package mindustry.tools; import arc.*; -import arc.struct.Seq; -import arc.struct.*; import arc.files.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.graphics.g2d.TextureAtlas.*; import arc.math.*; +import arc.struct.*; import arc.util.*; import mindustry.game.*; import mindustry.gen.*; -import org.reflections.*; -import org.reflections.scanners.*; -import org.reflections.util.*; import java.io.*; import java.lang.reflect.*; +import java.net.*; import java.util.*; public class ScriptStubGenerator{ @@ -26,28 +23,18 @@ public class ScriptStubGenerator{ Seq blacklist = Seq.with("plugin", "mod", "net", "io", "tools"); Seq nameBlacklist = Seq.with("ClassAccess"); Seq> whitelist = Seq.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, - AtlasRegion.class, String.class, Mathf.class, Angles.class, Color.class, Runnable.class, Object.class, Icon.class, Tex.class, - Sounds.class, Musics.class, Call.class, Texture.class, TextureData.class, Pixmap.class, I18NBundle.class, Interval.class, DataInput.class, DataOutput.class, - DataInputStream.class, DataOutputStream.class, Integer.class, Float.class, Double.class, Long.class, Boolean.class, Short.class, Byte.class, Character.class); + AtlasRegion.class, String.class, Mathf.class, Angles.class, Color.class, Runnable.class, Object.class, Icon.class, Tex.class, + Sounds.class, Musics.class, Call.class, Texture.class, TextureData.class, Pixmap.class, I18NBundle.class, Interval.class, DataInput.class, DataOutput.class, + DataInputStream.class, DataOutputStream.class, Integer.class, Float.class, Double.class, Long.class, Boolean.class, Short.class, Byte.class, Character.class); Seq nopackage = Seq.with("java.lang", "java"); - List classLoadersList = new LinkedList<>(); - classLoadersList.add(ClasspathHelper.contextClassLoader()); - classLoadersList.add(ClasspathHelper.staticClassLoader()); - - Reflections reflections = new Reflections(new ConfigurationBuilder() - .setScanners(new SubTypesScanner(false), new ResourcesScanner()) - .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0]))) - .filterInputsBy(new FilterBuilder() - .include(FilterBuilder.prefix("mindustry")) - .include(FilterBuilder.prefix("arc.func")) - .include(FilterBuilder.prefix("arc.struct")) - .include(FilterBuilder.prefix("arc.scene")) - .include(FilterBuilder.prefix("arc.math")) - )); - - Seq> classes = Seq.with(reflections.getSubTypesOf(Object.class)); - classes.addAll(reflections.getSubTypesOf(Enum.class)); + Seq> classes = Seq.withArrays( + getClasses("mindustry"), + getClasses("arc.func"), + getClasses("arc.struct"), + getClasses("arc.scene"), + getClasses("arc.math") + ); classes.addAll(whitelist); classes.sort(Structs.comparing(Class::getName)); @@ -72,4 +59,35 @@ public class ScriptStubGenerator{ new Fi("core/assets/scripts/global.js").writeString(result.toString()); } + + + private static Seq getClasses(String packageName) throws Exception{ + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + Seq dirs = new Seq<>(); + + for(URL resource : Collections.list(classLoader.getResources(packageName.replace('.', '/')))){ + dirs.add(new File(resource.getFile())); + } + + Seq classes = new Seq<>(); + for(File directory : dirs){ + classes.addAll(findClasses(directory, packageName)); + } + return classes; + } + + private static Seq findClasses(File directory, String packageName) throws Exception{ + Seq classes = new Seq<>(); + if(!directory.exists()) return classes; + + File[] files = directory.listFiles(); + for(File file : files){ + if(file.isDirectory()){ + classes.addAll(findClasses(file, packageName + "." + file.getName())); + }else if(file.getName().endsWith(".class")){ + classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6), false, Thread.currentThread().getContextClassLoader())); + } + } + return classes; + } }