Skip to content

Commit

Permalink
feat: avoid default when interaction quest complete
Browse files Browse the repository at this point in the history
  • Loading branch information
SettingDust committed Apr 16, 2024
1 parent 072e2b8 commit ffa2553
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -22,81 +21,111 @@
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 <I> 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<NbtElement> beforeTask) {
ServerPlayerEntity player,
Object input,
QuestTaskType<?> taskType,
CallbackInfo ci,
@Local String id,
@Local QuestTask<?, ?, ?> task,
@Share("beforeTask") LocalRef<NbtElement> beforeTask
) {
Codec<QuestTask<?, ?, ?>> codec =
(Codec<QuestTask<?, ?, ?>>) task.type().codec(task.id());
(Codec<QuestTask<?, ?, ?>>) 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<NbtElement> beforeTask) {
ServerPlayerEntity player,
Object input,
QuestTaskType<?> taskType,
CallbackInfo ci,
@Local String id,
@Local QuestTask<?, ?, ?> task,
@Share("needSync") LocalBooleanRef needSync,
@Share("beforeTask") LocalRef<NbtElement> beforeTask
) {
Codec<QuestTask<?, ?, ?>> codec =
(Codec<QuestTask<?, ?, ?>>) task.type().codec(task.id());
(Codec<QuestTask<?, ?, ?>>) 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);
}
}

@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()));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ val compatGuardVillager: Boolean =
false
}

var taskTestFlag = false

fun init() {
QuestTasks.register(VillagerInteractTask.TYPE)
QuestRewards.register(ReputationReward.Type)
Expand All @@ -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, _ ->
Expand Down
2 changes: 1 addition & 1 deletion settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down

0 comments on commit ffa2553

Please sign in to comment.