From a4f9518d1e33b1f8ca73227e0c584b2b0281182c Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 18 Dec 2020 09:42:57 -0500 Subject: [PATCH 01/47] testing winMM --- core/src/mindustry/input/InputHandler.java | 38 ++---------------- core/src/mindustry/world/Block.java | 7 ++++ .../world/blocks/power/PowerNode.java | 40 ++++++++++++++++++- 3 files changed, 49 insertions(+), 36 deletions(-) diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 2fed50a715..65147fda5d 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -48,7 +48,6 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ /** Maximum line length. */ final static int maxLength = 100; final static Rect r1 = new Rect(), r2 = new Rect(); - final static Seq tmpPoints = new Seq<>(), tmpPoints2 = new Seq<>(); public final OverlayFragment frag = new OverlayFragment(); @@ -1144,7 +1143,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ diagonal = !diagonal; } - if(block instanceof PowerNode){ + if(block != null && block.swapDiagonalPlacement){ diagonal = !diagonal; } @@ -1161,39 +1160,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ points = Placement.normalizeLine(startX, startY, endX, endY); } - if(block instanceof PowerNode node){ - var base = tmpPoints2; - var result = tmpPoints.clear(); - - base.selectFrom(points, p -> p == points.first() || p == points.peek() || Build.validPlace(block, player.team(), p.x, p.y, rotation, false)); - boolean addedLast = false; - - outer: - for(int i = 0; i < base.size;){ - var point = base.get(i); - result.add(point); - if(i == base.size - 1) addedLast = true; - - //find the furthest node that overlaps this one - for(int j = base.size - 1; j > i; j--){ - var other = base.get(j); - boolean over = node.overlaps(world.tile(point.x, point.y), world.tile(other.x, other.y)); - - if(over){ - //add node to list and start searching for node that overlaps the next one - i = j; - continue outer; - } - } - - //if it got here, that means nothing was found. try to proceed to the next node anyway - i ++; - } - - if(!addedLast) result.add(base.peek()); - - points.clear(); - points.addAll(result); + if(block != null){ + block.changePlacementPath(points, rotation); } float angle = Angles.angle(startX, startY, endX, endY); diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index 09546b6b27..b82a1ddb1a 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -143,6 +143,8 @@ public class Block extends UnlockableContent{ public boolean sync; /** Whether this block uses conveyor-type placement mode. */ public boolean conveyorPlacement; + /** Whether to swap the diagonal placement modes. */ + public boolean swapDiagonalPlacement; /** * The color of this block when displayed on the minimap or map preview. * Do not set manually! This is overridden when loading for most blocks. @@ -386,6 +388,11 @@ public class Block extends UnlockableContent{ return this; } + /** Mutates the given list of points used during line placement. */ + public void changePlacementPath(Seq points, int rotation){ + + } + public Object nextConfig(){ if(saveConfig && lastConfig != null){ return lastConfig; diff --git a/core/src/mindustry/world/blocks/power/PowerNode.java b/core/src/mindustry/world/blocks/power/PowerNode.java index f744dbe0b5..ab265dbf09 100644 --- a/core/src/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/mindustry/world/blocks/power/PowerNode.java @@ -25,7 +25,8 @@ public class PowerNode extends PowerBlock{ protected static boolean returnValue = false; protected static BuildPlan otherReq; - protected final ObjectSet graphs = new ObjectSet<>(); + protected final static ObjectSet graphs = new ObjectSet<>(); + protected final static Seq tmpPoints = new Seq<>(), tmpPoints2 = new Seq<>(); public @Load("laser") TextureRegion laser; public @Load("laser-end") TextureRegion laserEnd; @@ -40,6 +41,7 @@ public class PowerNode extends PowerBlock{ consumesPower = false; outputsPower = false; canOverdrive = false; + swapDiagonalPlacement = true; config(Integer.class, (entity, value) -> { PowerModule power = entity.power; @@ -149,6 +151,42 @@ public class PowerNode extends PowerBlock{ Draw.reset(); } + @Override + public void changePlacementPath(Seq points, int rotation){ + var base = tmpPoints2; + var result = tmpPoints.clear(); + + base.selectFrom(points, p -> p == points.first() || p == points.peek() || Build.validPlace(this, player.team(), p.x, p.y, rotation, false)); + boolean addedLast = false; + + outer: + for(int i = 0; i < base.size;){ + var point = base.get(i); + result.add(point); + if(i == base.size - 1) addedLast = true; + + //find the furthest node that overlaps this one + for(int j = base.size - 1; j > i; j--){ + var other = base.get(j); + boolean over = overlaps(world.tile(point.x, point.y), world.tile(other.x, other.y)); + + if(over){ + //add node to list and start searching for node that overlaps the next one + i = j; + continue outer; + } + } + + //if it got here, that means nothing was found. try to proceed to the next node anyway + i ++; + } + + if(!addedLast) result.add(base.peek()); + + points.clear(); + points.addAll(result); + } + protected void setupColor(float satisfaction){ float fract = 1f - satisfaction; From d80678dfebe22dd69f5108691709507f7c0c2ead Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 18 Dec 2020 09:43:17 -0500 Subject: [PATCH 02/47] arc --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 3b10f28992..8197d35f16 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=2eb670fd55b9210b804ae729293b358d5368f9f3 +archash=ac5a2026930d5e7cee6596d61276ee7f29aa7801 From a8bae56b2cbd0926d0819068fe6aa5ebce7dc5c7 Mon Sep 17 00:00:00 2001 From: Ilya246 <57039557+Ilya246@users.noreply.github.com> Date: Fri, 18 Dec 2020 18:44:15 +0400 Subject: [PATCH 03/47] fix comment (#4026) --- core/src/mindustry/entities/comp/ShieldComp.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/entities/comp/ShieldComp.java b/core/src/mindustry/entities/comp/ShieldComp.java index d4a1ec7e4b..a1aa1b6aae 100644 --- a/core/src/mindustry/entities/comp/ShieldComp.java +++ b/core/src/mindustry/entities/comp/ShieldComp.java @@ -14,7 +14,7 @@ abstract class ShieldComp implements Healthc, Posc{ /** Absorbs health damage. */ float shield; - /** Absorbs percentage of damage. */ + /** Substracts an amount from damage. */ float armor; /** Shield opacity. */ transient float shieldAlpha = 0f; From bd252940960e0d814651d5474445c99f9f414fac Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 18 Dec 2020 12:41:13 -0500 Subject: [PATCH 04/47] Generic node/bridge placement system --- core/assets/baseparts/1603222912251.msch | Bin 302 -> 325 bytes core/src/mindustry/content/Blocks.java | 4 +- core/src/mindustry/input/Placement.java | 38 ++++++++++++++++++ .../defense/turrets/PointDefenseTurret.java | 2 +- .../world/blocks/distribution/ItemBridge.java | 6 +++ .../world/blocks/power/PowerNode.java | 34 +--------------- .../world/blocks/storage/CoreBlock.java | 7 ++++ 7 files changed, 56 insertions(+), 35 deletions(-) diff --git a/core/assets/baseparts/1603222912251.msch b/core/assets/baseparts/1603222912251.msch index 6b33abac342876064e00a1fd3a43a40abb40c0c4..f9c5e5f55dd648d3556ca1aaaa26ed333b096149 100644 GIT binary patch literal 325 zcmc~TPR?Mgn4>%KZCq$ppX@9b4J>%MQsN94}lJR2*qu5gCU26xll{~p!280#-A&z)lzbD%Nnw)Oj_ z-rxf-wQgSXPru$bP3n|^?!-slGK;<*F3Q|}a{q4W)LiHGqAmL-JLQ{Q+Wj{_+s%6O z1xudC9cdl!E}gq9WVP;$@YHWvd!-ro6geoL?zp9)Q0u(3df5TXDGM5|x#aSM*IT@M z>FK@P+WeWurDm=$-SjnRhu`pN8s%GA$ax|V*o lIQ6OVSJ&OPw8L?;EIuSZI&sg)ackncde9>Mp7Wdw^WK`ZRrY><)F}2eZF%=s!MA0+lVu-$N@K2CbvR`&ubLj? z^3YYy@#o44+N8QR#3&zKZsGp;`Rh~(@&8%*Q?_y{bEW^$=#BGPQvUn@n$oo7#lg;ygjhV=;6k% Mfm7_aW(Mm30H#!u(f|Me diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 2b71c75aed..32a322b5a5 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -989,9 +989,9 @@ public class Blocks implements ContentList{ }}; itemBridge = new BufferedItemBridge("bridge-conveyor"){{ - requirements(Category.distribution, with(Items.lead, 4, Items.copper, 4)); + requirements(Category.distribution, with(Items.lead, 6, Items.copper, 6)); range = 4; - speed = 70f; + speed = 74f; bufferCapacity = 14; }}; diff --git a/core/src/mindustry/input/Placement.java b/core/src/mindustry/input/Placement.java index 47fefecdcb..874269846f 100644 --- a/core/src/mindustry/input/Placement.java +++ b/core/src/mindustry/input/Placement.java @@ -1,6 +1,7 @@ package mindustry.input; import arc.*; +import arc.func.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; @@ -11,6 +12,7 @@ import mindustry.world.blocks.distribution.*; import static mindustry.Vars.*; public class Placement{ + private final static Seq tmpPoints = new Seq<>(), tmpPoints2 = new Seq<>(); private static final NormalizeResult result = new NormalizeResult(); private static final NormalizeDrawResult drawResult = new NormalizeDrawResult(); private static Bresenham2 bres = new Bresenham2(); @@ -68,6 +70,42 @@ public class Placement{ return points; } + /** Calculates optimal node placement for nodes with spacing. Used for bridges and power nodes. */ + public static void calculateNodes(Seq points, Block block, int rotation, Boolf2 overlapper){ + var base = tmpPoints2; + var result = tmpPoints.clear(); + + base.selectFrom(points, p -> p == points.first() || p == points.peek() || Build.validPlace(block, player.team(), p.x, p.y, rotation, false)); + boolean addedLast = false; + + outer: + for(int i = 0; i < base.size;){ + var point = base.get(i); + result.add(point); + if(i == base.size - 1) addedLast = true; + + //find the furthest node that overlaps this one + for(int j = base.size - 1; j > i; j--){ + var other = base.get(j); + boolean over = overlapper.get(point, other); + + if(over){ + //add node to list and start searching for node that overlaps the next one + i = j; + continue outer; + } + } + + //if it got here, that means nothing was found. try to proceed to the next node anyway + i ++; + } + + if(!addedLast) result.add(base.peek()); + + points.clear(); + points.addAll(result); + } + private static float tileHeuristic(Tile tile, Tile other){ Block block = control.input.block; diff --git a/core/src/mindustry/world/blocks/defense/turrets/PointDefenseTurret.java b/core/src/mindustry/world/blocks/defense/turrets/PointDefenseTurret.java index 2c9ef9c134..9c0259c8b2 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/PointDefenseTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/PointDefenseTurret.java @@ -62,7 +62,7 @@ public class PointDefenseTurret extends ReloadTurret{ //retarget if(timer(timerTarget, retargetTime)){ - target = Groups.bullet.intersect(x - range, y - range, range*2, range*2).min(b -> b.team == team || !b.type().hittable ? Float.MAX_VALUE : b.dst2(this)); + target = Groups.bullet.intersect(x - range, y - range, range*2, range*2).min(b -> b.team != team && b.type().hittable, b -> b.dst2(this)); } //pooled bullets diff --git a/core/src/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/mindustry/world/blocks/distribution/ItemBridge.java index cfcc488881..604cefce4a 100644 --- a/core/src/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/ItemBridge.java @@ -13,6 +13,7 @@ import mindustry.annotations.Annotations.*; import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.input.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.meta.*; @@ -152,6 +153,11 @@ public class ItemBridge extends Block{ lastPlan = plan; } + @Override + public void changePlacementPath(Seq points, int rotation){ + Placement.calculateNodes(points, this, rotation, (point, other) -> Math.max(Math.abs(point.x - other.x), Math.abs(point.y - other.y)) <= range); + } + public class ItemBridgeBuild extends Building{ public int link = -1; public IntSet incoming = new IntSet(); diff --git a/core/src/mindustry/world/blocks/power/PowerNode.java b/core/src/mindustry/world/blocks/power/PowerNode.java index ab265dbf09..2f100e7476 100644 --- a/core/src/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/mindustry/world/blocks/power/PowerNode.java @@ -14,6 +14,7 @@ import mindustry.entities.units.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.input.*; import mindustry.ui.*; import mindustry.world.*; import mindustry.world.meta.*; @@ -153,38 +154,7 @@ public class PowerNode extends PowerBlock{ @Override public void changePlacementPath(Seq points, int rotation){ - var base = tmpPoints2; - var result = tmpPoints.clear(); - - base.selectFrom(points, p -> p == points.first() || p == points.peek() || Build.validPlace(this, player.team(), p.x, p.y, rotation, false)); - boolean addedLast = false; - - outer: - for(int i = 0; i < base.size;){ - var point = base.get(i); - result.add(point); - if(i == base.size - 1) addedLast = true; - - //find the furthest node that overlaps this one - for(int j = base.size - 1; j > i; j--){ - var other = base.get(j); - boolean over = overlaps(world.tile(point.x, point.y), world.tile(other.x, other.y)); - - if(over){ - //add node to list and start searching for node that overlaps the next one - i = j; - continue outer; - } - } - - //if it got here, that means nothing was found. try to proceed to the next node anyway - i ++; - } - - if(!addedLast) result.add(base.peek()); - - points.clear(); - points.addAll(result); + Placement.calculateNodes(points, this, rotation, (point, other) -> overlaps(world.tile(point.x, point.y), world.tile(other.x, other.y))); } protected void setupColor(float satisfaction){ diff --git a/core/src/mindustry/world/blocks/storage/CoreBlock.java b/core/src/mindustry/world/blocks/storage/CoreBlock.java index 6d77239f50..18299cd02a 100644 --- a/core/src/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/mindustry/world/blocks/storage/CoreBlock.java @@ -386,6 +386,13 @@ public class CoreBlock extends StorageBlock{ }else{ super.handleItem(source, item); } + }else if(incinerate()){ + if(items.get(item) >= storageCapacity){ + //create item incineration effect at random intervals + if(!noEffect){ + incinerateEffect(this, source); + } + } } } } From abcd27184dfa50ea9db73d0b0a08f15373443e51 Mon Sep 17 00:00:00 2001 From: Patrick 'Quezler' Mounier Date: Fri, 18 Dec 2020 19:08:03 +0100 Subject: [PATCH 05/47] Update Drill.java (#4030) --- core/src/mindustry/world/blocks/production/Drill.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/world/blocks/production/Drill.java b/core/src/mindustry/world/blocks/production/Drill.java index a124d9ceed..a0375ea203 100644 --- a/core/src/mindustry/world/blocks/production/Drill.java +++ b/core/src/mindustry/world/blocks/production/Drill.java @@ -77,7 +77,7 @@ public class Drill extends Block{ if(tile == null) return; countOre(req.tile()); - if(returnItem == null) return; + if(returnItem == null || !drawMineItem) return; Draw.color(returnItem.color); Draw.rect("drill-top", req.drawx(), req.drawy()); From b0bf80d8b7e1838519460edd4f9f9e1de837f5fa Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 18 Dec 2020 13:21:51 -0500 Subject: [PATCH 06/47] Cleanup --- core/src/mindustry/world/blocks/power/PowerNode.java | 10 ++++------ gradle.properties | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/core/src/mindustry/world/blocks/power/PowerNode.java b/core/src/mindustry/world/blocks/power/PowerNode.java index 2f100e7476..64f0bd38dc 100644 --- a/core/src/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/mindustry/world/blocks/power/PowerNode.java @@ -158,16 +158,14 @@ public class PowerNode extends PowerBlock{ } protected void setupColor(float satisfaction){ - float fract = 1f - satisfaction; - - Draw.color(laserColor1, laserColor2, fract * 0.86f + Mathf.absin(3f, 0.1f)); + Draw.color(laserColor1, laserColor2, (1f - satisfaction) * 0.86f + Mathf.absin(3f, 0.1f)); Draw.alpha(renderer == null ? 0.5f : renderer.laserOpacity); } protected void drawLaser(Team team, float x1, float y1, float x2, float y2, int size1, int size2){ - float angle1 = Angles.angle(x1, y1, x2, y2); - float vx = Mathf.cosDeg(angle1), vy = Mathf.sinDeg(angle1); - float len1 = size1 * tilesize / 2f - 1.5f, len2 = size2 * tilesize / 2f - 1.5f; + float angle1 = Angles.angle(x1, y1, x2, y2), + vx = Mathf.cosDeg(angle1), vy = Mathf.sinDeg(angle1), + len1 = size1 * tilesize / 2f - 1.5f, len2 = size2 * tilesize / 2f - 1.5f; Drawf.laser(team, laser, laserEnd, x1 + vx*len1, y1 + vy*len1, x2 - vx*len2, y2 - vy*len2, 0.25f); } diff --git a/gradle.properties b/gradle.properties index 8197d35f16..e304188492 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=ac5a2026930d5e7cee6596d61276ee7f29aa7801 +archash=9b130afd1b8b6899c8c39843622842930c8ddcbf From b33b3a79195526de59d9a88c75e4a0a2f21d8eeb Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 18 Dec 2020 13:36:18 -0500 Subject: [PATCH 07/47] Always-on weather rule support --- core/assets/bundles/bundle.properties | 1 + core/src/mindustry/core/Logic.java | 5 ++--- core/src/mindustry/type/Weather.java | 11 +++++++++-- core/src/mindustry/ui/dialogs/CustomRulesDialog.java | 12 ++++++++---- gradle.properties | 2 +- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index cb194c37cc..247fc13932 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -957,6 +957,7 @@ rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light rules.weather = Weather rules.weather.frequency = Frequency: +rules.weather.always = Always rules.weather.duration = Duration: content.item.name = Items diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index bb91fc824e..5b7349e78e 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -258,13 +258,12 @@ public class Logic implements ApplicationListener{ state.rules.weather.removeAll(w -> w.weather == null); for(WeatherEntry entry : state.rules.weather){ - if(entry.weather == null) continue; //update cooldown entry.cooldown -= Time.delta; //create new event when not active - if(entry.cooldown < 0 && !entry.weather.isActive()){ - float duration = Mathf.random(entry.minDuration, entry.maxDuration); + if((entry.cooldown < 0 || entry.always) && !entry.weather.isActive()){ + float duration = entry.always ? Float.POSITIVE_INFINITY : Mathf.random(entry.minDuration, entry.maxDuration); entry.cooldown = duration + Mathf.random(entry.minFrequency, entry.maxFrequency); Tmp.v1.setToRandomDirection(); Call.createWeather(entry.weather, entry.intensity, duration, Tmp.v1.x, Tmp.v1.y); diff --git a/core/src/mindustry/type/Weather.java b/core/src/mindustry/type/Weather.java index 48a05219f5..c6ae657bc9 100644 --- a/core/src/mindustry/type/Weather.java +++ b/core/src/mindustry/type/Weather.java @@ -61,12 +61,17 @@ public class Weather extends UnlockableContent{ return entity; } + @Nullable + public WeatherState instance(){ + return Groups.weather.find(w -> w.weather() == this); + } + public boolean isActive(){ - return Groups.weather.find(w -> w.weather() == this) != null; + return instance() != null; } public void remove(){ - Entityc e = Groups.weather.find(w -> w.weather() == this); + var e = instance(); if(e != null) e.remove(); } @@ -259,6 +264,8 @@ public class Weather extends UnlockableContent{ public float cooldown; /** Intensity of the weather produced. */ public float intensity = 1f; + /** If true, this weather is always active. */ + public boolean always = false; /** Creates a weather entry with some approximate weather values. */ public WeatherEntry(Weather weather){ diff --git a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java index 4d6a4483f9..234068bfd5 100644 --- a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -284,19 +284,23 @@ public class CustomRulesDialog extends BaseDialog{ f.defaults().padRight(4).left(); f.add("@rules.weather.duration"); - field(f, entry.minDuration / toMinutes, v -> entry.minDuration = v * toMinutes); + field(f, entry.minDuration / toMinutes, v -> entry.minDuration = v * toMinutes).disabled(v -> entry.always); f.add("@waves.to"); - field(f, entry.maxDuration / toMinutes, v -> entry.maxDuration = v * toMinutes); + field(f, entry.maxDuration / toMinutes, v -> entry.maxDuration = v * toMinutes).disabled(v -> entry.always); f.add("@unit.minutes"); f.row(); f.add("@rules.weather.frequency"); - field(f, entry.minFrequency / toMinutes, v -> entry.minFrequency = v * toMinutes); + field(f, entry.minFrequency / toMinutes, v -> entry.minFrequency = v * toMinutes).disabled(v -> entry.always); f.add("@waves.to"); - field(f, entry.maxFrequency / toMinutes, v -> entry.maxFrequency = v * toMinutes); + field(f, entry.maxFrequency / toMinutes, v -> entry.maxFrequency = v * toMinutes).disabled(v -> entry.always); f.add("@unit.minutes"); + f.row(); + + f.check("@rules.weather.always", val -> entry.always = val).checked(cc -> entry.always).padBottom(4); + //intensity can't currently be customized }).grow().left().pad(6).top(); diff --git a/gradle.properties b/gradle.properties index e304188492..5271fb2c42 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=9b130afd1b8b6899c8c39843622842930c8ddcbf +archash=b647f8dd4e96daf1ed869f1fd1fb38bb3f37135c From 8d435906577366511d8518ccbda5830bc2519df8 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 18 Dec 2020 14:56:14 -0500 Subject: [PATCH 08/47] Multiblock damage calculation bugfix --- core/src/mindustry/entities/Damage.java | 7 +++---- core/src/mindustry/ui/dialogs/CustomRulesDialog.java | 10 +++++----- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/core/src/mindustry/entities/Damage.java b/core/src/mindustry/entities/Damage.java index 8e0eba7b58..6151e76fea 100644 --- a/core/src/mindustry/entities/Damage.java +++ b/core/src/mindustry/entities/Damage.java @@ -389,11 +389,10 @@ public class Damage{ if(scaledDamage <= 0 || tile == null) continue; //apply damage to entity if needed - if(tile.build != null && tile.team() != team){ - int health = (int)tile.build.health(); - if(tile.build.health() > 0){ + if(tile.build != null && tile.build.team != team){ + if(tile.build.health > 0){ tile.build.damage(scaledDamage); - scaledDamage -= health; + scaledDamage -= (int)(tile.build.health / (tile.block().size * tile.block().size)); if(scaledDamage <= 0) continue; } diff --git a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java index 234068bfd5..cfcdd85452 100644 --- a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -318,8 +318,8 @@ public class CustomRulesDialog extends BaseDialog{ dialog.addCloseButton(); dialog.buttons.button("@add", Icon.add, () -> { - BaseDialog addd = new BaseDialog("@add"); - addd.cont.pane(t -> { + BaseDialog add = new BaseDialog("@add"); + add.cont.pane(t -> { t.background(Tex.button); int i = 0; for(Weather weather : content.getBy(ContentType.weather)){ @@ -328,13 +328,13 @@ public class CustomRulesDialog extends BaseDialog{ rules.weather.add(new WeatherEntry(weather)); rebuild[0].run(); - addd.hide(); + add.hide(); }).size(140f, 50f); if(++i % 2 == 0) t.row(); } }); - addd.addCloseButton(); - addd.show(); + add.addCloseButton(); + add.show(); }).width(170f); //reset cooldown to random number From 9d9cbdffd58f21a2d23a7a33e52508ce71388cd2 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 18 Dec 2020 16:33:43 -0500 Subject: [PATCH 09/47] Pulsar nerf --- core/src/mindustry/content/UnitTypes.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 3707aaf7f7..01aa68fc1a 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -336,7 +336,7 @@ public class UnitTypes implements ContentList{ bullet = new LightningBulletType(){{ lightningColor = hitColor = Pal.heal; - damage = 15f; + damage = 12f; lightningLength = 7; lightningLengthRand = 7; shootEffect = Fx.shootHeal; From 0dd3c2cb5a49931fb97e147370c71157a2b7147b Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 18 Dec 2020 17:22:01 -0500 Subject: [PATCH 10/47] Fixed #4033 --- core/src/mindustry/entities/Damage.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/entities/Damage.java b/core/src/mindustry/entities/Damage.java index 6151e76fea..d630c9fa37 100644 --- a/core/src/mindustry/entities/Damage.java +++ b/core/src/mindustry/entities/Damage.java @@ -390,9 +390,10 @@ public class Damage{ //apply damage to entity if needed if(tile.build != null && tile.build.team != team){ + int health = (int)(tile.build.health / (tile.block().size * tile.block().size)); if(tile.build.health > 0){ tile.build.damage(scaledDamage); - scaledDamage -= (int)(tile.build.health / (tile.block().size * tile.block().size)); + scaledDamage -= health; if(scaledDamage <= 0) continue; } From b328d098a12a27e2456940245557c2020d6e5544 Mon Sep 17 00:00:00 2001 From: Volas171 <60143910+Volas171@users.noreply.github.com> Date: Fri, 18 Dec 2020 19:16:59 -0500 Subject: [PATCH 11/47] add minty server but this time the json is all right (#4034) --- servers_v6.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/servers_v6.json b/servers_v6.json index 7aac5e5e16..fea3cf319b 100644 --- a/servers_v6.json +++ b/servers_v6.json @@ -54,5 +54,9 @@ { "name": "ALEX", "address": ["alexmindustry.ddns.net:6568", "alexmindustry.ddns.net:6569"] + }, + { + "name": "Minty [subzero]", + "address": ["minty-server.ddns.net"] } ] From 7f863abb0647baa7ba4c676903acad7b9fd5870a Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 18 Dec 2020 20:39:16 -0500 Subject: [PATCH 12/47] Hide map when opening planet map --- core/src/mindustry/ui/dialogs/PlanetDialog.java | 1 + core/src/mindustry/ui/fragments/MinimapFragment.java | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index 7251a48421..e3a13c2c0e 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -399,6 +399,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ void setup(){ zoom = planets.zoom = 1f; selectAlpha = 1f; + ui.minimapfrag.hide(); clearChildren(); diff --git a/core/src/mindustry/ui/fragments/MinimapFragment.java b/core/src/mindustry/ui/fragments/MinimapFragment.java index aee9f09793..07536f2e3c 100644 --- a/core/src/mindustry/ui/fragments/MinimapFragment.java +++ b/core/src/mindustry/ui/fragments/MinimapFragment.java @@ -110,6 +110,10 @@ public class MinimapFragment extends Fragment{ return shown; } + public void hide(){ + shown = false; + } + public void toggle(){ float size = baseSize * zoom * world.width(); float ratio = (float)renderer.minimap.getTexture().height / renderer.minimap.getTexture().width; From 9e05f7604de5c5cc62b24ff5a535813446a5ec98 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 19 Dec 2020 12:28:56 -0500 Subject: [PATCH 13/47] Fixed #4043 --- .../mindustry/world/blocks/power/ItemLiquidGenerator.java | 5 ----- core/src/mindustry/world/blocks/power/PowerGenerator.java | 6 ++++++ gradle.properties | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java b/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java index 16cd34fb7b..b9e7f112bc 100644 --- a/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java +++ b/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java @@ -92,11 +92,6 @@ public class ItemLiquidGenerator extends PowerGenerator{ return generateTime > 0; } - @Override - public float ambientVolume(){ - return Mathf.clamp(productionEfficiency); - } - @Override public void updateTile(){ //Note: Do not use this delta when calculating the amount of power or the power efficiency, but use it for resource consumption if necessary. diff --git a/core/src/mindustry/world/blocks/power/PowerGenerator.java b/core/src/mindustry/world/blocks/power/PowerGenerator.java index ae9453d675..5a2bd12f0d 100644 --- a/core/src/mindustry/world/blocks/power/PowerGenerator.java +++ b/core/src/mindustry/world/blocks/power/PowerGenerator.java @@ -1,6 +1,7 @@ package mindustry.world.blocks.power; import arc.*; +import arc.math.*; import arc.struct.*; import arc.util.*; import arc.util.io.*; @@ -50,6 +51,11 @@ public class PowerGenerator extends PowerDistributor{ /** The efficiency of the producer. An efficiency of 1.0 means 100% */ public float productionEfficiency = 0.0f; + @Override + public float ambientVolume(){ + return Mathf.clamp(productionEfficiency); + } + @Override public float getPowerProduction(){ return powerProduction * productionEfficiency; diff --git a/gradle.properties b/gradle.properties index 5271fb2c42..6612596de1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=b647f8dd4e96daf1ed869f1fd1fb38bb3f37135c +archash=b91cf2f8d2073bb03f6c07e8f8282c4039b10138 From 09a84550f4658a155892c5e8ffde59d57ffa84f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=82=A4=EC=97=90=EB=A5=B4?= <44261958+Kieaer@users.noreply.github.com> Date: Sun, 20 Dec 2020 02:31:26 +0900 Subject: [PATCH 14/47] Ask double pop-ups to create a public server (#4042) * Double check public host dialog * Update bundle.properties * Update core/src/mindustry/ui/dialogs/HostDialog.java Co-authored-by: Patrick 'Quezler' Mounier Co-authored-by: Patrick 'Quezler' Mounier --- core/assets/bundles/bundle.properties | 3 ++- core/src/mindustry/ui/dialogs/HostDialog.java | 9 +++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 247fc13932..06ee6cb11d 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -834,7 +834,8 @@ setting.lasersopacity.name = Power Laser Opacity setting.bridgeopacity.name = Bridge Opacity setting.playerchat.name = Display Player Bubble Chat setting.showweather.name = Show Weather Graphics -public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to jo in your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.confirm.really = If you want to play with friends, use [green]Invite Friend[] instead of a [scarlet]Public server[]!\nDo you [accent]really want to make your game [scarlet]public[]? public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... uiscale.cancel = Cancel & Exit diff --git a/core/src/mindustry/ui/dialogs/HostDialog.java b/core/src/mindustry/ui/dialogs/HostDialog.java index 1282d47b7d..ad3b410867 100644 --- a/core/src/mindustry/ui/dialogs/HostDialog.java +++ b/core/src/mindustry/ui/dialogs/HostDialog.java @@ -69,8 +69,13 @@ public class HostDialog extends BaseDialog{ if(steam){ Core.app.post(() -> Core.settings.getBoolOnce("steampublic2", () -> { ui.showCustomConfirm("@setting.publichost.name", "@public.confirm", "@yes", "@no", () -> { - Core.settings.put("publichost", true); - platform.updateLobby(); + ui.showCustomConfirm("@setting.publichost.name", "@public.confirm.really", "@no", "@yes", () -> { + Core.settings.put("publichost", true); + platform.updateLobby(); + }, () -> { + Core.settings.put("publichost", false); + platform.updateLobby(); + }); }, () -> { Core.settings.put("publichost", false); platform.updateLobby(); From a4f4b9367f85cfe003ff6d861be9d9570c54bf1e Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 19 Dec 2020 12:32:03 -0500 Subject: [PATCH 15/47] Tweaks of merged PR --- core/assets/bundles/bundle.properties | 2 +- core/src/mindustry/ui/dialogs/HostDialog.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 06ee6cb11d..5dd0b0747e 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -835,7 +835,7 @@ setting.bridgeopacity.name = Bridge Opacity setting.playerchat.name = Display Player Bubble Chat setting.showweather.name = Show Weather Graphics public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to jo in your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. -public.confirm.really = If you want to play with friends, use [green]Invite Friend[] instead of a [scarlet]Public server[]!\nDo you [accent]really want to make your game [scarlet]public[]? +public.confirm.really = If you want to play with friends, use [green]Invite Friend[] instead of a [scarlet]Public server[]!\nAre you sure you want to make your game [scarlet]public[]? public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... uiscale.cancel = Cancel & Exit diff --git a/core/src/mindustry/ui/dialogs/HostDialog.java b/core/src/mindustry/ui/dialogs/HostDialog.java index ad3b410867..682f0a010f 100644 --- a/core/src/mindustry/ui/dialogs/HostDialog.java +++ b/core/src/mindustry/ui/dialogs/HostDialog.java @@ -67,7 +67,7 @@ public class HostDialog extends BaseDialog{ player.admin(true); if(steam){ - Core.app.post(() -> Core.settings.getBoolOnce("steampublic2", () -> { + Core.app.post(() -> Core.settings.getBoolOnce("steampublic3", () -> { ui.showCustomConfirm("@setting.publichost.name", "@public.confirm", "@yes", "@no", () -> { ui.showCustomConfirm("@setting.publichost.name", "@public.confirm.really", "@no", "@yes", () -> { Core.settings.put("publichost", true); From f9fe396d1fdc63424135968d7c066c4b7a3f8501 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 19 Dec 2020 13:02:20 -0500 Subject: [PATCH 16/47] Fixed #4044 --- core/src/mindustry/entities/comp/WeaponsComp.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/entities/comp/WeaponsComp.java b/core/src/mindustry/entities/comp/WeaponsComp.java index 21265731fc..9cc5f8487a 100644 --- a/core/src/mindustry/entities/comp/WeaponsComp.java +++ b/core/src/mindustry/entities/comp/WeaponsComp.java @@ -139,7 +139,7 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{ //flip weapon shoot side for alternating weapons at half reload if(weapon.otherSide != -1 && weapon.alternate && mount.side == weapon.flipSprite && - mount.reload + Time.delta > weapon.reload/2f && mount.reload <= weapon.reload/2f){ + mount.reload + Time.delta * reloadMultiplier > weapon.reload/2f && mount.reload <= weapon.reload/2f){ mounts[weapon.otherSide].side = !mounts[weapon.otherSide].side; mount.side = !mount.side; } From 0d2b660ed1a83015a6eb8cf8926770a775a2435f Mon Sep 17 00:00:00 2001 From: YellOw139 <70975516+YellOw139@users.noreply.github.com> Date: Sat, 19 Dec 2020 21:01:50 +0200 Subject: [PATCH 17/47] Ty po (#4046) --- 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 5dd0b0747e..8dae9d2843 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -834,7 +834,7 @@ setting.lasersopacity.name = Power Laser Opacity setting.bridgeopacity.name = Bridge Opacity setting.playerchat.name = Display Player Bubble Chat setting.showweather.name = Show Weather Graphics -public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to jo in your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. public.confirm.really = If you want to play with friends, use [green]Invite Friend[] instead of a [scarlet]Public server[]!\nAre you sure you want to make your game [scarlet]public[]? public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds... From 4f683cac8bca7d1cebe3354f1c5f5d71431e0198 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 20 Dec 2020 09:47:45 -0500 Subject: [PATCH 18/47] Fixed #4054 --- core/src/mindustry/entities/Damage.java | 4 +++- core/src/mindustry/entities/bullet/RailBulletType.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/entities/Damage.java b/core/src/mindustry/entities/Damage.java index d630c9fa37..9ddca6e986 100644 --- a/core/src/mindustry/entities/Damage.java +++ b/core/src/mindustry/entities/Damage.java @@ -126,6 +126,8 @@ public class Damage{ boolean collide = tile != null && collidedBlocks.add(tile.pos()); if(hitter.damage > 0){ + float health = !collide ? 0 : tile.health; + if(collide && tile.team != team && tile.collide(hitter)){ tile.collision(hitter); hitter.type.hit(hitter, tile.x, tile.y); @@ -133,7 +135,7 @@ public class Damage{ //try to heal the tile if(collide && hitter.type.testCollision(hitter, tile)){ - hitter.type.hitTile(hitter, tile, tile.health, false); + hitter.type.hitTile(hitter, tile, health, false); } } }; diff --git a/core/src/mindustry/entities/bullet/RailBulletType.java b/core/src/mindustry/entities/bullet/RailBulletType.java index dfc6f8d0ae..1e62d7bc01 100644 --- a/core/src/mindustry/entities/bullet/RailBulletType.java +++ b/core/src/mindustry/entities/bullet/RailBulletType.java @@ -37,7 +37,7 @@ public class RailBulletType extends BulletType{ } void handle(Bullet b, Posc pos, float initialHealth){ - float sub = initialHealth*pierceDamageFactor; + float sub = Math.max(initialHealth*pierceDamageFactor, 0); if(b.damage <= 0){ b.fdata = Math.min(b.fdata, b.dst(pos)); From c39f4c1b7df0f72790d830c1d2e91173b6d53555 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 20 Dec 2020 09:50:29 -0500 Subject: [PATCH 19/47] Fixed #4051 --- core/src/mindustry/entities/bullet/RailBulletType.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/mindustry/entities/bullet/RailBulletType.java b/core/src/mindustry/entities/bullet/RailBulletType.java index 1e62d7bc01..96adaa6baa 100644 --- a/core/src/mindustry/entities/bullet/RailBulletType.java +++ b/core/src/mindustry/entities/bullet/RailBulletType.java @@ -29,6 +29,7 @@ public class RailBulletType extends BulletType{ despawnEffect = Fx.none; collides = false; lifetime = 1f; + speed = 0.01f; } @Override From 22221a0f287b25fd3124872d0117c1c6c026ae4a Mon Sep 17 00:00:00 2001 From: Patrick 'Quezler' Mounier Date: Sun, 20 Dec 2020 15:58:18 +0100 Subject: [PATCH 20/47] Add in region to payload block icons (#4052) --- .../sprites/blocks/units/factory-in-3.png | Bin 675 -> 1407 bytes .../sprites/blocks/units/factory-in-5.png | Bin 1083 -> 2172 bytes .../sprites/blocks/units/factory-in-7.png | Bin 1593 -> 3210 bytes .../sprites/blocks/units/factory-in-9.png | Bin 2346 -> 4393 bytes .../world/blocks/experimental/BlockForge.java | 5 +++++ .../blocks/experimental/BlockLoader.java | 7 ++++++- .../world/blocks/units/Reconstructor.java | 4 ++-- 7 files changed, 13 insertions(+), 3 deletions(-) diff --git a/core/assets-raw/sprites/blocks/units/factory-in-3.png b/core/assets-raw/sprites/blocks/units/factory-in-3.png index 625be61764e862ec9568d0b0fffd40d37e88553d..79448147399c1f3956fc8ebe0faec2d6b67058e3 100644 GIT binary patch literal 1407 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 literal 1083 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 hFe)G#muvz*)j{pDdKR^y}L8iSYiXC#3n(B zP5eiMZYUpqxA%hZs;6Z?Crf^O6fF6?hwJ32be;QME4ECPWMqH>_YY}bgd3*T{Qvm* z&;0$Y9CKrii6^qQ=&d^{uIP~QF04k7sb$$aFsJ@mAc&{7?TEOdgU5E$eH@HVt872I zatH*)w1{t1+}F{u|I>Ufo&4Y$!7zsv+sbcO`ZWYBR0FBoc#BjUdyLhB$8!l@J$PBbeuZtk73JzJ+1o z&glA&t~Z*B9MW%Jc)0q(UXVGCX9XTE{-MO;ksiOV?zP$LlB%xDFE#J&{eQvskS@qQ zediv%mOFCXfBx>Xx1{1*CL8D^`HR>-=a`VXrEkNNA51BlYn60t*D*x;m9>~27gq2- z)wSW91yf4o){iMJIu6sqqyn#TX*o>WZocfy{(41Lj*Ygf-UwSTwb;uYz4}O*hw;$N z=!si@{RwC&cxbe3+WiHUx8I!j(Dn7#yA`4WY(fe=Dh?7J4F(e!5*4N|S+KMF^#Pv! zK{tI^Jc1wXJ})*U?nrs7=mfPjHMcn?lsvla*RVwBz8#ZF?~iZ73Ytg4-5NrK<1OW# zCwSIaM>1;Gr#)S*?$Fht->$2%^+@NhfID(+KZYH4KQVCEEH zD@u&p_4~)m&xenv#7ca>xF)VR@9ZX~OIN3vznXXas@&r1bE5l&74D|&xtTsY)Y`qF zL~-A17LVdbyL}r>RQLU6@i2Z=?bBeQxG$H*V^@#)t83?vN!d%;_Aw($g zt`1|6Z_CroEFN5f)9TL(DP+3rs0X>=5Xc2qf_d{*9cIn=>wRJK89{}!9UlxCFHPZi zFRXC3^Me`VrB;sh!U}ggKBzKYx_Zq#$IT(S?_&13wa53aoOiBhU(Mfd)nAG&xU>{S?hw>jAkR3-ujMx91T~i(y$qSB+(o|slxT|kvuXdKZl~gH zi??%5$jfn$-^AJqjVeegdGYpzI)ky*{+Vf~Pv41Ve0b>T+??(AT(`F{JUp}ZMwF|D z!;kvMfhoF5A__;o?bxI&qHy}QbZA-&Q%dGi!&FxdhiReGfo?5KDV~wq5pN4wP84nO zUvfppzd>i|)#sHh z&vNXVegXFc=U@LGKmXi+c%A)bRVT(G3*#f--vqWW)jtVH>w154FUQ=L#$)g1&Ja{^ zH@*7qU06%7t>=k?ZM?lRGPI>W7FlaK@V(sXqT#^z+7v|Qe&b+0@$jt7LWamgYXrF_ zq@Iyj$PjrdN04j6(=#Fq86q#~fJDy=9GsC)nb diff --git a/core/assets-raw/sprites/blocks/units/factory-in-9.png b/core/assets-raw/sprites/blocks/units/factory-in-9.png index 6a3b324f1b117fa7d8de18bbfa8bfc45ade6430a..acf736c8dd9f0fc40be2e19f2b24e97e0bddc172 100644 GIT binary patch literal 4393 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 literal 2346 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 e.recipe != null ? e.recipe.requirements : ItemStack.empty)); } + @Override + public TextureRegion[] icons(){ + return new TextureRegion[]{region, outRegion}; + } + @Override public void setBars(){ super.setBars(); diff --git a/core/src/mindustry/world/blocks/experimental/BlockLoader.java b/core/src/mindustry/world/blocks/experimental/BlockLoader.java index 3e015ec9a6..afaefeffcc 100644 --- a/core/src/mindustry/world/blocks/experimental/BlockLoader.java +++ b/core/src/mindustry/world/blocks/experimental/BlockLoader.java @@ -31,6 +31,11 @@ public class BlockLoader extends PayloadAcceptor{ rotate = true; } + @Override + public TextureRegion[] icons(){ + return new TextureRegion[]{region, inRegion, outRegion, topRegion}; + } + @Override public boolean outputsItems(){ return false; @@ -72,7 +77,7 @@ public class BlockLoader extends PayloadAcceptor{ //draw input for(int i = 0; i < 4; i++){ if(blends(i) && i != rotation){ - Draw.rect(inRegion, x, y, i * 90); + Draw.rect(inRegion, x, y, (i * 90) - 180); } } diff --git a/core/src/mindustry/world/blocks/units/Reconstructor.java b/core/src/mindustry/world/blocks/units/Reconstructor.java index 2aba7a8c7a..634ea5b911 100644 --- a/core/src/mindustry/world/blocks/units/Reconstructor.java +++ b/core/src/mindustry/world/blocks/units/Reconstructor.java @@ -39,7 +39,7 @@ public class Reconstructor extends UnitBlock{ @Override public TextureRegion[] icons(){ - return new TextureRegion[]{region, outRegion, topRegion}; + return new TextureRegion[]{region, inRegion, outRegion, topRegion}; } @Override @@ -129,7 +129,7 @@ public class Reconstructor extends UnitBlock{ //draw input for(int i = 0; i < 4; i++){ if(blends(i) && i != rotation){ - Draw.rect(inRegion, x, y, i * 90); + Draw.rect(inRegion, x, y, (i * 90) - 180); } } From 40a6a9e1c765b662c000bc4d37babff477f5b50d Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 20 Dec 2020 12:04:36 -0500 Subject: [PATCH 21/47] Comment cleanup --- core/src/mindustry/entities/bullet/RailBulletType.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/core/src/mindustry/entities/bullet/RailBulletType.java b/core/src/mindustry/entities/bullet/RailBulletType.java index 96adaa6baa..4ddc6e36c7 100644 --- a/core/src/mindustry/entities/bullet/RailBulletType.java +++ b/core/src/mindustry/entities/bullet/RailBulletType.java @@ -6,12 +6,6 @@ import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; -//TODO this class is bad for multiple reasons, remove/replace it. -//- effects unreliable -//- not really hitscan but works like it -//- buggy trails -//- looks bad -//- generally unreliable public class RailBulletType extends BulletType{ public Effect pierceEffect = Fx.hitBulletSmall, updateEffect = Fx.none; /** Multiplier of damage decreased per health pierced. */ From 118ae8e87deb0be4a90a660e273755958c7fe888 Mon Sep 17 00:00:00 2001 From: Patrick 'Quezler' Mounier Date: Sun, 20 Dec 2020 20:22:01 +0100 Subject: [PATCH 22/47] #3889 2: electric boogaloo (#4056) --- .../drills/{drill-top.png => drill-item-2.png} | Bin .../sprites/blocks/drills/drill-item-3.png | Bin 0 -> 1562 bytes .../sprites/blocks/drills/drill-item-4.png | Bin 0 -> 1542 bytes core/src/mindustry/content/Blocks.java | 8 ++++++-- .../mindustry/world/blocks/production/Drill.java | 5 +++-- 5 files changed, 9 insertions(+), 4 deletions(-) rename core/assets-raw/sprites/blocks/drills/{drill-top.png => drill-item-2.png} (100%) create mode 100644 core/assets-raw/sprites/blocks/drills/drill-item-3.png create mode 100644 core/assets-raw/sprites/blocks/drills/drill-item-4.png diff --git a/core/assets-raw/sprites/blocks/drills/drill-top.png b/core/assets-raw/sprites/blocks/drills/drill-item-2.png similarity index 100% rename from core/assets-raw/sprites/blocks/drills/drill-top.png rename to core/assets-raw/sprites/blocks/drills/drill-item-2.png diff --git a/core/assets-raw/sprites/blocks/drills/drill-item-3.png b/core/assets-raw/sprites/blocks/drills/drill-item-3.png new file mode 100644 index 0000000000000000000000000000000000000000..ed716408b2265e22320e14a06da4ee78726e2f96 GIT binary patch literal 1562 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 literal 0 HcmV?d00001 diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 32a322b5a5..33e11eed93 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1262,24 +1262,27 @@ public class Blocks implements ContentList{ mechanicalDrill = new Drill("mechanical-drill"){{ requirements(Category.production, with(Items.copper, 12), true); + drawMineItem = true; tier = 2; drillTime = 600; size = 2; - drawMineItem = true; + consumes.liquid(Liquids.water, 0.05f).boost(); }}; pneumaticDrill = new Drill("pneumatic-drill"){{ requirements(Category.production, with(Items.copper, 18, Items.graphite, 10)); + drawMineItem = true; tier = 3; drillTime = 400; size = 2; - drawMineItem = true; + consumes.liquid(Liquids.water, 0.06f).boost(); }}; laserDrill = new Drill("laser-drill"){{ requirements(Category.production, with(Items.copper, 35, Items.graphite, 30, Items.silicon, 30, Items.titanium, 20)); + drawMineItem = true; drillTime = 280; size = 3; hasPower = true; @@ -1293,6 +1296,7 @@ public class Blocks implements ContentList{ blastDrill = new Drill("blast-drill"){{ requirements(Category.production, with(Items.copper, 65, Items.silicon, 60, Items.titanium, 50, Items.thorium, 75)); + drawMineItem = true; drillTime = 280; size = 4; drawRim = true; diff --git a/core/src/mindustry/world/blocks/production/Drill.java b/core/src/mindustry/world/blocks/production/Drill.java index a0375ea203..e179d18e0e 100644 --- a/core/src/mindustry/world/blocks/production/Drill.java +++ b/core/src/mindustry/world/blocks/production/Drill.java @@ -57,6 +57,7 @@ public class Drill extends Block{ public @Load("@-rim") TextureRegion rimRegion; public @Load("@-rotator") TextureRegion rotatorRegion; public @Load("@-top") TextureRegion topRegion; + public @Load(value = "@-item", fallback = "drill-item-@size") TextureRegion itemRegion; public Drill(String name){ super(name); @@ -80,7 +81,7 @@ public class Drill extends Block{ if(returnItem == null || !drawMineItem) return; Draw.color(returnItem.color); - Draw.rect("drill-top", req.drawx(), req.drawy()); + Draw.rect(itemRegion, req.drawx(), req.drawy()); Draw.color(); } @@ -304,7 +305,7 @@ public class Drill extends Block{ if(dominantItem != null && drawMineItem){ Draw.color(dominantItem.color); - Draw.rect("drill-top", x, y); + Draw.rect(itemRegion, x, y); Draw.color(); } } From bbdcef62e4d430e12f6fa4d442de75fdec1fbc56 Mon Sep 17 00:00:00 2001 From: Patrick 'Quezler' Mounier Date: Sun, 20 Dec 2020 20:22:14 +0100 Subject: [PATCH 23/47] Draw item in the drill center when in place mode (#4055) * Draw item in the drill center when in place mode * Update core/src/mindustry/world/blocks/production/Drill.java Co-authored-by: Patrick 'Quezler' Mounier Co-authored-by: Anuken --- core/src/mindustry/world/blocks/production/Drill.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/src/mindustry/world/blocks/production/Drill.java b/core/src/mindustry/world/blocks/production/Drill.java index e179d18e0e..9361c22905 100644 --- a/core/src/mindustry/world/blocks/production/Drill.java +++ b/core/src/mindustry/world/blocks/production/Drill.java @@ -125,6 +125,12 @@ public class Drill extends Block{ Draw.rect(returnItem.icon(Cicon.small), dx, dy - 1); Draw.reset(); Draw.rect(returnItem.icon(Cicon.small), dx, dy); + + if(drawMineItem){ + Draw.color(returnItem.color); + Draw.rect(itemRegion, tile.worldx() + offset, tile.worldy() + offset); + Draw.color(); + } }else{ Tile to = tile.getLinkedTilesAs(this, tempTiles).find(t -> t.drop() != null && t.drop().hardness > tier); Item item = to == null ? null : to.drop(); From e3c68b485d8703b68ec9314d733263d5163808a3 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 20 Dec 2020 14:28:14 -0500 Subject: [PATCH 24/47] Placement rendering cleanup --- core/src/mindustry/input/DesktopInput.java | 1 + core/src/mindustry/world/blocks/production/Drill.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index 9370c64832..35d1eebcff 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -154,6 +154,7 @@ public class DesktopInput extends InputHandler{ } drawRequest(lineRequests.get(i)); } + lineRequests.each(this::drawOverRequest); }else if(isPlacing()){ if(block.rotate){ drawArrow(block, cursorX, cursorY, rotation); diff --git a/core/src/mindustry/world/blocks/production/Drill.java b/core/src/mindustry/world/blocks/production/Drill.java index 9361c22905..c1d622e43c 100644 --- a/core/src/mindustry/world/blocks/production/Drill.java +++ b/core/src/mindustry/world/blocks/production/Drill.java @@ -77,7 +77,7 @@ public class Drill extends Block{ Tile tile = req.tile(); if(tile == null) return; - countOre(req.tile()); + countOre(tile); if(returnItem == null || !drawMineItem) return; Draw.color(returnItem.color); From 9a577adf5f6db59deb145580056c5883af4adb9b Mon Sep 17 00:00:00 2001 From: Patrick 'Quezler' Mounier Date: Sun, 20 Dec 2020 21:22:34 +0100 Subject: [PATCH 25/47] Makes Drill.drawMineItem default to true (#4057) * Update Blocks.java * Update Drill.java --- core/src/mindustry/content/Blocks.java | 4 ---- core/src/mindustry/world/blocks/production/Drill.java | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 33e11eed93..c79b829448 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1262,7 +1262,6 @@ public class Blocks implements ContentList{ mechanicalDrill = new Drill("mechanical-drill"){{ requirements(Category.production, with(Items.copper, 12), true); - drawMineItem = true; tier = 2; drillTime = 600; size = 2; @@ -1272,7 +1271,6 @@ public class Blocks implements ContentList{ pneumaticDrill = new Drill("pneumatic-drill"){{ requirements(Category.production, with(Items.copper, 18, Items.graphite, 10)); - drawMineItem = true; tier = 3; drillTime = 400; size = 2; @@ -1282,7 +1280,6 @@ public class Blocks implements ContentList{ laserDrill = new Drill("laser-drill"){{ requirements(Category.production, with(Items.copper, 35, Items.graphite, 30, Items.silicon, 30, Items.titanium, 20)); - drawMineItem = true; drillTime = 280; size = 3; hasPower = true; @@ -1296,7 +1293,6 @@ public class Blocks implements ContentList{ blastDrill = new Drill("blast-drill"){{ requirements(Category.production, with(Items.copper, 65, Items.silicon, 60, Items.titanium, 50, Items.thorium, 75)); - drawMineItem = true; drillTime = 280; size = 4; drawRim = true; diff --git a/core/src/mindustry/world/blocks/production/Drill.java b/core/src/mindustry/world/blocks/production/Drill.java index c1d622e43c..6d4e0c8708 100644 --- a/core/src/mindustry/world/blocks/production/Drill.java +++ b/core/src/mindustry/world/blocks/production/Drill.java @@ -42,7 +42,7 @@ public class Drill extends Block{ protected int returnCount; /** Whether to draw the item this drill is mining. */ - public boolean drawMineItem = false; + public boolean drawMineItem = true; /** Effect played when an item is produced. This is colored. */ public Effect drillEffect = Fx.mine; /** Speed the drill bit rotates at. */ From e4e428f84a2a4af4b1e1eb74b1e7e3b1d1ccc699 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 21 Dec 2020 13:08:44 -0500 Subject: [PATCH 26/47] Fixed #4064 --- .../world/blocks/logic/LogicBlock.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/world/blocks/logic/LogicBlock.java b/core/src/mindustry/world/blocks/logic/LogicBlock.java index a3de197586..b9fc38bf8b 100644 --- a/core/src/mindustry/world/blocks/logic/LogicBlock.java +++ b/core/src/mindustry/world/blocks/logic/LogicBlock.java @@ -194,6 +194,7 @@ public class LogicBlock extends Block{ public LExecutor executor = new LExecutor(); public float accumulator = 0; public Seq links = new Seq<>(); + public boolean checkedDuplicates = false; public void readCompressed(byte[] data, boolean relative){ DataInputStream stream = new DataInputStream(new InflaterInputStream(new ByteArrayInputStream(data))); @@ -362,6 +363,21 @@ public class LogicBlock extends Block{ public void updateTile(){ executor.team = team; + if(!checkedDuplicates){ + checkedDuplicates = true; + var removal = new IntSet(); + var removeLinks = new Seq(); + for(var link : links){ + var build = world.build(link.x, link.y); + if(build != null){ + if(!removal.add(build.id)){ + removeLinks.add(link); + } + } + } + links.removeAll(removeLinks); + } + //check for previously invalid links to add after configuration boolean changed = false; @@ -371,7 +387,7 @@ public class LogicBlock extends Block{ if(!l.active) continue; boolean valid = validLink(world.build(l.x, l.y)); - if(valid != l.valid ){ + if(valid != l.valid){ changed = true; l.valid = valid; if(valid){ From 806cea4b339106a3f9d38212afae19bfd85980f6 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 21 Dec 2020 16:55:04 -0500 Subject: [PATCH 27/47] Added building damage to bullet stats --- core/assets/bundles/bundle.properties | 2 +- core/src/mindustry/content/Blocks.java | 2 +- core/src/mindustry/content/UnitTypes.java | 8 ++++---- core/src/mindustry/entities/bullet/BulletType.java | 2 +- core/src/mindustry/entities/comp/BuildingComp.java | 2 +- core/src/mindustry/world/meta/values/AmmoListValue.java | 4 ++++ 6 files changed, 12 insertions(+), 8 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 8dae9d2843..7842607c37 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -721,7 +721,6 @@ bar.powerlines = Connections: {0}/{1} bar.items = Items: {0} bar.capacity = Capacity: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[unit disabled] bar.liquid = Liquid bar.heat = Heat bar.power = Power @@ -738,6 +737,7 @@ bullet.sapping = [stat]sapping bullet.homing = [stat]homing bullet.shock = [stat]shock bullet.frag = [stat]frag +bullet.buildingdamage = [stat]{0}%[lightgray] building damage bullet.knockback = [stat]{0}[lightgray] knockback bullet.pierce = [stat]{0}[lightgray]x pierce bullet.infinitepierce = [stat]pierce diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index c79b829448..66871284bb 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1763,7 +1763,7 @@ public class Blocks implements ContentList{ despawnEffect = Fx.instBomb; trailSpacing = 20f; damage = 1350; - tileDamageMultiplier = 0.3f; + buildingDamageMultiplier = 0.3f; speed = brange; hitShake = 6f; ammoMultiplier = 1f; diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 01aa68fc1a..c0d48c1723 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -182,7 +182,7 @@ public class UnitTypes implements ContentList{ lightningLength = 6; lightningColor = Pal.surge; //standard bullet damage is far too much for lightning - lightningDamage = 30; + lightningDamage = 20; }}; }}, @@ -1759,7 +1759,7 @@ public class UnitTypes implements ContentList{ lifetime = 60f; shootEffect = Fx.shootSmall; smokeEffect = Fx.shootSmallSmoke; - tileDamageMultiplier = 0.01f; + buildingDamageMultiplier = 0.01f; }}; }}); }}; @@ -1801,7 +1801,7 @@ public class UnitTypes implements ContentList{ lifetime = 60f; shootEffect = Fx.shootSmall; smokeEffect = Fx.shootSmallSmoke; - tileDamageMultiplier = 0.01f; + buildingDamageMultiplier = 0.01f; }}; }}); }}; @@ -1841,7 +1841,7 @@ public class UnitTypes implements ContentList{ lifetime = 70f; shootEffect = Fx.shootSmall; smokeEffect = Fx.shootSmallSmoke; - tileDamageMultiplier = 0.01f; + buildingDamageMultiplier = 0.01f; homingPower = 0.04f; }}; }}); diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index f0f682b8e0..73e0fb93ba 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -41,7 +41,7 @@ public abstract class BulletType extends Content{ /** Multiplied by turret reload speed to get final shoot speed. */ public float reloadMultiplier = 1f; /** Multiplier of how much base damage is done to tiles. */ - public float tileDamageMultiplier = 1f; + public float buildingDamageMultiplier = 1f; /** Recoil from shooter entities. */ public float recoil; /** Whether to kill the shooter when this is shot. For suicide bombers. */ diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index 964f1f7078..142e89573a 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -1165,7 +1165,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, /** Handle a bullet collision. * @return whether the bullet should be removed. */ public boolean collision(Bullet other){ - damage(other.damage() * other.type().tileDamageMultiplier); + damage(other.damage() * other.type().buildingDamageMultiplier); return true; } diff --git a/core/src/mindustry/world/meta/values/AmmoListValue.java b/core/src/mindustry/world/meta/values/AmmoListValue.java index f6b5037505..b1d6066ef9 100644 --- a/core/src/mindustry/world/meta/values/AmmoListValue.java +++ b/core/src/mindustry/world/meta/values/AmmoListValue.java @@ -46,6 +46,10 @@ public class AmmoListValue implements StatValue{ bt.add(Core.bundle.format("bullet.damage", type.damage)); } + if(type.buildingDamageMultiplier != 1){ + sep(bt, Core.bundle.format("bullet.buildingdamage", type.buildingDamageMultiplier * 100)); + } + if(type.splashDamage > 0){ sep(bt, Core.bundle.format("bullet.splashdamage", (int)type.splashDamage, Strings.fixed(type.splashDamageRadius / tilesize, 1))); } From 5b163d78432bffdf5d5b67679305203519231065 Mon Sep 17 00:00:00 2001 From: Sunny Kim <58885089+sk7725@users.noreply.github.com> Date: Tue, 22 Dec 2020 10:04:04 +0900 Subject: [PATCH 28/47] Heat for accelerator (#4065) * heat * better animations --- .../world/blocks/campaign/Accelerator.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/core/src/mindustry/world/blocks/campaign/Accelerator.java b/core/src/mindustry/world/blocks/campaign/Accelerator.java index 96bc2b1b44..b5a33bc2d3 100644 --- a/core/src/mindustry/world/blocks/campaign/Accelerator.java +++ b/core/src/mindustry/world/blocks/campaign/Accelerator.java @@ -50,37 +50,48 @@ public class Accelerator extends Block{ } public class AcceleratorBuild extends Building{ + public float heat, statusLerp; + @Override + public void updateTile(){ + super.updateTile(); + heat = Mathf.lerpDelta(heat, consValid() ? 1f : 0f, 0.05f); + statusLerp = Mathf.lerpDelta(statusLerp, power.status, 0.05f); + } + @Override public void draw(){ super.draw(); for(int l = 0; l < 4; l++){ float length = 7f + l * 5f; - Draw.color(team.color, Pal.darkMetal, Mathf.absin(Time.time + l*50f, 10f, 1f)); + Draw.color(Tmp.c1.set(Pal.darkMetal).lerp(team.color, statusLerp), Pal.darkMetal, Mathf.absin(Time.time + l*50f, 10f, 1f)); for(int i = 0; i < 4; i++){ float rot = i*90f + 45f; Draw.rect(arrowRegion, x + Angles.trnsx(rot, length), y + Angles.trnsy(rot, length), rot + 180f); } } + + if(heat < 0.0001f) return; float rad = size * tilesize / 2f * 0.74f; float scl = 2f; Draw.z(Layer.bullet - 0.0001f); - Lines.stroke(1.75f, Pal.accent); + Lines.stroke(1.75f * heat, Pal.accent); Lines.square(x, y, rad * 1.22f, 45f); - Lines.stroke(3f, Pal.accent); + Lines.stroke(3f * heat, Pal.accent); Lines.square(x, y, rad, Time.time / scl); Lines.square(x, y, rad, -Time.time / scl); Draw.color(team.color); + Draw.alpha(Mathf.clamp(heat * 3f)); for(int i = 0; i < 4; i++){ float rot = i*90f + 45f + (-Time.time /3f)%360f; - float length = 26f; + float length = 26f * heat; Draw.rect(arrowRegion, x + Angles.trnsx(rot, length), y + Angles.trnsy(rot, length), rot + 180f); } From 852013cd635d49429964b86e053972725d2b111a Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 21 Dec 2020 20:48:00 -0500 Subject: [PATCH 29/47] #4068 --- .../sprites/blocks/walls/thruster-top.png | Bin 0 -> 763 bytes .../sprites/blocks/walls/thruster.png | Bin 683 -> 612 bytes core/src/mindustry/content/Blocks.java | 2 +- .../world/blocks/defense/Thruster.java | 37 ++++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 core/assets-raw/sprites/blocks/walls/thruster-top.png create mode 100644 core/src/mindustry/world/blocks/defense/Thruster.java diff --git a/core/assets-raw/sprites/blocks/walls/thruster-top.png b/core/assets-raw/sprites/blocks/walls/thruster-top.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6bf7f6166f0d3e266fcaaa99162fbce9495cfb GIT binary patch literal 763 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4rT@hhA$5${$yZaU@Q)DcVbv~PUa;80|QIC zqpu?a!^VE@KZ&di3=I4MJ|V6Q3=Fg8ZwU*}+;r>`0|Ud)+1r#E7#LVfg8YL2|NsA= z;rBMaUH$ItWJD}F3zyYk1F zdDXv8#?t?L82&70U0|=v@LRv)=p2S8;UBoF8MxOO+&u76ucFnm;k)^awGRs9_Z*Ts z@Y&jD{(}{aafv(+zA`^!mDzGYJBQImjxjEg>%m)r4_w|1{>K}_C73EKIrc1)J#bj# zzV?T%G=}O$3u+s}Wn>z*GOV{SW60!;6XZw;7T9x0{=g!QidO3e+r$rC`3%{Q9*CY} z*jCaI{(~vv5_8-`t^{}SidOXo(b@;1eGFzLP2o3~BQ9{qCGtI}HLo~2o6VrRA-si2 zqV<5b5~EMj1JOnXHpdTK^$h!8PZ6JXTlxc6IfMP{DdBndr9X5nWQ>V?_hBdFdJCD=kr!XHiYlFKYv5)f#=;!dk)EOh`+$Ho`dC!=mXJ-4eOZpD2ZGMZU{fZWOYFM zo_azEV_YJ?L`Xxp1=BH+2cq*D6j>`;wG&(z;~sKL1T=(OF#qEIz?JV%&KUQQ?}hFG z?LUljSu0!>4lrI4+Vki}gBN35VZniI4C^!4dh`xx-(uX$s{Mh>`M?dPJ%@x0wlJ(W zVC~TXh39Q1NXYguzWxdgZr+Nx^Es^TzaNM`Ybdgv%q#OA6ckksb*$@W2nUEf5S`2< z$69f84TIW`4zL%)E*>mzE|&lR literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/blocks/walls/thruster.png b/core/assets-raw/sprites/blocks/walls/thruster.png index 0725cc31b297527a9ae5cfdc38f4b003d8c5ceec..90be6bbc53083bba4797776c1c1202327e013adb 100644 GIT binary patch delta 599 zcmZ3@`h;bIL_G^L0|SGhK+O*Z1_s9BAa^H*b?0PWGB7Z(q&xaLGB9lH=l+w(%D}+D z8Q>G*I&1!xO~)>kR`mUua`ZPyu)rg-n1O-sFbFdq&tH+kz`*##)5S3)H>Z>>5&RIw@MG#B)&qyxJ(L>~ zA~doE`~4o8H59HEd77=m%aCB5D!at*;Vsq&>8|20MC}^Bv)`ON#djfNjps?mo8jVo zYzm*W3L3l}>sb;+9t2KcRMqtLke#`NpKnF2bx>EXSnF zo^rrTcO%0NCXf3pE&C63InBy{+||H!z?D(dp_@s11LJ*$2bEhZ8Olr7G#EW%zN7!T zH{@O#|ANrt!U63z4d1Gm%@RQ9pS(iN#+LQlemvb(zc8o%Ks{y&XLwLor4Qd~LR4c4zI&>qO zMMrco-wB=*>^rJ2@CG~x%9#5juQZ0KTsp?K;hNGl53>Vzj#(XLX%KE)t#@Hklg&{U ugMLs11&Aau^e}m4b}@otj78ud1KW#xOE>+0FTudTz~JfX=d#Wzp$Pzni{@_t delta 671 zcmaFDvYK^*L_G%^0|UchyTsEB3`|9yE{-7;x8B}4>wDNifGr@L(=@$gyqmoAWjA4UW6qo2!0%xADEFe;>cDk)40vUP)uxeg*}G14ouHHz;r% zcv!)tAbUVnfrFiai9vvYfdND?F_;TBFf?Sy#43=kFmSko%u`Wj0P{hH zH>9vIFfce6G4U!M|@ui_C)zkPe1^5buD|1-A*k z3Jf`{%nKw~8j3bdci>fI$f)OJW?*30(h4H&c$p6zU&!#oMuvfbp}>WQfv=P4fMFqD zS4c)t$eJhCI#LYBk9zNE6JTJNPy;fPi6QLR!-^^on^#s0Gju+FclzAQbqsg@{jLXj&B>f$T3xaN z14F|%29kA%6To5%1ZeLTLBv;HUEEWE&K1Yd)zaN<7RAFkZJ&OEhvJ(vBbc{ m@KJz)qn&|)K}|wU@}T~Ne+nx5XY#xPsq%F7b6Mw<&;$UYG|^E2 diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 66871284bb..eecae2782a 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -876,7 +876,7 @@ public class Blocks implements ContentList{ size = 4; }}; - thruster = new Wall("thruster"){{ + thruster = new Thruster("thruster"){{ health = 55 * 16 * wallHealthMultiplier; size = 4; }}; diff --git a/core/src/mindustry/world/blocks/defense/Thruster.java b/core/src/mindustry/world/blocks/defense/Thruster.java new file mode 100644 index 0000000000..89c9a28c12 --- /dev/null +++ b/core/src/mindustry/world/blocks/defense/Thruster.java @@ -0,0 +1,37 @@ +package mindustry.world.blocks.defense; + +import arc.graphics.g2d.*; +import arc.util.*; +import mindustry.annotations.Annotations.*; +import mindustry.entities.units.*; + +public class Thruster extends Wall{ + public @Load("@-top") TextureRegion topRegion; + + public Thruster(String name){ + super(name); + rotate = true; + quickRotate = false; + } + + @Override + public void drawRequestRegion(BuildPlan req, Eachable list){ + Draw.rect(region, req.drawx(), req.drawy()); + Draw.rect(topRegion, req.drawx(), req.drawy(), req.rotation * 90); + } + + @Override + public TextureRegion[] icons(){ + return new TextureRegion[]{region, topRegion}; + } + + public class ThrusterBuild extends WallBuild{ + + @Override + public void draw(){ + super.draw(); + + Draw.rect(topRegion, x, y, rotdeg()); + } + } +} From ac06fa8f96f2b20dcb6c99e0f24e299ea04e678c Mon Sep 17 00:00:00 2001 From: Skybbles Date: Tue, 22 Dec 2020 10:33:07 -0500 Subject: [PATCH 30/47] update my github name (#4070) updating my name here since I changed my username --- core/assets/contributors | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/assets/contributors b/core/assets/contributors index 61b6bc135b..85449e6c45 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -7,7 +7,7 @@ Baltazár Radics Dexapnow Milinai 키에르 -Luxray5474 +skybldev Leone25 Gureumi VizardAlpha From 24c71e49c7570339106ee8059c0b968edbc5c6ea Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 22 Dec 2020 10:48:11 -0500 Subject: [PATCH 31/47] cleanup --- core/src/mindustry/entities/comp/HealthComp.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/entities/comp/HealthComp.java b/core/src/mindustry/entities/comp/HealthComp.java index ca65ea8115..2b4aef0b51 100644 --- a/core/src/mindustry/entities/comp/HealthComp.java +++ b/core/src/mindustry/entities/comp/HealthComp.java @@ -51,8 +51,8 @@ abstract class HealthComp implements Entityc, Posc{ /** Damage and pierce armor. */ void damagePierce(float amount, boolean withEffect){ - if(this instanceof Shieldc){ - damage(amount + ((Shieldc)this).armor(), withEffect); + if(this instanceof Shieldc c){ + damage(amount + c.armor(), withEffect); }else{ damage(amount, withEffect); } From 17177f87aa3a1d5b72e550f2fff738307c630430 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 22 Dec 2020 11:20:35 -0500 Subject: [PATCH 32/47] Fixed #4071 --- core/src/mindustry/entities/comp/HealthComp.java | 6 +----- core/src/mindustry/entities/comp/ShieldComp.java | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/core/src/mindustry/entities/comp/HealthComp.java b/core/src/mindustry/entities/comp/HealthComp.java index 2b4aef0b51..85d0a37105 100644 --- a/core/src/mindustry/entities/comp/HealthComp.java +++ b/core/src/mindustry/entities/comp/HealthComp.java @@ -51,11 +51,7 @@ abstract class HealthComp implements Entityc, Posc{ /** Damage and pierce armor. */ void damagePierce(float amount, boolean withEffect){ - if(this instanceof Shieldc c){ - damage(amount + c.armor(), withEffect); - }else{ - damage(amount, withEffect); - } + damage(amount, withEffect); } /** Damage and pierce armor. */ diff --git a/core/src/mindustry/entities/comp/ShieldComp.java b/core/src/mindustry/entities/comp/ShieldComp.java index a1aa1b6aae..3ca002b288 100644 --- a/core/src/mindustry/entities/comp/ShieldComp.java +++ b/core/src/mindustry/entities/comp/ShieldComp.java @@ -26,8 +26,22 @@ abstract class ShieldComp implements Healthc, Posc{ amount = Math.max(amount - armor, minArmorDamage * amount); amount /= healthMultiplier; - hitTime = 1f; + rawDamage(amount); + } + @Replace + @Override + public void damagePierce(float amount, boolean withEffect){ + float pre = hitTime; + + rawDamage(amount); + + if(!withEffect){ + hitTime = pre; + } + } + + private void rawDamage(float amount){ boolean hadShields = shield > 0.0001f; if(hadShields){ From 7ea12e97ecc1216fcdbdf7812dfdb25c7d56670e Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 22 Dec 2020 11:28:33 -0500 Subject: [PATCH 33/47] Fixed #4073 --- core/src/mindustry/entities/comp/FlyingComp.java | 4 ++-- .../world/blocks/defense/turrets/TractorBeamTurret.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/entities/comp/FlyingComp.java b/core/src/mindustry/entities/comp/FlyingComp.java index abcb5e39cb..94db2f6a63 100644 --- a/core/src/mindustry/entities/comp/FlyingComp.java +++ b/core/src/mindustry/entities/comp/FlyingComp.java @@ -51,8 +51,8 @@ abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{ } void moveAt(Vec2 vector, float acceleration){ - Vec2 t = tmp1.set(vector).scl(floorSpeedMultiplier()); //target vector - tmp2.set(t).sub(vel).limit(acceleration * vector.len() * Time.delta); //delta vector + Vec2 t = tmp1.set(vector); //target vector + tmp2.set(t).sub(vel).limit(acceleration * vector.len() * Time.delta * floorSpeedMultiplier()); //delta vector vel.add(tmp2); } diff --git a/core/src/mindustry/world/blocks/defense/turrets/TractorBeamTurret.java b/core/src/mindustry/world/blocks/defense/turrets/TractorBeamTurret.java index 511faf35ef..34e960ea2d 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/TractorBeamTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/TractorBeamTurret.java @@ -118,7 +118,7 @@ public class TractorBeamTurret extends BaseTurret{ } any = true; - target.impulseNet(Tmp.v1.set(this).sub(target).limit((force + (1f - target.dst(this) / range) * scaledForce) * efficiency() * timeScale)); + target.impulseNet(Tmp.v1.set(this).sub(target).limit((force + (1f - target.dst(this) / range) * scaledForce) * edelta() * timeScale)); } }else{ strength = Mathf.lerpDelta(strength, 0, 0.1f); From 79d49257613fed76d579f738dd061a3799c094ae Mon Sep 17 00:00:00 2001 From: Sunny Kim <58885089+sk7725@users.noreply.github.com> Date: Wed, 23 Dec 2020 01:30:09 +0900 Subject: [PATCH 34/47] THIS WAS WHAT IT WAS ALL ALONG (#4069) --- core/src/mindustry/type/StatusEffect.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/type/StatusEffect.java b/core/src/mindustry/type/StatusEffect.java index 90488c62ea..a02cb28978 100644 --- a/core/src/mindustry/type/StatusEffect.java +++ b/core/src/mindustry/type/StatusEffect.java @@ -52,7 +52,7 @@ public class StatusEffect extends MappableContent{ if(damage > 0){ unit.damageContinuousPierce(damage); }else if(damage < 0){ //heal unit - unit.heal(damage * Time.delta); + unit.heal(-1f * damage * Time.delta); } if(effect != Fx.none && Mathf.chanceDelta(effectChance)){ From 0aaa77a5eae7c3e3474bc869d6b622253f729575 Mon Sep 17 00:00:00 2001 From: VozDuh <61590217+Voz-Duh@users.noreply.github.com> Date: Tue, 22 Dec 2020 19:31:24 +0300 Subject: [PATCH 35/47] Scrap Walls Textures Cleanup (#4074) --- .../blocks/walls/scrap-wall-gigantic.png | Bin 819 -> 755 bytes .../sprites/blocks/walls/scrap-wall-huge1.png | Bin 688 -> 608 bytes .../sprites/blocks/walls/scrap-wall-huge2.png | Bin 868 -> 1201 bytes .../sprites/blocks/walls/scrap-wall-huge3.png | Bin 845 -> 1153 bytes .../sprites/blocks/walls/scrap-wall-large1.png | Bin 502 -> 623 bytes .../sprites/blocks/walls/scrap-wall-large2.png | Bin 371 -> 381 bytes .../sprites/blocks/walls/scrap-wall-large3.png | Bin 467 -> 660 bytes .../sprites/blocks/walls/scrap-wall-large4.png | Bin 470 -> 661 bytes .../sprites/blocks/walls/scrap-wall1.png | Bin 266 -> 329 bytes .../sprites/blocks/walls/scrap-wall2.png | Bin 246 -> 307 bytes .../sprites/blocks/walls/scrap-wall3.png | Bin 249 -> 311 bytes .../sprites/blocks/walls/scrap-wall4.png | Bin 198 -> 232 bytes .../sprites/blocks/walls/scrap-wall5.png | Bin 198 -> 218 bytes 13 files changed, 0 insertions(+), 0 deletions(-) diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall-gigantic.png b/core/assets-raw/sprites/blocks/walls/scrap-wall-gigantic.png index a5ed4a31179c67d88099cdeb061f9da048459e24..18bc9504f97186ff6c989dbc19becbb49bffcec9 100644 GIT binary patch delta 743 zcmdnY_L+5pL_G^L0|SGhK+O*Z1_s9BAa^H*b?0PWGB7Z(q&xaLGB9lH=l+w(%D}+D z8Q>G*I&1!xO~)>kR`mUua`ZPyu)rg-n1O-sFbFdq&tH+kz`#`O>EalYaqsQS=sZ?M z4u^}PFV-~d`tSPfoVO(F5${?5c&R^bAT15P{)GIlH7UogtEHmn!PV_0VD@Pd(b zSK}o%L&4T8hQA@4r^=&WFc_SfGR?!~;XGD}Vpp*RT;dD~Yc0%L*-m&HGKqCNNikTi z*V@A%xM1ZWu4dS9MTmDpCF4=f8#WDLH~To=Fia9- z445~6;l-^U3?eM6oMtd|sT63Z2sijH-NJApGQ@yUY5tj$JQMtU!yKmg`JUv^a1AtI zc=XRb#DL*k%OsIC4MI2WMlwB6jhm5rbX`N3?D=;LDW)46@_6gFN!t3aVhCkyNO`ir z;M%#xzi*~8uo(TQm0TIX>%jhBn!&U6i>N~Sst-(Y2e>O3|8o{hHz^N{)p-4`_vqfO zg|o9SGTwc5D(Ag_Ylmz?o!txN8;lcKA1KRzdNV;)qk&gJE26)05mN+XQ`6rS+8PbA z2eckAF}O5pJ~*{sgVSeyy-oQ$FD8&%b}=kcSa5%CtoZrI_T~p_f1b-bFmY{-+I{Ag z_6{;!u03iBOp}xfG|tE+Zc_X3Mx9~XqGRVpCX_nNV>X-Iz;r^b(Vn5j^uP}lu51Pg z#za;F8}7^PFLxWqI@mJ&YR_C1Ahp@8hUwVy!c_-2LRuXgepfaKuHb4;a9~!@ah2gY zCAGk=(B!}*r|K7qtLr@%?Az4wv{~Lo%8~uUMq>O5yw!) pxVwqJA?`q3*%wAo65`bO!OdxCHT~I*7*OhE@O1TaS?83{1OS4qAaMWy delta 808 zcmey&x|wZ)L_G%^0|UchyTsEB3{1Z~T^vIyZoR#GI#=3Ig!Mw^t%lVej5n9CJDV

8oZCV0dtB33G!2$AR0w z`57)T{?Qg_VP;@t;9yw6{2-9|`%NLvgmjj*T6TKWg#Eex+e8s1jGb>J0;TWF0d zM=ZmcRTEyNYBg-;2)Pm`FpsH#pRpl;;l5*l=WmA>Ob*HgXTJKfPvA=2`kGlGMIj@S z;i}>rqX(vY#5Y(qtV-2t_|1R!;d}+oLqQA<9IOlnZCDr>Hn1^pFfcGS9AD4O*bu>? zyS`eQ;l83r!-dDYyct*2^C`+5Fy_#5d{Mb~DI-UP2n&N_G)R{`1IHnG#;elJ3??oM zzVbW#%uCQ=;K++~KA6rJ(ld=wA(_LW>X-n7pfLjjgMw8uheO3Nfrbw~iVVy~ZQA<$ z_oWUjmNsHOz-8REnQ_aHI0l9b&(h8_Y*20rV~DC$g@uKwhH%z@#+H35bf7HRPdKSld%a=lXa=!n zgY0+vm|Bvbb9rc=W@1QuxBuLSI0lAnCW%e%0vy{_Z_C^@?^-iy=jt1}dxZ2Xwfg6( zhy1y^;^sty&Lqt!iH0qv9pM5pYLT0Sk2AC=GcYii>qs&&C_WTm;Am%HV94_^YVtq% Wl3nI~d(cBruzR}txvXG*I&1!xO~)>kR`mUua`ZPyu)rg-n1O-sFbFdq&tH+kz`*#x)5S3);_%z)v1LaT zINT13&XBFR@n7k-=O4zO7k=EZe7bPC@yWBH0gnXY)9W3diU`=Tp3-Cx2~lR4qh#J- z_&~&k`zX6cBZHRRfwckK7bY-^81u=n{Rn*`dw@+N+A-Xw;YHvg&*%UCGhEAjEB|VO z4_n~FT}^u!^n1Te+{54=EFkb;g?Z?MqsvaP?O12d#m-{gprmkkVQ-67!-FTkxAUC{ zUb}07Y6!FG&eK!tzl%3~ib*zqnsLcUE^TtxC9T+lfnkgaaSK*=HXd0}pnahHmg$6= z!CGyHtY_G^(g(}T!U)0rqT-)px|FQUCNStiJ`ihAg zisVi>Ea*Ecw_}1sd}#v1S2^(TPzNYwFnGH9xvXZCL2s^=<4=kMoh5gQ-)<16c(phE4TM%j|*}`;^{D{n6;K zXI!Vqpux0*-SNYDXCB5B`zKfA52Z3}j=yy!++OhbWVV2M!P$HPd)I}&97zy<|xL?7CY0_9@0PcLs)r zQo)=&$Gr^NQ+J+Vka3NuUweVOfrTTwK~&&Lkf0!g`zl=q52hEo)q(!%`m75gx_7ZQ z1a;al9R2DL#PD5DgE`^Y?P9Y7Ckhz@Sbw}vGGY)BaAS1q&t?@6&L@rC6>Gh!BN$0Y$pXrC0*JJK&yQKMH`?|aP z@>gVk&|fT5|3K%EAH$@*iy1kx;_bUOFdvxmpFeh~jeV8aPiNSWM+|je znGa(?d&rp;X3Mv1aDGrNI4imCUhVO-d68ZoD diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall-huge2.png b/core/assets-raw/sprites/blocks/walls/scrap-wall-huge2.png index aa87272b1c9e98e8b1e9d82de72a81fb0e4222a5..b3a4c1681497f5b7b9e90fc6fedd1e18209d1b0d 100644 GIT binary patch delta 1192 zcmaFDwvls!WIZzj1H)Cfb}j}62FBtbcPEB*=VV?oFfg#BJNh~@Fl_AS{*%bcz`(#C z;1l9HYyOr^$1ast^f7=z;=IdK85kH?OM?7@|NsC0pW*j5zF-Ch2F?PH$YKTtzQZ8Q zcszea3IhX+l&6bhNQU##Nzv1!qdA;q*Pp3BBYvd*naG2xpA$>JyXzcue3ke7hoQYYbx9 z*{!i7M`6psQ=JnU9<(%dvnjFbRR7DUNIQ7#z*lR5i4)#N=pDX#;B2+P#0l?yE>)1) zQ6a9>P;q`e>%IB|zrQOgY5ZLK;AHaOl~Ouv)!I*|{MpNNmpAG1&G<^clke-54&GHL z6BR37x?a8Lq;z_#?-bhqB5%qJaf?UC8Ih8k?xb~f}&watVr(WKvEQ58=KbD|4 zOPz}47w!u^cI5c@e8qvcciSqWizc+`1};7@x7oIJxk~P-54xMgchqxA%sJqk{M17t zYVqwuU)7(ibyE8Oob_j>#{cWAKQmqa^>cr^tWdu{!Q{i1nz_HX{P({jBeI1pPKw9u zR?6*aCUtk#rH$=PftS>d{@8m@+MRWEWBCDtjLED1MtMJ8mGC=|>6qVqk(K(<){hq* zVAWTA#%8BJyDQ&K`|%zH5&za>^?dgt;|_)Vk)9*A$pqJN|oj_b_(^bER9{Ud8P1A9*-#*K5Jh)&GnsoBHdw;OLA7M z_^X^(E_Td9s#3wPcLk&etACQ5pmA|V)b&=Y*;W(JH@KkNfn>$kjEu!Ag@1}Nc$qAF z$6ISuTCcR9mBq_snVE>fv4mGH`_v>h`I+8&v%qEXt4jjg+*^ugU4F;PYH@ZATTJ%> zi@RCYoh*xI=6Es*?g|~L^N@dyj zazoROF5edm?6s@a9M7ohFw1V7(Dt$T!y|2-)`E1AKMNc+mq>4Z@R}{CFVdQ&MBb@0EA8|wg3PC delta 856 zcmdnU`GjqPWIY=L1H+>kFo@?3F3d) zI=C)y{5kNSF~&NDamV+x#Jy#12m0UMDwok05luAvu;Tjps_pgi%>Qp6yXm^vVGUc{ z?_YNr_Xq|w#{ZOGa=u#gP;NX2gLZ;FrA}mCnK9fwEnHN4&riibmQgolKgR9||x#Ze8XT6-m-_Pb^ z5bP0QSaJ983cC}XQd~S!drcio7_P`wiAYsFl(U_9xzCYzgEGUXjYruo*fmKlVBGL> zHG6{^Z*BwIiT@mzrYK1*U@Tg`@WuZ8`i3_QqTYhHSZA(deajZGQD$xIB%O_N4>oE& zV|%bsMUrvhmsthO7J1&Cn?jeq*{6_}-N3-HI{kqugWw_^2bPwb#vh~(ROH;?YACfy zNofgT5LDR4y1~X^s$@-W;=6c;mwiu9#a~&*=rK)vwS4FW25aVwzT}q=q!|^$JJzuI zU#b6o*{O%I1w^*q$D*fZ|-&F_2TP91b^zJbvK8dW!%Cs zl_Bg{Kidh01&%8i7Mz?H#8@Hn^~Q7W3-t#MF3##~Ns!MszEQc!{lP>5MMjlqTN`Hn zU$F+S6ax?czPs~s;<{xFy#?`;A@mnZhtNn`1;&_L(ZG?<`}jyU+h1&1q6j SR3ZZd1B0ilpUXO@geCyxQ+m$; diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall-huge3.png b/core/assets-raw/sprites/blocks/walls/scrap-wall-huge3.png index 04f1382d4df165163d22206b74894a4c5cdbc83e..9c323a3b9570398e49eac73da897c3a465ff8bad 100644 GIT binary patch delta 1143 zcmX@h*2pinTRaz)A&GQX7u(l<<`J*b|j)@JqjYmZ#3uZRFWLeG4vBTrQrh}j62yRd- z_^UW$jSizS@Q@fG#;MsaQc-O!n@odH? zg#<5$o!ml)HCEhpbntYjU|7`9xZ-W#fk_ST1X3oi`xee9?w`WwWEK3on?Y2A-&3`B z<=;w&Fc1EXQ*K@PXOb`_gMZ?*OIQB+9r!0K$+l>#rrg&L1|~^ad*3_|ICHnc&}6f7 zS<;f=(X zUBCFHXZ>y1QM6x5rHrS__UB{gT7e1w?`>zUiCwWdj{ELTc{b*+i>~j}yArwn=z6}Z z{LPJ37hl`NuiPBRzJI@pjflWM6&vA%|2`Ee4FCT#|6^wK+97*EXj$O;jr{+F3{>mS zOpbf3_fIH5=+=VkGiIAyG%3{1dVH3z!jCcQgV_uZrA@-Y&+oFyL_3t&&*)Bk)cwew z{f&CU4dyQ&o2xg>@NmhDT3@D?Ch@JI{Kdxo@*7SUOr3TqqrLv0cxT>Vb@B;>y#xsRVoB}L3b>BiiqEwRDV8U&1l?RGx37qSr9 zx>hbUS@3hc_o{^}{-zu{W3Y=i{h7gnRWt6i87uy8Zcs`tkUq!sTb^}|)vwzH*Z!I_ zGS^3je9CM6$W(Xtzs7<4WmEU8-XOta@2vcd`P1ty6UvR(Fj!A6-E?AAsvW<`r*(&o zJhvY)7^0)gN^P{f`dK??nIV0=mD0H8l-IKo7-gkq$=Z69YclH1-zke+{MsIc&K^>bP0l+XkK DkR=Sv delta 833 zcmZqVJj*sgvYw5Bf#K1Natj6qW)V*p$B>F!Z||PXJ#4_knxGrIAh@IYSmPw$IfkmN7`M~Md(NYb2 zC#!xw`I)_d`wH_!H9O@avJ6s3avm8w+OT%GUGS=5;}B(7-BQ1>U9&;t;hK}zn_e*4 zI0-0lB=9$#jBlU8^kLV@h4)$xGbqX3ny^~F_w7`+4z1~T^&D%M;@UM>8@?S`7uRO= z@t43##!V&J(-{ON_uq+;zMC%IF!8)nsQF7qw{kVBpHjDF?v^u!ut@CfbPKngbzAmt zUt+`6y1=h#(G~}83ZBugcVzKk2oPml#Iu!Qg~?e~Hixc&+(pwXwHFB;$ay-6Z2{Av zSKoEEFV*GZ7^>M*7$1E6lEZ7T*_UYn zlZ~K?dka4)p#>i2i)$mP+!-2t`q2H)PI6 zI&(*s`)cNtYhU}Cp8|Md4Gy`!)E3=e{C;5 zW0ZQtQ;ol9um*;u4gym zNZ8;vgF%5InuCeuUtL2%`)+0dxvO3#4KMv?xG diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall-large1.png b/core/assets-raw/sprites/blocks/walls/scrap-wall-large1.png index 6f5b66a672417a9e98efb27e8e79f76fbcaff01e..289f3ad4108d64e9b65ade6469772bf1cc46dc89 100644 GIT binary patch delta 609 zcmeyy{GMfkWIZzj1H;_yjc*tj7#NF#+?^QKos)UVz`($g?&#~tz_78O`%fY(0|Ntp zfKP}k0|UdX`CB#}yHr}y$H2f)d*k6G1_lP!k|4j}|NsC0XZXF1FPMRWfwRCPvY3H^ z?=T269?xHq!oa|I!_&nvB*Oja1jnMo20YAjP5##xvkKHt(U`eKcCOWBTN5RZH$JsB zamMeLzxekfN2-MP;55hWYBvmCY;t4_{GjW+A(NxY)>-6@#66KeIxoDhuIPQw+nB{X zH}=ABffb?~7JKix&!Xj8QRFPX!g!(V$HP;t8>fHp;gy@tr2X;g1A&*Bx(9B_F>G%X z3~FffJ($b1Tj9*ihWgVY+n(3!2o{7JeC1{gSKU}IW}q6OJ3X;v!ZRkZXa7xmWLs7? zJXerqKk+R8fQ3oK#mxs91AjlAf9#Xs$F8Z8w{NuG*JUzJn7ELY|4*Lihu)*7X8oSS zCB*!A#_t*2er(>!?}8O0c(|mw-my-06b$?#&tg+FMbNdJ>0XJBvB=$ejtZj$HIZ2E z3PXn{8mm|<^qAb70uL{DZMd$q;Y0vS%^cPWlL|)>j@Bd3JsaW=a4)zS=vCv#TDNlL z;u$~YaK8z8&lvo$SlobBf~&-_#*SN$$4bFYz3J8h+mDvQQ`pvao)>4zk@4Q5W_O)Q z%(`cbn%#7!YfLwJ>$DlYg`dxkiaOxbbnS^s2V0za25%KB6W_&z=jmJWdc1@)IN0va zzp(3jpru=V_xFXz&FZ}t=zrx1m2zHi)j5QVNmp)hl(@z}rfYHQ>%`jCsKmoH?PDWI}b zq=8Mrie-|swTawAQpSW@x*HwRVQA4{3;Vy2mi<(_NkgFJ<>s^LqckG@)e;gWw^S z0{(>z-*_f${1(m_VQzbR+0(r{4>8P|Z~k3vak7Fl%cdLz+UybyLv;pZycA7BI|m zYn%J0gyC4S*+RxTzZX|`8?W-QYA9`c{#QYb<-tNZPKQbUj0&>@#28fOFTKw`X`ewL w18V?--Q^n^5BVmj7V^3w*G*I&1!xO~)>kR`mUua`ZPyu)rg-n1O-sFbFdq&tH+kz`*d=)5S5wJECVq$eFPTD$cPIQ$KFGs=C6!rrL*7TeRVxoN&3L*_ zE4e6>;gpT?UA7dZC7hxeRk13qR~mfJ{$9#KF0|SGntDnm{r-UW|r3aR| delta 356 zcmey%^qFabL_G%^0|UdV%))yN42)KuE{-7;x8B}9%X`Rxr|qF$?-3E61Ff+Ww=sb(Y3LJIlxcRHJ+h@ z;lx|-oua#$0$3Or7%qq_e7$4jkh*E>+trLg9IKR;ZsEVqV3}TWonh6XmCuZwmmfHB z>LTv}4wj>{7#oBZs5`y<&S1c`;Akrc!$k%Wj;(*04~Q@{c~45Z><4!ldC_lkKC(5YoB6_pGhM>L<@LxE4fI*f8=` zhFhpK6!Cv!nDBL%&3_3-1_p*T7poex3yY>OxOnbiVQSc`mhbw5LD2Ry+d8TEB@7G< N44$rjF6*2UngFswjS>I= diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall-large3.png b/core/assets-raw/sprites/blocks/walls/scrap-wall-large3.png index 89bdcffae7a30d88e5a45d5078d9c1da2b52937f..ef8b6e12cc8c0f28d7366b5268c4d303cb8a0648 100644 GIT binary patch delta 646 zcmcc2JcV_FWIZzj1H;_yjc*tj7#NF#+?^QKos)UVz`($g?&#~tz_78O`%fY(0|Ntp zfKQ0)tod6u9lON9z))Jz$H2hw`0tL73=9mcB|(0{|NsC0&+vO2UoZm$180FpWHAE+ z-(e7DJf6QIg@J+bucwP+NQC>{>E311hCD1!m*4q+hE1yeE{jLg6&LU8Z9hsQXU4`o zc`o?BY{vh42X-8s%x^Hw;O&Pe%x8Ed>dxIxyz%gdrGN@1W z7g%tK9hUgntzyZ|CtNSm!6tstPj4dYTn2UBoo+WWSu89juzN`FW_Yb!*;FC;g7*{O znzeEBwahsMPMo+DwO+g_V->@5zuQR*uCr+T^iO)*o$%fyps|ygk#|SNis(=YOGOT5 zJ*ihgs%d8VYd&d61EtyNDoZEk%4xeGZ%8+I90z)0{s}gMWlM{>!YJ^)F zzZM_#khss;_0Zcj#H2quIWeF}dDY`h-3O~9 zluS0>pTo*wQow8GX!>ARV|KbrOv5s%M>Xx)%F1d9!908JKd5?Q`|1AwhY=pv=QqT! zI@Eix@j*$`YRPxsRG+izh4r0|P?32rGrePP+*N-L delta 452 zcmbQjdYO5GWIY=L1H-D!!g~x1jI%sl978H@y}f;w_mBY(>jRzMBO*KpT4e={4H&pZ z`3e}ee)NwMy1u8`KP2<-LX|$vr!_lux9+$ne{oU7qp8lOT`U3ujSPnwn;g$DcSy89 zUMa<*z`*#5;eB^Vcl;68Af^h}pPlQ^pYESFBV^0nMh1@t)0X2A7I=f6W=>IG9pcR@in+I{dn` z*=xH>_RhHC-UzPzIU5#qixly^{I!xHNT@^e8PkV3+b0%pNuR68R3Xi`xr!-~Ax%Ny z8V{2KqnlF2d*_BQhW94*FD?ow9?)UP4{UMBklnvi;1@STuF0n(@o2@L{@SSy; z+>%Swh90M diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall-large4.png b/core/assets-raw/sprites/blocks/walls/scrap-wall-large4.png index ef76eb0c51e9d481553b3ba733bf67c0d6f98c6a..b437560aebef142fe2a3f3779a019c4d9f59746a 100644 GIT binary patch delta 648 zcmcb{Je75VWIZzj1H;_yjc*tj7#NF#+?^QKos)UVz`($g?&#~tz_78O`%fY(0|Ntp zfKQ0)tod6u9lKOo(Z>J=iSsT`Wnf@nEeY}q{{R2~e}>=N_<|W27&r?&B8wRq_zr_G zWL1%`!r3|tutU-jna zGj2}lXE@I0u(^IJli))W<`=q4I-F$G7}hQo`6O|k;mAuV$?(m6n^_MuYRX>Yso2WE zvZCxP!|N0Wff>u5>FQZ55VD=)n6N0Y%y8qvTWyz*n>Uz5*9j+ZGjN{rIVG3&ntMa& zfu;bRGuO%+=89erTGcGMmvw=n49}VLhRy}A?=wF5!*<}GIK#F5^%b2tv#*FdtX%Xe z!EHUeMoGX%gU2tK5BM{mTDW*qyX1R+hJQ&e|3w7U+)i^p@cwe1vB+@a!hOsJGi;d7 zM#m&@FjTMHAAakqeudS6Zb<>r+~cL}53B{}%THta(3KXv`PH5M!iAoRk=_d#cl=%c zmZ!iefT3$EvkvE`l{fqu3Y_ZelxKI<@+K5^gl}4TV>-jNNnUK--$WahE}G&f_ef_w zLqvv(^hZXS2A_mo6L)hY-)4N1&h*CbUDTEEus@M8?`Geb|8$*dZR*o!_A;-e8}0Ko zY=6iL#h-Cq8Km-hQHa;1!pK#;FMly_{8sUYK_Q+un%U!u94PU4y85}Sb4p-r0syih B60-mR delta 455 zcmbQrdX0I4WIY=L1H-D!!g~x1jB`C*978H@y}f;#_mBY(>jk~uBO*Kp_^lPv5*WlD zsVX{#3f~fD_aM{76Aa|dG;aOn9W`+|lvsD;QZitEH@qEs?luK!HuI_!F z3!jcC)TO@Nx{yI2yG?+hLvwR#*Xv6xS^HP0GgS5JYucY*Y{m1BIf9w-V!FTrmJL%v zI2WihWleTtGN^SoYj~bsf4O`Iqk`as+a)Y7I2#-s@~;Rr_%<-qGPp^x)hk&axa4wz zXF{r$4+FQuvZo(p5{jjjvKm67lWZBC^18AZFXeWp*O+@SJmC~%%6a*9hq*&;?8W3M zk*p50c6{C8cUt%fSAy@JkmZUD0iF6+*KR#u$o|3WpYSX-c1xwjt}i$f9BeN*GMs%~ zsO!Sd@Ny>G#lp&e$t?^l3JoTEtS$OyDzhX^Iif4Ta$?pVk%x@Ud``!%+-mP+U|?YI MboFyt=akR{0M3238~^|S diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall1.png b/core/assets-raw/sprites/blocks/walls/scrap-wall1.png index b0be0f27475fe1b499149aad1414f7390067810f..9b12ddf8d979c1082332522cf2b18ee472d62ed8 100644 GIT binary patch delta 313 zcmeBTI>|IavYwfNfx%@-*D(eL2FBtbcPEB*=VV?oFfg#BJNh~@Fl_AS{*%bcz`(#C z;1l9HYyOr^$1ast^f7=z;=IdK85kH?OM?7@|NsC0pW*j5zF-Ch2F?PH$YKTtzQZ8Q zcszea3IhYfCQlc~5DWj-364UC6?l$lT>ig*=e9ldW)m2$F67kqRrfTuDoVzZD zt8Hb+<|Ts9S7yxJT=FyUM(;Frtv{=tdWytsS@YoR$IXn{XAV|)h#aY1^Vl?C0kgIp z*PO}h`%eWc@ZP`Q*u0Nb%jkht@RKyge?kj*pE>&NXxMv#RaL-~PomMI=m5(bSH0!! zYgWb;>mCb|KV{@_(B#VUdw~a6N*r7oP@rdYL*S_Dh5fHKJk7rloo$~mk$LWkH2qB= O?|QoWxvXI(w{!$nUQ$B>F!Pp=*1J!HVc8lWHBsVT8Qyv$+lLgozu zE80Ddn!WtrX~@X;e~MaNkg&Q@{IuV8*T1^Co}cfRF1yn83lqAB| zZ{S_Ty{VB=b-qIiGmp!c1gDSc94rpz@&Ol~2wb>PQzx^b{Y#O^d$uWC#O_~f?^C=r zYvv))}IlM4!&D0TO_&ayQ-L>K$?=qAbS8*^qm?e5Y43E9csvsWd^6?{M zAjh-veP10fv7B)0;XKje@xHlfZ{69{DU2%||8YN1luKiXV$+vK!S_>2BbhW3AA5ne)y5uZgEQBF-%6WPGEHgI#E_-Wa+LS7-RH-NQct0JqweC8yE zPW9Q$F`H^dYL{3%k#2B5QMrA`?fFbQ9JesAAF(&KTzi~xgS^2}#+W1K3^E=Z2`eod l+IICEVKh9kpF!~mmydJaYcAv4Q496f-tb#;#sovQ@V}z_ z)Dsn2_IDOsPh&2d`|;+XyZSM@aT(wK%IExkA1+h&U;dHN;X|vw98yo?4PokMG-+BO u#+bIlWnTj4JcWq-kN4Vs)TDn^`ovIrka_;X31vS(p7V6|b6Mw<&;$TL*L6(* delta 232 zcmdna^pkOdWIY=L14D6D)fWZ^h6A21jv*Dd?p`~{+n~V18ZgbQkc<7pBfevjG6z~s zWPGMb{PI5SZu=+st+&nv1HaRCXZPe?X%RW#wnz9tOUpX>Z!(9Jl^*zTpWqFUW@4Vf z5$^D-P}rgQ1n*2v1;+`=&zL+EUr3t&Z(2UZY#HMg?hzQs$ zi)TK`wB~#<=Yx$qpYC;Mc=R@$o5A+D>8#b?7_AN@o14TQeY3S^*Cf%i4#Et=Nw+$d pD13F57Q7{~^1m2^W5#R#u6NrHNUvYIgMop8!PC{xWt~$(695u%U@`yz diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall4.png b/core/assets-raw/sprites/blocks/walls/scrap-wall4.png index 0cd3df9ca49baa4ee0d03017f116bf614364b724..c67a5055b40e2e7aa765a5efd7ea88eebfe6a0a4 100644 GIT binary patch delta 216 zcmX@c_=0hQL_G^L0|P^2NcwRG1_s9BAa^H*b?0PWGB7Z(q&xaLGB9lH=l+w(%D}+D z8Q>G*I&1!xO~)>kR`mUua`ZPyu)rg-n1O-sFbFdq&tH+kz`&5<>EaloasKRti@XOE zI9&MEFYtE!=8x=8V!X|G>io;o#s`^GrZ9eB3T>3*3RFuv(x8^~AVBK?+aYiNgpyZ` zKT76`mkLDxldb67XchGEU#<9u*a`C%O!Ep5Y0|yP#;38>`q|;28Lcw7srr_Tgfv_>rdCG?0I=ZbypHw3HycHg3Xs1 zzm#w|XS&|6ujyOBruKqCLXM-IM~|JSMcJc>!AE%Gw1BgWJA?!bv)cDDcbq)^gTe~DWM4fJ2XbM diff --git a/core/assets-raw/sprites/blocks/walls/scrap-wall5.png b/core/assets-raw/sprites/blocks/walls/scrap-wall5.png index 0cd3df9ca49baa4ee0d03017f116bf614364b724..ac533dc4d6a22ca774c297a9a080f8f07ad81614 100644 GIT binary patch delta 202 zcmX@cc#Cm@L_G^L0|P^2NcwRG1_s9BAa^H*b?0PWGB7Z(q&xaLGB9lH=l+w(%D}+D z8Q>G*I&1!xO~)>kR`mUua`ZPyu)rg-n1O-sFbFdq&tH+kz`zjY>EaloasKRugS-ri z94;3(Hg9E4`tQ0F@5q} znG?G4?c1uX*UdjKpThNLCEpZ_CvRE~-d62wc*y?kg3Q^k`L9_R7#J8lUHx3vIVCg! E0R6Q|_W%F@ delta 182 zcmcb`c#Ls^L_G%^0|P^GRn->;28Lcw7srr_Tgfv_>rdCG?0I=ZbypHw3HycHg3Xs1 zzm#w|XS&|6ujyOBruKqCLXM-IM~|JSMcJc>!AE%Gw1BgWJA?!bv)cDDcbq)^gTe~DWM4fF+fJA From ceb298ca0b526c5e605dcd97ee99292c20af4948 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 22 Dec 2020 12:52:01 -0500 Subject: [PATCH 36/47] cleanup --- core/src/mindustry/input/DesktopInput.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index 35d1eebcff..801ffdbbd8 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -604,7 +604,6 @@ public class DesktopInput extends InputHandler{ protected void updateMovement(Unit unit){ boolean omni = unit.type.omniMovement; - boolean ground = unit.isGrounded(); float speed = unit.realSpeed(); float xa = Core.input.axis(Binding.move_x); From 7f49f0c6fa516beaf5c712c5095d53dac9bc2091 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 22 Dec 2020 13:41:54 -0500 Subject: [PATCH 37/47] Fixed #4079 --- core/src/mindustry/entities/comp/BuilderComp.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/entities/comp/BuilderComp.java b/core/src/mindustry/entities/comp/BuilderComp.java index 4d4c4751a2..50837c13be 100644 --- a/core/src/mindustry/entities/comp/BuilderComp.java +++ b/core/src/mindustry/entities/comp/BuilderComp.java @@ -77,7 +77,7 @@ abstract class BuilderComp implements Posc, Teamc, Rotc{ Tile tile = world.tile(current.x, current.y); - if(!(tile.block() instanceof ConstructBlock)){ + if(!(tile.build instanceof ConstructBuild cb)){ if(!current.initialized && !current.breaking && Build.validPlace(current.block, team, current.x, current.y, current.rotation)){ boolean hasAll = infinite || current.isRotation(team) || !Structs.contains(current.block.requirements, i -> core != null && !core.items.has(i.item)); @@ -92,7 +92,7 @@ abstract class BuilderComp implements Posc, Teamc, Rotc{ plans.removeFirst(); return; } - }else if(tile.team() != team && tile.team() != Team.derelict){ + }else if((tile.team() != team && tile.team() != Team.derelict) || (!current.breaking && cb.cblock != current.block)){ plans.removeFirst(); return; } From f3d5cb315e1757b93623c0d3f14c9cf6fa7dbac4 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 22 Dec 2020 13:51:11 -0500 Subject: [PATCH 38/47] Cleanup --- annotations/src/main/resources/revisions/alpha/1.json | 1 + annotations/src/main/resources/revisions/arkyid/1.json | 1 + annotations/src/main/resources/revisions/beta/1.json | 1 + annotations/src/main/resources/revisions/block/5.json | 1 + annotations/src/main/resources/revisions/corvus/5.json | 1 + annotations/src/main/resources/revisions/flare/5.json | 1 + annotations/src/main/resources/revisions/gamma/1.json | 1 + annotations/src/main/resources/revisions/mace/5.json | 1 + annotations/src/main/resources/revisions/mega/3.json | 1 + annotations/src/main/resources/revisions/mono/4.json | 1 + annotations/src/main/resources/revisions/nova/3.json | 1 + annotations/src/main/resources/revisions/oct/3.json | 1 + annotations/src/main/resources/revisions/poly/3.json | 1 + annotations/src/main/resources/revisions/pulsar/1.json | 1 + annotations/src/main/resources/revisions/quad/4.json | 1 + annotations/src/main/resources/revisions/quasar/1.json | 1 + annotations/src/main/resources/revisions/risso/5.json | 1 + annotations/src/main/resources/revisions/spiroct/4.json | 1 + annotations/src/main/resources/revisions/toxopid/1.json | 1 + core/src/mindustry/entities/comp/BuilderComp.java | 2 +- 20 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 annotations/src/main/resources/revisions/alpha/1.json create mode 100644 annotations/src/main/resources/revisions/arkyid/1.json create mode 100644 annotations/src/main/resources/revisions/beta/1.json create mode 100644 annotations/src/main/resources/revisions/block/5.json create mode 100644 annotations/src/main/resources/revisions/corvus/5.json create mode 100644 annotations/src/main/resources/revisions/flare/5.json create mode 100644 annotations/src/main/resources/revisions/gamma/1.json create mode 100644 annotations/src/main/resources/revisions/mace/5.json create mode 100644 annotations/src/main/resources/revisions/mega/3.json create mode 100644 annotations/src/main/resources/revisions/mono/4.json create mode 100644 annotations/src/main/resources/revisions/nova/3.json create mode 100644 annotations/src/main/resources/revisions/oct/3.json create mode 100644 annotations/src/main/resources/revisions/poly/3.json create mode 100644 annotations/src/main/resources/revisions/pulsar/1.json create mode 100644 annotations/src/main/resources/revisions/quad/4.json create mode 100644 annotations/src/main/resources/revisions/quasar/1.json create mode 100644 annotations/src/main/resources/revisions/risso/5.json create mode 100644 annotations/src/main/resources/revisions/spiroct/4.json create mode 100644 annotations/src/main/resources/revisions/toxopid/1.json diff --git a/annotations/src/main/resources/revisions/alpha/1.json b/annotations/src/main/resources/revisions/alpha/1.json new file mode 100644 index 0000000000..e7ed56e236 --- /dev/null +++ b/annotations/src/main/resources/revisions/alpha/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/arkyid/1.json b/annotations/src/main/resources/revisions/arkyid/1.json new file mode 100644 index 0000000000..e7ed56e236 --- /dev/null +++ b/annotations/src/main/resources/revisions/arkyid/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/beta/1.json b/annotations/src/main/resources/revisions/beta/1.json new file mode 100644 index 0000000000..e7ed56e236 --- /dev/null +++ b/annotations/src/main/resources/revisions/beta/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/block/5.json b/annotations/src/main/resources/revisions/block/5.json new file mode 100644 index 0000000000..87765783cc --- /dev/null +++ b/annotations/src/main/resources/revisions/block/5.json @@ -0,0 +1 @@ +{version:5,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/corvus/5.json b/annotations/src/main/resources/revisions/corvus/5.json new file mode 100644 index 0000000000..87765783cc --- /dev/null +++ b/annotations/src/main/resources/revisions/corvus/5.json @@ -0,0 +1 @@ +{version:5,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/flare/5.json b/annotations/src/main/resources/revisions/flare/5.json new file mode 100644 index 0000000000..87765783cc --- /dev/null +++ b/annotations/src/main/resources/revisions/flare/5.json @@ -0,0 +1 @@ +{version:5,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/gamma/1.json b/annotations/src/main/resources/revisions/gamma/1.json new file mode 100644 index 0000000000..e7ed56e236 --- /dev/null +++ b/annotations/src/main/resources/revisions/gamma/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/mace/5.json b/annotations/src/main/resources/revisions/mace/5.json new file mode 100644 index 0000000000..cbd09b982e --- /dev/null +++ b/annotations/src/main/resources/revisions/mace/5.json @@ -0,0 +1 @@ +{version:5,fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/mega/3.json b/annotations/src/main/resources/revisions/mega/3.json new file mode 100644 index 0000000000..fc79341e16 --- /dev/null +++ b/annotations/src/main/resources/revisions/mega/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/mono/4.json b/annotations/src/main/resources/revisions/mono/4.json new file mode 100644 index 0000000000..e66b1e3078 --- /dev/null +++ b/annotations/src/main/resources/revisions/mono/4.json @@ -0,0 +1 @@ +{version:4,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/nova/3.json b/annotations/src/main/resources/revisions/nova/3.json new file mode 100644 index 0000000000..0436c073b4 --- /dev/null +++ b/annotations/src/main/resources/revisions/nova/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/oct/3.json b/annotations/src/main/resources/revisions/oct/3.json new file mode 100644 index 0000000000..fc79341e16 --- /dev/null +++ b/annotations/src/main/resources/revisions/oct/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/poly/3.json b/annotations/src/main/resources/revisions/poly/3.json new file mode 100644 index 0000000000..d5d7a806b3 --- /dev/null +++ b/annotations/src/main/resources/revisions/poly/3.json @@ -0,0 +1 @@ +{version:3,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/pulsar/1.json b/annotations/src/main/resources/revisions/pulsar/1.json new file mode 100644 index 0000000000..149ab0822e --- /dev/null +++ b/annotations/src/main/resources/revisions/pulsar/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/quad/4.json b/annotations/src/main/resources/revisions/quad/4.json new file mode 100644 index 0000000000..a5a5d90d5f --- /dev/null +++ b/annotations/src/main/resources/revisions/quad/4.json @@ -0,0 +1 @@ +{version:4,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/quasar/1.json b/annotations/src/main/resources/revisions/quasar/1.json new file mode 100644 index 0000000000..149ab0822e --- /dev/null +++ b/annotations/src/main/resources/revisions/quasar/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/risso/5.json b/annotations/src/main/resources/revisions/risso/5.json new file mode 100644 index 0000000000..87765783cc --- /dev/null +++ b/annotations/src/main/resources/revisions/risso/5.json @@ -0,0 +1 @@ +{version:5,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/spiroct/4.json b/annotations/src/main/resources/revisions/spiroct/4.json new file mode 100644 index 0000000000..e66b1e3078 --- /dev/null +++ b/annotations/src/main/resources/revisions/spiroct/4.json @@ -0,0 +1 @@ +{version:4,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/toxopid/1.json b/annotations/src/main/resources/revisions/toxopid/1.json new file mode 100644 index 0000000000..e7ed56e236 --- /dev/null +++ b/annotations/src/main/resources/revisions/toxopid/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:updateBuilding,type:boolean},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/core/src/mindustry/entities/comp/BuilderComp.java b/core/src/mindustry/entities/comp/BuilderComp.java index 50837c13be..9ebb5a01ad 100644 --- a/core/src/mindustry/entities/comp/BuilderComp.java +++ b/core/src/mindustry/entities/comp/BuilderComp.java @@ -33,7 +33,7 @@ abstract class BuilderComp implements Posc, Teamc, Rotc{ @Import Team team; @SyncLocal Queue plans = new Queue<>(1); - @SyncLocal transient boolean updateBuilding = true; + @SyncLocal boolean updateBuilding = true; public boolean canBuild(){ return type.buildSpeed > 0; From e1125a38da1594320f49087e5fe816d40e6241fa Mon Sep 17 00:00:00 2001 From: Patrick 'Quezler' Mounier Date: Tue, 22 Dec 2020 20:14:17 +0100 Subject: [PATCH 39/47] Update servers_be.json (#4081) --- servers_be.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/servers_be.json b/servers_be.json index 307f108b4f..a363d94b30 100644 --- a/servers_be.json +++ b/servers_be.json @@ -10,8 +10,5 @@ }, { "address": "mindustry.pl:6660" - }, - { - "address": "be.wayzer.cf" } ] From a44f3c379f0ef6bb7230876186d06e4b4adf36de Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 22 Dec 2020 14:02:19 -0500 Subject: [PATCH 40/47] Ammo/shot display --- core/assets/bundles/bundle.properties | 2 ++ .../mindustry/world/blocks/defense/turrets/Turret.java | 1 + .../mindustry/world/blocks/production/SolidPump.java | 2 +- core/src/mindustry/world/meta/Stat.java | 1 + core/src/mindustry/world/meta/StatUnit.java | 1 + core/src/mindustry/world/meta/Stats.java | 10 +++++----- .../world/meta/values/FloorEfficiencyValue.java | 6 ++++-- 7 files changed, 15 insertions(+), 8 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 7842607c37..0c6ea87497 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -699,6 +699,7 @@ stat.commandlimit = Command Limit stat.abilities = Abilities stat.canboost = Can Boost stat.flying = Flying +stat.ammouse = Ammo Use ability.forcefield = Force Field ability.repairfield = Repair Field @@ -766,6 +767,7 @@ unit.items = items unit.thousands = k unit.millions = mil unit.billions = b +unit.pershot = /shot category.purpose = Purpose category.general = General category.power = Power diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 0a00cf9b8a..044f583722 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -113,6 +113,7 @@ public class Turret extends ReloadTurret{ stats.add(Stat.reload, 60f / reloadTime * (alternate ? 1 : shots), StatUnit.none); stats.add(Stat.targetsAir, targetAir); stats.add(Stat.targetsGround, targetGround); + if(ammoPerShot != 1) stats.add(Stat.ammoUse, ammoPerShot, StatUnit.perShot); } @Override diff --git a/core/src/mindustry/world/blocks/production/SolidPump.java b/core/src/mindustry/world/blocks/production/SolidPump.java index d49a6499ac..78a423dcec 100644 --- a/core/src/mindustry/world/blocks/production/SolidPump.java +++ b/core/src/mindustry/world/blocks/production/SolidPump.java @@ -56,7 +56,7 @@ public class SolidPump extends Pump{ stats.remove(Stat.output); stats.add(Stat.output, result, 60f * pumpAmount, true); if(attribute != null){ - stats.add(baseEfficiency > 0.0001f ? Stat.affinities : Stat.tiles, attribute); + stats.add(baseEfficiency > 0.0001f ? Stat.affinities : Stat.tiles, attribute, floating, 1f, baseEfficiency <= 0.001f); } } diff --git a/core/src/mindustry/world/meta/Stat.java b/core/src/mindustry/world/meta/Stat.java index 8f1d23820b..2f933bb46a 100644 --- a/core/src/mindustry/world/meta/Stat.java +++ b/core/src/mindustry/world/meta/Stat.java @@ -70,6 +70,7 @@ public enum Stat{ targetsGround(StatCat.function), damage(StatCat.function), ammo(StatCat.function), + ammoUse(StatCat.function), shieldHealth(StatCat.function), cooldownTime(StatCat.function), diff --git a/core/src/mindustry/world/meta/StatUnit.java b/core/src/mindustry/world/meta/StatUnit.java index b2a866be3e..f2d1ba07c3 100644 --- a/core/src/mindustry/world/meta/StatUnit.java +++ b/core/src/mindustry/world/meta/StatUnit.java @@ -20,6 +20,7 @@ public enum StatUnit{ minutes, perSecond, perMinute, + perShot, timesSpeed(false), percent(false), shieldHealth, diff --git a/core/src/mindustry/world/meta/Stats.java b/core/src/mindustry/world/meta/Stats.java index 0b1bf192da..39d887f188 100644 --- a/core/src/mindustry/world/meta/Stats.java +++ b/core/src/mindustry/world/meta/Stats.java @@ -55,22 +55,22 @@ public class Stats{ } public void add(Stat stat, Attribute attr){ - add(stat, attr, false, 1f); + add(stat, attr, false, 1f, false); } public void add(Stat stat, Attribute attr, float scale){ - add(stat, attr, false, scale); + add(stat, attr, false, scale, false); } public void add(Stat stat, Attribute attr, boolean floating){ - add(stat, attr, floating, 1f); + add(stat, attr, floating, 1f, false); } - public void add(Stat stat, Attribute attr, boolean floating, float scale){ + public void add(Stat stat, Attribute attr, boolean floating, float scale, boolean startZero){ for(var block : Vars.content.blocks() .select(block -> block instanceof Floor f && f.attributes.get(attr) != 0 && !(f.isLiquid && !floating)) .as().with(s -> s.sort(f -> f.attributes.get(attr)))){ - add(stat, new FloorEfficiencyValue(block, block.attributes.get(attr) * scale)); + add(stat, new FloorEfficiencyValue(block, block.attributes.get(attr) * scale, startZero)); } } diff --git a/core/src/mindustry/world/meta/values/FloorEfficiencyValue.java b/core/src/mindustry/world/meta/values/FloorEfficiencyValue.java index 619598a230..ad32ecf453 100644 --- a/core/src/mindustry/world/meta/values/FloorEfficiencyValue.java +++ b/core/src/mindustry/world/meta/values/FloorEfficiencyValue.java @@ -10,16 +10,18 @@ import mindustry.world.meta.*; public class FloorEfficiencyValue implements StatValue{ private final Floor floor; private final float multiplier; + private final boolean startZero; - public FloorEfficiencyValue(Floor floor, float multiplier){ + public FloorEfficiencyValue(Floor floor, float multiplier, boolean startZero){ this.floor = floor; this.multiplier = multiplier; + this.startZero = startZero; } @Override public void display(Table table){ table.stack(new Image(floor.icon(Cicon.medium)).setScaling(Scaling.fit), new Table(t -> { - t.top().right().add((multiplier < 0 ? "[scarlet]" : "[accent]+") + (int)((multiplier) * 100) + "%").style(Styles.outlineLabel); + t.top().right().add((multiplier < 0 ? "[scarlet]" : startZero ? "[accent]" : "[accent]+") + (int)((multiplier) * 100) + "%").style(Styles.outlineLabel); })); } } From 71488313e1eaedcaa5e0daab25b542a5732266ee Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 22 Dec 2020 20:13:34 -0500 Subject: [PATCH 41/47] Fixed #4082 --- core/src/mindustry/core/Control.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index f4f3dc75df..8dd487034b 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -351,7 +351,7 @@ public class Control implements ApplicationListener, Loadable{ if(tile != null){ tile.setBlock(content.block(plan.block), state.rules.waveTeam, plan.rotation); if(plan.config != null && tile.build != null){ - tile.build.configure(plan.config); + tile.build.configureAny(plan.config); } } } From 9d740e1e37b3d3e2e6a89defe8d150a020e2ca88 Mon Sep 17 00:00:00 2001 From: Patrick 'Quezler' Mounier Date: Wed, 23 Dec 2020 15:39:04 +0100 Subject: [PATCH 42/47] Rebrand power infinite as power source (#4088) --- core/assets/bundles/bundle.properties | 2 +- core/src/mindustry/content/Blocks.java | 1 + core/src/mindustry/world/blocks/sandbox/PowerSource.java | 4 +++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 0c6ea87497..ea7bd28dd1 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1166,7 +1166,7 @@ block.item-void.name = Item Void block.liquid-source.name = Liquid Source block.liquid-void.name = Liquid Void block.power-void.name = Power Void -block.power-source.name = Power Infinite +block.power-source.name = Power Source block.unloader.name = Unloader block.vault.name = Vault block.wave.name = Wave diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index eecae2782a..7bc2e18679 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1992,6 +1992,7 @@ public class Blocks implements ContentList{ powerSource = new PowerSource("power-source"){{ requirements(Category.power, BuildVisibility.sandboxOnly, with()); + powerProduction = 10000f / 60f; alwaysUnlocked = true; }}; diff --git a/core/src/mindustry/world/blocks/sandbox/PowerSource.java b/core/src/mindustry/world/blocks/sandbox/PowerSource.java index fbc24f5ea7..b392ce8813 100644 --- a/core/src/mindustry/world/blocks/sandbox/PowerSource.java +++ b/core/src/mindustry/world/blocks/sandbox/PowerSource.java @@ -4,6 +4,8 @@ import mindustry.world.blocks.power.*; public class PowerSource extends PowerNode{ + public float powerProduction = 10000f; + public PowerSource(String name){ super(name); maxNodes = 100; @@ -14,7 +16,7 @@ public class PowerSource extends PowerNode{ public class PowerSourceBuild extends PowerNodeBuild{ @Override public float getPowerProduction(){ - return enabled ? 10000f : 0f; + return enabled ? powerProduction : 0f; } } From d144e9c91c9c2b8276f24421ec7b2546ac034479 Mon Sep 17 00:00:00 2001 From: Patrick 'Quezler' Mounier Date: Wed, 23 Dec 2020 15:39:29 +0100 Subject: [PATCH 43/47] Allow plastanium conveyor to be unloaded (#4087) --- .../world/blocks/distribution/StackConveyor.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/src/mindustry/world/blocks/distribution/StackConveyor.java b/core/src/mindustry/world/blocks/distribution/StackConveyor.java index 4d6ca5d614..4b30d7e82b 100644 --- a/core/src/mindustry/world/blocks/distribution/StackConveyor.java +++ b/core/src/mindustry/world/blocks/distribution/StackConveyor.java @@ -29,7 +29,7 @@ public class StackConveyor extends Block implements Autotiler{ public float speed = 0f; public boolean splitOut = true; - /** (minimum) amount of loading docks needed to fill a line */ + /** (minimum) amount of loading docks needed to fill a line. */ public float recharge = 2f; public Effect loadEffect = Fx.plasticburn; public Effect unloadEffect = Fx.plasticburn; @@ -46,7 +46,6 @@ public class StackConveyor extends Block implements Autotiler{ ambientSound = Sounds.conveyor; ambientSoundVolume = 0.004f; - unloadable = false; } @Override @@ -269,6 +268,11 @@ public class StackConveyor extends Block implements Autotiler{ } } + @Override + public void itemTaken(Item item){ + if(items.empty()) poofOut(); + } + @Override public boolean acceptItem(Building source, Item item){ if(this == source) return true; // player threw items From 1a14860b62e3631c9bf4a60199738cf8d5724d47 Mon Sep 17 00:00:00 2001 From: Sunny Kim <58885089+sk7725@users.noreply.github.com> Date: Wed, 23 Dec 2020 23:40:00 +0900 Subject: [PATCH 44/47] bump editor only blocks foward (#4084) --- core/src/mindustry/editor/MapEditorDialog.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/mindustry/editor/MapEditorDialog.java b/core/src/mindustry/editor/MapEditorDialog.java index 91927a0630..e73442497d 100644 --- a/core/src/mindustry/editor/MapEditorDialog.java +++ b/core/src/mindustry/editor/MapEditorDialog.java @@ -700,6 +700,8 @@ public class MapEditorDialog extends Dialog implements Disposable{ if(core != 0) return core; int synth = Boolean.compare(b1.synthetic(), b2.synthetic()); if(synth != 0) return synth; + int editorVis = Boolean.compare(b1.buildVisibility == BuildVisibility.editorOnly, b2.buildVisibility == BuildVisibility.editorOnly); + if(editorVis != 0) return editorVis; int ore = Boolean.compare(b1 instanceof OverlayFloor, b2 instanceof OverlayFloor); if(ore != 0) return ore; return Integer.compare(b1.id, b2.id); From 986caa857e197471addb8d2b1dbbae1e72c55ca7 Mon Sep 17 00:00:00 2001 From: Sunny Kim <58885089+sk7725@users.noreply.github.com> Date: Wed, 23 Dec 2020 23:41:43 +0900 Subject: [PATCH 45/47] public SettingsTables for mod settings (#4085) --- core/src/mindustry/ui/dialogs/SettingsMenuDialog.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index 43e5c9a8fe..94465167bf 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -32,9 +32,9 @@ import static mindustry.Vars.net; import static mindustry.Vars.*; public class SettingsMenuDialog extends SettingsDialog{ - private SettingsTable graphics; - private SettingsTable game; - private SettingsTable sound; + public SettingsTable graphics; + public SettingsTable game; + public SettingsTable sound; private Table prefs; private Table menu; From a21f79ac6adddbc8a43d301c5277e0ab22ebe199 Mon Sep 17 00:00:00 2001 From: MEEP of Faith <54301439+MEEPofFaith@users.noreply.github.com> Date: Wed, 23 Dec 2020 07:29:26 -0800 Subject: [PATCH 46/47] Draw size independent from puddle size. (#3826) * Draw size independent from puddle size. * Apply change to Bullets --- core/src/mindustry/content/Bullets.java | 4 ++++ core/src/mindustry/entities/bullet/LiquidBulletType.java | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/core/src/mindustry/content/Bullets.java b/core/src/mindustry/content/Bullets.java index 30fc1bfe79..d1b693c1f3 100644 --- a/core/src/mindustry/content/Bullets.java +++ b/core/src/mindustry/content/Bullets.java @@ -465,6 +465,7 @@ public class Bullets implements ContentList{ speed = 4f; knockback = 1.7f; puddleSize = 8f; + orbSize = 8f; drag = 0.001f; ammoMultiplier = 0.4f; statusDuration = 60f * 4f; @@ -476,6 +477,7 @@ public class Bullets implements ContentList{ speed = 4f; knockback = 1.3f; puddleSize = 8f; + orbSize = 8f; drag = 0.001f; ammoMultiplier = 0.4f; statusDuration = 60f * 4f; @@ -487,6 +489,7 @@ public class Bullets implements ContentList{ speed = 4f; knockback = 1.3f; puddleSize = 8f; + orbSize = 8f; damage = 4.75f; drag = 0.001f; ammoMultiplier = 0.4f; @@ -498,6 +501,7 @@ public class Bullets implements ContentList{ speed = 4f; knockback = 1.3f; puddleSize = 8f; + orbSize = 8f; drag = 0.001f; ammoMultiplier = 0.4f; statusDuration = 60f * 4f; diff --git a/core/src/mindustry/entities/bullet/LiquidBulletType.java b/core/src/mindustry/entities/bullet/LiquidBulletType.java index 5da33f95e0..68721bd2fd 100644 --- a/core/src/mindustry/entities/bullet/LiquidBulletType.java +++ b/core/src/mindustry/entities/bullet/LiquidBulletType.java @@ -15,6 +15,7 @@ import static mindustry.Vars.*; public class LiquidBulletType extends BulletType{ public Liquid liquid; public float puddleSize = 6f; + public float orbSize = 6f; public LiquidBulletType(@Nullable Liquid liquid){ super(3.5f, 0); @@ -64,7 +65,7 @@ public class LiquidBulletType extends BulletType{ public void draw(Bullet b){ Draw.color(liquid.color, Color.white, b.fout() / 100f); - Fill.circle(b.x, b.y, puddleSize / 2); + Fill.circle(b.x, b.y, orbSize / 2); } @Override From 715d94967ed15c4277912a56eed52cb99b68e4c1 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 23 Dec 2020 10:51:24 -0500 Subject: [PATCH 47/47] Cleanup --- core/src/mindustry/content/Bullets.java | 8 ++++---- core/src/mindustry/entities/bullet/LiquidBulletType.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/mindustry/content/Bullets.java b/core/src/mindustry/content/Bullets.java index d1b693c1f3..dbed9cc7ac 100644 --- a/core/src/mindustry/content/Bullets.java +++ b/core/src/mindustry/content/Bullets.java @@ -465,7 +465,7 @@ public class Bullets implements ContentList{ speed = 4f; knockback = 1.7f; puddleSize = 8f; - orbSize = 8f; + orbSize = 4f; drag = 0.001f; ammoMultiplier = 0.4f; statusDuration = 60f * 4f; @@ -477,7 +477,7 @@ public class Bullets implements ContentList{ speed = 4f; knockback = 1.3f; puddleSize = 8f; - orbSize = 8f; + orbSize = 4f; drag = 0.001f; ammoMultiplier = 0.4f; statusDuration = 60f * 4f; @@ -489,7 +489,7 @@ public class Bullets implements ContentList{ speed = 4f; knockback = 1.3f; puddleSize = 8f; - orbSize = 8f; + orbSize = 4f; damage = 4.75f; drag = 0.001f; ammoMultiplier = 0.4f; @@ -501,7 +501,7 @@ public class Bullets implements ContentList{ speed = 4f; knockback = 1.3f; puddleSize = 8f; - orbSize = 8f; + orbSize = 4f; drag = 0.001f; ammoMultiplier = 0.4f; statusDuration = 60f * 4f; diff --git a/core/src/mindustry/entities/bullet/LiquidBulletType.java b/core/src/mindustry/entities/bullet/LiquidBulletType.java index 68721bd2fd..e99b7afefc 100644 --- a/core/src/mindustry/entities/bullet/LiquidBulletType.java +++ b/core/src/mindustry/entities/bullet/LiquidBulletType.java @@ -15,7 +15,7 @@ import static mindustry.Vars.*; public class LiquidBulletType extends BulletType{ public Liquid liquid; public float puddleSize = 6f; - public float orbSize = 6f; + public float orbSize = 3f; public LiquidBulletType(@Nullable Liquid liquid){ super(3.5f, 0); @@ -65,7 +65,7 @@ public class LiquidBulletType extends BulletType{ public void draw(Bullet b){ Draw.color(liquid.color, Color.white, b.fout() / 100f); - Fill.circle(b.x, b.y, orbSize / 2); + Fill.circle(b.x, b.y, orbSize); } @Override