diff --git a/core/assets-raw/sprites/blocks/payload/payload-mass-driver-base.png b/core/assets-raw/sprites/blocks/payload/payload-mass-driver-base.png new file mode 100644 index 0000000000..fb55b6eb6f Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-mass-driver-base.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-mass-driver-cap.png b/core/assets-raw/sprites/blocks/payload/payload-mass-driver-cap.png new file mode 100644 index 0000000000..22537889ae Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-mass-driver-cap.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-mass-driver-in.png b/core/assets-raw/sprites/blocks/payload/payload-mass-driver-in.png new file mode 100644 index 0000000000..f8427f0ba9 Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-mass-driver-in.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-mass-driver-left.png b/core/assets-raw/sprites/blocks/payload/payload-mass-driver-left.png new file mode 100644 index 0000000000..f106c50bec Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-mass-driver-left.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-mass-driver-out.png b/core/assets-raw/sprites/blocks/payload/payload-mass-driver-out.png new file mode 100644 index 0000000000..afb61bf138 Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-mass-driver-out.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-mass-driver-right.png b/core/assets-raw/sprites/blocks/payload/payload-mass-driver-right.png new file mode 100644 index 0000000000..868968adef Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-mass-driver-right.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-mass-driver-top.png b/core/assets-raw/sprites/blocks/payload/payload-mass-driver-top.png new file mode 100644 index 0000000000..84b064a4f1 Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-mass-driver-top.png differ diff --git a/core/assets-raw/sprites/blocks/payload/payload-mass-driver.png b/core/assets-raw/sprites/blocks/payload/payload-mass-driver.png new file mode 100644 index 0000000000..5346bea41b Binary files /dev/null and b/core/assets-raw/sprites/blocks/payload/payload-mass-driver.png differ diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index e400f992cd..07f62b867d 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -535,3 +535,4 @@ 63168=reinforced-payload-router|block-reinforced-payload-router-ui 63167=disperse|block-disperse-ui 63166=large-shield-projector|block-large-shield-projector-ui +63165=payload-mass-driver|block-payload-mass-driver-ui diff --git a/core/assets/logicids.dat b/core/assets/logicids.dat index 6448d9c3a3..57b036c98a 100644 Binary files a/core/assets/logicids.dat and b/core/assets/logicids.dat differ diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 1936d7467f..5f73b84936 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -3345,7 +3345,7 @@ public class Blocks{ }}); parts.add(new RegionPart("-mid"){{ under = true; - moveY = -1f; + moveY = -1.5f; progress = PartProgress.reload; heatProgress = PartProgress.reload.add(0.25f).min(PartProgress.warmup); heatColor = Color.sky.cpy().a(0.9f); @@ -3384,7 +3384,7 @@ public class Blocks{ range = 270f; size = 4; - limitRange(4f); + limitRange(0f); }}; //endregion @@ -3541,7 +3541,6 @@ public class Blocks{ tankAssembler = new UnitAssembler("tank-assembler"){{ requirements(Category.units, with(Items.graphite, 600, Items.beryllium, 600, Items.oxide, 200, Items.tungsten, 500)); size = 5; - //TODO requirements? plans.add(new AssemblerUnitPlan(UnitTypes.vanquish, 60f * 50f, BlockStack.list(Blocks.tungstenWallLarge, 6, Blocks.duct, 14, Blocks.cliffCrusher, 12))); consumes.power(3f); areaSize = 13; @@ -3619,7 +3618,6 @@ public class Blocks{ }}; //TODO - if(false) payloadMassDriver = new PayloadMassDriver("payload-mass-driver"){{ requirements(Category.units, with(Items.tungsten, 120, Items.silicon, 120, Items.oxide, 60)); size = 3; diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 334837d1f6..dd15341f86 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -3126,7 +3126,7 @@ public class UnitTypes{ //TODO bad name evoke = new ErekirUnitType("evoke"){{ - coreUnitDock = false; + coreUnitDock = true; defaultController = BuilderAI::new; isCounted = false; envDisabled = 0; @@ -3183,7 +3183,7 @@ public class UnitTypes{ }}; incite = new ErekirUnitType("incite"){{ - coreUnitDock = false; + coreUnitDock = true; defaultController = BuilderAI::new; isCounted = false; envDisabled = 0; @@ -3252,7 +3252,7 @@ public class UnitTypes{ }}; emanate = new ErekirUnitType("emanate"){{ - coreUnitDock = false; + coreUnitDock = true; defaultController = BuilderAI::new; isCounted = false; envDisabled = 0; diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index e9826d8e83..a21fbb4b8a 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -462,16 +462,15 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ player.justSwitchTo = unit; } - //TODO range check for docking + //TODO range check for docking? var before = player.unit(); player.unit(unit); - //TODO test this in multiplayer - if(unit.type.coreUnitDock && before != null && !before.isNull()){ + if(before != null && !before.isNull()){ if(before.spawnedByCore){ unit.dockedType = before.type; - }else if(before.dockedType != null){ + }else if(before.dockedType != null && before.dockedType.coreUnitDock){ //direct dock transfer??? unit.dockedType = before.dockedType; } @@ -494,7 +493,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ if(player == null) return; //TODO test this in multiplayer - if(!player.dead() && player.unit().type.coreUnitDock && !player.unit().spawnedByCore){ + if(!player.dead() && !player.unit().spawnedByCore && player.unit().dockedType != null && player.unit().dockedType.coreUnitDock){ //TODO respawn ON the unit, with an animation? var docked = player.unit().dockedType; if(docked == null){ diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index b59e87c3a9..8d66221244 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -69,7 +69,7 @@ public class UnitType extends UnlockableContent{ public boolean logicControllable = true; public boolean playerControllable = true; public boolean allowedInPayloads = true; - /** TODO If true, core units need to "dock" to this unit to work, and can un-dock at the unit instead of respawning at core. */ + /** TODO If true, core units will re-appear on this unit when respawning. */ public boolean coreUnitDock = false; public boolean createWreck = true; public boolean createScorch = true; diff --git a/core/src/mindustry/type/unit/ErekirUnitType.java b/core/src/mindustry/type/unit/ErekirUnitType.java index 099ab679b8..f53d5e22d6 100644 --- a/core/src/mindustry/type/unit/ErekirUnitType.java +++ b/core/src/mindustry/type/unit/ErekirUnitType.java @@ -13,7 +13,6 @@ public class ErekirUnitType extends UnitType{ commandLimit = 0; outlineColor = Pal.darkOutline; envDisabled = Env.space; - coreUnitDock = true; unitBasedDefaultController = u -> !playerControllable || u.team.isAI() ? defaultController.get() : new CommandAI(); } } diff --git a/core/src/mindustry/world/meta/Stats.java b/core/src/mindustry/world/meta/Stats.java index 742400989f..7056c6fa2c 100644 --- a/core/src/mindustry/world/meta/Stats.java +++ b/core/src/mindustry/world/meta/Stats.java @@ -14,8 +14,7 @@ public class Stats{ /** Production time period in ticks. Used for crafters. **/ public float timePeriod = -1; - @Nullable - private OrderedMap>> map; + private @Nullable OrderedMap>> map; private boolean dirty; /** Adds a single float value with this stat, formatted to 2 decimal places. */ @@ -91,8 +90,8 @@ public class Stats{ public void remove(Stat stat){ if(map == null) map = new OrderedMap<>(); - if(!map.containsKey(stat.category) || !map.get(stat.category).containsKey(stat)){ - throw new RuntimeException("No stat entry found: \"" + stat + "\" in block."); + if(!map.containsKey(stat.category)){ + return; } map.get(stat.category).remove(stat);