From 7bfdbaabe746ae3aef399d43ea8b4563436b90c5 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 30 Sep 2019 19:40:08 -0400 Subject: [PATCH] Int configuration / Drone rebuilding --- core/src/io/anuke/mindustry/core/Logic.java | 6 ++- .../io/anuke/mindustry/entities/Units.java | 1 + .../entities/traits/BuilderTrait.java | 14 ++++- .../mindustry/entities/type/TileEntity.java | 8 ++- .../entities/type/base/BuilderDrone.java | 40 +++++++------- core/src/io/anuke/mindustry/game/Teams.java | 21 +++++--- .../anuke/mindustry/input/InputHandler.java | 5 +- core/src/io/anuke/mindustry/io/JsonIO.java | 5 +- .../io/anuke/mindustry/io/SaveVersion.java | 14 ----- core/src/io/anuke/mindustry/world/Block.java | 12 ++++- core/src/io/anuke/mindustry/world/Tile.java | 6 +++ .../mindustry/world/blocks/BuildBlock.java | 6 ++- .../world/blocks/distribution/ItemBridge.java | 38 +++++++------ .../world/blocks/distribution/MassDriver.java | 17 ++++-- .../world/blocks/distribution/Sorter.java | 35 +++++++----- .../world/blocks/power/PowerNode.java | 53 +++++++++++++++---- .../world/blocks/sandbox/ItemSource.java | 43 +++++++-------- .../world/blocks/sandbox/LiquidSource.java | 49 +++++++++-------- .../world/blocks/storage/Unloader.java | 44 +++++++-------- .../world/blocks/units/CommandCenter.java | 18 ++++--- .../metadata/android/en-US/changelogs/89.txt | 15 ++++++ .../metadata/android/en-US/changelogs/93.txt | 11 ++++ .../metadata/android/en-US/changelogs/94.txt | 8 +++ .../metadata/android/en-US/changelogs/95.txt | 12 +++++ 24 files changed, 300 insertions(+), 181 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/89.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/93.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/94.txt create mode 100755 fastlane/metadata/android/en-US/changelogs/95.txt diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index dae32c56a1..3894608a9f 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -43,7 +43,9 @@ public class Logic implements ApplicationListener{ //blocks that get broken are appended to the team's broken block queue Tile tile = event.tile; Block block = tile.block(); - if(block instanceof BuildBlock){ + if(tile.entity == null) return; + if(block instanceof BuildBlock ){ + BuildEntity entity = tile.entity(); //update block to reflect the fact that something was being constructed @@ -56,7 +58,7 @@ public class Logic implements ApplicationListener{ } TeamData data = state.teams.get(tile.getTeam()); - data.brokenBlocks.addFirst(BrokenBlock.get(tile.x, tile.y, tile.rotation(), block.id)); + data.brokenBlocks.addFirst(new BrokenBlock(tile.x, tile.y, tile.rotation(), block.id, tile.entity.config())); }); } diff --git a/core/src/io/anuke/mindustry/entities/Units.java b/core/src/io/anuke/mindustry/entities/Units.java index a624282042..af3d3f4fe7 100644 --- a/core/src/io/anuke/mindustry/entities/Units.java +++ b/core/src/io/anuke/mindustry/entities/Units.java @@ -20,6 +20,7 @@ public class Units{ private static float cdist; private static boolean boolResult; + /** @return whether this player can interact with a specific tile. if either of these are null, returns true.*/ public static boolean canInteract(Player player, Tile tile){ return player == null || tile == null || tile.interactable(player.getTeam()); } diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index 6975a3bf2a..79069ca5b4 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -104,7 +104,11 @@ public interface BuilderTrait extends Entity, TeamTrait{ if(current.breaking){ entity.deconstruct(unit, core, 1f / entity.buildCost * Time.delta() * getBuildPower(tile) * state.rules.buildSpeedMultiplier); }else{ - entity.construct(unit, core, 1f / entity.buildCost * Time.delta() * getBuildPower(tile) * state.rules.buildSpeedMultiplier); + if(entity.construct(unit, core, 1f / entity.buildCost * Time.delta() * getBuildPower(tile) * state.rules.buildSpeedMultiplier)){ + if(current.hasConfig){ + Call.onTileConfig(null, tile, current.config); + } + } } current.progress = entity.progress; @@ -257,6 +261,8 @@ public interface BuilderTrait extends Entity, TeamTrait{ public final int x, y, rotation; public final Block block; public final boolean breaking; + public boolean hasConfig; + public int config; public float progress; public boolean initialized; @@ -279,6 +285,12 @@ public interface BuilderTrait extends Entity, TeamTrait{ this.breaking = true; } + public BuildRequest configure(int config){ + this.config = config; + this.hasConfig = true; + return this; + } + public Tile tile(){ return world.tile(x, y); } diff --git a/core/src/io/anuke/mindustry/entities/type/TileEntity.java b/core/src/io/anuke/mindustry/entities/type/TileEntity.java index 87511f2d08..5fa2ea9aae 100644 --- a/core/src/io/anuke/mindustry/entities/type/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/type/TileEntity.java @@ -43,8 +43,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ private boolean dead = false; private boolean sleeping; private float sleepTime; - private @Nullable - SoundLoop sound; + private @Nullable SoundLoop sound; @Remote(called = Loc.server, unreliable = true) public static void onTileDamage(Tile tile, float health){ @@ -232,6 +231,11 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ return proximity; } + /** Tile configuration. Defaults to 0. Used for block rebuilding. */ + public int config(){ + return 0; + } + @Override public void removed(){ if(sound != null){ diff --git a/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java b/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java index 21649dbf07..fc0cd189f2 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java +++ b/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java @@ -1,23 +1,19 @@ package io.anuke.mindustry.entities.type.base; -import io.anuke.arc.Core; -import io.anuke.arc.Events; -import io.anuke.arc.collection.IntIntMap; -import io.anuke.arc.collection.Queue; -import io.anuke.arc.math.Mathf; +import io.anuke.arc.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.math.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.entities.EntityGroup; -import io.anuke.mindustry.entities.traits.BuilderTrait; -import io.anuke.mindustry.entities.traits.TargetTrait; +import io.anuke.mindustry.*; +import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.units.UnitState; -import io.anuke.mindustry.game.EventType.BuildSelectEvent; -import io.anuke.mindustry.game.Teams.TeamData; -import io.anuke.mindustry.gen.BrokenBlock; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.BuildBlock; -import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity; +import io.anuke.mindustry.entities.units.*; +import io.anuke.mindustry.game.EventType.*; +import io.anuke.mindustry.game.Teams.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.*; +import io.anuke.mindustry.world.blocks.BuildBlock.*; import java.io.*; @@ -45,7 +41,7 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ BuildEntity entity = (BuildEntity)target; TileEntity core = getClosestCore(); - if(isBuilding() && entity == null && isRebuild()){ + if(isBuilding() && entity == null && canRebuild()){ target = world.tile(buildRequest().x, buildRequest().y); circle(placeDistance * 0.7f); target = null; @@ -151,9 +147,9 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ } } - boolean isRebuild(){ + boolean canRebuild(){ //disabled until further notice, reason being that it's too annoying when playing enemies and too broken for ally use - return false; //Vars.state.rules.enemyCheat && team == waveTeam; + return timer.get(timerTarget, 80) && Units.closestEnemy(getTeam(), x, y, 100f, u -> !(u instanceof BaseDrone)) == null; } @Override @@ -188,12 +184,12 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ } } - if(isRebuild() && !isBuilding()){ + if(canRebuild() && !isBuilding()){ TeamData data = Vars.state.teams.get(team); if(!data.brokenBlocks.isEmpty()){ - long block = data.brokenBlocks.removeLast(); + BrokenBlock block = data.brokenBlocks.removeLast(); - placeQueue.addFirst(new BuildRequest(BrokenBlock.x(block), BrokenBlock.y(block), BrokenBlock.rotation(block), content.block(BrokenBlock.block(block)))); + placeQueue.addFirst(new BuildRequest(block.x, block.y, block.rotation, content.block(block.block)).configure(block.config)); setState(build); } } diff --git a/core/src/io/anuke/mindustry/game/Teams.java b/core/src/io/anuke/mindustry/game/Teams.java index be4d1a7e2c..45f5daf070 100644 --- a/core/src/io/anuke/mindustry/game/Teams.java +++ b/core/src/io/anuke/mindustry/game/Teams.java @@ -1,9 +1,8 @@ package io.anuke.mindustry.game; -import io.anuke.annotations.Annotations.Struct; import io.anuke.arc.collection.*; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.*; +import io.anuke.mindustry.world.*; /** Class for various team-based utilities. */ public class Teams{ @@ -52,7 +51,7 @@ public class Teams{ public final ObjectSet cores = new ObjectSet<>(); public final EnumSet enemies; public final Team team; - public LongQueue brokenBlocks = new LongQueue(); + public Queue brokenBlocks = new Queue<>(); public TeamData(Team team, EnumSet enemies){ this.team = team; @@ -62,8 +61,16 @@ public class Teams{ /** Represents a block made by this team that was destroyed somewhere on the map. * This does not include deconstructed blocks.*/ - @Struct - public class BrokenBlockStruct{ - public short x, y, rotation, block; + public static class BrokenBlock{ + public final short x, y, rotation, block; + public final int config; + + public BrokenBlock(short x, short y, short rotation, short block, int config){ + this.x = x; + this.y = y; + this.rotation = rotation; + this.block = block; + this.config = config; + } } } diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/io/anuke/mindustry/input/InputHandler.java index 97b99cc75a..4caaf25677 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/io/anuke/mindustry/input/InputHandler.java @@ -128,11 +128,10 @@ public abstract class InputHandler implements InputProcessor{ tile.block().tapped(tile, player); } - @Remote(targets = Loc.both, called = Loc.server, forward = true) + @Remote(targets = Loc.both, called = Loc.both, forward = true) public static void onTileConfig(Player player, Tile tile, int value){ if(tile == null || !Units.canInteract(player, tile)) return; - //TODO - //tile.block().cofigured(tile, player, value); + tile.block().configured(tile, player, value); } public OverlayFragment getFrag(){ diff --git a/core/src/io/anuke/mindustry/io/JsonIO.java b/core/src/io/anuke/mindustry/io/JsonIO.java index 15f1e18476..7e0b8f640c 100644 --- a/core/src/io/anuke/mindustry/io/JsonIO.java +++ b/core/src/io/anuke/mindustry/io/JsonIO.java @@ -1,12 +1,10 @@ package io.anuke.mindustry.io; -import io.anuke.arc.collection.*; import io.anuke.arc.util.serialization.*; import io.anuke.arc.util.serialization.Json.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.Teams.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -98,6 +96,7 @@ public class JsonIO{ } }); + /* json.setSerializer(TeamData.class, new Serializer(){ @Override public void write(Json json, TeamData object, Class knownType){ @@ -115,7 +114,7 @@ public class JsonIO{ out.brokenBlocks = new LongQueue(blocks); return out; } - }); + });*/ json.setSerializer(ItemStack.class, new Serializer(){ @Override diff --git a/core/src/io/anuke/mindustry/io/SaveVersion.java b/core/src/io/anuke/mindustry/io/SaveVersion.java index 6e77128c05..2b12bf96f2 100644 --- a/core/src/io/anuke/mindustry/io/SaveVersion.java +++ b/core/src/io/anuke/mindustry/io/SaveVersion.java @@ -6,7 +6,6 @@ import io.anuke.arc.util.io.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; import io.anuke.mindustry.maps.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -292,17 +291,4 @@ public abstract class SaveVersion extends SaveFileReader{ } } } - - /** sometimes it's necessary to remap IDs after the content header is read.*/ - public void remapContent(){ - for(Team team : Team.all){ - if(state.teams.isActive(team)){ - LongQueue queue = state.teams.get(team).brokenBlocks; - for(int i = 0; i < queue.size; i++){ - //remap broken block IDs - queue.set(i, BrokenBlock.block(queue.get(i), content.block(BrokenBlock.block(queue.get(i))).id)); - } - } - } - } } diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 28296cc44a..15a2933b46 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -15,11 +15,11 @@ import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.pooling.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; @@ -315,7 +315,10 @@ public class Block extends BlockStorage{ }); tempTiles.sort(Structs.comparingFloat(t -> t.dst2(tile))); if(!tempTiles.isEmpty()){ - Call.linkPowerNodes(null, tempTiles.first(), tile); + Tile toLink = tempTiles.first(); + if(!toLink.entity.power.links.contains(tile.pos())){ + toLink.configure(tile.pos()); + } } } } @@ -433,6 +436,11 @@ public class Block extends BlockStorage{ } + /** Called when arbitrary configuration is applied to a tile. */ + public void configured(Tile tile, @Nullable Player player, int value){ + + } + /** Returns whether or not a hand cursor should be shown over this block. */ public Cursor getCursor(Tile tile){ return configurable ? SystemCursor.hand : SystemCursor.arrow; diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index 2d0583da98..c5526e5c23 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -8,6 +8,7 @@ import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; +import io.anuke.mindustry.gen.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.blocks.*; import io.anuke.mindustry.world.modules.*; @@ -87,6 +88,11 @@ public class Tile implements Position, TargetTrait{ return -1; } + /** Configure a tile with the current, local player. */ + public void configure(int value){ + Call.onTileConfig(player, this, value); + } + @SuppressWarnings("unchecked") public T entity(){ return (T)entity; diff --git a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java index f0891b72c3..d1d9a76708 100644 --- a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java @@ -188,10 +188,10 @@ public class BuildBlock extends Block{ private float[] accumulator; private float[] totalAccumulator; - public void construct(Unit builder, @Nullable TileEntity core, float amount){ + public boolean construct(Unit builder, @Nullable TileEntity core, float amount){ if(cblock == null){ kill(); - return; + return false; } float maxProgress = core == null ? amount : checkRequired(core.items, amount, false); @@ -212,7 +212,9 @@ public class BuildBlock extends Block{ if(progress >= 1f || state.rules.infiniteResources){ Call.onConstructFinish(tile, cblock, builderID, tile.rotation(), builder.getTeam()); + return true; } + return false; } public void deconstruct(Unit builder, @Nullable TileEntity core, float amount){ diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java index 417e067ecd..baa528452c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.world.blocks.distribution; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.collection.IntSet.*; @@ -9,9 +8,7 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -43,24 +40,20 @@ public class ItemBridge extends Block{ group = BlockGroup.transportation; } - @Remote(targets = Loc.both, called = Loc.both, forward = true) - public static void linkItemBridge(Player player, Tile tile, Tile other){ - if(!Units.canInteract(player, tile)) return; + @Override + public void configured(Tile tile, Player player, int value){ ItemBridgeEntity entity = tile.entity(); - ItemBridgeEntity oe = other.entity(); - entity.link = other.pos(); - oe.incoming.add(tile.pos()); - } - @Remote(targets = Loc.both, called = Loc.server, forward = true) - public static void unlinkItemBridge(Player player, Tile tile, Tile other){ - if(!Units.canInteract(player, tile)) return; - ItemBridgeEntity entity = tile.entity(); - entity.link = -1; - if(other != null){ - ItemBridgeEntity oe = other.entity(); + if(world.tile(entity.link) != null && world.tile(entity.link).entity instanceof ItemBridgeEntity){ + ItemBridgeEntity oe = world.tile(entity.link).entity(); oe.incoming.remove(tile.pos()); } + + entity.link = value; + + if(world.tile(value) != null && world.tile(value).entity instanceof ItemBridgeEntity){ + ((ItemBridgeEntity)world.tile(value).entity).incoming.add(tile.pos()); + } } @Override @@ -76,7 +69,7 @@ public class ItemBridge extends Block{ public void playerPlaced(Tile tile){ Tile link = findLink(tile.x, tile.y); if(linkValid(tile, link)){ - Call.linkItemBridge(null, link, tile); + link.configure(tile.pos()); } lastPlaced = tile.pos(); @@ -148,9 +141,9 @@ public class ItemBridge extends Block{ if(linkValid(tile, other)){ if(entity.link == other.pos()){ - Call.unlinkItemBridge(null, tile, other); + tile.configure(Pos.invalid); }else{ - Call.linkItemBridge(null, tile, other); + tile.configure(other.pos()); } return false; } @@ -364,6 +357,11 @@ public class ItemBridge extends Block{ public float time2; public float cycleSpeed = 1f; + @Override + public int config(){ + return link; + } + @Override public void write(DataOutput stream) throws IOException{ super.write(stream); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java index 060f6562b8..f3020c22ef 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.world.blocks.distribution; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.graphics.g2d.*; @@ -12,7 +11,6 @@ import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.Effects.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -45,11 +43,17 @@ public class MassDriver extends Block{ outlineIcon = true; } + /* @Remote(targets = Loc.both, called = Loc.server, forward = true) public static void linkMassDriver(Player player, Tile tile, int position){ if(!Units.canInteract(player, tile)) return; MassDriverEntity entity = tile.entity(); entity.link = position; + }*/ + + @Override + public void configured(Tile tile, Player player, int value){ + tile.entity().link = value; } @Override @@ -192,10 +196,10 @@ public class MassDriver extends Block{ MassDriverEntity entity = tile.entity(); if(entity.link == other.pos()){ - Call.linkMassDriver(null, tile, -1); + tile.configure(-1); return false; }else if(other.block() instanceof MassDriver && other.dst(tile) <= range && other.getTeam() == tile.getTeam()){ - Call.linkMassDriver(null, tile, other.pos()); + tile.configure(other.pos()); return false; } @@ -310,6 +314,11 @@ public class MassDriver extends Block{ ((MassDriver)block).handlePayload(this, bullet, data); } + @Override + public int config(){ + return link; + } + @Override public void write(DataOutput stream) throws IOException{ super.write(stream); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java index 962ad03841..42108b75fc 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java @@ -1,17 +1,15 @@ package io.anuke.mindustry.world.blocks.distribution; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.Core; +import io.anuke.arc.*; import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.entities.*; +import io.anuke.arc.math.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.ItemSelection; -import io.anuke.mindustry.world.meta.BlockGroup; +import io.anuke.mindustry.world.blocks.*; +import io.anuke.mindustry.world.meta.*; import java.io.*; @@ -37,9 +35,12 @@ public class Sorter extends Block{ @Override public void playerPlaced(Tile tile){ - Core.app.post(() -> Call.setSorterItem(null, tile, lastItem)); + if(lastItem != null){ + Core.app.post(() -> tile.configure(lastItem.id)); + } } + /* @Remote(targets = Loc.both, called = Loc.both, forward = true) public static void setSorterItem(Player player, Tile tile, Item item){ if(!Units.canInteract(player, tile)) return; @@ -47,6 +48,11 @@ public class Sorter extends Block{ if(entity != null){ entity.sortItem = item; } + }*/ + + @Override + public void configured(Tile tile, Player player, int value){ + tile.entity().sortItem = content.item(value); } @Override @@ -127,7 +133,7 @@ public class Sorter extends Block{ SorterEntity entity = tile.entity(); ItemSelection.buildItemTable(table, () -> entity.sortItem, item -> { lastItem = item; - Call.setSorterItem(null, tile, item); + tile.configure(item == null ? -1 : item.id); }); } @@ -138,7 +144,12 @@ public class Sorter extends Block{ public class SorterEntity extends TileEntity{ - Item sortItem; + @Nullable Item sortItem; + + @Override + public int config(){ + return sortItem == null ? -1 : sortItem.id; + } @Override public byte version(){ diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java index 6cf2d7a41e..2ff8e6c031 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.world.blocks.power; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.function.*; @@ -9,9 +8,7 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.*; @@ -36,7 +33,7 @@ public class PowerNode extends PowerBlock{ consumesPower = false; outputsPower = false; } - +/* @Remote(targets = Loc.both, called = Loc.server, forward = true) public static void linkPowerNodes(Player player, Tile tile, Tile other){ if(tile.entity == null || other == null || tile.entity.power == null || !((PowerNode)tile.block()).linkValid(tile, other) @@ -82,6 +79,42 @@ public class PowerNode extends PowerBlock{ } } + */ + + @Override + public void configured(Tile tile, Player player, int value){ + TileEntity entity = tile.entity; + Tile other = world.tile(value); + boolean contains = entity.power.links.contains(value), valid = other != null && other.entity != null && other.entity.power != null; + + if(contains){ + //unlink + entity.power.links.removeValue(value); + if(valid) other.entity.power.links.removeValue(tile.pos()); + + PowerGraph newgraph = new PowerGraph(); + + //reflow from this point, covering all tiles on this side + newgraph.reflow(tile); + + if(valid && other.entity.power.graph != newgraph){ + //create new graph for other end + PowerGraph og = new PowerGraph(); + //reflow from other end + og.reflow(other); + } + }else if(linkValid(tile, other) && valid && entity.power.links.size < maxNodes){ + + if(other.getTeamID() == tile.getTeamID()){ + if(!other.entity.power.links.contains(tile.pos())){ + other.entity.power.links.add(tile.pos()); + } + } + + entity.power.graph.add(other.entity.power.graph); + } + } + @Override public void load(){ super.load(); @@ -122,7 +155,11 @@ public class PowerNode extends PowerBlock{ }); tempTiles.sort(Structs.comparingFloat(t -> t.dst2(tile))); - tempTiles.each(valid, other -> Call.linkPowerNodes(null, tile, other)); + tempTiles.each(valid, other -> { + if(!tile.entity.power.links.contains(other.pos())){ + tile.configure(other.pos()); + } + }); super.placed(tile); } @@ -169,11 +206,7 @@ public class PowerNode extends PowerBlock{ Tile result = other; if(linkValid(tile, other)){ - if(linked(tile, other)){ - Call.unlinkPowerNodes(null, tile, result); - }else if(entity.power.links.size < maxNodes){ - Call.linkPowerNodes(null, tile, result); - } + tile.configure(other.pos()); return false; } return true; diff --git a/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java b/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java index 793bfb8442..8611eb18b7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java +++ b/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java @@ -1,19 +1,13 @@ package io.anuke.mindustry.world.blocks.sandbox; -import io.anuke.annotations.Annotations.Loc; -import io.anuke.annotations.Annotations.Remote; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.type.Player; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.ItemSelection; -import io.anuke.mindustry.world.meta.BlockGroup; +import io.anuke.arc.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.*; +import io.anuke.mindustry.world.meta.*; import java.io.*; @@ -31,18 +25,16 @@ public class ItemSource extends Block{ configurable = true; } - @Remote(targets = Loc.both, called = Loc.both, forward = true) - public static void setItemSourceItem(Player player, Tile tile, Item item){ - if(!Units.canInteract(player, tile)) return; - ItemSourceEntity entity = tile.entity(); - if(entity != null){ - entity.outputItem = item; - } + @Override + public void configured(Tile tile, Player player, int value){ + tile.entity().outputItem = content.item(value); } @Override public void playerPlaced(Tile tile){ - Core.app.post(() -> Call.setItemSourceItem(null, tile, lastItem)); + if(lastItem != null){ + Core.app.post(() -> tile.configure(lastItem.id)); + } } @Override @@ -83,7 +75,7 @@ public class ItemSource extends Block{ ItemSourceEntity entity = tile.entity(); ItemSelection.buildItemTable(table, () -> entity.outputItem, item -> { lastItem = item; - Call.setItemSourceItem(null, tile, item); + tile.configure(item == null ? -1 : item.id); }); } @@ -100,6 +92,11 @@ public class ItemSource extends Block{ public class ItemSourceEntity extends TileEntity{ Item outputItem; + @Override + public int config(){ + return outputItem == null ? -1 : outputItem.id; + } + @Override public void write(DataOutput stream) throws IOException{ super.write(stream); diff --git a/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java b/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java index f9ea932a90..b3211cf433 100644 --- a/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java +++ b/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java @@ -1,27 +1,21 @@ package io.anuke.mindustry.world.blocks.sandbox; -import io.anuke.annotations.Annotations.Loc; -import io.anuke.annotations.Annotations.Remote; -import io.anuke.arc.Core; -import io.anuke.arc.collection.Array; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.scene.style.TextureRegionDrawable; -import io.anuke.arc.scene.ui.ButtonGroup; -import io.anuke.arc.scene.ui.ImageButton; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.type.Player; -import io.anuke.mindustry.entities.type.TileEntity; +import io.anuke.arc.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.scene.style.*; +import io.anuke.arc.scene.ui.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.ArcAnnotate.*; +import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.Liquid; +import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.*; import java.io.*; -import static io.anuke.mindustry.Vars.content; -import static io.anuke.mindustry.Vars.control; +import static io.anuke.mindustry.Vars.*; public class LiquidSource extends Block{ private static Liquid lastLiquid; @@ -38,7 +32,9 @@ public class LiquidSource extends Block{ @Override public void playerPlaced(Tile tile){ - if(lastLiquid != null) Core.app.post(() -> Call.setLiquidSourceLiquid(null, tile, lastLiquid)); + if(lastLiquid != null){ + Core.app.post(() -> tile.configure(lastLiquid.id)); + } } @Override @@ -87,7 +83,7 @@ public class LiquidSource extends Block{ final int f = i; ImageButton button = cont.addImageButton(Tex.clear, Styles.clearToggleTransi, 24, () -> control.input.frag.config.hideConfig()).size(38).group(group).get(); button.changed(() -> { - Call.setLiquidSourceLiquid(null, tile, button.isChecked() ? items.get(f) : null); + tile.configure(button.isChecked() ? items.get(f).id : -1); control.input.frag.config.hideConfig(); lastLiquid = items.get(f); }); @@ -107,15 +103,18 @@ public class LiquidSource extends Block{ return new LiquidSourceEntity(); } - @Remote(targets = Loc.both, called = Loc.both, forward = true) - public static void setLiquidSourceLiquid(Player player, Tile tile, Liquid liquid){ - if(!Units.canInteract(player, tile)) return; - LiquidSourceEntity entity = tile.entity(); - if(entity != null) entity.source = liquid; + @Override + public void configured(Tile tile, Player player, int value){ + tile.entity().source = content.liquid(value); } class LiquidSourceEntity extends TileEntity{ - public Liquid source = null; + public @Nullable Liquid source = null; + + @Override + public int config(){ + return source == null ? -1 : source.id; + } @Override public void write(DataOutput stream) throws IOException{ diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java index 0adf1fdc8f..9488337209 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java @@ -1,16 +1,13 @@ package io.anuke.mindustry.world.blocks.storage; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.Color; +import io.anuke.arc.*; +import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.entities.*; +import io.anuke.arc.scene.ui.layout.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.ItemSelection; +import io.anuke.mindustry.world.blocks.*; import java.io.*; @@ -44,20 +41,20 @@ public class Unloader extends Block{ @Override public void playerPlaced(Tile tile){ - Core.app.post(() -> Call.setSortedUnloaderItem(null, tile, lastItem)); + if(lastItem != null){ + Core.app.post(() -> tile.configure(lastItem.id)); + } } - @Remote(targets = Loc.both, called = Loc.both, forward = true) - public static void setSortedUnloaderItem(Player player, Tile tile, Item item){ - if(!Units.canInteract(player, tile)) return; - SortedUnloaderEntity entity = tile.entity(); - entity.items.clear(); - entity.sortItem = item; + @Override + public void configured(Tile tile, Player player, int value){ + tile.entity.items.clear(); + tile.entity().sortItem = content.item(value); } @Override public void update(Tile tile){ - SortedUnloaderEntity entity = tile.entity(); + UnloaderEntity entity = tile.entity(); if(tile.entity.timer.get(timerUnload, speed / entity.timeScale) && tile.entity.items.total() == 0){ for(Tile other : tile.entity.proximity()){ @@ -109,7 +106,7 @@ public class Unloader extends Block{ public void draw(Tile tile){ super.draw(tile); - SortedUnloaderEntity entity = tile.entity(); + UnloaderEntity entity = tile.entity(); Draw.color(entity.sortItem == null ? Color.clear : entity.sortItem.color); Fill.square(tile.worldx(), tile.worldy(), 1f); @@ -118,21 +115,26 @@ public class Unloader extends Block{ @Override public void buildTable(Tile tile, Table table){ - SortedUnloaderEntity entity = tile.entity(); + UnloaderEntity entity = tile.entity(); ItemSelection.buildItemTable(table, () -> entity.sortItem, item -> { lastItem = item; - Call.setSortedUnloaderItem(null, tile, item); + tile.configure(item == null ? -1 : item.id); }); } @Override public TileEntity newEntity(){ - return new SortedUnloaderEntity(); + return new UnloaderEntity(); } - public static class SortedUnloaderEntity extends TileEntity{ + public static class UnloaderEntity extends TileEntity{ public Item sortItem = null; + @Override + public int config(){ + return sortItem == null ? -1 : sortItem.id; + } + @Override public void write(DataOutput stream) throws IOException{ super.write(stream); diff --git a/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java b/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java index a748a20a5e..01487f6b44 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.world.blocks.units; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.graphics.*; @@ -13,9 +12,8 @@ import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.Effects.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.entities.units.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.*; @@ -95,7 +93,7 @@ public class CommandCenter extends Block{ Table buttons = new Table(); for(UnitCommand cmd : UnitCommand.all){ - buttons.addImageButton(Core.atlas.drawable("icon-command-" + cmd.name() + "-small"), Styles.clearToggleTransi, () -> Call.onCommandCenterSet(player, tile, cmd)) + buttons.addImageButton(Core.atlas.drawable("icon-command-" + cmd.name() + "-small"), Styles.clearToggleTransi, () -> tile.configure(cmd.ordinal())) .size(44).group(group).update(b -> b.setChecked(entity.command == cmd)); } table.add(buttons); @@ -103,10 +101,9 @@ public class CommandCenter extends Block{ table.label(() -> entity.command.localized()).style(Styles.outlineLabel).center().growX().get().setAlignment(Align.center); } - @Remote(called = Loc.server, forward = true, targets = Loc.both) - public static void onCommandCenterSet(Player player, Tile tile, UnitCommand command){ - if(player == null || tile == null || !Units.canInteract(player, tile)) return; - + @Override + public void configured(Tile tile, Player player, int value){ + UnitCommand command = UnitCommand.all[value]; Effects.effect(((CommandCenter)tile.block()).effect, tile); for(Tile center : indexer.getAllied(tile.getTeam(), BlockFlag.comandCenter)){ @@ -133,6 +130,11 @@ public class CommandCenter extends Block{ public class CommandCenterEntity extends TileEntity{ public UnitCommand command = UnitCommand.attack; + @Override + public int config(){ + return command.ordinal(); + } + @Override public void write(DataOutput stream) throws IOException{ super.write(stream); diff --git a/fastlane/metadata/android/en-US/changelogs/89.txt b/fastlane/metadata/android/en-US/changelogs/89.txt new file mode 100644 index 0000000000..89827aa74c --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/89.txt @@ -0,0 +1,15 @@ +- Fixed iOS/Android having frozen multiplayer +- Fixed Veins map not having a silicon source +- Fixed inaccurate enemy shoot prediction +- Fixed server crash exploit +- Fixed panes not scrolling with mousewheel [Desktop] +- Fixed incorrect PvP team assignment +- Fixed not being able to tap 'ok' in UI scale changed dialog +- Fixed not being able to play on PvP maps without orange team +- Fixed error message on exiting server after saved map +- Fixed attack map completion displaying low rank +- Possibly fixed Mac version not starting +- Switched to TCP from UDP - experimental +- Added descriptive display when failing to connect due to version mismatch +- Improved smoothness of multiplayer building, rotation and collision +- Improved power node linking diff --git a/fastlane/metadata/android/en-US/changelogs/93.txt b/fastlane/metadata/android/en-US/changelogs/93.txt new file mode 100644 index 0000000000..c0e7d256af --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/93.txt @@ -0,0 +1,11 @@ +- Added new spawn animations w/ progress bar and names +- Added configurable server whitelist based on player UUID +- Added many new events for plugins +- Added core land animation +- Added player limit for servers +- Added gamemode display for server/save lists +- Added new filechooser for Android, fixes file access on Android 10 +- Added core storage space increase via adjacent vaults or containers +- Made unloader be able to take items from any block +- Improved votekick sensitivity +- Fixed many various bugs diff --git a/fastlane/metadata/android/en-US/changelogs/94.txt b/fastlane/metadata/android/en-US/changelogs/94.txt new file mode 100644 index 0000000000..f967815789 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/94.txt @@ -0,0 +1,8 @@ +- Fixed tutorial displaying Desktop text on Android +- Fixed common crash related to status effects +- Fixed launch pads launching entire core contents +- Fixed new maps overwriting old ones without warning +- Fixed phase conveyors operating on near-0 power +- Fixed incorrect message dialog layout +- Fixed some crashes +- Reverted removal of router passback diff --git a/fastlane/metadata/android/en-US/changelogs/95.txt b/fastlane/metadata/android/en-US/changelogs/95.txt new file mode 100755 index 0000000000..ba151cae49 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/95.txt @@ -0,0 +1,12 @@ +- Fixed zone exploit caused by import of zone saves +- Reverted to old file chooser when possible [Android] +- New multithreaded pathfinding implementation +- Made attack command have units move toward enemy spawnpoints in survival +- Made votekick still tempban people after disconnection +- Added 'rally' command to command center, replaces old patrol command +- Added full Android keyboard support, completely removes any touch input, adds desktop keys +- Added ability to rotate lines while placing [Desktop] [Contributed by Synray] +- Added votekick button +- Added display of power capacity in power graphs +- Added armored conveyors - more armor than titanium, don't accept items from sides +- Added message blocks - editable text