aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/structure/IStructureDefinition.java134
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/structure/StructureIterationType.java8
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/structure/StructureUtility.java130
3 files changed, 145 insertions, 127 deletions
diff --git a/src/main/java/com/github/technus/tectech/mechanics/structure/IStructureDefinition.java b/src/main/java/com/github/technus/tectech/mechanics/structure/IStructureDefinition.java
index c8488d5cea..de7a98f9bc 100644
--- a/src/main/java/com/github/technus/tectech/mechanics/structure/IStructureDefinition.java
+++ b/src/main/java/com/github/technus/tectech/mechanics/structure/IStructureDefinition.java
@@ -1,13 +1,11 @@
package com.github.technus.tectech.mechanics.structure;
-import com.github.technus.tectech.TecTech;
import com.github.technus.tectech.mechanics.alignment.enumerable.ExtendedFacing;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
-import java.util.Arrays;
-
-import static com.github.technus.tectech.loader.TecTechConfig.DEBUG_MODE;
+import static com.github.technus.tectech.mechanics.structure.StructureIterationType.*;
+import static com.github.technus.tectech.mechanics.structure.StructureUtility.iterate;
public interface IStructureDefinition<T> {
/**
@@ -22,146 +20,28 @@ public interface IStructureDefinition<T> {
int basePositionA, int basePositionB, int basePositionC,
boolean forceCheckAllBlocks){
return iterate(object, null, getStructureFor(piece), world, extendedFacing, basePositionX, basePositionY, basePositionZ,
- basePositionA, basePositionB, basePositionC,false,forceCheckAllBlocks);
+ basePositionA, basePositionB, basePositionC,forceCheckAllBlocks? CHECK_FULLY:CHECK);
}
default boolean hints(T object, ItemStack trigger,String piece, World world, ExtendedFacing extendedFacing,
int basePositionX, int basePositionY, int basePositionZ,
int basePositionA, int basePositionB, int basePositionC) {
return iterate(object, trigger, getStructureFor(piece), world, extendedFacing, basePositionX, basePositionY, basePositionZ,
- basePositionA, basePositionB, basePositionC,true,null);
+ basePositionA, basePositionB, basePositionC,SPAWN_HINTS);
}
default boolean build(T object, ItemStack trigger,String piece, World world, ExtendedFacing extendedFacing,
int basePositionX, int basePositionY, int basePositionZ,
int basePositionA, int basePositionB, int basePositionC) {
return iterate(object, trigger, getStructureFor(piece), world, extendedFacing, basePositionX, basePositionY, basePositionZ,
- basePositionA, basePositionB, basePositionC,false,null);
+ basePositionA, basePositionB, basePositionC,BUILD_TEMPLATE);
}
default boolean buildOrHints(T object, ItemStack trigger,String piece, World world, ExtendedFacing extendedFacing,
int basePositionX, int basePositionY, int basePositionZ,
int basePositionA, int basePositionB, int basePositionC,
- boolean hintsOnly){
+ boolean hints){
return iterate(object, trigger, getStructureFor(piece), world, extendedFacing, basePositionX, basePositionY, basePositionZ,
- basePositionA, basePositionB, basePositionC,hintsOnly,null);
- }
-
- static <T> boolean iterate(T object, ItemStack trigger, IStructureElement<T>[] elements, World world, ExtendedFacing extendedFacing,
- int basePositionX, int basePositionY, int basePositionZ,
- int basePositionA, int basePositionB, int basePositionC,
- boolean hintsOnly, Boolean checkBlocksIfNotNullForceCheckAllIfTrue){
- if(world.isRemote ^ hintsOnly){
- return false;
- }
-
- //change base position to base offset
- basePositionA=-basePositionA;
- basePositionB=-basePositionB;
- basePositionC=-basePositionC;
-
- int[] abc = new int[]{basePositionA,basePositionB,basePositionC};
- int[] xyz = new int[3];
-
- if(checkBlocksIfNotNullForceCheckAllIfTrue!=null){
- if(checkBlocksIfNotNullForceCheckAllIfTrue){
- for (IStructureElement<T> element : elements) {
- if(element.isNavigating()) {
- abc[0] = (element.resetA() ? basePositionA : abc[0]) + element.getStepA();
- abc[1] = (element.resetB() ? basePositionB : abc[1]) + element.getStepB();
- abc[2] = (element.resetC() ? basePositionC : abc[2]) + element.getStepC();
- }else {
- extendedFacing.getWorldOffset(abc, xyz);
- xyz[0] += basePositionX;
- xyz[1] += basePositionY;
- xyz[2] += basePositionZ;
-
- if (world.blockExists(xyz[0], xyz[1], xyz[2])) {
- if(!element.check(object, world, xyz[0], xyz[1], xyz[2])){
- if(DEBUG_MODE){
- TecTech.LOGGER.info("Multi ["+basePositionX+", "+basePositionY+", "+basePositionZ+"] failed @ "+
- Arrays.toString(xyz)+" "+Arrays.toString(abc));
- }
- return false;
- }
- } else {
- if(DEBUG_MODE){
- TecTech.LOGGER.info("Multi ["+basePositionX+", "+basePositionY+", "+basePositionZ+"] !blockExists @ "+
- Arrays.toString(xyz)+" "+Arrays.toString(abc));
- }
- return false;
- }
- abc[0]+=1;
- }
- }
- } else {
- for (IStructureElement<T> element : elements) {
- if(element.isNavigating()) {
- abc[0] = (element.resetA() ? basePositionA : abc[0]) + element.getStepA();
- abc[1] = (element.resetB() ? basePositionB : abc[1]) + element.getStepB();
- abc[2] = (element.resetC() ? basePositionC : abc[2]) + element.getStepC();
- }else {
- extendedFacing.getWorldOffset(abc, xyz);
- xyz[0] += basePositionX;
- xyz[1] += basePositionY;
- xyz[2] += basePositionZ;
-
- if (world.blockExists(xyz[0], xyz[1], xyz[2])) {
- if(!element.check(object, world, xyz[0], xyz[1], xyz[2])){
- if(DEBUG_MODE){
- TecTech.LOGGER.info("Multi ["+basePositionX+", "+basePositionY+", "+basePositionZ+"] failed @ "+
- Arrays.toString(xyz)+" "+Arrays.toString(abc));
- }
- return false;
- }
- } else {
- if(DEBUG_MODE){
- TecTech.LOGGER.info("Multi ["+basePositionX+", "+basePositionY+", "+basePositionZ+"] !blockExists @ "+
- Arrays.toString(xyz)+" "+Arrays.toString(abc));
- }
- }
- abc[0]+=1;
- }
- }
- }
- }else {
- if(hintsOnly) {
- for (IStructureElement<T> element : elements) {
- if(element.isNavigating()) {
- abc[0] = (element.resetA() ? basePositionA : abc[0]) + element.getStepA();
- abc[1] = (element.resetB() ? basePositionB : abc[1]) + element.getStepB();
- abc[2] = (element.resetC() ? basePositionC : abc[2]) + element.getStepC();
- }else {
- extendedFacing.getWorldOffset(abc, xyz);
- xyz[0] += basePositionX;
- xyz[1] += basePositionY;
- xyz[2] += basePositionZ;
-
- element.spawnHint(object, world, xyz[0], xyz[1], xyz[2], trigger);
-
- abc[0]+=1;
- }
- }
- } else {
- for (IStructureElement<T> element : elements) {
- if(element.isNavigating()) {
- abc[0] = (element.resetA() ? basePositionA : abc[0]) + element.getStepA();
- abc[1] = (element.resetB() ? basePositionB : abc[1]) + element.getStepB();
- abc[2] = (element.resetC() ? basePositionC : abc[2]) + element.getStepC();
- }else {
- extendedFacing.getWorldOffset(abc, xyz);
- xyz[0] += basePositionX;
- xyz[1] += basePositionY;
- xyz[2] += basePositionZ;
-
- if (world.blockExists(xyz[0], xyz[1], xyz[2])) {
- element.placeBlock(object, world, xyz[0], xyz[1], xyz[2], trigger);
- }
- abc[0]+=1;
- }
- }
- }
- }
- return true;
+ basePositionA, basePositionB, basePositionC,hints?SPAWN_HINTS:BUILD_TEMPLATE);
}
}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/structure/StructureIterationType.java b/src/main/java/com/github/technus/tectech/mechanics/structure/StructureIterationType.java
new file mode 100644
index 0000000000..618c07f970
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/mechanics/structure/StructureIterationType.java
@@ -0,0 +1,8 @@
+package com.github.technus.tectech.mechanics.structure;
+
+public enum StructureIterationType {
+ SPAWN_HINTS, //only spawn hint particles
+ BUILD_TEMPLATE, //only builds template
+ CHECK, //checks the structure skipping all unloaded chunks (for machines that were validated already)
+ CHECK_FULLY, //checks the structure failing on unloaded chunks (for machines that are not valid currently)
+}
diff --git a/src/main/java/com/github/technus/tectech/mechanics/structure/StructureUtility.java b/src/main/java/com/github/technus/tectech/mechanics/structure/StructureUtility.java
index 2f6998f028..131822fa46 100644
--- a/src/main/java/com/github/technus/tectech/mechanics/structure/StructureUtility.java
+++ b/src/main/java/com/github/technus/tectech/mechanics/structure/StructureUtility.java
@@ -22,6 +22,8 @@ import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
+import static com.github.technus.tectech.loader.TecTechConfig.DEBUG_MODE;
+import static com.github.technus.tectech.mechanics.structure.StructureIterationType.SPAWN_HINTS;
import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sHintCasingsTT;
import static java.lang.Integer.MIN_VALUE;
@@ -1376,6 +1378,134 @@ public class StructureUtility {
}
}
+ public static <T> boolean iterate(T object,
+ ItemStack trigger,
+ IStructureElement<T>[] elements,
+ World world,
+ ExtendedFacing extendedFacing,
+ int basePositionX, int basePositionY, int basePositionZ,
+ int basePositionA, int basePositionB, int basePositionC,
+ StructureIterationType iterationType) {
+ if (world.isRemote ^ (iterationType == SPAWN_HINTS)) {
+ return false;
+ }
+
+ //change base position to base offset
+ basePositionA = -basePositionA;
+ basePositionB = -basePositionB;
+ basePositionC = -basePositionC;
+
+ int[] abc = new int[]{basePositionA, basePositionB, basePositionC};
+ int[] xyz = new int[3];
+
+ switch (iterationType) {
+ case SPAWN_HINTS: {
+ for (IStructureElement<T> element : elements) {
+ if (element.isNavigating()) {
+ abc[0] = (element.resetA() ? basePositionA : abc[0]) + element.getStepA();
+ abc[1] = (element.resetB() ? basePositionB : abc[1]) + element.getStepB();
+ abc[2] = (element.resetC() ? basePositionC : abc[2]) + element.getStepC();
+ } else {
+ extendedFacing.getWorldOffset(abc, xyz);
+ xyz[0] += basePositionX;
+ xyz[1] += basePositionY;
+ xyz[2] += basePositionZ;
+
+ element.spawnHint(object, world, xyz[0], xyz[1], xyz[2], trigger);
+
+ abc[0] += 1;
+ }
+ }
+ break;
+ }
+ case BUILD_TEMPLATE: {
+ for (IStructureElement<T> element : elements) {
+ if (element.isNavigating()) {
+ abc[0] = (element.resetA() ? basePositionA : abc[0]) + element.getStepA();
+ abc[1] = (element.resetB() ? basePositionB : abc[1]) + element.getStepB();
+ abc[2] = (element.resetC() ? basePositionC : abc[2]) + element.getStepC();
+ } else {
+ extendedFacing.getWorldOffset(abc, xyz);
+ xyz[0] += basePositionX;
+ xyz[1] += basePositionY;
+ xyz[2] += basePositionZ;
+
+ if (world.blockExists(xyz[0], xyz[1], xyz[2])) {
+ element.placeBlock(object, world, xyz[0], xyz[1], xyz[2], trigger);
+ }
+ abc[0] += 1;
+ }
+ }
+ break;
+ }
+ case CHECK: {
+ for (IStructureElement<T> element : elements) {
+ if (element.isNavigating()) {
+ abc[0] = (element.resetA() ? basePositionA : abc[0]) + element.getStepA();
+ abc[1] = (element.resetB() ? basePositionB : abc[1]) + element.getStepB();
+ abc[2] = (element.resetC() ? basePositionC : abc[2]) + element.getStepC();
+ } else {
+ extendedFacing.getWorldOffset(abc, xyz);
+ xyz[0] += basePositionX;
+ xyz[1] += basePositionY;
+ xyz[2] += basePositionZ;
+
+ if (world.blockExists(xyz[0], xyz[1], xyz[2])) {
+ if (!element.check(object, world, xyz[0], xyz[1], xyz[2])) {
+ if (DEBUG_MODE) {
+ TecTech.LOGGER.info("Multi [" + basePositionX + ", " + basePositionY + ", " + basePositionZ + "] failed @ " +
+ Arrays.toString(xyz) + " " + Arrays.toString(abc));
+ }
+ return false;
+ }
+ } else {
+ if (DEBUG_MODE) {
+ TecTech.LOGGER.info("Multi [" + basePositionX + ", " + basePositionY + ", " + basePositionZ + "] !blockExists @ " +
+ Arrays.toString(xyz) + " " + Arrays.toString(abc));
+ }
+ }
+ abc[0] += 1;
+ }
+ break;
+ }
+ }
+ case CHECK_FULLY: {
+ for (IStructureElement<T> element : elements) {
+ if (element.isNavigating()) {
+ abc[0] = (element.resetA() ? basePositionA : abc[0]) + element.getStepA();
+ abc[1] = (element.resetB() ? basePositionB : abc[1]) + element.getStepB();
+ abc[2] = (element.resetC() ? basePositionC : abc[2]) + element.getStepC();
+ } else {
+ extendedFacing.getWorldOffset(abc, xyz);
+ xyz[0] += basePositionX;
+ xyz[1] += basePositionY;
+ xyz[2] += basePositionZ;
+
+ if (world.blockExists(xyz[0], xyz[1], xyz[2])) {
+ if (!element.check(object, world, xyz[0], xyz[1], xyz[2])) {
+ if (DEBUG_MODE) {
+ TecTech.LOGGER.info("Multi [" + basePositionX + ", " + basePositionY + ", " + basePositionZ + "] failed @ " +
+ Arrays.toString(xyz) + " " + Arrays.toString(abc));
+ }
+ return false;
+ }
+ } else {
+ if (DEBUG_MODE) {
+ TecTech.LOGGER.info("Multi [" + basePositionX + ", " + basePositionY + ", " + basePositionZ + "] !blockExists @ " +
+ Arrays.toString(xyz) + " " + Arrays.toString(abc));
+ }
+ return false;
+ }
+ abc[0] += 1;
+ }
+ }
+ break;
+ }
+ default: return false;
+ }
+ return true;
+ }
+
/**
* Transposes shape (swaps B and C axis, can be used to un-transpose transposed shape)
* WARNING! Do not use on old api...