Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pathfinding #1990

Closed
wants to merge 219 commits into from
Closed

Pathfinding #1990

wants to merge 219 commits into from

Conversation

iam4722202468
Copy link
Member

No description provided.

@MelonHell
Copy link
Contributor

Resolves #1987

@KrystilizeNevaDies
Copy link
Contributor

I'm still not a big fan of having specific handling for certain types of pathfinding abilities.
e.g. LAND, AQUATIC, FLYING, AMPHIBIOUS

I'd rather be supporting a generic api that could support any of these configurations.
e.g.

interface PathfinderEntity {
  /**
   * Returns a set of next positions this entity can travel to from the given position.
   */
  Set<Pos> nextStep(Pos pos);
}

or

interface PathfinderEntity {
  /**
   * Returns a range of next positions this entity can travel to from the given position.
   */
  PosRange nextStep(Pos pos);
}

or

interface PathfinderEntity {
  /**
   * Returns a range of next velocities this entity can be applied from this given position.
   */
  VelRange nextStep(Pos pos);
}

e.t.c

There are many api ideas that could support this without need to hardcode specific arbitrary pathfinding types.

@DasBabyPixel
Copy link

Any updates here?

@iam4722202468
Copy link
Member Author

iam4722202468 commented Feb 23, 2024 via email

iam4722202468 and others added 7 commits February 23, 2024 18:46
# Conflicts:
#	demo/src/main/java/net/minestom/demo/PlayerInit.java
#	src/main/java/net/minestom/server/entity/fakeplayer/FakePlayer.java
@RandomModderJDK
Copy link

I did some very limited testing, and found that this pathfinding is way better than the one from main.

I made a Zombie with me as a target and a follow-goal.

  1. Testcase, let him try some parcour with blocks placed randomly by me:
  • could walk diagonally, with just 2 blocks in a 2x2 square, which main algo failed at
  • does not escalate completely (like turning his body rapidly), when he can not reach his target
  1. just plain terrain, with running target:
  • main branch algorithm leads to the zombie looking in a completely other direction, when changing targets position - this algorithm not so much
  • more natural, doesnt walk "block for block", e.g. first ahead, then to the right, on a diagonal path. But I'm not quite sure about this - needs more testing
  1. follow target on terrain generated by jnoise
  • main branch algo wouldn't even work - they are freezed. Don't know why it shouldn't work
  • just jumps and walks pretty-flawlessly to me

What I would consider to do test with:

  • what if entities are in the way
  • what about trapdoors and doors
  • can a really distant target be reached( whats the maximum viable distance)

Performance comparison would be really nice too. I did not monitor it

@iam4722202468
Copy link
Member Author

Thanks for taking a look. Currently doors, trapdoors, etc. are not handle, and are treated as full blocks. This algorithm allows for extending which blocks are walkable and how path are followed, so in the future there could be a node generator which implements features like climbing, doors, multi-block jumps, blocking entities, etc. The idea is this is the base which future pathfinding rules will be built on.

Performance has been worked on a decent amount and while the current pathfinder probably performs better this one will work properly and is multithreaded, meaning that even slow path generation wouldn't block the main thread. From testing i've seen most people can get 10k+ pathfinding entities without much lag.

if you're in the minestom discord this person tested it and found it performed well https://discord.com/channels/706185253441634317/706186227493109860/1214046960189837383

@RandomModderJDK
Copy link

What is needed to complete this pr then? My guess would be that we need to pass all tests, right?. (Or removing ones that became invalid now, if any)

@iam4722202468
Copy link
Member Author

After a code review this will be merged with other large 1.20.5

