Moved many block files; work on annotation processor

This commit is contained in:
Anuken
2018-06-06 14:51:25 -04:00
parent 917e2e40fb
commit ccb97e34d5
147 changed files with 685 additions and 520 deletions

View File

@@ -6,7 +6,7 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
/** /**
* Goal: To create a system to send events to the server from the client and vice versa.<br> * 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.<br>
* These events may optionally also trigger on the caller client/server as well.<br> * These events may optionally also trigger on the caller client/server as well.<br>
*<br> *<br>
* Three annotations are used for this purpose.<br> * Three annotations are used for this purpose.<br>
@@ -22,7 +22,12 @@ public class Annotations {
/**Marks a method as invokable remotely from a server on a client.*/ /**Marks a method as invokable remotely from a server on a client.*/
@Target(ElementType.METHOD) @Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS) @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. /**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. * All RemoteServer methods must have their first formal parameter be of type Player.
@@ -42,4 +47,30 @@ public class Annotations {
@Target(ElementType.METHOD) @Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS) @Retention(RetentionPolicy.CLASS)
public @interface Unreliable{} 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()}.<br>
* 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()}. <br>
* 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();
}
} }

View File

@@ -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<MethodEntry> methods = new ArrayList<>();
/**Simple class name.*/
public final String name;
public ClassEntry(String name) {
this.name = name;
}
}

View File

@@ -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<String, ClassSerializer> findSerializers(RoundEnvironment env){
HashMap<String, ClassSerializer> result = new HashMap<>();
//get methods with the types
Set<? extends Element> writers = env.getElementsAnnotatedWith(WriteClass.class);
Set<? extends Element> 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<? extends Element> 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;
}
}
}

View File

@@ -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;
}
}

View File

@@ -5,6 +5,7 @@ import io.anuke.annotations.Annotations.Local;
import io.anuke.annotations.Annotations.RemoteClient; import io.anuke.annotations.Annotations.RemoteClient;
import io.anuke.annotations.Annotations.RemoteServer; import io.anuke.annotations.Annotations.RemoteServer;
import io.anuke.annotations.Annotations.Unreliable; import io.anuke.annotations.Annotations.Unreliable;
import io.anuke.annotations.IOFinder.ClassSerializer;
import javax.annotation.processing.*; import javax.annotation.processing.*;
import javax.lang.model.SourceVersion; import javax.lang.model.SourceVersion;
@@ -34,60 +35,30 @@ import java.util.Set;
"io.anuke.annotations.Annotations.RemoteClient", "io.anuke.annotations.Annotations.RemoteClient",
"io.anuke.annotations.Annotations.RemoteServer", "io.anuke.annotations.Annotations.RemoteServer",
"io.anuke.annotations.Annotations.Local", "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 { public class RemoteMethodAnnotationProcessor extends AbstractProcessor {
private static final int maxPacketSize = 128; /**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"; /**Maps fully qualified class names to serializers.*/
private static final String serverFullClassName = "io.anuke.mindustry.gen.CallServer"; private HashMap<String, ClassSerializer> serializers;
/**Whether the initial round is done.*/
private static final HashMap<String, String[][]> writeMap = new HashMap<String, String[][]>(){{
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;
private boolean done; private boolean done;
@Override @Override
public synchronized void init(ProcessingEnvironment processingEnv) { public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv); super.init(processingEnv);
typeUtils = processingEnv.getTypeUtils(); //put all relevant utils into utils class
elementUtils = processingEnv.getElementUtils(); Utils.typeUtils = processingEnv.getTypeUtils();
filer = processingEnv.getFiler(); Utils.elementUtils = processingEnv.getElementUtils();
messager = processingEnv.getMessager(); Utils.filer = processingEnv.getFiler();
Utils.messager = processingEnv.getMessager();
} }
@Override @Override
@@ -95,13 +66,15 @@ public class AnnotationProcessor extends AbstractProcessor {
if(done) return false; if(done) return false;
done = true; done = true;
serializers = new IOFinder().findSerializers(roundEnv);
writeElements(roundEnv, clientFullClassName, RemoteClient.class); writeElements(roundEnv, clientFullClassName, RemoteClient.class);
writeElements(roundEnv, serverFullClassName, RemoteServer.class); writeElements(roundEnv, serverFullClassName, RemoteServer.class);
return true; return true;
} }
private void writeElements(RoundEnvironment env, String fullClassName, Class<? extends Annotation> annotation){ private void writeElements(RoundEnvironment env){
try { try {
boolean client = annotation == RemoteServer.class; boolean client = annotation == RemoteServer.class;
String className = fullClassName.substring(1 + fullClassName.lastIndexOf('.')); String className = fullClassName.substring(1 + fullClassName.lastIndexOf('.'));
@@ -279,15 +252,14 @@ public class AnnotationProcessor extends AbstractProcessor {
TypeSpec spec = classBuilder.build(); TypeSpec spec = classBuilder.build();
JavaFile.builder(packageName, spec).build().writeTo(filer); JavaFile.builder(packageName, spec).build().writeTo(filer);
}catch (Exception e){ }catch (Exception e){
e.printStackTrace(); e.printStackTrace();
throw new RuntimeException(e); 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");
}
} }

View File

@@ -1,4 +0,0 @@
package io.anuke.annotations;
public class Serializers {
}

View File

@@ -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");
}
}

View File

