mirror of
https://github.com/GTNewHorizons/StructureLib.git
synced 2026-11-12 00:07:27 +00:00
Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2e3aefd9fd | ||
|
|
c4b091888b | ||
|
|
68fbdf8a81 | ||
|
|
f3bf5fc1ea | ||
|
|
9f9ab7acd9 | ||
|
|
0fe5a74863 | ||
|
|
d650c173bf | ||
|
|
137f651486 | ||
|
|
ff88cbf2d7 |
No files matched your search
+2
-2
@@ -1,8 +1,8 @@
|
|||||||
// Add your dependencies here
|
// Add your dependencies here
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api("com.github.GTNewHorizons:GTNHLib:0.11.18:dev")
|
api("com.github.GTNewHorizons:GTNHLib:0.11.21:dev")
|
||||||
implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.104-GTNH:dev")
|
implementation("com.github.GTNewHorizons:NotEnoughItems:2.8.110-GTNH:dev")
|
||||||
|
|
||||||
testImplementation(platform('org.junit:junit-bom:5.9.2'))
|
testImplementation(platform('org.junit:junit-bom:5.9.2'))
|
||||||
testImplementation('org.junit.jupiter:junit-jupiter')
|
testImplementation('org.junit.jupiter:junit-jupiter')
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ public interface IStructureDefinition<T> {
|
|||||||
* @throws java.util.NoSuchElementException if the given structure piece is not found and the moon phase perfectly
|
* @throws java.util.NoSuchElementException if the given structure piece is not found and the moon phase perfectly
|
||||||
* matches
|
* matches
|
||||||
*/
|
*/
|
||||||
IStructureElement<T>[] getStructureFor(String name);
|
IStructureElement<? super T>[] getStructureFor(String name);
|
||||||
|
|
||||||
boolean isContainedInStructure(String name, int offsetA, int offsetB, int offsetC);
|
boolean isContainedInStructure(String name, int offsetA, int offsetB, int offsetC);
|
||||||
|
|
||||||
@@ -356,7 +356,7 @@ public interface IStructureDefinition<T> {
|
|||||||
* @return true if iteration completed successfully.
|
* @return true if iteration completed successfully.
|
||||||
* @param <T> type of context object.
|
* @param <T> type of context object.
|
||||||
*/
|
*/
|
||||||
static <T> boolean iterate(T object, ItemStack trigger, IStructureElement<T>[] elements, World world,
|
static <T> boolean iterate(T object, ItemStack trigger, IStructureElement<? super T>[] elements, World world,
|
||||||
ExtendedFacing extendedFacing, int basePositionX, int basePositionY, int basePositionZ, int basePositionA,
|
ExtendedFacing extendedFacing, int basePositionX, int basePositionY, int basePositionZ, int basePositionA,
|
||||||
int basePositionB, int basePositionC, boolean hintsOnly, Boolean checkBlocksIfNotNullForceCheckAllIfTrue) {
|
int basePositionB, int basePositionC, boolean hintsOnly, Boolean checkBlocksIfNotNullForceCheckAllIfTrue) {
|
||||||
if (!world.isRemote && hintsOnly) {
|
if (!world.isRemote && hintsOnly) {
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ import com.gtnewhorizon.structurelib.util.ItemStackPredicate.NBTMode;
|
|||||||
/**
|
/**
|
||||||
* Use StructureUtility to instantiate. These are the building blocks for your {@link IStructureDefinition}. It
|
* Use StructureUtility to instantiate. These are the building blocks for your {@link IStructureDefinition}. It
|
||||||
* represents what a particular element can be and how this particular element should be autoplaced.
|
* represents what a particular element can be and how this particular element should be autoplaced.
|
||||||
|
*
|
||||||
|
* @param <T> Type of the context object. {@link IStructureElement} is contravariant over T, so parameters and fields of
|
||||||
|
* type {@link IStructureElement} should be declared as {@code IStructureElement<? super T>}
|
||||||
*/
|
*/
|
||||||
public interface IStructureElement<T> {
|
public interface IStructureElement<T> {
|
||||||
|
|
||||||
@@ -213,7 +216,7 @@ public interface IStructureElement<T> {
|
|||||||
* Forget the messed up class dependency graph for now. this is just so convenient.
|
* Forget the messed up class dependency graph for now. this is just so convenient.
|
||||||
*/
|
*/
|
||||||
default IStructureElementNoPlacement<T> noPlacement() {
|
default IStructureElementNoPlacement<T> noPlacement() {
|
||||||
return new IStructureElementNoPlacement<T>() {
|
return new IStructureElementNoPlacement<>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean check(T t, World world, int x, int y, int z) {
|
public boolean check(T t, World world, int x, int y, int z) {
|
||||||
|
|||||||
@@ -21,11 +21,11 @@ import com.google.common.collect.Iterables;
|
|||||||
*/
|
*/
|
||||||
public interface IStructureElementChain<T> extends IStructureElement<T> {
|
public interface IStructureElementChain<T> extends IStructureElement<T> {
|
||||||
|
|
||||||
IStructureElement<T>[] fallbacks();
|
IStructureElement<? super T>[] fallbacks();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default boolean check(T t, World world, int x, int y, int z) {
|
default boolean check(T t, World world, int x, int y, int z) {
|
||||||
for (IStructureElement<T> fallback : fallbacks()) {
|
for (IStructureElement<? super T> fallback : fallbacks()) {
|
||||||
if (fallback.check(t, world, x, y, z)) {
|
if (fallback.check(t, world, x, y, z)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -35,7 +35,7 @@ public interface IStructureElementChain<T> extends IStructureElement<T> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
default boolean couldBeValid(T t, World world, int x, int y, int z, ItemStack trigger) {
|
default boolean couldBeValid(T t, World world, int x, int y, int z, ItemStack trigger) {
|
||||||
for (IStructureElement<T> fallback : fallbacks()) {
|
for (IStructureElement<? super T> fallback : fallbacks()) {
|
||||||
if (fallback.couldBeValid(t, world, x, y, z, trigger)) {
|
if (fallback.couldBeValid(t, world, x, y, z, trigger)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -45,7 +45,7 @@ public interface IStructureElementChain<T> extends IStructureElement<T> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
default boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
|
default boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
|
||||||
for (IStructureElement<T> fallback : fallbacks()) {
|
for (IStructureElement<? super T> fallback : fallbacks()) {
|
||||||
if (fallback.spawnHint(t, world, x, y, z, trigger)) {
|
if (fallback.spawnHint(t, world, x, y, z, trigger)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -55,7 +55,7 @@ public interface IStructureElementChain<T> extends IStructureElement<T> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
default boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) {
|
default boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) {
|
||||||
for (IStructureElement<T> fallback : fallbacks()) {
|
for (IStructureElement<? super T> fallback : fallbacks()) {
|
||||||
if (fallback.placeBlock(t, world, x, y, z, trigger)) {
|
if (fallback.placeBlock(t, world, x, y, z, trigger)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -67,7 +67,7 @@ public interface IStructureElementChain<T> extends IStructureElement<T> {
|
|||||||
@Override
|
@Override
|
||||||
default List<String> getDescription(T context) {
|
default List<String> getDescription(T context) {
|
||||||
Set<String> descriptions = new LinkedHashSet<>();
|
Set<String> descriptions = new LinkedHashSet<>();
|
||||||
for (IStructureElement<T> fallback : fallbacks()) {
|
for (IStructureElement<? super T> fallback : fallbacks()) {
|
||||||
List<String> desc = fallback.getDescription(context);
|
List<String> desc = fallback.getDescription(context);
|
||||||
if (desc != null) {
|
if (desc != null) {
|
||||||
descriptions.addAll(desc);
|
descriptions.addAll(desc);
|
||||||
@@ -82,7 +82,7 @@ public interface IStructureElementChain<T> extends IStructureElement<T> {
|
|||||||
AutoPlaceEnvironment env) {
|
AutoPlaceEnvironment env) {
|
||||||
Predicate<ItemStack> predicate = null;
|
Predicate<ItemStack> predicate = null;
|
||||||
List<Iterable<ItemStack>> is = new ArrayList<>();
|
List<Iterable<ItemStack>> is = new ArrayList<>();
|
||||||
for (IStructureElement<T> fallback : fallbacks()) {
|
for (IStructureElement<? super T> fallback : fallbacks()) {
|
||||||
BlocksToPlace e = fallback.getBlocksToPlace(t, world, x, y, z, trigger, env);
|
BlocksToPlace e = fallback.getBlocksToPlace(t, world, x, y, z, trigger, env);
|
||||||
if (e == null) continue;
|
if (e == null) continue;
|
||||||
if (predicate == null) predicate = e.getPredicate();
|
if (predicate == null) predicate = e.getPredicate();
|
||||||
@@ -99,7 +99,7 @@ public interface IStructureElementChain<T> extends IStructureElement<T> {
|
|||||||
EntityPlayerMP actor, Consumer<IChatComponent> chatter) {
|
EntityPlayerMP actor, Consumer<IChatComponent> chatter) {
|
||||||
boolean allContinue = true;
|
boolean allContinue = true;
|
||||||
List<IChatComponent> bufferedNoise = new ArrayList<>();
|
List<IChatComponent> bufferedNoise = new ArrayList<>();
|
||||||
for (IStructureElement<T> fallback : fallbacks()) {
|
for (IStructureElement<? super T> fallback : fallbacks()) {
|
||||||
PlaceResult result = fallback.survivalPlaceBlock(t, world, x, y, z, trigger, s, actor, bufferedNoise::add);
|
PlaceResult result = fallback.survivalPlaceBlock(t, world, x, y, z, trigger, s, actor, bufferedNoise::add);
|
||||||
switch (result) {
|
switch (result) {
|
||||||
case REJECT_CONTINUE:
|
case REJECT_CONTINUE:
|
||||||
@@ -124,7 +124,7 @@ public interface IStructureElementChain<T> extends IStructureElement<T> {
|
|||||||
AutoPlaceEnvironment env) {
|
AutoPlaceEnvironment env) {
|
||||||
boolean allContinue = true;
|
boolean allContinue = true;
|
||||||
List<IChatComponent> bufferedNoise = new ArrayList<>();
|
List<IChatComponent> bufferedNoise = new ArrayList<>();
|
||||||
for (IStructureElement<T> fallback : fallbacks()) {
|
for (IStructureElement<? super T> fallback : fallbacks()) {
|
||||||
PlaceResult result = fallback
|
PlaceResult result = fallback
|
||||||
.survivalPlaceBlock(t, world, x, y, z, trigger, env.withChatter(bufferedNoise::add));
|
.survivalPlaceBlock(t, world, x, y, z, trigger, env.withChatter(bufferedNoise::add));
|
||||||
switch (result) {
|
switch (result) {
|
||||||
|
|||||||
@@ -10,36 +10,36 @@ import net.minecraft.world.World;
|
|||||||
/**
|
/**
|
||||||
* Use StructureUtility to instantiate
|
* Use StructureUtility to instantiate
|
||||||
*/
|
*/
|
||||||
interface IStructureNavigate<T> extends IStructureElement<T> {
|
interface IStructureNavigate extends IStructureElement<Object> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default boolean check(T t, World world, int x, int y, int z) {
|
default boolean check(Object t, World world, int x, int y, int z) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default boolean couldBeValid(T t, World world, int x, int y, int z, ItemStack trigger) {
|
default boolean couldBeValid(Object t, World world, int x, int y, int z, ItemStack trigger) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
|
default boolean spawnHint(Object t, World world, int x, int y, int z, ItemStack trigger) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) {
|
default boolean placeBlock(Object t, World world, int x, int y, int z, ItemStack trigger) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, IItemSource s,
|
default PlaceResult survivalPlaceBlock(Object t, World world, int x, int y, int z, ItemStack trigger, IItemSource s,
|
||||||
EntityPlayerMP actor, Consumer<IChatComponent> chatter) {
|
EntityPlayerMP actor, Consumer<IChatComponent> chatter) {
|
||||||
return PlaceResult.SKIP;
|
return PlaceResult.SKIP;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
|
default PlaceResult survivalPlaceBlock(Object t, World world, int x, int y, int z, ItemStack trigger,
|
||||||
AutoPlaceEnvironment env) {
|
AutoPlaceEnvironment env) {
|
||||||
return PlaceResult.SKIP;
|
return PlaceResult.SKIP;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,40 +21,42 @@ public interface IStructureWalker<T> {
|
|||||||
* @param c The relative C position of the element in structure-local coordinates (pre transform)
|
* @param c The relative C position of the element in structure-local coordinates (pre transform)
|
||||||
* @return False to stop iterating, true to continue.
|
* @return False to stop iterating, true to continue.
|
||||||
*/
|
*/
|
||||||
boolean visit(IStructureElement<T> element, World world, int x, int y, int z, int a, int b, int c);
|
boolean visit(IStructureElement<? super T> element, World world, int x, int y, int z, int a, int b, int c);
|
||||||
|
|
||||||
default boolean blockNotLoaded(IStructureElement<T> element, World world, int x, int y, int z, int a, int b,
|
default boolean blockNotLoaded(IStructureElement<? super T> element, World world, int x, int y, int z, int a, int b,
|
||||||
int c) {
|
int c) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static <T> IStructureWalker<T> ignoreBlockUnloaded(IStructureWalker<T> walker) {
|
static <T> IStructureWalker<T> ignoreBlockUnloaded(IStructureWalker<T> walker) {
|
||||||
return new IStructureWalker<T>() {
|
return new IStructureWalker<>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean visit(IStructureElement<T> element, World world, int x, int y, int z, int a, int b, int c) {
|
public boolean visit(IStructureElement<? super T> element, World world, int x, int y, int z, int a, int b,
|
||||||
|
int c) {
|
||||||
return walker.visit(element, world, x, y, z, a, b, c);
|
return walker.visit(element, world, x, y, z, a, b, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean blockNotLoaded(IStructureElement<T> element, World world, int x, int y, int z, int a, int b,
|
public boolean blockNotLoaded(IStructureElement<? super T> element, World world, int x, int y, int z, int a,
|
||||||
int c) {
|
int b, int c) {
|
||||||
return walker.visit(element, world, x, y, z, a, b, c);
|
return walker.visit(element, world, x, y, z, a, b, c);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static <T> IStructureWalker<T> skipBlockUnloaded(IStructureWalker<T> walker) {
|
static <T> IStructureWalker<T> skipBlockUnloaded(IStructureWalker<T> walker) {
|
||||||
return new IStructureWalker<T>() {
|
return new IStructureWalker<>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean visit(IStructureElement<T> element, World world, int x, int y, int z, int a, int b, int c) {
|
public boolean visit(IStructureElement<? super T> element, World world, int x, int y, int z, int a, int b,
|
||||||
|
int c) {
|
||||||
return walker.visit(element, world, x, y, z, a, b, c);
|
return walker.visit(element, world, x, y, z, a, b, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean blockNotLoaded(IStructureElement<T> element, World world, int x, int y, int z, int a, int b,
|
public boolean blockNotLoaded(IStructureElement<? super T> element, World world, int x, int y, int z, int a,
|
||||||
int c) {
|
int b, int c) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -13,14 +13,14 @@ import net.minecraft.world.World;
|
|||||||
|
|
||||||
class LazyStructureElement<T> implements IStructureElementDeferred<T> {
|
class LazyStructureElement<T> implements IStructureElementDeferred<T> {
|
||||||
|
|
||||||
private Function<T, IStructureElement<T>> to;
|
private Function<? super T, ? extends IStructureElement<? super T>> to;
|
||||||
private IStructureElement<T> elem;
|
private IStructureElement<? super T> elem;
|
||||||
|
|
||||||
public LazyStructureElement(Function<T, IStructureElement<T>> to) {
|
public LazyStructureElement(Function<? super T, ? extends IStructureElement<? super T>> to) {
|
||||||
this.to = to;
|
this.to = to;
|
||||||
}
|
}
|
||||||
|
|
||||||
private IStructureElement<T> get(T t) {
|
private IStructureElement<? super T> get(T t) {
|
||||||
if (to != null) {
|
if (to != null) {
|
||||||
elem = to.apply(t);
|
elem = to.apply(t);
|
||||||
to = null;
|
to = null;
|
||||||
|
|||||||
@@ -16,17 +16,17 @@ import com.gtnewhorizon.structurelib.util.Vec3Impl;
|
|||||||
|
|
||||||
public class StructureDefinition<T> implements IStructureDefinition<T> {
|
public class StructureDefinition<T> implements IStructureDefinition<T> {
|
||||||
|
|
||||||
private final Map<Character, IStructureElement<T>> elements;
|
private final Map<Character, IStructureElement<? super T>> elements;
|
||||||
private final Map<String, String> shapes;
|
private final Map<String, String> shapes;
|
||||||
private final Map<String, IStructureElement<T>[]> structures;
|
private final Map<String, IStructureElement<? super T>[]> structures;
|
||||||
private final Map<String, Set<Vec3Impl>> occupiedSpaces;
|
private final Map<String, Set<Vec3Impl>> occupiedSpaces;
|
||||||
|
|
||||||
public static <B> Builder<B> builder() {
|
public static <B> Builder<B> builder() {
|
||||||
return new Builder<>();
|
return new Builder<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
private StructureDefinition(Map<Character, IStructureElement<T>> elements, Map<String, String> shapes,
|
private StructureDefinition(Map<Character, IStructureElement<? super T>> elements, Map<String, String> shapes,
|
||||||
Map<String, IStructureElement<T>[]> structures, Map<String, Set<Vec3Impl>> occupiedSpaces) {
|
Map<String, IStructureElement<? super T>[]> structures, Map<String, Set<Vec3Impl>> occupiedSpaces) {
|
||||||
this.elements = elements;
|
this.elements = elements;
|
||||||
this.shapes = shapes;
|
this.shapes = shapes;
|
||||||
this.structures = structures;
|
this.structures = structures;
|
||||||
@@ -40,7 +40,7 @@ public class StructureDefinition<T> implements IStructureDefinition<T> {
|
|||||||
private static final char C = '\uC000';
|
private static final char C = '\uC000';
|
||||||
private char d = '\uD000';
|
private char d = '\uD000';
|
||||||
private final Map<Vec3Impl, Character> navigates;
|
private final Map<Vec3Impl, Character> navigates;
|
||||||
private final Map<Character, IStructureElement<T>> elements;
|
private final Map<Character, IStructureElement<? super T>> elements;
|
||||||
private final Map<String, String> shapes;
|
private final Map<String, String> shapes;
|
||||||
private final Map<String, Set<Vec3Impl>> occupiedSpaces;
|
private final Map<String, Set<Vec3Impl>> occupiedSpaces;
|
||||||
|
|
||||||
@@ -51,7 +51,7 @@ public class StructureDefinition<T> implements IStructureDefinition<T> {
|
|||||||
occupiedSpaces = new HashMap<>();
|
occupiedSpaces = new HashMap<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<Character, IStructureElement<T>> getElements() {
|
public Map<Character, IStructureElement<? super T>> getElements() {
|
||||||
return elements;
|
return elements;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,18 +181,18 @@ public class StructureDefinition<T> implements IStructureDefinition<T> {
|
|||||||
* @deprecated use the unboxed version
|
* @deprecated use the unboxed version
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public Builder<T> addElement(Character name, IStructureElement<T> structurePiece) {
|
public Builder<T> addElement(Character name, IStructureElement<? super T> structurePiece) {
|
||||||
elements.putIfAbsent(name, structurePiece);
|
elements.putIfAbsent(name, structurePiece);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder<T> addElement(char name, IStructureElement<T> structurePiece) {
|
public Builder<T> addElement(char name, IStructureElement<? super T> structurePiece) {
|
||||||
elements.putIfAbsent(name, structurePiece);
|
elements.putIfAbsent(name, structurePiece);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IStructureDefinition<T> build() {
|
public IStructureDefinition<T> build() {
|
||||||
Map<String, IStructureElement<T>[]> structures = compileStructureMap();
|
Map<String, IStructureElement<? super T>[]> structures = compileStructureMap();
|
||||||
return new StructureDefinition<>(
|
return new StructureDefinition<>(
|
||||||
new HashMap<>(elements),
|
new HashMap<>(elements),
|
||||||
new HashMap<>(shapes),
|
new HashMap<>(shapes),
|
||||||
@@ -201,7 +201,7 @@ public class StructureDefinition<T> implements IStructureDefinition<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private Map<String, IStructureElement<T>[]> compileElementSetMap() {
|
private Map<String, IStructureElement<? super T>[]> compileElementSetMap() {
|
||||||
Set<Integer> missing = findMissing();
|
Set<Integer> missing = findMissing();
|
||||||
if (missing.isEmpty()) {
|
if (missing.isEmpty()) {
|
||||||
return shapes.entrySet().stream().collect(
|
return shapes.entrySet().stream().collect(
|
||||||
@@ -217,7 +217,7 @@ public class StructureDefinition<T> implements IStructureDefinition<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private Map<String, IStructureElement<T>[]> compileStructureMap() {
|
private Map<String, IStructureElement<? super T>[]> compileStructureMap() {
|
||||||
Set<Integer> missing = findMissing();
|
Set<Integer> missing = findMissing();
|
||||||
if (missing.isEmpty()) {
|
if (missing.isEmpty()) {
|
||||||
return shapes.entrySet().stream().collect(
|
return shapes.entrySet().stream().collect(
|
||||||
@@ -238,7 +238,7 @@ public class StructureDefinition<T> implements IStructureDefinition<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<Character, IStructureElement<T>> getElements() {
|
public Map<Character, IStructureElement<? super T>> getElements() {
|
||||||
return elements;
|
return elements;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -246,13 +246,13 @@ public class StructureDefinition<T> implements IStructureDefinition<T> {
|
|||||||
return shapes;
|
return shapes;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, IStructureElement<T>[]> getStructures() {
|
public Map<String, IStructureElement<? super T>[]> getStructures() {
|
||||||
return structures;
|
return structures;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IStructureElement<T>[] getStructureFor(String name) {
|
public IStructureElement<? super T>[] getStructureFor(String name) {
|
||||||
IStructureElement<T>[] elements = structures.get(name);
|
IStructureElement<? super T>[] elements = structures.get(name);
|
||||||
if (elements == null) throw new NoSuchElementException(name);
|
if (elements == null) throw new NoSuchElementException(name);
|
||||||
return elements;
|
return elements;
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
+1
-1
@@ -37,7 +37,7 @@ class SurvivalBuildStructureWalker<T> implements IStructureWalker<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean visit(IStructureElement<T> element, World world, int x, int y, int z, int a, int b, int c) {
|
public boolean visit(IStructureElement<? super T> element, World world, int x, int y, int z, int a, int b, int c) {
|
||||||
env.offsetABC[0] = a;
|
env.offsetABC[0] = a;
|
||||||
env.offsetABC[1] = b;
|
env.offsetABC[1] = b;
|
||||||
env.offsetABC[2] = c;
|
env.offsetABC[2] = c;
|
||||||
|
|||||||
@@ -1,64 +0,0 @@
|
|||||||
package com.gtnewhorizon.structurelib.util;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.NavigableMap;
|
|
||||||
import java.util.Spliterator;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
public class SortedRegistry<V> implements Iterable<V> {
|
|
||||||
|
|
||||||
private final NavigableMap<String, V> store = new TreeMap<>();
|
|
||||||
/**
|
|
||||||
* Store stuff in an array for faster iteration access than a red black tree
|
|
||||||
*/
|
|
||||||
private List<V> baked = Collections.emptyList();
|
|
||||||
|
|
||||||
public void register(String key, V val) {
|
|
||||||
if (key == null || val == null) throw new NullPointerException();
|
|
||||||
V old = store.putIfAbsent(key, val);
|
|
||||||
if (old != null) {
|
|
||||||
throw new IllegalArgumentException("Duplicate key: " + key);
|
|
||||||
}
|
|
||||||
// TODO allow a user to edit the order with a configuration file
|
|
||||||
baked = new ArrayList<>(store.values());
|
|
||||||
}
|
|
||||||
|
|
||||||
public int size() {
|
|
||||||
return store.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isEmpty() {
|
|
||||||
return store.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean containsKey(String key) {
|
|
||||||
return store.containsKey(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean containsValue(V value) {
|
|
||||||
return store.containsValue(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public V get(String key) {
|
|
||||||
return store.get(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterator<V> iterator() {
|
|
||||||
return baked.iterator();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void forEach(Consumer<? super V> action) {
|
|
||||||
baked.forEach(action);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Spliterator<V> spliterator() {
|
|
||||||
return baked.spliterator();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in new issue
Block a user