package net.minecraft.world.entity.animal.camel; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.mojang.datafixers.util.Pair; import java.util.function.Predicate; import net.minecraft.server.level.ServerLevel; import net.minecraft.tags.ItemTags; import net.minecraft.util.RandomSource; import net.minecraft.util.valueproviders.UniformInt; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.Brain; import net.minecraft.world.entity.ai.behavior.AnimalMakeLove; import net.minecraft.world.entity.ai.behavior.AnimalPanic; import net.minecraft.world.entity.ai.behavior.BabyFollowAdult; import net.minecraft.world.entity.ai.behavior.Behavior; import net.minecraft.world.entity.ai.behavior.CountDownCooldownTicks; import net.minecraft.world.entity.ai.behavior.DoNothing; import net.minecraft.world.entity.ai.behavior.FollowTemptation; import net.minecraft.world.entity.ai.behavior.LookAtTargetSink; import net.minecraft.world.entity.ai.behavior.MoveToTargetSink; import net.minecraft.world.entity.ai.behavior.RandomLookAround; import net.minecraft.world.entity.ai.behavior.RandomStroll; import net.minecraft.world.entity.ai.behavior.RunOne; import net.minecraft.world.entity.ai.behavior.SetEntityLookTargetSometimes; import net.minecraft.world.entity.ai.behavior.SetWalkTargetFromLookTarget; import net.minecraft.world.entity.ai.behavior.Swim; import net.minecraft.world.entity.ai.behavior.declarative.BehaviorBuilder; import net.minecraft.world.entity.ai.memory.MemoryModuleType; import net.minecraft.world.entity.ai.memory.MemoryStatus; import net.minecraft.world.entity.ai.sensing.Sensor; import net.minecraft.world.entity.ai.sensing.SensorType; import net.minecraft.world.entity.schedule.Activity; import net.minecraft.world.item.ItemStack; public class CamelAi { private static final float SPEED_MULTIPLIER_WHEN_PANICKING = 4.0F; private static final float SPEED_MULTIPLIER_WHEN_IDLING = 2.0F; private static final float SPEED_MULTIPLIER_WHEN_TEMPTED = 2.5F; private static final float SPEED_MULTIPLIER_WHEN_FOLLOWING_ADULT = 2.5F; private static final float SPEED_MULTIPLIER_WHEN_MAKING_LOVE = 1.0F; private static final UniformInt ADULT_FOLLOW_RANGE = UniformInt.of(5, 16); private static final ImmutableList>> SENSOR_TYPES = ImmutableList.of( SensorType.NEAREST_LIVING_ENTITIES, SensorType.HURT_BY, SensorType.CAMEL_TEMPTATIONS, SensorType.NEAREST_ADULT ); private static final ImmutableList> MEMORY_TYPES = ImmutableList.of( MemoryModuleType.IS_PANICKING, MemoryModuleType.HURT_BY, MemoryModuleType.HURT_BY_ENTITY, MemoryModuleType.WALK_TARGET, MemoryModuleType.LOOK_TARGET, MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE, MemoryModuleType.PATH, MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES, MemoryModuleType.TEMPTING_PLAYER, MemoryModuleType.TEMPTATION_COOLDOWN_TICKS, MemoryModuleType.GAZE_COOLDOWN_TICKS, MemoryModuleType.IS_TEMPTED, MemoryModuleType.BREED_TARGET, MemoryModuleType.NEAREST_VISIBLE_ADULT ); protected static void initMemories(Camel p_249638_, RandomSource p_250704_) { } public static Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); } protected static Brain makeBrain(Brain p_249515_) { initCoreActivity(p_249515_); initIdleActivity(p_249515_); p_249515_.setCoreActivities(ImmutableSet.of(Activity.CORE)); p_249515_.setDefaultActivity(Activity.IDLE); p_249515_.useDefaultActivity(); return p_249515_; } private static void initCoreActivity(Brain p_249998_) { p_249998_.addActivity( Activity.CORE, 0, ImmutableList.of( new Swim<>(0.8F), new CamelAi.CamelPanic(4.0F), new LookAtTargetSink(45, 90), new MoveToTargetSink(), new CountDownCooldownTicks(MemoryModuleType.TEMPTATION_COOLDOWN_TICKS), new CountDownCooldownTicks(MemoryModuleType.GAZE_COOLDOWN_TICKS) ) ); } private static void initIdleActivity(Brain p_252342_) { p_252342_.addActivity( Activity.IDLE, ImmutableList.of( Pair.of(0, SetEntityLookTargetSometimes.create(EntityType.PLAYER, 6.0F, UniformInt.of(30, 60))), Pair.of(1, new AnimalMakeLove(EntityType.CAMEL)), Pair.of( 2, new RunOne<>( ImmutableList.of( Pair.of(new FollowTemptation(p_250812_ -> 2.5F, p_296810_ -> p_296810_.isBaby() ? 2.5 : 3.5), 1), Pair.of(BehaviorBuilder.triggerIf(Predicate.not(Camel::refuseToMove), BabyFollowAdult.create(ADULT_FOLLOW_RANGE, 2.5F)), 1) ) ) ), Pair.of(3, new RandomLookAround(UniformInt.of(150, 250), 30.0F, 0.0F, 0.0F)), Pair.of( 4, new RunOne<>( ImmutableMap.of(MemoryModuleType.WALK_TARGET, MemoryStatus.VALUE_ABSENT), ImmutableList.of( Pair.of(BehaviorBuilder.triggerIf(Predicate.not(Camel::refuseToMove), RandomStroll.stroll(2.0F)), 1), Pair.of(BehaviorBuilder.triggerIf(Predicate.not(Camel::refuseToMove), SetWalkTargetFromLookTarget.create(2.0F, 3)), 1), Pair.of(new CamelAi.RandomSitting(20), 1), Pair.of(new DoNothing(30, 60), 1) ) ) ) ) ); } public static void updateActivity(Camel p_250703_) { p_250703_.getBrain().setActiveActivityToFirstValid(ImmutableList.of(Activity.IDLE)); } public static Predicate getTemptations() { return p_326991_ -> p_326991_.is(ItemTags.CAMEL_FOOD); } public static class CamelPanic extends AnimalPanic { public CamelPanic(float p_249921_) { super(p_249921_); } protected void start(ServerLevel p_329269_, Camel p_335851_, long p_328453_) { p_335851_.standUpInstantly(); super.start(p_329269_, p_335851_, p_328453_); } } public static class RandomSitting extends Behavior { private final int minimalPoseTicks; public RandomSitting(int p_251207_) { super(ImmutableMap.of()); this.minimalPoseTicks = p_251207_ * 20; } protected boolean checkExtraStartConditions(ServerLevel p_249520_, Camel p_250322_) { return !p_250322_.isInWater() && p_250322_.getPoseTime() >= this.minimalPoseTicks && !p_250322_.isLeashed() && p_250322_.onGround() && !p_250322_.hasControllingPassenger() && p_250322_.canCamelChangePose(); } protected void start(ServerLevel p_250901_, Camel p_250345_, long p_248515_) { if (p_250345_.isCamelSitting()) { p_250345_.standUp(); } else if (!p_250345_.isPanicking()) { p_250345_.sitDown(); } } } }