Minestom/src/main/java/net/minestom/server/entity/pathfinding/PFBlock.java

148 lines
5.4 KiB
Java
Raw Normal View History

2020-07-24 02:49:55 +02:00
package net.minestom.server.entity.pathfinding;
2020-07-24 01:03:24 +02:00
2021-06-23 22:24:40 +02:00
import com.extollit.gaming.ai.path.model.IBlockDescription;
2020-07-24 01:03:24 +02:00
import com.extollit.gaming.ai.path.model.IBlockObject;
import com.extollit.linalg.immutable.AxisAlignedBBox;
import net.minestom.server.instance.block.Block;
2021-12-24 09:48:02 +01:00
import org.jetbrains.annotations.ApiStatus;
2021-06-23 22:24:40 +02:00
import org.jetbrains.annotations.NotNull;
2021-12-24 09:48:02 +01:00
import space.vectrix.flare.fastutil.Short2ObjectSyncMap;
2020-07-24 01:03:24 +02:00
2021-12-24 09:48:02 +01:00
@ApiStatus.Internal
public final class PFBlock implements IBlockDescription, IBlockObject {
private static final Short2ObjectSyncMap<PFBlock> BLOCK_DESCRIPTION_MAP = Short2ObjectSyncMap.hashmap();
2020-08-17 21:07:37 +02:00
/**
2021-06-23 22:24:40 +02:00
* Gets the {@link PFBlock} linked to the block state id.
2020-08-17 21:07:37 +02:00
* <p>
2020-10-15 21:16:31 +02:00
* Cache the result if it is not already.
2020-08-17 21:07:37 +02:00
*
2021-05-23 00:28:31 +02:00
* @param block the block
2021-06-23 22:24:40 +02:00
* @return the {@link PFBlock} linked to {@code blockStateId}
2020-08-17 21:07:37 +02:00
*/
2021-06-23 22:24:40 +02:00
public static @NotNull PFBlock get(@NotNull Block block) {
2021-12-24 09:48:02 +01:00
return BLOCK_DESCRIPTION_MAP.computeIfAbsent(block.stateId(), state -> new PFBlock(block));
2020-08-17 21:07:37 +02:00
}
2020-08-19 01:24:51 +02:00
private final Block block;
2020-07-24 01:03:24 +02:00
2021-12-24 09:48:02 +01:00
PFBlock(Block block) {
2020-07-24 01:03:24 +02:00
this.block = block;
}
@Override
public AxisAlignedBBox bounds() {
return new AxisAlignedBBox(
0, 0, 0,
1, 1, 1
);
}
@Override
public boolean isFenceLike() {
2021-05-24 13:52:19 +02:00
// TODO: Use Hitbox
2020-08-04 17:37:28 +02:00
// Return fences, fencegates and walls.
2021-05-24 13:52:19 +02:00
// It just so happens that their namespace IDs contain "fence".
if (block.namespace().asString().contains("fence")) {
2021-05-24 13:52:19 +02:00
return true;
}
// Return all walls
// It just so happens that their namespace IDs all end with "door".
return block.namespace().asString().endsWith("wall");
2020-07-24 01:03:24 +02:00
}
@Override
public boolean isClimbable() {
2020-08-04 17:37:28 +02:00
// Return ladders and vines (including weeping and twisting vines)
2021-05-24 13:52:19 +02:00
// Note that no other Namespace IDs contain "vine" except vines.
return block.compare(Block.LADDER) || block.namespace().asString().contains("vine");
2020-07-24 01:03:24 +02:00
}
@Override
public boolean isDoor() {
2021-05-24 13:52:19 +02:00
// Return all normal doors and trap doors.
// It just so happens that their namespace IDs all end with "door".
return block.namespace().asString().endsWith("door");
2020-07-24 01:03:24 +02:00
}
2022-01-01 18:27:52 +01:00
@Override
public boolean isIntractable() {
// TODO: Interactability of blocks.
return false;
}
2020-07-24 01:03:24 +02:00
@Override
public boolean isImpeding() {
2020-07-24 02:31:10 +02:00
return block.isSolid();
2020-07-24 01:03:24 +02:00
}
@Override
public boolean isFullyBounded() {
2021-05-24 13:52:19 +02:00
// TODO: Use Hitbox (would probably be faster as well)
2020-08-04 17:37:28 +02:00
// Return false for anything that does not have a full hitbox but impedes
// e.g. Anvils, Lilypads, Ladders, Walls, Fences, EnchantmentTables
// Fences & Walls
if (isFenceLike()) {
return false;
}
// Ladders and Vines
if (isClimbable()) {
return false;
}
// All doors/trapdoors.
2021-05-24 13:52:19 +02:00
if (isDoor()) {
2020-08-04 17:37:28 +02:00
return false;
}
if (block.name().startsWith("potted")) {
2020-08-04 17:37:28 +02:00
return false;
}
// Skulls & Heads
if (block.name().contains("skull") || block.name().contains("head")) {
2021-05-24 13:52:19 +02:00
// NOTE: blocks.getName().contains("head") also matches Piston_Head
// I could not find out by documentation if piston_head is fully bounded, I would presume it is NOT.
2020-08-04 17:37:28 +02:00
return false;
}
// Carpets
if (block.name().endsWith("carpet")) {
2020-08-04 17:37:28 +02:00
return false;
}
// Slabs
if (block.name().contains("slab")) {
2020-08-04 17:37:28 +02:00
return false;
}
// Beds
if (block.name().endsWith("bed")) {
2020-08-04 17:37:28 +02:00
return false;
}
// Glass Panes
if (block.name().endsWith("pane")) {
2020-08-04 17:37:28 +02:00
return false;
}
2021-05-24 13:52:19 +02:00
return !Block.CHORUS_FLOWER.compare(block) && !Block.CHORUS_PLANT.compare(block) && !Block.BAMBOO.compare(block)
&& !Block.BAMBOO_SAPLING.compare(block) && !Block.SEA_PICKLE.compare(block)
&& !Block.TURTLE_EGG.compare(block) && !Block.SNOW.compare(block) && !Block.FLOWER_POT.compare(block)
&& !Block.LILY_PAD.compare(block) && !Block.ANVIL.compare(block) && !Block.CHIPPED_ANVIL.compare(block)
&& !Block.DAMAGED_ANVIL.compare(block) && !Block.CAKE.compare(block) && !Block.CACTUS.compare(block)
&& !Block.BREWING_STAND.compare(block) && !Block.LECTERN.compare(block)
&& !Block.DAYLIGHT_DETECTOR.compare(block) && !Block.CAMPFIRE.compare(block)
&& !Block.SOUL_CAMPFIRE.compare(block) && !Block.ENCHANTING_TABLE.compare(block)
&& !Block.CHEST.compare(block) && !Block.ENDER_CHEST.compare(block) && !Block.GRINDSTONE.compare(block)
&& !Block.TRAPPED_CHEST.compare(block) && !Block.SOUL_SAND.compare(block)
&& !Block.SOUL_SOIL.compare(block) && !Block.LANTERN.compare(block) && !Block.COCOA.compare(block)
&& !Block.CONDUIT.compare(block) && !Block.DIRT_PATH.compare(block) && !Block.FARMLAND.compare(block)
2021-05-24 13:52:19 +02:00
&& !Block.END_ROD.compare(block) && !Block.STONECUTTER.compare(block) && !Block.BELL.compare(block);
2020-07-24 01:03:24 +02:00
}
@Override
public boolean isLiquid() {
return block.isLiquid();
}
@Override
public boolean isIncinerating() {
2020-08-04 17:37:28 +02:00
return block == Block.LAVA || block == Block.FIRE || block == Block.SOUL_FIRE;
2020-07-24 01:03:24 +02:00
}
2021-06-23 22:24:40 +02:00
2020-07-24 01:03:24 +02:00
}