diff --git a/core/assets/bloomshaders/alpha_bloom.fragment.glsl b/core/assets/bloomshaders/alpha_bloom.frag similarity index 100% rename from core/assets/bloomshaders/alpha_bloom.fragment.glsl rename to core/assets/bloomshaders/alpha_bloom.frag diff --git a/core/assets/bloomshaders/alpha_gaussian.fragment.glsl b/core/assets/bloomshaders/alpha_gaussian.frag similarity index 100% rename from core/assets/bloomshaders/alpha_gaussian.fragment.glsl rename to core/assets/bloomshaders/alpha_gaussian.frag diff --git a/core/assets/bloomshaders/alpha_threshold.fragment.glsl b/core/assets/bloomshaders/alpha_threshold.frag similarity index 100% rename from core/assets/bloomshaders/alpha_threshold.fragment.glsl rename to core/assets/bloomshaders/alpha_threshold.frag diff --git a/core/assets/bloomshaders/bloom.fragment.glsl b/core/assets/bloomshaders/bloom.frag similarity index 100% rename from core/assets/bloomshaders/bloom.fragment.glsl rename to core/assets/bloomshaders/bloom.frag diff --git a/core/assets/bloomshaders/blurspace.vertex.glsl b/core/assets/bloomshaders/blurspace.vert similarity index 100% rename from core/assets/bloomshaders/blurspace.vertex.glsl rename to core/assets/bloomshaders/blurspace.vert diff --git a/core/assets/bloomshaders/gaussian.fragment.glsl b/core/assets/bloomshaders/gaussian.frag similarity index 100% rename from core/assets/bloomshaders/gaussian.fragment.glsl rename to core/assets/bloomshaders/gaussian.frag diff --git a/core/assets/bloomshaders/maskedtreshold.fragment.glsl b/core/assets/bloomshaders/maskedtreshold.frag similarity index 100% rename from core/assets/bloomshaders/maskedtreshold.fragment.glsl rename to core/assets/bloomshaders/maskedtreshold.frag diff --git a/core/assets/bloomshaders/screenspace.vertex.glsl b/core/assets/bloomshaders/screenspace.vert similarity index 100% rename from core/assets/bloomshaders/screenspace.vertex.glsl rename to core/assets/bloomshaders/screenspace.vert diff --git a/core/assets/bloomshaders/threshold.fragment.glsl b/core/assets/bloomshaders/threshold.frag similarity index 100% rename from core/assets/bloomshaders/threshold.fragment.glsl rename to core/assets/bloomshaders/threshold.frag diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 4625b0ac23..a444ea3598 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -39,6 +39,8 @@ be.check = Check for updates schematic = Schematic schematic.add = Save Schematic... schematics = Schematics +schematic.replace = A schematic by that name already exists. Replace it? +schematic.exists = A schematic by that name already exists. schematic.import = Import Schematic... schematic.exportfile = Export File schematic.importfile = Import File @@ -775,6 +777,7 @@ rules.respawntime = Respawn Time:[lightgray] (sec) rules.wavespacing = Wave Spacing:[lightgray] (sec) rules.buildcostmultiplier = Build Cost Multiplier rules.buildspeedmultiplier = Build Speed Multiplier +rules.deconstructrefundmultiplier = Deconstruct Refund Multiplier rules.waitForWaveToEnd = Waves Wait for Enemies rules.dropzoneradius = Drop Zone Radius:[lightgray] (tiles) rules.respawns = Max respawns per wave diff --git a/core/assets/scripts/base.js b/core/assets/scripts/base.js index 3721b5b165..d078e27b89 100755 --- a/core/assets/scripts/base.js +++ b/core/assets/scripts/base.js @@ -5,7 +5,7 @@ const log = function(context, obj){ var scriptName = "base.js" var modName = "none" -const print = text => log(scriptName, text); +const print = text => log(modName + "/" + scriptName, text); const extendContent = function(classType, name, params){ return new JavaAdapter(classType, params, name) diff --git a/core/src/mindustry/core/ContentLoader.java b/core/src/mindustry/core/ContentLoader.java index dc1e21e917..fe81b7ce59 100644 --- a/core/src/mindustry/core/ContentLoader.java +++ b/core/src/mindustry/core/ContentLoader.java @@ -1,5 +1,6 @@ package mindustry.core; +import arc.files.*; import arc.struct.*; import arc.func.*; import arc.graphics.*; @@ -182,6 +183,9 @@ public class ContentLoader{ } if(currentMod != null){ content.minfo.mod = currentMod; + if(content.minfo.sourceFile == null){ + content.minfo.sourceFile = new Fi(content.name); + } } contentNameMap[content.getContentType().ordinal()].put(content.name, content); } diff --git a/core/src/mindustry/game/Rules.java b/core/src/mindustry/game/Rules.java index ff946e359c..b1cca11316 100644 --- a/core/src/mindustry/game/Rules.java +++ b/core/src/mindustry/game/Rules.java @@ -44,6 +44,8 @@ public class Rules{ public float buildCostMultiplier = 1f; /** Multiplier for building speed. */ public float buildSpeedMultiplier = 1f; + /** Multiplier for percentage of materials refunded when deconstructing */ + public float deconstructRefundMultiplier = 0.5f; /** No-build zone around enemy core radius. */ public float enemyCoreBuildRadius = 400f; /** Radius around enemy wave drop zones.*/ diff --git a/core/src/mindustry/graphics/IndexedRenderer.java b/core/src/mindustry/graphics/IndexedRenderer.java index cb42b6fe0b..96194c0883 100644 --- a/core/src/mindustry/graphics/IndexedRenderer.java +++ b/core/src/mindustry/graphics/IndexedRenderer.java @@ -60,16 +60,13 @@ public class IndexedRenderer implements Disposable{ updateMatrix(); - program.begin(); - + program.bind(); texture.bind(); program.setUniformMatrix4("u_projTrans", BatchShader.copyTransform(combined)); program.setUniformi("u_texture", 0); mesh.render(program, Gl.triangles, 0, vertices.length / vsize); - - program.end(); } public void setColor(Color color){ diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 611cec44b6..cd2f3d6d6b 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -255,10 +255,19 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ if(lastSchematic == null) return; ui.showTextInput("$schematic.add", "$name", "", text -> { - lastSchematic.tags.put("name", text); - schematics.add(lastSchematic); - ui.showInfoFade("$schematic.saved"); - ui.schematics.showInfo(lastSchematic); + Schematic replacement = schematics.all().find(s -> s.name().equals(text)); + if(replacement != null){ + ui.showConfirm("$confirm", "$schematic.replace", () -> { + schematics.overwrite(replacement, lastSchematic); + ui.showInfoFade("$schematic.saved"); + ui.schematics.showInfo(replacement); + }); + }else{ + lastSchematic.tags.put("name", text); + schematics.add(lastSchematic); + ui.showInfoFade("$schematic.saved"); + ui.schematics.showInfo(lastSchematic); + } }); } diff --git a/core/src/mindustry/mod/Scripts.java b/core/src/mindustry/mod/Scripts.java index 69f272595c..1e1e5cb325 100644 --- a/core/src/mindustry/mod/Scripts.java +++ b/core/src/mindustry/mod/Scripts.java @@ -91,6 +91,9 @@ public class Scripts implements Disposable{ context.evaluateString(scope, script, file, 1, null); return true; }catch(Throwable t){ + if(currentMod != null){ + file = currentMod.name + "/" + file; + } log(LogLevel.err, file, "" + getError(t)); return false; } @@ -124,6 +127,8 @@ public class Scripts implements Disposable{ if(!dir.exists()) return null; // Mod and folder not found return loadSource(script, dir, validator); } + + currentMod = required; return loadSource(script, required.root.child("scripts"), validator); } diff --git a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java index 42ae294123..341368a51c 100644 --- a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -142,6 +142,7 @@ public class CustomRulesDialog extends FloatingDialog{ check("$rules.reactorexplosions", b -> rules.reactorExplosions = b, () -> rules.reactorExplosions); number("$rules.buildcostmultiplier", false, f -> rules.buildCostMultiplier = f, () -> rules.buildCostMultiplier, () -> !rules.infiniteResources); number("$rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier); + number("$rules.deconstructrefundmultiplier", false, f -> rules.deconstructRefundMultiplier = f, () -> rules.deconstructRefundMultiplier, () -> !rules.infiniteResources); number("$rules.blockhealthmultiplier", f -> rules.blockHealthMultiplier = f, () -> rules.blockHealthMultiplier); main.addButton("$configure", diff --git a/core/src/mindustry/ui/dialogs/SchematicsDialog.java b/core/src/mindustry/ui/dialogs/SchematicsDialog.java index fb29f9fa8e..5a67dacd58 100644 --- a/core/src/mindustry/ui/dialogs/SchematicsDialog.java +++ b/core/src/mindustry/ui/dialogs/SchematicsDialog.java @@ -90,6 +90,13 @@ public class SchematicsDialog extends FloatingDialog{ buttons.addImageButton(Icon.pencil, style, () -> { ui.showTextInput("$schematic.rename", "$name", s.name(), res -> { + Schematic replacement = schematics.all().find(other -> other.name().equals(res) && other != s); + if(replacement != null){ + //renaming to an existing schematic is not allowed, as it is not clear how the tags would be merged, and which one should be removed + ui.showErrorMessage("$schematic.exists"); + return; + } + s.tags.put("name", res); s.save(); rebuildPane[0].run(); diff --git a/core/src/mindustry/world/blocks/BuildBlock.java b/core/src/mindustry/world/blocks/BuildBlock.java index 19969df254..359d37d567 100644 --- a/core/src/mindustry/world/blocks/BuildBlock.java +++ b/core/src/mindustry/world/blocks/BuildBlock.java @@ -252,7 +252,7 @@ public class BuildBlock extends Block{ } public void deconstruct(Unit builder, @Nullable TileEntity core, float amount){ - float deconstructMultiplier = 0.5f; + float deconstructMultiplier = state.rules.deconstructRefundMultiplier; if(cblock != null){ ItemStack[] requirements = cblock.requirements; diff --git a/desktop/src/mindustry/desktop/DesktopLauncher.java b/desktop/src/mindustry/desktop/DesktopLauncher.java index 925a77aefb..6c54691e0f 100644 --- a/desktop/src/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/mindustry/desktop/DesktopLauncher.java @@ -180,9 +180,10 @@ public class DesktopLauncher extends ClientLauncher{ static void handleCrash(Throwable e){ Cons dialog = Runnable::run; boolean badGPU = false; + String total = Strings.getCauses(e).toString(); - if(e.getMessage() != null && (e.getMessage().contains("Couldn't create window") || - e.getMessage().contains("OpenGL 2.0 or higher") || e.getMessage().toLowerCase().contains("pixel format") || e.getMessage().contains("GLEW"))){ + if(total.contains("Couldn't create window") || + total.contains("OpenGL 2.0 or higher") || total.toLowerCase().contains("pixel format") || total.contains("GLEW")){ dialog.get(() -> message( e.getMessage().contains("Couldn't create window") ? "A graphics initialization error has occured! Try to update your graphics drivers:\n" + e.getMessage() : diff --git a/gradle.properties b/gradle.properties index 9a6d877821..3b4da6f663 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=69ef047313449905aff6d1390d7136f9c7cdc986 +archash=31a5158c6395b7e905ba546348c98fd99ea736bb