# Conflicts:
#	build.gradle.kts
#	demo/src/main/java/net/minestom/demo/Main.java
#	demo/src/main/java/net/minestom/demo/PlayerInit.java
#	src/main/java/net/minestom/server/MinecraftServer.java
#	src/main/java/net/minestom/server/component/DataComponent.java
#	src/main/java/net/minestom/server/component/DataComponentImpl.java
#	src/main/java/net/minestom/server/entity/Metadata.java
#	src/main/java/net/minestom/server/entity/pathfinding/PFPathingEntity.java
#	src/main/java/net/minestom/server/instance/DynamicChunk.java
#	src/main/java/net/minestom/server/instance/block/predicate/BlockPredicate.java
#	src/main/java/net/minestom/server/inventory/ContainerInventory.java
#	src/main/java/net/minestom/server/inventory/Inventory.java
#	src/main/java/net/minestom/server/inventory/PlayerInventory.java
#	src/main/java/net/minestom/server/item/ItemComponent.java
#	src/main/java/net/minestom/server/item/attribute/AttributeSlot.java
#	src/main/java/net/minestom/server/item/component/Bee.java
#	src/main/java/net/minestom/server/item/component/BlockPredicates.java
#	src/main/java/net/minestom/server/item/component/DebugStickState.java
#	src/main/java/net/minestom/server/item/component/DyedItemColor.java
#	src/main/java/net/minestom/server/item/component/EnchantmentList.java
#	src/main/java/net/minestom/server/item/component/FireworkExplosion.java
#	src/main/java/net/minestom/server/item/component/PotionContents.java
#	src/main/java/net/minestom/server/listener/CreativeInventoryActionListener.java
#	src/main/java/net/minestom/server/listener/PlayerDiggingListener.java
#	src/main/java/net/minestom/server/listener/WindowListener.java
#	src/main/java/net/minestom/server/listener/manager/PacketListenerManager.java
#	src/main/java/net/minestom/server/network/ConnectionManager.java
#	src/main/java/net/minestom/server/network/NetworkBuffer.java
#	src/main/java/net/minestom/server/network/NetworkBufferTypeImpl.java
#	src/main/java/net/minestom/server/network/packet/client/handshake/ClientHandshakePacket.java
#	src/main/java/net/minestom/server/utils/nbt/BinaryTagSerializer.java
#	src/test/java/net/minestom/server/inventory/click/ClickUtils.java
@mworzala mworzala force-pushed the 1_20_5 branch 2 times, most recently from 95f7327 to 05a4bb7 Compare May 27, 2024 19:06
# Conflicts:
#	build.gradle.kts
#	code-generators/src/main/java/net/minestom/codegen/Generators.java
#	demo/src/main/java/net/minestom/demo/PlayerInit.java
#	gradle/libs.versions.toml
#	src/autogenerated/java/net/minestom/server/color/DyeColor.java
#	src/autogenerated/java/net/minestom/server/entity/damage/DamageTypes.java
#	src/autogenerated/java/net/minestom/server/recipe/RecipeType.java
#	src/main/java/net/minestom/server/adventure/serializer/nbt/NbtComponentSerializer.java
#	src/main/java/net/minestom/server/adventure/serializer/nbt/NbtComponentSerializerImpl.java
#	src/main/java/net/minestom/server/color/Color.java
#	src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentItemStack.java
#	src/main/java/net/minestom/server/component/DataComponent.java
#	src/main/java/net/minestom/server/component/DataComponentImpl.java
#	src/main/java/net/minestom/server/component/DataComponentMap.java
#	src/main/java/net/minestom/server/component/DataComponentMapImpl.java
#	src/main/java/net/minestom/server/entity/LivingEntity.java
#	src/main/java/net/minestom/server/entity/Metadata.java
#	src/main/java/net/minestom/server/entity/MetadataImpl.java
#	src/main/java/net/minestom/server/entity/Player.java
#	src/main/java/net/minestom/server/entity/attribute/Attribute.java
#	src/main/java/net/minestom/server/entity/attribute/AttributeImpl.java
#	src/main/java/net/minestom/server/entity/damage/DamageType.java
#	src/main/java/net/minestom/server/entity/damage/DamageTypeImpl.java
#	src/main/java/net/minestom/server/entity/metadata/animal/ArmadilloMeta.java
#	src/main/java/net/minestom/server/entity/metadata/monster/skeleton/BoggedMeta.java
#	src/main/java/net/minestom/server/entity/metadata/projectile/BreezeWindChargeMeta.java
#	src/main/java/net/minestom/server/entity/pathfinding/PFPathingEntity.java
#	src/main/java/net/minestom/server/event/inventory/InventoryPostClickEvent.java
#	src/main/java/net/minestom/server/gamedata/tags/Tag.java
#	src/main/java/net/minestom/server/instance/anvil/AnvilLoader.java
#	src/main/java/net/minestom/server/instance/heightmap/Heightmap.java
#	src/main/java/net/minestom/server/inventory/ContainerInventory.java
#	src/main/java/net/minestom/server/inventory/PlayerInventory.java
#	src/main/java/net/minestom/server/item/ItemComponent.java
#	src/main/java/net/minestom/server/item/ItemStack.java
#	src/main/java/net/minestom/server/item/ItemStackImpl.java
#	src/main/java/net/minestom/server/item/Material.java
#	src/main/java/net/minestom/server/item/armor/TrimManager.java
#	src/main/java/net/minestom/server/item/armor/TrimMaterial.java
#	src/main/java/net/minestom/server/item/armor/TrimMaterialImpl.java
#	src/main/java/net/minestom/server/item/armor/TrimPattern.java
#	src/main/java/net/minestom/server/item/armor/TrimPatternImpl.java
#	src/main/java/net/minestom/server/item/attribute/AttributeSlot.java
#	src/main/java/net/minestom/server/item/component/ArmorTrim.java
#	src/main/java/net/minestom/server/item/component/AttributeList.java
#	src/main/java/net/minestom/server/item/component/BannerPatterns.java
#	src/main/java/net/minestom/server/item/component/BlockPredicates.java
#	src/main/java/net/minestom/server/item/component/DyedItemColor.java
#	src/main/java/net/minestom/server/item/component/EnchantmentList.java
#	src/main/java/net/minestom/server/item/component/ItemRarity.java
#	src/main/java/net/minestom/server/item/component/LodestoneTracker.java
#	src/main/java/net/minestom/server/item/component/MapDecorations.java
#	src/main/java/net/minestom/server/item/component/MapPostProcessing.java
#	src/main/java/net/minestom/server/item/component/PotDecorations.java
#	src/main/java/net/minestom/server/item/component/PotionContents.java
#	src/main/java/net/minestom/server/item/component/SuspiciousStewEffects.java
#	src/main/java/net/minestom/server/item/component/Unbreakable.java
#	src/main/java/net/minestom/server/listener/BlockPlacementListener.java
#	src/main/java/net/minestom/server/listener/CreativeInventoryActionListener.java
#	src/main/java/net/minestom/server/listener/PlayerDiggingListener.java
#	src/main/java/net/minestom/server/listener/WindowListener.java
#	src/main/java/net/minestom/server/message/Messenger.java
#	src/main/java/net/minestom/server/network/ConnectionManager.java
#	src/main/java/net/minestom/server/network/NetworkBuffer.java
#	src/main/java/net/minestom/server/network/NetworkBufferTypeImpl.java
#	src/main/java/net/minestom/server/network/packet/client/configuration/ClientSelectKnownPacksPacket.java
#	src/main/java/net/minestom/server/network/packet/server/configuration/SelectKnownPacksPacket.java
#	src/main/java/net/minestom/server/network/player/PlayerConnection.java
#	src/main/java/net/minestom/server/potion/PotionEffect.java
#	src/main/java/net/minestom/server/registry/Registry.java
#	src/main/java/net/minestom/server/sound/BuiltinSoundEvent.java
#	src/main/java/net/minestom/server/sound/SoundEvent.java
#	src/main/java/net/minestom/server/utils/nbt/BinaryTagSerializer.java
#	src/main/java/net/minestom/server/world/DimensionType.java
#	src/main/java/net/minestom/server/world/DimensionTypeManager.java
#	src/main/java/net/minestom/server/world/biome/Biome.java
#	src/main/java/net/minestom/server/world/biomes/BiomeManager.java
#	src/main/java/net/minestom/server/world/biomes/BiomeParticle.java
#	src/test/java/net/minestom/server/inventory/click/ClickUtils.java
#	src/test/java/net/minestom/server/item/component/AbstractItemComponentTest.java
#	src/test/java/net/minestom/server/item/component/CustomDataTest.java
#	src/test/java/net/minestom/server/item/component/DyedItemColorTest.java
#	src/test/java/net/minestom/server/item/component/UnitTest.java
@iam4722202468
Copy link
Member Author

This will be merged in to 1_20_5 here #2153

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

9 participants