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

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

71 lines
2.5 KiB
Java
Raw Normal View History

2022-08-08 17:40:12 +08:00
package com.gtnewhorizon.structurelib.structure;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
2022-08-08 17:40:12 +08:00
import com.gtnewhorizon.structurelib.StructureLibAPI;
2022-09-11 02:54:11 +08:00
import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
2022-08-08 17:40:12 +08:00
import com.gtnewhorizon.structurelib.structure.IStructureElement.PlaceResult;
class SurvivalBuildStructureWalker<T> implements IStructureWalker<T> {
2022-09-11 02:54:11 +08:00
final T object;
final ItemStack trigger;
2022-08-08 17:40:12 +08:00
private final int elementBudget;
2022-09-11 02:54:11 +08:00
private final ISurvivalBuildEnvironment params;
2022-08-08 17:40:12 +08:00
private final boolean check;
private int built = -1;
2022-09-11 02:54:11 +08:00
private final AutoPlaceEnvironment env;
2022-08-08 17:40:12 +08:00
public SurvivalBuildStructureWalker(T object, ItemStack trigger, int elementBudget,
2022-09-11 02:54:11 +08:00
ISurvivalBuildEnvironment params, IStructureDefinition<?> definition, String piece, ExtendedFacing facing,
int[] baseOffsetABC, boolean check) {
2022-08-08 17:40:12 +08:00
this.object = object;
this.trigger = trigger;
this.elementBudget = elementBudget;
2022-09-11 02:54:11 +08:00
this.params = params;
2022-08-08 17:40:12 +08:00
this.check = check;
2022-09-11 02:54:11 +08:00
env = new AutoPlaceEnvironment(
params.getActor(),
params.getActor()::addChatComponentMessage,
definition,
piece,
facing,
baseOffsetABC);
2022-08-08 17:40:12 +08:00
}
@Override
2022-09-11 02:54:11 +08:00
public boolean visit(IStructureElement<T> element, World world, int x, int y, int z, int a, int b, int c) {
env.offsetABC[0] = a;
env.offsetABC[1] = b;
env.offsetABC[2] = c;
env.setSource(params.getSource());
PlaceResult placeResult = element.survivalPlaceBlock(object, world, x, y, z, trigger, env);
if (placeResult != PlaceResult.SKIP && placeResult != PlaceResult.REJECT_CONTINUE && built == -1) built = 0;
2022-08-08 17:40:12 +08:00
switch (placeResult) {
case SKIP:
case REJECT_CONTINUE:
2022-08-08 17:40:12 +08:00
return true;
case ACCEPT:
if (check) element.check(object, world, x, y, z);
return ++built < elementBudget;
case REJECT:
2022-09-11 02:54:11 +08:00
StructureLibAPI.markHintParticleError(params.getActor(), world, x, y, z);
2022-08-08 17:40:12 +08:00
return false;
case ACCEPT_STOP:
if (check) element.check(object, world, x, y, z);
built += 1;
// intentional fallthrough
case STOP:
return false;
default:
throw new NullPointerException();
}
}
public int getBuilt() {
return built;
}
}