From 7f168236c058243da7a44590a85ab1470377cf0f Mon Sep 17 00:00:00 2001 From: Des Herriott Date: Mon, 24 Apr 2023 10:54:29 +0100 Subject: [PATCH 1/9] fix: don't assume server is non-null in command handler It can be null on the first invocation if the command is run from a minecraft:tick tag https://github.com/FTBTeam/FTB-Mods-Issues/issues/766 --- .../java/dev/ftb/mods/ftbquests/command/FTBQuestsCommands.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/command/FTBQuestsCommands.java b/common/src/main/java/dev/ftb/mods/ftbquests/command/FTBQuestsCommands.java index cc6335a3f..1d3dc3563 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/command/FTBQuestsCommands.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/command/FTBQuestsCommands.java @@ -54,7 +54,7 @@ public class FTBQuestsCommands { public static void register(CommandDispatcher dispatcher) { dispatcher.register(Commands.literal("ftbquests") - .requires(s -> s.getServer().isSingleplayer() || s.hasPermission(2)) + .requires(s -> s.getServer() != null && s.getServer().isSingleplayer() || s.hasPermission(2)) .then(Commands.literal("editing_mode") .executes(c -> editingMode(c.getSource(), c.getSource().getPlayerOrException(), null)) .then(Commands.argument("enabled", BoolArgumentType.bool()) From 18c894420bb4448c633a430b408d016dc8489262 Mon Sep 17 00:00:00 2001 From: Des Herriott Date: Mon, 12 Jun 2023 16:16:00 +0100 Subject: [PATCH 2/9] fix: stop open barrier blocks causing suffocation damage --- .../ftbquests/block/QuestBarrierBlock.java | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/block/QuestBarrierBlock.java b/common/src/main/java/dev/ftb/mods/ftbquests/block/QuestBarrierBlock.java index d04d1e49c..a7a9b8732 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/block/QuestBarrierBlock.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/block/QuestBarrierBlock.java @@ -7,7 +7,6 @@ import net.fabricmc.api.Environment; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -36,7 +35,8 @@ protected QuestBarrierBlock() { super(Properties.of(Material.BARRIER, MaterialColor.COLOR_LIGHT_BLUE) .noOcclusion() .noDrops() - .isViewBlocking((a, b, c) -> false) + .isViewBlocking((blockState, blockGetter, blockPos) -> false) + .isSuffocating((blockState, blockGetter, blockPos) -> false) .strength(-1, 6000000F) .lightLevel(blockState -> 3) .emissiveRendering((blockState, blockGetter, blockPos) -> true) @@ -57,14 +57,10 @@ public RenderShape getRenderShape(BlockState state) { @Override public VoxelShape getCollisionShape(BlockState state, BlockGetter bg, BlockPos pos, CollisionContext ctx) { - Entity entity = EntityHooks.fromCollision(ctx); - - if (entity instanceof Player) { - BlockEntity be = bg.getBlockEntity(pos); - - if (be instanceof BarrierBlockEntity && ((BarrierBlockEntity) be).isOpen((Player) entity)) { - return Shapes.empty(); - } + if (EntityHooks.fromCollision(ctx) instanceof Player player + && bg.getBlockEntity(pos) instanceof BarrierBlockEntity barrier + && barrier.isOpen(player)) { + return Shapes.empty(); } return super.getCollisionShape(state, bg, pos, ctx); @@ -97,10 +93,8 @@ public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable L super.setPlacedBy(level, pos, state, entity, stack); if (!level.isClientSide() && stack.hasCustomHoverName()) { - BlockEntity blockEntity = level.getBlockEntity(pos); - - if (blockEntity instanceof BarrierBlockEntity) { - ((BarrierBlockEntity) blockEntity).update(stack.getHoverName().getString()); + if (level.getBlockEntity(pos) instanceof BarrierBlockEntity barrier) { + barrier.update(stack.getHoverName().getString()); } } } From 5d33721e0dc75abbc21a9a98fe714cd6a8197c9e Mon Sep 17 00:00:00 2001 From: Des Herriott Date: Mon, 12 Jun 2023 16:19:55 +0100 Subject: [PATCH 3/9] build: version -> 1802.3.15, changelog updated --- CHANGELOG.md | 5 +++++ forge/build.gradle | 9 +++++++++ gradle.properties | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 34ce1a9ab..ff02226c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1802.3.15] + +### Fixed +* Open Quest & Stage Barrier Blocks no longer cause suffocation damage to players passing through them + ## [1802.3.14] ### Added diff --git a/forge/build.gradle b/forge/build.gradle index 8410c5c13..f98268c56 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -27,6 +27,13 @@ repositories { includeGroup "mezz.jei" // includeGroup "team.chisel.ctm" } + + } + maven { + url "https://cursemaven.com" + content { + includeGroup "curse.maven" + } } } @@ -50,6 +57,8 @@ dependencies { common(project(path: ":common", configuration: "namedElements")) { transitive false } shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive false } + + modLocalRuntime("curse.maven:chiselsandbits-231095:4119191") } processResources { diff --git a/gradle.properties b/gradle.properties index 46aee2242..7c0fa5779 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ archives_base_name=ftb-quests minecraft_version=1.18.2 # Build time -mod_version=1802.3.14 +mod_version=1802.3.15 maven_group=dev.ftb.mods mod_author=FTB Team From 873a017ed2a6b895530559c05bf80f3795c0479c Mon Sep 17 00:00:00 2001 From: Des Herriott Date: Mon, 22 May 2023 10:37:13 +0100 Subject: [PATCH 4/9] fix: server->client desync when claiming rewards for repeatable quests https://github.com/FTBTeam/FTB-Mods-Issues/issues/807 https://github.com/FTBTeam/FTB-Mods-Issues/issues/906 --- .../mods/ftbquests/net/ClaimChoiceRewardMessage.java | 12 +++++------- .../ftb/mods/ftbquests/net/ClaimRewardMessage.java | 2 +- .../java/dev/ftb/mods/ftbquests/quest/TeamData.java | 4 ---- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/ClaimChoiceRewardMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/ClaimChoiceRewardMessage.java index 734e62dd7..c87977858 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/ClaimChoiceRewardMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/ClaimChoiceRewardMessage.java @@ -43,16 +43,14 @@ public void write(FriendlyByteBuf buffer) { public void handle(NetworkManager.PacketContext context) { Reward reward = ServerQuestFile.INSTANCE.getReward(id); - if (reward instanceof ChoiceReward) { - ServerPlayer player = (ServerPlayer) context.getPlayer(); - ChoiceReward r = (ChoiceReward) reward; - TeamData data = TeamData.get(player); - RewardTable table = r.getTable(); + if (reward instanceof ChoiceReward choiceReward && context.getPlayer() instanceof ServerPlayer serverPlayer) { + TeamData data = TeamData.get(serverPlayer); + RewardTable table = choiceReward.getTable(); if (table != null && data.isCompleted(reward.quest)) { if (index >= 0 && index < table.rewards.size()) { - table.rewards.get(index).reward.claim(player, true); - data.claimReward(player, reward, true); + table.rewards.get(index).reward.claim(serverPlayer, true); + data.claimReward(serverPlayer, reward, true); } } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/ClaimRewardMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/ClaimRewardMessage.java index 135f6ff0c..6a6ca4a43 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/ClaimRewardMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/ClaimRewardMessage.java @@ -40,9 +40,9 @@ public void write(FriendlyByteBuf buffer) { @Override public void handle(NetworkManager.PacketContext context) { Reward reward = ServerQuestFile.INSTANCE.getReward(id); - ServerPlayer player = (ServerPlayer) context.getPlayer(); if (reward != null) { + ServerPlayer player = (ServerPlayer) context.getPlayer(); TeamData teamData = ServerQuestFile.INSTANCE.getData(player); if (teamData.isCompleted(reward.quest)) { diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/TeamData.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/TeamData.java index f195cf9f0..e475a5178 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/TeamData.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/TeamData.java @@ -602,10 +602,6 @@ public boolean canStartTasks(Quest quest) { public void claimReward(ServerPlayer player, Reward reward, boolean notify) { if (claimReward(player.getUUID(), reward, System.currentTimeMillis())) { reward.claim(player, notify); - - if (file.isServerSide()) { - new ClaimRewardResponseMessage(uuid, player.getUUID(), reward.id).sendToAll(((ServerQuestFile) file).server); - } } } From 5f5e59b66ea4fcd754d337d504f26d204f463366 Mon Sep 17 00:00:00 2001 From: Des Herriott Date: Mon, 14 Aug 2023 11:42:14 +0100 Subject: [PATCH 5/9] chore: changelog updated --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff02226c7..b883a72a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed * Open Quest & Stage Barrier Blocks no longer cause suffocation damage to players passing through them +* Fixed server->client desync with repeatable quests which have multiple rewards ## [1802.3.14] From b6f6c41cf121830b6b7e17e3054ca15e805a39fd Mon Sep 17 00:00:00 2001 From: Des Herriott Date: Tue, 15 Aug 2023 11:25:27 +0100 Subject: [PATCH 6/9] build: update maven publishing urls --- common/build.gradle | 4 ++-- fabric/build.gradle | 4 ++-- forge/build.gradle | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/common/build.gradle b/common/build.gradle index 17a25430e..8c5b70aec 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -28,7 +28,7 @@ publishing { repositories { if (ENV.FTB_MAVEN_TOKEN) { maven { - url "https://maven.ftb.dev/release" + url "https://maven.ftb.dev/releases" credentials { username = "ftb" password = "${ENV.FTB_MAVEN_TOKEN}" @@ -38,7 +38,7 @@ publishing { if (ENV.SAPS_TOKEN) { maven { - url "https://maven.saps.dev/minecraft" + url "https://maven.saps.dev/releases" credentials { username = "ftb" password = "${ENV.SAPS_TOKEN}" diff --git a/fabric/build.gradle b/fabric/build.gradle index eb4c8cd47..9586f1c1b 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -108,7 +108,7 @@ publishing { repositories { if (ENV.FTB_MAVEN_TOKEN) { maven { - url "https://maven.ftb.dev/release" + url "https://maven.ftb.dev/releases" credentials { username = "ftb" password = "${ENV.FTB_MAVEN_TOKEN}" @@ -118,7 +118,7 @@ publishing { if (ENV.SAPS_TOKEN) { maven { - url "https://maven.saps.dev/minecraft" + url "https://maven.saps.dev/releases" credentials { username = "ftb" password = "${ENV.SAPS_TOKEN}" diff --git a/forge/build.gradle b/forge/build.gradle index f98268c56..584987684 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -139,7 +139,7 @@ publishing { repositories { if (ENV.FTB_MAVEN_TOKEN) { maven { - url "https://maven.ftb.dev/release" + url "https://maven.ftb.dev/releases" credentials { username = "ftb" password = "${ENV.FTB_MAVEN_TOKEN}" @@ -149,7 +149,7 @@ publishing { if (ENV.SAPS_TOKEN) { maven { - url "https://maven.saps.dev/minecraft" + url "https://maven.saps.dev/releases" credentials { username = "ftb" password = "${ENV.SAPS_TOKEN}" From 9c52afad10414592648ff2632d99e11b60af20af Mon Sep 17 00:00:00 2001 From: Des Herriott Date: Wed, 13 Sep 2023 10:57:38 +0100 Subject: [PATCH 7/9] feat: added `/ftbquests open_book ` command can be any quest object (other than rewards). Standard visibility rules apply, i.e. no opening a quest that the player shouldn't be able to see yet https://github.com/FTBTeam/FTB-Mods-Issues/issues/936 --- .../ftbquests/client/ClientQuestFile.java | 23 +++++++++-- .../ftbquests/command/FTBQuestsCommands.java | 40 +++++++++++++++++-- .../command/QuestObjectArgument.java | 20 +++++++++- .../ftbquests/net/FTBQuestsNetHandler.java | 1 + .../ftbquests/net/OpenQuestBookMessage.java | 34 ++++++++++++++++ 5 files changed, 109 insertions(+), 9 deletions(-) create mode 100644 common/src/main/java/dev/ftb/mods/ftbquests/net/OpenQuestBookMessage.java diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/ClientQuestFile.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/ClientQuestFile.java index 29bae07b9..0cdbc0b73 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/ClientQuestFile.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/ClientQuestFile.java @@ -8,9 +8,7 @@ import dev.ftb.mods.ftbquests.gui.quests.QuestScreen; import dev.ftb.mods.ftbquests.integration.FTBQuestsJEIHelper; import dev.ftb.mods.ftbquests.net.DeleteObjectMessage; -import dev.ftb.mods.ftbquests.quest.Movable; -import dev.ftb.mods.ftbquests.quest.QuestFile; -import dev.ftb.mods.ftbquests.quest.TeamData; +import dev.ftb.mods.ftbquests.quest.*; import dev.ftb.mods.ftbquests.quest.theme.QuestTheme; import dev.ftb.mods.ftbquests.util.TextUtils; import dev.ftb.mods.ftbteams.data.ClientTeamManager; @@ -151,4 +149,23 @@ public void clearCachedData() { public TeamData getData(Entity player) { return player == Minecraft.getInstance().player ? self : getData(Objects.requireNonNull(ClientTeamManager.INSTANCE.getKnownPlayer(player.getUUID()), "Non-null team required!").teamId); } + + public static void openBookToQuestObject(long id) { + if (exists()) { + ClientQuestFile file = ClientQuestFile.INSTANCE; + if (file.questScreen == null) { + ClientQuestFile.INSTANCE.openQuestGui(); + } + if (file.questScreen != null) { + if (id != 0L) { + QuestObject qo = file.get(id); + if (qo != null) { + file.questScreen.open(qo, true); + } + } else { + file.questScreen.openGui(); + } + } + } + } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/command/FTBQuestsCommands.java b/common/src/main/java/dev/ftb/mods/ftbquests/command/FTBQuestsCommands.java index 1d3dc3563..39acb0b1f 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/command/FTBQuestsCommands.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/command/FTBQuestsCommands.java @@ -9,15 +9,13 @@ import dev.architectury.registry.registries.Registries; import dev.ftb.mods.ftblibrary.config.Tristate; import dev.ftb.mods.ftbquests.FTBQuests; -import dev.ftb.mods.ftbquests.net.CreateObjectResponseMessage; -import dev.ftb.mods.ftbquests.net.DeleteObjectResponseMessage; -import dev.ftb.mods.ftbquests.net.SyncQuestsMessage; -import dev.ftb.mods.ftbquests.net.SyncTeamDataMessage; +import dev.ftb.mods.ftbquests.net.*; import dev.ftb.mods.ftbquests.quest.*; import dev.ftb.mods.ftbquests.quest.loot.RewardTable; import dev.ftb.mods.ftbquests.quest.loot.WeightedReward; import dev.ftb.mods.ftbquests.quest.reward.ItemReward; import dev.ftb.mods.ftbquests.quest.task.ItemTask; +import dev.ftb.mods.ftbquests.quest.task.Task; import dev.ftb.mods.ftbquests.util.FileUtils; import dev.ftb.mods.ftbquests.util.ProgressChange; import net.minecraft.ChatFormatting; @@ -154,9 +152,42 @@ public static void register(CommandDispatcher dispatcher) { ) ) ) + .then(Commands.literal("open_book") + .executes(c -> openQuest(c.getSource().getPlayerOrException(), null)) + .then(Commands.argument("quest_object", QuestObjectArgument.questObject(qob -> qob instanceof QuestObject)) + .executes(c -> openQuest(c.getSource().getPlayerOrException(), c.getArgument("quest_object", QuestObjectBase.class)))) + ) ); } + private static int openQuest(ServerPlayer player, QuestObjectBase qob) { + if (qob == null) { + // just open the book to wherever it last was + new OpenQuestBookMessage(0L).sendTo(player); + } else if (qob instanceof QuestObject quest) { + if (canSeeQuestObject(player, quest)) { + new OpenQuestBookMessage(quest.id).sendTo(player); + } + } + return 1; + } + + private static boolean canSeeQuestObject(ServerPlayer player, QuestObject qo) { + if (qo instanceof Chapter) { + return true; + } + TeamData data = TeamData.get(player); + Quest quest = null; + if (qo instanceof QuestLink link) { + quest = link.getQuest().orElse(null); + } else if (qo instanceof Task task) { + quest = task.quest; + } else if (qo instanceof Quest q) { + quest = q; + } + return quest != null && (data.getCanEdit() || !quest.hideDetailsUntilStartable() || data.canStartTasks(quest)); + } + private static int exportRewards(CommandSourceStack source, RewardTable table, BlockPos pos) throws CommandSyntaxException { ServerPlayer player = source.getPlayerOrException(); ServerLevel level = source.getLevel(); @@ -377,6 +408,7 @@ private static int generateAllItemChapter(CommandSourceStack source) { } private static final Set warnedPlayers = new HashSet<>(); + private static int doReload(CommandSourceStack source) throws CommandSyntaxException { ServerQuestFile instance = ServerQuestFile.INSTANCE; ServerPlayer sender = source.getPlayerOrException(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/command/QuestObjectArgument.java b/common/src/main/java/dev/ftb/mods/ftbquests/command/QuestObjectArgument.java index ae5f197a6..92c556d12 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/command/QuestObjectArgument.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/command/QuestObjectArgument.java @@ -20,6 +20,7 @@ import java.util.Collection; import java.util.List; import java.util.concurrent.CompletableFuture; +import java.util.function.Predicate; public class QuestObjectArgument implements ArgumentType { @@ -37,6 +38,16 @@ public class QuestObjectArgument implements ArgumentType { public static final DynamicCommandExceptionType INVALID_ID = new DynamicCommandExceptionType( (id) -> new TranslatableComponent("commands.ftbquests.command.error.invalid_id", id)); + private final Predicate filter; + + public QuestObjectArgument() { + this(qo -> true); + } + + public QuestObjectArgument(Predicate filter) { + this.filter = filter; + } + @Override public QuestObjectBase parse(StringReader reader) throws CommandSyntaxException { String id = reader.readString(); @@ -44,7 +55,7 @@ public QuestObjectBase parse(StringReader reader) throws CommandSyntaxException if (file != null) { if (id.startsWith("#")) { for (QuestObjectBase object : file.getAllObjects()) { - if (object.hasTag(id.substring(1))) { + if (object.hasTag(id.substring(1)) && filter.test(object)) { return object; } } @@ -53,7 +64,7 @@ public QuestObjectBase parse(StringReader reader) throws CommandSyntaxException try { long num = file.getID(id); QuestObjectBase object = file.getBase(num); - if (object == null) { + if (object == null || !filter.test(object)) { throw NO_OBJECT.createWithContext(reader, id); } return object; @@ -72,6 +83,7 @@ public CompletableFuture listSuggestions(CommandContext cont return SharedSuggestionProvider.suggest( file.getAllObjects() .stream() + .filter(filter) .map(QuestFile::getCodeString), builder ); @@ -88,6 +100,10 @@ public static QuestObjectArgument questObject() { return new QuestObjectArgument(); } + public static QuestObjectArgument questObject(Predicate filter) { + return new QuestObjectArgument(filter); + } + @Nullable private static QuestFile findQuestFile() { if (!QuestObjectBase.isNull(ServerQuestFile.INSTANCE)) { diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/FTBQuestsNetHandler.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/FTBQuestsNetHandler.java index fb2dcaf04..eb77ed62a 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/FTBQuestsNetHandler.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/FTBQuestsNetHandler.java @@ -61,6 +61,7 @@ public interface FTBQuestsNetHandler { MessageType SYNC_REWARD_BLOCKING = NET.registerS2C("sync_reward_blocking", SyncRewardBlockingMessage::new); MessageType COPY_QUEST = NET.registerC2S("copy_quest", CopyQuestMessage::new); MessageType COPY_CHAPTER_IMAGE = NET.registerC2S("copy_chapter_image", CopyChapterImageMessage::new); + MessageType OPEN_QUEST_BOOK = NET.registerS2C("open_quest_book", OpenQuestBookMessage::new); static void init() { } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/OpenQuestBookMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/OpenQuestBookMessage.java new file mode 100644 index 000000000..3d4f48795 --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/OpenQuestBookMessage.java @@ -0,0 +1,34 @@ +package dev.ftb.mods.ftbquests.net; + +import dev.architectury.networking.NetworkManager; +import dev.architectury.networking.simple.BaseS2CMessage; +import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftbquests.client.ClientQuestFile; +import net.minecraft.network.FriendlyByteBuf; + +public class OpenQuestBookMessage extends BaseS2CMessage { + private final long id; + + public OpenQuestBookMessage(long id) { + this.id = id; + } + + OpenQuestBookMessage(FriendlyByteBuf buf) { + id = buf.readLong(); + } + + @Override + public MessageType getType() { + return FTBQuestsNetHandler.OPEN_QUEST_BOOK; + } + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeLong(id); + } + + @Override + public void handle(NetworkManager.PacketContext context) { + ClientQuestFile.openBookToQuestObject(id); + } +} From 57b5ec416212bb699836aa07ecd3591fe98bfe0e Mon Sep 17 00:00:00 2001 From: Des Herriott Date: Wed, 13 Sep 2023 11:07:50 +0100 Subject: [PATCH 8/9] feat: add "silent" option to command rewards https://github.com/FTBTeam/FTB-Mods-Issues/issues/935 --- .../ftbquests/quest/reward/CommandReward.java | 16 ++++++++++++++-- .../resources/assets/ftbquests/lang/en_us.json | 1 + 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/CommandReward.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/CommandReward.java index c930c9b8e..ff401a84c 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/CommandReward.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/CommandReward.java @@ -6,6 +6,7 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; +import net.minecraft.commands.CommandSourceStack; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; @@ -23,6 +24,7 @@ public class CommandReward extends Reward { public String command; public boolean playerCommand; + public boolean silent; public CommandReward(Quest quest) { super(quest); @@ -38,7 +40,8 @@ public RewardType getType() { public void writeData(CompoundTag nbt) { super.writeData(nbt); nbt.putString("command", command); - nbt.putBoolean("player_command", playerCommand); + if (playerCommand) nbt.putBoolean("player_command", true); + if (silent) nbt.putBoolean("silent", true); } @Override @@ -46,6 +49,7 @@ public void readData(CompoundTag nbt) { super.readData(nbt); command = nbt.getString("command"); playerCommand = nbt.getBoolean("player_command"); + silent = nbt.getBoolean("silent"); } @Override @@ -53,6 +57,7 @@ public void writeNetData(FriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeUtf(command, Short.MAX_VALUE); buffer.writeBoolean(playerCommand); + buffer.writeBoolean(silent); } @Override @@ -60,6 +65,7 @@ public void readNetData(FriendlyByteBuf buffer) { super.readNetData(buffer); command = buffer.readUtf(Short.MAX_VALUE); playerCommand = buffer.readBoolean(); + silent = buffer.readBoolean(); } @Override @@ -68,6 +74,7 @@ public void getConfig(ConfigGroup config) { super.getConfig(config); config.addString("command", command, v -> command = v, "/say Hi, @team!").setNameKey("ftbquests.reward.ftbquests.command"); config.addBool("player", playerCommand, v -> playerCommand = v, false); + config.addBool("silent", silent, v -> silent = v, false); } @Override @@ -96,7 +103,12 @@ public void claim(ServerPlayer player, boolean notify) { } } - player.server.getCommands().performCommand(playerCommand ? player.createCommandSourceStack() : player.server.createCommandSourceStack(), s); + CommandSourceStack stack = playerCommand ? player.createCommandSourceStack() : player.server.createCommandSourceStack(); + if (silent) { + stack = stack.withSuppressedOutput(); + } + + player.server.getCommands().performCommand(stack, s); } @Override diff --git a/common/src/main/resources/assets/ftbquests/lang/en_us.json b/common/src/main/resources/assets/ftbquests/lang/en_us.json index 341b7db85..abfc05ea2 100644 --- a/common/src/main/resources/assets/ftbquests/lang/en_us.json +++ b/common/src/main/resources/assets/ftbquests/lang/en_us.json @@ -381,6 +381,7 @@ "ftbquests.reward.ftbquests.xp_levels": "XP Levels", "ftbquests.reward.ftbquests.command": "Command", "ftbquests.reward.ftbquests.command.player": "Run as Player", + "ftbquests.reward.ftbquests.command.silent": "Silent", "ftbquests.reward.ftbquests.advancement": "Advancement", "ftbquests.reward.ftbquests.advancement.criterion": "Criterion", "ftbquests.reward.ftbquests.advancement.criterion.tooltip": "Optional, set if you want only one criterion to be granted", From 6a36d37fc738f78bc23bbd0ce375909fa247b004 Mon Sep 17 00:00:00 2001 From: Des Herriott Date: Wed, 13 Sep 2023 11:10:12 +0100 Subject: [PATCH 9/9] chore: changelog updated --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b883a72a7..4686e8d82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [1802.3.15] +### Added +* Command rewards now have a "Silent" boolean property; when true, any command output (success or failure) is suppressed +* Added a `/ftbquests open_book ` command to open the book to a specific quest, quest link, chapter or task + ### Fixed * Open Quest & Stage Barrier Blocks no longer cause suffocation damage to players passing through them * Fixed server->client desync with repeatable quests which have multiple rewards