Files
StructureLib/src/main/java/com/gtnewhorizon/structurelib/structure/IStructureElementChain.java
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

147 lines
5.2 KiB
Java
Raw Normal View History

package com.gtnewhorizon.structurelib.structure;
2022-08-08 17:40:12 +08:00
import java.util.ArrayList;
import java.util.LinkedHashSet;
2022-08-08 17:40:12 +08:00
import java.util.List;
import java.util.Set;
2022-08-08 17:40:12 +08:00
import java.util.function.Consumer;
2022-09-13 21:22:34 +08:00
import java.util.function.Predicate;
2022-09-13 21:22:34 +08:00
import javax.annotation.Nullable;
2022-08-08 17:40:12 +08:00
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
2022-08-08 17:40:12 +08:00
import net.minecraft.util.IChatComponent;
import net.minecraft.world.World;
2022-09-13 21:22:34 +08:00
import com.google.common.collect.Iterables;
/**
* Use StructureUtility to instantiate
*/
public interface IStructureElementChain<T> extends IStructureElement<T> {
IStructureElement<? super T>[] fallbacks();
2022-07-08 17:14:18 +08:00
@Override
default boolean check(T t, World world, int x, int y, int z) {
for (IStructureElement<? super T> fallback : fallbacks()) {
2022-07-08 17:14:18 +08:00
if (fallback.check(t, world, x, y, z)) {
return true;
}
}
return false;
}
2024-12-14 13:13:34 -05:00
@Override
default boolean couldBeValid(T t, World world, int x, int y, int z, ItemStack trigger) {
for (IStructureElement<? super T> fallback : fallbacks()) {
2024-12-14 13:13:34 -05:00
if (fallback.couldBeValid(t, world, x, y, z, trigger)) {
return true;
}
}
return false;
}
2022-07-08 17:14:18 +08:00
@Override
default boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
for (IStructureElement<? super T> fallback : fallbacks()) {
2022-07-08 17:14:18 +08:00
if (fallback.spawnHint(t, world, x, y, z, trigger)) {
return true;
}
}
return false;
}
2022-07-08 17:14:18 +08:00
@Override
default boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) {
for (IStructureElement<? super T> fallback : fallbacks()) {
2022-07-08 17:14:18 +08:00
if (fallback.placeBlock(t, world, x, y, z, trigger)) {
return true;
}
}
return false;
}
2022-09-13 21:22:34 +08:00
@Nullable
@Override
default List<String> getDescription(T context) {
Set<String> descriptions = new LinkedHashSet<>();
for (IStructureElement<? super T> fallback : fallbacks()) {
List<String> desc = fallback.getDescription(context);
if (desc != null) {
descriptions.addAll(desc);
}
}
return descriptions.isEmpty() ? null : new ArrayList<>(descriptions);
}
2022-09-13 21:22:34 +08:00
@Nullable
@Override
default BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger,
AutoPlaceEnvironment env) {
Predicate<ItemStack> predicate = null;
List<Iterable<ItemStack>> is = new ArrayList<>();
for (IStructureElement<? super T> fallback : fallbacks()) {
2022-09-13 21:22:34 +08:00
BlocksToPlace e = fallback.getBlocksToPlace(t, world, x, y, z, trigger, env);
if (e == null) continue;
if (predicate == null) predicate = e.getPredicate();
else predicate = predicate.or(e.getPredicate());
Iterable<ItemStack> stacks = e.getStacks();
if (stacks != null) is.add(stacks);
2022-09-13 21:22:34 +08:00
}
if (predicate == null) return null;
return new BlocksToPlace(predicate, Iterables.concat(is));
}
2022-08-08 17:40:12 +08:00
@Override
default PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, IItemSource s,
EntityPlayerMP actor, Consumer<IChatComponent> chatter) {
boolean allContinue = true;
2022-08-08 17:40:12 +08:00
List<IChatComponent> bufferedNoise = new ArrayList<>();
for (IStructureElement<? super T> fallback : fallbacks()) {
2022-08-08 17:40:12 +08:00
PlaceResult result = fallback.survivalPlaceBlock(t, world, x, y, z, trigger, s, actor, bufferedNoise::add);
switch (result) {
case REJECT_CONTINUE:
break;
2022-08-08 17:40:12 +08:00
case REJECT:
allContinue = false;
2022-08-08 17:40:12 +08:00
break;
case SKIP:
bufferedNoise.forEach(chatter);
return PlaceResult.SKIP;
2022-08-08 17:40:12 +08:00
default:
return result;
}
}
// dump all that noise back into upstream
bufferedNoise.forEach(chatter);
return allContinue ? PlaceResult.REJECT_CONTINUE : PlaceResult.REJECT;
2022-08-08 17:40:12 +08:00
}
2022-09-11 02:54:11 +08:00
@Override
default PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
AutoPlaceEnvironment env) {
boolean allContinue = true;
2022-09-11 02:54:11 +08:00
List<IChatComponent> bufferedNoise = new ArrayList<>();
for (IStructureElement<? super T> fallback : fallbacks()) {
2022-09-11 02:54:11 +08:00
PlaceResult result = fallback
.survivalPlaceBlock(t, world, x, y, z, trigger, env.withChatter(bufferedNoise::add));
switch (result) {
case REJECT_CONTINUE:
break;
2022-09-11 02:54:11 +08:00
case REJECT:
allContinue = false;
2022-09-11 02:54:11 +08:00
break;
case SKIP:
bufferedNoise.forEach(env.getChatter());
return PlaceResult.SKIP;
2022-09-11 02:54:11 +08:00
default:
return result;
}
}
// dump all that noise back into upstream
bufferedNoise.forEach(env.getChatter());
return allContinue ? PlaceResult.REJECT_CONTINUE : PlaceResult.REJECT;
2022-09-11 02:54:11 +08:00
}
}