From ffa255387e27590d494cba96c00b7d68237ef7cd Mon Sep 17 00:00:00 2001 From: SettingDust Date: Tue, 16 Apr 2024 14:19:58 +0800 Subject: [PATCH] feat: avoid default when interaction quest complete --- .../mixin/QuestsProgressMixin.java | 135 +++++++++++------- .../heraclesforvillagers/Entrypoint.kt | 10 +- settings.gradle.kts | 2 +- 3 files changed, 92 insertions(+), 55 deletions(-) diff --git a/mod/src/main/java/settingdust/heraclesforvillagers/mixin/QuestsProgressMixin.java b/mod/src/main/java/settingdust/heraclesforvillagers/mixin/QuestsProgressMixin.java index c4a7e7d..4ee2fd2 100644 --- a/mod/src/main/java/settingdust/heraclesforvillagers/mixin/QuestsProgressMixin.java +++ b/mod/src/main/java/settingdust/heraclesforvillagers/mixin/QuestsProgressMixin.java @@ -13,7 +13,6 @@ import earth.terrarium.heracles.common.network.NetworkHandler; import earth.terrarium.heracles.common.network.packets.quests.ClientboundUpdateQuestPacket; import earth.terrarium.heracles.common.network.packets.quests.data.NetworkQuestData; -import java.util.Objects; import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtOps; import net.minecraft.registry.RegistryOps; @@ -22,56 +21,82 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import settingdust.heraclesforvillagers.EntrypointKt; + +import java.util.Objects; @Mixin(value = QuestsProgress.class) public class QuestsProgressMixin { @Inject( - method = "testAndProgressTaskType", - at = - @At( - value = "INVOKE", - target = - "Learth/terrarium/heracles/common/handlers/progress/TaskProgress;progress()Lnet/minecraft/nbt/NbtElement;", - ordinal = 0)) + method = "testAndProgressTaskType", + at = @At( + value = "INVOKE", + target = "Learth/terrarium/heracles/common/handlers/progress/QuestsProgress;sendOutQuestComplete" + + "(Learth/terrarium/heracles/api/quests/QuestEntry;" + + "Lnet/minecraft/server/network/ServerPlayerEntity;)V" + ) + ) + private void heraclesForVillagers( + final ServerPlayerEntity player, final I input, final QuestTaskType taskType, final CallbackInfo ci + ) { + EntrypointKt.setTaskTestFlag(true); + } + + @Inject( + method = "testAndProgressTaskType", + at = + @At( + value = "INVOKE", + target = + "Learth/terrarium/heracles/common/handlers/progress/TaskProgress;progress()" + + "Lnet/minecraft/nbt/NbtElement;", + ordinal = 0 + ) + ) private void saveBeforeTask( - ServerPlayerEntity player, - Object input, - QuestTaskType taskType, - CallbackInfo ci, - @Local String id, - @Local QuestTask task, - @Share("beforeTask") LocalRef beforeTask) { + ServerPlayerEntity player, + Object input, + QuestTaskType taskType, + CallbackInfo ci, + @Local String id, + @Local QuestTask task, + @Share("beforeTask") LocalRef beforeTask + ) { Codec> codec = - (Codec>) task.type().codec(task.id()); + (Codec>) task.type().codec(task.id()); beforeTask.set(codec.encodeStart( - RegistryOps.of(NbtOps.INSTANCE, player.getWorld().getRegistryManager()), task) - .result() - .orElseThrow()); + RegistryOps.of(NbtOps.INSTANCE, player.getWorld().getRegistryManager()), task) + .result() + .orElseThrow()); } @Inject( - method = "testAndProgressTaskType", - at = - @At( - value = "INVOKE", - target = - "Learth/terrarium/heracles/common/handlers/progress/TaskProgress;progress()Lnet/minecraft/nbt/NbtElement;", - ordinal = 1)) + method = "testAndProgressTaskType", + at = + @At( + value = "INVOKE", + target = + "Learth/terrarium/heracles/common/handlers/progress/TaskProgress;progress()" + + "Lnet/minecraft/nbt/NbtElement;", + ordinal = 1 + ) + ) private void compareTask( - ServerPlayerEntity player, - Object input, - QuestTaskType taskType, - CallbackInfo ci, - @Local String id, - @Local QuestTask task, - @Share("needSync") LocalBooleanRef needSync, - @Share("beforeTask") LocalRef beforeTask) { + ServerPlayerEntity player, + Object input, + QuestTaskType taskType, + CallbackInfo ci, + @Local String id, + @Local QuestTask task, + @Share("needSync") LocalBooleanRef needSync, + @Share("beforeTask") LocalRef beforeTask + ) { Codec> codec = - (Codec>) task.type().codec(task.id()); + (Codec>) task.type().codec(task.id()); final var afterTask = codec.encodeStart( - RegistryOps.of(NbtOps.INSTANCE, player.getWorld().getRegistryManager()), task) - .result() - .orElseThrow(); + RegistryOps.of(NbtOps.INSTANCE, player.getWorld().getRegistryManager()), task) + .result() + .orElseThrow(); if (!afterTask.equals(beforeTask)) { QuestHandler.markDirty(id); needSync.set(true); @@ -79,24 +104,28 @@ private void compareTask( } @Inject( - method = "testAndProgressTaskType", - at = - @At( - value = "INVOKE", - remap = false, - target = - "Learth/terrarium/heracles/common/handlers/progress/QuestProgress;update(Learth/terrarium/heracles/api/quests/Quest;)V")) + method = "testAndProgressTaskType", + at = + @At( + value = "INVOKE", + remap = false, + target = + "Learth/terrarium/heracles/common/handlers/progress/QuestProgress;update" + + "(Learth/terrarium/heracles/api/quests/Quest;)V" + ) + ) private void saveQuest( - ServerPlayerEntity player, - Object input, - QuestTaskType taskType, - CallbackInfo ci, - @Local String id, - @Local Quest quest, - @Share("needSync") LocalBooleanRef needSync) { + ServerPlayerEntity player, + Object input, + QuestTaskType taskType, + CallbackInfo ci, + @Local String id, + @Local Quest quest, + @Share("needSync") LocalBooleanRef needSync + ) { if (needSync.get()) { var packet = new ClientboundUpdateQuestPacket( - id, NetworkQuestData.builder().tasks(quest.tasks()).build()); + id, NetworkQuestData.builder().tasks(quest.tasks()).build()); NetworkHandler.CHANNEL.sendToAllPlayers(packet, Objects.requireNonNull(player.getServer())); } } diff --git a/mod/src/main/kotlin/settingdust/heraclesforvillagers/Entrypoint.kt b/mod/src/main/kotlin/settingdust/heraclesforvillagers/Entrypoint.kt index 8fce671..83ee3a6 100644 --- a/mod/src/main/kotlin/settingdust/heraclesforvillagers/Entrypoint.kt +++ b/mod/src/main/kotlin/settingdust/heraclesforvillagers/Entrypoint.kt @@ -29,6 +29,8 @@ val compatGuardVillager: Boolean = false } +var taskTestFlag = false + fun init() { QuestTasks.register(VillagerInteractTask.TYPE) QuestRewards.register(ReputationReward.Type) @@ -46,7 +48,13 @@ fun init() { Pair(player, entity), GuardVillagerInteractTask.TYPE ) - return@register ActionResult.PASS + return@register if (taskTestFlag) { + taskTestFlag = false + ActionResult.SUCCESS + } else { + taskTestFlag = true + ActionResult.PASS + } } ServerLivingEntityEvents.AFTER_DEATH.register { entity, _ -> diff --git a/settings.gradle.kts b/settings.gradle.kts index 67d9369..24fbe39 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -66,7 +66,7 @@ plugins { // https://plugins.gradle.org/plugin/org.gradle.toolchains.foojay-resolver-convention id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" // https://github.com/DanySK/gradle-pre-commit-git-hooks - id("org.danilopianini.gradle-pre-commit-git-hooks") version "2.0.3" + id("org.danilopianini.gradle-pre-commit-git-hooks") version "2.0.4" } gitHooks {