@@ -149,7 +149,7 @@ project(":core") {
apply plugin: "java" apply plugin: "java"
dependencies { dependencies {
//compileOnly project(":annotations") compileOnly project(":annotations")
boolean comp = System.properties["release"] == null || System.properties["release"] == "false" boolean comp = System.properties["release"] == null || System.properties["release"] == "false"
@@ -174,9 +174,9 @@ project(":core") {
compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion" compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion"
} }
//compileJava.options.compilerArgs = [ compileJava.options.compilerArgs = [
// "-processor", "io.anuke.annotations.AnnotationProcessor" "-processor", "io.anuke.annotations.RemoteMethodAnnotationProcessor"
//] ]
} }
project(":server") { project(":server") {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 381 B

View File

Before

Width:  |  Height:  |  Size: 602 B

After

Width:  |  Height:  |  Size: 602 B

View File

Before

Width:  |  Height:  |  Size: 580 B

After

Width:  |  Height:  |  Size: 580 B

View File

Before

Width:  |  Height:  |  Size: 575 B

After

Width:  |  Height:  |  Size: 575 B

View File

Before

Width:  |  Height:  |  Size: 276 B

After

Width:  |  Height:  |  Size: 276 B

View File

Before

Width:  |  Height:  |  Size: 267 B

After

Width:  |  Height:  |  Size: 267 B

View File

Before

Width:  |  Height:  |  Size: 582 B

After

Width:  |  Height:  |  Size: 582 B

View File

@@ -109,27 +109,6 @@ conveyortunnel
orig: 8, 8 orig: 8, 8
offset: 0, 0 offset: 0, 0
index: -1 index: -1
core
rotate: false
xy: 627, 301
size: 24, 24
orig: 24, 24
offset: 0, 0
index: -1
core-open
rotate: false
xy: 653, 305
size: 24, 24
orig: 24, 24
offset: 0, 0
index: -1
core-top
rotate: false
xy: 586, 284
size: 24, 24
orig: 24, 24
offset: 0, 0
index: -1
junction junction
rotate: false rotate: false
xy: 221, 24 xy: 221, 24
@@ -298,13 +277,6 @@ router
orig: 8, 8 orig: 8, 8
offset: 0, 0 offset: 0, 0
index: -1 index: -1
sortedunloader
rotate: false
xy: 435, 95
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
sorter sorter
rotate: false rotate: false
xy: 445, 96 xy: 445, 96
@@ -340,27 +312,6 @@ teleporter-top
orig: 24, 24 orig: 24, 24
offset: 0, 0 offset: 0, 0
index: -1 index: -1
unloader
rotate: false
xy: 911, 377
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
vault
rotate: false
xy: 587, 232
size: 24, 24
orig: 24, 24
offset: 0, 0
index: -1
weaponfactory
rotate: false
xy: 165, 82
size: 16, 16
orig: 16, 16
offset: 0, 0
index: -1
blackrock1 blackrock1
rotate: false rotate: false
xy: 183, 100 xy: 183, 100
@@ -1866,6 +1817,55 @@ waterextractor-top
orig: 16, 16 orig: 16, 16
offset: 0, 0 offset: 0, 0
index: -1 index: -1
weaponfactory
rotate: false
xy: 165, 82
size: 16, 16
orig: 16, 16
offset: 0, 0
index: -1
core
rotate: false
xy: 627, 301
size: 24, 24
orig: 24, 24
offset: 0, 0
index: -1
core-open
rotate: false
xy: 653, 305
size: 24, 24
orig: 24, 24
offset: 0, 0
index: -1
core-top
rotate: false
xy: 586, 284
size: 24, 24
orig: 24, 24
offset: 0, 0
index: -1
sortedunloader
rotate: false
xy: 435, 95
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
unloader
rotate: false
xy: 911, 377
size: 8, 8
orig: 8, 8
offset: 0, 0
index: -1
vault
rotate: false
xy: 587, 232
size: 24, 24
orig: 24, 24
offset: 0, 0
index: -1
block-1 block-1
rotate: false rotate: false
xy: 189, 54 xy: 189, 54

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 112 KiB

View File

@@ -18,6 +18,6 @@
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.entities.Bullet" /> <extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.entities.Bullet" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.type.Recipe" /> <extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.type.Recipe" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.net.Streamable" /> <extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.net.Streamable" />
<extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.world.BlockBar" /> <extend-configuration-property name="gdx.reflect.include" value="io.anuke.mindustry.world.meta.BlockBar" />
<extend-configuration-property name="gdx.reflect.include" value="com.badlogic.gdx.utils.Predicate" /> <extend-configuration-property name="gdx.reflect.include" value="com.badlogic.gdx.utils.Predicate" />
</module> </module>

View File

@@ -8,7 +8,7 @@ import io.anuke.mindustry.game.EventType.TileChangeEvent;
import io.anuke.mindustry.game.EventType.WorldLoadEvent; import io.anuke.mindustry.game.EventType.WorldLoadEvent;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.type.Item; 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.mindustry.world.Tile;
import io.anuke.ucore.core.Events; import io.anuke.ucore.core.Events;
import io.anuke.ucore.util.EnumSet; import io.anuke.ucore.util.EnumSet;

View File

@@ -10,7 +10,7 @@ import io.anuke.mindustry.game.EventType.TileChangeEvent;
import io.anuke.mindustry.game.EventType.WorldLoadEvent; import io.anuke.mindustry.game.EventType.WorldLoadEvent;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.game.TeamInfo.TeamData; 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.mindustry.world.Tile;
import io.anuke.ucore.core.Events; import io.anuke.ucore.core.Events;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;

View File

@@ -9,7 +9,7 @@ import io.anuke.mindustry.type.ContentList;
import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; 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 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; 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;

View File

@@ -8,7 +8,7 @@ import io.anuke.mindustry.type.ContentList;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.world.Block; 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 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; public static Block smelter, alloysmelter, siliconsmelter, poweralloysmelter, powersmelter, cryofluidmixer, melter, separator, centrifuge, plasticFormer, biomatterCompressor, pulverizer, oilRefinery, stoneFormer, weaponFactory, incinerator;

View File

@@ -8,9 +8,9 @@ import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.PowerBlock; import io.anuke.mindustry.world.blocks.PowerBlock;
import io.anuke.mindustry.world.blocks.types.distribution.Sorter; import io.anuke.mindustry.world.blocks.distribution.Sorter;
import io.anuke.mindustry.world.blocks.types.power.PowerDistributor; import io.anuke.mindustry.world.blocks.power.PowerDistributor;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.scene.ui.ButtonGroup; import io.anuke.ucore.scene.ui.ButtonGroup;
import io.anuke.ucore.scene.ui.ImageButton; import io.anuke.ucore.scene.ui.ImageButton;
@@ -64,11 +64,7 @@ public class DebugBlocks extends BlockList implements ContentList{
solid = true; solid = true;
hasLiquids = true; hasLiquids = true;
liquidCapacity = 100f; liquidCapacity = 100f;
} configurable = true;
@Override
public boolean isConfigurable(Tile tile) {
return true;
} }
@Override @Override

View File

@@ -3,9 +3,9 @@ package io.anuke.mindustry.content.blocks;
import io.anuke.mindustry.content.fx.BlockFx; import io.anuke.mindustry.content.fx.BlockFx;
import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.type.ContentList;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.types.Wall; import io.anuke.mindustry.world.blocks.Wall;
import io.anuke.mindustry.world.blocks.types.defense.Door; import io.anuke.mindustry.world.blocks.defense.Door;
import io.anuke.mindustry.world.blocks.types.defense.ShieldedWallBlock; import io.anuke.mindustry.world.blocks.defense.ShieldedWallBlock;
public class DefenseBlocks extends BlockList implements ContentList { public class DefenseBlocks extends BlockList implements ContentList {
public static Block stonewall, ironwall, steelwall, titaniumwall, diriumwall, compositewall, steelwalllarge, titaniumwalllarge, diriumwalllarge, titaniumshieldwall, door, largedoor; public static Block stonewall, ironwall, steelwall, titaniumwall, diriumwall, compositewall, steelwalllarge, titaniumwalllarge, diriumwalllarge, titaniumshieldwall, door, largedoor;

View File

@@ -2,7 +2,7 @@ package io.anuke.mindustry.content.blocks;
import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.type.ContentList;
import io.anuke.mindustry.world.Block; 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 class DistributionBlocks extends BlockList implements ContentList{
public static Block conveyor, steelconveyor, pulseconveyor, router, multiplexer, junction, bridgeconveyor, laserconveyor, sorter, splitter, overflowgate; public static Block conveyor, steelconveyor, pulseconveyor, router, multiplexer, junction, bridgeconveyor, laserconveyor, sorter, splitter, overflowgate;

View File

@@ -2,8 +2,8 @@ package io.anuke.mindustry.content.blocks;
import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.type.ContentList;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.types.distribution.*; import io.anuke.mindustry.world.blocks.distribution.*;
import io.anuke.mindustry.world.blocks.types.production.Pump; import io.anuke.mindustry.world.blocks.production.Pump;
public class LiquidBlocks extends BlockList implements ContentList{ public class LiquidBlocks extends BlockList implements ContentList{
public static Block pump, fluxpump, conduit, pulseconduit, liquidrouter, liquidtank, liquidjunction, bridgeconduit, laserconduit; public static Block pump, fluxpump, conduit, pulseconduit, liquidrouter, liquidtank, liquidjunction, bridgeconduit, laserconduit;

View File

@@ -3,10 +3,10 @@ package io.anuke.mindustry.content.blocks;
import io.anuke.mindustry.content.fx.BlockFx; import io.anuke.mindustry.content.fx.BlockFx;
import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.type.ContentList;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.types.defense.RepairTurret; import io.anuke.mindustry.world.blocks.defense.RepairTurret;
import io.anuke.mindustry.world.blocks.types.defense.ShieldBlock; import io.anuke.mindustry.world.blocks.defense.ShieldBlock;
import io.anuke.mindustry.world.blocks.types.distribution.Teleporter; import io.anuke.mindustry.world.blocks.distribution.Teleporter;
import io.anuke.mindustry.world.blocks.types.power.*; import io.anuke.mindustry.world.blocks.power.*;
public class PowerBlocks extends BlockList implements ContentList { 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; public static Block combustiongenerator, thermalgenerator, liquidcombustiongenerator, rtgenerator, solarpanel, largesolarpanel, nuclearReactor, fusionReactor, repairturret, megarepairturret, shieldgenerator, battery, batteryLarge, powernode, powernodelarge, teleporter;

View File

@@ -6,10 +6,10 @@ import io.anuke.mindustry.content.Liquids;
import io.anuke.mindustry.content.fx.BlockFx; import io.anuke.mindustry.content.fx.BlockFx;
import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.type.ContentList;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.types.production.Cultivator; import io.anuke.mindustry.world.blocks.production.Cultivator;
import io.anuke.mindustry.world.blocks.types.production.Drill; import io.anuke.mindustry.world.blocks.production.Drill;
import io.anuke.mindustry.world.blocks.types.production.Fracker; import io.anuke.mindustry.world.blocks.production.Fracker;
import io.anuke.mindustry.world.blocks.types.production.SolidPump; import io.anuke.mindustry.world.blocks.production.SolidPump;
public class ProductionBlocks extends BlockList implements ContentList { public class ProductionBlocks extends BlockList implements ContentList {
public static Block ironDrill, reinforcedDrill, steelDrill, titaniumDrill, laserdrill, nucleardrill, plasmadrill, waterextractor, oilextractor, cultivator; public static Block ironDrill, reinforcedDrill, steelDrill, titaniumDrill, laserdrill, nucleardrill, plasmadrill, waterextractor, oilextractor, cultivator;

View File

@@ -2,10 +2,10 @@ package io.anuke.mindustry.content.blocks;
import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.type.ContentList;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.types.storage.CoreBlock; import io.anuke.mindustry.world.blocks.storage.CoreBlock;
import io.anuke.mindustry.world.blocks.types.storage.SortedUnloader; import io.anuke.mindustry.world.blocks.storage.SortedUnloader;
import io.anuke.mindustry.world.blocks.types.storage.Unloader; import io.anuke.mindustry.world.blocks.storage.Unloader;
import io.anuke.mindustry.world.blocks.types.storage.Vault; import io.anuke.mindustry.world.blocks.storage.Vault;
public class StorageBlocks extends BlockList implements ContentList { public class StorageBlocks extends BlockList implements ContentList {
public static Block core, vault, unloader, sortedunloader; public static Block core, vault, unloader, sortedunloader;

View File

@@ -5,10 +5,10 @@ import io.anuke.mindustry.content.UnitTypes;
import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.type.ContentList;
import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.types.units.DropPoint; import io.anuke.mindustry.world.blocks.units.DropPoint;
import io.anuke.mindustry.world.blocks.types.units.RepairPoint; import io.anuke.mindustry.world.blocks.units.RepairPoint;
import io.anuke.mindustry.world.blocks.types.units.ResupplyPoint; import io.anuke.mindustry.world.blocks.units.ResupplyPoint;
import io.anuke.mindustry.world.blocks.types.units.UnitFactory; import io.anuke.mindustry.world.blocks.units.UnitFactory;
public class UnitBlocks extends BlockList implements ContentList { public class UnitBlocks extends BlockList implements ContentList {
public static Block resupplyPoint, repairPoint, droneFactory, dropPoint; public static Block resupplyPoint, repairPoint, droneFactory, dropPoint;

View File

@@ -6,7 +6,7 @@ import io.anuke.mindustry.content.fx.ShootFx;
import io.anuke.mindustry.type.AmmoType; import io.anuke.mindustry.type.AmmoType;
import io.anuke.mindustry.type.ContentList; import io.anuke.mindustry.type.ContentList;
import io.anuke.mindustry.world.Block; 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.graphics.Draw;
import io.anuke.ucore.util.Angles; import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;

View File

@@ -81,8 +81,8 @@ public class Logic extends Module {
public void runWave(){ public void runWave(){
//TODO spawn enemies //TODO spawn enemies properly
for(int i = 0; i < 100; i ++){ for(int i = 0; i < 10; i ++){
BaseUnit unit = UnitTypes.vtol.create(Team.red); 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); Vector2 offset = new Vector2().setToRandomDirection().scl(world.width()/2f*tilesize).add(world.width()/2f*tilesize, world.height()/2f*tilesize);
unit.inventory.addAmmo(AmmoTypes.bulletIron); unit.inventory.addAmmo(AmmoTypes.bulletIron);

View File

@@ -20,7 +20,7 @@ import io.anuke.mindustry.entities.traits.BelowLiquidTrait;
import io.anuke.mindustry.entities.units.BaseUnit; import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.graphics.*; 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.mindustry.world.Tile;
import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Core;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;

View File

@@ -5,7 +5,7 @@ import com.badlogic.gdx.utils.IntSet;
import io.anuke.mindustry.io.MapTileData.DataPosition; import io.anuke.mindustry.io.MapTileData.DataPosition;
import io.anuke.mindustry.io.MapTileData.TileDataMarker; import io.anuke.mindustry.io.MapTileData.TileDataMarker;
import io.anuke.mindustry.world.Block; 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.Bits;
import static io.anuke.mindustry.Vars.ui; import static io.anuke.mindustry.Vars.ui;

View File

@@ -9,7 +9,7 @@ import io.anuke.mindustry.io.MapTileData;
import io.anuke.mindustry.io.MapTileData.DataPosition; import io.anuke.mindustry.io.MapTileData.DataPosition;
import io.anuke.mindustry.io.MapTileData.TileDataMarker; import io.anuke.mindustry.io.MapTileData.TileDataMarker;
import io.anuke.mindustry.world.Block; 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.Bits;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;

View File

@@ -9,7 +9,7 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.ColorMapper; import io.anuke.mindustry.world.ColorMapper;
import io.anuke.mindustry.world.ColorMapper.BlockPair; import io.anuke.mindustry.world.ColorMapper.BlockPair;
import io.anuke.mindustry.content.blocks.Blocks; 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.graphics.Pixmaps;
import io.anuke.ucore.noise.RidgedPerlin; import io.anuke.ucore.noise.RidgedPerlin;
import io.anuke.ucore.noise.Simplex; import io.anuke.ucore.noise.Simplex;

View File

@@ -20,8 +20,8 @@ import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.graphics.Trail; import io.anuke.mindustry.graphics.Trail;
import io.anuke.mindustry.type.*; import io.anuke.mindustry.type.*;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.Floor; import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.types.storage.CoreBlock.CoreEntity; import io.anuke.mindustry.world.blocks.storage.CoreBlock.CoreEntity;
import io.anuke.ucore.core.*; import io.anuke.ucore.core.*;
import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.entities.EntityGroup;
import io.anuke.ucore.entities.trait.SolidTrait; import io.anuke.ucore.entities.trait.SolidTrait;

View File

@@ -7,10 +7,10 @@ import io.anuke.mindustry.entities.traits.TargetTrait;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.Wall; import io.anuke.mindustry.world.blocks.Wall;
import io.anuke.mindustry.world.blocks.types.modules.InventoryModule; import io.anuke.mindustry.world.blocks.modules.InventoryModule;
import io.anuke.mindustry.world.blocks.types.modules.LiquidModule; import io.anuke.mindustry.world.blocks.modules.LiquidModule;
import io.anuke.mindustry.world.blocks.types.modules.PowerModule; import io.anuke.mindustry.world.blocks.modules.PowerModule;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.entities.EntityGroup;

View File

@@ -9,7 +9,7 @@ import io.anuke.mindustry.net.Interpolator;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.StatusEffect; import io.anuke.mindustry.type.StatusEffect;
import io.anuke.mindustry.world.Tile; 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.Effects;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.entities.impl.DestructibleEntity; import io.anuke.ucore.entities.impl.DestructibleEntity;

View File

@@ -2,7 +2,7 @@ package io.anuke.mindustry.entities.effect;
import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.math.Interpolation;
import io.anuke.mindustry.world.Tile; 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.core.Timers;
import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.entities.EntityGroup;
import io.anuke.ucore.entities.impl.BaseEntity; import io.anuke.ucore.entities.impl.BaseEntity;

View File

@@ -14,8 +14,8 @@ import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.type.Recipe;
import io.anuke.mindustry.world.Build; import io.anuke.mindustry.world.Build;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.BuildBlock; import io.anuke.mindustry.world.blocks.BuildBlock;
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.core.Effects;
import io.anuke.ucore.core.Events; import io.anuke.ucore.core.Events;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;

View File

@@ -10,7 +10,7 @@ import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.AmmoType; import io.anuke.mindustry.type.AmmoType;
import io.anuke.mindustry.type.Item; 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.mindustry.world.Tile;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Effects.Effect;

View File

@@ -7,7 +7,7 @@ import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.graphics.Trail; import io.anuke.mindustry.graphics.Trail;
import io.anuke.mindustry.type.AmmoType; 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.Tile;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;

View File

@@ -5,9 +5,9 @@ import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.type.AmmoType; 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.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.core.Timers;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.*; import io.anuke.ucore.util.*;

View File

@@ -13,10 +13,10 @@ import io.anuke.mindustry.entities.units.UnitType;
import io.anuke.mindustry.game.EventType.BlockBuildEvent; import io.anuke.mindustry.game.EventType.BlockBuildEvent;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.graphics.Palette; 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.Tile;
import io.anuke.mindustry.world.blocks.types.BuildBlock; import io.anuke.mindustry.world.blocks.BuildBlock;
import io.anuke.mindustry.world.blocks.types.BuildBlock.BuildEntity; import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity;
import io.anuke.ucore.core.Events; import io.anuke.ucore.core.Events;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.entities.EntityGroup;

View File

@@ -1,6 +1,5 @@
package io.anuke.mindustry.entities.units.types; 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.FlyingUnit;
import io.anuke.mindustry.entities.units.UnitType; import io.anuke.mindustry.entities.units.UnitType;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
@@ -9,10 +8,6 @@ import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
public class Vtol extends FlyingUnit { 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) { public Vtol(UnitType type, Team team) {
super(type, team); super(type, team);
@@ -22,10 +17,11 @@ public class Vtol extends FlyingUnit {
public void draw() { public void draw() {
Draw.alpha(hitTime / hitDuration); Draw.alpha(hitTime / hitDuration);
Draw.rect(region, x, y, rotation - 90); Draw.rect("vtol", x, y, rotation - 90);
for(int i : Mathf.signs){ for(int i : Mathf.signs){
Draw.rect(booster1, x, y, 12*i, 12, rotation - 90); Draw.rect("vtol-booster-1", x, y, 12*i, 12, rotation - 90);
Draw.rect(booster2, x, y, 12*i, 12, rotation - 90); Draw.rect("vtol-booster-2", x, y, 12*i, 12, rotation - 90);
} }
Draw.alpha(1f); Draw.alpha(1f);

View File

@@ -5,7 +5,7 @@ import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; 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.core.Graphics;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;

View File

@@ -9,7 +9,7 @@ import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.entities.Unit; import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.game.TeamInfo.TeamData; import io.anuke.mindustry.game.TeamInfo.TeamData;
import io.anuke.mindustry.input.InputHandler; 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.mindustry.world.Tile;
import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Graphics;
import io.anuke.ucore.core.Inputs; import io.anuke.ucore.core.Inputs;

View File

@@ -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();
}
}

View File

@@ -16,15 +16,13 @@ import io.anuke.ucore.core.Inputs;
import io.anuke.ucore.core.Inputs.DeviceType; import io.anuke.ucore.core.Inputs.DeviceType;
import io.anuke.ucore.core.KeyBinds; import io.anuke.ucore.core.KeyBinds;
import io.anuke.ucore.core.Settings; import io.anuke.ucore.core.Settings;
import io.anuke.ucore.function.Callable;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Lines; import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.scene.ui.layout.Unit; import io.anuke.ucore.scene.ui.layout.Unit;
import io.anuke.ucore.scene.utils.Cursors;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.*; 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.*; import static io.anuke.mindustry.input.PlaceMode.*;
public class DesktopInput extends InputHandler{ public class DesktopInput extends InputHandler{
@@ -154,9 +152,7 @@ public class DesktopInput extends InputHandler{
if(cursor != null){ if(cursor != null){
cursor = cursor.target(); cursor = cursor.target();
if(cursor.block().isCursor(cursor)) { cursorType = cursor.block().getCursor(cursor);
cursorType = hand;
}
if(canMine(cursor)){ if(canMine(cursor)){
cursorType = drill; 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();
}
}
} }

View File

@@ -94,7 +94,7 @@ public abstract class InputHandler extends InputAdapter{
boolean showedInventory = false; boolean showedInventory = false;
//check if tapped block is configurable //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; consumed = true;
if((!frag.config.isShown() //if the config fragment is hidden, show if((!frag.config.isShown() //if the config fragment is hidden, show
//alternatively, the current selected block can 'agree' to switch config tiles //alternatively, the current selected block can 'agree' to switch config tiles

View File

@@ -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);
}
}

View File

@@ -11,7 +11,7 @@ import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.io.SaveFileVersion; import io.anuke.mindustry.io.SaveFileVersion;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; 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.Entities;
import io.anuke.ucore.entities.EntityGroup; import io.anuke.ucore.entities.EntityGroup;
import io.anuke.ucore.entities.EntityPhysics; import io.anuke.ucore.entities.EntityPhysics;

View File

@@ -6,10 +6,10 @@ import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.TimeUtils; import com.badlogic.gdx.utils.TimeUtils;
import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.types.BlockPart; import io.anuke.mindustry.world.blocks.BlockPart;
import io.anuke.mindustry.world.blocks.types.Floor; import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.types.Rock; import io.anuke.mindustry.world.blocks.Rock;
import io.anuke.mindustry.world.blocks.types.StaticBlock; import io.anuke.mindustry.world.blocks.StaticBlock;
import io.anuke.ucore.core.Settings; import io.anuke.ucore.core.Settings;
import static io.anuke.mindustry.Vars.world; import static io.anuke.mindustry.Vars.world;

View File

@@ -18,8 +18,6 @@ public class Interpolator {
public Vector2 pos = new Vector2(); public Vector2 pos = new Vector2();
public float[] values = {}; public float[] values = {};
public Vector2 smoothPos = new Vector2();
public void read(float cx, float cy, float x, float y, long sent, float... target1ds){ public void read(float cx, float cy, float x, float y, long sent, float... target1ds){
targets = target1ds; targets = target1ds;
time = 0f; time = 0f;

View File

@@ -9,7 +9,7 @@ import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.io.Version; import io.anuke.mindustry.io.Version;
import io.anuke.mindustry.type.Upgrade; import io.anuke.mindustry.type.Upgrade;
import io.anuke.mindustry.world.Tile; 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.core.Timers;
import io.anuke.ucore.entities.Entities; import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.util.Bits; import io.anuke.ucore.util.Bits;

View File

@@ -17,9 +17,15 @@ import io.anuke.mindustry.game.UnlockableContent;
import io.anuke.mindustry.graphics.CacheLayer; import io.anuke.mindustry.graphics.CacheLayer;
import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.graphics.Layer;
import io.anuke.mindustry.graphics.Palette; import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.input.CursorType;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack; import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.Liquid; 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.core.Timers;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Hue; 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.*/ /**whether this block has instant transfer checking. used for calculations to prevent infinite loops.*/
public boolean instantTransfer = false; public boolean instantTransfer = false;
/**The block group. Unless {@link #canReplace} is overriden, blocks in the same group can replace each other.*/ /**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.*/ /**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.*/ /**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.*/ /**List of block flags. Used for AI indexing.*/
public EnumSet<BlockFlag> flags; public EnumSet<BlockFlag> flags;
/**Whether to automatically set the entity to 'sleeping' when created.*/ /**Whether to automatically set the entity to 'sleeping' when created.*/
@@ -113,6 +119,8 @@ public class Block extends BaseBlock implements UnlockableContent{
public TextureRegion shadowRegion; public TextureRegion shadowRegion;
/**Texture region array for drawing multiple shadows.*/ /**Texture region array for drawing multiple shadows.*/
public TextureRegion[] shadowRegions; public TextureRegion[] shadowRegions;
/**Whether the block can be tapped and selected to configure.*/
public boolean configurable;
public Block(String name) { public Block(String name) {
this.name = 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.*/ /**Returns whether or not a hand cursor should be shown over this block.*/
public boolean isCursor(Tile tile){ public CursorType getCursor(Tile tile){
return isConfigurable(tile); return configurable ? CursorType.normal : CursorType.hand;
} }
/**Called when this block is tapped to build a UI on the table. /**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) {} 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. /**Called when another tile is tapped while this block is selected.
* Returns whether or not this block should be deselected.*/ * Returns whether or not this block should be deselected.*/
public boolean onConfigureTileTapped(Tile tile, Tile other){ public boolean onConfigureTileTapped(Tile tile, Tile other){
@@ -225,8 +219,8 @@ public class Block extends BaseBlock implements UnlockableContent{
//TODO make this easier to config. //TODO make this easier to config.
public void setBars(){ public void setBars(){
if(hasPower) bars.add(new BlockBar(BarType.power, true, tile -> tile.entity.power.amount / powerCapacity)); 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 BlockBar(BarType.liquid, true, tile -> tile.entity.liquids.amount / liquidCapacity)); 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)); if(hasItems) bars.add(new BlockBar(BarType.inventory, true, tile -> (float)tile.entity.items.totalItems() / itemCapacity));
} }

View File

@@ -7,7 +7,7 @@ import io.anuke.mindustry.content.fx.Fx;
import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.type.Recipe; 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.core.Effects;
import io.anuke.ucore.entities.Entities; import io.anuke.ucore.entities.Entities;

View File

@@ -9,10 +9,10 @@ import io.anuke.mindustry.entities.traits.TargetTrait;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.type.Recipe; import io.anuke.mindustry.type.Recipe;
import io.anuke.mindustry.world.blocks.types.Floor; import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.types.modules.InventoryModule; import io.anuke.mindustry.world.blocks.modules.InventoryModule;
import io.anuke.mindustry.world.blocks.types.modules.LiquidModule; import io.anuke.mindustry.world.blocks.modules.LiquidModule;
import io.anuke.mindustry.world.blocks.types.modules.PowerModule; import io.anuke.mindustry.world.blocks.modules.PowerModule;
import io.anuke.ucore.function.Consumer; import io.anuke.ucore.function.Consumer;
import io.anuke.ucore.util.Bits; import io.anuke.ucore.util.Bits;
import io.anuke.ucore.entities.trait.PosTrait; import io.anuke.ucore.entities.trait.PosTrait;

View File

@@ -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.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;

View File

@@ -1,4 +1,4 @@
package io.anuke.mindustry.world.blocks.types; package io.anuke.mindustry.world.blocks;
import java.io.DataInputStream; import java.io.DataInputStream;
import java.io.DataOutputStream; import java.io.DataOutputStream;

View File

@@ -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.Item;
import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.type.Liquid;

View File

@@ -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 com.badlogic.gdx.graphics.g2d.TextureRegion;
import io.anuke.mindustry.content.fx.ExplosionFx; 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.type.Recipe;
import io.anuke.mindustry.world.BarType; import io.anuke.mindustry.world.BarType;
import io.anuke.mindustry.world.Block; 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.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.Effects;
import io.anuke.ucore.core.Graphics; import io.anuke.ucore.core.Graphics;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
@@ -31,6 +31,7 @@ public class BuildBlock extends Block {
size = Integer.parseInt(name.charAt(name.length()-1) + ""); size = Integer.parseInt(name.charAt(name.length()-1) + "");
health = 1; health = 1;
layer = Layer.placement; layer = Layer.placement;
configurable = true;
} }
@Override @Override
@@ -43,11 +44,6 @@ public class BuildBlock extends Block {
return true; return true;
} }
@Override
public boolean isCursor(Tile tile) {
return true;
}
@Override @Override
public void setBars(){ public void setBars(){
bars.replace(new BlockBar(BarType.health, true, tile -> (float)tile.<BuildEntity>entity().progress)); bars.replace(new BlockBar(BarType.health, true, tile -> (float)tile.<BuildEntity>entity().progress));

View File

@@ -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.Color;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.g2d.TextureRegion;

View File

@@ -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 com.badlogic.gdx.graphics.g2d.TextureRegion;
import io.anuke.mindustry.world.Block; 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.Tile;
import io.anuke.mindustry.world.blocks.types.modules.LiquidModule; import io.anuke.mindustry.world.blocks.modules.LiquidModule;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
public class LiquidBlock extends Block{ public class LiquidBlock extends Block{

View File

@@ -1,4 +1,4 @@
package io.anuke.mindustry.world.blocks.types; package io.anuke.mindustry.world.blocks;
import io.anuke.mindustry.content.blocks.Blocks; import io.anuke.mindustry.content.blocks.Blocks;

View File

@@ -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.Block;
import io.anuke.mindustry.world.BlockGroup; import io.anuke.mindustry.world.meta.BlockGroup;
public abstract class PowerBlock extends Block{ public abstract class PowerBlock extends Block{

View File

@@ -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.Block;

View File

@@ -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<Item> holder, Consumer<Item> consumer){
Array<Item> items = Item.all();
ButtonGroup<ImageButton> 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);
}
}

View File

@@ -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.graphics.CacheLayer;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;

View File

@@ -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.Block;
import io.anuke.mindustry.world.BlockGroup; import io.anuke.mindustry.world.meta.BlockGroup;
public class Wall extends Block{ public class Wall extends Block{

View File

@@ -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 com.badlogic.gdx.math.Rectangle;
import io.anuke.mindustry.content.fx.BlockFx; import io.anuke.mindustry.content.fx.BlockFx;
import io.anuke.mindustry.entities.Player; import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.input.CursorType;
import io.anuke.mindustry.world.Tile; 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;
import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
@@ -39,8 +40,8 @@ public class Door extends Wall{
} }
@Override @Override
public boolean isCursor(Tile tile){ public CursorType getCursor(Tile tile){
return true; return CursorType.hand;
} }
@Override @Override

View File

@@ -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 com.badlogic.gdx.math.MathUtils;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.Units; import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.graphics.Layer;
import io.anuke.mindustry.world.Tile; 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.core.Timers;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Hue; import io.anuke.ucore.graphics.Hue;

View File

@@ -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.Vars;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.effect.Shield; import io.anuke.mindustry.entities.effect.Shield;
import io.anuke.mindustry.world.Tile; 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.core.Timers;
import io.anuke.ucore.entities.impl.BulletEntity; import io.anuke.ucore.entities.impl.BulletEntity;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;

View File

@@ -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 com.badlogic.gdx.graphics.Color;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.world.Tile; 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.core.Timers;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Strings; import io.anuke.ucore.util.Strings;

View File

@@ -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.Color;
import com.badlogic.gdx.graphics.g2d.TextureRegion; 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.AmmoEntry;
import io.anuke.mindustry.type.AmmoType; import io.anuke.mindustry.type.AmmoType;
import io.anuke.mindustry.world.Block; 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.Tile;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Effects.Effect;

View File

@@ -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.type.AmmoType;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;

View File

@@ -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.type.AmmoType;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;

View File

@@ -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 com.badlogic.gdx.utils.ObjectMap;
import io.anuke.mindustry.entities.Unit; 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.AmmoType;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.BarType; 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.Tile;
import io.anuke.mindustry.world.blocks.types.defense.Turret; import io.anuke.mindustry.world.blocks.defense.Turret;
public class ItemTurret extends Turret { public class ItemTurret extends Turret {
protected int maxAmmo = 100; protected int maxAmmo = 100;

View File

@@ -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.content.fx.Fx;
import io.anuke.mindustry.type.AmmoType; import io.anuke.mindustry.type.AmmoType;

View File

@@ -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 com.badlogic.gdx.utils.ObjectMap;
import io.anuke.mindustry.type.AmmoType; import io.anuke.mindustry.type.AmmoType;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.BarType; 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.Tile;
import io.anuke.mindustry.world.blocks.types.defense.Turret; import io.anuke.mindustry.world.blocks.defense.Turret;
import io.anuke.ucore.core.Effects; import io.anuke.ucore.core.Effects;
public abstract class LiquidTurret extends Turret { public abstract class LiquidTurret extends Turret {

View File

@@ -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.type.AmmoType;
import io.anuke.mindustry.world.Tile; 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; import io.anuke.ucore.util.Strings;
public abstract class PowerTurret extends Turret { public abstract class PowerTurret extends Turret {

View File

@@ -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.entities.TileEntity;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;

View File

@@ -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 com.badlogic.gdx.graphics.g2d.TextureRegion;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.LiquidBlock; import io.anuke.mindustry.world.blocks.LiquidBlock;
import io.anuke.mindustry.world.blocks.types.modules.LiquidModule; import io.anuke.mindustry.world.blocks.modules.LiquidModule;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;

View File

@@ -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 com.badlogic.gdx.utils.LongArray;
import io.anuke.mindustry.content.Items; 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.graphics.Layer;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Block; 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.Tile;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;

View File

@@ -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.mindustry.world.Tile;
import io.anuke.ucore.graphics.CapStyle; import io.anuke.ucore.graphics.CapStyle;

View File

@@ -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.graphics.Color;
import com.badlogic.gdx.utils.IntArray; import com.badlogic.gdx.utils.IntArray;
@@ -41,6 +41,7 @@ public class ItemBridge extends Block {
layer = Layer.power; layer = Layer.power;
expanded = true; expanded = true;
itemCapacity = 30; itemCapacity = 30;
configurable = true;
} }
@Override @Override
@@ -55,11 +56,6 @@ public class ItemBridge extends Block {
lastPlaced = tile.packedPosition(); lastPlaced = tile.packedPosition();
} }
@Override
public boolean isConfigurable(Tile tile) {
return true;
}
@Override @Override
public void drawPlace(int x, int y, int rotation, boolean valid) { public void drawPlace(int x, int y, int rotation, boolean valid) {
Lines.stroke(2f); Lines.stroke(2f);

View File

@@ -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.Array;
import com.badlogic.gdx.utils.NumberUtils; import com.badlogic.gdx.utils.NumberUtils;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Block; 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.Tile;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
import io.anuke.ucore.function.Consumer; import io.anuke.ucore.function.Consumer;

View File

@@ -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.type.Item;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;

View File

@@ -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.type.Item;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;

View File

@@ -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 com.badlogic.gdx.graphics.g2d.TextureRegion;
import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Tile; 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; import io.anuke.ucore.graphics.Draw;
public class LiquidJunction extends LiquidBlock{ public class LiquidJunction extends LiquidBlock{

View File

@@ -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.Tile;
import io.anuke.mindustry.world.blocks.types.LiquidBlock; import io.anuke.mindustry.world.blocks.LiquidBlock;
public class LiquidRouter extends LiquidBlock{ public class LiquidRouter extends LiquidBlock{

View File

@@ -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; import io.anuke.mindustry.world.Block;

View File

@@ -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.type.Item;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;

View File

@@ -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.type.Item;
import io.anuke.mindustry.world.Block; 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.Tile;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;

View File

@@ -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.content.Items;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.BlockGroup;
import io.anuke.mindustry.world.Tile; 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.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.scene.ui.layout.Table;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
@@ -19,7 +15,7 @@ import java.io.DataInputStream;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
public class Sorter extends Block{ public class Sorter extends Block implements SelectionTrait{
public Sorter(String name) { public Sorter(String name) {
super(name); super(name);
@@ -27,12 +23,15 @@ public class Sorter extends Block{
solid = true; solid = true;
instantTransfer = true; instantTransfer = true;
group = BlockGroup.transportation; group = BlockGroup.transportation;
configurable = true;
} }
@Override @Override
public void draw(Tile tile){ public void draw(Tile tile){
super.draw(tile); super.draw(tile);
//TODO call event for change
SorterEntity entity = tile.entity(); SorterEntity entity = tile.entity();
Draw.color(entity.sortItem.color); Draw.color(entity.sortItem.color);
@@ -93,47 +92,10 @@ public class Sorter extends Block{
return to; 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 @Override
public void buildTable(Tile tile, Table table){ public void buildTable(Tile tile, Table table){
SorterEntity entity = tile.entity(); SorterEntity entity = tile.entity();
buildItemTable(table, () -> entity.sortItem, item -> entity.sortItem = item);
Array<Item> items = Item.all();
ButtonGroup<ImageButton> 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);
} }
@Override @Override

View File

@@ -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.type.Item;
import io.anuke.mindustry.world.Block; 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.Tile;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;

View File

@@ -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.graphics.Color;
import com.badlogic.gdx.utils.Array; 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.Item;
import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Tile; 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;
import io.anuke.ucore.core.Effects.Effect; import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.core.Timers; import io.anuke.ucore.core.Timers;
@@ -65,15 +65,7 @@ public class Teleporter extends PowerBlock{
itemCapacity = 100; itemCapacity = 100;
hasLiquids = true; hasLiquids = true;
liquidCapacity = 100f; liquidCapacity = 100f;
} configurable = true;
@Override
public void configure(Tile tile, byte data) {
TeleporterEntity entity = tile.entity();
if(entity != null){
entity.color = data;
entity.items.clear();
}
} }
@Override @Override
@@ -84,7 +76,7 @@ public class Teleporter extends PowerBlock{
@Override @Override
public void placed(Tile tile){ public void placed(Tile tile){
tile.<TeleporterEntity>entity().color = lastColor; tile.<TeleporterEntity>entity().color = lastColor;
setConfigure(tile, lastColor); tile.<TeleporterEntity>entity().color = lastColor;
} }
@Override @Override
@@ -212,15 +204,12 @@ public class Teleporter extends PowerBlock{
} }
} }
@Override
public boolean isConfigurable(Tile tile){
return true;
}
@Override @Override
public void buildTable(Tile tile, Table table){ public void buildTable(Tile tile, Table table){
TeleporterEntity entity = tile.entity(); TeleporterEntity entity = tile.entity();
//TODO call event for change
ButtonGroup<ImageButton> group = new ButtonGroup<>(); ButtonGroup<ImageButton> group = new ButtonGroup<>();
Table cont = new Table(); Table cont = new Table();
cont.margin(4); cont.margin(4);
@@ -233,7 +222,6 @@ public class Teleporter extends PowerBlock{
final int f = i; final int f = i;
ImageButton button = cont.addImageButton("white", "toggle", 24, () -> { ImageButton button = cont.addImageButton("white", "toggle", 24, () -> {
lastColor = (byte)f; lastColor = (byte)f;
setConfigure(tile, (byte)f);
}).size(34, 38).padBottom(-5.1f).group(group).get(); }).size(34, 38).padBottom(-5.1f).group(group).get();
button.getStyle().imageUpColor = colorArray[f]; button.getStyle().imageUpColor = colorArray[f];
button.setChecked(entity.color == f); button.setChecked(entity.color == f);

View File

@@ -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 com.badlogic.gdx.graphics.g2d.TextureRegion;
import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.BarType; import io.anuke.mindustry.world.BarType;
import io.anuke.mindustry.world.Tile; 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; import io.anuke.ucore.graphics.Draw;
public class TunnelConduit extends LiquidBlock { public class TunnelConduit extends LiquidBlock {

Some files were not shown because too many files have changed in this diff Show More