mirror of
https://github.com/GTNewHorizons/StructureLib.git
synced 2026-11-11 07:47:46 +00:00
ofChain survival placement had a bug where SKIP (returned when a block already exists) would not stop the chain, causing fallback alternatives to replace already valid blocks , for example: <img width="436" height="477" alt="image" src="https://github.com/user-attachments/assets/7ff3d6fa-de98-4716-823f-3ad2abab7394" /> SKIP now short-circuits the chain, remaining alternatives are skipped because the position is already valid. To keep correct behavior for elements without autobuild (which previously returned SKIP as a "no implementation" signal), a new REJECT_CONTINUE value is added, which: continues silently like SKIP (no error, not counted) in the walker and in the chain tries the next alternative like REJECT Default survivalPlaceBlock and IStructureElementCheckOnly now return REJECT_CONTINUE instead of SKIP for unhandled paths. Tested this with the example above, and fixed the issue: <img width="435" height="498" alt="image" src="https://github.com/user-attachments/assets/d92bce4d-b5ad-4051-af79-ffd8c819f9f7" /> survival placement also still works: <img width="1234" height="916" alt="image" src="https://github.com/user-attachments/assets/632d5556-524d-4dc5-a7f5-75c859cb6b70" /> this should ideally merged before https://github.com/GTNewHorizons/GT5-Unofficial/pull/6922 , to fix this underlying bug, but if possible not be tagged without the other PR, which would cause all NEI previews of multis with water to not show any water anymore --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
39 lines
1.2 KiB
Java
39 lines
1.2 KiB
Java
package com.gtnewhorizon.structurelib.structure;
|
|
|
|
import java.util.function.Consumer;
|
|
|
|
import net.minecraft.entity.player.EntityPlayerMP;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.util.IChatComponent;
|
|
import net.minecraft.world.World;
|
|
|
|
public interface IStructureElementCheckOnly<T> extends IStructureElement<T> {
|
|
|
|
@Override
|
|
default boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
default boolean couldBeValid(T t, World world, int x, int y, int z, ItemStack trigger) {
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
default boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
default PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, IItemSource s,
|
|
EntityPlayerMP actor, Consumer<IChatComponent> chatter) {
|
|
return PlaceResult.REJECT_CONTINUE;
|
|
}
|
|
|
|
@Override
|
|
default PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger,
|
|
AutoPlaceEnvironment env) {
|
|
return PlaceResult.REJECT_CONTINUE;
|
|
}
|
|
}
|