package net.minecraft.server; import com.google.common.collect.ImmutableMap; import it.unimi.dsi.fastutil.longs.Long2LongMap; import it.unimi.dsi.fastutil.longs.Long2LongOpenHashMap; import it.unimi.dsi.fastutil.longs.Long2LongMap.Entry; import java.util.Optional; import java.util.function.Predicate; import java.util.stream.Stream; public class BehaviorWalkHome extends Behavior<EntityLiving> { private final float a; private final Long2LongMap b = new Long2LongOpenHashMap(); private int c; private long d; public BehaviorWalkHome(float f) { super(ImmutableMap.of(MemoryModuleType.WALK_TARGET, MemoryStatus.VALUE_ABSENT, MemoryModuleType.HOME, MemoryStatus.VALUE_ABSENT)); this.a = f; } @Override protected boolean a(WorldServer worldserver, EntityLiving entityliving) { if (worldserver.getTime() - this.d < 20L) { return false; } else { EntityCreature entitycreature = (EntityCreature) entityliving; VillagePlace villageplace = worldserver.B(); Optional<BlockPosition> optional = villageplace.c(VillagePlaceType.q.c(), (blockposition) -> { return true; }, new BlockPosition(entityliving), 48, VillagePlace.Occupancy.ANY); return optional.isPresent() && ((BlockPosition) optional.get()).m(new BlockPosition(entitycreature)) > 4.0D; } } @Override protected void a(WorldServer worldserver, EntityLiving entityliving, long i) { this.c = 0; this.d = worldserver.getTime() + (long) worldserver.getRandom().nextInt(20); EntityCreature entitycreature = (EntityCreature) entityliving; VillagePlace villageplace = worldserver.B(); Predicate<BlockPosition> predicate = (blockposition) -> { long j = blockposition.asLong(); if (this.b.containsKey(j)) { return false; } else if (++this.c >= 5) { return false; } else { this.b.put(j, this.d + 40L); return true; } }; Stream<BlockPosition> stream = villageplace.a(VillagePlaceType.q.c(), predicate, new BlockPosition(entityliving), 48, VillagePlace.Occupancy.ANY); PathEntity pathentity = entitycreature.getNavigation().a(stream, VillagePlaceType.q.d()); if (pathentity != null && pathentity.h()) { BlockPosition blockposition = pathentity.k(); Optional<VillagePlaceType> optional = villageplace.c(blockposition); if (optional.isPresent()) { entityliving.getBehaviorController().setMemory(MemoryModuleType.WALK_TARGET, (Object) (new MemoryTarget(blockposition, this.a, 1))); PacketDebug.c(worldserver, blockposition); } } else if (this.c < 5) { this.b.long2LongEntrySet().removeIf((entry) -> { return entry.getLongValue() < this.d; }); } } }