From ccb97e34d54f39e80bc7bea9e5df956d6f1c9941 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 6 Jun 2018 14:51:25 -0400 Subject: [PATCH] Moved many block files; work on annotation processor --- .../src/io/anuke/annotations/Annotations.java | 35 ++++++- .../src/io/anuke/annotations/ClassEntry.java | 15 +++ .../src/io/anuke/annotations/IOFinder.java | 72 +++++++++++++ .../src/io/anuke/annotations/MethodEntry.java | 23 ++++ ...a => RemoteMethodAnnotationProcessor.java} | 76 +++++--------- .../src/io/anuke/annotations/Serializers.java | 4 - .../src/io/anuke/annotations/Utils.java | 18 ++++ build.gradle | 8 +- .../blocks/distribution/weaponfactory.png | Bin 411 -> 0 bytes .../blocks/production/weaponfactory.png | Bin 0 -> 381 bytes .../{distribution => storage}/core-open.png | Bin .../{distribution => storage}/core-top.png | Bin .../blocks/{distribution => storage}/core.png | Bin .../sortedunloader.png | Bin .../{distribution => storage}/unloader.png | Bin .../{distribution => storage}/vault.png | Bin core/assets/sprites/sprites.atlas | 98 +++++++++--------- core/assets/sprites/sprites.png | Bin 114190 -> 114170 bytes core/src/Mindustry.gwt.xml | 2 +- .../io/anuke/mindustry/ai/BlockIndexer.java | 2 +- .../src/io/anuke/mindustry/ai/Pathfinder.java | 2 +- .../mindustry/content/blocks/Blocks.java | 2 +- .../content/blocks/CraftingBlocks.java | 2 +- .../mindustry/content/blocks/DebugBlocks.java | 12 +-- .../content/blocks/DefenseBlocks.java | 6 +- .../content/blocks/DistributionBlocks.java | 2 +- .../content/blocks/LiquidBlocks.java | 4 +- .../mindustry/content/blocks/PowerBlocks.java | 8 +- .../content/blocks/ProductionBlocks.java | 8 +- .../content/blocks/StorageBlocks.java | 8 +- .../mindustry/content/blocks/UnitBlocks.java | 8 +- .../content/blocks/WeaponBlocks.java | 2 +- core/src/io/anuke/mindustry/core/Logic.java | 4 +- .../src/io/anuke/mindustry/core/Renderer.java | 2 +- .../io/anuke/mindustry/editor/EditorTool.java | 2 +- .../io/anuke/mindustry/editor/MapEditor.java | 2 +- .../io/anuke/mindustry/editor/MapFilter.java | 2 +- .../io/anuke/mindustry/entities/Player.java | 4 +- .../anuke/mindustry/entities/TileEntity.java | 8 +- .../src/io/anuke/mindustry/entities/Unit.java | 2 +- .../mindustry/entities/effect/Shield.java | 2 +- .../entities/traits/BuilderTrait.java | 4 +- .../mindustry/entities/units/BaseUnit.java | 2 +- .../mindustry/entities/units/FlyingUnit.java | 2 +- .../mindustry/entities/units/GroundUnit.java | 4 +- .../mindustry/entities/units/types/Drone.java | 6 +- .../mindustry/entities/units/types/Vtol.java | 12 +-- .../mindustry/graphics/BlockRenderer.java | 2 +- .../mindustry/graphics/OverlayRenderer.java | 2 +- .../io/anuke/mindustry/input/CursorType.java | 23 ++++ .../anuke/mindustry/input/DesktopInput.java | 24 +---- .../anuke/mindustry/input/InputHandler.java | 2 +- core/src/io/anuke/mindustry/io/TypeIO.java | 50 +++++++++ .../anuke/mindustry/io/versions/Save16.java | 2 +- .../anuke/mindustry/net/Administration.java | 8 +- .../io/anuke/mindustry/net/Interpolator.java | 2 - .../src/io/anuke/mindustry/net/NetworkIO.java | 2 +- core/src/io/anuke/mindustry/world/Block.java | 38 +++---- core/src/io/anuke/mindustry/world/Build.java | 2 +- core/src/io/anuke/mindustry/world/Tile.java | 8 +- .../world/blocks/{types => }/BlendBlock.java | 2 +- .../world/blocks/{types => }/BlockModule.java | 2 +- .../world/blocks/{types => }/BlockPart.java | 2 +- .../world/blocks/{types => }/BuildBlock.java | 12 +-- .../world/blocks/{types => }/Floor.java | 2 +- .../world/blocks/{types => }/LiquidBlock.java | 6 +- .../world/blocks/{types => }/Ore.java | 2 +- .../world/blocks/{types => }/PowerBlock.java | 4 +- .../world/blocks/{types => }/Rock.java | 2 +- .../world/blocks/SelectionTrait.java | 42 ++++++++ .../world/blocks/{types => }/StaticBlock.java | 2 +- .../world/blocks/{types => }/Wall.java | 4 +- .../blocks/{types => }/defense/Door.java | 9 +- .../{types => }/defense/RepairTurret.java | 4 +- .../{types => }/defense/ShieldBlock.java | 4 +- .../defense/ShieldedWallBlock.java | 4 +- .../blocks/{types => }/defense/Turret.java | 4 +- .../defense/turrets/BurstTurret.java | 2 +- .../defense/turrets/DoubleTurret.java | 2 +- .../defense/turrets/ItemTurret.java | 6 +- .../defense/turrets/LaserTurret.java | 2 +- .../defense/turrets/LiquidTurret.java | 6 +- .../defense/turrets/PowerTurret.java | 4 +- .../distribution/BufferedItemBridge.java | 2 +- .../{types => }/distribution/Conduit.java | 6 +- .../{types => }/distribution/Conveyor.java | 4 +- .../distribution/ExtendingItemBridge.java | 2 +- .../{types => }/distribution/ItemBridge.java | 8 +- .../{types => }/distribution/Junction.java | 4 +- .../distribution/LiquidBridge.java | 2 +- .../distribution/LiquidExtendingBridge.java | 2 +- .../distribution/LiquidJunction.java | 4 +- .../distribution/LiquidRouter.java | 4 +- .../{types => }/distribution/MassDriver.java | 2 +- .../distribution/OverflowGate.java | 2 +- .../{types => }/distribution/Router.java | 4 +- .../{types => }/distribution/Sorter.java | 54 ++-------- .../{types => }/distribution/Splitter.java | 4 +- .../{types => }/distribution/Teleporter.java | 24 ++--- .../distribution/TunnelConduit.java | 4 +- .../distribution/TunnelConveyor.java | 5 +- .../blocks/{types => }/logic/LogicBlock.java | 2 +- .../{types => }/modules/InventoryModule.java | 4 +- .../{types => }/modules/LiquidModule.java | 4 +- .../{types => }/modules/PowerModule.java | 4 +- .../{types => }/power/BurnerGenerator.java | 4 +- .../{types => }/power/DecayGenerator.java | 2 +- .../{types => }/power/FusionReactor.java | 4 +- .../power/LiquidBurnerGenerator.java | 4 +- .../power/LiquidHeatGenerator.java | 2 +- .../{types => }/power/NuclearReactor.java | 4 +- .../{types => }/power/PowerDistributor.java | 10 +- .../{types => }/power/PowerGenerator.java | 6 +- .../{types => }/power/SolarGenerator.java | 4 +- .../{types => }/production/Compressor.java | 4 +- .../{types => }/production/Cultivator.java | 2 +- .../blocks/{types => }/production/Drill.java | 4 +- .../{types => }/production/Fracker.java | 2 +- .../production/GenericCrafter.java | 4 +- .../{types => }/production/Incinerator.java | 2 +- .../{types => }/production/LiquidMixer.java | 4 +- .../{types => }/production/PlasticFormer.java | 2 +- .../{types => }/production/PowerCrafter.java | 4 +- .../{types => }/production/PowerSmelter.java | 6 +- .../{types => }/production/Pulverizer.java | 2 +- .../blocks/{types => }/production/Pump.java | 6 +- .../{types => }/production/Separator.java | 4 +- .../{types => }/production/Smelter.java | 4 +- .../{types => }/production/SolidPump.java | 2 +- .../{types => }/production/WeaponFactory.java | 85 ++++++++++++--- .../blocks/{types => }/storage/CoreBlock.java | 4 +- .../{types => }/storage/SortedUnloader.java | 54 ++-------- .../{types => }/storage/StorageBlock.java | 2 +- .../blocks/{types => }/storage/Unloader.java | 4 +- .../blocks/{types => }/storage/Vault.java | 2 +- .../world/blocks/types/units/UnloadPoint.java | 4 - .../{types => }/units/CommandCenter.java | 2 +- .../blocks/{types => }/units/DropPoint.java | 2 +- .../blocks/{types => }/units/RepairPoint.java | 4 +- .../{types => }/units/ResupplyPoint.java | 4 +- .../blocks/{types => }/units/UnitFactory.java | 6 +- .../world/blocks/units/UnloadPoint.java | 4 + .../mindustry/world/{ => meta}/BlockBar.java | 5 +- .../mindustry/world/{ => meta}/BlockBars.java | 3 +- .../mindustry/world/{ => meta}/BlockFlag.java | 2 +- .../world/{ => meta}/BlockGroup.java | 2 +- .../world/{ => meta}/BlockStats.java | 4 +- 147 files changed, 685 insertions(+), 520 deletions(-) create mode 100644 annotations/src/io/anuke/annotations/ClassEntry.java create mode 100644 annotations/src/io/anuke/annotations/IOFinder.java create mode 100644 annotations/src/io/anuke/annotations/MethodEntry.java rename annotations/src/io/anuke/annotations/{AnnotationProcessor.java => RemoteMethodAnnotationProcessor.java} (83%) delete mode 100644 annotations/src/io/anuke/annotations/Serializers.java create mode 100644 annotations/src/io/anuke/annotations/Utils.java delete mode 100644 core/assets-raw/sprites/blocks/distribution/weaponfactory.png create mode 100644 core/assets-raw/sprites/blocks/production/weaponfactory.png rename core/assets-raw/sprites/blocks/{distribution => storage}/core-open.png (100%) rename core/assets-raw/sprites/blocks/{distribution => storage}/core-top.png (100%) rename core/assets-raw/sprites/blocks/{distribution => storage}/core.png (100%) rename core/assets-raw/sprites/blocks/{distribution => storage}/sortedunloader.png (100%) rename core/assets-raw/sprites/blocks/{distribution => storage}/unloader.png (100%) rename core/assets-raw/sprites/blocks/{distribution => storage}/vault.png (100%) create mode 100644 core/src/io/anuke/mindustry/input/CursorType.java create mode 100644 core/src/io/anuke/mindustry/io/TypeIO.java rename core/src/io/anuke/mindustry/world/blocks/{types => }/BlendBlock.java (94%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/BlockModule.java (85%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/BlockPart.java (97%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/BuildBlock.java (95%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/Floor.java (98%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/LiquidBlock.java (86%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/Ore.java (80%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/PowerBlock.java (71%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/Rock.java (82%) create mode 100644 core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java rename core/src/io/anuke/mindustry/world/blocks/{types => }/StaticBlock.java (82%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/Wall.java (78%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/defense/Door.java (90%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/defense/RepairTurret.java (95%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/defense/ShieldBlock.java (95%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/defense/ShieldedWallBlock.java (94%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/defense/Turret.java (98%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/defense/turrets/BurstTurret.java (93%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/defense/turrets/DoubleTurret.java (92%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/defense/turrets/ItemTurret.java (94%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/defense/turrets/LaserTurret.java (96%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/defense/turrets/LiquidTurret.java (94%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/defense/turrets/PowerTurret.java (85%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/distribution/BufferedItemBridge.java (96%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/distribution/Conduit.java (93%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/distribution/Conveyor.java (98%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/distribution/ExtendingItemBridge.java (97%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/distribution/ItemBridge.java (98%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/distribution/Junction.java (97%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/distribution/LiquidBridge.java (96%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/distribution/LiquidExtendingBridge.java (96%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/distribution/LiquidJunction.java (90%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/distribution/LiquidRouter.java (68%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/distribution/MassDriver.java (71%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/distribution/OverflowGate.java (96%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/distribution/Router.java (92%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/distribution/Sorter.java (67%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/distribution/Splitter.java (94%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/distribution/Teleporter.java (95%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/distribution/TunnelConduit.java (95%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/distribution/TunnelConveyor.java (92%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/logic/LogicBlock.java (73%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/modules/InventoryModule.java (95%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/modules/LiquidModule.java (85%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/modules/PowerModule.java (87%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/power/BurnerGenerator.java (97%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/power/DecayGenerator.java (83%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/power/FusionReactor.java (96%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/power/LiquidBurnerGenerator.java (94%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/power/LiquidHeatGenerator.java (85%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/power/NuclearReactor.java (98%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/power/PowerDistributor.java (97%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/power/PowerGenerator.java (92%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/power/SolarGenerator.java (84%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/production/Compressor.java (93%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/production/Cultivator.java (98%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/production/Drill.java (98%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/production/Fracker.java (97%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/production/GenericCrafter.java (97%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/production/Incinerator.java (98%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/production/LiquidMixer.java (94%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/production/PlasticFormer.java (90%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/production/PowerCrafter.java (93%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/production/PowerSmelter.java (97%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/production/Pulverizer.java (91%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/production/Pump.java (91%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/production/Separator.java (95%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/production/Smelter.java (97%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/production/SolidPump.java (98%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/production/WeaponFactory.java (57%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/storage/CoreBlock.java (98%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/storage/SortedUnloader.java (56%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/storage/StorageBlock.java (95%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/storage/Unloader.java (92%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/storage/Vault.java (95%) delete mode 100644 core/src/io/anuke/mindustry/world/blocks/types/units/UnloadPoint.java rename core/src/io/anuke/mindustry/world/blocks/{types => }/units/CommandCenter.java (74%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/units/DropPoint.java (91%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/units/RepairPoint.java (97%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/units/ResupplyPoint.java (98%) rename core/src/io/anuke/mindustry/world/blocks/{types => }/units/UnitFactory.java (97%) create mode 100644 core/src/io/anuke/mindustry/world/blocks/units/UnloadPoint.java rename core/src/io/anuke/mindustry/world/{ => meta}/BlockBar.java (74%) rename core/src/io/anuke/mindustry/world/{ => meta}/BlockBars.java (91%) rename core/src/io/anuke/mindustry/world/{ => meta}/BlockFlag.java (93%) rename core/src/io/anuke/mindustry/world/{ => meta}/BlockGroup.java (70%) rename core/src/io/anuke/mindustry/world/{ => meta}/BlockStats.java (89%) diff --git a/annotations/src/io/anuke/annotations/Annotations.java b/annotations/src/io/anuke/annotations/Annotations.java index ec7931abd2..5b08e70d37 100644 --- a/annotations/src/io/anuke/annotations/Annotations.java +++ b/annotations/src/io/anuke/annotations/Annotations.java @@ -6,7 +6,7 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * Goal: To create a system to send events to the server from the client and vice versa.
+ * Goal: To create a system to send events to the server from the client and vice versa, without creating a new packet type each time.
* These events may optionally also trigger on the caller client/server as well.
*
* Three annotations are used for this purpose.
@@ -22,7 +22,12 @@ public class Annotations { /**Marks a method as invokable remotely from a server on a client.*/ @Target(ElementType.METHOD) @Retention(RetentionPolicy.CLASS) - public @interface RemoteClient {} + public @interface RemoteClient { + /**Whether a client-specific method is generated that accepts a connecton ID and sends to only one player. Default is false.*/ + boolean one() default false; + /**Whether a 'global' method is generated that sends the event to all players. Default is true.*/ + boolean all() default true; + } /**Marks a method as invokable remotely from a client on a server. * All RemoteServer methods must have their first formal parameter be of type Player. @@ -42,4 +47,30 @@ public class Annotations { @Target(ElementType.METHOD) @Retention(RetentionPolicy.CLASS) public @interface Unreliable{} + + /**Specifies that this method will be placed in the class specified by its value. + * Only use constants for this value!*/ //TODO enforce this + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.CLASS) + public @interface In{ + String value(); + } + + /**Specifies that this method will be used to write classes of the type returned by {@link #value()}.
+ * This method must return void and have two parameters, the first being of type {@link java.nio.ByteBuffer} and the second + * being the type returned by {@link #value()}.*/ + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.CLASS) + public @interface WriteClass { + Class value(); + } + + /**Specifies that this method will be used to read classes of the type returned by {@link #value()}.
+ * This method must return the type returned by {@link #value()}, + * and have one parameter, being of type {@link java.nio.ByteBuffer}.*/ + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.CLASS) + public @interface ReadClass { + Class value(); + } } diff --git a/annotations/src/io/anuke/annotations/ClassEntry.java b/annotations/src/io/anuke/annotations/ClassEntry.java new file mode 100644 index 0000000000..3997eb6029 --- /dev/null +++ b/annotations/src/io/anuke/annotations/ClassEntry.java @@ -0,0 +1,15 @@ +package io.anuke.annotations; + +import java.util.ArrayList; + +/**Represents a class witha list method entries to include in it.*/ +public class ClassEntry { + /**All methods in this generated class.*/ + public final ArrayList methods = new ArrayList<>(); + /**Simple class name.*/ + public final String name; + + public ClassEntry(String name) { + this.name = name; + } +} diff --git a/annotations/src/io/anuke/annotations/IOFinder.java b/annotations/src/io/anuke/annotations/IOFinder.java new file mode 100644 index 0000000000..f536dd9a3e --- /dev/null +++ b/annotations/src/io/anuke/annotations/IOFinder.java @@ -0,0 +1,72 @@ +package io.anuke.annotations; + +import io.anuke.annotations.Annotations.ReadClass; +import io.anuke.annotations.Annotations.WriteClass; + +import javax.annotation.processing.RoundEnvironment; +import javax.lang.model.element.Element; +import javax.tools.Diagnostic.Kind; +import java.util.HashMap; +import java.util.Set; +import java.util.stream.Stream; + +/**This class finds reader and writer methods annotated by the {@link io.anuke.annotations.Annotations.WriteClass} + * and {@link io.anuke.annotations.Annotations.ReadClass} annotations.*/ +public class IOFinder { + + /**Finds all class serializers for all types and returns them. Logs errors when necessary. + * Maps full class names to their serializers.*/ + public HashMap findSerializers(RoundEnvironment env){ + HashMap result = new HashMap<>(); + + //get methods with the types + Set writers = env.getElementsAnnotatedWith(WriteClass.class); + Set readers = env.getElementsAnnotatedWith(ReadClass.class); + + //look for writers first + for(Element writer : writers){ + WriteClass writean = writer.getAnnotation(WriteClass.class); + Class type = writean.value(); + + //make sure there's only one read method + if(readers.stream().filter(elem -> elem.getAnnotation(ReadClass.class).value() == type).count() > 1){ + Utils.messager.printMessage(Kind.ERROR, "Multiple writer methods for type: ", writer); + } + + //make sure there's only one write method + Stream stream = readers.stream().filter(elem -> elem.getAnnotation(ReadClass.class).value() == type); + if(stream.count() == 0){ + Utils.messager.printMessage(Kind.ERROR, "Writer method does not have an accompanying reader: ", writer); + }else if(stream.count() > 1){ + Utils.messager.printMessage(Kind.ERROR, "Writer method has multiple reader for type: ", writer); + } + + Element reader = stream.findFirst().get(); + + //add to result list + result.put(type.getName(), new ClassSerializer(getFullMethod(reader), getFullMethod(writer), type.getName())); + } + + return result; + } + + private String getFullMethod(Element element){ + return element.getEnclosingElement().asType().toString() + "." + element.getSimpleName(); + } + + /**Information about read/write methods for a specific class type.*/ + public static class ClassSerializer{ + /**Fully qualified method name of the reader.*/ + public final String readMethod; + /**Fully qualified method name of the writer.*/ + public final String writeMethod; + /**Fully qualified class type name.*/ + public final String classType; + + public ClassSerializer(String readMethod, String writeMethod, String classType) { + this.readMethod = readMethod; + this.writeMethod = writeMethod; + this.classType = classType; + } + } +} diff --git a/annotations/src/io/anuke/annotations/MethodEntry.java b/annotations/src/io/anuke/annotations/MethodEntry.java new file mode 100644 index 0000000000..3036afde33 --- /dev/null +++ b/annotations/src/io/anuke/annotations/MethodEntry.java @@ -0,0 +1,23 @@ +package io.anuke.annotations; + +/**Class that repesents a remote method to be constructed and put into a class.*/ +public class MethodEntry { + /**Simple target class name.*/ + public final String className; + /**Fully qualified target method to call.*/ + public final String targetMethod; + /**Whether this method can be called on a client/server.*/ + public final boolean client, server; + /**Whether an additional 'one' and 'all' method variant is generated. At least one of these must be true. + * Only applicable to client (server-invoked) methods.*/ + public final boolean allVariant, oneVariant; + + public MethodEntry(String className, String targetMethod, boolean client, boolean server, boolean allVariant, boolean oneVariant) { + this.className = className; + this.targetMethod = targetMethod; + this.client = client; + this.server = server; + this.allVariant = allVariant; + this.oneVariant = oneVariant; + } +} diff --git a/annotations/src/io/anuke/annotations/AnnotationProcessor.java b/annotations/src/io/anuke/annotations/RemoteMethodAnnotationProcessor.java similarity index 83% rename from annotations/src/io/anuke/annotations/AnnotationProcessor.java rename to annotations/src/io/anuke/annotations/RemoteMethodAnnotationProcessor.java index 8bba91ca12..ff8ca50e0d 100644 --- a/annotations/src/io/anuke/annotations/AnnotationProcessor.java +++ b/annotations/src/io/anuke/annotations/RemoteMethodAnnotationProcessor.java @@ -5,6 +5,7 @@ import io.anuke.annotations.Annotations.Local; import io.anuke.annotations.Annotations.RemoteClient; import io.anuke.annotations.Annotations.RemoteServer; import io.anuke.annotations.Annotations.Unreliable; +import io.anuke.annotations.IOFinder.ClassSerializer; import javax.annotation.processing.*; import javax.lang.model.SourceVersion; @@ -34,60 +35,30 @@ import java.util.Set; "io.anuke.annotations.Annotations.RemoteClient", "io.anuke.annotations.Annotations.RemoteServer", "io.anuke.annotations.Annotations.Local", - "io.anuke.annotations.Annotations.Unreliable" + "io.anuke.annotations.Annotations.Unreliable", + "io.anuke.annotations.Annotations.In", + "io.anuke.annotations.Annotations.WriteClass", + "io.anuke.annotations.Annotations.ReadClass", }) -public class AnnotationProcessor extends AbstractProcessor { - private static final int maxPacketSize = 128; +public class RemoteMethodAnnotationProcessor extends AbstractProcessor { + /**Maximum size of each event packet.*/ + private static final int maxPacketSize = 512; + /**Name of the base package to put all the generated classes.*/ + private static final String packageClassName = "io.anuke.mindustry.gen"; - private static final String clientFullClassName = "io.anuke.mindustry.gen.CallClient"; - private static final String serverFullClassName = "io.anuke.mindustry.gen.CallServer"; - - private static final HashMap writeMap = new HashMap(){{ - put("Player", new String[][]{ - { - "rbuffer.putInt(rvalue.id)" - }, - { - "rtype rvalue = io.anuke.mindustry.Vars.playerGroup.getByID(rbuffer.getInt())" - } - }); - - put("Tile", new String[][]{ - { - "rbuffer.putInt(rvalue.packedPosition())" - }, - { - "rtype rvalue = io.anuke.mindustry.Vars.world.tile(rbuffer.getInt())" - } - }); - - put("String", new String[][]{ - { - "rbuffer.putShort((short)rvalue.getBytes().length)", - "rbuffer.put(rvalue.getBytes())" - }, - { - "short __rvalue_length = rbuffer.getShort()", - "byte[] __rvalue_bytes = new byte[__rvalue_length]", - "rbuffer.get(__rvalue_bytes)", - "rtype rvalue = new rtype(__rvalue_bytes)" - } - }); - }}; - - private Types typeUtils; - private Elements elementUtils; - private Filer filer; - private Messager messager; + /**Maps fully qualified class names to serializers.*/ + private HashMap serializers; + /**Whether the initial round is done.*/ private boolean done; @Override public synchronized void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); - typeUtils = processingEnv.getTypeUtils(); - elementUtils = processingEnv.getElementUtils(); - filer = processingEnv.getFiler(); - messager = processingEnv.getMessager(); + //put all relevant utils into utils class + Utils.typeUtils = processingEnv.getTypeUtils(); + Utils.elementUtils = processingEnv.getElementUtils(); + Utils.filer = processingEnv.getFiler(); + Utils.messager = processingEnv.getMessager(); } @Override @@ -95,13 +66,15 @@ public class AnnotationProcessor extends AbstractProcessor { if(done) return false; done = true; + serializers = new IOFinder().findSerializers(roundEnv); + writeElements(roundEnv, clientFullClassName, RemoteClient.class); writeElements(roundEnv, serverFullClassName, RemoteServer.class); return true; } - private void writeElements(RoundEnvironment env, String fullClassName, Class annotation){ + private void writeElements(RoundEnvironment env){ try { boolean client = annotation == RemoteServer.class; String className = fullClassName.substring(1 + fullClassName.lastIndexOf('.')); @@ -279,15 +252,14 @@ public class AnnotationProcessor extends AbstractProcessor { TypeSpec spec = classBuilder.build(); JavaFile.builder(packageName, spec).build().writeTo(filer); + + }catch (Exception e){ e.printStackTrace(); throw new RuntimeException(e); } } - private boolean isPrimitive(String type){ - return type.equals("boolean") || type.equals("byte") || type.equals("short") || type.equals("int") - || type.equals("long") || type.equals("float") || type.equals("double") || type.equals("char"); - } + } diff --git a/annotations/src/io/anuke/annotations/Serializers.java b/annotations/src/io/anuke/annotations/Serializers.java deleted file mode 100644 index 75c232f816..0000000000 --- a/annotations/src/io/anuke/annotations/Serializers.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.anuke.annotations; - -public class Serializers { -} diff --git a/annotations/src/io/anuke/annotations/Utils.java b/annotations/src/io/anuke/annotations/Utils.java new file mode 100644 index 0000000000..63d21b539e --- /dev/null +++ b/annotations/src/io/anuke/annotations/Utils.java @@ -0,0 +1,18 @@ +package io.anuke.annotations; + +import javax.annotation.processing.Filer; +import javax.annotation.processing.Messager; +import javax.lang.model.util.Elements; +import javax.lang.model.util.Types; + +public class Utils { + public static Types typeUtils; + public static Elements elementUtils; + public static Filer filer; + public static Messager messager; + + public static boolean isPrimitive(String type){ + return type.equals("boolean") || type.equals("byte") || type.equals("short") || type.equals("int") + || type.equals("long") || type.equals("float") || type.equals("double") || type.equals("char"); + } +} diff --git a/build.gradle b/build.gradle index 625297b66c..62edd576a5 100644 --- a/build.gradle +++ b/build.gradle @@ -149,7 +149,7 @@ project(":core") { apply plugin: "java" dependencies { - //compileOnly project(":annotations") + compileOnly project(":annotations") boolean comp = System.properties["release"] == null || System.properties["release"] == "false" @@ -174,9 +174,9 @@ project(":core") { compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion" } - //compileJava.options.compilerArgs = [ - // "-processor", "io.anuke.annotations.AnnotationProcessor" - //] + compileJava.options.compilerArgs = [ + "-processor", "io.anuke.annotations.RemoteMethodAnnotationProcessor" + ] } project(":server") { diff --git a/core/assets-raw/sprites/blocks/distribution/weaponfactory.png b/core/assets-raw/sprites/blocks/distribution/weaponfactory.png deleted file mode 100644 index d8d3812bde3e96c79d193f9eb260ae1c5a6b2994..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 411 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4kiW$h6xih%orFLI14-?iy0WWg+Z8+Vb&Z8 z1_lQ95>H=O_D9T8!g>t9tWUBtFfd4#xJHyX=jZ08=9Mrw7o{eaq^2m8XO?6rxO@5r zgg5euGcYiUdb&7t6 z4(>-zOj{_~E$1v3)K=x-lUVS0S6=HC^Ph9ymY09?eYNXaRPvftIR!DR&l=^a8XIp8 zI`#d0Np6>3&TTX16YKxRa2}Y?XS2=r47Y-y;KXZDzvj(+?99KJpW*9m6}C=}hK_~1 zzhD3HEHYr$(Y(Klg%)o+Yg5=1o~q0^W6|T4(ZYB8>YOfegr$DA{mr`0<3sr|I1~BB{yIG8~o`2rv=a9e@#JJV#yO3 z1GGYSoS(!WUr;7umy&q*d+ogEnbXcB9iQJ`*&qDk#&^E>hiVa>YyCb63s7#J8l MUHx3vIVCg!0C%gR3;+NC diff --git a/core/assets-raw/sprites/blocks/production/weaponfactory.png b/core/assets-raw/sprites/blocks/production/weaponfactory.png new file mode 100644 index 0000000000000000000000000000000000000000..d3159244c5b3386d84b32dafc8ae112715d1b66e GIT binary patch literal 381 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
pyoY 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 BNZ|kg delta 59298 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%0AUmEq6#V*(9~4%Z&W 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

tigc@SGnA^G-*2V1H#PnshS#Htp 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 aWYQ+PI*G?Om>C!t7(8A5T-G@yGywomy&J&* diff --git a/core/src/Mindustry.gwt.xml b/core/src/Mindustry.gwt.xml index b16e9a709d..2f73583bb5 100644 --- a/core/src/Mindustry.gwt.xml +++ b/core/src/Mindustry.gwt.xml @@ -18,6 +18,6 @@ - + \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/ai/BlockIndexer.java b/core/src/io/anuke/mindustry/ai/BlockIndexer.java index af68f54daa..aaa1fe5361 100644 --- a/core/src/io/anuke/mindustry/ai/BlockIndexer.java +++ b/core/src/io/anuke/mindustry/ai/BlockIndexer.java @@ -8,7 +8,7 @@ import io.anuke.mindustry.game.EventType.TileChangeEvent; import io.anuke.mindustry.game.EventType.WorldLoadEvent; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.BlockFlag; +import io.anuke.mindustry.world.meta.BlockFlag; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Events; import io.anuke.ucore.util.EnumSet; diff --git a/core/src/io/anuke/mindustry/ai/Pathfinder.java b/core/src/io/anuke/mindustry/ai/Pathfinder.java index 337ee3b832..76945f56c7 100644 --- a/core/src/io/anuke/mindustry/ai/Pathfinder.java +++ b/core/src/io/anuke/mindustry/ai/Pathfinder.java @@ -10,7 +10,7 @@ import io.anuke.mindustry.game.EventType.TileChangeEvent; import io.anuke.mindustry.game.EventType.WorldLoadEvent; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.TeamInfo.TeamData; -import io.anuke.mindustry.world.BlockFlag; +import io.anuke.mindustry.world.meta.BlockFlag; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Events; import io.anuke.ucore.core.Timers; diff --git a/core/src/io/anuke/mindustry/content/blocks/Blocks.java b/core/src/io/anuke/mindustry/content/blocks/Blocks.java index 9f584a43c6..4fe3d4ce52 100644 --- a/core/src/io/anuke/mindustry/content/blocks/Blocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/Blocks.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.*; +import io.anuke.mindustry.world.blocks.*; public class Blocks extends BlockList implements ContentList{ public static Block air, spawn, blockpart, build1, build2, build3, build4, build5, build6, defaultFloor, space, metalfloor, deepwater, water, lava, oil, stone, blackstone, iron, lead, coal, titanium, thorium, dirt, sand, ice, snow, grass, sandblock, snowblock, stoneblock, blackstoneblock, grassblock, mossblock, shrub, rock, icerock, blackrock, dirtblock; diff --git a/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java b/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java index a5af6c2f52..c049951d34 100644 --- a/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/CraftingBlocks.java @@ -8,7 +8,7 @@ import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.blocks.types.production.*; +import io.anuke.mindustry.world.blocks.production.*; public class CraftingBlocks extends BlockList implements ContentList { public static Block smelter, alloysmelter, siliconsmelter, poweralloysmelter, powersmelter, cryofluidmixer, melter, separator, centrifuge, plasticFormer, biomatterCompressor, pulverizer, oilRefinery, stoneFormer, weaponFactory, incinerator; diff --git a/core/src/io/anuke/mindustry/content/blocks/DebugBlocks.java b/core/src/io/anuke/mindustry/content/blocks/DebugBlocks.java index f1b6bfd02c..0bb9ca9f56 100644 --- a/core/src/io/anuke/mindustry/content/blocks/DebugBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/DebugBlocks.java @@ -8,9 +8,9 @@ import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.PowerBlock; -import io.anuke.mindustry.world.blocks.types.distribution.Sorter; -import io.anuke.mindustry.world.blocks.types.power.PowerDistributor; +import io.anuke.mindustry.world.blocks.PowerBlock; +import io.anuke.mindustry.world.blocks.distribution.Sorter; +import io.anuke.mindustry.world.blocks.power.PowerDistributor; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.scene.ui.ButtonGroup; import io.anuke.ucore.scene.ui.ImageButton; @@ -64,11 +64,7 @@ public class DebugBlocks extends BlockList implements ContentList{ solid = true; hasLiquids = true; liquidCapacity = 100f; - } - - @Override - public boolean isConfigurable(Tile tile) { - return true; + configurable = true; } @Override diff --git a/core/src/io/anuke/mindustry/content/blocks/DefenseBlocks.java b/core/src/io/anuke/mindustry/content/blocks/DefenseBlocks.java index 1edb9021fd..c572802521 100644 --- a/core/src/io/anuke/mindustry/content/blocks/DefenseBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/DefenseBlocks.java @@ -3,9 +3,9 @@ package io.anuke.mindustry.content.blocks; import io.anuke.mindustry.content.fx.BlockFx; import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.blocks.types.Wall; -import io.anuke.mindustry.world.blocks.types.defense.Door; -import io.anuke.mindustry.world.blocks.types.defense.ShieldedWallBlock; +import io.anuke.mindustry.world.blocks.Wall; +import io.anuke.mindustry.world.blocks.defense.Door; +import io.anuke.mindustry.world.blocks.defense.ShieldedWallBlock; public class DefenseBlocks extends BlockList implements ContentList { public static Block stonewall, ironwall, steelwall, titaniumwall, diriumwall, compositewall, steelwalllarge, titaniumwalllarge, diriumwalllarge, titaniumshieldwall, door, largedoor; diff --git a/core/src/io/anuke/mindustry/content/blocks/DistributionBlocks.java b/core/src/io/anuke/mindustry/content/blocks/DistributionBlocks.java index 20910ed60a..5ca43c60c4 100644 --- a/core/src/io/anuke/mindustry/content/blocks/DistributionBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/DistributionBlocks.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.content.blocks; import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.blocks.types.distribution.*; +import io.anuke.mindustry.world.blocks.distribution.*; public class DistributionBlocks extends BlockList implements ContentList{ public static Block conveyor, steelconveyor, pulseconveyor, router, multiplexer, junction, bridgeconveyor, laserconveyor, sorter, splitter, overflowgate; diff --git a/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java b/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java index ac616eb4bb..9789aba668 100644 --- a/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/LiquidBlocks.java @@ -2,8 +2,8 @@ package io.anuke.mindustry.content.blocks; import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.blocks.types.distribution.*; -import io.anuke.mindustry.world.blocks.types.production.Pump; +import io.anuke.mindustry.world.blocks.distribution.*; +import io.anuke.mindustry.world.blocks.production.Pump; public class LiquidBlocks extends BlockList implements ContentList{ public static Block pump, fluxpump, conduit, pulseconduit, liquidrouter, liquidtank, liquidjunction, bridgeconduit, laserconduit; diff --git a/core/src/io/anuke/mindustry/content/blocks/PowerBlocks.java b/core/src/io/anuke/mindustry/content/blocks/PowerBlocks.java index 843a37d635..6f2cddec31 100644 --- a/core/src/io/anuke/mindustry/content/blocks/PowerBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/PowerBlocks.java @@ -3,10 +3,10 @@ package io.anuke.mindustry.content.blocks; import io.anuke.mindustry.content.fx.BlockFx; import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.blocks.types.defense.RepairTurret; -import io.anuke.mindustry.world.blocks.types.defense.ShieldBlock; -import io.anuke.mindustry.world.blocks.types.distribution.Teleporter; -import io.anuke.mindustry.world.blocks.types.power.*; +import io.anuke.mindustry.world.blocks.defense.RepairTurret; +import io.anuke.mindustry.world.blocks.defense.ShieldBlock; +import io.anuke.mindustry.world.blocks.distribution.Teleporter; +import io.anuke.mindustry.world.blocks.power.*; public class PowerBlocks extends BlockList implements ContentList { public static Block combustiongenerator, thermalgenerator, liquidcombustiongenerator, rtgenerator, solarpanel, largesolarpanel, nuclearReactor, fusionReactor, repairturret, megarepairturret, shieldgenerator, battery, batteryLarge, powernode, powernodelarge, teleporter; diff --git a/core/src/io/anuke/mindustry/content/blocks/ProductionBlocks.java b/core/src/io/anuke/mindustry/content/blocks/ProductionBlocks.java index 62108599ba..2e3d08d1b2 100644 --- a/core/src/io/anuke/mindustry/content/blocks/ProductionBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/ProductionBlocks.java @@ -6,10 +6,10 @@ import io.anuke.mindustry.content.Liquids; import io.anuke.mindustry.content.fx.BlockFx; import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.blocks.types.production.Cultivator; -import io.anuke.mindustry.world.blocks.types.production.Drill; -import io.anuke.mindustry.world.blocks.types.production.Fracker; -import io.anuke.mindustry.world.blocks.types.production.SolidPump; +import io.anuke.mindustry.world.blocks.production.Cultivator; +import io.anuke.mindustry.world.blocks.production.Drill; +import io.anuke.mindustry.world.blocks.production.Fracker; +import io.anuke.mindustry.world.blocks.production.SolidPump; public class ProductionBlocks extends BlockList implements ContentList { public static Block ironDrill, reinforcedDrill, steelDrill, titaniumDrill, laserdrill, nucleardrill, plasmadrill, waterextractor, oilextractor, cultivator; diff --git a/core/src/io/anuke/mindustry/content/blocks/StorageBlocks.java b/core/src/io/anuke/mindustry/content/blocks/StorageBlocks.java index abc9582a78..4e5a2953c9 100644 --- a/core/src/io/anuke/mindustry/content/blocks/StorageBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/StorageBlocks.java @@ -2,10 +2,10 @@ package io.anuke.mindustry.content.blocks; import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.blocks.types.storage.CoreBlock; -import io.anuke.mindustry.world.blocks.types.storage.SortedUnloader; -import io.anuke.mindustry.world.blocks.types.storage.Unloader; -import io.anuke.mindustry.world.blocks.types.storage.Vault; +import io.anuke.mindustry.world.blocks.storage.CoreBlock; +import io.anuke.mindustry.world.blocks.storage.SortedUnloader; +import io.anuke.mindustry.world.blocks.storage.Unloader; +import io.anuke.mindustry.world.blocks.storage.Vault; public class StorageBlocks extends BlockList implements ContentList { public static Block core, vault, unloader, sortedunloader; diff --git a/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java b/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java index 6ec0595bc2..940559185f 100644 --- a/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/UnitBlocks.java @@ -5,10 +5,10 @@ import io.anuke.mindustry.content.UnitTypes; import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.blocks.types.units.DropPoint; -import io.anuke.mindustry.world.blocks.types.units.RepairPoint; -import io.anuke.mindustry.world.blocks.types.units.ResupplyPoint; -import io.anuke.mindustry.world.blocks.types.units.UnitFactory; +import io.anuke.mindustry.world.blocks.units.DropPoint; +import io.anuke.mindustry.world.blocks.units.RepairPoint; +import io.anuke.mindustry.world.blocks.units.ResupplyPoint; +import io.anuke.mindustry.world.blocks.units.UnitFactory; public class UnitBlocks extends BlockList implements ContentList { public static Block resupplyPoint, repairPoint, droneFactory, dropPoint; diff --git a/core/src/io/anuke/mindustry/content/blocks/WeaponBlocks.java b/core/src/io/anuke/mindustry/content/blocks/WeaponBlocks.java index c1049e119f..bc9eed1dd9 100644 --- a/core/src/io/anuke/mindustry/content/blocks/WeaponBlocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/WeaponBlocks.java @@ -6,7 +6,7 @@ import io.anuke.mindustry.content.fx.ShootFx; import io.anuke.mindustry.type.AmmoType; import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.blocks.types.defense.turrets.*; +import io.anuke.mindustry.world.blocks.defense.turrets.*; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.util.Angles; import io.anuke.ucore.util.Mathf; diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index 295bfe8b34..23227858f7 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -81,8 +81,8 @@ public class Logic extends Module { public void runWave(){ - //TODO spawn enemies - for(int i = 0; i < 100; i ++){ + //TODO spawn enemies properly + for(int i = 0; i < 10; i ++){ BaseUnit unit = UnitTypes.vtol.create(Team.red); Vector2 offset = new Vector2().setToRandomDirection().scl(world.width()/2f*tilesize).add(world.width()/2f*tilesize, world.height()/2f*tilesize); unit.inventory.addAmmo(AmmoTypes.bulletIron); diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index 0de2681d55..d1c1e0d016 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -20,7 +20,7 @@ import io.anuke.mindustry.entities.traits.BelowLiquidTrait; import io.anuke.mindustry.entities.units.BaseUnit; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.world.BlockFlag; +import io.anuke.mindustry.world.meta.BlockFlag; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Effects; diff --git a/core/src/io/anuke/mindustry/editor/EditorTool.java b/core/src/io/anuke/mindustry/editor/EditorTool.java index 643dbac039..41b14efdaa 100644 --- a/core/src/io/anuke/mindustry/editor/EditorTool.java +++ b/core/src/io/anuke/mindustry/editor/EditorTool.java @@ -5,7 +5,7 @@ import com.badlogic.gdx.utils.IntSet; import io.anuke.mindustry.io.MapTileData.DataPosition; import io.anuke.mindustry.io.MapTileData.TileDataMarker; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.blocks.types.Floor; +import io.anuke.mindustry.world.blocks.Floor; import io.anuke.ucore.util.Bits; import static io.anuke.mindustry.Vars.ui; diff --git a/core/src/io/anuke/mindustry/editor/MapEditor.java b/core/src/io/anuke/mindustry/editor/MapEditor.java index 52e2f1b2db..8bfce352a9 100644 --- a/core/src/io/anuke/mindustry/editor/MapEditor.java +++ b/core/src/io/anuke/mindustry/editor/MapEditor.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.io.MapTileData; import io.anuke.mindustry.io.MapTileData.DataPosition; import io.anuke.mindustry.io.MapTileData.TileDataMarker; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.blocks.types.Floor; +import io.anuke.mindustry.world.blocks.Floor; import io.anuke.ucore.util.Bits; import io.anuke.ucore.util.Mathf; diff --git a/core/src/io/anuke/mindustry/editor/MapFilter.java b/core/src/io/anuke/mindustry/editor/MapFilter.java index 575cc7f173..ecb42559c4 100644 --- a/core/src/io/anuke/mindustry/editor/MapFilter.java +++ b/core/src/io/anuke/mindustry/editor/MapFilter.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.ColorMapper; import io.anuke.mindustry.world.ColorMapper.BlockPair; import io.anuke.mindustry.content.blocks.Blocks; -import io.anuke.mindustry.world.blocks.types.Floor; +import io.anuke.mindustry.world.blocks.Floor; import io.anuke.ucore.graphics.Pixmaps; import io.anuke.ucore.noise.RidgedPerlin; import io.anuke.ucore.noise.Simplex; diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java index ef76c2ae4e..985bce5d4c 100644 --- a/core/src/io/anuke/mindustry/entities/Player.java +++ b/core/src/io/anuke/mindustry/entities/Player.java @@ -20,8 +20,8 @@ import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Trail; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.Floor; -import io.anuke.mindustry.world.blocks.types.storage.CoreBlock.CoreEntity; +import io.anuke.mindustry.world.blocks.Floor; +import io.anuke.mindustry.world.blocks.storage.CoreBlock.CoreEntity; import io.anuke.ucore.core.*; import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.entities.trait.SolidTrait; diff --git a/core/src/io/anuke/mindustry/entities/TileEntity.java b/core/src/io/anuke/mindustry/entities/TileEntity.java index 287b049c6e..4a59c10b24 100644 --- a/core/src/io/anuke/mindustry/entities/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/TileEntity.java @@ -7,10 +7,10 @@ import io.anuke.mindustry.entities.traits.TargetTrait; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.Wall; -import io.anuke.mindustry.world.blocks.types.modules.InventoryModule; -import io.anuke.mindustry.world.blocks.types.modules.LiquidModule; -import io.anuke.mindustry.world.blocks.types.modules.PowerModule; +import io.anuke.mindustry.world.blocks.Wall; +import io.anuke.mindustry.world.blocks.modules.InventoryModule; +import io.anuke.mindustry.world.blocks.modules.LiquidModule; +import io.anuke.mindustry.world.blocks.modules.PowerModule; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.EntityGroup; diff --git a/core/src/io/anuke/mindustry/entities/Unit.java b/core/src/io/anuke/mindustry/entities/Unit.java index 6050189ec4..da21294d24 100644 --- a/core/src/io/anuke/mindustry/entities/Unit.java +++ b/core/src/io/anuke/mindustry/entities/Unit.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.net.Interpolator; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.StatusEffect; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.Floor; +import io.anuke.mindustry.world.blocks.Floor; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.impl.DestructibleEntity; diff --git a/core/src/io/anuke/mindustry/entities/effect/Shield.java b/core/src/io/anuke/mindustry/entities/effect/Shield.java index 11f183fce1..31f7175048 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Shield.java +++ b/core/src/io/anuke/mindustry/entities/effect/Shield.java @@ -2,7 +2,7 @@ package io.anuke.mindustry.entities.effect; import com.badlogic.gdx.math.Interpolation; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.defense.ShieldBlock; +import io.anuke.mindustry.world.blocks.defense.ShieldBlock; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.entities.impl.BaseEntity; diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index 25dd103e6d..96a885ce87 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -14,8 +14,8 @@ import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.world.Build; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.BuildBlock; -import io.anuke.mindustry.world.blocks.types.BuildBlock.BuildEntity; +import io.anuke.mindustry.world.blocks.BuildBlock; +import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Events; import io.anuke.ucore.core.Timers; diff --git a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java index 9f9c58eb94..5084ea6cc4 100644 --- a/core/src/io/anuke/mindustry/entities/units/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/units/BaseUnit.java @@ -10,7 +10,7 @@ import io.anuke.mindustry.game.Team; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.type.AmmoType; import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.BlockFlag; +import io.anuke.mindustry.world.meta.BlockFlag; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; diff --git a/core/src/io/anuke/mindustry/entities/units/FlyingUnit.java b/core/src/io/anuke/mindustry/entities/units/FlyingUnit.java index 78ad87562b..58f00041f0 100644 --- a/core/src/io/anuke/mindustry/entities/units/FlyingUnit.java +++ b/core/src/io/anuke/mindustry/entities/units/FlyingUnit.java @@ -7,7 +7,7 @@ import io.anuke.mindustry.game.Team; import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Trail; import io.anuke.mindustry.type.AmmoType; -import io.anuke.mindustry.world.BlockFlag; +import io.anuke.mindustry.world.meta.BlockFlag; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; diff --git a/core/src/io/anuke/mindustry/entities/units/GroundUnit.java b/core/src/io/anuke/mindustry/entities/units/GroundUnit.java index 325e5a97be..a42227e547 100644 --- a/core/src/io/anuke/mindustry/entities/units/GroundUnit.java +++ b/core/src/io/anuke/mindustry/entities/units/GroundUnit.java @@ -5,9 +5,9 @@ import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.type.AmmoType; -import io.anuke.mindustry.world.BlockFlag; +import io.anuke.mindustry.world.meta.BlockFlag; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.Floor; +import io.anuke.mindustry.world.blocks.Floor; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.util.*; diff --git a/core/src/io/anuke/mindustry/entities/units/types/Drone.java b/core/src/io/anuke/mindustry/entities/units/types/Drone.java index 5347a52e07..f3d91a6c1d 100644 --- a/core/src/io/anuke/mindustry/entities/units/types/Drone.java +++ b/core/src/io/anuke/mindustry/entities/units/types/Drone.java @@ -13,10 +13,10 @@ import io.anuke.mindustry.entities.units.UnitType; import io.anuke.mindustry.game.EventType.BlockBuildEvent; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.graphics.Palette; -import io.anuke.mindustry.world.BlockFlag; +import io.anuke.mindustry.world.meta.BlockFlag; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.BuildBlock; -import io.anuke.mindustry.world.blocks.types.BuildBlock.BuildEntity; +import io.anuke.mindustry.world.blocks.BuildBlock; +import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity; import io.anuke.ucore.core.Events; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.EntityGroup; diff --git a/core/src/io/anuke/mindustry/entities/units/types/Vtol.java b/core/src/io/anuke/mindustry/entities/units/types/Vtol.java index c681b1d661..67232a4631 100644 --- a/core/src/io/anuke/mindustry/entities/units/types/Vtol.java +++ b/core/src/io/anuke/mindustry/entities/units/types/Vtol.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.entities.units.types; -import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.mindustry.entities.units.FlyingUnit; import io.anuke.mindustry.entities.units.UnitType; import io.anuke.mindustry.game.Team; @@ -9,10 +8,6 @@ import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.util.Mathf; public class Vtol extends FlyingUnit { - static TextureRegion - booster1 = Draw.region("vtol-booster-1"), - booster2 = Draw.region("vtol-booster-2"), - region = Draw.region("vtol"); public Vtol(UnitType type, Team team) { super(type, team); @@ -22,10 +17,11 @@ public class Vtol extends FlyingUnit { public void draw() { Draw.alpha(hitTime / hitDuration); - Draw.rect(region, x, y, rotation - 90); + Draw.rect("vtol", x, y, rotation - 90); + for(int i : Mathf.signs){ - Draw.rect(booster1, x, y, 12*i, 12, rotation - 90); - Draw.rect(booster2, x, y, 12*i, 12, rotation - 90); + Draw.rect("vtol-booster-1", x, y, 12*i, 12, rotation - 90); + Draw.rect("vtol-booster-2", x, y, 12*i, 12, rotation - 90); } Draw.alpha(1f); diff --git a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java index b78ef50a26..d3d935a337 100644 --- a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java @@ -5,7 +5,7 @@ import io.anuke.mindustry.content.blocks.Blocks; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.StaticBlock; +import io.anuke.mindustry.world.blocks.StaticBlock; import io.anuke.ucore.core.Graphics; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.util.Mathf; diff --git a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java index 11f199dfcc..24a6afa6fa 100644 --- a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.game.TeamInfo.TeamData; import io.anuke.mindustry.input.InputHandler; -import io.anuke.mindustry.world.BlockBar; +import io.anuke.mindustry.world.meta.BlockBar; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Inputs; diff --git a/core/src/io/anuke/mindustry/input/CursorType.java b/core/src/io/anuke/mindustry/input/CursorType.java new file mode 100644 index 0000000000..fd55b7998e --- /dev/null +++ b/core/src/io/anuke/mindustry/input/CursorType.java @@ -0,0 +1,23 @@ +package io.anuke.mindustry.input; + +import io.anuke.ucore.function.Callable; +import io.anuke.ucore.scene.utils.Cursors; + +/**Type of cursor for displaying on desktop.*/ +public enum CursorType { + normal(Cursors::restoreCursor), + hand(Cursors::setHand), + drill(() -> Cursors.set("drill")), + unload(() -> Cursors.set("unload")); + + private final Callable call; + + CursorType(Callable call){ + this.call = call; + } + + /**Sets the current system cursor to this.*/ + void set(){ + call.run(); + } +} diff --git a/core/src/io/anuke/mindustry/input/DesktopInput.java b/core/src/io/anuke/mindustry/input/DesktopInput.java index 284f818829..745d089c82 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/io/anuke/mindustry/input/DesktopInput.java @@ -16,15 +16,13 @@ import io.anuke.ucore.core.Inputs; import io.anuke.ucore.core.Inputs.DeviceType; import io.anuke.ucore.core.KeyBinds; import io.anuke.ucore.core.Settings; -import io.anuke.ucore.function.Callable; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Lines; import io.anuke.ucore.scene.ui.layout.Unit; -import io.anuke.ucore.scene.utils.Cursors; import io.anuke.ucore.util.Mathf; import static io.anuke.mindustry.Vars.*; -import static io.anuke.mindustry.input.DesktopInput.CursorType.*; +import static io.anuke.mindustry.input.CursorType.*; import static io.anuke.mindustry.input.PlaceMode.*; public class DesktopInput extends InputHandler{ @@ -154,9 +152,7 @@ public class DesktopInput extends InputHandler{ if(cursor != null){ cursor = cursor.target(); - if(cursor.block().isCursor(cursor)) { - cursorType = hand; - } + cursorType = cursor.block().getCursor(cursor); if(canMine(cursor)){ cursorType = drill; @@ -314,20 +310,4 @@ public class DesktopInput extends InputHandler{ } } - enum CursorType{ - normal(Cursors::restoreCursor), - hand(Cursors::setHand), - drill(() -> Cursors.set("drill")), - unload(() -> Cursors.set("unload")); - - private final Callable call; - - CursorType(Callable call){ - this.call = call; - } - - void set(){ - call.run(); - } - } } diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/io/anuke/mindustry/input/InputHandler.java index bfa46788e8..75fbcacbd0 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/io/anuke/mindustry/input/InputHandler.java @@ -94,7 +94,7 @@ public abstract class InputHandler extends InputAdapter{ boolean showedInventory = false; //check if tapped block is configurable - if(tile.block().isConfigurable(tile) && tile.getTeam() == player.getTeam()){ + if(tile.block().configurable && tile.getTeam() == player.getTeam()){ consumed = true; if((!frag.config.isShown() //if the config fragment is hidden, show //alternatively, the current selected block can 'agree' to switch config tiles diff --git a/core/src/io/anuke/mindustry/io/TypeIO.java b/core/src/io/anuke/mindustry/io/TypeIO.java new file mode 100644 index 0000000000..76b321508c --- /dev/null +++ b/core/src/io/anuke/mindustry/io/TypeIO.java @@ -0,0 +1,50 @@ +package io.anuke.mindustry.io; + +import io.anuke.annotations.Annotations.ReadClass; +import io.anuke.annotations.Annotations.WriteClass; +import io.anuke.mindustry.entities.Player; +import io.anuke.mindustry.world.Tile; + + +import java.nio.ByteBuffer; + +import static io.anuke.mindustry.Vars.playerGroup; +import static io.anuke.mindustry.Vars.world; + +public class TypeIO { + + @WriteClass(Player.class) + public static void writePlayer(ByteBuffer buffer, Player player){ + buffer.putInt(player.id); + } + + @ReadClass(Player.class) + public static Player readPlayer(ByteBuffer buffer){ + return playerGroup.getByID(buffer.getInt()); + } + + @WriteClass(Tile.class) + public static void writeTile(ByteBuffer buffer, Tile tile){ + buffer.putInt(tile.packedPosition()); + } + + @ReadClass(Tile.class) + public static Tile readTile(ByteBuffer buffer){ + return world.tile(buffer.getInt()); + } + + @WriteClass(String.class) + public static void writeString(ByteBuffer buffer, String string){ + byte[] bytes = string.getBytes(); + buffer.putShort((short)bytes.length); + buffer.put(bytes); + } + + @ReadClass(String.class) + public static String readString(ByteBuffer buffer){ + short length = buffer.getShort(); + byte[] bytes = new byte[length]; + buffer.get(bytes); + return new String(bytes); + } +} diff --git a/core/src/io/anuke/mindustry/io/versions/Save16.java b/core/src/io/anuke/mindustry/io/versions/Save16.java index fc7689cebe..96b314752e 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save16.java +++ b/core/src/io/anuke/mindustry/io/versions/Save16.java @@ -11,7 +11,7 @@ import io.anuke.mindustry.game.Team; import io.anuke.mindustry.io.SaveFileVersion; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.BlockPart; +import io.anuke.mindustry.world.blocks.BlockPart; import io.anuke.ucore.entities.Entities; import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.entities.EntityPhysics; diff --git a/core/src/io/anuke/mindustry/net/Administration.java b/core/src/io/anuke/mindustry/net/Administration.java index d690e6f093..561bf3b33f 100644 --- a/core/src/io/anuke/mindustry/net/Administration.java +++ b/core/src/io/anuke/mindustry/net/Administration.java @@ -6,10 +6,10 @@ import com.badlogic.gdx.utils.ObjectMap; import com.badlogic.gdx.utils.TimeUtils; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.blocks.types.BlockPart; -import io.anuke.mindustry.world.blocks.types.Floor; -import io.anuke.mindustry.world.blocks.types.Rock; -import io.anuke.mindustry.world.blocks.types.StaticBlock; +import io.anuke.mindustry.world.blocks.BlockPart; +import io.anuke.mindustry.world.blocks.Floor; +import io.anuke.mindustry.world.blocks.Rock; +import io.anuke.mindustry.world.blocks.StaticBlock; import io.anuke.ucore.core.Settings; import static io.anuke.mindustry.Vars.world; diff --git a/core/src/io/anuke/mindustry/net/Interpolator.java b/core/src/io/anuke/mindustry/net/Interpolator.java index ae7652515e..aed9a61259 100644 --- a/core/src/io/anuke/mindustry/net/Interpolator.java +++ b/core/src/io/anuke/mindustry/net/Interpolator.java @@ -18,8 +18,6 @@ public class Interpolator { public Vector2 pos = new Vector2(); public float[] values = {}; - public Vector2 smoothPos = new Vector2(); - public void read(float cx, float cy, float x, float y, long sent, float... target1ds){ targets = target1ds; time = 0f; diff --git a/core/src/io/anuke/mindustry/net/NetworkIO.java b/core/src/io/anuke/mindustry/net/NetworkIO.java index b511e60f7e..50b813b2aa 100644 --- a/core/src/io/anuke/mindustry/net/NetworkIO.java +++ b/core/src/io/anuke/mindustry/net/NetworkIO.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.game.Team; import io.anuke.mindustry.io.Version; import io.anuke.mindustry.type.Upgrade; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.BlockPart; +import io.anuke.mindustry.world.blocks.BlockPart; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.Entities; import io.anuke.ucore.util.Bits; diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index d926fd3d30..f69a07aa9d 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -17,9 +17,15 @@ import io.anuke.mindustry.game.UnlockableContent; import io.anuke.mindustry.graphics.CacheLayer; import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.graphics.Palette; +import io.anuke.mindustry.input.CursorType; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.Liquid; +import io.anuke.mindustry.world.meta.BlockBar; +import io.anuke.mindustry.world.meta.BlockBars; +import io.anuke.mindustry.world.meta.BlockFlag; +import io.anuke.mindustry.world.meta.BlockGroup; +import io.anuke.mindustry.world.meta.BlockStats; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Hue; @@ -98,11 +104,11 @@ public class Block extends BaseBlock implements UnlockableContent{ /**whether this block has instant transfer checking. used for calculations to prevent infinite loops.*/ public boolean instantTransfer = false; /**The block group. Unless {@link #canReplace} is overriden, blocks in the same group can replace each other.*/ - public BlockGroup group = BlockGroup.none; + public io.anuke.mindustry.world.meta.BlockGroup group = io.anuke.mindustry.world.meta.BlockGroup.none; /**list of displayed block status bars. Defaults to health bar.*/ - public BlockBars bars = new BlockBars(); + public io.anuke.mindustry.world.meta.BlockBars bars = new BlockBars(); /**List of block stats.*/ - public BlockStats stats = new BlockStats(); + public io.anuke.mindustry.world.meta.BlockStats stats = new BlockStats(); /**List of block flags. Used for AI indexing.*/ public EnumSet flags; /**Whether to automatically set the entity to 'sleeping' when created.*/ @@ -113,6 +119,8 @@ public class Block extends BaseBlock implements UnlockableContent{ public TextureRegion shadowRegion; /**Texture region array for drawing multiple shadows.*/ public TextureRegion[] shadowRegions; + /**Whether the block can be tapped and selected to configure.*/ + public boolean configurable; public Block(String name) { this.name = name; @@ -174,28 +182,14 @@ public class Block extends BaseBlock implements UnlockableContent{ } /**Returns whether or not a hand cursor should be shown over this block.*/ - public boolean isCursor(Tile tile){ - return isConfigurable(tile); + public CursorType getCursor(Tile tile){ + return configurable ? CursorType.normal : CursorType.hand; } /**Called when this block is tapped to build a UI on the table. - * {@link #isConfigurable(Tile)} able} must return true for this to be called.*/ + * {@link #configurable} able} must return true for this to be called.*/ public void buildTable(Tile tile, Table table) {} - //TODO why make it a method? - /**Returns whether this tile can be configured.*/ - public boolean isConfigurable(Tile tile){ - return false; - } - - //TODO remove this - public void configure(Tile tile, byte data){} - - //TODO remove this - public void setConfigure(Tile tile, byte data){ - configure(tile, data); - } - /**Called when another tile is tapped while this block is selected. * Returns whether or not this block should be deselected.*/ public boolean onConfigureTileTapped(Tile tile, Tile other){ @@ -225,8 +219,8 @@ public class Block extends BaseBlock implements UnlockableContent{ //TODO make this easier to config. public void setBars(){ - if(hasPower) bars.add(new BlockBar(BarType.power, true, tile -> tile.entity.power.amount / powerCapacity)); - if(hasLiquids) bars.add(new BlockBar(BarType.liquid, true, tile -> tile.entity.liquids.amount / liquidCapacity)); + if(hasPower) bars.add(new io.anuke.mindustry.world.meta.BlockBar(BarType.power, true, tile -> tile.entity.power.amount / powerCapacity)); + if(hasLiquids) bars.add(new io.anuke.mindustry.world.meta.BlockBar(BarType.liquid, true, tile -> tile.entity.liquids.amount / liquidCapacity)); if(hasItems) bars.add(new BlockBar(BarType.inventory, true, tile -> (float)tile.entity.items.totalItems() / itemCapacity)); } diff --git a/core/src/io/anuke/mindustry/world/Build.java b/core/src/io/anuke/mindustry/world/Build.java index 12b41e37a6..9028092d88 100644 --- a/core/src/io/anuke/mindustry/world/Build.java +++ b/core/src/io/anuke/mindustry/world/Build.java @@ -7,7 +7,7 @@ import io.anuke.mindustry.content.fx.Fx; import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.type.Recipe; -import io.anuke.mindustry.world.blocks.types.BuildBlock.BuildEntity; +import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity; import io.anuke.ucore.core.Effects; import io.anuke.ucore.entities.Entities; diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index f6b4a3d642..060e3e5565 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -9,10 +9,10 @@ import io.anuke.mindustry.entities.traits.TargetTrait; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.game.Team; import io.anuke.mindustry.type.Recipe; -import io.anuke.mindustry.world.blocks.types.Floor; -import io.anuke.mindustry.world.blocks.types.modules.InventoryModule; -import io.anuke.mindustry.world.blocks.types.modules.LiquidModule; -import io.anuke.mindustry.world.blocks.types.modules.PowerModule; +import io.anuke.mindustry.world.blocks.Floor; +import io.anuke.mindustry.world.blocks.modules.InventoryModule; +import io.anuke.mindustry.world.blocks.modules.LiquidModule; +import io.anuke.mindustry.world.blocks.modules.PowerModule; import io.anuke.ucore.function.Consumer; import io.anuke.ucore.util.Bits; import io.anuke.ucore.entities.trait.PosTrait; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/BlendBlock.java b/core/src/io/anuke/mindustry/world/blocks/BlendBlock.java similarity index 94% rename from core/src/io/anuke/mindustry/world/blocks/types/BlendBlock.java rename to core/src/io/anuke/mindustry/world/blocks/BlendBlock.java index cd27addbf2..7c01a052be 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/BlendBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/BlendBlock.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types; +package io.anuke.mindustry.world.blocks; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/BlockModule.java b/core/src/io/anuke/mindustry/world/blocks/BlockModule.java similarity index 85% rename from core/src/io/anuke/mindustry/world/blocks/types/BlockModule.java rename to core/src/io/anuke/mindustry/world/blocks/BlockModule.java index 1ecd5b4774..97555ced39 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/BlockModule.java +++ b/core/src/io/anuke/mindustry/world/blocks/BlockModule.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types; +package io.anuke.mindustry.world.blocks; import java.io.DataInputStream; import java.io.DataOutputStream; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/BlockPart.java b/core/src/io/anuke/mindustry/world/blocks/BlockPart.java similarity index 97% rename from core/src/io/anuke/mindustry/world/blocks/types/BlockPart.java rename to core/src/io/anuke/mindustry/world/blocks/BlockPart.java index 5e8776c2b2..37788c5f23 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/BlockPart.java +++ b/core/src/io/anuke/mindustry/world/blocks/BlockPart.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types; +package io.anuke.mindustry.world.blocks; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Liquid; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/BuildBlock.java b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java similarity index 95% rename from core/src/io/anuke/mindustry/world/blocks/types/BuildBlock.java rename to core/src/io/anuke/mindustry/world/blocks/BuildBlock.java index e658ecf63f..cbad72aead 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/BuildBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types; +package io.anuke.mindustry.world.blocks; import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.mindustry.content.fx.ExplosionFx; @@ -14,9 +14,9 @@ import io.anuke.mindustry.graphics.Shaders; import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.world.BarType; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.BlockBar; +import io.anuke.mindustry.world.meta.BlockBar; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.modules.InventoryModule; +import io.anuke.mindustry.world.blocks.modules.InventoryModule; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Graphics; import io.anuke.ucore.graphics.Draw; @@ -31,6 +31,7 @@ public class BuildBlock extends Block { size = Integer.parseInt(name.charAt(name.length()-1) + ""); health = 1; layer = Layer.placement; + configurable = true; } @Override @@ -43,11 +44,6 @@ public class BuildBlock extends Block { return true; } - @Override - public boolean isCursor(Tile tile) { - return true; - } - @Override public void setBars(){ bars.replace(new BlockBar(BarType.health, true, tile -> (float)tile.entity().progress)); diff --git a/core/src/io/anuke/mindustry/world/blocks/types/Floor.java b/core/src/io/anuke/mindustry/world/blocks/Floor.java similarity index 98% rename from core/src/io/anuke/mindustry/world/blocks/types/Floor.java rename to core/src/io/anuke/mindustry/world/blocks/Floor.java index 0eb25ee907..3b5988ebd3 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/Floor.java +++ b/core/src/io/anuke/mindustry/world/blocks/Floor.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types; +package io.anuke.mindustry.world.blocks; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.TextureRegion; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/LiquidBlock.java b/core/src/io/anuke/mindustry/world/blocks/LiquidBlock.java similarity index 86% rename from core/src/io/anuke/mindustry/world/blocks/types/LiquidBlock.java rename to core/src/io/anuke/mindustry/world/blocks/LiquidBlock.java index 3254b17dfa..ff60b5c1cd 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/LiquidBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/LiquidBlock.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.world.blocks.types; +package io.anuke.mindustry.world.blocks; import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.BlockGroup; +import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.modules.LiquidModule; +import io.anuke.mindustry.world.blocks.modules.LiquidModule; import io.anuke.ucore.graphics.Draw; public class LiquidBlock extends Block{ diff --git a/core/src/io/anuke/mindustry/world/blocks/types/Ore.java b/core/src/io/anuke/mindustry/world/blocks/Ore.java similarity index 80% rename from core/src/io/anuke/mindustry/world/blocks/types/Ore.java rename to core/src/io/anuke/mindustry/world/blocks/Ore.java index 1dc567e078..ff0f155849 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/Ore.java +++ b/core/src/io/anuke/mindustry/world/blocks/Ore.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types; +package io.anuke.mindustry.world.blocks; import io.anuke.mindustry.content.blocks.Blocks; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/PowerBlock.java b/core/src/io/anuke/mindustry/world/blocks/PowerBlock.java similarity index 71% rename from core/src/io/anuke/mindustry/world/blocks/types/PowerBlock.java rename to core/src/io/anuke/mindustry/world/blocks/PowerBlock.java index 6df5bfd645..095aa42034 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/PowerBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/PowerBlock.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.world.blocks.types; +package io.anuke.mindustry.world.blocks; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.BlockGroup; +import io.anuke.mindustry.world.meta.BlockGroup; public abstract class PowerBlock extends Block{ diff --git a/core/src/io/anuke/mindustry/world/blocks/types/Rock.java b/core/src/io/anuke/mindustry/world/blocks/Rock.java similarity index 82% rename from core/src/io/anuke/mindustry/world/blocks/types/Rock.java rename to core/src/io/anuke/mindustry/world/blocks/Rock.java index 79984aa745..f6c463ece5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/Rock.java +++ b/core/src/io/anuke/mindustry/world/blocks/Rock.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types; +package io.anuke.mindustry.world.blocks; import io.anuke.mindustry.world.Block; diff --git a/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java b/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java new file mode 100644 index 0000000000..59e8bbbbb6 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/blocks/SelectionTrait.java @@ -0,0 +1,42 @@ +package io.anuke.mindustry.world.blocks; + +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.utils.Array; +import io.anuke.mindustry.type.Item; +import io.anuke.ucore.function.Consumer; +import io.anuke.ucore.function.Supplier; +import io.anuke.ucore.scene.style.TextureRegionDrawable; +import io.anuke.ucore.scene.ui.ButtonGroup; +import io.anuke.ucore.scene.ui.ImageButton; +import io.anuke.ucore.scene.ui.layout.Table; + +public interface SelectionTrait { + + default void buildItemTable(Table table, Supplier holder, Consumer consumer){ + + Array items = Item.all(); + + ButtonGroup group = new ButtonGroup<>(); + Table cont = new Table(); + cont.margin(4); + cont.marginBottom(5); + + cont.add().colspan(4).height(50f * (int)(items.size/4f + 1f)); + cont.row(); + + for(int i = 0; i < items.size; i ++){ + + final int f = i; + ImageButton button = cont.addImageButton("white", "toggle", 24, () -> consumer.accept(items.get(f))) + .size(38, 42).padBottom(-5.1f).group(group).get(); + button.getStyle().imageUp = new TextureRegionDrawable(new TextureRegion(items.get(i).region)); + button.setChecked(holder.get().id == f); + + if(i%4 == 3){ + cont.row(); + } + } + + table.add(cont); + } +} diff --git a/core/src/io/anuke/mindustry/world/blocks/types/StaticBlock.java b/core/src/io/anuke/mindustry/world/blocks/StaticBlock.java similarity index 82% rename from core/src/io/anuke/mindustry/world/blocks/types/StaticBlock.java rename to core/src/io/anuke/mindustry/world/blocks/StaticBlock.java index dca911701d..61f11a5549 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/StaticBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/StaticBlock.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types; +package io.anuke.mindustry.world.blocks; import io.anuke.mindustry.graphics.CacheLayer; import io.anuke.mindustry.world.Block; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/Wall.java b/core/src/io/anuke/mindustry/world/blocks/Wall.java similarity index 78% rename from core/src/io/anuke/mindustry/world/blocks/types/Wall.java rename to core/src/io/anuke/mindustry/world/blocks/Wall.java index fc3e551ffc..97004f598f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/Wall.java +++ b/core/src/io/anuke/mindustry/world/blocks/Wall.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.world.blocks.types; +package io.anuke.mindustry.world.blocks; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.BlockGroup; +import io.anuke.mindustry.world.meta.BlockGroup; public class Wall extends Block{ diff --git a/core/src/io/anuke/mindustry/world/blocks/types/defense/Door.java b/core/src/io/anuke/mindustry/world/blocks/defense/Door.java similarity index 90% rename from core/src/io/anuke/mindustry/world/blocks/types/defense/Door.java rename to core/src/io/anuke/mindustry/world/blocks/defense/Door.java index 4efda5b0e4..ae11c0b9a7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/defense/Door.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/Door.java @@ -1,12 +1,13 @@ -package io.anuke.mindustry.world.blocks.types.defense; +package io.anuke.mindustry.world.blocks.defense; import com.badlogic.gdx.math.Rectangle; import io.anuke.mindustry.content.fx.BlockFx; import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.Units; +import io.anuke.mindustry.input.CursorType; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.Wall; +import io.anuke.mindustry.world.blocks.Wall; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.graphics.Draw; @@ -39,8 +40,8 @@ public class Door extends Wall{ } @Override - public boolean isCursor(Tile tile){ - return true; + public CursorType getCursor(Tile tile){ + return CursorType.hand; } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/types/defense/RepairTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/RepairTurret.java similarity index 95% rename from core/src/io/anuke/mindustry/world/blocks/types/defense/RepairTurret.java rename to core/src/io/anuke/mindustry/world/blocks/defense/RepairTurret.java index f0be3cbe0b..107c16d8ef 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/defense/RepairTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/RepairTurret.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.world.blocks.types.defense; +package io.anuke.mindustry.world.blocks.defense; import com.badlogic.gdx.math.MathUtils; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.defense.turrets.PowerTurret; +import io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Hue; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/defense/ShieldBlock.java b/core/src/io/anuke/mindustry/world/blocks/defense/ShieldBlock.java similarity index 95% rename from core/src/io/anuke/mindustry/world/blocks/types/defense/ShieldBlock.java rename to core/src/io/anuke/mindustry/world/blocks/defense/ShieldBlock.java index 90a7c404b3..fffaee5fcc 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/defense/ShieldBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/ShieldBlock.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.world.blocks.types.defense; +package io.anuke.mindustry.world.blocks.defense; import io.anuke.mindustry.Vars; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.effect.Shield; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.PowerBlock; +import io.anuke.mindustry.world.blocks.PowerBlock; import io.anuke.ucore.core.Timers; import io.anuke.ucore.entities.impl.BulletEntity; import io.anuke.ucore.util.Mathf; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/defense/ShieldedWallBlock.java b/core/src/io/anuke/mindustry/world/blocks/defense/ShieldedWallBlock.java similarity index 94% rename from core/src/io/anuke/mindustry/world/blocks/types/defense/ShieldedWallBlock.java rename to core/src/io/anuke/mindustry/world/blocks/defense/ShieldedWallBlock.java index 970ed00fcf..c99861f3d9 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/defense/ShieldedWallBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/ShieldedWallBlock.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.world.blocks.types.defense; +package io.anuke.mindustry.world.blocks.defense; import com.badlogic.gdx.graphics.Color; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.PowerBlock; +import io.anuke.mindustry.world.blocks.PowerBlock; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.util.Strings; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/defense/Turret.java b/core/src/io/anuke/mindustry/world/blocks/defense/Turret.java similarity index 98% rename from core/src/io/anuke/mindustry/world/blocks/types/defense/Turret.java rename to core/src/io/anuke/mindustry/world/blocks/defense/Turret.java index ce41b79835..5a5d69cfca 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/defense/Turret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/Turret.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.defense; +package io.anuke.mindustry.world.blocks.defense; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.TextureRegion; @@ -14,7 +14,7 @@ import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.type.AmmoEntry; import io.anuke.mindustry.type.AmmoType; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.BlockGroup; +import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/defense/turrets/BurstTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/BurstTurret.java similarity index 93% rename from core/src/io/anuke/mindustry/world/blocks/types/defense/turrets/BurstTurret.java rename to core/src/io/anuke/mindustry/world/blocks/defense/turrets/BurstTurret.java index ca939bfeb8..a686e6bb11 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/defense/turrets/BurstTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/BurstTurret.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.defense.turrets; +package io.anuke.mindustry.world.blocks.defense.turrets; import io.anuke.mindustry.type.AmmoType; import io.anuke.mindustry.world.Tile; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/defense/turrets/DoubleTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/DoubleTurret.java similarity index 92% rename from core/src/io/anuke/mindustry/world/blocks/types/defense/turrets/DoubleTurret.java rename to core/src/io/anuke/mindustry/world/blocks/defense/turrets/DoubleTurret.java index 9991011cf4..1cdabfbaa8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/defense/turrets/DoubleTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/DoubleTurret.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.defense.turrets; +package io.anuke.mindustry.world.blocks.defense.turrets; import io.anuke.mindustry.type.AmmoType; import io.anuke.mindustry.world.Tile; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/defense/turrets/ItemTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java similarity index 94% rename from core/src/io/anuke/mindustry/world/blocks/types/defense/turrets/ItemTurret.java rename to core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java index dd8ffd0e04..23082d1c41 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/defense/turrets/ItemTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.defense.turrets; +package io.anuke.mindustry.world.blocks.defense.turrets; import com.badlogic.gdx.utils.ObjectMap; import io.anuke.mindustry.entities.Unit; @@ -6,9 +6,9 @@ import io.anuke.mindustry.type.AmmoEntry; import io.anuke.mindustry.type.AmmoType; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.BarType; -import io.anuke.mindustry.world.BlockBar; +import io.anuke.mindustry.world.meta.BlockBar; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.defense.Turret; +import io.anuke.mindustry.world.blocks.defense.Turret; public class ItemTurret extends Turret { protected int maxAmmo = 100; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/defense/turrets/LaserTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java similarity index 96% rename from core/src/io/anuke/mindustry/world/blocks/types/defense/turrets/LaserTurret.java rename to core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java index 75282011e6..1b69866132 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/defense/turrets/LaserTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.defense.turrets; +package io.anuke.mindustry.world.blocks.defense.turrets; import io.anuke.mindustry.content.fx.Fx; import io.anuke.mindustry.type.AmmoType; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/defense/turrets/LiquidTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java similarity index 94% rename from core/src/io/anuke/mindustry/world/blocks/types/defense/turrets/LiquidTurret.java rename to core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java index 9f6f7f6a40..1fa1b21eda 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/defense/turrets/LiquidTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java @@ -1,13 +1,13 @@ -package io.anuke.mindustry.world.blocks.types.defense.turrets; +package io.anuke.mindustry.world.blocks.defense.turrets; import com.badlogic.gdx.utils.ObjectMap; import io.anuke.mindustry.type.AmmoType; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.BarType; -import io.anuke.mindustry.world.BlockBar; +import io.anuke.mindustry.world.meta.BlockBar; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.defense.Turret; +import io.anuke.mindustry.world.blocks.defense.Turret; import io.anuke.ucore.core.Effects; public abstract class LiquidTurret extends Turret { diff --git a/core/src/io/anuke/mindustry/world/blocks/types/defense/turrets/PowerTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java similarity index 85% rename from core/src/io/anuke/mindustry/world/blocks/types/defense/turrets/PowerTurret.java rename to core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java index c0630f9d2b..e5123cd143 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/defense/turrets/PowerTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.world.blocks.types.defense.turrets; +package io.anuke.mindustry.world.blocks.defense.turrets; import io.anuke.mindustry.type.AmmoType; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.defense.Turret; +import io.anuke.mindustry.world.blocks.defense.Turret; import io.anuke.ucore.util.Strings; public abstract class PowerTurret extends Turret { diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/BufferedItemBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java similarity index 96% rename from core/src/io/anuke/mindustry/world/blocks/types/distribution/BufferedItemBridge.java rename to core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java index c224b64b14..0ed3c2ec1a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/BufferedItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.distribution; +package io.anuke.mindustry.world.blocks.distribution; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.type.Item; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conduit.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java similarity index 93% rename from core/src/io/anuke/mindustry/world/blocks/types/distribution/Conduit.java rename to core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java index fa3cb0cf03..ecaf8d1cea 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conduit.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Conduit.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.world.blocks.types.distribution; +package io.anuke.mindustry.world.blocks.distribution; import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.LiquidBlock; -import io.anuke.mindustry.world.blocks.types.modules.LiquidModule; +import io.anuke.mindustry.world.blocks.LiquidBlock; +import io.anuke.mindustry.world.blocks.modules.LiquidModule; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.util.Mathf; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java similarity index 98% rename from core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java rename to core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java index 4ccfb6d511..8f53d113fb 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Conveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.distribution; +package io.anuke.mindustry.world.blocks.distribution; import com.badlogic.gdx.utils.LongArray; import io.anuke.mindustry.content.Items; @@ -7,7 +7,7 @@ import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.BlockGroup; +import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/ExtendingItemBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/ExtendingItemBridge.java similarity index 97% rename from core/src/io/anuke/mindustry/world/blocks/types/distribution/ExtendingItemBridge.java rename to core/src/io/anuke/mindustry/world/blocks/distribution/ExtendingItemBridge.java index 70171486e1..5cec679fbf 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/ExtendingItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ExtendingItemBridge.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.distribution; +package io.anuke.mindustry.world.blocks.distribution; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.graphics.CapStyle; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/ItemBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java similarity index 98% rename from core/src/io/anuke/mindustry/world/blocks/types/distribution/ItemBridge.java rename to core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java index 2f2e8a1ed5..e31a6ac838 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/ItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.distribution; +package io.anuke.mindustry.world.blocks.distribution; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.utils.IntArray; @@ -41,6 +41,7 @@ public class ItemBridge extends Block { layer = Layer.power; expanded = true; itemCapacity = 30; + configurable = true; } @Override @@ -55,11 +56,6 @@ public class ItemBridge extends Block { lastPlaced = tile.packedPosition(); } - @Override - public boolean isConfigurable(Tile tile) { - return true; - } - @Override public void drawPlace(int x, int y, int rotation, boolean valid) { Lines.stroke(2f); diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Junction.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java similarity index 97% rename from core/src/io/anuke/mindustry/world/blocks/types/distribution/Junction.java rename to core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java index 16672ec700..af21d078ac 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Junction.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.world.blocks.types.distribution; +package io.anuke.mindustry.world.blocks.distribution; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.NumberUtils; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.BlockGroup; +import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Timers; import io.anuke.ucore.function.Consumer; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/LiquidBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidBridge.java similarity index 96% rename from core/src/io/anuke/mindustry/world/blocks/types/distribution/LiquidBridge.java rename to core/src/io/anuke/mindustry/world/blocks/distribution/LiquidBridge.java index b07aabab99..f014f8574a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/LiquidBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidBridge.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.distribution; +package io.anuke.mindustry.world.blocks.distribution; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Tile; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/LiquidExtendingBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidExtendingBridge.java similarity index 96% rename from core/src/io/anuke/mindustry/world/blocks/types/distribution/LiquidExtendingBridge.java rename to core/src/io/anuke/mindustry/world/blocks/distribution/LiquidExtendingBridge.java index c86abaf771..7f3c908359 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/LiquidExtendingBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidExtendingBridge.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.distribution; +package io.anuke.mindustry.world.blocks.distribution; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Tile; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/LiquidJunction.java b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidJunction.java similarity index 90% rename from core/src/io/anuke/mindustry/world/blocks/types/distribution/LiquidJunction.java rename to core/src/io/anuke/mindustry/world/blocks/distribution/LiquidJunction.java index 1de5a382b6..3d1a47f8c3 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/LiquidJunction.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidJunction.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.world.blocks.types.distribution; +package io.anuke.mindustry.world.blocks.distribution; import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.LiquidBlock; +import io.anuke.mindustry.world.blocks.LiquidBlock; import io.anuke.ucore.graphics.Draw; public class LiquidJunction extends LiquidBlock{ diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/LiquidRouter.java b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidRouter.java similarity index 68% rename from core/src/io/anuke/mindustry/world/blocks/types/distribution/LiquidRouter.java rename to core/src/io/anuke/mindustry/world/blocks/distribution/LiquidRouter.java index 92e38eb8a2..e2c42784d7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/LiquidRouter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidRouter.java @@ -1,7 +1,7 @@ -package io.anuke.mindustry.world.blocks.types.distribution; +package io.anuke.mindustry.world.blocks.distribution; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.LiquidBlock; +import io.anuke.mindustry.world.blocks.LiquidBlock; public class LiquidRouter extends LiquidBlock{ diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/MassDriver.java b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java similarity index 71% rename from core/src/io/anuke/mindustry/world/blocks/types/distribution/MassDriver.java rename to core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java index 8117446de9..13d8ce7d7f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/MassDriver.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.distribution; +package io.anuke.mindustry.world.blocks.distribution; import io.anuke.mindustry.world.Block; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/OverflowGate.java b/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java similarity index 96% rename from core/src/io/anuke/mindustry/world/blocks/types/distribution/OverflowGate.java rename to core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java index e1197d31db..eba073e898 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/OverflowGate.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.distribution; +package io.anuke.mindustry.world.blocks.distribution; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Tile; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Router.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java similarity index 92% rename from core/src/io/anuke/mindustry/world/blocks/types/distribution/Router.java rename to core/src/io/anuke/mindustry/world/blocks/distribution/Router.java index 1845faf89e..231ad4d4cf 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Router.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.world.blocks.types.distribution; +package io.anuke.mindustry.world.blocks.distribution; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.BlockGroup; +import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Timers; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Sorter.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java similarity index 67% rename from core/src/io/anuke/mindustry/world/blocks/types/distribution/Sorter.java rename to core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java index fb2260c7d1..3fc0680b3a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Sorter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java @@ -1,17 +1,13 @@ -package io.anuke.mindustry.world.blocks.types.distribution; +package io.anuke.mindustry.world.blocks.distribution; -import com.badlogic.gdx.graphics.g2d.TextureRegion; -import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.content.Items; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.BlockGroup; import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.blocks.SelectionTrait; +import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.ucore.graphics.Draw; -import io.anuke.ucore.scene.style.TextureRegionDrawable; -import io.anuke.ucore.scene.ui.ButtonGroup; -import io.anuke.ucore.scene.ui.ImageButton; import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.util.Mathf; @@ -19,7 +15,7 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -public class Sorter extends Block{ +public class Sorter extends Block implements SelectionTrait{ public Sorter(String name) { super(name); @@ -27,11 +23,14 @@ public class Sorter extends Block{ solid = true; instantTransfer = true; group = BlockGroup.transportation; + configurable = true; } @Override public void draw(Tile tile){ super.draw(tile); + + //TODO call event for change SorterEntity entity = tile.entity(); @@ -92,48 +91,11 @@ public class Sorter extends Block{ return to; } - - @Override - public void configure(Tile tile, byte data) { - SorterEntity entity = tile.entity(); - if(entity != null){ - entity.sortItem = Item.getByID(data); - } - } - - @Override - public boolean isConfigurable(Tile tile){ - return true; - } @Override public void buildTable(Tile tile, Table table){ SorterEntity entity = tile.entity(); - - Array items = Item.all(); - - ButtonGroup group = new ButtonGroup<>(); - Table cont = new Table(); - cont.margin(4); - cont.marginBottom(5); - - cont.add().colspan(4).height(50f * (int)(items.size/4f + 1f)); - cont.row(); - - for(int i = 0; i < items.size; i ++){ - final int f = i; - ImageButton button = cont.addImageButton("white", "toggle", 24, () -> { - setConfigure(tile, (byte)f); - }).size(38, 42).padBottom(-5.1f).group(group).get(); - button.getStyle().imageUp = new TextureRegionDrawable(new TextureRegion(items.get(i).region)); - button.setChecked(entity.sortItem.id == f); - - if(i%4 == 3){ - cont.row(); - } - } - - table.add(cont); + buildItemTable(table, () -> entity.sortItem, item -> entity.sortItem = item); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Splitter.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Splitter.java similarity index 94% rename from core/src/io/anuke/mindustry/world/blocks/types/distribution/Splitter.java rename to core/src/io/anuke/mindustry/world/blocks/distribution/Splitter.java index ede5a95e01..4fa776dc01 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Splitter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Splitter.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.world.blocks.types.distribution; +package io.anuke.mindustry.world.blocks.distribution; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.BlockGroup; +import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.util.Mathf; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Teleporter.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Teleporter.java similarity index 95% rename from core/src/io/anuke/mindustry/world/blocks/types/distribution/Teleporter.java rename to core/src/io/anuke/mindustry/world/blocks/distribution/Teleporter.java index b2eb1a0e88..5023d3a85a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/Teleporter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Teleporter.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.distribution; +package io.anuke.mindustry.world.blocks.distribution; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.utils.Array; @@ -9,7 +9,7 @@ import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.PowerBlock; +import io.anuke.mindustry.world.blocks.PowerBlock; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; @@ -65,15 +65,7 @@ public class Teleporter extends PowerBlock{ itemCapacity = 100; hasLiquids = true; liquidCapacity = 100f; - } - - @Override - public void configure(Tile tile, byte data) { - TeleporterEntity entity = tile.entity(); - if(entity != null){ - entity.color = data; - entity.items.clear(); - } + configurable = true; } @Override @@ -84,7 +76,7 @@ public class Teleporter extends PowerBlock{ @Override public void placed(Tile tile){ tile.entity().color = lastColor; - setConfigure(tile, lastColor); + tile.entity().color = lastColor; } @Override @@ -211,16 +203,13 @@ public class Teleporter extends PowerBlock{ } } } - - @Override - public boolean isConfigurable(Tile tile){ - return true; - } @Override public void buildTable(Tile tile, Table table){ TeleporterEntity entity = tile.entity(); + //TODO call event for change + ButtonGroup group = new ButtonGroup<>(); Table cont = new Table(); cont.margin(4); @@ -233,7 +222,6 @@ public class Teleporter extends PowerBlock{ final int f = i; ImageButton button = cont.addImageButton("white", "toggle", 24, () -> { lastColor = (byte)f; - setConfigure(tile, (byte)f); }).size(34, 38).padBottom(-5.1f).group(group).get(); button.getStyle().imageUpColor = colorArray[f]; button.setChecked(entity.color == f); diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/TunnelConduit.java b/core/src/io/anuke/mindustry/world/blocks/distribution/TunnelConduit.java similarity index 95% rename from core/src/io/anuke/mindustry/world/blocks/types/distribution/TunnelConduit.java rename to core/src/io/anuke/mindustry/world/blocks/distribution/TunnelConduit.java index 82423dbfcb..d53f00d00f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/TunnelConduit.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/TunnelConduit.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.world.blocks.types.distribution; +package io.anuke.mindustry.world.blocks.distribution; import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.BarType; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.LiquidBlock; +import io.anuke.mindustry.world.blocks.LiquidBlock; import io.anuke.ucore.graphics.Draw; public class TunnelConduit extends LiquidBlock { diff --git a/core/src/io/anuke/mindustry/world/blocks/types/distribution/TunnelConveyor.java b/core/src/io/anuke/mindustry/world/blocks/distribution/TunnelConveyor.java similarity index 92% rename from core/src/io/anuke/mindustry/world/blocks/types/distribution/TunnelConveyor.java rename to core/src/io/anuke/mindustry/world/blocks/distribution/TunnelConveyor.java index 7eed31a1b9..da3410c575 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/distribution/TunnelConveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/TunnelConveyor.java @@ -1,10 +1,11 @@ -package io.anuke.mindustry.world.blocks.types.distribution; +package io.anuke.mindustry.world.blocks.distribution; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.NumberUtils; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.ucore.core.Timers; import io.anuke.ucore.util.Bits; @@ -20,7 +21,7 @@ public class TunnelConveyor extends Block{ solid = true; health = 70; instantTransfer = true; - bars.add(new BlockBar(BarType.inventory, true, tile -> (float)tile.entity().index/capacity)); + bars.add(new io.anuke.mindustry.world.meta.BlockBar(BarType.inventory, true, tile -> (float)tile.entity().index/capacity)); group = BlockGroup.transportation; } diff --git a/core/src/io/anuke/mindustry/world/blocks/types/logic/LogicBlock.java b/core/src/io/anuke/mindustry/world/blocks/logic/LogicBlock.java similarity index 73% rename from core/src/io/anuke/mindustry/world/blocks/types/logic/LogicBlock.java rename to core/src/io/anuke/mindustry/world/blocks/logic/LogicBlock.java index a5fc8b5fba..2e1a11c3b1 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/logic/LogicBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/logic/LogicBlock.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.logic; +package io.anuke.mindustry.world.blocks.logic; import io.anuke.mindustry.world.Block; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/modules/InventoryModule.java b/core/src/io/anuke/mindustry/world/blocks/modules/InventoryModule.java similarity index 95% rename from core/src/io/anuke/mindustry/world/blocks/types/modules/InventoryModule.java rename to core/src/io/anuke/mindustry/world/blocks/modules/InventoryModule.java index a104acedc6..466dff490c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/modules/InventoryModule.java +++ b/core/src/io/anuke/mindustry/world/blocks/modules/InventoryModule.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.world.blocks.types.modules; +package io.anuke.mindustry.world.blocks.modules; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.ItemStack; -import io.anuke.mindustry.world.blocks.types.BlockModule; +import io.anuke.mindustry.world.blocks.BlockModule; import java.io.DataInputStream; import java.io.DataOutputStream; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/modules/LiquidModule.java b/core/src/io/anuke/mindustry/world/blocks/modules/LiquidModule.java similarity index 85% rename from core/src/io/anuke/mindustry/world/blocks/types/modules/LiquidModule.java rename to core/src/io/anuke/mindustry/world/blocks/modules/LiquidModule.java index 8637de3261..99c72f7021 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/modules/LiquidModule.java +++ b/core/src/io/anuke/mindustry/world/blocks/modules/LiquidModule.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.world.blocks.types.modules; +package io.anuke.mindustry.world.blocks.modules; import io.anuke.mindustry.content.Liquids; import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.world.blocks.types.BlockModule; +import io.anuke.mindustry.world.blocks.BlockModule; import java.io.DataInputStream; import java.io.DataOutputStream; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/modules/PowerModule.java b/core/src/io/anuke/mindustry/world/blocks/modules/PowerModule.java similarity index 87% rename from core/src/io/anuke/mindustry/world/blocks/types/modules/PowerModule.java rename to core/src/io/anuke/mindustry/world/blocks/modules/PowerModule.java index 32fa5079cd..5f9ee24ca8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/modules/PowerModule.java +++ b/core/src/io/anuke/mindustry/world/blocks/modules/PowerModule.java @@ -1,6 +1,6 @@ -package io.anuke.mindustry.world.blocks.types.modules; +package io.anuke.mindustry.world.blocks.modules; -import io.anuke.mindustry.world.blocks.types.BlockModule; +import io.anuke.mindustry.world.blocks.BlockModule; import java.io.DataInputStream; import java.io.DataOutputStream; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/power/BurnerGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/BurnerGenerator.java similarity index 97% rename from core/src/io/anuke/mindustry/world/blocks/types/power/BurnerGenerator.java rename to core/src/io/anuke/mindustry/world/blocks/power/BurnerGenerator.java index c337ed8b78..30d5dbeffa 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/power/BurnerGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/BurnerGenerator.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.world.blocks.types.power; +package io.anuke.mindustry.world.blocks.power; import com.badlogic.gdx.graphics.Color; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.content.fx.BlockFx; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.BarType; -import io.anuke.mindustry.world.BlockBar; +import io.anuke.mindustry.world.meta.BlockBar; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/power/DecayGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/DecayGenerator.java similarity index 83% rename from core/src/io/anuke/mindustry/world/blocks/types/power/DecayGenerator.java rename to core/src/io/anuke/mindustry/world/blocks/power/DecayGenerator.java index 90f9d9aa16..ce5f1599c7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/power/DecayGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/DecayGenerator.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.power; +package io.anuke.mindustry.world.blocks.power; import io.anuke.mindustry.type.Item; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/power/FusionReactor.java b/core/src/io/anuke/mindustry/world/blocks/power/FusionReactor.java similarity index 96% rename from core/src/io/anuke/mindustry/world/blocks/types/power/FusionReactor.java rename to core/src/io/anuke/mindustry/world/blocks/power/FusionReactor.java index 06181c08c9..ddfa00ac43 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/power/FusionReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/FusionReactor.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.power; +package io.anuke.mindustry.world.blocks.power; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.TextureRegion; @@ -6,7 +6,7 @@ import io.anuke.mindustry.content.Liquids; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.production.GenericCrafter.GenericCrafterEntity; +import io.anuke.mindustry.world.blocks.production.GenericCrafter.GenericCrafterEntity; import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/power/LiquidBurnerGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/LiquidBurnerGenerator.java similarity index 94% rename from core/src/io/anuke/mindustry/world/blocks/types/power/LiquidBurnerGenerator.java rename to core/src/io/anuke/mindustry/world/blocks/power/LiquidBurnerGenerator.java index 1b172bb966..30d58eb13e 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/power/LiquidBurnerGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/LiquidBurnerGenerator.java @@ -1,10 +1,10 @@ -package io.anuke.mindustry.world.blocks.types.power; +package io.anuke.mindustry.world.blocks.power; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.content.fx.BlockFx; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.power.BurnerGenerator.BurnerEntity; +import io.anuke.mindustry.world.blocks.power.BurnerGenerator.BurnerEntity; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/power/LiquidHeatGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/LiquidHeatGenerator.java similarity index 85% rename from core/src/io/anuke/mindustry/world/blocks/types/power/LiquidHeatGenerator.java rename to core/src/io/anuke/mindustry/world/blocks/power/LiquidHeatGenerator.java index 2df1e0f4bd..be2b1b31de 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/power/LiquidHeatGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/LiquidHeatGenerator.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.power; +package io.anuke.mindustry.world.blocks.power; import io.anuke.mindustry.type.Liquid; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/power/NuclearReactor.java b/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java similarity index 98% rename from core/src/io/anuke/mindustry/world/blocks/types/power/NuclearReactor.java rename to core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java index 7948a638e9..efaf40f7aa 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/power/NuclearReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.power; +package io.anuke.mindustry.world.blocks.power; import com.badlogic.gdx.graphics.Color; import io.anuke.mindustry.content.Items; @@ -9,7 +9,7 @@ import io.anuke.mindustry.content.fx.ExplosionFx; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.BarType; -import io.anuke.mindustry.world.BlockBar; +import io.anuke.mindustry.world.meta.BlockBar; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Timers; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/power/PowerDistributor.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerDistributor.java similarity index 97% rename from core/src/io/anuke/mindustry/world/blocks/types/power/PowerDistributor.java rename to core/src/io/anuke/mindustry/world/blocks/power/PowerDistributor.java index c4da28af09..dfb61db967 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/power/PowerDistributor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerDistributor.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.power; +package io.anuke.mindustry.world.blocks.power; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.IntArray; @@ -7,7 +7,7 @@ import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.world.Edges; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.PowerBlock; +import io.anuke.mindustry.world.blocks.PowerBlock; import io.anuke.ucore.core.Settings; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; @@ -44,6 +44,7 @@ public class PowerDistributor extends PowerBlock{ layer = Layer.power; hasItems = false; powerCapacity = 5f; + configurable = true; } @Override @@ -59,11 +60,6 @@ public class PowerDistributor extends PowerBlock{ lastPlaced = tile.packedPosition(); } - @Override - public boolean isConfigurable(Tile tile){ - return true; - } - @Override public void setStats(){ super.setStats(); diff --git a/core/src/io/anuke/mindustry/world/blocks/types/power/PowerGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java similarity index 92% rename from core/src/io/anuke/mindustry/world/blocks/types/power/PowerGenerator.java rename to core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java index 6a929dd0f7..9ef2ab6874 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/power/PowerGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.world.blocks.types.power; +package io.anuke.mindustry.world.blocks.power; import com.badlogic.gdx.math.GridPoint2; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.world.Edges; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.PowerBlock; -import io.anuke.mindustry.world.BlockFlag; +import io.anuke.mindustry.world.blocks.PowerBlock; +import io.anuke.mindustry.world.meta.BlockFlag; import io.anuke.ucore.core.Timers; import io.anuke.ucore.util.EnumSet; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/power/SolarGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java similarity index 84% rename from core/src/io/anuke/mindustry/world/blocks/types/power/SolarGenerator.java rename to core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java index 3700327a55..3d8ff7338a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/power/SolarGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.world.blocks.types.power; +package io.anuke.mindustry.world.blocks.power; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Timers; -public class SolarGenerator extends io.anuke.mindustry.world.blocks.types.power.PowerGenerator { +public class SolarGenerator extends io.anuke.mindustry.world.blocks.power.PowerGenerator { /**power generated per frame*/ protected float generation = 0.005f; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/Compressor.java b/core/src/io/anuke/mindustry/world/blocks/production/Compressor.java similarity index 93% rename from core/src/io/anuke/mindustry/world/blocks/types/production/Compressor.java rename to core/src/io/anuke/mindustry/world/blocks/production/Compressor.java index df7c4b09e9..a7b85759f5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/Compressor.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Compressor.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry.world.blocks.types.production; +package io.anuke.mindustry.world.blocks.production; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.production.GenericCrafter.GenericCrafterEntity; +import io.anuke.mindustry.world.blocks.production.GenericCrafter.GenericCrafterEntity; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.util.Mathf; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/Cultivator.java b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java similarity index 98% rename from core/src/io/anuke/mindustry/world/blocks/types/production/Cultivator.java rename to core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java index 0fbc12db9c..d105930741 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/Cultivator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.production; +package io.anuke.mindustry.world.blocks.production; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.TextureRegion; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/Drill.java b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java similarity index 98% rename from core/src/io/anuke/mindustry/world/blocks/types/production/Drill.java rename to core/src/io/anuke/mindustry/world/blocks/production/Drill.java index b599d7b511..2111868595 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.production; +package io.anuke.mindustry.world.blocks.production; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.TextureRegion; @@ -10,7 +10,7 @@ import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.BlockGroup; +import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/Fracker.java b/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java similarity index 97% rename from core/src/io/anuke/mindustry/world/blocks/types/production/Fracker.java rename to core/src/io/anuke/mindustry/world/blocks/production/Fracker.java index ac5606992d..a7902a1e33 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/Fracker.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.production; +package io.anuke.mindustry.world.blocks.production; import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.mindustry.entities.TileEntity; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/GenericCrafter.java b/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java similarity index 97% rename from core/src/io/anuke/mindustry/world/blocks/types/production/GenericCrafter.java rename to core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java index 855d0ac257..94340fbac4 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/GenericCrafter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.production; +package io.anuke.mindustry.world.blocks.production; import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.mindustry.entities.TileEntity; @@ -9,7 +9,7 @@ import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.BarType; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.BlockBar; +import io.anuke.mindustry.world.meta.BlockBar; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/Incinerator.java b/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java similarity index 98% rename from core/src/io/anuke/mindustry/world/blocks/types/production/Incinerator.java rename to core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java index bbcc8bc15c..e5e5f28432 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/Incinerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.production; +package io.anuke.mindustry.world.blocks.production; import com.badlogic.gdx.graphics.Color; import io.anuke.mindustry.content.fx.BlockFx; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/LiquidMixer.java b/core/src/io/anuke/mindustry/world/blocks/production/LiquidMixer.java similarity index 94% rename from core/src/io/anuke/mindustry/world/blocks/types/production/LiquidMixer.java rename to core/src/io/anuke/mindustry/world/blocks/production/LiquidMixer.java index 6a8d7b7d0e..3c40b1b6d8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/LiquidMixer.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/LiquidMixer.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.world.blocks.types.production; +package io.anuke.mindustry.world.blocks.production; import io.anuke.mindustry.content.Liquids; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.LiquidBlock; +import io.anuke.mindustry.world.blocks.LiquidBlock; import io.anuke.ucore.core.Timers; public class LiquidMixer extends LiquidBlock{ diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/PlasticFormer.java b/core/src/io/anuke/mindustry/world/blocks/production/PlasticFormer.java similarity index 90% rename from core/src/io/anuke/mindustry/world/blocks/types/production/PlasticFormer.java rename to core/src/io/anuke/mindustry/world/blocks/production/PlasticFormer.java index 4919c8a131..b4e558224e 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/PlasticFormer.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/PlasticFormer.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.production; +package io.anuke.mindustry.world.blocks.production; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.graphics.Draw; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/PowerCrafter.java b/core/src/io/anuke/mindustry/world/blocks/production/PowerCrafter.java similarity index 93% rename from core/src/io/anuke/mindustry/world/blocks/types/production/PowerCrafter.java rename to core/src/io/anuke/mindustry/world/blocks/production/PowerCrafter.java index b8cfd433cf..7146af500f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/PowerCrafter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/PowerCrafter.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.production; +package io.anuke.mindustry.world.blocks.production; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.type.Item; @@ -6,7 +6,7 @@ import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.production.GenericCrafter.GenericCrafterEntity; +import io.anuke.mindustry.world.blocks.production.GenericCrafter.GenericCrafterEntity; import io.anuke.ucore.core.Timers; import io.anuke.ucore.util.Mathf; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/PowerSmelter.java b/core/src/io/anuke/mindustry/world/blocks/production/PowerSmelter.java similarity index 97% rename from core/src/io/anuke/mindustry/world/blocks/types/production/PowerSmelter.java rename to core/src/io/anuke/mindustry/world/blocks/production/PowerSmelter.java index 595d2ff4fb..25a76a51ad 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/PowerSmelter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/PowerSmelter.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.production; +package io.anuke.mindustry.world.blocks.production; import com.badlogic.gdx.graphics.Color; import io.anuke.mindustry.entities.TileEntity; @@ -6,9 +6,9 @@ import io.anuke.mindustry.content.fx.BlockFx; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.world.BarType; -import io.anuke.mindustry.world.BlockBar; +import io.anuke.mindustry.world.meta.BlockBar; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.PowerBlock; +import io.anuke.mindustry.world.blocks.PowerBlock; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Timers; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/Pulverizer.java b/core/src/io/anuke/mindustry/world/blocks/production/Pulverizer.java similarity index 91% rename from core/src/io/anuke/mindustry/world/blocks/types/production/Pulverizer.java rename to core/src/io/anuke/mindustry/world/blocks/production/Pulverizer.java index daf9d2a5eb..fd3015c915 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/Pulverizer.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Pulverizer.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.production; +package io.anuke.mindustry.world.blocks.production; import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.mindustry.world.Tile; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/Pump.java b/core/src/io/anuke/mindustry/world/blocks/production/Pump.java similarity index 91% rename from core/src/io/anuke/mindustry/world/blocks/types/production/Pump.java rename to core/src/io/anuke/mindustry/world/blocks/production/Pump.java index af793e06a0..d8e0eb8fd1 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/Pump.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Pump.java @@ -1,11 +1,11 @@ -package io.anuke.mindustry.world.blocks.types.production; +package io.anuke.mindustry.world.blocks.production; import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.world.BlockGroup; +import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.LiquidBlock; +import io.anuke.mindustry.world.blocks.LiquidBlock; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.util.Mathf; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/Separator.java b/core/src/io/anuke/mindustry/world/blocks/production/Separator.java similarity index 95% rename from core/src/io/anuke/mindustry/world/blocks/types/production/Separator.java rename to core/src/io/anuke/mindustry/world/blocks/production/Separator.java index 4a4660ec04..c0d33b99b0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/Separator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Separator.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.production; +package io.anuke.mindustry.world.blocks.production; import com.badlogic.gdx.graphics.Color; import io.anuke.mindustry.entities.TileEntity; @@ -6,7 +6,7 @@ import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.production.GenericCrafter.GenericCrafterEntity; +import io.anuke.mindustry.world.blocks.production.GenericCrafter.GenericCrafterEntity; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Lines; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/Smelter.java b/core/src/io/anuke/mindustry/world/blocks/production/Smelter.java similarity index 97% rename from core/src/io/anuke/mindustry/world/blocks/types/production/Smelter.java rename to core/src/io/anuke/mindustry/world/blocks/production/Smelter.java index 07245f7382..53aa872de8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/Smelter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Smelter.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.production; +package io.anuke.mindustry.world.blocks.production; import com.badlogic.gdx.graphics.Color; import io.anuke.mindustry.entities.TileEntity; @@ -6,7 +6,7 @@ import io.anuke.mindustry.content.fx.BlockFx; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.BarType; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.BlockBar; +import io.anuke.mindustry.world.meta.BlockBar; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects.Effect; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/SolidPump.java b/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java similarity index 98% rename from core/src/io/anuke/mindustry/world/blocks/types/production/SolidPump.java rename to core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java index ef0c5c5c12..09731079c8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/SolidPump.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.production; +package io.anuke.mindustry.world.blocks.production; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.utils.Array; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/production/WeaponFactory.java b/core/src/io/anuke/mindustry/world/blocks/production/WeaponFactory.java similarity index 57% rename from core/src/io/anuke/mindustry/world/blocks/types/production/WeaponFactory.java rename to core/src/io/anuke/mindustry/world/blocks/production/WeaponFactory.java index ff61137f1d..8ff8a2ba1a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/production/WeaponFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/WeaponFactory.java @@ -1,11 +1,19 @@ -package io.anuke.mindustry.world.blocks.types.production; +package io.anuke.mindustry.world.blocks.production; -import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.TextureRegion; import io.anuke.mindustry.Vars; +import io.anuke.mindustry.content.fx.Fx; +import io.anuke.mindustry.entities.TileEntity; +import io.anuke.mindustry.graphics.Palette; +import io.anuke.mindustry.graphics.Shaders; +import io.anuke.mindustry.type.Weapon; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; +import io.anuke.ucore.core.Effects; +import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; +import io.anuke.ucore.graphics.Lines; import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.util.Mathf; @@ -15,32 +23,67 @@ public class WeaponFactory extends Block{ super(name); solid = true; destructible = true; + configurable = true; + update = true; } @Override public void draw(Tile tile) { - super.draw(tile); + WeaponFactoryEntity entity = tile.entity(); - for(int i : Mathf.signs){ - Draw.color(Color.YELLOW); - Draw.alpha(0.1f + Mathf.absin(Timers.time(), 12f, 0.2f)); - Draw.rect("white", tile.drawx() + i*3.5f, tile.drawy(), 1, 8); - Draw.color(Color.ORANGE); - Draw.alpha(0.5f); - Draw.rect("white", tile.drawx() + i*3.5f, tile.drawy() + Mathf.sin(Timers.time() + i *77, 13f, 4f), 1, 2); + Draw.rect(name, tile.drawx(), tile.drawy()); + + Draw.alpha(entity.heat); + Draw.rect(name + "-top", tile.drawx(), tile.drawy()); + Draw.color(); + + if(entity.current != null) { + TextureRegion region = Draw.region(entity.current.name); + + Shaders.build.region = region; + Shaders.build.progress = entity.progress; + Shaders.build.color.set(Palette.accent); + Shaders.build.time = -entity.time / 10f; + + Graphics.shader(Shaders.build, false); + Shaders.build.apply(); + Draw.rect(region, tile.drawx(), tile.drawy()); + Graphics.shader(); + + Draw.color(Palette.accent); + + Lines.lineAngleCenter( + tile.drawx() + Mathf.sin(entity.time, 6f, Vars.tilesize / 3f * size), + tile.drawy(), + 90, + size * Vars.tilesize /2f); + + Draw.reset(); } - - Draw.reset(); } @Override - public boolean isConfigurable(Tile tile){ - return !Vars.mobile; + public void update(Tile tile) { + WeaponFactoryEntity entity = tile.entity(); + + if(entity.current != null){ + entity.heat = Mathf.lerpDelta(entity.heat, 1f, 0.1f); + entity.time += Timers.delta(); + entity.progress += 1f / Vars.respawnduration; + + if(entity.progress >= 1f){ + Effects.effect(Fx.spawn, entity); + entity.progress = 0; + + //TODO what now? + } + }else{ + entity.heat = Mathf.lerpDelta(entity.heat, 0f, 0.1f); + } } @Override public void buildTable(Tile tile, Table table) { - int i = 0; Table content = new Table(); @@ -118,4 +161,16 @@ public class WeaponFactory extends Block{ table.add(content).padTop(140f); } + + @Override + public TileEntity getEntity() { + return new WeaponFactoryEntity(); + } + + public class WeaponFactoryEntity extends TileEntity{ + public Weapon current; + public float progress; + public float time; + public float heat; + } } diff --git a/core/src/io/anuke/mindustry/world/blocks/types/storage/CoreBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java similarity index 98% rename from core/src/io/anuke/mindustry/world/blocks/types/storage/CoreBlock.java rename to core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java index 6786a040f4..78f3043281 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/storage/CoreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.storage; +package io.anuke.mindustry.world.blocks.storage; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.Rectangle; @@ -11,7 +11,7 @@ import io.anuke.mindustry.graphics.Shaders; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.ItemType; -import io.anuke.mindustry.world.BlockFlag; +import io.anuke.mindustry.world.meta.BlockFlag; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Graphics; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/storage/SortedUnloader.java b/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java similarity index 56% rename from core/src/io/anuke/mindustry/world/blocks/types/storage/SortedUnloader.java rename to core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java index 8babd3d103..5c550c9ace 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/storage/SortedUnloader.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/SortedUnloader.java @@ -1,27 +1,26 @@ -package io.anuke.mindustry.world.blocks.types.storage; +package io.anuke.mindustry.world.blocks.storage; -import com.badlogic.gdx.graphics.g2d.TextureRegion; -import com.badlogic.gdx.utils.Array; import io.anuke.mindustry.content.Items; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.blocks.SelectionTrait; import io.anuke.ucore.graphics.Draw; -import io.anuke.ucore.scene.style.TextureRegionDrawable; -import io.anuke.ucore.scene.ui.ButtonGroup; -import io.anuke.ucore.scene.ui.ImageButton; import io.anuke.ucore.scene.ui.layout.Table; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -public class SortedUnloader extends Unloader { +public class SortedUnloader extends Unloader implements SelectionTrait{ public SortedUnloader(String name){ super(name); + configurable = true; } + //TODO call event + @Override public void update(Tile tile){ SortedUnloaderEntity entity = tile.entity(); @@ -51,49 +50,10 @@ public class SortedUnloader extends Unloader { Draw.color(); } - @Override - public boolean isConfigurable(Tile tile){ - return true; - } - - @Override - public void configure(Tile tile, byte data) { - SortedUnloaderEntity entity = tile.entity(); - if(entity != null){ - entity.sortItem = Item.getByID(data); - entity.items.clear(); - } - } - @Override public void buildTable(Tile tile, Table table){ SortedUnloaderEntity entity = tile.entity(); - - Array items = Item.all(); - - ButtonGroup group = new ButtonGroup<>(); - Table cont = new Table(); - cont.margin(4); - cont.marginBottom(5); - - cont.add().colspan(4).height(50f * (int)(items.size/4f + 1f)); - cont.row(); - - for(int i = 0; i < items.size; i ++){ - - final int f = i; - ImageButton button = cont.addImageButton("white", "toggle", 24, () -> { - setConfigure(tile, (byte)f); - }).size(38, 42).padBottom(-5.1f).group(group).get(); - button.getStyle().imageUp = new TextureRegionDrawable(new TextureRegion(items.get(i).region)); - button.setChecked(entity.sortItem.id == f); - - if(i%4 == 3){ - cont.row(); - } - } - - table.add(cont); + buildItemTable(table, () -> entity.sortItem, item -> entity.sortItem = item); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/types/storage/StorageBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java similarity index 95% rename from core/src/io/anuke/mindustry/world/blocks/types/storage/StorageBlock.java rename to core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java index 652d56d542..fd20d72728 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/storage/StorageBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.storage; +package io.anuke.mindustry.world.blocks.storage; import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.type.Item; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/storage/Unloader.java b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java similarity index 92% rename from core/src/io/anuke/mindustry/world/blocks/types/storage/Unloader.java rename to core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java index c097dfcefc..3f935e1c1d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/storage/Unloader.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java @@ -1,8 +1,8 @@ -package io.anuke.mindustry.world.blocks.types.storage; +package io.anuke.mindustry.world.blocks.storage; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.BlockGroup; +import io.anuke.mindustry.world.meta.BlockGroup; import io.anuke.mindustry.world.Tile; public class Unloader extends Block { diff --git a/core/src/io/anuke/mindustry/world/blocks/types/storage/Vault.java b/core/src/io/anuke/mindustry/world/blocks/storage/Vault.java similarity index 95% rename from core/src/io/anuke/mindustry/world/blocks/types/storage/Vault.java rename to core/src/io/anuke/mindustry/world/blocks/storage/Vault.java index 4da2b899c3..314f22b0fc 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/storage/Vault.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/Vault.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.storage; +package io.anuke.mindustry.world.blocks.storage; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Tile; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/units/UnloadPoint.java b/core/src/io/anuke/mindustry/world/blocks/types/units/UnloadPoint.java deleted file mode 100644 index dd5e7c36c4..0000000000 --- a/core/src/io/anuke/mindustry/world/blocks/types/units/UnloadPoint.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.anuke.mindustry.world.blocks.types.units; - -public class UnloadPoint { -} diff --git a/core/src/io/anuke/mindustry/world/blocks/types/units/CommandCenter.java b/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java similarity index 74% rename from core/src/io/anuke/mindustry/world/blocks/types/units/CommandCenter.java rename to core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java index c775787442..830b215b2d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/units/CommandCenter.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.units; +package io.anuke.mindustry.world.blocks.units; import io.anuke.mindustry.world.Block; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/units/DropPoint.java b/core/src/io/anuke/mindustry/world/blocks/units/DropPoint.java similarity index 91% rename from core/src/io/anuke/mindustry/world/blocks/types/units/DropPoint.java rename to core/src/io/anuke/mindustry/world/blocks/units/DropPoint.java index dc69a79073..1834531712 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/units/DropPoint.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/DropPoint.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.units; +package io.anuke.mindustry.world.blocks.units; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Block; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/units/RepairPoint.java b/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java similarity index 97% rename from core/src/io/anuke/mindustry/world/blocks/types/units/RepairPoint.java rename to core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java index a3759223eb..4ed94ae4cc 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/units/RepairPoint.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.units; +package io.anuke.mindustry.world.blocks.units; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.Rectangle; @@ -8,7 +8,7 @@ import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.BlockFlag; +import io.anuke.mindustry.world.meta.BlockFlag; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/units/ResupplyPoint.java b/core/src/io/anuke/mindustry/world/blocks/units/ResupplyPoint.java similarity index 98% rename from core/src/io/anuke/mindustry/world/blocks/types/units/ResupplyPoint.java rename to core/src/io/anuke/mindustry/world/blocks/units/ResupplyPoint.java index 575dbd9edf..7c2e6177a7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/units/ResupplyPoint.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/ResupplyPoint.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.units; +package io.anuke.mindustry.world.blocks.units; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; @@ -9,7 +9,7 @@ import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.BlockFlag; +import io.anuke.mindustry.world.meta.BlockFlag; import io.anuke.mindustry.world.Tile; import io.anuke.ucore.core.Timers; import io.anuke.ucore.graphics.Draw; diff --git a/core/src/io/anuke/mindustry/world/blocks/types/units/UnitFactory.java b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java similarity index 97% rename from core/src/io/anuke/mindustry/world/blocks/types/units/UnitFactory.java rename to core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java index f738602ebd..3e57e76e95 100644 --- a/core/src/io/anuke/mindustry/world/blocks/types/units/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world.blocks.types.units; +package io.anuke.mindustry.world.blocks.units; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.Rectangle; @@ -14,9 +14,9 @@ import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.world.BarType; import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.BlockBar; +import io.anuke.mindustry.world.meta.BlockBar; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.types.modules.InventoryModule; +import io.anuke.mindustry.world.blocks.modules.InventoryModule; import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Timers; diff --git a/core/src/io/anuke/mindustry/world/blocks/units/UnloadPoint.java b/core/src/io/anuke/mindustry/world/blocks/units/UnloadPoint.java new file mode 100644 index 0000000000..6d2ef8d2d6 --- /dev/null +++ b/core/src/io/anuke/mindustry/world/blocks/units/UnloadPoint.java @@ -0,0 +1,4 @@ +package io.anuke.mindustry.world.blocks.units; + +public class UnloadPoint { +} diff --git a/core/src/io/anuke/mindustry/world/BlockBar.java b/core/src/io/anuke/mindustry/world/meta/BlockBar.java similarity index 74% rename from core/src/io/anuke/mindustry/world/BlockBar.java rename to core/src/io/anuke/mindustry/world/meta/BlockBar.java index 8ece33dc40..d322dffa5f 100644 --- a/core/src/io/anuke/mindustry/world/BlockBar.java +++ b/core/src/io/anuke/mindustry/world/meta/BlockBar.java @@ -1,4 +1,7 @@ -package io.anuke.mindustry.world; +package io.anuke.mindustry.world.meta; + +import io.anuke.mindustry.world.BarType; +import io.anuke.mindustry.world.Tile; public class BlockBar { public final ValueSupplier value; diff --git a/core/src/io/anuke/mindustry/world/BlockBars.java b/core/src/io/anuke/mindustry/world/meta/BlockBars.java similarity index 91% rename from core/src/io/anuke/mindustry/world/BlockBars.java rename to core/src/io/anuke/mindustry/world/meta/BlockBars.java index c68807b386..6b02067976 100644 --- a/core/src/io/anuke/mindustry/world/BlockBars.java +++ b/core/src/io/anuke/mindustry/world/meta/BlockBars.java @@ -1,6 +1,7 @@ -package io.anuke.mindustry.world; +package io.anuke.mindustry.world.meta; import com.badlogic.gdx.utils.Array; +import io.anuke.mindustry.world.BarType; public class BlockBars { private Array list = Array.with(new BlockBar(BarType.health, false, tile -> tile.entity.health / (float)tile.block().health)); diff --git a/core/src/io/anuke/mindustry/world/BlockFlag.java b/core/src/io/anuke/mindustry/world/meta/BlockFlag.java similarity index 93% rename from core/src/io/anuke/mindustry/world/BlockFlag.java rename to core/src/io/anuke/mindustry/world/meta/BlockFlag.java index e1818264a4..9fb0025c0c 100644 --- a/core/src/io/anuke/mindustry/world/BlockFlag.java +++ b/core/src/io/anuke/mindustry/world/meta/BlockFlag.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world; +package io.anuke.mindustry.world.meta; public enum BlockFlag { /**General important target for all types of units.*/ diff --git a/core/src/io/anuke/mindustry/world/BlockGroup.java b/core/src/io/anuke/mindustry/world/meta/BlockGroup.java similarity index 70% rename from core/src/io/anuke/mindustry/world/BlockGroup.java rename to core/src/io/anuke/mindustry/world/meta/BlockGroup.java index 1990b85032..e9795a956a 100644 --- a/core/src/io/anuke/mindustry/world/BlockGroup.java +++ b/core/src/io/anuke/mindustry/world/meta/BlockGroup.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world; +package io.anuke.mindustry.world.meta; public enum BlockGroup { none, walls, turrets, transportation, power, liquids, drills diff --git a/core/src/io/anuke/mindustry/world/BlockStats.java b/core/src/io/anuke/mindustry/world/meta/BlockStats.java similarity index 89% rename from core/src/io/anuke/mindustry/world/BlockStats.java rename to core/src/io/anuke/mindustry/world/meta/BlockStats.java index eeacc48c5e..0b1da0ece1 100644 --- a/core/src/io/anuke/mindustry/world/BlockStats.java +++ b/core/src/io/anuke/mindustry/world/meta/BlockStats.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.world; +package io.anuke.mindustry.world.meta; import com.badlogic.gdx.utils.OrderedMap; import io.anuke.ucore.util.Bundles; @@ -13,7 +13,7 @@ public class BlockStats { } public void remove(String label){ - Object o = map.remove(label) != null; + Object o = map.remove(label); if(o == null) throw new RuntimeException("No label entry found with name \"" + label + "\"!"); }