From e2862f768acf8d66aa9f007f160a4792296a0c5f Mon Sep 17 00:00:00 2001 From: 2No2Name <2no2name@web.de> Date: Thu, 3 Oct 2024 00:08:12 +0200 Subject: [PATCH] Fix .gitignore and add mixin.ai.task.run to repository --- .gitignore | 6 +- .../LongJumpTaskMixin.java | 74 +++++++++++++++++++ .../package-info.java | 4 + .../mixin/ai/task/run/package-info.java | 4 + 4 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/task/run/long_jump_weighted_choice/LongJumpTaskMixin.java create mode 100644 common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/task/run/long_jump_weighted_choice/package-info.java create mode 100644 common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/task/run/package-info.java diff --git a/.gitignore b/.gitignore index 85b818b4c..ec16a7eca 100644 --- a/.gitignore +++ b/.gitignore @@ -22,8 +22,10 @@ bin/ # fabric -run/ -neoforge/runs +/run/ +/common/run/ +/fabric/run/ +/neoforge/run/ # macOS .DS_Store diff --git a/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/task/run/long_jump_weighted_choice/LongJumpTaskMixin.java b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/task/run/long_jump_weighted_choice/LongJumpTaskMixin.java new file mode 100644 index 000000000..d3d69b6a9 --- /dev/null +++ b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/task/run/long_jump_weighted_choice/LongJumpTaskMixin.java @@ -0,0 +1,74 @@ +package net.caffeinemc.mods.lithium.mixin.ai.task.run.long_jump_weighted_choice; + +import com.llamalad7.mixinextras.sugar.Local; +import net.caffeinemc.mods.lithium.common.util.collections.LongJumpChoiceList; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.util.random.WeightedRandom; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.behavior.LongJumpToRandomPos; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.List; +import java.util.Optional; +import java.util.function.Consumer; + +@Mixin(LongJumpToRandomPos.class) +public class LongJumpTaskMixin { + + @Shadow + protected List jumpCandidates; + + @Shadow + @Final + protected int maxLongJumpWidth; + + @Shadow + @Final + protected int maxLongJumpHeight; + + @Inject( + method = "start(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/Mob;J)V", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/core/BlockPos;betweenClosedStream(IIIIII)Ljava/util/stream/Stream;" + ), + cancellable = true + ) + private void setTargets(ServerLevel serverWorld, E mobEntity, long l, CallbackInfo ci, @Local BlockPos centerPos) { + if (this.maxLongJumpWidth < 128 && this.maxLongJumpHeight < 128) { + this.jumpCandidates = LongJumpChoiceList.forCenter(centerPos, (byte) this.maxLongJumpWidth, (byte) this.maxLongJumpHeight); + ci.cancel(); + } + } + + @Redirect( + method = "getJumpCandidate(Lnet/minecraft/server/level/ServerLevel;)Ljava/util/Optional;", + at = @At(value = "INVOKE", target = "Lnet/minecraft/util/random/WeightedRandom;getRandomItem(Lnet/minecraft/util/RandomSource;Ljava/util/List;)Ljava/util/Optional;") + ) + private Optional getRandomFast(RandomSource random, List pool) { + if (pool instanceof LongJumpChoiceList longJumpChoiceList) { + return Optional.ofNullable(longJumpChoiceList.removeRandomWeightedByDistanceSq(random)); + } else { + return WeightedRandom.getRandomItem(random, pool); + } + } + + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") + @Redirect( + method = "getJumpCandidate(Lnet/minecraft/server/level/ServerLevel;)Ljava/util/Optional;", + at = @At(value = "INVOKE", target = "Ljava/util/Optional;ifPresent(Ljava/util/function/Consumer;)V") + ) + private void skipRemoveIfAlreadyRemoved(Optional result, Consumer removeAction) { + if (!(this.jumpCandidates instanceof LongJumpChoiceList)) { + result.ifPresent(removeAction); + } + } +} diff --git a/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/task/run/long_jump_weighted_choice/package-info.java b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/task/run/long_jump_weighted_choice/package-info.java new file mode 100644 index 000000000..ece30b1cf --- /dev/null +++ b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/task/run/long_jump_weighted_choice/package-info.java @@ -0,0 +1,4 @@ +@MixinConfigOption(description = "Speed up the weighted random choice of long jump target positions.") +package net.caffeinemc.mods.lithium.mixin.ai.task.run.long_jump_weighted_choice; + +import net.caffeinemc.gradle.MixinConfigOption; \ No newline at end of file diff --git a/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/task/run/package-info.java b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/task/run/package-info.java new file mode 100644 index 000000000..656e3bc69 --- /dev/null +++ b/common/src/main/java/net/caffeinemc/mods/lithium/mixin/ai/task/run/package-info.java @@ -0,0 +1,4 @@ +@MixinConfigOption(description = "Various optimizations inside AI tasks") +package net.caffeinemc.mods.lithium.mixin.ai.task.run; + +import net.caffeinemc.gradle.MixinConfigOption; \ No newline at end of file