diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ec67c57fc..a3fef8498 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,6 +18,7 @@ jobs: with: curse-publish-task: "" maven-snapshots: true + java-version: 21 secrets: ftb-maven-token: ${{ secrets.FTB_MAVEN_TOKEN }} saps-token: ${{ secrets.SAPS_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7f875fc03..bc7d92534 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,6 +11,7 @@ jobs: uses: FTBTeam/mods-meta/.github/workflows/standard-release.yml@main with: curse-publish-task: curseforge + java-version: 21 secrets: ftb-maven-token: ${{ secrets.FTB_MAVEN_TOKEN }} saps-token: ${{ secrets.SAPS_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ab4a4183..5a642b323 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,17 @@ 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). +# [2006.1.0] + +### Changed +* Ported to Minecraft 1.20.6. Support for Fabric and NeoForge. + * Forge support may be re-added if/when Architectury adds support for Forge +* The way translations are handled has changed significantly in this release + * Translation text is now stored separately from other quest data, under the `lang/` folder with the quest book folder hierarchy, in a file named after the locale, e.g. `lang/en_us.snbt` + * This should make it easier to produce translations in the future, since all text is located in one place. + * Editing language can be overridden via client preference; default is to use whatever Minecraft language is in force. When text is edited in-game, it's stored in the appropriate language file based in the active editing locale. + * Text which doesn't have a translation in the current locale (but does in the `en_us` locale) is highlighted when in edit mode. + # [2004.2.1] ### Added diff --git a/build.gradle b/build.gradle index 898343b72..5326865b5 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.5-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.6-SNAPSHOT" apply false id "com.matthewprenger.cursegradle" version "1.4.0" apply false } @@ -35,7 +35,7 @@ allprojects { // needs to be done AFTER version is set apply from: "https://raw.githubusercontent.com/FTBTeam/mods-meta/main/gradle/publishing.gradle" - sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = 17 + sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = 21 compileJava { options.encoding = "UTF-8" diff --git a/common/build.gradle b/common/build.gradle index 867f183c2..52303c631 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -8,7 +8,7 @@ dependencies { } architectury { - common("forge", "fabric", "neoforge") + common(/*"forge", */ "fabric", "neoforge") } publishing { diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/FTBQuests.java b/common/src/main/java/dev/ftb/mods/ftbquests/FTBQuests.java index 31591ae19..5eed85d49 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/FTBQuests.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/FTBQuests.java @@ -8,21 +8,21 @@ import dev.ftb.mods.ftbquests.client.FTBQClientProxy; import dev.ftb.mods.ftbquests.client.FTBQuestsClient; import dev.ftb.mods.ftbquests.integration.RecipeModHelper; -import dev.ftb.mods.ftbquests.integration.item_filtering.DisplayStacksCache; import dev.ftb.mods.ftbquests.net.ClearDisplayCacheMessage; import dev.ftb.mods.ftbquests.net.FTBQuestsNetHandler; import dev.ftb.mods.ftbquests.quest.reward.RewardTypes; import dev.ftb.mods.ftbquests.quest.task.TaskTypes; -import net.minecraft.gametest.framework.GameTestServer; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; +import net.minecraft.core.component.DataComponentType; import net.minecraft.server.packs.PackType; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManagerReloadListener; +import net.minecraft.world.item.ItemStack; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.Objects; +import java.util.Optional; +import java.util.function.Supplier; public class FTBQuests { public static final Logger LOGGER = LogManager.getLogger(FTBQuestsAPI.MOD_NAME); @@ -69,4 +69,12 @@ public void onResourceManagerReload(ResourceManager resourceManager) { ClearDisplayCacheMessage.clearForAll(GameInstance.getServer()); } } + + public static Optional getComponent(ItemStack stack, Supplier> componentType) { + return Optional.ofNullable(stack.get(componentType.get())); + } + + public static Optional getComponent(ItemStack stack, DataComponentType componentType) { + return Optional.ofNullable(stack.get(componentType)); + } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/FTBQuestsEventHandler.java b/common/src/main/java/dev/ftb/mods/ftbquests/FTBQuestsEventHandler.java index fc9cd6c54..5e30d3e99 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/FTBQuestsEventHandler.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/FTBQuestsEventHandler.java @@ -4,17 +4,18 @@ import dev.architectury.event.EventResult; import dev.architectury.event.events.common.*; import dev.architectury.hooks.level.entity.PlayerHooks; -import dev.ftb.mods.ftbquests.block.FTBQuestsBlocks; -import dev.ftb.mods.ftbquests.block.entity.FTBQuestsBlockEntities; import dev.ftb.mods.ftbquests.command.FTBQuestsCommands; import dev.ftb.mods.ftbquests.events.ClearFileCacheEvent; -import dev.ftb.mods.ftbquests.item.FTBQuestsItems; import dev.ftb.mods.ftbquests.quest.BaseQuestFile; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.quest.TeamData; import dev.ftb.mods.ftbquests.quest.task.DimensionTask; import dev.ftb.mods.ftbquests.quest.task.KillTask; import dev.ftb.mods.ftbquests.quest.task.Task; +import dev.ftb.mods.ftbquests.registry.ModBlockEntityTypes; +import dev.ftb.mods.ftbquests.registry.ModBlocks; +import dev.ftb.mods.ftbquests.registry.ModDataComponents; +import dev.ftb.mods.ftbquests.registry.ModItems; import dev.ftb.mods.ftbquests.util.DeferredInventoryDetection; import dev.ftb.mods.ftbquests.util.FTBQuestsInventoryListener; import dev.ftb.mods.ftbteams.api.event.PlayerChangedTeamEvent; @@ -52,9 +53,10 @@ void init() { LifecycleEvent.SERVER_STARTED.register(this::serverStarted); LifecycleEvent.SERVER_STOPPING.register(this::serverStopped); LifecycleEvent.SERVER_LEVEL_SAVE.register(this::worldSaved); - FTBQuestsBlocks.register(); - FTBQuestsItems.register(); - FTBQuestsBlockEntities.register(); + ModBlocks.register(); + ModItems.register(); + ModDataComponents.register(); + ModBlockEntityTypes.register(); ClearFileCacheEvent.EVENT.register(this::fileCacheClear); TeamEvent.PLAYER_LOGGED_IN.register(this::playerLoggedIn); TeamEvent.CREATED.register(this::teamCreated); @@ -195,7 +197,7 @@ private void cloned(ServerPlayer oldPlayer, ServerPlayer newPlayer, boolean wonG for (int i = 0; i < oldPlayer.getInventory().items.size(); i++) { ItemStack stack = oldPlayer.getInventory().items.get(i); - if (stack.getItem() == FTBQuestsItems.BOOK.get() && newPlayer.addItem(stack)) { + if (stack.getItem() == ModItems.BOOK.get() && newPlayer.addItem(stack)) { oldPlayer.getInventory().items.set(i, ItemStack.EMPTY); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/block/DetectorBlock.java b/common/src/main/java/dev/ftb/mods/ftbquests/block/DetectorBlock.java index a80302f03..f04b7bc08 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/block/DetectorBlock.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/block/DetectorBlock.java @@ -3,6 +3,7 @@ import com.mojang.serialization.MapCodec; import dev.ftb.mods.ftbquests.block.entity.DetectorBlockEntity; import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; @@ -62,7 +63,7 @@ public void neighborChanged(BlockState blockState, Level level, BlockPos blockPo public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity entity, ItemStack stack) { super.setPlacedBy(level, pos, state, entity, stack); - if (!level.isClientSide() && stack.hasCustomHoverName() && level.getBlockEntity(pos) instanceof DetectorBlockEntity dbe) { + if (!level.isClientSide() && stack.has(DataComponents.CUSTOM_NAME) && level.getBlockEntity(pos) instanceof DetectorBlockEntity dbe) { dbe.update(stack.getHoverName().getString()); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/block/LootCrateOpenerBlock.java b/common/src/main/java/dev/ftb/mods/ftbquests/block/LootCrateOpenerBlock.java index c4296b3ea..adab31b71 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/block/LootCrateOpenerBlock.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/block/LootCrateOpenerBlock.java @@ -5,7 +5,6 @@ import dev.ftb.mods.ftbquests.block.entity.LootCrateOpenerBlockEntity; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -50,7 +49,7 @@ public RenderShape getRenderShape(BlockState state) { } @Override - public InteractionResult use(BlockState blockState, Level level, BlockPos blockPos, Player player, InteractionHand interactionHand, BlockHitResult blockHitResult) { + protected InteractionResult useWithoutItem(BlockState blockState, Level level, BlockPos blockPos, Player player, BlockHitResult blockHitResult) { if (!level.isClientSide) { if (level.getBlockEntity(blockPos) instanceof LootCrateOpenerBlockEntity opener) { player.displayClientMessage(Component.translatable("block.ftbquests.loot_crate_opener.rightclick", opener.getOutputCount()), true); @@ -68,5 +67,4 @@ public void setPlacedBy(Level level, BlockPos blockPos, BlockState blockState, @ opener.setOwner(livingEntity.getUUID()); } } - } 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 86ad3187a..489147e00 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 @@ -8,6 +8,7 @@ import net.fabricmc.api.Environment; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.component.DataComponents; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -44,7 +45,7 @@ public class QuestBarrierBlock extends BaseEntityBlock { .lightLevel(blockState -> 3) .emissiveRendering((blockState, blockGetter, blockPos) -> true); - protected QuestBarrierBlock(Properties props) { + public QuestBarrierBlock(Properties props) { super(props); registerDefaultState(defaultBlockState().setValue(OPEN, false)); @@ -102,7 +103,7 @@ public boolean skipRendering(BlockState state, BlockState state2, Direction dir) public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity entity, ItemStack stack) { super.setPlacedBy(level, pos, state, entity, stack); - if (!level.isClientSide() && stack.hasCustomHoverName() && level.getBlockEntity(pos) instanceof BarrierBlockEntity barrier) { + if (!level.isClientSide() && stack.has(DataComponents.CUSTOM_NAME) && level.getBlockEntity(pos) instanceof BarrierBlockEntity barrier) { barrier.update(stack.getHoverName().getString()); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/block/StageBarrierBlock.java b/common/src/main/java/dev/ftb/mods/ftbquests/block/StageBarrierBlock.java index ba1874678..382d9e29c 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/block/StageBarrierBlock.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/block/StageBarrierBlock.java @@ -10,7 +10,7 @@ public class StageBarrierBlock extends QuestBarrierBlock { private static final MapCodec CODEC = simpleCodec(StageBarrierBlock::new); - protected StageBarrierBlock(Properties props) { + public StageBarrierBlock(Properties props) { super(props); } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/block/TaskScreenBlock.java b/common/src/main/java/dev/ftb/mods/ftbquests/block/TaskScreenBlock.java index 639b6327d..87feff01f 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/block/TaskScreenBlock.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/block/TaskScreenBlock.java @@ -4,30 +4,33 @@ import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import dev.architectury.injectables.annotations.ExpectPlatform; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftbquests.block.entity.ITaskScreen; import dev.ftb.mods.ftbquests.block.entity.TaskScreenAuxBlockEntity; import dev.ftb.mods.ftbquests.block.entity.TaskScreenBlockEntity; import dev.ftb.mods.ftbquests.client.FTBQuestsClient; import dev.ftb.mods.ftbquests.item.ScreenBlockItem; -import dev.ftb.mods.ftbquests.net.TaskScreenConfigRequest; +import dev.ftb.mods.ftbquests.net.TaskScreenConfigRequestMessage; import dev.ftb.mods.ftbquests.quest.BaseQuestFile; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.quest.task.Task; +import dev.ftb.mods.ftbquests.registry.ModBlocks; import dev.ftb.mods.ftbteams.api.FTBTeamsAPI; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.CustomData; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; @@ -40,12 +43,11 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.DirectionProperty; -import net.minecraft.world.phys.AABB; +import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.phys.BlockHitResult; import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Objects; public class TaskScreenBlock extends BaseEntityBlock { private static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> @@ -59,7 +61,7 @@ public class TaskScreenBlock extends BaseEntityBlock { private final int size; - protected TaskScreenBlock(Properties props, int size) { + public TaskScreenBlock(Properties props, int size) { super(props); this.size = size; @@ -132,7 +134,7 @@ public void setPlacedBy(Level level, BlockPos blockPos, BlockState blockState, @ } Direction facing = blockState.getValue(FACING); - BlockState auxState = FTBQuestsBlocks.AUX_SCREEN.get().defaultBlockState().setValue(FACING, facing); + BlockState auxState = ModBlocks.AUX_SCREEN.get().defaultBlockState().setValue(FACING, facing); BlockPos.betweenClosedStream(getMultiblockBounds(blockPos, getSize(), facing)) .filter(pos -> !pos.equals(blockPos)) .forEach(auxPos -> { @@ -168,10 +170,11 @@ public float getDestroyProgress(BlockState blockState, Player player, BlockGette } @Override - public InteractionResult use(BlockState blockState, Level level, BlockPos blockPos, Player player, InteractionHand interactionHand, BlockHitResult blockHitResult) { + protected InteractionResult useWithoutItem(BlockState blockState, Level level, BlockPos blockPos, Player player, BlockHitResult blockHitResult) { if (player instanceof ServerPlayer sp && level.getBlockEntity(blockPos) instanceof ITaskScreen taskScreen) { if (hasPermissionToEdit(sp, taskScreen)) { - taskScreen.getCoreScreen().ifPresent(coreScreen -> new TaskScreenConfigRequest(coreScreen.getBlockPos()).sendTo(sp)); + taskScreen.getCoreScreen().ifPresent(coreScreen -> + NetworkManager.sendToPlayer(sp, new TaskScreenConfigRequestMessage(coreScreen.getBlockPos()))); } else { sp.displayClientMessage(Component.translatable("block.ftbquests.screen.no_permission").withStyle(ChatFormatting.RED), true); return InteractionResult.FAIL; @@ -181,11 +184,12 @@ public InteractionResult use(BlockState blockState, Level level, BlockPos blockP } @Override - public void appendHoverText(ItemStack itemStack, @Nullable BlockGetter blockGetter, List list, TooltipFlag tooltipFlag) { - super.appendHoverText(itemStack, blockGetter, list, tooltipFlag); + public void appendHoverText(ItemStack itemStack, Item.TooltipContext context, List list, TooltipFlag tooltipFlag) { + super.appendHoverText(itemStack, context, list, tooltipFlag); - if (itemStack.getTag() != null && itemStack.getTag().contains("BlockEntityTag", Tag.TAG_COMPOUND)) { - CompoundTag subTag = Objects.requireNonNull(itemStack.getTagElement("BlockEntityTag")); + CustomData data = itemStack.get(DataComponents.BLOCK_ENTITY_DATA); + if (data != null) { + CompoundTag subTag = data.copyTag(); BaseQuestFile questFile = FTBQuestsClient.getClientQuestFile(); if (questFile != null) { Task task = questFile.getTask(subTag.getLong("TaskID")); @@ -218,22 +222,21 @@ public static boolean hasPermissionToEdit(ServerPlayer player, ITaskScreen scree * @param facing the side the display screen is on * @return the bounding box containing all blocks of the multiblock */ - public static AABB getMultiblockBounds(BlockPos corePos, int size, Direction facing) { - if (size == 1) return new AABB(corePos); + public static BoundingBox getMultiblockBounds(BlockPos corePos, int size, Direction facing) { + if (size == 1) return new BoundingBox(corePos); int size2 = size / 2; facing = facing.getCounterClockWise(); - return new AABB( - corePos.getX() - size2 * facing.getStepX(), corePos.getY(), corePos.getZ() - size2 * facing.getStepZ(), - corePos.getX() + size2 * facing.getStepX(), corePos.getY() + size - 1, corePos.getZ() + size2 * facing.getStepZ() - ); + BlockPos pos1 = new BlockPos(corePos.getX() - size2 * facing.getStepX(), corePos.getY(), corePos.getZ() - size2 * facing.getStepZ()); + BlockPos pos2 = new BlockPos(corePos.getX() + size2 * facing.getStepX(), corePos.getY() + size - 1, corePos.getZ() + size2 * facing.getStepZ()); + return BoundingBox.fromCorners(pos1, pos2); } public static class Aux extends TaskScreenBlock { private static final MapCodec CODEC = simpleCodec(Aux::new); - protected Aux(Properties props) { + public Aux(Properties props) { super(props, 0); } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/DetectorBlockEntity.java b/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/DetectorBlockEntity.java index 6a679b056..65770abfe 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/DetectorBlockEntity.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/DetectorBlockEntity.java @@ -4,8 +4,10 @@ import dev.ftb.mods.ftbquests.quest.QuestObjectBase; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.quest.TeamData; +import dev.ftb.mods.ftbquests.registry.ModBlockEntityTypes; import dev.ftb.mods.ftbquests.util.ProgressChange; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; @@ -18,19 +20,19 @@ public class DetectorBlockEntity extends BlockEntity { private int radius = 8; public DetectorBlockEntity(BlockPos blockPos, BlockState blockState) { - super(FTBQuestsBlockEntities.DETECTOR.get(), blockPos, blockState); + super(ModBlockEntityTypes.DETECTOR.get(), blockPos, blockState); } @Override - public void load(CompoundTag tag) { - super.load(tag); + public void loadAdditional(CompoundTag tag, HolderLookup.Provider provider) { + super.loadAdditional(tag, provider); objectId = QuestObjectBase.parseCodeString(tag.getString("Object")); radius = tag.getInt("Radius"); } @Override - public void saveAdditional(CompoundTag tag) { + public void saveAdditional(CompoundTag tag, HolderLookup.Provider provider) { tag.putString("Object", QuestObjectBase.getCodeString(objectId)); tag.putInt("Radius", radius); } @@ -49,7 +51,7 @@ public void onPowered(Level level, BlockPos pos) { AABB box = new AABB(pos).inflate(radius); for (ServerPlayer player : level.getEntitiesOfClass(ServerPlayer.class, box, DetectorBlockEntity::isRealPlayer)) { TeamData data = ServerQuestFile.INSTANCE.getOrCreateTeamData(player); - qo.forceProgressRaw(data, new ProgressChange(ServerQuestFile.INSTANCE, qo, player.getUUID()).setReset(false).withNotifications()); + qo.forceProgressRaw(data, new ProgressChange(qo, player.getUUID()).setReset(false).withNotifications()); } } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/LootCrateOpenerBlockEntity.java b/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/LootCrateOpenerBlockEntity.java index 094a7cacc..c2ef947bf 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/LootCrateOpenerBlockEntity.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/LootCrateOpenerBlockEntity.java @@ -3,12 +3,17 @@ import dev.ftb.mods.ftbquests.item.LootCrateItem; import dev.ftb.mods.ftbquests.quest.loot.LootCrate; import dev.ftb.mods.ftbquests.quest.loot.WeightedReward; +import dev.ftb.mods.ftbquests.registry.ModBlockEntityTypes; +import dev.ftb.mods.ftbquests.registry.ModDataComponents; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponentMap; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemContainerContents; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -22,18 +27,18 @@ public class LootCrateOpenerBlockEntity extends BlockEntity { private final Map outputs = new LinkedHashMap<>(); public LootCrateOpenerBlockEntity(BlockPos blockPos, BlockState blockState) { - super(FTBQuestsBlockEntities.LOOT_CRATE_OPENER.get(), blockPos, blockState); + super(ModBlockEntityTypes.LOOT_CRATE_OPENER.get(), blockPos, blockState); } @Override - public void load(CompoundTag compoundTag) { - super.load(compoundTag); + public void loadAdditional(CompoundTag compoundTag, HolderLookup.Provider provider) { + super.loadAdditional(compoundTag, provider); outputs.clear(); ListTag itemTag = compoundTag.getList("Items", Tag.TAG_COMPOUND); itemTag.forEach(el -> { if (el instanceof CompoundTag tag) { - ItemStack stack = ItemStack.of(tag.getCompound("item")); + ItemStack stack = ItemStack.parseOptional(provider, tag.getCompound("item")); int amount = tag.getInt("amount"); outputs.put(new ItemEntry(stack), amount); } @@ -43,13 +48,13 @@ public void load(CompoundTag compoundTag) { } @Override - protected void saveAdditional(CompoundTag compoundTag) { - super.saveAdditional(compoundTag); + protected void saveAdditional(CompoundTag compoundTag, HolderLookup.Provider provider) { + super.saveAdditional(compoundTag, provider); ListTag itemTag = new ListTag(); outputs.forEach((item, amount) -> { CompoundTag tag = new CompoundTag(); - tag.put("item", item.stack.save(new CompoundTag())); + tag.put("item", item.stack.save(provider, new CompoundTag())); tag.putInt("amount", amount); itemTag.add(tag); }); @@ -58,6 +63,23 @@ protected void saveAdditional(CompoundTag compoundTag) { if (owner != null) compoundTag.putUUID("Owner", owner); } + @Override + protected void applyImplicitComponents(DataComponentInput dataComponentInput) { + super.applyImplicitComponents(dataComponentInput); + + outputs.clear(); + dataComponentInput.getOrDefault(ModDataComponents.LOOT_CRATE_ITEMS.get(), ItemContainerContents.EMPTY) + .stream().forEach(stack -> outputs.put(new ItemEntry(stack), stack.getCount())); + } + + @Override + protected void collectImplicitComponents(DataComponentMap.Builder builder) { + super.collectImplicitComponents(builder); + + builder.set(ModDataComponents.LOOT_CRATE_ITEMS.get(), + ItemContainerContents.fromItems(outputs.keySet().stream().map(ItemEntry::stack).toList())); + } + public UUID getOwner() { return owner; } @@ -71,7 +93,7 @@ public int getOutputCount() { } /** - * Allow using an itemstack as a key (keyed by item and tag if present, not amount) + * Allow using an itemstack as a key (keyed by item and any components, but not the count) * * @param stack the itemstack */ @@ -80,16 +102,12 @@ private record ItemEntry(ItemStack stack) { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - ItemEntry itemEntry = (ItemEntry) o; - return stack.getItem() == itemEntry.stack.getItem() - && (stack.getTag() == null || stack.getTag().equals(itemEntry.stack.getTag())); + return ItemStack.isSameItemSameComponents(stack, ((ItemEntry) o).stack); } @Override public int hashCode() { - return stack.getTag() != null ? - Objects.hash(stack.getItem(), stack.getTag().hashCode()) : - Objects.hash(stack.getItem()); + return ItemStack.hashItemAndComponents(stack); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/QuestBarrierBlockEntity.java b/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/QuestBarrierBlockEntity.java index e82c9efd1..05c280b92 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/QuestBarrierBlockEntity.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/QuestBarrierBlockEntity.java @@ -5,7 +5,9 @@ import dev.ftb.mods.ftbquests.quest.QuestObject; import dev.ftb.mods.ftbquests.quest.QuestObjectBase; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; +import dev.ftb.mods.ftbquests.registry.ModBlockEntityTypes; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; @@ -20,18 +22,18 @@ public class QuestBarrierBlockEntity extends BlockEntity implements BarrierBlock private long objId = 0L; public QuestBarrierBlockEntity(BlockPos blockPos, BlockState blockState) { - super(FTBQuestsBlockEntities.BARRIER.get(), blockPos, blockState); + super(ModBlockEntityTypes.BARRIER.get(), blockPos, blockState); } @Override - public void load(CompoundTag tag) { - super.load(tag); + public void loadAdditional(CompoundTag tag, HolderLookup.Provider provider) { + super.loadAdditional(tag, provider); objId = QuestObjectBase.parseCodeString(tag.getString("Object")); } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider provider) { + super.saveAdditional(tag, provider); tag.putString("Object", QuestObjectBase.getCodeString(objId)); } @@ -42,8 +44,8 @@ public Packet getUpdatePacket() { } @Override - public CompoundTag getUpdateTag() { - return saveWithoutMetadata(); + public CompoundTag getUpdateTag(HolderLookup.Provider provider) { + return saveWithoutMetadata(provider); } @Override diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/StageBarrierBlockEntity.java b/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/StageBarrierBlockEntity.java index 417cb4015..76ec01722 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/StageBarrierBlockEntity.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/StageBarrierBlockEntity.java @@ -1,7 +1,9 @@ package dev.ftb.mods.ftbquests.block.entity; import dev.ftb.mods.ftblibrary.integration.stages.StageHelper; +import dev.ftb.mods.ftbquests.registry.ModBlockEntityTypes; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; @@ -19,18 +21,18 @@ public class StageBarrierBlockEntity extends BlockEntity implements BarrierBlock private String stage = ""; public StageBarrierBlockEntity(BlockPos blockPos, BlockState blockState) { - super(FTBQuestsBlockEntities.STAGE_BARRIER.get(), blockPos, blockState); + super(ModBlockEntityTypes.STAGE_BARRIER.get(), blockPos, blockState); } @Override - public void load(CompoundTag tag) { - super.load(tag); + public void loadAdditional(CompoundTag tag, HolderLookup.Provider provider) { + super.loadAdditional(tag, provider); stage = tag.getString("Stage"); } @Override - public void saveAdditional(CompoundTag tag) { - super.saveAdditional(tag); + public void saveAdditional(CompoundTag tag, HolderLookup.Provider provider) { + super.saveAdditional(tag, provider); tag.putString("Stage", stage); } @@ -41,8 +43,8 @@ public Packet getUpdatePacket() { } @Override - public CompoundTag getUpdateTag() { - return saveWithoutMetadata(); + public CompoundTag getUpdateTag(HolderLookup.Provider provider) { + return saveWithoutMetadata(provider); } @Override diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/TaskScreenAuxBlockEntity.java b/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/TaskScreenAuxBlockEntity.java index db0542c79..dc33823ad 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/TaskScreenAuxBlockEntity.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/TaskScreenAuxBlockEntity.java @@ -1,7 +1,9 @@ package dev.ftb.mods.ftbquests.block.entity; +import dev.ftb.mods.ftbquests.registry.ModBlockEntityTypes; import net.minecraft.Util; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.network.chat.Component; @@ -21,7 +23,7 @@ public class TaskScreenAuxBlockEntity extends BlockEntity implements ITaskScreen private BlockPos corePosPending; // non-null after NBT load & before querying/resolving public TaskScreenAuxBlockEntity(BlockPos blockPos, BlockState blockState) { - super(FTBQuestsBlockEntities.AUX_TASK_SCREEN.get(), blockPos, blockState); + super(ModBlockEntityTypes.AUX_TASK_SCREEN.get(), blockPos, blockState); } @Override @@ -31,16 +33,18 @@ public Component getName() { @Override public Optional getCoreScreen() { - if (corePosPending != null) { + if (corePosPending != null && level != null) { // first core screen query since loaded from NBT - TaskScreenBlockEntity core = level.getBlockEntity(corePosPending, FTBQuestsBlockEntities.CORE_TASK_SCREEN.get()).orElse(null); - if (core != null) { - coreScreen = new WeakReference<>(core); - corePosPending = null; - } else { - // something's gone wrong & the core no longer exists? - level.destroyBlock(getBlockPos(), false, null); - } + level.getBlockEntity(corePosPending, ModBlockEntityTypes.CORE_TASK_SCREEN.get()).ifPresentOrElse( + core -> { + coreScreen = new WeakReference<>(core); + corePosPending = null; + }, + () -> { + // something's gone wrong & the core no longer exists? + level.destroyBlock(getBlockPos(), false, null); + } + ); } return Optional.ofNullable(coreScreen.get()); } @@ -54,14 +58,14 @@ public void setCoreScreen(@NotNull TaskScreenBlockEntity coreScreen) { } @Override - public void load(CompoundTag compoundTag) { - super.load(compoundTag); - corePosPending = compoundTag.contains("CorePos") ? NbtUtils.readBlockPos(compoundTag.getCompound("CorePos")) : null; + public void loadAdditional(CompoundTag compoundTag, HolderLookup.Provider provider) { + super.loadAdditional(compoundTag, provider); + corePosPending = NbtUtils.readBlockPos(compoundTag, "CorePos").orElse(null); } @Override - protected void saveAdditional(CompoundTag compoundTag) { - super.saveAdditional(compoundTag); + protected void saveAdditional(CompoundTag compoundTag, HolderLookup.Provider provider) { + super.saveAdditional(compoundTag, provider); if (corePosPending != null) { compoundTag.put("CorePos", NbtUtils.writeBlockPos(corePosPending)); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/TaskScreenBlockEntity.java b/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/TaskScreenBlockEntity.java index f12018809..50bb0b807 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/TaskScreenBlockEntity.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/TaskScreenBlockEntity.java @@ -1,22 +1,33 @@ package dev.ftb.mods.ftbquests.block.entity; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.BooleanConfig; import dev.ftb.mods.ftblibrary.config.ConfigGroup; import dev.ftb.mods.ftblibrary.config.ItemStackConfig; import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; -import dev.ftb.mods.ftbquests.block.FTBQuestsBlocks; import dev.ftb.mods.ftbquests.block.TaskScreenBlock; import dev.ftb.mods.ftbquests.client.FTBQuestsClient; -import dev.ftb.mods.ftbquests.net.TaskScreenConfigResponse; +import dev.ftb.mods.ftbquests.net.TaskScreenConfigResponseMessage; import dev.ftb.mods.ftbquests.quest.BaseQuestFile; import dev.ftb.mods.ftbquests.quest.QuestObjectBase; import dev.ftb.mods.ftbquests.quest.TeamData; import dev.ftb.mods.ftbquests.quest.task.Task; +import dev.ftb.mods.ftbquests.registry.ModBlockEntityTypes; +import dev.ftb.mods.ftbquests.registry.ModBlocks; +import dev.ftb.mods.ftbquests.registry.ModDataComponents; import dev.ftb.mods.ftbquests.util.ConfigQuestObject; import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponentMap; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; @@ -47,7 +58,7 @@ public class TaskScreenBlockEntity extends BlockEntity implements ITaskScreen { private TeamData cachedTeamData = null; public TaskScreenBlockEntity(BlockPos blockPos, BlockState blockState) { - super(FTBQuestsBlockEntities.CORE_TASK_SCREEN.get(), blockPos, blockState); + super(ModBlockEntityTypes.CORE_TASK_SCREEN.get(), blockPos, blockState); } public Task getTask() { @@ -138,7 +149,7 @@ public Optional getCoreScreen() { public void removeAllAuxScreens() { if (level != null && getBlockState().getBlock() instanceof TaskScreenBlock tsb) { BlockPos.betweenClosedStream(TaskScreenBlock.getMultiblockBounds(getBlockPos(), tsb.getSize(), getBlockState().getValue(FACING))).forEach(pos -> { - if (level.getBlockState(pos).getBlock() == FTBQuestsBlocks.AUX_SCREEN.get()) { + if (level.getBlockState(pos).getBlock() == ModBlocks.AUX_SCREEN.get()) { level.removeBlock(pos, false); } }); @@ -152,43 +163,61 @@ public Packet getUpdatePacket() { } @Override - public CompoundTag getUpdateTag() { - return saveWithoutMetadata(); + public CompoundTag getUpdateTag(HolderLookup.Provider provider) { + return saveWithoutMetadata(provider); } @Override - public void load(CompoundTag compoundTag) { - super.load(compoundTag); + public void loadAdditional(CompoundTag compoundTag, HolderLookup.Provider provider) { + super.loadAdditional(compoundTag, provider); teamId = compoundTag.hasUUID("TeamID") ? compoundTag.getUUID("TeamID") : Util.NIL_UUID; - taskId = compoundTag.getLong("TaskID"); - skin = compoundTag.contains("Skin") ? ItemStack.of(compoundTag.getCompound("Skin")) : ItemStack.EMPTY; - indestructible = compoundTag.getBoolean("Indestructible"); - inputOnly = compoundTag.getBoolean("InputOnly"); - inputModeIcon = compoundTag.contains("InputModeIcon") ? ItemStack.of(compoundTag.getCompound("InputModeIcon")) : ItemStack.EMPTY; - textShadow = compoundTag.getBoolean("TextShadow"); + + TaskScreenSaveData data = TaskScreenSaveData.CODEC.parse(NbtOps.INSTANCE, compoundTag.getCompound("savedData")) + .result().orElse(TaskScreenSaveData.DEFAULT); + applySavedData(data); task = null; fakeTextureUV = null; // force recalc } @Override - protected void saveAdditional(CompoundTag compoundTag) { - super.saveAdditional(compoundTag); + protected void saveAdditional(CompoundTag compoundTag, HolderLookup.Provider provider) { + super.saveAdditional(compoundTag, provider); if (teamId != Util.NIL_UUID) compoundTag.putUUID("TeamID", teamId); - if (taskId != 0L) compoundTag.putLong("TaskID", taskId); - if (!skin.isEmpty()) compoundTag.put("Skin", skin.save(new CompoundTag())); - if (indestructible) compoundTag.putBoolean("Indestructible", true); - if (inputOnly) compoundTag.putBoolean("InputOnly", true); - if (!inputModeIcon.isEmpty()) compoundTag.put("InputModeIcon", inputModeIcon.save(new CompoundTag())); - if (textShadow) compoundTag.putBoolean("TextShadow", true); + + TaskScreenSaveData.CODEC.encodeStart(NbtOps.INSTANCE, TaskScreenSaveData.fromBlockEntity(this)) + .ifSuccess(tag -> compoundTag.put("savedData", tag)); + } + + @Override + protected void applyImplicitComponents(DataComponentInput dataComponentInput) { + super.applyImplicitComponents(dataComponentInput); + + applySavedData(dataComponentInput.getOrDefault(ModDataComponents.TASK_SCREEN_SAVED.get(), TaskScreenSaveData.DEFAULT)); + } + + @Override + protected void collectImplicitComponents(DataComponentMap.Builder builder) { + super.collectImplicitComponents(builder); + + builder.set(ModDataComponents.TASK_SCREEN_SAVED.get(), TaskScreenSaveData.fromBlockEntity(this)); + } + + private void applySavedData(TaskScreenSaveData data) { + taskId = data.taskId; + skin = data.skin; + indestructible = data.indestructible; + inputOnly = data.inputOnly; + inputModeIcon = data.inputModeIcon; + textShadow = data.textShadow; } public ConfigGroup fillConfigGroup(TeamData data) { ConfigGroup cg0 = new ConfigGroup("task_screen", accepted -> { if (accepted) { - new TaskScreenConfigResponse(this).sendToServer(); + NetworkManager.sendToServer(new TaskScreenConfigResponseMessage(getBlockPos(), saveWithoutMetadata(getLevel().registryAccess()))); } }); @@ -225,4 +254,33 @@ public float[] getFakeTextureUV() { } return fakeTextureUV; } + + public record TaskScreenSaveData(long taskId, ItemStack skin, boolean indestructible, boolean inputOnly, ItemStack inputModeIcon, boolean textShadow) { + public static TaskScreenSaveData DEFAULT = new TaskScreenSaveData( + 0L, ItemStack.EMPTY, false, false, ItemStack.EMPTY, false + ); + + public static TaskScreenSaveData fromBlockEntity(TaskScreenBlockEntity b) { + return new TaskScreenSaveData(b.taskId, b.skin, b.indestructible, b.inputOnly, b.inputModeIcon, b.textShadow); + } + + public static final Codec CODEC = RecordCodecBuilder.create(builder -> builder.group( + Codec.LONG.optionalFieldOf("taskId", 0L).forGetter(TaskScreenSaveData::taskId), + ItemStack.CODEC.optionalFieldOf("skin", ItemStack.EMPTY).forGetter(TaskScreenSaveData::skin), + Codec.BOOL.optionalFieldOf("indestructible", false).forGetter(TaskScreenSaveData::indestructible), + Codec.BOOL.optionalFieldOf("input_only", false).forGetter(TaskScreenSaveData::inputOnly), + ItemStack.CODEC.optionalFieldOf("skin", ItemStack.EMPTY).forGetter(TaskScreenSaveData::inputModeIcon), + Codec.BOOL.optionalFieldOf("text_shadow", false).forGetter(TaskScreenSaveData::textShadow) + ).apply(builder, TaskScreenSaveData::new)); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, TaskScreenSaveData::taskId, + ItemStack.OPTIONAL_STREAM_CODEC, TaskScreenSaveData::skin, + ByteBufCodecs.BOOL, TaskScreenSaveData::indestructible, + ByteBufCodecs.BOOL, TaskScreenSaveData::inputOnly, + ItemStack.OPTIONAL_STREAM_CODEC, TaskScreenSaveData::inputModeIcon, + ByteBufCodecs.BOOL, TaskScreenSaveData::textShadow, + TaskScreenSaveData::new + ); + } } 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 c2e834ca1..14fecf735 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 @@ -1,8 +1,10 @@ package dev.ftb.mods.ftbquests.client; import com.mojang.blaze3d.platform.InputConstants; +import dev.architectury.networking.NetworkManager; import dev.architectury.utils.Env; import dev.ftb.mods.ftblibrary.icon.Icons; +import dev.ftb.mods.ftblibrary.util.TooltipList; import dev.ftb.mods.ftblibrary.util.client.ClientUtils; import dev.ftb.mods.ftbquests.FTBQuests; import dev.ftb.mods.ftbquests.client.gui.CustomToast; @@ -14,12 +16,14 @@ import dev.ftb.mods.ftbquests.quest.TeamData; import dev.ftb.mods.ftbquests.quest.task.StructureTask; import dev.ftb.mods.ftbquests.quest.theme.QuestTheme; +import dev.ftb.mods.ftbquests.quest.translation.TranslationKey; import dev.ftb.mods.ftbquests.util.TextUtils; import dev.ftb.mods.ftbteams.api.FTBTeamsAPI; import dev.ftb.mods.ftbteams.api.client.KnownClientPlayer; import net.minecraft.ChatFormatting; import net.minecraft.Util; import net.minecraft.client.Minecraft; +import net.minecraft.core.HolderLookup; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; @@ -119,7 +123,8 @@ private QuestScreen openQuestGui() { if (isDisableGui() && !canEdit()) { Minecraft.getInstance().getToasts().addToast(new CustomToast(Component.translatable("item.ftbquests.book.disabled"), Icons.BARRIER, Component.empty())); } else if (selfTeamData.isLocked()) { - Minecraft.getInstance().getToasts().addToast(new CustomToast(lockMessage.isEmpty() ? Component.literal("Quests locked!") : TextUtils.parseRawText(lockMessage), Icons.BARRIER, Component.empty())); + Component msg = lockMessage.isEmpty() ? Component.literal("Quests locked!") : TextUtils.parseRawText(lockMessage, holderLookup()); + Minecraft.getInstance().getToasts().addToast(new CustomToast(msg, Icons.BARRIER, Component.empty())); } else { if (canEdit()) { StructureTask.maybeRequestStructureSync(); @@ -138,9 +143,14 @@ public Env getSide() { return Env.CLIENT; } + @Override + public HolderLookup.Provider holderLookup() { + return FTBQuestsClient.holderLookup(); + } + @Override public void deleteObject(long id) { - new DeleteObjectMessage(id).sendToServer(); + NetworkManager.sendToServer(new DeleteObjectMessage(id)); } @Override @@ -188,6 +198,12 @@ public boolean moveChapterGroup(long id, boolean movingUp) { return false; } + @Override + public String getLocale() { + String locale = FTBQuestsClientConfig.EDITING_LOCALE.get(); + return locale.isEmpty() ? Minecraft.getInstance().options.languageCode : locale; + } + public void setEditorPermission(boolean hasPermission) { editorPermission = hasPermission; } @@ -214,4 +230,15 @@ public static void openBookToQuestObject(long id) { } } } + + + public static void addTranslationWarning(TooltipList list, TranslationKey key) { + list.add(Component.translatable("ftbquests.message.missing_xlate_1", + Component.translatable(key.getTranslationKey()), + ClientQuestFile.INSTANCE.getLocale()) + .withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC) + ); + list.add(Component.translatable("ftbquests.message.missing_xlate_2") + .withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC)); + } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/ConfigIconItemStack.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/ConfigIconItemStack.java index a57ac303d..88176ae59 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/ConfigIconItemStack.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/ConfigIconItemStack.java @@ -7,8 +7,9 @@ import dev.ftb.mods.ftblibrary.config.ui.SelectItemStackScreen; import dev.ftb.mods.ftblibrary.ui.Widget; import dev.ftb.mods.ftblibrary.ui.input.MouseButton; -import dev.ftb.mods.ftbquests.item.FTBQuestsItems; -import net.minecraft.nbt.StringTag; +import dev.ftb.mods.ftbquests.item.CustomIconItem; +import dev.ftb.mods.ftbquests.registry.ModItems; +import net.minecraft.Util; import net.minecraft.world.item.ItemStack; public class ConfigIconItemStack extends ItemStackConfig { @@ -24,9 +25,8 @@ public void onClicked(Widget clickedWidget, MouseButton button, ConfigCallback c new SelectImageResourceScreen(imageConfig, accepted -> { if (accepted) { if (!imageConfig.getValue().equals(ImageResourceConfig.NONE)) { - ItemStack stack = new ItemStack(FTBQuestsItems.CUSTOM_ICON.get()); - stack.addTagElement("Icon", StringTag.valueOf(imageConfig.getValue().toString())); - setCurrentValue(stack); + setCurrentValue(Util.make(new ItemStack(ModItems.CUSTOM_ICON.get()), + s -> CustomIconItem.setIcon(s, imageConfig.getValue()))); } else { setCurrentValue(ItemStack.EMPTY); } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsClient.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsClient.java index 775cb22ef..de2348502 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsClient.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsClient.java @@ -2,22 +2,24 @@ import com.mojang.blaze3d.platform.InputConstants; import dev.architectury.event.events.client.ClientLifecycleEvent; +import dev.architectury.networking.NetworkManager; import dev.architectury.registry.ReloadListenerRegistry; import dev.architectury.registry.client.keymappings.KeyMappingRegistry; import dev.architectury.registry.client.rendering.RenderTypeRegistry; -import dev.ftb.mods.ftblibrary.config.*; -import dev.ftb.mods.ftblibrary.config.ui.*; +import dev.ftb.mods.ftblibrary.config.ImageResourceConfig; +import dev.ftb.mods.ftblibrary.config.ui.EditConfigScreen; import dev.ftb.mods.ftblibrary.ui.Widget; import dev.ftb.mods.ftblibrary.ui.input.MouseButton; import dev.ftb.mods.ftbquests.FTBQuests; -import dev.ftb.mods.ftbquests.block.FTBQuestsBlocks; import dev.ftb.mods.ftbquests.block.entity.TaskScreenBlockEntity; -import dev.ftb.mods.ftbquests.item.FTBQuestsItems; +import dev.ftb.mods.ftbquests.item.CustomIconItem; import dev.ftb.mods.ftbquests.net.SetCustomImageMessage; import dev.ftb.mods.ftbquests.quest.BaseQuestFile; import dev.ftb.mods.ftbquests.quest.QuestObjectBase; import dev.ftb.mods.ftbquests.quest.TeamData; import dev.ftb.mods.ftbquests.quest.theme.ThemeLoader; +import dev.ftb.mods.ftbquests.registry.ModBlocks; +import dev.ftb.mods.ftbquests.registry.ModItems; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -27,8 +29,8 @@ import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; import net.minecraft.core.RegistryAccess; -import net.minecraft.nbt.StringTag; import net.minecraft.server.packs.PackType; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; @@ -57,13 +59,13 @@ public static void init() { } private static void onClientSetup(Minecraft minecraft) { - RenderTypeRegistry.register(RenderType.translucent(), FTBQuestsBlocks.BARRIER.get()); - RenderTypeRegistry.register(RenderType.translucent(), FTBQuestsBlocks.STAGE_BARRIER.get()); - RenderTypeRegistry.register(RenderType.solid(), FTBQuestsBlocks.TASK_SCREEN_1.get()); - RenderTypeRegistry.register(RenderType.solid(), FTBQuestsBlocks.TASK_SCREEN_3.get()); - RenderTypeRegistry.register(RenderType.solid(), FTBQuestsBlocks.TASK_SCREEN_5.get()); - RenderTypeRegistry.register(RenderType.solid(), FTBQuestsBlocks.TASK_SCREEN_7.get()); - RenderTypeRegistry.register(RenderType.solid(), FTBQuestsBlocks.AUX_SCREEN.get()); + RenderTypeRegistry.register(RenderType.translucent(), ModBlocks.BARRIER.get()); + RenderTypeRegistry.register(RenderType.translucent(), ModBlocks.STAGE_BARRIER.get()); + RenderTypeRegistry.register(RenderType.solid(), ModBlocks.TASK_SCREEN_1.get()); + RenderTypeRegistry.register(RenderType.solid(), ModBlocks.TASK_SCREEN_3.get()); + RenderTypeRegistry.register(RenderType.solid(), ModBlocks.TASK_SCREEN_5.get()); + RenderTypeRegistry.register(RenderType.solid(), ModBlocks.TASK_SCREEN_7.get()); + RenderTypeRegistry.register(RenderType.solid(), ModBlocks.AUX_SCREEN.get()); GuiProviders.setTaskGuiProviders(); GuiProviders.setRewardGuiProviders(); } @@ -93,6 +95,10 @@ public static BaseQuestFile createClientQuestFile() { return new ClientQuestFile(); } + public static HolderLookup.Provider holderLookup() { + return getClientLevel().registryAccess(); + } + public static void openGui() { ClientQuestFile.openGui(); } @@ -102,12 +108,12 @@ public static void openCustomIconGui(Player player, InteractionHand hand) { config.onClicked(null, MouseButton.LEFT, accepted -> { if (accepted) { if (config.isEmpty()) { - player.getItemInHand(hand).removeTagKey("Icon"); + CustomIconItem.setIcon(player.getItemInHand(hand), null); } else { - player.getItemInHand(hand).addTagElement("Icon", StringTag.valueOf(config.getValue().toString())); + CustomIconItem.setIcon(player.getItemInHand(hand), config.getValue()); } - new SetCustomImageMessage(hand, config.getValue()).sendToServer(); + NetworkManager.sendToServer(new SetCustomImageMessage(hand, config.getValue())); } Minecraft.getInstance().setScreen(null); @@ -151,7 +157,7 @@ public static void rebuildCreativeTabs() { player.canUseGameMasterBlocks(), player.level().registryAccess() ); - FTBQuestsItems.CREATIVE_TAB.get().buildContents(params); + ModItems.CREATIVE_TAB.get().buildContents(params); CreativeModeTabs.searchTab().buildContents(params); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsClientConfig.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsClientConfig.java index c2287b339..b67fc61c6 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsClientConfig.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsClientConfig.java @@ -1,13 +1,13 @@ package dev.ftb.mods.ftbquests.client; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.ConfigGroup; import dev.ftb.mods.ftblibrary.config.ui.EditConfigScreen; -import dev.ftb.mods.ftblibrary.snbt.config.BooleanValue; -import dev.ftb.mods.ftblibrary.snbt.config.EnumValue; -import dev.ftb.mods.ftblibrary.snbt.config.IntValue; -import dev.ftb.mods.ftblibrary.snbt.config.SNBTConfig; +import dev.ftb.mods.ftblibrary.snbt.config.*; import dev.ftb.mods.ftblibrary.util.PanelPositioning; import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; +import dev.ftb.mods.ftbquests.client.config.LocaleValue; +import dev.ftb.mods.ftbquests.net.RequestTranslationTableMessage; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; @@ -24,12 +24,22 @@ public interface FTBQuestsClientConfig { IntValue PINNED_QUESTS_INSET_X = UI.addInt("pinned_quests_inset_x", 2); IntValue PINNED_QUESTS_INSET_Y = UI.addInt("pinned_quests_inset_y", 2); + SNBTConfig XLATE = CONFIG.addGroup("xlate", 1); + StringValue EDITING_LOCALE = XLATE.add(new LocaleValue(XLATE,"editing_locale", "")); + BooleanValue HILITE_MISSING = XLATE.addBoolean("hilite_missing", true); + // TODO migrate chapter-pinned and pinned-quests data out of per-player team data into here static void openSettings(Screen screen) { + String prevLocale = EDITING_LOCALE.get(); + ConfigGroup group = new ConfigGroup("ftbquests", accepted -> { if (accepted) { saveConfig(); + if (!prevLocale.equals(EDITING_LOCALE.get()) && ClientQuestFile.INSTANCE != null) { + NetworkManager.sendToServer(new RequestTranslationTableMessage(ClientQuestFile.INSTANCE.getLocale())); + ClientQuestFile.INSTANCE.clearCachedData(); + } } Minecraft.getInstance().setScreen(screen); }); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsClientEventHandler.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsClientEventHandler.java index dfe725314..81bdf7b06 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsClientEventHandler.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsClientEventHandler.java @@ -7,6 +7,7 @@ import dev.architectury.event.events.client.ClientPlayerEvent; import dev.architectury.event.events.client.ClientTickEvent; import dev.architectury.injectables.annotations.ExpectPlatform; +import dev.architectury.networking.NetworkManager; import dev.architectury.registry.client.rendering.BlockEntityRendererRegistry; import dev.architectury.registry.client.rendering.ColorHandlerRegistry; import dev.ftb.mods.ftblibrary.icon.Color4I; @@ -14,11 +15,10 @@ import dev.ftb.mods.ftblibrary.ui.CustomClickEvent; import dev.ftb.mods.ftblibrary.ui.GuiHelper; import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; -import dev.ftb.mods.ftbquests.block.entity.FTBQuestsBlockEntities; import dev.ftb.mods.ftbquests.block.entity.TaskScreenBlockEntity; import dev.ftb.mods.ftbquests.events.ClearFileCacheEvent; -import dev.ftb.mods.ftbquests.item.FTBQuestsItems; import dev.ftb.mods.ftbquests.item.LootCrateItem; +import dev.ftb.mods.ftbquests.net.RequestTranslationTableMessage; import dev.ftb.mods.ftbquests.net.SubmitTaskMessage; import dev.ftb.mods.ftbquests.quest.BaseQuestFile; import dev.ftb.mods.ftbquests.quest.Quest; @@ -28,6 +28,8 @@ import dev.ftb.mods.ftbquests.quest.task.StructureTask; import dev.ftb.mods.ftbquests.quest.task.Task; import dev.ftb.mods.ftbquests.quest.theme.property.ThemeProperties; +import dev.ftb.mods.ftbquests.registry.ModBlockEntityTypes; +import dev.ftb.mods.ftbquests.registry.ModItems; import it.unimi.dsi.fastutil.longs.LongSet; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -97,7 +99,7 @@ public static void onTextureStitchPost(TextureAtlas textureAtlas) { } private void registerBERs(Minecraft minecraft) { - BlockEntityRendererRegistry.register(FTBQuestsBlockEntities.CORE_TASK_SCREEN.get(), taskScreenRenderer()); + BlockEntityRendererRegistry.register(ModBlockEntityTypes.CORE_TASK_SCREEN.get(), taskScreenRenderer()); } @ExpectPlatform @@ -109,7 +111,7 @@ private void registerItemColors(Minecraft minecraft) { ColorHandlerRegistry.registerItemColors((stack, tintIndex) -> { LootCrate crate = LootCrateItem.getCrate(stack); return crate == null ? 0xFFFFFFFF : (0xFF000000 | crate.getColor().rgb()); - }, FTBQuestsItems.LOOTCRATE.get()); + }, ModItems.LOOTCRATE.get()); } private void onSidebarButtonCreated(SidebarButtonCreatedEvent event) { @@ -193,7 +195,7 @@ private void onClientTick(Minecraft mc) { } if (currentlyObservingTicks >= currentlyObserving.getTimer()) { - new SubmitTaskMessage(currentlyObserving.id).sendToServer(); + NetworkManager.sendToServer(new SubmitTaskMessage(currentlyObserving.id)); selfTeamData.addProgress(currentlyObserving, 1L); currentlyObserving = null; currentlyObservingTicks = 0L; @@ -209,6 +211,11 @@ private void onPlayerLogin(LocalPlayer localPlayer) { FTBQuestsClient.rebuildCreativeTabs(); creativeTabRebuildPending = false; } + + String locale = FTBQuestsClientConfig.EDITING_LOCALE.get(); + if (!locale.isEmpty() && !locale.equals(Minecraft.getInstance().options.languageCode)) { + NetworkManager.sendToServer(new RequestTranslationTableMessage(locale)); + } } private void onPlayerLogout(@Nullable LocalPlayer localPlayer) { diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsNetClient.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsNetClient.java index 962740a88..f6b80165e 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsNetClient.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/FTBQuestsNetClient.java @@ -24,12 +24,9 @@ import java.util.UUID; public class FTBQuestsNetClient { - public static void syncTeamData(boolean self, TeamData data) { + public static void syncTeamData(TeamData data) { ClientQuestFile.INSTANCE.addData(data, true); - - if (self) { - ClientQuestFile.INSTANCE.selfTeamData = data; - } + ClientQuestFile.INSTANCE.selfTeamData = data; } public static void claimReward(UUID teamId, UUID player, long rewardId) { @@ -51,17 +48,20 @@ public static void claimReward(UUID teamId, UUID player, long rewardId) { } } - public static void createObject(long id, long parent, QuestObjectType type, CompoundTag nbt, @Nullable CompoundTag extra, UUID creator) { - QuestObjectBase object = ClientQuestFile.INSTANCE.create(id, type, parent, extra == null ? new CompoundTag() : extra); - object.readData(nbt); + public static void createObject(long id, long parent, QuestObjectType type, CompoundTag nbt, CompoundTag extra, UUID creator) { + ClientQuestFile file = ClientQuestFile.INSTANCE; + + QuestObjectBase object = file.create(id, type, parent, extra); + object.readData(nbt, FTBQuestsClient.holderLookup()); + file.getTranslationManager().processInitialTranslation(extra, object); object.onCreated(); - ClientQuestFile.INSTANCE.refreshIDMap(); + file.refreshIDMap(); object.editedFromGUI(); FTBQuests.getRecipeModHelper().refreshRecipes(object); LocalPlayer player = Minecraft.getInstance().player; if (object instanceof QuestObject qo && player != null && creator.equals(player.getUUID())) { - ClientQuestFile.INSTANCE.getQuestScreen() + file.getQuestScreen() .ifPresent(questScreen -> questScreen.open(qo, true)); } @@ -74,14 +74,14 @@ public static void createObject(long id, long parent, QuestObjectType type, Comp public static void createOtherTeamData(TeamDataUpdate dataUpdate) { if (ClientQuestFile.INSTANCE != null) { - TeamData data = new TeamData(dataUpdate.uuid, ClientQuestFile.INSTANCE, dataUpdate.name); + TeamData data = new TeamData(dataUpdate.uuid(), ClientQuestFile.INSTANCE, dataUpdate.name()); ClientQuestFile.INSTANCE.addData(data, true); } } public static void teamDataChanged(TeamDataUpdate oldDataUpdate, TeamDataUpdate newDataUpdate) { if (ClientQuestFile.INSTANCE != null) { - TeamData data = new TeamData(newDataUpdate.uuid, ClientQuestFile.INSTANCE, newDataUpdate.name); + TeamData data = new TeamData(newDataUpdate.uuid(), ClientQuestFile.INSTANCE, newDataUpdate.name()); ClientQuestFile.INSTANCE.addData(data, false); } } @@ -95,6 +95,7 @@ public static void deleteObject(long id) { ClientQuestFile.INSTANCE.refreshIDMap(); object.editedFromGUI(); FTBQuests.getRecipeModHelper().refreshRecipes(object); + ClientQuestFile.INSTANCE.getTranslationManager().removeAllTranslations(object); } } @@ -121,7 +122,7 @@ public static void displayItemRewardToast(ItemStack stack, int count) { MutableComponent comp = count > 1 ? Component.literal(count + "x ").append(stack.getHoverName()) : stack.getHoverName().copy(); - Minecraft.getInstance().getToasts().addToast(new RewardToast(comp.withStyle(stack.getRarity().color), icon)); + Minecraft.getInstance().getToasts().addToast(new RewardToast(comp.withStyle(stack.getRarity().color()), icon)); } } @@ -138,7 +139,7 @@ public static void editObject(long id, CompoundTag nbt) { QuestObjectBase object = ClientQuestFile.INSTANCE.getBase(id); if (object != null) { - object.readData(nbt); + object.readData(nbt, FTBQuestsClient.holderLookup()); object.editedFromGUI(); FTBQuests.getRecipeModHelper().refreshRecipes(object); } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/GuiProviders.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/GuiProviders.java index 0d9abbc0d..5433124d1 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/GuiProviders.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/GuiProviders.java @@ -1,23 +1,28 @@ package dev.ftb.mods.ftbquests.client; import dev.ftb.mods.ftblibrary.config.*; -import dev.ftb.mods.ftblibrary.config.ui.*; +import dev.ftb.mods.ftblibrary.config.ui.EditConfigScreen; +import dev.ftb.mods.ftblibrary.config.ui.EditStringConfigOverlay; +import dev.ftb.mods.ftblibrary.config.ui.SelectFluidScreen; +import dev.ftb.mods.ftblibrary.config.ui.SelectItemStackScreen; import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.gui.SelectQuestObjectScreen; import dev.ftb.mods.ftbquests.quest.QuestObjectType; import dev.ftb.mods.ftbquests.quest.loot.RewardTable; import dev.ftb.mods.ftbquests.quest.reward.*; import dev.ftb.mods.ftbquests.quest.task.*; +import dev.ftb.mods.ftbquests.quest.translation.TranslationKey; import dev.ftb.mods.ftbquests.util.ConfigQuestObject; import net.minecraft.client.Minecraft; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.StructureBlockEntity; import net.minecraft.world.phys.BlockHitResult; -import java.util.function.Consumer; +import java.util.function.BiConsumer; public class GuiProviders { public static RewardType.GuiProvider defaultRewardGuiProvider(RewardType.Provider provider) { @@ -60,7 +65,7 @@ public static TaskType.GuiProvider defaultTaskGuiProvider(TaskType.Provider prov EditStringConfigOverlay overlay = new EditStringConfigOverlay<>(panel.getGui(), c, accepted -> { if (accepted) { slvTask.setValue(c.getValue()); - callback.accept(task); + callback.accept(task, task.getType().makeExtraNBT()); } panel.run(); }, task.getType().getDisplayName()).atMousePosition(); @@ -80,7 +85,7 @@ public static void setTaskGuiProviders() { gui.run(); if (accepted) { ItemTask itemTask = new ItemTask(0L, quest).setStackAndCount(c.getValue(), c.getValue().getCount()); - callback.accept(itemTask); + callback.accept(itemTask, itemTask.getType().makeExtraNBT()); } }).openGui(); }); @@ -93,7 +98,9 @@ public static void setTaskGuiProviders() { if (accepted) { CheckmarkTask checkmarkTask = new CheckmarkTask(0L, quest); checkmarkTask.setRawTitle(c.getValue()); - callback.accept(checkmarkTask); + CompoundTag extra = checkmarkTask.getType().makeExtraNBT(); + quest.getQuestFile().getTranslationManager().addInitialTranslation(extra, quest.getQuestFile().getLocale(), TranslationKey.TITLE, c.getValue()); + callback.accept(checkmarkTask, extra); } panel.run(); }, TaskTypes.CHECKMARK.getDisplayName()).atMousePosition(); @@ -108,7 +115,7 @@ public static void setTaskGuiProviders() { gui.run(); if (accepted) { FluidTask fluidTask = new FluidTask(0L, quest).setFluid(c.getValue()); - callback.accept(fluidTask); + callback.accept(fluidTask, fluidTask.getType().makeExtraNBT()); } }).openGui(); }); @@ -137,7 +144,7 @@ public static void setTaskGuiProviders() { if (blockEntity instanceof StructureBlockEntity structure) { task.initFromStructure(structure); - callback.accept(task); + callback.accept(task, task.getType().makeExtraNBT()); return; } } @@ -146,11 +153,11 @@ public static void setTaskGuiProviders() { }); } - private static void openSetupGui(Runnable gui, Consumer callback, Task task) { + private static void openSetupGui(Runnable gui, BiConsumer callback, Task task) { ConfigGroup group = new ConfigGroup(FTBQuestsAPI.MOD_ID, accepted -> { gui.run(); if (accepted) { - callback.accept(task); + callback.accept(task, new CompoundTag()); } }); task.fillConfigGroup(task.createSubGroup(group)); @@ -177,14 +184,13 @@ public static void setRewardGuiProviders() { IntConfig c = new IntConfig(1, Integer.MAX_VALUE); c.setValue(100); - EditStringConfigOverlay overlay = new EditStringConfigOverlay<>(panel, c, accepted -> { + EditStringConfigOverlay overlay = new EditStringConfigOverlay<>(panel.getGui(), c, accepted -> { if (accepted) { callback.accept(new XPReward(0L, quest, c.getValue())); } panel.run(); - }, RewardTypes.XP.getDisplayName()) - .atPosition(panel.width / 3, panel.height + 5); + }, RewardTypes.XP.getDisplayName()).atMousePosition(); panel.getGui().pushModalPanel(overlay); }); @@ -192,13 +198,12 @@ public static void setRewardGuiProviders() { IntConfig c = new IntConfig(1, Integer.MAX_VALUE); c.setValue(5); - EditStringConfigOverlay overlay = new EditStringConfigOverlay<>(panel, c, accepted -> { + EditStringConfigOverlay overlay = new EditStringConfigOverlay<>(panel.getGui(), c, accepted -> { if (accepted) { callback.accept(new XPLevelsReward(0L, quest, c.getValue())); } panel.run(); - }, RewardTypes.XP_LEVELS.getDisplayName()) - .atPosition(panel.width / 3, panel.height + 5); + }, RewardTypes.XP_LEVELS.getDisplayName()).atMousePosition(); panel.getGui().pushModalPanel(overlay); }); } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/TaskScreenRenderer.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/TaskScreenRenderer.java index 291b81ca5..1bf7b0268 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/TaskScreenRenderer.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/TaskScreenRenderer.java @@ -82,9 +82,9 @@ public void render(TaskScreenBlockEntity taskScreen, float partialTicks, PoseSta // render quest and task title at top of screen Component top1 = taskScreen.isInputOnly() ? Component.empty() : task.getQuest().getTitle(); Component top2 = taskScreen.isInputOnly() ? Component.empty() : task.getTitle(); - drawString(taskScreen, font, multiBufferSource, poseStack, top1, 0.02D, 0.15D); + drawString(taskScreen, font, multiBufferSource, poseStack, top1, 0.02D, 0.15F); if (!top2.equals(Component.empty())) { - drawString(taskScreen, font, multiBufferSource, poseStack, top2, 0.17D, 0.07D); + drawString(taskScreen, font, multiBufferSource, poseStack, top2, 0.17D, 0.07F); iconY = 0.54D; } @@ -93,7 +93,7 @@ public void render(TaskScreenBlockEntity taskScreen, float partialTicks, PoseSta long progress = data.getProgress(task); ChatFormatting col = progress == 0 ? ChatFormatting.GOLD : (progress < task.getMaxProgress() ? ChatFormatting.YELLOW : ChatFormatting.GREEN); Component txt = Component.literal(task.formatProgress(data, progress) + " / " + task.formatMaxProgress()).withStyle(col); - drawString(taskScreen, font, multiBufferSource, poseStack, txt, 0.83D, 0.15D); + drawString(taskScreen, font, multiBufferSource, poseStack, txt, 0.83D, 0.15F); } // render icon for task item/fluid/energy @@ -150,11 +150,11 @@ private void drawTaskIcon(TaskScreenBlockEntity taskScreen, TeamData data, Icon TextureAtlasSprite sprite = Minecraft.getInstance().getModelManager().getAtlas(InventoryMenu.BLOCK_ATLAS).getSprite(as.getId()); // fluid texture (interpolated according to task progress) if (progress > 0L) { - float heightInterpolated = 16f * (float) ((double) progress / task.getMaxProgress()); + float interpolatedProgress = (float) ((double) progress / task.getMaxProgress()); RenderUtil.create(poseStack, vertexConsumer, -8f, -8f) .withColor(FluidStackHooks.getColor(fluidTask.getFluid()) | 0xFF000000) - .withSize(16f, heightInterpolated) - .withUV(sprite.getU0(), sprite.getV0(), sprite.getU1(), sprite.getV(heightInterpolated)) + .withSize(16f, interpolatedProgress * 16f) + .withUV(sprite.getU0(), sprite.getV0(), sprite.getU1(), sprite.getV(interpolatedProgress)) .draw(); } // tank overlay @@ -170,11 +170,11 @@ private void drawTaskIcon(TaskScreenBlockEntity taskScreen, TeamData data, Icon .withUV(empty.getU0(), empty.getV0(), empty.getU1(), empty.getV1()) .draw(); if (progress > 0L) { - float heightInterpolated = 16f * (float) ((double) progress / task.getMaxProgress()); + float interpolatedProgress = (float) ((double) progress / task.getMaxProgress()); poseStack.translate(0, 0, -0.05f); RenderUtil.create(poseStack, vertexConsumer, -8f, -8f) - .withSize(16f, heightInterpolated) - .withUV(full.getU0(), full.getV0(), full.getU1(), full.getV(heightInterpolated)) + .withSize(16f, interpolatedProgress * 16f) + .withUV(full.getU0(), full.getV0(), full.getU1(), full.getV(interpolatedProgress)) .draw(); } } else if (icon instanceof ItemIcon itemIcon) { @@ -192,20 +192,20 @@ private void drawTaskIcon(TaskScreenBlockEntity taskScreen, TeamData data, Icon poseStack.popPose(); } - private void drawString(TaskScreenBlockEntity taskScreen, Font font, MultiBufferSource bufferSource, PoseStack poseStack, Component text, double y, double size) { + private void drawString(TaskScreenBlockEntity taskScreen, Font font, MultiBufferSource bufferSource, PoseStack poseStack, Component text, double y, float size) { if (!text.equals(Component.empty())) { poseStack.pushPose(); poseStack.translate(0.5D, y, 0D); int len = font.width(text); - float scale = (float) (size / 9F); - double width = len * scale; - if (width > 1D) { + float scale = size / 9F; + float width = len * scale; + if (width > 1F) { scale /= width; - width = 1D; + width = 1F; } - if (width > 0.9D) { - scale *= 0.9D; + if (width > 0.9F) { + scale *= 0.9F; } poseStack.scale(scale, scale, 1F); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/config/LocaleConfig.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/config/LocaleConfig.java new file mode 100644 index 000000000..827860eda --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/config/LocaleConfig.java @@ -0,0 +1,104 @@ +package dev.ftb.mods.ftbquests.client.config; + +import com.mojang.datafixers.util.Pair; +import dev.ftb.mods.ftblibrary.config.ConfigCallback; +import dev.ftb.mods.ftblibrary.config.ConfigValue; +import dev.ftb.mods.ftblibrary.icon.Color4I; +import dev.ftb.mods.ftblibrary.ui.Panel; +import dev.ftb.mods.ftblibrary.ui.SimpleTextButton; +import dev.ftb.mods.ftblibrary.ui.Widget; +import dev.ftb.mods.ftblibrary.ui.input.MouseButton; +import dev.ftb.mods.ftblibrary.ui.misc.AbstractButtonListScreen; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import org.apache.commons.lang3.mutable.MutableInt; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class LocaleConfig extends ConfigValue { + public static final Color4I COLOR = Color4I.rgb(0xFFAA49); + + private final LocaleValue localeValue; + + public LocaleConfig(LocaleValue localeValue) { + this.localeValue = localeValue; + } + + @Override + public void onClicked(Widget clickedWidget, MouseButton button, ConfigCallback callback) { + var gui = new LocaleSelectorScreen(localeValue, callback); + + gui.setTitle(Component.translatable("ftbquests.xlate.editing_locale")); + gui.showBottomPanel(false); // no need for accept/cancel buttons here + gui.setHasSearchBox(true); + gui.openGui(); + } + + @Override + public Color4I getColor(@Nullable String v) { + return COLOR; + } + + @Override + public Component getStringForGUI(@Nullable String v) { + return v == null ? NULL_TEXT : Component.literal('"' + v + '"'); + } + + private class LocaleSelectorScreen extends AbstractButtonListScreen { + private final LocaleValue localeValue; + private final ConfigCallback callback; + private final List> entries = new ArrayList<>(); + private final int widest; + + public LocaleSelectorScreen(LocaleValue localeValue, ConfigCallback callback) { + this.localeValue = localeValue; + this.callback = callback; + + MutableInt widestM = new MutableInt(0); + + entries.add(new Pair<>("", Component.translatable("ftbquests.gui.use_default_lang").withStyle(ChatFormatting.ITALIC))); + Minecraft.getInstance().getLanguageManager().getLanguages().forEach((lang, info) -> { + Component c = Component.literal("[" + lang + "] ").withStyle(ChatFormatting.YELLOW) + .append(info.toComponent().copy().withStyle(ChatFormatting.WHITE)); + entries.add(new Pair<>(lang, c)); + widestM.setValue(Math.max(widestM.toInteger(), getTheme().getStringWidth(c))); + }); + + widest = widestM.intValue(); + } + + @Override + public boolean onInit() { + setWidth(widest + 25); + setHeight(getScreen().getGuiScaledHeight() * 4 / 5); + return true; + } + + @Override + public void addButtons(Panel panel) { + entries.forEach(entry -> { + panel.add(new SimpleTextButton(panel, entry.getSecond(), Color4I.empty()) { + @Override + public void onClicked(MouseButton button) { + playClickSound(); + boolean changed = setCurrentValue(entry.getFirst()); + callback.save(changed); + } + }); + }); + } + + @Override + protected void doCancel() { + callback.save(false); + } + + @Override + protected void doAccept() { + callback.save(true); + } + } +} diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/config/LocaleValue.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/config/LocaleValue.java new file mode 100644 index 000000000..52d93004b --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/config/LocaleValue.java @@ -0,0 +1,19 @@ +package dev.ftb.mods.ftbquests.client.config; + +import dev.ftb.mods.ftblibrary.config.ConfigGroup; +import dev.ftb.mods.ftblibrary.snbt.config.SNBTConfig; +import dev.ftb.mods.ftblibrary.snbt.config.StringValue; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; + +public class LocaleValue extends StringValue { + public LocaleValue(SNBTConfig config, String value, String def) { + super(config, value, def); + } + + @Override + @Environment(EnvType.CLIENT) + public void createClientConfig(ConfigGroup group) { + group.add(key, new LocaleConfig(this), get(), this::set, defaultValue); + } +} diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/ChangeChapterGroupScreen.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/ChangeChapterGroupScreen.java index 809007f8f..82761c824 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/ChangeChapterGroupScreen.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/ChangeChapterGroupScreen.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftbquests.client.gui; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftblibrary.ui.Panel; import dev.ftb.mods.ftblibrary.ui.SimpleTextButton; @@ -45,7 +46,7 @@ protected void doCancel() { @Override protected void doAccept() { if (newGroup != null) { - new ChangeChapterGroupMessage(chapter.id, newGroup.id).sendToServer(); + NetworkManager.sendToServer(new ChangeChapterGroupMessage(chapter.id, newGroup.id)); } questScreen.open(chapter, false); } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/EditRewardTableScreen.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/EditRewardTableScreen.java index 9c94f3696..f1b3ed1f1 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/EditRewardTableScreen.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/EditRewardTableScreen.java @@ -41,6 +41,9 @@ public EditRewardTableScreen(Runnable parentScreen, RewardTable originalTable, C this.callback = callback; editedTable = QuestObjectBase.copy(originalTable, () -> new RewardTable(originalTable.id, originalTable.getFile())); + if (editedTable != null) { + editedTable.setRawTitle(originalTable.getRawTitle()); + } setBorder(1, 1, 1); } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/EmergencyItemsScreen.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/EmergencyItemsScreen.java index 04c9a3967..c03cc32ff 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/EmergencyItemsScreen.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/EmergencyItemsScreen.java @@ -1,6 +1,7 @@ package dev.ftb.mods.ftbquests.client.gui; import com.mojang.blaze3d.vertex.PoseStack; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftblibrary.ui.*; import dev.ftb.mods.ftblibrary.ui.input.MouseButton; @@ -43,7 +44,7 @@ public void drawBackground(GuiGraphics graphics, Theme theme, int x, int y, int if (!done) { done = true; cancelButton.setTitle(Component.translatable("gui.close")); - new GetEmergencyItemsMessage().sendToServer(); + NetworkManager.sendToServer(GetEmergencyItemsMessage.INSTANCE); } timeLeft = 0L; diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/ImageComponentWidget.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/ImageComponentWidget.java index dd63a3366..f40eb9764 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/ImageComponentWidget.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/ImageComponentWidget.java @@ -1,8 +1,5 @@ package dev.ftb.mods.ftbquests.client.gui; -import dev.ftb.mods.ftblibrary.config.ConfigGroup; -import dev.ftb.mods.ftblibrary.config.ui.EditConfigScreen; -import dev.ftb.mods.ftblibrary.icon.Icon; import dev.ftb.mods.ftblibrary.ui.Panel; import dev.ftb.mods.ftblibrary.ui.Theme; import dev.ftb.mods.ftblibrary.ui.Widget; diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/MultilineTextEditorScreen.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/MultilineTextEditorScreen.java index 9a43327b5..ad62c9a1f 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/MultilineTextEditorScreen.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/MultilineTextEditorScreen.java @@ -20,7 +20,6 @@ import dev.ftb.mods.ftbquests.quest.QuestObject; import dev.ftb.mods.ftbquests.quest.QuestObjectType; import dev.ftb.mods.ftbquests.util.ConfigQuestObject; -import joptsimple.internal.Strings; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; @@ -35,7 +34,7 @@ public class MultilineTextEditorScreen extends BaseScreen { private static final Pattern STRIP_FORMATTING_PATTERN = Pattern.compile("(?i)&[0-9A-FK-OR]"); private static final int MAX_UNDO = 10; - protected static final String LINK_TEXT_TEMPLATE = "{ \"text\": \"%s\", \"underlined\": \"true\", \"clickEvent\": { \"action\": \"change_page\", \"value\": \"%016X\" } }"; + protected static final String LINK_TEXT_TEMPLATE = "{ \"text\": \"%s\", \"underlined\": true, \"clickEvent\": { \"action\": \"change_page\", \"value\": \"%016X\" } }"; private final Component title; private final ListConfig config; diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/RewardKey.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/RewardKey.java index f4a33280b..cbc2c0abd 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/RewardKey.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/RewardKey.java @@ -29,7 +29,7 @@ public Icon getIcon() { } public int hashCode() { - return stack.isEmpty() ? Objects.hash(title, icon) : Objects.hash(stack.getItem(), stack.getTag()); + return stack.isEmpty() ? Objects.hash(title, icon) : ItemStack.hashItemAndComponents(stack); } public boolean equals(Object o) { @@ -37,7 +37,7 @@ public boolean equals(Object o) { return true; } else if (o instanceof RewardKey key) { if (!stack.isEmpty()) { - return stack.getItem() == key.stack.getItem() && Objects.equals(stack.getTag(), key.stack.getTag()); + return ItemStack.isSameItemSameComponents(stack, key.stack); } else { return title.equals(key.title) && icon.equals(key.icon); } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/RewardTablesScreen.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/RewardTablesScreen.java index d0cb3f99e..9e2348f86 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/RewardTablesScreen.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/RewardTablesScreen.java @@ -1,18 +1,21 @@ package dev.ftb.mods.ftbquests.client.gui; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.StringConfig; import dev.ftb.mods.ftblibrary.config.ui.EditStringConfigOverlay; import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftblibrary.icon.Icons; import dev.ftb.mods.ftblibrary.icon.ItemIcon; -import dev.ftb.mods.ftblibrary.ui.*; +import dev.ftb.mods.ftblibrary.ui.ContextMenuItem; +import dev.ftb.mods.ftblibrary.ui.Panel; +import dev.ftb.mods.ftblibrary.ui.SimpleTextButton; +import dev.ftb.mods.ftblibrary.ui.Theme; import dev.ftb.mods.ftblibrary.ui.input.Key; import dev.ftb.mods.ftblibrary.ui.input.MouseButton; import dev.ftb.mods.ftblibrary.ui.misc.AbstractButtonListScreen; import dev.ftb.mods.ftblibrary.util.TooltipList; import dev.ftb.mods.ftbquests.client.ClientQuestFile; import dev.ftb.mods.ftbquests.client.gui.quests.QuestScreen; -import dev.ftb.mods.ftbquests.item.FTBQuestsItems; import dev.ftb.mods.ftbquests.net.CreateObjectMessage; import dev.ftb.mods.ftbquests.net.DeleteObjectMessage; import dev.ftb.mods.ftbquests.net.EditObjectMessage; @@ -20,8 +23,12 @@ import dev.ftb.mods.ftbquests.quest.loot.LootCrate; import dev.ftb.mods.ftbquests.quest.loot.RewardTable; import dev.ftb.mods.ftbquests.quest.reward.RandomReward; +import dev.ftb.mods.ftbquests.quest.translation.TranslationKey; +import dev.ftb.mods.ftbquests.registry.ModItems; import net.minecraft.ChatFormatting; +import net.minecraft.Util; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.item.Items; import org.apache.commons.lang3.mutable.MutableInt; @@ -42,7 +49,8 @@ public RewardTablesScreen(QuestScreen questScreen) { this.questScreen = questScreen; this.rewardTablesCopy = ClientQuestFile.INSTANCE.getRewardTables().stream() - .map(t -> QuestObjectBase.copy(t, () -> new RewardTable(t.id, ClientQuestFile.INSTANCE))) + .map(table -> QuestObjectBase.copy(table, + () -> new RewardTable(table.id, ClientQuestFile.INSTANCE))) .collect(Collectors.toCollection(ArrayList::new)); setTitle(Component.translatable("ftbquests.reward_tables")); @@ -119,19 +127,23 @@ protected void doCancel() { @Override protected void doAccept() { - Set toRemove = ClientQuestFile.INSTANCE.getRewardTables().stream().map(t -> t.id).collect(Collectors.toSet()); + ClientQuestFile file = ClientQuestFile.INSTANCE; + Set toRemove = file.getRewardTables().stream().map(t -> t.id).collect(Collectors.toSet()); rewardTablesCopy.forEach(table -> { - if (table.id == 0) { + if (table.getId() == 0L) { // newly-created - new CreateObjectMessage(table, null).sendToServer(); + CompoundTag extra = Util.make(new CompoundTag(), tag -> file.getTranslationManager().addInitialTranslation( + tag, file.getLocale(), TranslationKey.TITLE, table.getRawTitle()) + ); + NetworkManager.sendToServer(CreateObjectMessage.create(table, extra)); } - toRemove.remove(table.id); + toRemove.remove(table.getId()); }); - toRemove.forEach(id -> new DeleteObjectMessage(id).sendToServer()); + toRemove.forEach(id -> NetworkManager.sendToServer(new DeleteObjectMessage(id))); - editedTables.forEach(t -> new EditObjectMessage(t).sendToServer()); + editedTables.forEach(table -> NetworkManager.sendToServer(EditObjectMessage.forQuestObject(table))); questScreen.run(); } @@ -189,7 +201,7 @@ public void onClicked(MouseButton button) { b -> editRewardTable()), new ContextMenuItem(Component.translatable("gui.remove"), Icons.BIN, b -> deleteRewardTable()), - new ContextMenuItem(getLootCrateText(), ItemIcon.getItemIcon(FTBQuestsItems.LOOTCRATE.get()), + new ContextMenuItem(getLootCrateText(), ItemIcon.getItemIcon(ModItems.LOOTCRATE.get()), b -> toggleLootCrate()) ); getGui().openContextMenu(menu); @@ -199,7 +211,7 @@ public void onClicked(MouseButton button) { public void drawBackground(GuiGraphics graphics, Theme theme, int x, int y, int w, int h) { if (isMouseOver) { Color4I.WHITE.withAlpha(30).draw(graphics, x, y, w, h); - ItemIcon.getItemIcon(FTBQuestsItems.LOOTCRATE.get()).draw(graphics, x + w - 26, y + 2, 12, 12); + ItemIcon.getItemIcon(ModItems.LOOTCRATE.get()).draw(graphics, x + w - 26, y + 2, 12, 12); Icons.BIN.draw(graphics, x + w - 13, y + 2, 12, 12); } Color4I.GRAY.withAlpha(40).draw(graphics, x, y + h, w, 1); @@ -207,7 +219,7 @@ public void drawBackground(GuiGraphics graphics, Theme theme, int x, int y, int private void editRewardTable() { new EditRewardTableScreen(RewardTablesScreen.this, table, editedReward -> { - rewardTablesCopy.replaceAll(t -> t.id == editedReward.id ? editedReward : t); + rewardTablesCopy.replaceAll(t -> t.getId() == editedReward.id ? editedReward : t); changed = true; editedTables.add(editedReward); editedReward.clearCachedData(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/SelectChoiceRewardScreen.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/SelectChoiceRewardScreen.java index 8c74b592e..8b0a4e7ec 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/SelectChoiceRewardScreen.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/SelectChoiceRewardScreen.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftbquests.client.gui; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.ui.Panel; import dev.ftb.mods.ftblibrary.ui.SimpleTextButton; import dev.ftb.mods.ftblibrary.ui.Theme; @@ -50,7 +51,7 @@ protected void doAccept() { closeGui(); if (choiceReward.getTable() != null) { int idx = choiceReward.getTable().getWeightedRewards().indexOf(acceptedReward); - new ClaimChoiceRewardMessage(choiceReward.id, idx).sendToServer(); + NetworkManager.sendToServer(new ClaimChoiceRewardMessage(choiceReward.id, idx)); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/AddRewardButton.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/AddRewardButton.java index eb7ac0cb0..d6b6e90cd 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/AddRewardButton.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/AddRewardButton.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftbquests.client.gui.quests; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.ui.Button; import dev.ftb.mods.ftblibrary.ui.ContextMenuItem; import dev.ftb.mods.ftblibrary.ui.Panel; @@ -11,7 +12,6 @@ import dev.ftb.mods.ftbquests.quest.reward.RewardTypes; import dev.ftb.mods.ftbquests.quest.theme.property.ThemeProperties; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import java.util.ArrayList; @@ -34,11 +34,9 @@ public void onClicked(MouseButton button) { for (RewardType type : RewardTypes.TYPES.values()) { contextMenu.add(new ContextMenuItem(type.getDisplayName(), type.getIconSupplier(), b -> { playClickSound(); - type.getGuiProvider().openCreationGui(parent, quest, reward -> { - CompoundTag extra = new CompoundTag(); - extra.putString("type", type.getTypeForNBT()); - new CreateObjectMessage(reward, extra).sendToServer(); - }); + type.getGuiProvider().openCreationGui(parent, quest, reward -> + NetworkManager.sendToServer(CreateObjectMessage.create(reward, type.makeExtraNBT())) + ); })); } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/AddTaskButton.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/AddTaskButton.java index 0969087bc..ecf344fa6 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/AddTaskButton.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/AddTaskButton.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftbquests.client.gui.quests; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.icon.Icons; import dev.ftb.mods.ftblibrary.ui.Button; import dev.ftb.mods.ftblibrary.ui.ContextMenuItem; @@ -16,7 +17,6 @@ import dev.ftb.mods.ftbquests.quest.theme.property.ThemeProperties; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import org.jetbrains.annotations.Nullable; @@ -41,11 +41,8 @@ public void onClicked(MouseButton button) { for (TaskType type : TaskTypes.TYPES.values()) { contextMenu.add(new ContextMenuItem(type.getDisplayName(), type.getIconSupplier(), b -> { playClickSound(); - type.getGuiProvider().openCreationGui(this.parent, quest, task -> { - CompoundTag extra = new CompoundTag(); - extra.putString("type", type.getTypeForNBT()); - new CreateObjectMessage(task, extra).sendToServer(); - }); + type.getGuiProvider().openCreationGui(this.parent, quest, (task, extra) -> + NetworkManager.sendToServer(CreateObjectMessage.create(task, extra))); })); } @@ -63,11 +60,10 @@ public void onClicked(MouseButton button) { } private void copyAndCreateTask(Task task) { - Task newTask = QuestObjectBase.copy(task, () -> TaskType.createTask(0L, quest, task.getType().getTypeId().toString())); + Task newTask = QuestObjectBase.copy(task, + () -> TaskType.createTask(0L, quest, task.getType().getTypeId().toString())); if (newTask != null) { - CompoundTag extra = new CompoundTag(); - extra.putString("type", newTask.getType().getTypeForNBT()); - new CreateObjectMessage(newTask, extra).sendToServer(); + NetworkManager.sendToServer(CreateObjectMessage.create(newTask, newTask.getType().makeExtraNBT())); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/ChapterImageButton.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/ChapterImageButton.java index 1478ea5c0..3404f0ba2 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/ChapterImageButton.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/ChapterImageButton.java @@ -75,7 +75,7 @@ public void onClicked(MouseButton button) { String name = chapterImage.getImage() instanceof Color4I ? chapterImage.getColor().toString() : chapterImage.getImage().toString(); ConfigGroup group = new ConfigGroup(FTBQuestsAPI.MOD_ID, accepted -> { if (accepted) { - new EditObjectMessage(chapterImage.getChapter()).sendToServer(); + EditObjectMessage.sendToServer(chapterImage.getChapter()); } run(); }).setNameKey("Img: " + name); @@ -107,7 +107,7 @@ public void addMouseOverText(TooltipList list) { contextMenu.add(new ContextMenuItem(Component.translatable("selectServer.delete"), ThemeProperties.DELETE_ICON.get(), b -> { chapterImage.getChapter().removeImage(chapterImage); - new EditObjectMessage(chapterImage.getChapter()).sendToServer(); + EditObjectMessage.sendToServer(chapterImage.getChapter()); }).setYesNoText(Component.translatable("delete_item", chapterImage.getImage().toString()))); getGui().openContextMenu(contextMenu); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/ChapterPanel.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/ChapterPanel.java index 39661d464..e34d6434d 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/ChapterPanel.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/ChapterPanel.java @@ -1,6 +1,7 @@ package dev.ftb.mods.ftbquests.client.gui.quests; import com.mojang.blaze3d.systems.RenderSystem; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.StringConfig; import dev.ftb.mods.ftblibrary.config.ui.EditStringConfigOverlay; import dev.ftb.mods.ftblibrary.icon.Color4I; @@ -11,6 +12,7 @@ import dev.ftb.mods.ftblibrary.util.TooltipList; import dev.ftb.mods.ftblibrary.util.client.PositionedIngredient; import dev.ftb.mods.ftbquests.client.ClientQuestFile; +import dev.ftb.mods.ftbquests.client.FTBQuestsClientConfig; import dev.ftb.mods.ftbquests.client.gui.ChangeChapterGroupScreen; import dev.ftb.mods.ftbquests.client.gui.ContextMenuBuilder; import dev.ftb.mods.ftbquests.net.CreateObjectMessage; @@ -20,8 +22,10 @@ import dev.ftb.mods.ftbquests.quest.Chapter; import dev.ftb.mods.ftbquests.quest.ChapterGroup; import dev.ftb.mods.ftbquests.quest.theme.property.ThemeProperties; +import dev.ftb.mods.ftbquests.quest.translation.TranslationKey; import dev.ftb.mods.ftbquests.util.TextUtils; import net.minecraft.ChatFormatting; +import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.nbt.CompoundTag; @@ -39,6 +43,7 @@ public class ChapterPanel extends Panel { public static final Icon ARROW_COLLAPSED = Icon.getIcon("ftbquests:textures/gui/arrow_collapsed.png"); public static final Icon ARROW_EXPANDED = Icon.getIcon("ftbquests:textures/gui/arrow_expanded.png"); public static final int Z_LEVEL = 300; + private static final Pattern NON_EMPTY_PAT = Pattern.compile("^.+$"); private final QuestScreen questScreen; boolean expanded = isPinned(); @@ -182,48 +187,51 @@ public ModpackButton(ChapterPanel panel, ClientQuestFile f) { public void onClicked(MouseButton button) { if (getMouseX() > getX() + width - 18) { playClickSound(); - new ToggleChapterPinnedMessage().sendToServer(); - } else if (chapterPanel.questScreen.file.canEdit() && getMouseX() > getX() + width - 34) { - playClickSound(); - - List contextMenu = new ArrayList<>(); - contextMenu.add(new ContextMenuItem(Component.translatable("ftbquests.chapter"), ThemeProperties.ADD_ICON.get(), b -> { - StringConfig c = new StringConfig(Pattern.compile("^.+$")); - EditStringConfigOverlay overlay = new EditStringConfigOverlay<>(parent, c, accepted -> { - chapterPanel.questScreen.openGui(); - - if (accepted && !c.getValue().isEmpty()) { - Chapter chapter = new Chapter(0L, chapterPanel.questScreen.file, chapterPanel.questScreen.file.getDefaultChapterGroup()); - chapter.setRawTitle(c.getValue()); - CompoundTag extra = new CompoundTag(); - extra.putLong("group", 0L); - new CreateObjectMessage(chapter, extra).sendToServer(); - } - - run(); - }, b.getTitle()).atMousePosition(); - overlay.setWidth(150); - overlay.setExtraZlevel(Z_LEVEL + 10); - getGui().pushModalPanel(overlay); - })); - - contextMenu.add(new ContextMenuItem(Component.translatable("ftbquests.chapter_group"), ThemeProperties.ADD_ICON.get(), b -> { - StringConfig c = new StringConfig(Pattern.compile("^.+$")); - EditStringConfigOverlay overlay = new EditStringConfigOverlay<>(parent, c, accepted -> { - chapterPanel.questScreen.openGui(); - - if (accepted) { - ChapterGroup group = new ChapterGroup(0L, ClientQuestFile.INSTANCE); - group.setRawTitle(c.getValue()); - new CreateObjectMessage(group, null).sendToServer(); - } - }, b.getTitle()).atMousePosition(); - overlay.setWidth(150); - overlay.setExtraZlevel(Z_LEVEL + 10); - getGui().pushModalPanel(overlay); - })); - - chapterPanel.questScreen.openContextMenu(contextMenu); + NetworkManager.sendToServer(ToggleChapterPinnedMessage.INSTANCE); + } else { + ClientQuestFile file = chapterPanel.questScreen.file; + if (file.canEdit() && getMouseX() > getX() + width - 34) { + playClickSound(); + + List contextMenu = new ArrayList<>(); + contextMenu.add(new ContextMenuItem(Component.translatable("ftbquests.chapter"), ThemeProperties.ADD_ICON.get(), b -> { + StringConfig c = new StringConfig(NON_EMPTY_PAT); + EditStringConfigOverlay overlay = new EditStringConfigOverlay<>(parent, c, accepted -> { + chapterPanel.questScreen.openGui(); + + if (accepted && !c.getValue().isEmpty()) { + Chapter chapter = new Chapter(0L, file, file.getDefaultChapterGroup()); + CompoundTag extra = Util.make(new CompoundTag(), t -> t.putLong("group", 0L)); + file.getTranslationManager().addInitialTranslation(extra, file.getLocale(), TranslationKey.TITLE, c.getValue()); + NetworkManager.sendToServer(CreateObjectMessage.create(chapter, extra)); + } + + run(); + }, b.getTitle()).atMousePosition(); + overlay.setWidth(150); + overlay.setExtraZlevel(Z_LEVEL + 10); + getGui().pushModalPanel(overlay); + })); + + contextMenu.add(new ContextMenuItem(Component.translatable("ftbquests.chapter_group"), ThemeProperties.ADD_ICON.get(), b -> { + StringConfig c = new StringConfig(NON_EMPTY_PAT); + EditStringConfigOverlay overlay = new EditStringConfigOverlay<>(parent, c, accepted -> { + chapterPanel.questScreen.openGui(); + + if (accepted) { + ChapterGroup group = new ChapterGroup(0L, ClientQuestFile.INSTANCE); + CompoundTag extra = Util.make(new CompoundTag(), t -> t.putLong("group", 0L)); + file.getTranslationManager().addInitialTranslation(extra, file.getLocale(), TranslationKey.TITLE, c.getValue()); + NetworkManager.sendToServer(CreateObjectMessage.create(group, extra)); + } + }, b.getTitle()).atMousePosition(); + overlay.setWidth(150); + overlay.setExtraZlevel(Z_LEVEL + 10); + getGui().pushModalPanel(overlay); + })); + + chapterPanel.questScreen.openContextMenu(contextMenu); + } } } @@ -272,29 +280,32 @@ public void addMouseOverText(TooltipList list) { public static class ChapterGroupButton extends ListButton { public final ChapterGroup group; public final List visibleChapters; + private final boolean xlateWarning; public ChapterGroupButton(ChapterPanel panel, ChapterGroup g) { super(panel, g.getTitle(), g.getIcon()); setSize(100, 18); group = g; visibleChapters = g.getVisibleChapters(panel.questScreen.file.selfTeamData); + xlateWarning = g.getQuestFile().getTranslationManager().hasMissingTranslation(group, TranslationKey.TITLE); } @Override public void onClicked(MouseButton button) { - if (chapterPanel.questScreen.file.canEdit() && getMouseX() > getX() + width - 15) { + ClientQuestFile file = chapterPanel.questScreen.file; + + if (file.canEdit() && getMouseX() > getX() + width - 15) { playClickSound(); - StringConfig c = new StringConfig(Pattern.compile("^.+$")); + StringConfig c = new StringConfig(NON_EMPTY_PAT); EditStringConfigOverlay overlay = new EditStringConfigOverlay<>(parent, c, accepted -> { chapterPanel.questScreen.openGui(); if (accepted && !c.getValue().isEmpty()) { - Chapter chapter = new Chapter(0L, chapterPanel.questScreen.file, chapterPanel.questScreen.file.getDefaultChapterGroup()); - chapter.setRawTitle(c.getValue()); - CompoundTag extra = new CompoundTag(); - extra.putLong("group", group.id); - new CreateObjectMessage(chapter, extra).sendToServer(); + Chapter chapter = new Chapter(0L, file, file.getDefaultChapterGroup()); + CompoundTag extra = Util.make(new CompoundTag(), t -> t.putLong("group", group.id)); + file.getTranslationManager().addInitialTranslation(extra, file.getLocale(), TranslationKey.TITLE, c.getValue()); + NetworkManager.sendToServer(CreateObjectMessage.create(chapter, extra)); } run(); @@ -306,14 +317,14 @@ public void onClicked(MouseButton button) { return; } - if (chapterPanel.questScreen.file.canEdit() && button.isRight() && !group.isDefaultGroup()) { + if (file.canEdit() && button.isRight() && !group.isDefaultGroup()) { ContextMenuBuilder.create(group, chapterPanel.questScreen).insertAtTop(List.of( new ContextMenuItem(Component.translatable("gui.move"), ThemeProperties.MOVE_UP_ICON.get(), - b -> new MoveChapterGroupMessage(group.id, true).sendToServer()) + b -> NetworkManager.sendToServer(new MoveChapterGroupMessage(group.id, true))) .setEnabled(!group.isFirstGroup()) .setCloseMenu(false), new ContextMenuItem(Component.translatable("gui.move"), ThemeProperties.MOVE_DOWN_ICON.get(), - b -> new MoveChapterGroupMessage(group.id, false).sendToServer()) + b -> NetworkManager.sendToServer(new MoveChapterGroupMessage(group.id, false))) .setEnabled(!group.isLastGroup()) .setCloseMenu(false) )).openContextMenu(chapterPanel.questScreen); @@ -328,6 +339,9 @@ public void onClicked(MouseButton button) { public void draw(GuiGraphics graphics, Theme theme, int x, int y, int w, int h) { GuiHelper.setupDrawing(); + if (xlateWarning) { + Color4I.RED.withAlpha(40).draw(graphics, x, y, w, h); + } if (isMouseOver()) { Color4I.WHITE.withAlpha(40).draw(graphics, x + 1, y, w - 2, h); } @@ -353,20 +367,30 @@ public int getActualWidth(QuestScreen screen) { @Override public void addMouseOverText(TooltipList list) { chapterPanel.questScreen.addInfoTooltip(list, group); + + if (xlateWarning) { + ClientQuestFile.addTranslationWarning(list, TranslationKey.TITLE); + } } } public static class ChapterButton extends ListButton { private final Chapter chapter; private final List description; + private final boolean xlateWarningTitle; + private final boolean xlateWarningSubtitle; public ChapterButton(ChapterPanel panel, Chapter c) { super(panel, c.getTitle(), c.getIcon()); chapter = c; description = chapter.getRawSubtitle().stream() - .map(line -> TextUtils.parseRawText(line).copy().withStyle(ChatFormatting.GRAY)) + .map(line -> TextUtils.parseRawText(line, chapter.holderLookup()).copy().withStyle(ChatFormatting.GRAY)) .toList(); + xlateWarningTitle = FTBQuestsClientConfig.HILITE_MISSING.get() + && chapter.getQuestFile().getTranslationManager().hasMissingTranslation(chapter, TranslationKey.TITLE); + xlateWarningSubtitle = FTBQuestsClientConfig.HILITE_MISSING.get() + && chapter.getQuestFile().getTranslationManager().hasMissingTranslation(chapter, TranslationKey.CHAPTER_SUBTITLE); } @Override @@ -383,10 +407,10 @@ public void onClicked(MouseButton button) { if (chapterPanel.questScreen.file.canEdit() && button.isRight()) { ContextMenuBuilder.create(chapter, chapterPanel.questScreen).insertAtTop(List.of( new ContextMenuItem(Component.translatable("gui.move"), ThemeProperties.MOVE_UP_ICON.get(), - b -> new MoveChapterMessage(chapter.id, true).sendToServer()) + b -> NetworkManager.sendToServer(new MoveChapterMessage(chapter.id, true))) .setEnabled(chapter.getIndex() > 0).setCloseMenu(false), new ContextMenuItem(Component.translatable("gui.move"), ThemeProperties.MOVE_DOWN_ICON.get(), - b -> new MoveChapterMessage(chapter.id, false).sendToServer()) + b -> NetworkManager.sendToServer(new MoveChapterMessage(chapter.id, false))) .setEnabled(chapter.getIndex() < chapter.getGroup().getChapters().size() - 1).setCloseMenu(false), new ContextMenuItem(Component.translatable("ftbquests.gui.change_group"), Icons.COLOR_RGB, b -> new ChangeChapterGroupScreen(chapter, chapterPanel.questScreen).openGui()) @@ -398,6 +422,9 @@ public void onClicked(MouseButton button) { public void draw(GuiGraphics graphics, Theme theme, int x, int y, int w, int h) { GuiHelper.setupDrawing(); + if (xlateWarningTitle || xlateWarningSubtitle) { + Color4I.RED.withAlpha(40).draw(graphics, x, y, w, h); + } if (isMouseOver()) { Color4I.WHITE.withAlpha(40).draw(graphics, x + 1, y, w - 2, h); } @@ -428,6 +455,13 @@ public void addMouseOverText(TooltipList list) { for (Component s : description) { list.add(s); } + + if (xlateWarningTitle) { + ClientQuestFile.addTranslationWarning(list, TranslationKey.TITLE); + } + if (xlateWarningSubtitle) { + ClientQuestFile.addTranslationWarning(list, TranslationKey.CHAPTER_SUBTITLE); + } } @Override diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/CollectRewardsButton.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/CollectRewardsButton.java index 25b59ce62..a6bd78c72 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/CollectRewardsButton.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/CollectRewardsButton.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftbquests.client.gui.quests; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.ui.GuiHelper; import dev.ftb.mods.ftblibrary.ui.Panel; import dev.ftb.mods.ftblibrary.ui.Theme; @@ -23,7 +24,7 @@ public void onClicked(MouseButton button) { if (questScreen.file.selfTeamData.hasUnclaimedRewards(Minecraft.getInstance().player.getUUID(), questScreen.file)) { playClickSound(); new RewardNotificationsScreen().openGui(); - new ClaimAllRewardsMessage().sendToServer(); + NetworkManager.sendToServer(ClaimAllRewardsMessage.INSTANCE); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/OtherButtonsPanelBottom.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/OtherButtonsPanelBottom.java index b0d63ad97..bb344429f 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/OtherButtonsPanelBottom.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/OtherButtonsPanelBottom.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftbquests.client.gui.quests; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.icon.Icons; import dev.ftb.mods.ftblibrary.ui.ContextMenuItem; import dev.ftb.mods.ftblibrary.ui.Panel; @@ -73,7 +74,7 @@ public void onClicked(MouseButton button) { StructureTask.maybeRequestStructureSync(); } - new ToggleEditingModeMessage().sendToServer(); + NetworkManager.sendToServer(ToggleEditingModeMessage.INSTANCE); } } @@ -120,7 +121,7 @@ public void onClicked(MouseButton button) { contextMenu.add(new ContextMenuItem(Component.translatable("ftbquests.reward_tables"), ThemeProperties.REWARD_TABLE_ICON.get(), b -> new RewardTablesScreen(questScreen).openGui())); contextMenu.add(new ContextMenuItem(Component.translatable("ftbquests.gui.save_on_server"), ThemeProperties.SAVE_ICON.get(), - b -> new ForceSaveMessage().sendToServer())); + b -> NetworkManager.sendToServer(ForceSaveMessage.INSTANCE))); contextMenu.add(new ContextMenuItem(Component.translatable("ftbquests.gui.save_as_file"), ThemeProperties.DOWNLOAD_ICON.get(), b -> saveLocally())); @@ -151,7 +152,7 @@ private void saveLocally() { appendNum(fileName, time.get(Calendar.MINUTE), '-'); appendNum(fileName, time.get(Calendar.SECOND), '\0'); File file = new File(Minecraft.getInstance().gameDirectory, fileName.toString()).getCanonicalFile(); - ClientQuestFile.INSTANCE.writeDataFull(file.toPath()); + ClientQuestFile.INSTANCE.writeDataFull(file.toPath(), ClientQuestFile.INSTANCE.holderLookup()); Component component = Component.translatable("ftbquests.gui.saved_as_file", "." + file.getPath().replace(Minecraft.getInstance().gameDirectory.getCanonicalFile().getAbsolutePath(), "")); component.getStyle().withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_FILE, file.getAbsolutePath())); Minecraft.getInstance().player.sendSystemMessage(component); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/OtherButtonsPanelTop.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/OtherButtonsPanelTop.java index 41784ada4..97831d5c6 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/OtherButtonsPanelTop.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/OtherButtonsPanelTop.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftbquests.client.gui.quests; +import dev.architectury.networking.NetworkManager; import dev.architectury.platform.Platform; import dev.ftb.mods.ftblibrary.icon.Icons; import dev.ftb.mods.ftblibrary.ui.Panel; @@ -73,7 +74,7 @@ private static boolean isAutoPin() { @Override public void onClicked(MouseButton button) { playClickSound(); - new TogglePinnedMessage(TeamData.AUTO_PIN_ID).sendToServer(); + NetworkManager.sendToServer(new TogglePinnedMessage(TeamData.AUTO_PIN_ID)); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/QuestButton.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/QuestButton.java index 39d0c3550..98556c69f 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/QuestButton.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/QuestButton.java @@ -1,6 +1,7 @@ package dev.ftb.mods.ftbquests.client.gui.quests; import com.mojang.blaze3d.vertex.PoseStack; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.DoubleConfig; import dev.ftb.mods.ftblibrary.config.ui.EditStringConfigOverlay; import dev.ftb.mods.ftblibrary.icon.Color4I; @@ -155,7 +156,7 @@ public void onClicked(MouseButton button) { b -> openAddRewardContextMenu())); contextMenu.add(new ContextMenuItem(Component.translatable("ftbquests.gui.clear_reward_all"), ThemeProperties.CLOSE_ICON.get(quest), - b -> selected.forEach(q -> q.getRewards().forEach(r -> new DeleteObjectMessage(r.id).sendToServer())))); + b -> selected.forEach(q -> q.getRewards().forEach(r -> NetworkManager.sendToServer(new DeleteObjectMessage(r.id)))))); contextMenu.add(new ContextMenuItem(Component.translatable("ftbquests.gui.bulk_change_size"), Icons.SETTINGS, b -> bulkChangeSize())); @@ -202,7 +203,6 @@ public void onClicked(MouseButton button) { questScreen.movingObjects = false; if (questScreen.getViewedQuest() != quest) { -// questScreen.viewQuestPanel.hidePanel = true; questScreen.viewQuest(quest); } else { questScreen.closeQuest(); @@ -221,7 +221,7 @@ private void bulkChangeSize() { if (accepted) { quests.forEach(q -> { q.setSize(c.getValue()); - new EditObjectMessage(q).sendToServer(); + NetworkManager.sendToServer(EditObjectMessage.forQuestObject(q)); }); } run(); @@ -241,7 +241,7 @@ private void openAddRewardContextMenu() { if (newReward != null) { CompoundTag extra = new CompoundTag(); extra.putString("type", type.getTypeForNBT()); - new CreateObjectMessage(newReward, extra).sendToServer(); + NetworkManager.sendToServer(CreateObjectMessage.create(newReward, extra)); } })); })); @@ -264,7 +264,7 @@ private void editDependency(Quest quest, QuestObject object, boolean add) { quest.removeInvalidDependencies(); if (quest.verifyDependencies(false)) { - new EditObjectMessage(quest).sendToServer(); + NetworkManager.sendToServer(EditObjectMessage.forQuestObject(quest)); questScreen.questPanel.refreshWidgets(); } else { quest.clearDependencies(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/QuestPanel.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/QuestPanel.java index 57d3f75ef..7b8091946 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/QuestPanel.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/QuestPanel.java @@ -3,6 +3,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import com.mojang.math.Axis; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.ImageResourceConfig; import dev.ftb.mods.ftblibrary.config.ui.SelectImageResourceScreen; import dev.ftb.mods.ftblibrary.icon.Color4I; @@ -21,10 +22,10 @@ import dev.ftb.mods.ftbquests.quest.task.TaskType; import dev.ftb.mods.ftbquests.quest.task.TaskTypes; import dev.ftb.mods.ftbquests.quest.theme.property.ThemeProperties; +import dev.ftb.mods.ftbquests.quest.translation.TranslationKey; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; import org.jetbrains.annotations.Nullable; @@ -380,20 +381,20 @@ private void drawStatusBar(GuiGraphics graphics, Theme theme, PoseStack poseStac poseStack.scale(0.5f, 0.5f, 0.5f); String curStr = String.format("Cursor: [%+.2f, %+.2f]", questX, questY); - theme.drawString(graphics, curStr, 6, 0, Theme.SHADOW); - - String cStr = String.format("Center: [%.2f, %.2f]", centerQuestX, centerQuestY); - theme.drawString(graphics, cStr, statusWidth * 2 - theme.getStringWidth(cStr) - 6, 0, Theme.SHADOW); + int pos = theme.drawString(graphics, curStr, 6, 0, Theme.SHADOW) + 25; int total = questScreen.selectedChapter.getQuests().size() + questScreen.selectedChapter.getQuestLinks().size() + questScreen.selectedChapter.getImages().size(); - String sStr = String.format("Selected: %d / %d", questScreen.selectedObjects.size(), total); - theme.drawString(graphics, sStr, statusWidth / 2, 0, Theme.SHADOW); + String sStr = String.format("%s: %d/%d", (questScreen.movingObjects ? "Moving" : "Selected"), questScreen.selectedObjects.size(), total); + pos = theme.drawString(graphics, sStr, pos, 0, Theme.SHADOW) + 25; + + String langStr = "Lang: " + questScreen.file.getLocale() + (FTBQuestsClientConfig.EDITING_LOCALE.get().isEmpty() ? " [Auto]" : ""); + theme.drawString(graphics, langStr, pos, 0, Theme.SHADOW); + + String cStr = String.format("Center: [%.2f, %.2f]", centerQuestX, centerQuestY); + theme.drawString(graphics, cStr, statusWidth * 2 - theme.getStringWidth(cStr) - 6, 0, Theme.SHADOW); - if (questScreen.movingObjects) { - theme.drawString(graphics, "Moving", statusWidth, 0, Theme.SHADOW); - } poseStack.popPose(); } @@ -416,7 +417,7 @@ public boolean mousePressed(MouseButton button) { } for (Movable q : questScreen.selectedObjects) { - q.move(questScreen.selectedChapter, questX + (q.getX() - minX), questY + (q.getY() - minY)); + q.initiateMoveClientSide(questScreen.selectedChapter, questX + (q.getX() - minX), questY + (q.getY() - minY)); } } @@ -429,12 +430,12 @@ public boolean mousePressed(MouseButton button) { return true; } - if (/*!questScreen.viewQuestPanel.hidePanel &&*/ questScreen.isViewingQuest()) { + if (questScreen.isViewingQuest()) { questScreen.closeQuest(); return true; } - if ((button.isLeft() || button.isMiddle() && questScreen.file.canEdit()) && isMouseOver() && (/*questScreen.viewQuestPanel.hidePanel ||*/ !questScreen.isViewingQuest())) { + if ((button.isLeft() || button.isMiddle() && questScreen.file.canEdit()) && isMouseOver() && !questScreen.isViewingQuest()) { questScreen.prevMouseX = getMouseX(); questScreen.prevMouseY = getMouseY(); questScreen.grabbed = button; @@ -451,8 +452,14 @@ public boolean mousePressed(MouseButton button) { contextMenu.add(new ContextMenuItem(type.getDisplayName(), type.getIconSupplier(), b -> { playClickSound(); type.getGuiProvider().openCreationGui(this, new Quest(0L, questScreen.selectedChapter), - task -> new CreateTaskAtMessage(questScreen.selectedChapter, qx, qy, task) - .sendToServer() + (task, extra) -> { + String str = task.getProtoTranslation(TranslationKey.TITLE); + if (!str.isEmpty()) { + questScreen.file.getTranslationManager().addInitialTranslation(extra, questScreen.file.getLocale(), + TranslationKey.TITLE, task.getProtoTranslation(TranslationKey.TITLE)); + } + NetworkManager.sendToServer(CreateTaskAtMessage.create(questScreen.selectedChapter, qx, qy, task, extra)); + } ); })); } @@ -467,18 +474,18 @@ public boolean mousePressed(MouseButton button) { if (qo instanceof Quest quest) { contextMenu.add(new PasteQuestMenuItem(quest, Component.translatable("ftbquests.gui.paste"), Icons.ADD, - b -> new CopyQuestMessage(quest, questScreen.selectedChapter, qx, qy, true).sendToServer())); + b -> NetworkManager.sendToServer(new CopyQuestMessage(quest.id, questScreen.selectedChapter.id, qx, qy, true)))); if (quest.hasDependencies()) { contextMenu.add(new PasteQuestMenuItem(quest, Component.translatable("ftbquests.gui.paste_no_deps"), Icons.ADD_GRAY.withTint(Color4I.rgb(0x008000)), - b -> new CopyQuestMessage(quest, questScreen.selectedChapter, qx, qy, false).sendToServer())); + b -> NetworkManager.sendToServer(new CopyQuestMessage(quest.id, questScreen.selectedChapter.id, qx, qy, false)))); } contextMenu.add(new PasteQuestMenuItem(quest, Component.translatable("ftbquests.gui.paste_link"), Icons.ADD_GRAY.withTint(Color4I.rgb(0x8080C0)), b -> { QuestLink link = new QuestLink(0L, questScreen.selectedChapter, quest.id); link.setPosition(qx, qy); - new CreateObjectMessage(link, new CompoundTag()).sendToServer(); + NetworkManager.sendToServer(CreateObjectMessage.create(link, null)); })); } else if (qo instanceof Task task) { contextMenu.add(new AddTaskButton.PasteTaskMenuItem(task, b -> copyAndCreateTask(task, qx, qy))); @@ -489,7 +496,7 @@ public boolean mousePressed(MouseButton button) { contextMenu.add(ContextMenuItem.SEPARATOR); contextMenu.add(new TooltipContextMenuItem(Component.translatable("ftbquests.gui.paste_image"), Icons.ADD, - b -> new CopyChapterImageMessage(clipImg, questScreen.selectedChapter, qx, qy).sendToServer(), + b -> NetworkManager.sendToServer(new CopyChapterImageMessage(clipImg, questScreen.selectedChapter, qx, qy)), Component.literal(clipImg.getImage().toString()).withStyle(ChatFormatting.GRAY))); }); } @@ -511,16 +518,17 @@ private void showImageCreationScreen(double qx, double qy) { .setPosition(qx, qy); image.fixupAspectRatio(true); questScreen.selectedChapter.addImage(image); - new EditObjectMessage(questScreen.selectedChapter).sendToServer(); + NetworkManager.sendToServer(EditObjectMessage.forQuestObject(questScreen.selectedChapter)); } QuestPanel.this.questScreen.openGui(); }).openGui(); } private void copyAndCreateTask(Task task, double qx, double qy) { - Task newTask = QuestObjectBase.copy(task, () -> TaskType.createTask(0L, new Quest(0L, questScreen.selectedChapter), task.getType().getTypeId().toString())); + Task newTask = QuestObjectBase.copy(task, + () -> TaskType.createTask(0L, new Quest(0L, questScreen.selectedChapter), task.getType().getTypeId().toString())); if (newTask != null) { - new CreateTaskAtMessage(questScreen.selectedChapter, qx, qy, newTask).sendToServer(); + NetworkManager.sendToServer(CreateTaskAtMessage.create(questScreen.selectedChapter, qx, qy, newTask, null)); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/QuestScreen.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/QuestScreen.java index 612dd8006..2a63c7ba9 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/QuestScreen.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/QuestScreen.java @@ -1,6 +1,7 @@ package dev.ftb.mods.ftbquests.client.gui.quests; import com.mojang.datafixers.util.Pair; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.ConfigGroup; import dev.ftb.mods.ftblibrary.config.ConfigValue; import dev.ftb.mods.ftblibrary.config.ConfigWithVariants; @@ -31,7 +32,6 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.Rect2i; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.util.Mth; @@ -275,7 +275,7 @@ public void addObjectMenuItems(List contextMenu, Runnable gui, private void setAutofocusedId(long id) { selectedChapter.setAutofocus(id); - new EditObjectMessage(selectedChapter).sendToServer(); + NetworkManager.sendToServer(EditObjectMessage.forQuestObject(selectedChapter)); } private List scanForConfigEntries(List res, QuestObjectBase object, ConfigGroup g) { @@ -297,7 +297,7 @@ public void onClicked(Button button, Panel panel, MouseButton mouseButton) { value.onClicked(button, mouseButton, accepted -> { if (accepted) { value.applyValue(); - new EditObjectMessage(object).sendToServer(); + NetworkManager.sendToServer(EditObjectMessage.forQuestObject(object)); } }); } @@ -333,7 +333,7 @@ public static void displayError(Component error) { private boolean moveSelectedQuests(double x, double y) { for (Movable movable : selectedObjects) { if (movable.getChapter() == selectedChapter) { - movable.move(selectedChapter, movable.getX() + x, movable.getY() + y); + movable.initiateMoveClientSide(selectedChapter, movable.getX() + x, movable.getY() + y); } } @@ -354,7 +354,7 @@ private boolean copyObjectsToClipboard() { .orElse(null); } else { // one object selected - toCopy = selectedObjects.get(0); + toCopy = selectedObjects.getFirst(); } if (toCopy != null) { @@ -375,7 +375,7 @@ private boolean pasteSelectedQuest(boolean withDeps) { Quest quest = file.getQuest(id); if (quest == null) return false; Pair qxy = getSnappedXY(); - new CopyQuestMessage(quest, selectedChapter, qxy.getFirst(), qxy.getSecond(), withDeps).sendToServer(); + NetworkManager.sendToServer(new CopyQuestMessage(quest.id, selectedChapter.id, qxy.getFirst(), qxy.getSecond(), withDeps)); return true; }).orElse(false); } @@ -384,7 +384,7 @@ private boolean pasteSelectedQuest(boolean withDeps) { private boolean pasteSelectedImage() { return ChapterImageButton.getClipboardImage().map(clipImg -> { Pair qxy = getSnappedXY(); - new CopyChapterImageMessage(clipImg, selectedChapter, qxy.getFirst(), qxy.getSecond()).sendToServer(); + NetworkManager.sendToServer(new CopyChapterImageMessage(clipImg, selectedChapter, qxy.getFirst(), qxy.getSecond())); return true; }).orElse(false); } @@ -398,7 +398,7 @@ private boolean pasteSelectedQuestLinks() { Pair qxy = getSnappedXY(); QuestLink link = new QuestLink(0L, selectedChapter, id); link.setPosition(qxy.getFirst(), qxy.getSecond()); - new CreateObjectMessage(link, new CompoundTag(), false).sendToServer(); + NetworkManager.sendToServer(CreateObjectMessage.create(link, null, false)); return true; }).orElse(false); } @@ -418,7 +418,7 @@ void deleteSelectedObjects() { file.deleteObject(ql.id); } else if (movable instanceof ChapterImage img) { img.getChapter().removeImage(img); - new EditObjectMessage(img.getChapter()).sendToServer(); + NetworkManager.sendToServer(EditObjectMessage.forQuestObject(img.getChapter())); } }); selectedObjects.clear(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/RewardButton.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/RewardButton.java index 8c7a2f118..e8e7dc423 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/RewardButton.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/RewardButton.java @@ -8,7 +8,6 @@ import dev.ftb.mods.ftblibrary.util.TooltipList; import dev.ftb.mods.ftblibrary.util.client.PositionedIngredient; import dev.ftb.mods.ftbquests.client.ClientQuestFile; -import dev.ftb.mods.ftbquests.client.FTBQClientProxy; import dev.ftb.mods.ftbquests.client.FTBQuestsClient; import dev.ftb.mods.ftbquests.client.gui.ContextMenuBuilder; import dev.ftb.mods.ftbquests.quest.reward.ItemReward; @@ -18,6 +17,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; @@ -52,7 +52,7 @@ public void addMouseOverText(TooltipList list) { if (reward.addTitleInMouseOverText()) { if (reward instanceof ItemReward itemReward) { TooltipFlag.Default flag = Minecraft.getInstance().options.advancedItemTooltips ? TooltipFlag.ADVANCED : TooltipFlag.NORMAL; - itemReward.getItem().getTooltipLines(FTBQuestsClient.getClientPlayer(), flag) + itemReward.getItem().getTooltipLines(Item.TooltipContext.of(FTBQuestsClient.getClientLevel()), FTBQuestsClient.getClientPlayer(), flag) .forEach(list::add); } else { list.add(getTitle()); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/TaskButton.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/TaskButton.java index c5a323d98..bf6e89bc8 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/TaskButton.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/TaskButton.java @@ -89,7 +89,7 @@ public void onClicked(MouseButton button) { b -> { task.getQuest().setRawIcon(itemIcon.getStack().copy()); task.getQuest().clearCachedData(); - new EditObjectMessage(task.getQuest()).sendToServer(); + EditObjectMessage.sendToServer(task.getQuest()); }) ) ); @@ -106,7 +106,7 @@ private void setTagFilterAndSave(ItemTask itemTask, ItemFilterAdapter adapter, T itemTask.setRawTitle("Any #" + tag.location()); } - new EditObjectMessage(itemTask).sendToServer(); + EditObjectMessage.sendToServer(itemTask); } @Override diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/ValidItemsScreen.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/ValidItemsScreen.java index 20c9b9ca8..85996d85c 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/ValidItemsScreen.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/ValidItemsScreen.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftbquests.client.gui.quests; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftblibrary.icon.ItemIcon; import dev.ftb.mods.ftblibrary.ui.*; @@ -77,7 +78,7 @@ public boolean renderTitleInCenter() { @Override public void onClicked(MouseButton button) { playClickSound(); - new SubmitTaskMessage(task.id).sendToServer(); + NetworkManager.sendToServer(new SubmitTaskMessage(task.id)); onBack(); } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/ViewQuestPanel.java b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/ViewQuestPanel.java index ad8e3ecfb..53deb8827 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/ViewQuestPanel.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/client/gui/quests/ViewQuestPanel.java @@ -1,6 +1,7 @@ package dev.ftb.mods.ftbquests.client.gui.quests; import com.mojang.datafixers.util.Pair; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.ConfigGroup; import dev.ftb.mods.ftblibrary.config.ImageResourceConfig; import dev.ftb.mods.ftblibrary.config.ListConfig; @@ -19,6 +20,7 @@ import dev.ftb.mods.ftblibrary.util.client.ImageComponent; import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.ClientQuestFile; +import dev.ftb.mods.ftbquests.client.FTBQuestsClientConfig; import dev.ftb.mods.ftbquests.client.gui.ImageComponentWidget; import dev.ftb.mods.ftbquests.client.gui.MultilineTextEditorScreen; import dev.ftb.mods.ftbquests.net.EditObjectMessage; @@ -32,6 +34,7 @@ import dev.ftb.mods.ftbquests.quest.task.Task; import dev.ftb.mods.ftbquests.quest.theme.QuestTheme; import dev.ftb.mods.ftbquests.quest.theme.property.ThemeProperties; +import dev.ftb.mods.ftbquests.quest.translation.TranslationKey; import it.unimi.dsi.fastutil.longs.Long2IntMap; import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap; import net.minecraft.ChatFormatting; @@ -44,6 +47,7 @@ import net.minecraft.network.chat.contents.PlainTextContents; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; +import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraft.world.item.TooltipFlag; import org.jetbrains.annotations.NotNull; @@ -148,7 +152,7 @@ public void addWidgets() { boolean canEdit = questScreen.file.canEdit(); - titleField = new QuestDescriptionField(this, canEdit, (b, clickedW) -> editTitle()) + titleField = new QuestDescriptionField(this, canEdit, TranslationKey.TITLE, (b, clickedW) -> editTitle()) .addFlags(Theme.CENTERED) .setMinWidth(150).setMaxWidth(500).setSpacing(9) .setText(quest.getTitle().copy().withStyle(Style.EMPTY.withColor(TextColor.fromRgb(ThemeProperties.QUEST_VIEW_TITLE.get().rgb())))); @@ -341,11 +345,11 @@ public TextField resize(Theme theme) { } if (!subtitle.equals(Component.empty())) { - panelText.add(new QuestDescriptionField(panelText, canEdit, (b, clickedW) -> editSubtitle()) + panelText.add(new QuestDescriptionField(panelText, canEdit, TranslationKey.QUEST_SUBTITLE, (b, clickedW) -> editSubtitle()) .addFlags(Theme.CENTERED) .setMinWidth(panelText.width).setMaxWidth(panelText.width) .setSpacing(9) - .setText(Component.literal("").append(subtitle).withStyle(ChatFormatting.ITALIC, ChatFormatting.GRAY))); + .setText(subtitle.copy().withStyle(ChatFormatting.ITALIC, ChatFormatting.GRAY))); } boolean showText = !quest.getHideTextUntilComplete().get(false) || questScreen.file.selfTeamData != null && questScreen.file.selfTeamData.isCompleted(quest); @@ -416,7 +420,7 @@ private void addDescriptionText(boolean canEdit, Component subtitle) { panelText.add(cw); } else { final int line = i; - TextField field = new QuestDescriptionField(panelText, canEdit, (context, clickedW) -> editDescLine(clickedW, line, context, null)) + TextField field = new QuestDescriptionField(panelText, canEdit, TranslationKey.QUEST_DESC, (context, clickedW) -> editDescLine(clickedW, line, context, null)) .setMaxWidth(panelText.width).setSpacing(9).setText(component); field.setWidth(panelText.width); panelText.add(field); @@ -533,6 +537,10 @@ public void tick() { } } + private void syncQuestToServer() { + NetworkManager.sendToServer(EditObjectMessage.forQuestObject(quest)); + } + private void showList(Collection c, boolean dependencies) { int hidden = 0; List contextMenu = new ArrayList<>(); @@ -571,7 +579,7 @@ private void showList(Collection c, boolean dependencies) { public void keyReleased(Key key) { // released rather than pressed; if we used pressed, keypress would be picked up by the next screen - if (/*hidePanel ||*/ quest == null) return; + if (quest == null) return; if (questScreen.file.canEdit()) { if (key.is(GLFW.GLFW_KEY_S)) { @@ -604,22 +612,17 @@ private void editTitle() { StringConfig c = new StringConfig(null); // pressing T while mousing over a task button allows editing the task title - QuestObject qo = quest; - String titleKey = "ftbquests.title"; - for (Widget w : panelTasks.getWidgets()) { - if (w instanceof TaskButton b && b.isMouseOver()) { - qo = b.task; - titleKey = "ftbquests.task_title"; - break; - } - } + QuestObject qo = panelTasks.getWidgets().stream() + .filter(w -> w instanceof TaskButton b && b.isMouseOver()) + .map(w -> (TaskButton) w) + .findFirst() + .map(b -> b.task).orElse(quest); - final var qo1 = qo; - c.setValue(qo1.getRawTitle()); + c.setValue(qo.getRawTitle()); EditStringConfigOverlay overlay = new EditStringConfigOverlay<>(getGui(), c, accepted -> { if (accepted) { - qo1.setRawTitle(c.getValue()); - new EditObjectMessage(qo1).sendToServer(); + qo.setRawTitle(c.getValue()); + NetworkManager.sendToServer(EditObjectMessage.forQuestObject(qo)); } }, Component.translatable("ftbquests.title.tooltip")).atPosition(titleField.getX(), titleField.getY() - 14); overlay.setWidth(Math.max(150, overlay.getWidth())); @@ -632,7 +635,7 @@ private void editSubtitle() { EditStringConfigOverlay overlay = new EditStringConfigOverlay<>(getGui(), c, accepted -> { if (accepted) { quest.setRawSubtitle(c.getValue()); - new EditObjectMessage(quest).sendToServer(); + syncQuestToServer(); } }, Component.translatable("ftbquests.chapter.subtitle")); overlay.setWidth(Mth.clamp(overlay.getWidth(), 150, getScreen().getGuiScaledWidth() - 20)); @@ -642,10 +645,11 @@ private void editSubtitle() { private void editDescription() { ListConfig lc = new ListConfig<>(new StringConfig()); - lc.setValue(quest.getRawDescription()); + + lc.setValue(new ArrayList<>(quest.getRawDescription())); new MultilineTextEditorScreen(Component.translatable("ftbquests.gui.edit_description"), lc, accepted -> { if (accepted) { - new EditObjectMessage(quest).sendToServer(); + quest.setRawDescription(lc.getValue()); refreshWidgets(); } openGui(); @@ -691,8 +695,10 @@ private static Component hotkey(String key) { } private void addPageBreak() { - appendToPage(quest.getRawDescription(), List.of(Quest.PAGEBREAK_CODE, "(new page placeholder text)"), getCurrentPage()); - new EditObjectMessage(quest).sendToServer(); + quest.modifyTranslatableListValue(TranslationKey.QUEST_DESC, desc -> + appendToPage(desc, List.of(Quest.PAGEBREAK_CODE, "(new page placeholder text)"), getCurrentPage()) + ); + setCurrentPage(Math.min(pageIndices.size() - 1, getCurrentPage() + 1)); refreshWidgets(); } @@ -701,18 +707,19 @@ private void editDescLine0(Widget clickedWidget, int line, @Nullable Object type if (type instanceof ImageComponent img) { editImage(line, img); } else { - var rawDesc = quest.getRawDescription(); + var mutableRawDesc = new ArrayList<>(quest.getRawDescription()); StringConfig c = new StringConfig(null); - c.setValue(line == -1 ? "" : rawDesc.get(line)); + c.setValue(line == -1 ? "" : mutableRawDesc.get(line)); EditStringConfigOverlay overlay = new EditStringConfigOverlay<>(getGui(), c, accepted -> { if (accepted) { if (line == -1) { - appendToPage(rawDesc, List.of(c.getValue()), getCurrentPage()); + appendToPage(mutableRawDesc, List.of(c.getValue()), getCurrentPage()); } else { - rawDesc.set(line, c.getValue()); + mutableRawDesc.set(line, c.getValue()); } - new EditObjectMessage(quest).sendToServer(); + quest.setRawDescription(List.copyOf(mutableRawDesc)); +// syncQuestToServer(); refreshWidgets(); } }).atPosition(clickedWidget.getX(), clickedWidget.getY()); @@ -725,12 +732,14 @@ private void editImage(int line, ImageComponent component) { ConfigGroup group = new ConfigGroup(FTBQuestsAPI.MOD_ID + ".chapter.image", accepted -> { openGui(); if (accepted) { - if (line == -1) { - appendToPage(quest.getRawDescription(), List.of(component.toString()), getCurrentPage()); - } else { - quest.getRawDescription().set(line, component.toString()); - } - new EditObjectMessage(quest).sendToServer(); + quest.modifyTranslatableListValue(TranslationKey.QUEST_DESC, mutableRawDesc -> { + if (line == -1) { + appendToPage(mutableRawDesc, List.of(component.toString()), getCurrentPage()); + } else { + mutableRawDesc.set(line, component.toString()); + } + }); +// syncQuestToServer(); refreshWidgets(); } @@ -765,8 +774,8 @@ public void editDescLine(Widget clickedWidget, int line, boolean context, @Nulla List contextMenu = new ArrayList<>(); contextMenu.add(new ContextMenuItem(Component.translatable("selectServer.edit"), ThemeProperties.EDIT_ICON.get(), b -> editDescLine0(clickedWidget, line, type))); contextMenu.add(new ContextMenuItem(Component.translatable("selectServer.delete"), ThemeProperties.DELETE_ICON.get(), b -> { - quest.getRawDescription().remove(line); - new EditObjectMessage(quest).sendToServer(); + quest.modifyTranslatableListValue(TranslationKey.QUEST_DESC, mutableDesc -> mutableDesc.remove(line)); +// syncQuestToServer(); refreshWidgets(); })); @@ -830,12 +839,26 @@ public boolean mouseScrolled(double scroll) { private class QuestDescriptionField extends TextField { private final boolean canEdit; + private final boolean xlateWarning; private final BiConsumer editCallback; + private final TranslationKey key; - QuestDescriptionField(Panel panel, boolean canEdit, BiConsumer editCallback) { + QuestDescriptionField(Panel panel, boolean canEdit, TranslationKey key, BiConsumer editCallback) { super(panel); this.canEdit = canEdit; this.editCallback = editCallback; + this.key = key; + + xlateWarning = FTBQuestsClientConfig.HILITE_MISSING.get() + && quest.getQuestFile().getTranslationManager().hasMissingTranslation(quest, key); + } + + @Override + public void draw(GuiGraphics graphics, Theme theme, int x, int y, int w, int h) { + if (xlateWarning) { + Color4I.RED.withAlpha(40).draw(graphics, x, y, w, h); + } + super.draw(graphics, theme, x, y, w, h); } @Override @@ -931,7 +954,7 @@ public void addMouseOverText(TooltipList list) { Minecraft mc = Minecraft.getInstance(); TooltipFlag flag = mc.options.advancedItemTooltips ? TooltipFlag.Default.ADVANCED : TooltipFlag.Default.NORMAL; if (stackInfo != null) { - stackInfo.getItemStack().getTooltipLines(mc.player, flag).forEach(list::add); + stackInfo.getItemStack().getTooltipLines(Item.TooltipContext.of(mc.level), mc.player, flag).forEach(list::add); } else { HoverEvent.EntityTooltipInfo entityInfo = hoverevent.getValue(HoverEvent.Action.SHOW_ENTITY); if (entityInfo != null) { @@ -947,6 +970,10 @@ public void addMouseOverText(TooltipList list) { } } }); + + if (xlateWarning) { + ClientQuestFile.addTranslationWarning(list, key); + } } } @@ -1023,7 +1050,7 @@ private PinViewQuestButton() { @Override public void onClicked(MouseButton button) { playClickSound(); - new TogglePinnedMessage(quest.id).sendToServer(); + NetworkManager.sendToServer(new TogglePinnedMessage(quest.id)); } } 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 73afbd444..a9edfdcd4 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 @@ -6,8 +6,10 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import dev.architectury.networking.NetworkManager; import dev.architectury.registry.registries.RegistrarManager; import dev.ftb.mods.ftblibrary.config.Tristate; +import dev.ftb.mods.ftblibrary.util.NetworkHelper; import dev.ftb.mods.ftbquests.FTBQuests; import dev.ftb.mods.ftbquests.integration.PermissionsHelper; import dev.ftb.mods.ftbquests.net.*; @@ -172,11 +174,10 @@ private static boolean hasEditorPermission(CommandSourceStack stack) { 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); + NetworkManager.sendToPlayer(player, OpenQuestBookMessage.lastOpenedQuest()); } else if (qob instanceof QuestObject quest) { if (canSeeQuestObject(player, quest)) { - new OpenQuestBookMessage(quest.id).sendTo(player); + NetworkManager.sendToPlayer(player, new OpenQuestBookMessage(quest.id)); } } return 1; @@ -255,7 +256,7 @@ private static int importRewards(CommandSourceStack source, String name, BlockPo file.addRewardTable(table); - new CreateObjectResponseMessage(table, null).sendToAll(level.getServer()); + NetworkHelper.sendToAll(level.getServer(), CreateObjectResponseMessage.create(table, null)); source.sendSuccess(() -> Component.translatable("commands.ftbquests.command.feedback.table_imported", name, table.getWeightedRewards().size()), false); @@ -300,7 +301,7 @@ private static int locked(CommandSourceStack source, ServerPlayer player, @Nulla private static int changeProgress(CommandSourceStack source, Collection players, boolean reset, QuestObjectBase questObject) { for (ServerPlayer player : players) { - ProgressChange progressChange = new ProgressChange(ServerQuestFile.INSTANCE, questObject, player.getUUID()).setReset(reset); + ProgressChange progressChange = new ProgressChange(questObject, player.getUUID()).setReset(reset); questObject.forceProgress(ServerQuestFile.INSTANCE.getOrCreateTeamData(player), progressChange); } @@ -330,7 +331,7 @@ private static int generateAllItemChapter(CommandSourceStack source) { chapter.setRawIcon(new ItemStack(Items.COMPASS)); chapter.setDefaultQuestShape("rsquare"); - new CreateObjectResponseMessage(chapter, null).sendToAll(source.getServer()); + NetworkHelper.sendToAll(source.getServer(), CreateObjectResponseMessage.create(chapter, null)); //noinspection DataFlowIssue List list = allItems.stream() @@ -345,7 +346,7 @@ private static int generateAllItemChapter(CommandSourceStack source) { int col = 0; int row = 0; - String modid = RegistrarManager.getId(list.get(0).getItem(), Registries.ITEM).getNamespace(); + String modid = RegistrarManager.getId(list.getFirst().getItem(), Registries.ITEM).getNamespace(); for (ItemStack stack : list) { ResourceLocation id = RegistrarManager.getId(stack.getItem(), Registries.ITEM); @@ -362,17 +363,15 @@ private static int generateAllItemChapter(CommandSourceStack source) { quest.onCreated(); quest.setX(col); quest.setY(row); - quest.setRawSubtitle(stack.save(new CompoundTag()).toString()); + quest.setRawSubtitle(stack.save(source.registryAccess(), new CompoundTag()).toString()); - new CreateObjectResponseMessage(quest, null).sendToAll(source.getServer()); + NetworkHelper.sendToAll(source.getServer(), CreateObjectResponseMessage.create(quest, null)); ItemTask task = new ItemTask(chapter.file.newID(), quest); task.onCreated(); task.setStackAndCount(stack, 1).setConsumeItems(Tristate.TRUE); - CompoundTag extra = new CompoundTag(); - extra.putString("type", task.getType().getTypeForNBT()); - new CreateObjectResponseMessage(task, extra).sendToAll(source.getServer()); + NetworkHelper.sendToAll(source.getServer(), CreateObjectMessage.create(task, task.getType().makeExtraNBT())); col++; } @@ -395,9 +394,11 @@ private static int doReload(CommandSourceStack source) { } instance.load(); - new SyncQuestsMessage(instance).sendToAll(source.getServer()); - source.getServer().getPlayerList().getPlayers() - .forEach(p -> new SyncEditorPermissionMessage(PermissionsHelper.hasEditorPermission(p, false)).sendTo(p)); + NetworkHelper.sendToAll(source.getServer(), new SyncQuestsMessage(instance)); + source.getServer().getPlayerList().getPlayers().forEach(p -> { + NetworkManager.sendToPlayer(p, SyncEditorPermissionMessage.forPlayer(p)); + instance.getTranslationManager().sendTranslationsToPlayer(p); + }); source.sendSuccess(() -> Component.translatable("commands.ftbquests.command.feedback.reloaded"), false); UUID id = sender == null ? Util.NIL_UUID : sender.getUUID(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/events/QuestProgressEventData.java b/common/src/main/java/dev/ftb/mods/ftbquests/events/QuestProgressEventData.java index e718e4a28..e089f0e18 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/events/QuestProgressEventData.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/events/QuestProgressEventData.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftbquests.events; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftbquests.net.DisplayCompletionToastMessage; import dev.ftb.mods.ftbquests.quest.QuestObject; import dev.ftb.mods.ftbquests.quest.TeamData; @@ -34,7 +35,7 @@ public void setCompleted(long id) { } public void notifyPlayers(long id) { - notifiedPlayers.forEach(player -> new DisplayCompletionToastMessage(id).sendTo(player)); + notifiedPlayers.forEach(player -> NetworkManager.sendToPlayer(player, new DisplayCompletionToastMessage(id))); } public Date getTime() { diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/integration/RecipeModHelper.java b/common/src/main/java/dev/ftb/mods/ftbquests/integration/RecipeModHelper.java index 67cede3f9..ae28c96b5 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/integration/RecipeModHelper.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/integration/RecipeModHelper.java @@ -4,7 +4,6 @@ import net.minecraft.world.item.ItemStack; import java.util.Collection; -import java.util.Collections; public interface RecipeModHelper { void refreshAll(Components component); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/integration/item_filtering/DisplayStacksCache.java b/common/src/main/java/dev/ftb/mods/ftbquests/integration/item_filtering/DisplayStacksCache.java index 46152c07e..28eb5ac4f 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/integration/item_filtering/DisplayStacksCache.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/integration/item_filtering/DisplayStacksCache.java @@ -4,24 +4,22 @@ import dev.ftb.mods.ftbquests.api.ItemFilterAdapter; import dev.ftb.mods.ftbquests.api.event.CustomFilterDisplayItemsEvent; import dev.ftb.mods.ftbquests.client.FTBQuestsClient; -import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; -import net.minecraft.core.registries.BuiltInRegistries; +import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap; import net.minecraft.world.flag.FeatureFlags; import net.minecraft.world.item.CreativeModeTabs; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.NotNull; import java.util.List; -import java.util.Objects; public class DisplayStacksCache { private static final int MAX_CACHE_SIZE = 1024; - private static final Object2ObjectLinkedOpenHashMap> cache = new Object2ObjectLinkedOpenHashMap<>(MAX_CACHE_SIZE); + private static final Int2ObjectLinkedOpenHashMap> cache = new Int2ObjectLinkedOpenHashMap<>(MAX_CACHE_SIZE); private static List extraCache = null; @NotNull public static List getCachedDisplayStacks(ItemStack filterStack, ItemFilterAdapter adapter) { - CacheKey key = CacheKey.of(filterStack); + int key = ItemStack.hashItemAndComponents(filterStack); List result = cache.getAndMoveToFirst(key); if (result == null) { @@ -68,10 +66,4 @@ private static List getExtraDisplayCache() { } return extraCache; } - - private record CacheKey(int key) { - static CacheKey of(ItemStack filterStack) { - return new CacheKey(Objects.hash(BuiltInRegistries.ITEM.getId(filterStack.getItem()), filterStack.hasTag() ? filterStack.getTag().hashCode() : 0)); - } - } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/integration/item_filtering/ItemMatchingSystem.java b/common/src/main/java/dev/ftb/mods/ftbquests/integration/item_filtering/ItemMatchingSystem.java index e066752e1..d4b9c88e3 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/integration/item_filtering/ItemMatchingSystem.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/integration/item_filtering/ItemMatchingSystem.java @@ -1,7 +1,8 @@ package dev.ftb.mods.ftbquests.integration.item_filtering; +import dev.ftb.mods.ftblibrary.config.NameMap; import dev.ftb.mods.ftbquests.api.ItemFilterAdapter; -import dev.ftb.mods.ftbquests.util.NBTUtils; +import net.minecraft.core.component.DataComponentMap; import net.minecraft.world.item.ItemStack; import java.util.*; @@ -24,10 +25,10 @@ public Optional getFilterAdapter(ItemStack stack) { return adapters.stream().filter(adapter -> adapter.isFilterStack(stack)).findFirst(); } - public boolean doesItemMatch(ItemStack filterStack, ItemStack toCheck, boolean matchNBT, boolean fuzzyNBT) { + public boolean doesItemMatch(ItemStack filterStack, ItemStack toCheck, ComponentMatchType matchType) { return getFilterAdapter(filterStack) .map(adapter -> adapter.doesItemMatch(filterStack, toCheck)) - .orElse(areItemStacksEqual(filterStack, toCheck, matchNBT, fuzzyNBT)); + .orElse(areItemStacksEqual(filterStack, toCheck, matchType)); } public List getAllMatchingStacks(ItemStack filterStack) { @@ -42,19 +43,41 @@ public List getAllMatchingStacks(ItemStack filterStack) { return res.isEmpty() ? List.of(filterStack) : res; } - private boolean areItemStacksEqual(ItemStack stackA, ItemStack stackB, boolean matchNBT, boolean fuzzyNBT) { + private boolean areItemStacksEqual(ItemStack stackA, ItemStack stackB, ComponentMatchType matchType) { if (stackA == stackB) { return true; } else if (stackA.getItem() != stackB.getItem()) { return false; - } else if (!stackA.hasTag() && !stackB.hasTag()) { - return true; } else { - return !matchNBT || NBTUtils.compareNbt(stackA.getTag(), stackB.getTag(), fuzzyNBT, true); + return switch (matchType) { + case NONE -> true; + case FUZZY -> fuzzyMatch(stackA.getComponents(), stackB.getComponents()); + case STRICT -> ItemStack.isSameItemSameComponents(stackA, stackB); + }; } } + private boolean fuzzyMatch(DataComponentMap map, DataComponentMap toMatch) { + return map.stream().allMatch(tc -> toMatch.has(tc.type()) && toMatch.get(tc.type()).equals(tc.value())); + } + public Collection adapters() { return Collections.unmodifiableCollection(adapters); } + + public enum ComponentMatchType { + NONE("none"), + FUZZY("fuzzy"), + STRICT("strict"); + + public static final NameMap NAME_MAP = NameMap.of(NONE, values()) + .id(v -> v.name) + .create(); + + private final String name; + + ComponentMatchType(String name) { + this.name = name; + } + } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/item/CustomIconItem.java b/common/src/main/java/dev/ftb/mods/ftbquests/item/CustomIconItem.java index 765f56aae..8039a55b9 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/item/CustomIconItem.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/item/CustomIconItem.java @@ -1,12 +1,17 @@ package dev.ftb.mods.ftbquests.item; +import dev.ftb.mods.ftblibrary.config.ImageResourceConfig; import dev.ftb.mods.ftblibrary.icon.Icon; import dev.ftb.mods.ftblibrary.icon.ItemIcon; +import dev.ftb.mods.ftbquests.FTBQuests; import dev.ftb.mods.ftbquests.client.FTBQuestsClient; +import dev.ftb.mods.ftbquests.registry.ModDataComponents; +import dev.ftb.mods.ftbquests.registry.ModItems; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; @@ -20,8 +25,12 @@ import java.util.List; public class CustomIconItem extends Item { + private static final ResourceLocation FALLBACK_ICON = new ResourceLocation("minecraft:textures/misc/unknown_pack.png"); + public CustomIconItem() { - super(FTBQuestsItems.defaultProps().stacksTo(1)); + super(ModItems.defaultProps().stacksTo(1) + .component(ModDataComponents.CUSTOM_ICON.get(), FALLBACK_ICON) + ); } @Override @@ -35,25 +44,29 @@ public InteractionResultHolder use(Level level, Player player, Intera @Override @Environment(EnvType.CLIENT) - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip, TooltipFlag flagIn) { + public void appendHoverText(ItemStack stack, @Nullable TooltipContext context, List tooltip, TooltipFlag flagIn) { tooltip.add(Component.translatable("item.ftbquests.custom_icon.tooltip").withStyle(ChatFormatting.GRAY)); - if (stack.hasTag() && stack.getTag().contains("Icon")) { - tooltip.add(Component.literal(stack.getTag().getString("Icon")).withStyle(ChatFormatting.DARK_GRAY)); - } else { - tooltip.add(Component.literal("-").withStyle(ChatFormatting.DARK_GRAY)); - } + String icon = FTBQuests.getComponent(stack, ModDataComponents.CUSTOM_ICON) + .map(ResourceLocation::toString) + .orElse("-"); + tooltip.add(Component.literal(icon).withStyle(ChatFormatting.DARK_GRAY)); } public static Icon getIcon(ItemStack stack) { if (stack.getItem() instanceof CustomIconItem) { - if (stack.hasTag() && stack.getTag().contains("Icon")) { - return Icon.getIcon(stack.getTag().getString("Icon")); - } - - return Icon.getIcon("minecraft:textures/misc/unknown_pack.png"); + ResourceLocation icon = FTBQuests.getComponent(stack, ModDataComponents.CUSTOM_ICON).orElse(FALLBACK_ICON); + return Icon.getIcon(icon); + } else { + return ItemIcon.getItemIcon(stack); } + } - return ItemIcon.getItemIcon(stack); + public static void setIcon(ItemStack stack, @Nullable ResourceLocation texture) { + if (texture == null || texture.equals(ImageResourceConfig.NONE)) { + stack.remove(ModDataComponents.CUSTOM_ICON.get()); + } else { + stack.set(ModDataComponents.CUSTOM_ICON.get(), texture); + } } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/item/LootCrateItem.java b/common/src/main/java/dev/ftb/mods/ftbquests/item/LootCrateItem.java index d4c2095d8..0b42e0934 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/item/LootCrateItem.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/item/LootCrateItem.java @@ -1,9 +1,12 @@ package dev.ftb.mods.ftbquests.item; +import dev.ftb.mods.ftbquests.FTBQuests; import dev.ftb.mods.ftbquests.client.ClientQuestFile; import dev.ftb.mods.ftbquests.client.gui.RewardNotificationsScreen; import dev.ftb.mods.ftbquests.quest.loot.LootCrate; import dev.ftb.mods.ftbquests.quest.loot.WeightedReward; +import dev.ftb.mods.ftbquests.registry.ModDataComponents; +import dev.ftb.mods.ftbquests.registry.ModItems; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; @@ -32,16 +35,17 @@ */ public class LootCrateItem extends Item { public LootCrateItem() { - super(FTBQuestsItems.defaultProps()); + super(ModItems.defaultProps() + .rarity(Rarity.UNCOMMON) + .component(ModDataComponents.LOOT_CRATE.get(), "") + ); } @Nullable public static LootCrate getCrate(ItemStack stack) { - if (stack.hasTag() && stack.getItem() instanceof LootCrateItem) { - return LootCrate.LOOT_CRATES.get(stack.getTag().getString("type")); - } - - return null; + return FTBQuests.getComponent(stack, ModDataComponents.LOOT_CRATE) + .map(type -> LootCrate.LOOT_CRATES.get(type)) + .orElse(null); } @Override @@ -93,15 +97,10 @@ public Component getName(ItemStack stack) { return crate != null && !crate.getItemName().isEmpty() ? Component.translatable(crate.getItemName()) : super.getName(stack); } - @Override - public Rarity getRarity(ItemStack stack) { - return Rarity.UNCOMMON; - } - @Override @Environment(EnvType.CLIENT) - public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag flag) { - if (world == null || !ClientQuestFile.exists()) { + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag flag) { + if (context.registries() == null || !ClientQuestFile.exists()) { return; } @@ -115,7 +114,7 @@ public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag flagIn) { - if (stack.hasTag() && stack.getTag().contains("Item")) { + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag flagIn) { + if (stack.has(ModDataComponents.MISSING_ITEM_DESC.get())) { tooltip.add(Component.translatable("item.ftbquests.missing_item").withStyle(ChatFormatting.RED)); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/item/QuestBarrierBlockItem.java b/common/src/main/java/dev/ftb/mods/ftbquests/item/QuestBarrierBlockItem.java index 820d79baf..e3c6aa1c9 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/item/QuestBarrierBlockItem.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/item/QuestBarrierBlockItem.java @@ -1,28 +1,24 @@ package dev.ftb.mods.ftbquests.item; -import dev.ftb.mods.ftbquests.block.FTBQuestsBlocks; import dev.ftb.mods.ftbquests.client.ClientQuestFile; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; +import dev.ftb.mods.ftbquests.registry.ModBlocks; +import dev.ftb.mods.ftbquests.registry.ModItems; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; import java.util.List; public class QuestBarrierBlockItem extends BlockItem { public QuestBarrierBlockItem() { - super(FTBQuestsBlocks.BARRIER.get(), FTBQuestsItems.defaultProps()); + super(ModBlocks.BARRIER.get(), ModItems.defaultProps()); } @Override - @Environment(EnvType.CLIENT) - public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { - if (level != null) { + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag flag) { + if (context.registries() != null) { tooltip.add(Component.translatable("item.ftbquests.barrier.nogui").withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC)); if (ClientQuestFile.exists() && !ClientQuestFile.INSTANCE.canEdit()) { tooltip.add(Component.translatable("item.ftbquests.barrier.disabled").withStyle(ChatFormatting.RED)); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/item/QuestBookItem.java b/common/src/main/java/dev/ftb/mods/ftbquests/item/QuestBookItem.java index b584f7dd1..07e744ef0 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/item/QuestBookItem.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/item/QuestBookItem.java @@ -3,8 +3,7 @@ import dev.ftb.mods.ftblibrary.core.ItemFTBL; import dev.ftb.mods.ftbquests.client.ClientQuestFile; import dev.ftb.mods.ftbquests.client.FTBQuestsClient; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; +import dev.ftb.mods.ftbquests.registry.ModItems; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; @@ -15,7 +14,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; import java.util.List; @@ -24,7 +22,7 @@ */ public class QuestBookItem extends Item { public QuestBookItem() { - super(FTBQuestsItems.defaultProps().stacksTo(1)); + super(ModItems.defaultProps().stacksTo(1)); ((ItemFTBL) this).setCraftingRemainingItemFTBL(this); } @@ -38,8 +36,7 @@ public InteractionResultHolder use(Level world, Player player, Intera } @Override - @Environment(EnvType.CLIENT) - public void appendHoverText(ItemStack stack, @Nullable Level worldIn, List tooltip, TooltipFlag flagIn) { + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag flagIn) { if (ClientQuestFile.exists() && ClientQuestFile.INSTANCE.isDisableGui() && !ClientQuestFile.INSTANCE.canEdit()) { tooltip.add(Component.translatable("item.ftbquests.book.disabled").withStyle(ChatFormatting.RED)); } else { diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/item/ScreenBlockItem.java b/common/src/main/java/dev/ftb/mods/ftbquests/item/ScreenBlockItem.java index 620d82f95..a2305049f 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/item/ScreenBlockItem.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/item/ScreenBlockItem.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftbquests.item; +import dev.ftb.mods.ftbquests.registry.ModItems; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; @@ -25,7 +26,7 @@ public int getSize() { private final ScreenSize size; public ScreenBlockItem(Block block, ScreenSize size) { - super(block, FTBQuestsItems.defaultProps()); + super(block, ModItems.defaultProps()); this.size = size; } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/item/StageBarrierBlockItem.java b/common/src/main/java/dev/ftb/mods/ftbquests/item/StageBarrierBlockItem.java index 155ffa2f4..853cf8436 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/item/StageBarrierBlockItem.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/item/StageBarrierBlockItem.java @@ -1,26 +1,22 @@ package dev.ftb.mods.ftbquests.item; -import dev.ftb.mods.ftbquests.block.FTBQuestsBlocks; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; +import dev.ftb.mods.ftbquests.registry.ModBlocks; +import dev.ftb.mods.ftbquests.registry.ModItems; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; import java.util.List; public class StageBarrierBlockItem extends BlockItem { public StageBarrierBlockItem() { - super(FTBQuestsBlocks.STAGE_BARRIER.get(), FTBQuestsItems.defaultProps()); + super(ModBlocks.STAGE_BARRIER.get(), ModItems.defaultProps()); } @Override - @Environment(EnvType.CLIENT) - public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag flag) { tooltip.add(Component.translatable("item.ftbquests.barrier.nogui").withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC)); tooltip.add(Component.translatable("item.ftbquests.stage_barrier.config").withStyle(ChatFormatting.GRAY)); } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/item/TaskScreenConfiguratorItem.java b/common/src/main/java/dev/ftb/mods/ftbquests/item/TaskScreenConfiguratorItem.java index 64f35c21f..d8ad00ce1 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/item/TaskScreenConfiguratorItem.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/item/TaskScreenConfiguratorItem.java @@ -1,15 +1,16 @@ package dev.ftb.mods.ftbquests.item; +import dev.architectury.networking.NetworkManager; +import dev.ftb.mods.ftbquests.FTBQuests; import dev.ftb.mods.ftbquests.block.TaskScreenBlock; import dev.ftb.mods.ftbquests.block.entity.ITaskScreen; -import dev.ftb.mods.ftbquests.net.TaskScreenConfigRequest; +import dev.ftb.mods.ftbquests.net.TaskScreenConfigRequestMessage; +import dev.ftb.mods.ftbquests.registry.ModDataComponents; +import dev.ftb.mods.ftbquests.registry.ModItems; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.GlobalPos; -import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; @@ -22,14 +23,13 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Optional; public class TaskScreenConfiguratorItem extends Item { public TaskScreenConfiguratorItem() { - super(FTBQuestsItems.defaultProps()); + super(ModItems.defaultProps()); } @Override @@ -57,13 +57,15 @@ public InteractionResultHolder use(Level level, Player player, Intera } @Override - public void appendHoverText(ItemStack itemStack, @Nullable Level level, List list, TooltipFlag tooltipFlag) { - list.add(Component.translatable("item.ftbquests.task_screen_configurator.tooltip").withStyle(ChatFormatting.GRAY)); + public void appendHoverText(ItemStack itemStack, TooltipContext context, List list, TooltipFlag tooltipFlag) { + if (context.registries() != null) { + list.add(Component.translatable("item.ftbquests.task_screen_configurator.tooltip").withStyle(ChatFormatting.GRAY)); - readBlockPos(itemStack).ifPresent(gPos -> { - String str = gPos.dimension().location() + " / " + posToString(gPos.pos()); - list.add(Component.translatable("ftbquests.message.configurator_bound", str).withStyle(ChatFormatting.DARK_AQUA)); - }); + readBlockPos(itemStack).ifPresent(gPos -> { + String str = gPos.dimension().location() + " / " + posToString(gPos.pos()); + list.add(Component.translatable("ftbquests.message.configurator_bound", str).withStyle(ChatFormatting.DARK_AQUA)); + }); + } } private boolean tryUseOn(ServerPlayer player, ItemStack stack) { @@ -75,7 +77,8 @@ private boolean tryUseOn(ServerPlayer player, ItemStack stack) { } if (level.getBlockEntity(gPos.pos()) instanceof ITaskScreen taskScreen) { if (TaskScreenBlock.hasPermissionToEdit(player, taskScreen)) { - taskScreen.getCoreScreen().ifPresent(coreScreen -> new TaskScreenConfigRequest(coreScreen.getBlockPos()).sendTo(player)); + taskScreen.getCoreScreen().ifPresent(coreScreen -> + NetworkManager.sendToPlayer(player, new TaskScreenConfigRequestMessage(coreScreen.getBlockPos()))); return true; } else { player.displayClientMessage(Component.translatable("block.ftbquests.screen.no_permission").withStyle(ChatFormatting.RED), true); @@ -87,17 +90,12 @@ private boolean tryUseOn(ServerPlayer player, ItemStack stack) { }).orElse(false); } - public static void storeBlockPos(ItemStack itemInHand, Level level, BlockPos clickedPos) { - itemInHand.getOrCreateTag().putLong("pos", clickedPos.asLong()); - itemInHand.getOrCreateTag().putString("dim", level.dimension().location().toString()); + public static void storeBlockPos(ItemStack stack, Level level, BlockPos clickedPos) { + stack.set(ModDataComponents.SCREEN_POS.get(), GlobalPos.of(level.dimension(), clickedPos)); } public static Optional readBlockPos(ItemStack stack) { - if (stack.getItem() instanceof TaskScreenConfiguratorItem && stack.hasTag() && stack.getTag().contains("pos") && stack.getTag().contains("dim")) { - ResourceKey dim = ResourceKey.create(Registries.DIMENSION, new ResourceLocation(stack.getTag().getString("dim"))); - return Optional.of(GlobalPos.of(dim, BlockPos.of(stack.getTag().getLong("pos")))); - } - return Optional.empty(); + return FTBQuests.getComponent(stack, ModDataComponents.SCREEN_POS); } private static String posToString(BlockPos pos) { diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/mixin/ServerGamePacketListenerImplMixin.java b/common/src/main/java/dev/ftb/mods/ftbquests/mixin/ServerGamePacketListenerImplMixin.java new file mode 100644 index 000000000..ecec460f8 --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbquests/mixin/ServerGamePacketListenerImplMixin.java @@ -0,0 +1,24 @@ +package dev.ftb.mods.ftbquests.mixin; + +import dev.ftb.mods.ftbquests.quest.translation.TranslationManager; +import net.minecraft.network.protocol.common.ServerboundClientInformationPacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerGamePacketListenerImpl; +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.callback.CallbackInfo; + +@Mixin(ServerGamePacketListenerImpl.class) +public class ServerGamePacketListenerImplMixin { + @Shadow + public ServerPlayer player; + + @Inject(method = "handleClientInformation", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/protocol/PacketUtils;ensureRunningOnSameThread(Lnet/minecraft/network/protocol/Packet;Lnet/minecraft/network/PacketListener;Lnet/minecraft/server/level/ServerLevel;)V", shift = At.Shift.AFTER)) + public void handleClientInformation(ServerboundClientInformationPacket packet, CallbackInfo ci) { + if (!player.clientInformation().language().equals(packet.information().language())) { + TranslationManager.syncTable(player, packet.information().language()); + } + } +} diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/ChangeChapterGroupMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/ChangeChapterGroupMessage.java index 7d38ca847..1d87c29e5 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/ChangeChapterGroupMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/ChangeChapterGroupMessage.java @@ -1,52 +1,44 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftblibrary.util.NetworkHelper; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.Chapter; import dev.ftb.mods.ftbquests.quest.ChapterGroup; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.util.NetUtils; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -public class ChangeChapterGroupMessage extends BaseC2SMessage { - private final long chapterId; - private final long groupId; +public record ChangeChapterGroupMessage(long chapterId, long groupId) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("change_chapter_group_message")); - public ChangeChapterGroupMessage(FriendlyByteBuf buffer) { - chapterId = buffer.readLong(); - groupId = buffer.readLong(); - } - - public ChangeChapterGroupMessage(long chapterId, long groupId) { - this.chapterId = chapterId; - this.groupId = groupId; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, ChangeChapterGroupMessage::chapterId, + ByteBufCodecs.VAR_LONG, ChangeChapterGroupMessage::groupId, + ChangeChapterGroupMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.CHANGE_CHAPTER_GROUP; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(chapterId); - buffer.writeLong(groupId); - } - - @Override - public void handle(NetworkManager.PacketContext context) { + public static void handle(ChangeChapterGroupMessage message, NetworkManager.PacketContext context) { if (NetUtils.canEdit(context)) { - Chapter chapter = ServerQuestFile.INSTANCE.getChapter(chapterId); + Chapter chapter = ServerQuestFile.INSTANCE.getChapter(message.chapterId); if (chapter != null) { - ChapterGroup group = ServerQuestFile.INSTANCE.getChapterGroup(groupId); + ChapterGroup group = ServerQuestFile.INSTANCE.getChapterGroup(message.groupId); if (chapter.getGroup() != group) { chapter.getGroup().removeChapter(chapter); group.addChapter(chapter); chapter.file.clearCachedData(); chapter.file.markDirty(); - new ChangeChapterGroupResponseMessage(chapterId, groupId).sendToAll(context.getPlayer().getServer()); + NetworkHelper.sendToAll(context.getPlayer().getServer(), + new ChangeChapterGroupResponseMessage(message.chapterId, message.groupId)); } } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/ChangeChapterGroupResponseMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/ChangeChapterGroupResponseMessage.java index c6cf23149..d5472a100 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/ChangeChapterGroupResponseMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/ChangeChapterGroupResponseMessage.java @@ -1,38 +1,28 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -public class ChangeChapterGroupResponseMessage extends BaseS2CMessage { - private final long id; - private final long group; +public record ChangeChapterGroupResponseMessage(long id, long group) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("change_chapter_group_response_message")); - public ChangeChapterGroupResponseMessage(FriendlyByteBuf buffer) { - id = buffer.readLong(); - group = buffer.readLong(); - } - - public ChangeChapterGroupResponseMessage(long i, long g) { - id = i; - group = g; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, ChangeChapterGroupResponseMessage::id, + ByteBufCodecs.VAR_LONG, ChangeChapterGroupResponseMessage::group, + ChangeChapterGroupResponseMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.CHANGE_CHAPTER_GROUP_RESPONSE; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(id); - buffer.writeLong(group); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.changeChapterGroup(id, group); + public static void handle(ChangeChapterGroupResponseMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.changeChapterGroup(message.id, message.group)); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/ChangeProgressMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/ChangeProgressMessage.java index 1fc57e402..8e0d2b06f 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/ChangeProgressMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/ChangeProgressMessage.java @@ -1,61 +1,47 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsClient; import dev.ftb.mods.ftbquests.quest.QuestObjectBase; -import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.quest.TeamData; import dev.ftb.mods.ftbquests.util.NetUtils; import dev.ftb.mods.ftbquests.util.ProgressChange; +import net.minecraft.core.UUIDUtil; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import java.util.UUID; import java.util.function.Consumer; -/** - * @author LatvianModder - */ -public class ChangeProgressMessage extends BaseC2SMessage { - private final UUID teamId; - private final ProgressChange progressChange; +public record ChangeProgressMessage(UUID teamId, ProgressChange progressChange) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("change_progress_message")); - ChangeProgressMessage(FriendlyByteBuf buffer) { - teamId = buffer.readUUID(); - progressChange = new ProgressChange(ServerQuestFile.INSTANCE, buffer); - } - - public ChangeProgressMessage(UUID teamId, ProgressChange progressChange) { - this.teamId = teamId; - this.progressChange = progressChange; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + UUIDUtil.STREAM_CODEC, ChangeProgressMessage::teamId, + ProgressChange.STREAM_CODEC, ChangeProgressMessage::progressChange, + ChangeProgressMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.CHANGE_PROGRESS; + public Type type() { + return TYPE; } - public static void sendToServer(TeamData team, QuestObjectBase object, Consumer progressChange) { - if (team.isLocked()) { - return; + public static void sendToServer(TeamData team, QuestObjectBase object, Consumer changeConsumer) { + if (!team.isLocked()) { + ProgressChange change = new ProgressChange(object, FTBQuestsClient.getClientPlayer().getUUID()); + changeConsumer.accept(change); + NetworkManager.sendToServer(new ChangeProgressMessage(team.getTeamId(), change)); } - - ProgressChange change = new ProgressChange(team.getFile(), object, FTBQuestsClient.getClientPlayer().getUUID()); - progressChange.accept(change); - new ChangeProgressMessage(team.getTeamId(), change).sendToServer(); } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeUUID(teamId); - progressChange.write(buffer); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - if (NetUtils.canEdit(context)) { - progressChange.maybeForceProgress(teamId); - } + public static void handle(ChangeProgressMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + if (NetUtils.canEdit(context)) { + message.progressChange.maybeForceProgress(message.teamId); + } + }); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/ClaimAllRewardsMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/ClaimAllRewardsMessage.java index 7caa5de42..10fe39c8f 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/ClaimAllRewardsMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/ClaimAllRewardsMessage.java @@ -1,43 +1,38 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.quest.TeamData; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.level.ServerPlayer; -/** - * @author LatvianModder - */ -public class ClaimAllRewardsMessage extends BaseC2SMessage { - public ClaimAllRewardsMessage() { - } +public class ClaimAllRewardsMessage implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("claim_all_rewards_message")); - ClaimAllRewardsMessage(FriendlyByteBuf buffer) { - } + public static final ClaimAllRewardsMessage INSTANCE = new ClaimAllRewardsMessage(); - @Override - public MessageType getType() { - return FTBQuestsNetHandler.CLAIM_ALL_REWARDS; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.unit(INSTANCE); @Override - public void write(FriendlyByteBuf buffer) { + public Type type() { + return TYPE; } - @Override - public void handle(NetworkManager.PacketContext context) { - ServerPlayer player = (ServerPlayer) context.getPlayer(); - TeamData data = TeamData.get(player); + public static void handle(ClaimAllRewardsMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + ServerPlayer player = (ServerPlayer) context.getPlayer(); + TeamData data = TeamData.get(player); - ServerQuestFile.INSTANCE.forAllQuests(quest -> { - if (data.isCompleted(quest)) { - quest.getRewards().stream() - .filter(reward -> !reward.getExcludeFromClaimAll()) - .forEach(reward -> data.claimReward(player, reward, true)); - } + ServerQuestFile.INSTANCE.forAllQuests(quest -> { + if (data.isCompleted(quest)) { + quest.getRewards().stream() + .filter(reward -> !reward.getExcludeFromClaimAll()) + .forEach(reward -> data.claimReward(player, reward, true)); + } + }); }); } } \ No newline at end of file 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 ac317056f..fb70ae8a7 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 @@ -1,58 +1,47 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.quest.TeamData; import dev.ftb.mods.ftbquests.quest.loot.RewardTable; import dev.ftb.mods.ftbquests.quest.reward.ChoiceReward; import dev.ftb.mods.ftbquests.quest.reward.Reward; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.level.ServerPlayer; -/** - * @author LatvianModder - */ -public class ClaimChoiceRewardMessage extends BaseC2SMessage { - private final long id; - private final int index; +public record ClaimChoiceRewardMessage(long id, int index) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("claim_choice_reward_message")); - public ClaimChoiceRewardMessage(long i, int idx) { - id = i; - index = idx; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, ClaimChoiceRewardMessage::id, + ByteBufCodecs.VAR_INT, ClaimChoiceRewardMessage::index, + ClaimChoiceRewardMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.CLAIM_CHOICE_REWARD; - } - - ClaimChoiceRewardMessage(FriendlyByteBuf buffer) { - id = buffer.readLong(); - index = buffer.readVarInt(); + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(id); - buffer.writeVarInt(index); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - Reward reward = ServerQuestFile.INSTANCE.getReward(id); + public static void handle(ClaimChoiceRewardMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + Reward reward = ServerQuestFile.INSTANCE.getReward(message.id); - if (reward instanceof ChoiceReward choiceReward && context.getPlayer() instanceof ServerPlayer serverPlayer) { - TeamData data = TeamData.get(serverPlayer); - RewardTable table = choiceReward.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.getQuest())) { - if (index >= 0 && index < table.getWeightedRewards().size()) { - table.getWeightedRewards().get(index).getReward().claim(serverPlayer, true); - data.claimReward(serverPlayer, reward, true); + if (table != null && data.isCompleted(reward.getQuest())) { + if (message.index >= 0 && message.index < table.getWeightedRewards().size()) { + table.getWeightedRewards().get(message.index).getReward().claim(serverPlayer, true); + data.claimReward(serverPlayer, reward, true); + } } } - } + }); } } \ No newline at end of file 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 0d2d04a2d..40b2ea5cf 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 @@ -1,53 +1,42 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.quest.TeamData; import dev.ftb.mods.ftbquests.quest.reward.Reward; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.level.ServerPlayer; -/** - * @author LatvianModder - */ -public class ClaimRewardMessage extends BaseC2SMessage { - private final long id; - private final boolean notify; +public record ClaimRewardMessage(long id, boolean shouldNotify) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("claim_reward_message")); - ClaimRewardMessage(FriendlyByteBuf buffer) { - id = buffer.readLong(); - notify = buffer.readBoolean(); - } - - public ClaimRewardMessage(long i, boolean n) { - id = i; - notify = n; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, ClaimRewardMessage::id, + ByteBufCodecs.BOOL, ClaimRewardMessage::shouldNotify, + ClaimRewardMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.CLAIM_REWARD; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(id); - buffer.writeBoolean(notify); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - Reward reward = ServerQuestFile.INSTANCE.getReward(id); + public static void handle(ClaimRewardMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + Reward reward = ServerQuestFile.INSTANCE.getReward(message.id); - if (reward != null) { - ServerPlayer player = (ServerPlayer) context.getPlayer(); - TeamData teamData = ServerQuestFile.INSTANCE.getOrCreateTeamData(player); + if (reward != null) { + ServerPlayer player = (ServerPlayer) context.getPlayer(); + TeamData teamData = ServerQuestFile.INSTANCE.getOrCreateTeamData(player); - if (teamData.isCompleted(reward.getQuest())) { - teamData.claimReward(player, reward, notify); + if (teamData.isCompleted(reward.getQuest())) { + teamData.claimReward(player, reward, message.shouldNotify); + } } - } + }); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/ClaimRewardResponseMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/ClaimRewardResponseMessage.java index 8bed3d756..120d1cfb0 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/ClaimRewardResponseMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/ClaimRewardResponseMessage.java @@ -1,47 +1,32 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; +import net.minecraft.core.UUIDUtil; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import java.util.UUID; -/** - * @author LatvianModder - */ -public class ClaimRewardResponseMessage extends BaseS2CMessage { - private final UUID team; - private final UUID player; - private final long reward; +public record ClaimRewardResponseMessage(UUID team, UUID player, long reward) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("claim_reward_response_message")); - ClaimRewardResponseMessage(FriendlyByteBuf buffer) { - team = buffer.readUUID(); - player = buffer.readUUID(); - reward = buffer.readLong(); - } - - public ClaimRewardResponseMessage(UUID t, UUID p, long r) { - team = t; - player = p; - reward = r; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + UUIDUtil.STREAM_CODEC, ClaimRewardResponseMessage::team, + UUIDUtil.STREAM_CODEC, ClaimRewardResponseMessage::player, + ByteBufCodecs.VAR_LONG, ClaimRewardResponseMessage::reward, + ClaimRewardResponseMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.CLAIM_REWARD_RESPONSE; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeUUID(team); - buffer.writeUUID(player); - buffer.writeLong(reward); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.claimReward(team, player, reward); + public static void handle(ClaimRewardResponseMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.claimReward(message.team, message.player, message.reward)); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/ClearDisplayCacheMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/ClearDisplayCacheMessage.java index 76ac1a85b..08e210f2c 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/ClearDisplayCacheMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/ClearDisplayCacheMessage.java @@ -1,34 +1,29 @@ 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.architectury.utils.Env; -import dev.architectury.utils.GameInstance; +import dev.ftb.mods.ftblibrary.util.NetworkHelper; import dev.ftb.mods.ftbquests.FTBQuests; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.integration.item_filtering.DisplayStacksCache; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -public class ClearDisplayCacheMessage extends BaseS2CMessage { - public ClearDisplayCacheMessage() { - } +public class ClearDisplayCacheMessage implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("clear_display_cache_message")); - public ClearDisplayCacheMessage(FriendlyByteBuf buf) { - } + private static final ClearDisplayCacheMessage INSTANCE = new ClearDisplayCacheMessage(); - @Override - public MessageType getType() { - return FTBQuestsNetHandler.CLEAR_DISPLAY_CACHE; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.unit(INSTANCE); @Override - public void write(FriendlyByteBuf buf) { + public Type type() { + return TYPE; } - @Override - public void handle(NetworkManager.PacketContext context) { + public static void handle(ClearDisplayCacheMessage message, NetworkManager.PacketContext context) { if (context.getEnvironment() == Env.CLIENT) { context.queue(() -> { DisplayStacksCache.clear(); @@ -40,9 +35,7 @@ public void handle(NetworkManager.PacketContext context) { public static void clearForAll(MinecraftServer server) { if (server != null) { ClearDisplayCacheMessage msg = new ClearDisplayCacheMessage(); - for (ServerPlayer player : server.getPlayerList().getPlayers()) { - msg.sendTo(player); - } + NetworkHelper.sendToAll(server, msg); } } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/CopyChapterImageMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/CopyChapterImageMessage.java index cf8a0ff3c..468127c75 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/CopyChapterImageMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/CopyChapterImageMessage.java @@ -1,44 +1,38 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftblibrary.util.NetworkHelper; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.Chapter; import dev.ftb.mods.ftbquests.quest.ChapterImage; -import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -public class CopyChapterImageMessage extends BaseC2SMessage { - private final ChapterImage img; - private final long chapterId; +public record CopyChapterImageMessage(ChapterImage img) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("copy_chapter_image_message")); - public CopyChapterImageMessage(ChapterImage toCopy, Chapter chapter, double newX, double newY) { - img = toCopy.copy(chapter, newX, newY); - this.chapterId = chapter.id; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ChapterImage.STREAM_CODEC, CopyChapterImageMessage::img, + CopyChapterImageMessage::new + ); - public CopyChapterImageMessage(FriendlyByteBuf buf) { - chapterId = buf.readLong(); - img = new ChapterImage(ServerQuestFile.INSTANCE.getChapter(chapterId)); - img.readNetData(buf); + public CopyChapterImageMessage(ChapterImage toCopy, Chapter chapter, double newX, double newY) { + this(toCopy.copy(chapter, newX, newY)); } @Override - public MessageType getType() { - return FTBQuestsNetHandler.COPY_CHAPTER_IMAGE; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buf) { - buf.writeLong(chapterId); - img.writeNetData(buf); + public static void handle(CopyChapterImageMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + Chapter chapter = message.img.getChapter(); + chapter.addImage(message.img); + chapter.file.markDirty(); + NetworkHelper.sendToAll(context.getPlayer().getServer(), new EditObjectResponseMessage(chapter)); + }); } - @Override - public void handle(NetworkManager.PacketContext context) { - Chapter chapter = img.getChapter(); - chapter.addImage(img); - chapter.file.markDirty(); - new EditObjectResponseMessage(chapter).sendToAll(context.getPlayer().getServer()); - } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/CopyQuestMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/CopyQuestMessage.java index 898311942..d7ab2ed1d 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/CopyQuestMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/CopyQuestMessage.java @@ -1,8 +1,8 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftblibrary.util.NetworkHelper; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.*; import dev.ftb.mods.ftbquests.quest.reward.Reward; import dev.ftb.mods.ftbquests.quest.reward.RewardType; @@ -10,92 +10,78 @@ import dev.ftb.mods.ftbquests.quest.task.TaskType; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.MinecraftServer; import java.util.Objects; -public class CopyQuestMessage extends BaseC2SMessage { - private final long id; - private final long chapterId; - private final double qx; - private final double qy; - private final boolean copyDeps; +public record CopyQuestMessage(long id, long chapterId, double qx, double qy, boolean copyDeps) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("copy_quest_message")); - public CopyQuestMessage(Quest toCopy, Chapter chapter, double qx, double qy, boolean copyDeps) { - id = toCopy.id; - chapterId = chapter.id; - this.qx = qx; - this.qy = qy; - this.copyDeps = copyDeps; - } - - public CopyQuestMessage(FriendlyByteBuf buf) { - this.id = buf.readLong(); - this.chapterId = buf.readLong(); - this.qx = buf.readDouble(); - this.qy = buf.readDouble(); - this.copyDeps = buf.readBoolean(); - } - - @Override - public MessageType getType() { - return FTBQuestsNetHandler.COPY_QUEST; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, CopyQuestMessage::id, + ByteBufCodecs.VAR_LONG, CopyQuestMessage::chapterId, + ByteBufCodecs.DOUBLE, CopyQuestMessage::qx, + ByteBufCodecs.DOUBLE, CopyQuestMessage::qy, + ByteBufCodecs.BOOL, CopyQuestMessage::copyDeps, + CopyQuestMessage::new + ); @Override - public void write(FriendlyByteBuf buf) { - buf.writeLong(id); - buf.writeLong(chapterId); - buf.writeDouble(qx); - buf.writeDouble(qy); - buf.writeBoolean(copyDeps); + public Type type() { + return TYPE; } - @Override - public void handle(NetworkManager.PacketContext context) { - BaseQuestFile file = ServerQuestFile.INSTANCE; - if (file.get(id) instanceof Quest toCopy && file.get(chapterId) instanceof Chapter chapter) { - // deep copy of the quest - Quest newQuest = Objects.requireNonNull(QuestObjectBase.copy(toCopy, () -> new Quest(file.newID(), chapter))); - if (!copyDeps) { - newQuest.clearDependencies(); - } - newQuest.setX(qx); - newQuest.setY(qy); - newQuest.onCreated(); - - // deep copy of all tasks and rewards - toCopy.getTasks().forEach(task -> { - Task newTask = QuestObjectBase.copy(task, () -> TaskType.createTask(file.newID(), newQuest, task.getType().getTypeForNBT())); - if (newTask != null) { - newTask.onCreated(); + public static void handle(CopyQuestMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + BaseQuestFile file = ServerQuestFile.INSTANCE; + if (file.get(message.id) instanceof Quest toCopy && file.get(message.chapterId) instanceof Chapter chapter) { + // deep copy of the quest + Quest newQuest = Objects.requireNonNull(QuestObjectBase.copy(toCopy, () -> new Quest(file.newID(), chapter))); + if (!message.copyDeps) { + newQuest.clearDependencies(); } - }); - for (Reward reward : toCopy.getRewards()) { - Reward newReward = QuestObjectBase.copy(reward, () -> RewardType.createReward(file.newID(), newQuest, reward.getType().getTypeForNBT())); - if (newReward != null) { - newReward.onCreated(); + newQuest.setX(message.qx); + newQuest.setY(message.qy); + newQuest.onCreated(); + + // deep copy of all tasks and rewards + toCopy.getTasks().forEach(task -> { + Task newTask = QuestObjectBase.copy(task, + () -> TaskType.createTask(file.newID(), newQuest, task.getType().getTypeForNBT())); + if (newTask != null) { + newTask.onCreated(); + } + }); + for (Reward reward : toCopy.getRewards()) { + Reward newReward = QuestObjectBase.copy(reward, + () -> RewardType.createReward(file.newID(), newQuest, reward.getType().getTypeForNBT())); + if (newReward != null) { + newReward.onCreated(); + } } - } - // sync new objects to clients - MinecraftServer server = context.getPlayer().getServer(); - new CreateObjectResponseMessage(newQuest, null).sendToAll(server); - newQuest.getTasks().forEach(task -> { - CompoundTag extra = new CompoundTag(); - extra.putString("type", task.getType().getTypeForNBT()); - new CreateObjectResponseMessage(task, extra).sendToAll(server); - }); - newQuest.getRewards().forEach(reward -> { - CompoundTag extra = new CompoundTag(); - extra.putString("type", reward.getType().getTypeForNBT()); - new CreateObjectResponseMessage(reward, extra).sendToAll(server); - }); + // sync new objects to clients + MinecraftServer server = context.getPlayer().getServer(); + NetworkHelper.sendToAll(server, CreateObjectResponseMessage.create(newQuest, null)); + newQuest.getTasks().forEach(task -> { + CompoundTag extra = new CompoundTag(); + extra.putString("type", task.getType().getTypeForNBT()); + NetworkHelper.sendToAll(server, CreateObjectResponseMessage.create(task, extra)); + }); + newQuest.getRewards().forEach(reward -> { + CompoundTag extra = new CompoundTag(); + extra.putString("type", reward.getType().getTypeForNBT()); + NetworkHelper.sendToAll(server, CreateObjectResponseMessage.create(reward, extra)); + }); - // and update the server quest map etc. - ServerQuestFile.INSTANCE.refreshIDMap(); - ServerQuestFile.INSTANCE.clearCachedData(); - ServerQuestFile.INSTANCE.markDirty(); - } + // and update the server quest map etc. + ServerQuestFile.INSTANCE.refreshIDMap(); + ServerQuestFile.INSTANCE.clearCachedData(); + ServerQuestFile.INSTANCE.markDirty(); + } + }); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/CreateObjectMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/CreateObjectMessage.java index dc0495690..f66ce1c82 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/CreateObjectMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/CreateObjectMessage.java @@ -1,8 +1,8 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftblibrary.util.NetworkHelper; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.QuestObjectBase; import dev.ftb.mods.ftbquests.quest.QuestObjectType; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; @@ -10,64 +10,74 @@ import net.minecraft.Util; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.TickTask; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.level.ServerPlayer; import org.jetbrains.annotations.Nullable; -public class CreateObjectMessage extends BaseC2SMessage { - private final long parent; - private final QuestObjectType type; - private final boolean openScreen; - private final CompoundTag nbt; - private final CompoundTag extra; +import java.util.Optional; - CreateObjectMessage(FriendlyByteBuf buffer) { - parent = buffer.readLong(); - type = QuestObjectType.NAME_MAP.read(buffer); - openScreen = buffer.readBoolean(); - nbt = buffer.readNbt(); - extra = buffer.readNbt(); - } +/** + * Received on: SERVER
+ * Sent by client to create a brand-new quest object of any kind + * + * @param parent id of the parent object (the quest id for tasks/chapters, the chapter id for quests/quest links, + * and 1 for everything else) + * @param questObjectType type of the new object + * @param openScreen true if the quest book should be opened after the object is created + * @param nbt the serialized quest data + * @param extra extra data related to the object type (e.g. task type, reward type, chapter group...) + */ +public record CreateObjectMessage(long parent, QuestObjectType questObjectType, boolean openScreen, CompoundTag nbt, Optional extra) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("create_object_message")); - public CreateObjectMessage(QuestObjectBase o, @Nullable CompoundTag e, boolean openScreen) { - parent = o.getParentID(); - type = o.getObjectType(); - this.openScreen = openScreen; - nbt = new CompoundTag(); - o.writeData(nbt); - extra = e; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, CreateObjectMessage::parent, + QuestObjectType.STREAM_CODEC, CreateObjectMessage::questObjectType, + ByteBufCodecs.BOOL, CreateObjectMessage::openScreen, + ByteBufCodecs.COMPOUND_TAG, CreateObjectMessage::nbt, + ByteBufCodecs.optional(ByteBufCodecs.COMPOUND_TAG), CreateObjectMessage::extra, + CreateObjectMessage::new + ); - public CreateObjectMessage(QuestObjectBase o, @Nullable CompoundTag e) { - this(o, e, true); + public static CreateObjectMessage create(QuestObjectBase questObject, @Nullable CompoundTag extra, boolean openScreen) { + return new CreateObjectMessage(questObject.getParentID(), + questObject.getObjectType(), + openScreen, + Util.make(new CompoundTag(), nbt1 -> questObject.writeData(nbt1, questObject.getQuestFile().holderLookup())), + Optional.ofNullable(extra) + ); } - @Override - public MessageType getType() { - return FTBQuestsNetHandler.CREATE_OBJECT; + public static CreateObjectMessage create(QuestObjectBase questObject, @Nullable CompoundTag extra) { + return create(questObject, extra, true); } @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(parent); - QuestObjectType.NAME_MAP.write(buffer, type); - buffer.writeBoolean(openScreen); - buffer.writeNbt(nbt); - buffer.writeNbt(extra); + public Type type() { + return TYPE; } - @Override - public void handle(NetworkManager.PacketContext context) { - if (NetUtils.canEdit(context) && context.getPlayer() instanceof ServerPlayer sp) { - QuestObjectBase object = ServerQuestFile.INSTANCE.create(ServerQuestFile.INSTANCE.newID(), type, parent, extra == null ? new CompoundTag() : extra); - object.readData(nbt); - object.onCreated(); - object.getQuestFile().refreshIDMap(); - object.getQuestFile().clearCachedData(); - object.getQuestFile().markDirty(); + public static void handle(CreateObjectMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + if (NetUtils.canEdit(context) && context.getPlayer() instanceof ServerPlayer sp) { + CompoundTag extra = message.extra.orElse(new CompoundTag()); + + QuestObjectBase object = ServerQuestFile.INSTANCE.create( + ServerQuestFile.INSTANCE.newID(), message.questObjectType, message.parent, extra + ); + object.readData(message.nbt, context.registryAccess()); + + object.onCreated(); + object.getQuestFile().refreshIDMap(); + object.getQuestFile().clearCachedData(); + object.getQuestFile().markDirty(); + + object.getQuestFile().getTranslationManager().processInitialTranslation(extra, object); - new CreateObjectResponseMessage(object, extra, openScreen ? sp.getUUID() : Util.NIL_UUID).sendToAll(sp.getServer()); - } + NetworkHelper.sendToAll(sp.getServer(), CreateObjectResponseMessage.create(object, message.extra.orElse(null), message.openScreen ? sp.getUUID() : null)); + } + }); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/CreateObjectResponseMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/CreateObjectResponseMessage.java index 76e15043b..1500b379d 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/CreateObjectResponseMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/CreateObjectResponseMessage.java @@ -1,74 +1,61 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; import dev.ftb.mods.ftbquests.quest.QuestObjectBase; import dev.ftb.mods.ftbquests.quest.QuestObjectType; import net.minecraft.Util; +import net.minecraft.core.UUIDUtil; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import org.jetbrains.annotations.Nullable; +import java.util.Optional; import java.util.UUID; -/** - * @author LatvianModder - */ -public class CreateObjectResponseMessage extends BaseS2CMessage { - private final long id; - private final long parent; - private final QuestObjectType type; - private final CompoundTag nbt; - private final CompoundTag extra; - private final UUID creator; - - public CreateObjectResponseMessage(FriendlyByteBuf buffer) { - id = buffer.readLong(); - parent = buffer.readLong(); - type = QuestObjectType.NAME_MAP.read(buffer); - nbt = buffer.readNbt(); - extra = buffer.readNbt(); - creator = buffer.readBoolean() ? buffer.readUUID() : Util.NIL_UUID; - } - - public CreateObjectResponseMessage(QuestObjectBase o, @Nullable CompoundTag e) { - this(o, e, Util.NIL_UUID); +public record CreateObjectResponseMessage(long id, long parent, QuestObjectType questObjectType, CompoundTag nbt, Optional extra, Optional creator) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("create_object_response_message")); + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, CreateObjectResponseMessage::id, + ByteBufCodecs.VAR_LONG, CreateObjectResponseMessage::parent, + QuestObjectType.STREAM_CODEC, CreateObjectResponseMessage::questObjectType, + ByteBufCodecs.COMPOUND_TAG, CreateObjectResponseMessage::nbt, + ByteBufCodecs.optional(ByteBufCodecs.COMPOUND_TAG), CreateObjectResponseMessage::extra, + ByteBufCodecs.optional(UUIDUtil.STREAM_CODEC), CreateObjectResponseMessage::creator, + CreateObjectResponseMessage::new + ); + + public static CreateObjectResponseMessage create(QuestObjectBase questObject, @Nullable CompoundTag extra) { + return create(questObject, extra, null); } - public CreateObjectResponseMessage(QuestObjectBase o, @Nullable CompoundTag e, UUID creator) { - id = o.id; - parent = o.getParentID(); - type = o.getObjectType(); - nbt = new CompoundTag(); - o.writeData(nbt); - extra = e; - this.creator = creator; + public static CreateObjectResponseMessage create(QuestObjectBase questObject, @Nullable CompoundTag extra, @Nullable UUID creator) { + return new CreateObjectResponseMessage( + questObject.id, + questObject.getParentID(), + questObject.getObjectType(), + Util.make(new CompoundTag(), nbt1 -> questObject.writeData(nbt1, questObject.getQuestFile().holderLookup())), + Optional.ofNullable(extra), + Optional.ofNullable(creator) + ); } @Override - public MessageType getType() { - return FTBQuestsNetHandler.CREATE_OBJECT_RESPONSE; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(id); - buffer.writeLong(parent); - QuestObjectType.NAME_MAP.write(buffer, type); - buffer.writeNbt(nbt); - buffer.writeNbt(extra); - if (creator.equals(Util.NIL_UUID)) { - buffer.writeBoolean(false); - } else { - buffer.writeBoolean(true); - buffer.writeUUID(creator); - } - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.createObject(id, parent, type, nbt, extra, creator); + public static void handle(CreateObjectResponseMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + FTBQuestsNetClient.createObject( + message.id, message.parent, message.questObjectType, message.nbt, + message.extra.orElse(new CompoundTag()), message.creator.orElse(Util.NIL_UUID) + ); + }); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/CreateOtherTeamDataMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/CreateOtherTeamDataMessage.java index e7890def2..bc30c8fa4 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/CreateOtherTeamDataMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/CreateOtherTeamDataMessage.java @@ -1,37 +1,26 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -/** - * @author LatvianModder - */ -public class CreateOtherTeamDataMessage extends BaseS2CMessage { - private final TeamDataUpdate dataUpdate; +public record CreateOtherTeamDataMessage(TeamDataUpdate dataUpdate) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("create_other_team_data_message")); - CreateOtherTeamDataMessage(FriendlyByteBuf buffer) { - dataUpdate = new TeamDataUpdate(buffer); - } - - public CreateOtherTeamDataMessage(TeamDataUpdate update) { - dataUpdate = update; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + TeamDataUpdate.STREAM_CODEC, CreateOtherTeamDataMessage::dataUpdate, + CreateOtherTeamDataMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.CREATE_OTHER_TEAM_DATA; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - dataUpdate.write(buffer); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.createOtherTeamData(dataUpdate); + public static void handle(CreateOtherTeamDataMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.createOtherTeamData(message.dataUpdate)); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/CreateTaskAtMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/CreateTaskAtMessage.java index 4417b1940..32f7ad265 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/CreateTaskAtMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/CreateTaskAtMessage.java @@ -1,79 +1,76 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftblibrary.util.NetworkHelper; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.Chapter; import dev.ftb.mods.ftbquests.quest.Quest; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.quest.task.Task; import dev.ftb.mods.ftbquests.quest.task.TaskType; import dev.ftb.mods.ftbquests.util.NetUtils; +import net.minecraft.Util; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.level.ServerPlayer; -public class CreateTaskAtMessage extends BaseC2SMessage { - private final long chapterId; - private final double x, y; - private final TaskType type; - private final CompoundTag nbt; +import java.util.Optional; - public CreateTaskAtMessage(Chapter chapter, double x, double y, Task task) { - chapterId = chapter.id; - this.x = x; - this.y = y; - type = task.getType(); - nbt = new CompoundTag(); - task.writeData(nbt); - } +public record CreateTaskAtMessage(long chapterId, double x, double y, int taskTypeId, CompoundTag nbt, Optional extra) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("create_task_at_message")); - CreateTaskAtMessage(FriendlyByteBuf buffer) { - chapterId = buffer.readLong(); - x = buffer.readDouble(); - y = buffer.readDouble(); - type = ServerQuestFile.INSTANCE.getTaskType(buffer.readVarInt()); //taskTypeIds.get(buffer.readVarInt()); - nbt = buffer.readNbt(); - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, CreateTaskAtMessage::chapterId, + ByteBufCodecs.DOUBLE, CreateTaskAtMessage::x, + ByteBufCodecs.DOUBLE, CreateTaskAtMessage::y, + ByteBufCodecs.VAR_INT, CreateTaskAtMessage::taskTypeId, + ByteBufCodecs.COMPOUND_TAG, CreateTaskAtMessage::nbt, + ByteBufCodecs.optional(ByteBufCodecs.COMPOUND_TAG), CreateTaskAtMessage::extra, + CreateTaskAtMessage::new + ); - @Override - public MessageType getType() { - return FTBQuestsNetHandler.CREATE_TASK_AT; + public static CreateTaskAtMessage create(Chapter chapter, double x, double y, Task task, CompoundTag extra) { + return new CreateTaskAtMessage(chapter.id, x, y, task.getType().internalId, + Util.make(new CompoundTag(), nbt1 -> task.writeData(nbt1, chapter.getQuestFile().holderLookup())), + Optional.ofNullable(extra) + ); } @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(chapterId); - buffer.writeDouble(x); - buffer.writeDouble(y); - buffer.writeVarInt(type.internalId); - buffer.writeNbt(nbt); + public Type type() { + return TYPE; } - @Override - public void handle(NetworkManager.PacketContext context) { - if (NetUtils.canEdit(context) && context.getPlayer() instanceof ServerPlayer sp) { - ServerQuestFile file = ServerQuestFile.INSTANCE; - Chapter ch = file.getChapter(chapterId); + public static void handle(CreateTaskAtMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + if (NetUtils.canEdit(context) && context.getPlayer() instanceof ServerPlayer sp) { + ServerQuestFile file = ServerQuestFile.INSTANCE; + Chapter chapter = file.getChapter(message.chapterId); + TaskType taskType = ServerQuestFile.INSTANCE.getTaskType(message.taskTypeId); - if (ch != null) { - Quest quest = new Quest(file.newID(), ch); - quest.setX(x); - quest.setY(y); - quest.onCreated(); - new CreateObjectResponseMessage(quest, null).sendToAll(sp.getServer()); + if (chapter != null && taskType != null) { + Quest quest = new Quest(file.newID(), chapter); + quest.setX(message.x); + quest.setY(message.y); + quest.onCreated(); + NetworkHelper.sendToAll(sp.getServer(), CreateObjectResponseMessage.create(quest, null)); - Task task = type.createTask(file.newID(), quest); - task.readData(nbt); - task.onCreated(); - CompoundTag extra = new CompoundTag(); - extra.putString("type", type.getTypeForNBT()); - new CreateObjectResponseMessage(task, extra, sp.getUUID()).sendToAll(sp.getServer()); + Task task = taskType.createTask(file.newID(), quest); + task.readData(message.nbt, context.registryAccess()); + task.onCreated(); + CompoundTag extra = message.extra.orElse(new CompoundTag()); + file.getTranslationManager().processInitialTranslation(extra, task); + extra.putString("type", taskType.getTypeForNBT()); + NetworkHelper.sendToAll(sp.getServer(), CreateObjectResponseMessage.create(task, extra, sp.getUUID())); - file.refreshIDMap(); - file.clearCachedData(); - file.markDirty(); + file.refreshIDMap(); + file.clearCachedData(); + file.markDirty(); + } } - } + }); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/DeleteObjectMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/DeleteObjectMessage.java index 81cc77fbf..05cdf7391 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/DeleteObjectMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/DeleteObjectMessage.java @@ -1,40 +1,32 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.util.NetUtils; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -/** - * @author LatvianModder - */ -public class DeleteObjectMessage extends BaseC2SMessage { - private final long id; +public record DeleteObjectMessage(long id) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("delete_object_message")); - DeleteObjectMessage(FriendlyByteBuf buffer) { - id = buffer.readLong(); - } - - public DeleteObjectMessage(long i) { - id = i; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, DeleteObjectMessage::id, + DeleteObjectMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.DELETE_OBJECT; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(id); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - if (NetUtils.canEdit(context)) { - ServerQuestFile.INSTANCE.deleteObject(id); - } + public static void handle(DeleteObjectMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + if (NetUtils.canEdit(context)) { + ServerQuestFile.INSTANCE.deleteObject(message.id); + } + }); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/DeleteObjectResponseMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/DeleteObjectResponseMessage.java index 459c9b8bd..08ba5a578 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/DeleteObjectResponseMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/DeleteObjectResponseMessage.java @@ -1,37 +1,26 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -/** - * @author LatvianModder - */ -public class DeleteObjectResponseMessage extends BaseS2CMessage { - private final long id; +public record DeleteObjectResponseMessage(long id) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("delete_object_response_message")); - DeleteObjectResponseMessage(FriendlyByteBuf buffer) { - id = buffer.readLong(); - } - - public DeleteObjectResponseMessage(long i) { - id = i; - } - - @Override - public MessageType getType() { - return FTBQuestsNetHandler.DELETE_OBJECT_RESPONSE; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, DeleteObjectResponseMessage::id, + DeleteObjectResponseMessage::new + ); @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(id); + public Type type() { + return TYPE; } - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.deleteObject(id); - } + public static void handle(DeleteObjectResponseMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.deleteObject(message.id));} } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/DisplayCompletionToastMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/DisplayCompletionToastMessage.java index 79810dd17..8336d144f 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/DisplayCompletionToastMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/DisplayCompletionToastMessage.java @@ -1,37 +1,27 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -/** - * @author LatvianModder - */ -public class DisplayCompletionToastMessage extends BaseS2CMessage { - private final long id; +public record DisplayCompletionToastMessage(long id) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("display_completion_toast_message")); - DisplayCompletionToastMessage(FriendlyByteBuf buffer) { - id = buffer.readLong(); - } - - public DisplayCompletionToastMessage(long i) { - id = i; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, DisplayCompletionToastMessage::id, + DisplayCompletionToastMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.DISPLAY_COMPLETION_TOAST; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(id); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.displayCompletionToast(id); + public static void handle(DisplayCompletionToastMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.displayCompletionToast(message.id)); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/DisplayItemRewardToastMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/DisplayItemRewardToastMessage.java index 6f73e6f0e..fc91eb197 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/DisplayItemRewardToastMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/DisplayItemRewardToastMessage.java @@ -1,42 +1,29 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.world.item.ItemStack; -/** - * @author LatvianModder - */ -public class DisplayItemRewardToastMessage extends BaseS2CMessage { - private final ItemStack stack; - private final int count; +public record DisplayItemRewardToastMessage(ItemStack stack, int count) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("display_item_reward_toast_message")); - DisplayItemRewardToastMessage(FriendlyByteBuf buffer) { - stack = buffer.readItem(); - count = buffer.readVarInt(); - } - - public DisplayItemRewardToastMessage(ItemStack is, int c) { - stack = is; - count = c; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ItemStack.OPTIONAL_STREAM_CODEC, DisplayItemRewardToastMessage::stack, + ByteBufCodecs.VAR_INT, DisplayItemRewardToastMessage::count, + DisplayItemRewardToastMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.DISPLAY_ITEM_REWARD_TOAST; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeItem(stack); - buffer.writeVarInt(count); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.displayItemRewardToast(stack, count); + public static void handle(DisplayItemRewardToastMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.displayItemRewardToast(message.stack, message.count)); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/DisplayRewardToastMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/DisplayRewardToastMessage.java index e4819775f..a310a243a 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/DisplayRewardToastMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/DisplayRewardToastMessage.java @@ -1,48 +1,32 @@ 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.ftblibrary.icon.Icon; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; -import dev.ftb.mods.ftbquests.util.NetUtils; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.ComponentSerialization; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -/** - * @author LatvianModder - */ -public class DisplayRewardToastMessage extends BaseS2CMessage { - private final long id; - private final Component text; - private final Icon icon; +public record DisplayRewardToastMessage(long id, Component text, Icon icon) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("display_reward_toast_message")); - DisplayRewardToastMessage(FriendlyByteBuf buffer) { - id = buffer.readLong(); - text = buffer.readComponent(); - icon = NetUtils.readIcon(buffer); - } - - public DisplayRewardToastMessage(long _id, Component t, Icon i) { - id = _id; - text = t; - icon = i; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, DisplayRewardToastMessage::id, + ComponentSerialization.STREAM_CODEC, DisplayRewardToastMessage::text, + Icon.STREAM_CODEC, DisplayRewardToastMessage::icon, + DisplayRewardToastMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.DISPLAY_REWARD_TOAST; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(id); - buffer.writeComponent(text); - NetUtils.writeIcon(buffer, icon); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.displayRewardToast(id, text, icon); + public static void handle(DisplayRewardToastMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.displayRewardToast(message.id, message.text, message.icon)); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/EditObjectMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/EditObjectMessage.java index 1fb06c497..76dccf7ea 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/EditObjectMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/EditObjectMessage.java @@ -1,59 +1,57 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftblibrary.util.NetworkHelper; import dev.ftb.mods.ftbquests.FTBQuests; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.ClientQuestFile; import dev.ftb.mods.ftbquests.quest.QuestObjectBase; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.util.NetUtils; +import net.minecraft.Util; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -/** - * @author LatvianModder - */ -public class EditObjectMessage extends BaseC2SMessage { - private final long id; - private final CompoundTag nbt; +public record EditObjectMessage(long id, CompoundTag nbt) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("edit_object_message")); - EditObjectMessage(FriendlyByteBuf buffer) { - id = buffer.readLong(); - nbt = buffer.readNbt(); - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, EditObjectMessage::id, + ByteBufCodecs.COMPOUND_TAG, EditObjectMessage::nbt, + EditObjectMessage::new + ); - public EditObjectMessage(QuestObjectBase o) { - id = o.id; - nbt = new CompoundTag(); - o.writeData(nbt); - FTBQuests.getRecipeModHelper().refreshRecipes(o); + public static EditObjectMessage forQuestObject(QuestObjectBase qo) { + FTBQuests.getRecipeModHelper().refreshRecipes(qo); ClientQuestFile.INSTANCE.clearCachedData(); + + return new EditObjectMessage(qo.id, Util.make(new CompoundTag(), nbt1 -> qo.writeData(nbt1, ClientQuestFile.INSTANCE.holderLookup()))); } - @Override - public MessageType getType() { - return FTBQuestsNetHandler.EDIT_OBJECT; + public static void sendToServer(QuestObjectBase qo) { + NetworkManager.sendToServer(forQuestObject(qo)); } @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(id); - buffer.writeNbt(nbt); + public Type type() { + return TYPE; } - @Override - public void handle(NetworkManager.PacketContext context) { - if (NetUtils.canEdit(context)) { - QuestObjectBase object = ServerQuestFile.INSTANCE.getBase(id); - - if (object != null) { - object.readData(nbt); - object.editedFromGUIOnServer(); - ServerQuestFile.INSTANCE.clearCachedData(); - ServerQuestFile.INSTANCE.markDirty(); - new EditObjectResponseMessage(object).sendToAll(context.getPlayer().getServer()); + public static void handle(EditObjectMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + if (NetUtils.canEdit(context)) { + QuestObjectBase object = ServerQuestFile.INSTANCE.getBase(message.id); + if (object != null) { + object.readData(message.nbt, context.registryAccess()); + object.editedFromGUIOnServer(); + ServerQuestFile.INSTANCE.clearCachedData(); + ServerQuestFile.INSTANCE.markDirty(); + NetworkHelper.sendToAll(context.getPlayer().getServer(), new EditObjectResponseMessage(object)); + } } - } + }); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/EditObjectResponseMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/EditObjectResponseMessage.java index 6418b7c6a..bbf31d42d 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/EditObjectResponseMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/EditObjectResponseMessage.java @@ -1,44 +1,35 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; import dev.ftb.mods.ftbquests.quest.QuestObjectBase; +import net.minecraft.Util; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -/** - * @author LatvianModder - */ -public class EditObjectResponseMessage extends BaseS2CMessage { - private final long id; - private final CompoundTag nbt; +public record EditObjectResponseMessage(long id, CompoundTag nbt) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("edit_object_response_message")); - EditObjectResponseMessage(FriendlyByteBuf buffer) { - id = buffer.readLong(); - nbt = buffer.readNbt(); - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, EditObjectResponseMessage::id, + ByteBufCodecs.COMPOUND_TAG, EditObjectResponseMessage::nbt, + EditObjectResponseMessage::new + ); - public EditObjectResponseMessage(QuestObjectBase o) { - id = o.id; - nbt = new CompoundTag(); - o.writeData(nbt); + public EditObjectResponseMessage(QuestObjectBase questObjectBase) { + this(questObjectBase.id, Util.make(new CompoundTag(), nbt1 -> questObjectBase.writeData(nbt1, questObjectBase.getQuestFile().holderLookup()))); } @Override - public MessageType getType() { - return FTBQuestsNetHandler.EDIT_OBJECT_RESPONSE; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(id); - buffer.writeNbt(nbt); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.editObject(id, nbt); + public static void handle(EditObjectResponseMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.editObject(message.id, message.nbt)); } } \ No newline at end of file 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 669193bdf..f6d8a2288 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 @@ -1,83 +1,69 @@ package dev.ftb.mods.ftbquests.net; -import dev.architectury.injectables.annotations.ExpectPlatform; -import dev.architectury.networking.simple.MessageType; -import dev.architectury.networking.simple.SimpleNetworkManager; -import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.ItemStack; +import dev.ftb.mods.ftblibrary.util.NetworkHelper; -public interface FTBQuestsNetHandler { - SimpleNetworkManager NET = SimpleNetworkManager.create(FTBQuestsAPI.MOD_ID); +public class FTBQuestsNetHandler { + public static void init() { + NetworkHelper.registerC2S(ChangeChapterGroupMessage.TYPE, ChangeChapterGroupMessage.STREAM_CODEC, ChangeChapterGroupMessage::handle); + NetworkHelper.registerC2S(ChangeProgressMessage.TYPE, ChangeProgressMessage.STREAM_CODEC, ChangeProgressMessage::handle); + NetworkHelper.registerC2S(ClaimAllRewardsMessage.TYPE, ClaimAllRewardsMessage.STREAM_CODEC, ClaimAllRewardsMessage::handle); + NetworkHelper.registerC2S(ClaimChoiceRewardMessage.TYPE, ClaimChoiceRewardMessage.STREAM_CODEC, ClaimChoiceRewardMessage::handle); + NetworkHelper.registerC2S(ClaimRewardMessage.TYPE, ClaimRewardMessage.STREAM_CODEC, ClaimRewardMessage::handle); + NetworkHelper.registerC2S(CopyChapterImageMessage.TYPE, CopyChapterImageMessage.STREAM_CODEC, CopyChapterImageMessage::handle); + NetworkHelper.registerC2S(CopyQuestMessage.TYPE, CopyQuestMessage.STREAM_CODEC, CopyQuestMessage::handle); + NetworkHelper.registerC2S(CreateObjectMessage.TYPE, CreateObjectMessage.STREAM_CODEC, CreateObjectMessage::handle); + NetworkHelper.registerC2S(CreateTaskAtMessage.TYPE, CreateTaskAtMessage.STREAM_CODEC, CreateTaskAtMessage::handle); + NetworkHelper.registerC2S(DeleteObjectMessage.TYPE, DeleteObjectMessage.STREAM_CODEC, DeleteObjectMessage::handle); + NetworkHelper.registerC2S(EditObjectMessage.TYPE, EditObjectMessage.STREAM_CODEC, EditObjectMessage::handle); + NetworkHelper.registerC2S(ForceSaveMessage.TYPE, ForceSaveMessage.STREAM_CODEC, ForceSaveMessage::handle); + NetworkHelper.registerC2S(GetEmergencyItemsMessage.TYPE, GetEmergencyItemsMessage.STREAM_CODEC, GetEmergencyItemsMessage::handle); + NetworkHelper.registerC2S(MoveChapterGroupMessage.TYPE, MoveChapterGroupMessage.STREAM_CODEC, MoveChapterGroupMessage::handle); + NetworkHelper.registerC2S(MoveChapterMessage.TYPE, MoveChapterMessage.STREAM_CODEC, MoveChapterMessage::handle); + NetworkHelper.registerC2S(MoveMovableMessage.TYPE, MoveMovableMessage.STREAM_CODEC, MoveMovableMessage::handle); + NetworkHelper.registerC2S(RequestTeamDataMessage.TYPE, RequestTeamDataMessage.STREAM_CODEC, RequestTeamDataMessage::handle); + NetworkHelper.registerC2S(RequestTranslationTableMessage.TYPE, RequestTranslationTableMessage.STREAM_CODEC, RequestTranslationTableMessage::handle); + NetworkHelper.registerC2S(SetCustomImageMessage.TYPE, SetCustomImageMessage.STREAM_CODEC, SetCustomImageMessage::handle); + NetworkHelper.registerC2S(SubmitTaskMessage.TYPE, SubmitTaskMessage.STREAM_CODEC, SubmitTaskMessage::handle); + NetworkHelper.registerC2S(SyncStructuresRequestMessage.TYPE, SyncStructuresRequestMessage.STREAM_CODEC, SyncStructuresRequestMessage::handle); + NetworkHelper.registerC2S(SyncTranslationMessageToServer.TYPE, SyncTranslationMessageToServer.STREAM_CODEC, SyncTranslationMessageToServer::handle); + NetworkHelper.registerC2S(TaskScreenConfigResponseMessage.TYPE, TaskScreenConfigResponseMessage.STREAM_CODEC, TaskScreenConfigResponseMessage::handle); + NetworkHelper.registerC2S(ToggleChapterPinnedMessage.TYPE, ToggleChapterPinnedMessage.STREAM_CODEC, ToggleChapterPinnedMessage::handle); + NetworkHelper.registerC2S(ToggleEditingModeMessage.TYPE, ToggleEditingModeMessage.STREAM_CODEC, ToggleEditingModeMessage::handle); + NetworkHelper.registerC2S(TogglePinnedMessage.TYPE, TogglePinnedMessage.STREAM_CODEC, TogglePinnedMessage::handle); - MessageType SYNC_QUESTS = NET.registerS2C("sync_quests", SyncQuestsMessage::new); - MessageType SYNC_TEAM_DATA = NET.registerS2C("sync_team_data", SyncTeamDataMessage::new); - MessageType UPDATE_TASK_PROGRESS = NET.registerS2C("update_task_progress", UpdateTaskProgressMessage::new); - MessageType SUBMIT_TASK = NET.registerC2S("submit_task", SubmitTaskMessage::new); - MessageType CLAIM_REWARD = NET.registerC2S("claim_reward", ClaimRewardMessage::new); - MessageType CLAIM_REWARD_RESPONSE = NET.registerS2C("claim_reward_response", ClaimRewardResponseMessage::new); - MessageType SYNC_EDITING_MODE = NET.registerS2C("sync_editing_mode", SyncEditingModeMessage::new); - MessageType GET_EMERGENCY_ITEMS = NET.registerC2S("get_emergency_items", GetEmergencyItemsMessage::new); - MessageType CREATE_OTHER_TEAM_DATA = NET.registerS2C("create_other_team_data", CreateOtherTeamDataMessage::new); - MessageType CLAIM_ALL_REWARDS = NET.registerC2S("claim_all_rewards", ClaimAllRewardsMessage::new); - MessageType CLAIM_CHOICE_REWARD = NET.registerC2S("claim_choice_reward", ClaimChoiceRewardMessage::new); - MessageType DISPLAY_COMPLETION_TOAST = NET.registerS2C("display_completion_toast", DisplayCompletionToastMessage::new); - MessageType DISPLAY_REWARD_TOAST = NET.registerS2C("display_reward_toast", DisplayRewardToastMessage::new); - MessageType DISPLAY_ITEM_REWARD_TOAST = NET.registerS2C("display_item_reward_toast", DisplayItemRewardToastMessage::new); - MessageType TOGGLE_PINNED = NET.registerC2S("toggle_pinned", TogglePinnedMessage::new); - MessageType TOGGLE_PINNED_RESPONSE = NET.registerS2C("toggle_pinned_response", TogglePinnedResponseMessage::new); - MessageType TOGGLE_CHAPTER_PINNED = NET.registerC2S("toggle_chapter_pinned", ToggleChapterPinnedMessage::new); - MessageType TOGGLE_CHAPTER_PINNED_RESPONSE = NET.registerS2C("toggle_chapter_pinned_response", ToggleChapterPinnedResponseMessage::new); - MessageType TOGGLE_EDITING_MODE = NET.registerC2S("toggle_editing_mode", ToggleEditingModeMessage::new); - MessageType FORCE_SAVE = NET.registerC2S("force_save", ForceSaveMessage::new); - MessageType UPDATE_TEAM_DATA = NET.registerS2C("update_team_data", UpdateTeamDataMessage::new); - MessageType SET_CUSTOM_IMAGE = NET.registerC2S("set_custom_image", SetCustomImageMessage::new); - MessageType OBJECT_STARTED = NET.registerS2C("object_started", ObjectStartedMessage::new); - MessageType OBJECT_COMPLETED = NET.registerS2C("object_completed", ObjectCompletedMessage::new); - MessageType OBJECT_STARTED_RESET = NET.registerS2C("object_started_reset", ObjectStartedResetMessage::new); - MessageType OBJECT_COMPLETED_RESET = NET.registerS2C("object_completed_reset", ObjectCompletedResetMessage::new); - MessageType SYNC_LOCK = NET.registerS2C("sync_lock", SyncLockMessage::new); - MessageType RESET_REWARD = NET.registerS2C("reset_reward", ResetRewardMessage::new); - MessageType TEAM_DATA_CHANGED = NET.registerS2C("team_data_changed", TeamDataChangedMessage::new); - MessageType TASK_SCREEN_CONFIG_REQ = NET.registerS2C("task_screen_config_req", TaskScreenConfigRequest::new); - MessageType TASK_SCREEN_CONFIG_RESP = NET.registerC2S("task_screen_config_resp", TaskScreenConfigResponse::new); - - MessageType CHANGE_PROGRESS = NET.registerC2S("change_progress", ChangeProgressMessage::new); - MessageType CREATE_OBJECT = NET.registerC2S("create_object", CreateObjectMessage::new); - MessageType CREATE_OBJECT_RESPONSE = NET.registerS2C("create_object_response", CreateObjectResponseMessage::new); - MessageType CREATE_TASK_AT = NET.registerC2S("create_task_at", CreateTaskAtMessage::new); - MessageType DELETE_OBJECT = NET.registerC2S("delete_object", DeleteObjectMessage::new); - MessageType DELETE_OBJECT_RESPONSE = NET.registerS2C("delete_object_response", DeleteObjectResponseMessage::new); - MessageType EDIT_OBJECT = NET.registerC2S("edit_object", EditObjectMessage::new); - MessageType EDIT_OBJECT_RESPONSE = NET.registerS2C("edit_object_response", EditObjectResponseMessage::new); - MessageType MOVE_CHAPTER = NET.registerC2S("move_chapter", MoveChapterMessage::new); - MessageType MOVE_CHAPTER_RESPONSE = NET.registerS2C("move_chapter_response", MoveChapterResponseMessage::new); - MessageType MOVE_QUEST = NET.registerC2S("move_quest", MoveMovableMessage::new); - MessageType MOVE_QUEST_RESPONSE = NET.registerS2C("move_quest_response", MoveMovableResponseMessage::new); - MessageType CHANGE_CHAPTER_GROUP = NET.registerC2S("change_chapter_group", ChangeChapterGroupMessage::new); - MessageType CHANGE_CHAPTER_GROUP_RESPONSE = NET.registerS2C("change_chapter_group_response", ChangeChapterGroupResponseMessage::new); - MessageType MOVE_CHAPTER_GROUP = NET.registerC2S("move_chapter_group", MoveChapterGroupMessage::new); - MessageType MOVE_CHAPTER_GROUP_RESPONSE = NET.registerS2C("move_chapter_group_response", MoveChapterGroupResponseMessage::new); - 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 SYNC_STRUCTURES_REQUEST = NET.registerC2S("sync_structures_request", SyncStructuresRequestMessage::new); - MessageType SYNC_STRUCTURES_RESPONSE = NET.registerS2C("sync_structures_response", SyncStructuresResponseMessage::new); - MessageType REQUEST_TEAM_DATA = NET.registerC2S("request_team_data", RequestTeamDataMessage::new); - MessageType SYNC_EDITOR_PERMISSION = NET.registerS2C("sync_editor_permission", SyncEditorPermissionMessage::new); - MessageType OPEN_QUEST_BOOK = NET.registerS2C("open_quest_book", OpenQuestBookMessage::new); - MessageType CLEAR_DISPLAY_CACHE = NET.registerS2C("clear_display_cache", ClearDisplayCacheMessage::new); - - static void init() { - } - - @ExpectPlatform - static void writeItemType(FriendlyByteBuf buffer, ItemStack stack) { - throw new AssertionError(); - } - - @ExpectPlatform - static ItemStack readItemType(FriendlyByteBuf buffer) { - throw new AssertionError(); + NetworkHelper.registerS2C(ChangeChapterGroupResponseMessage.TYPE, ChangeChapterGroupResponseMessage.STREAM_CODEC, ChangeChapterGroupResponseMessage::handle); + NetworkHelper.registerS2C(ClaimRewardResponseMessage.TYPE, ClaimRewardResponseMessage.STREAM_CODEC, ClaimRewardResponseMessage::handle); + NetworkHelper.registerS2C(ClearDisplayCacheMessage.TYPE, ClearDisplayCacheMessage.STREAM_CODEC, ClearDisplayCacheMessage::handle); + NetworkHelper.registerS2C(CreateObjectResponseMessage.TYPE, CreateObjectResponseMessage.STREAM_CODEC, CreateObjectResponseMessage::handle); + NetworkHelper.registerS2C(CreateOtherTeamDataMessage.TYPE, CreateOtherTeamDataMessage.STREAM_CODEC, CreateOtherTeamDataMessage::handle); + NetworkHelper.registerS2C(DeleteObjectResponseMessage.TYPE, DeleteObjectResponseMessage.STREAM_CODEC, DeleteObjectResponseMessage::handle); + NetworkHelper.registerS2C(DisplayCompletionToastMessage.TYPE, DisplayCompletionToastMessage.STREAM_CODEC, DisplayCompletionToastMessage::handle); + NetworkHelper.registerS2C(DisplayItemRewardToastMessage.TYPE, DisplayItemRewardToastMessage.STREAM_CODEC, DisplayItemRewardToastMessage::handle); + NetworkHelper.registerS2C(DisplayRewardToastMessage.TYPE, DisplayRewardToastMessage.STREAM_CODEC, DisplayRewardToastMessage::handle); + NetworkHelper.registerS2C(EditObjectResponseMessage.TYPE, EditObjectResponseMessage.STREAM_CODEC, EditObjectResponseMessage::handle); + NetworkHelper.registerS2C(MoveChapterGroupResponseMessage.TYPE, MoveChapterGroupResponseMessage.STREAM_CODEC, MoveChapterGroupResponseMessage::handle); + NetworkHelper.registerS2C(MoveChapterResponseMessage.TYPE, MoveChapterResponseMessage.STREAM_CODEC, MoveChapterResponseMessage::handle); + NetworkHelper.registerS2C(MoveMovableResponseMessage.TYPE, MoveMovableResponseMessage.STREAM_CODEC, MoveMovableResponseMessage::handle); + NetworkHelper.registerS2C(ObjectCompletedMessage.TYPE, ObjectCompletedMessage.STREAM_CODEC, ObjectCompletedMessage::handle); + NetworkHelper.registerS2C(ObjectCompletedResetMessage.TYPE, ObjectCompletedResetMessage.STREAM_CODEC, ObjectCompletedResetMessage::handle); + NetworkHelper.registerS2C(ObjectStartedMessage.TYPE, ObjectStartedMessage.STREAM_CODEC, ObjectStartedMessage::handle); + NetworkHelper.registerS2C(ObjectStartedResetMessage.TYPE, ObjectStartedResetMessage.STREAM_CODEC, ObjectStartedResetMessage::handle); + NetworkHelper.registerS2C(OpenQuestBookMessage.TYPE, OpenQuestBookMessage.STREAM_CODEC, OpenQuestBookMessage::handle); + NetworkHelper.registerS2C(ResetRewardMessage.TYPE, ResetRewardMessage.STREAM_CODEC, ResetRewardMessage::handle); + NetworkHelper.registerS2C(SyncEditingModeMessage.TYPE, SyncEditingModeMessage.STREAM_CODEC, SyncEditingModeMessage::handle); + NetworkHelper.registerS2C(SyncEditorPermissionMessage.TYPE, SyncEditorPermissionMessage.STREAM_CODEC, SyncEditorPermissionMessage::handle); + NetworkHelper.registerS2C(SyncLockMessage.TYPE, SyncLockMessage.STREAM_CODEC, SyncLockMessage::handle); + NetworkHelper.registerS2C(SyncQuestsMessage.TYPE, SyncQuestsMessage.STREAM_CODEC, SyncQuestsMessage::handle); + NetworkHelper.registerS2C(SyncRewardBlockingMessage.TYPE, SyncRewardBlockingMessage.STREAM_CODEC, SyncRewardBlockingMessage::handle); + NetworkHelper.registerS2C(SyncStructuresResponseMessage.TYPE, SyncStructuresResponseMessage.STREAM_CODEC, SyncStructuresResponseMessage::handle); + NetworkHelper.registerS2C(SyncTeamDataMessage.TYPE, SyncTeamDataMessage.STREAM_CODEC, SyncTeamDataMessage::handle); + NetworkHelper.registerS2C(SyncTranslationMessageToClient.TYPE, SyncTranslationMessageToClient.STREAM_CODEC, SyncTranslationMessageToClient::handle); + NetworkHelper.registerS2C(SyncTranslationTableMessage.TYPE, SyncTranslationTableMessage.STREAM_CODEC, SyncTranslationTableMessage::handle); + NetworkHelper.registerS2C(TaskScreenConfigRequestMessage.TYPE, TaskScreenConfigRequestMessage.STREAM_CODEC, TaskScreenConfigRequestMessage::handle); + NetworkHelper.registerS2C(TeamDataChangedMessage.TYPE, TeamDataChangedMessage.STREAM_CODEC, TeamDataChangedMessage::handle); + NetworkHelper.registerS2C(ToggleChapterPinnedResponseMessage.TYPE, ToggleChapterPinnedResponseMessage.STREAM_CODEC, ToggleChapterPinnedResponseMessage::handle); + NetworkHelper.registerS2C(TogglePinnedResponseMessage.TYPE, TogglePinnedResponseMessage.STREAM_CODEC, TogglePinnedResponseMessage::handle); + NetworkHelper.registerS2C(UpdateTaskProgressMessage.TYPE, UpdateTaskProgressMessage.STREAM_CODEC, UpdateTaskProgressMessage::handle); + NetworkHelper.registerS2C(UpdateTeamDataMessage.TYPE, UpdateTeamDataMessage.STREAM_CODEC, UpdateTeamDataMessage::handle); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/ForceSaveMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/ForceSaveMessage.java index cae6c1435..0db3de189 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/ForceSaveMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/ForceSaveMessage.java @@ -1,37 +1,35 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.integration.PermissionsHelper; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.level.ServerPlayer; -public class ForceSaveMessage extends BaseC2SMessage { - public ForceSaveMessage() { - } +public class ForceSaveMessage implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("force_save_message")); - ForceSaveMessage(FriendlyByteBuf buffer) { - } + public static final ForceSaveMessage INSTANCE = new ForceSaveMessage(); - @Override - public MessageType getType() { - return FTBQuestsNetHandler.FORCE_SAVE; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.unit(INSTANCE); @Override - public void write(FriendlyByteBuf buffer) { + public Type type() { + return TYPE; } - @Override - public void handle(NetworkManager.PacketContext context) { - ServerPlayer player = (ServerPlayer) context.getPlayer(); - if (PermissionsHelper.hasEditorPermission(player, false)) { - ServerQuestFile.INSTANCE.markDirty(); - ServerQuestFile.INSTANCE.saveNow(); - player.displayClientMessage(Component.translatable("ftbquests.gui.saved_on_server"), false); - } + public static void handle(ForceSaveMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + ServerPlayer player = (ServerPlayer) context.getPlayer(); + if (PermissionsHelper.hasEditorPermission(player, false)) { + ServerQuestFile.INSTANCE.markDirty(); + ServerQuestFile.INSTANCE.saveNow(); + player.displayClientMessage(Component.translatable("ftbquests.gui.saved_on_server"), false); + } + }); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/GetEmergencyItemsMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/GetEmergencyItemsMessage.java index 4dd8a288e..0a1e418cb 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/GetEmergencyItemsMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/GetEmergencyItemsMessage.java @@ -2,32 +2,30 @@ import dev.architectury.hooks.item.ItemStackHooks; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.level.ServerPlayer; -public class GetEmergencyItemsMessage extends BaseC2SMessage { - GetEmergencyItemsMessage(FriendlyByteBuf buffer) { - } +public record GetEmergencyItemsMessage() implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("get_emergency_items_message")); - public GetEmergencyItemsMessage() { - } + public static final GetEmergencyItemsMessage INSTANCE = new GetEmergencyItemsMessage(); - @Override - public MessageType getType() { - return FTBQuestsNetHandler.GET_EMERGENCY_ITEMS; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.unit(INSTANCE); @Override - public void write(FriendlyByteBuf buffer) { + public Type type() { + return TYPE; } - @Override - public void handle(NetworkManager.PacketContext context) { - ServerPlayer player = (ServerPlayer) context.getPlayer(); - ServerQuestFile.INSTANCE.getEmergencyItems() - .forEach(stack -> ItemStackHooks.giveItem(player, stack.copy())); + public static void handle(GetEmergencyItemsMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + ServerPlayer player = (ServerPlayer) context.getPlayer(); + ServerQuestFile.INSTANCE.getEmergencyItems() + .forEach(stack -> ItemStackHooks.giveItem(player, stack.copy())); + }); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveChapterGroupMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveChapterGroupMessage.java index e237de52a..d815836ab 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveChapterGroupMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveChapterGroupMessage.java @@ -1,41 +1,33 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.util.NetUtils; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -public class MoveChapterGroupMessage extends BaseC2SMessage { - private final long id; - private final boolean movingUp; +public record MoveChapterGroupMessage(long id, boolean movingUp) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("move_chapter_group_message")); - public MoveChapterGroupMessage(FriendlyByteBuf buffer) { - id = buffer.readLong(); - movingUp = buffer.readBoolean(); - } - - public MoveChapterGroupMessage(long id, boolean movingUp) { - this.id = id; - this.movingUp = movingUp; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, MoveChapterGroupMessage::id, + ByteBufCodecs.BOOL, MoveChapterGroupMessage::movingUp, + MoveChapterGroupMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.MOVE_CHAPTER_GROUP; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(id); - buffer.writeBoolean(movingUp); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - if (NetUtils.canEdit(context)) { - ServerQuestFile.INSTANCE.moveChapterGroup(id, movingUp); - } + public static void handle(MoveChapterGroupMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + if (NetUtils.canEdit(context)) { + ServerQuestFile.INSTANCE.moveChapterGroup(message.id, message.movingUp); + } + }); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveChapterGroupResponseMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveChapterGroupResponseMessage.java index b14e5a0a8..7725c8c85 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveChapterGroupResponseMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveChapterGroupResponseMessage.java @@ -1,41 +1,28 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -/** - * @author LatvianModder - */ -public class MoveChapterGroupResponseMessage extends BaseS2CMessage { - private final long id; - private final boolean up; +public record MoveChapterGroupResponseMessage(long id, boolean movingUp) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("move_chapter_group_response_message")); - MoveChapterGroupResponseMessage(FriendlyByteBuf buffer) { - id = buffer.readLong(); - up = buffer.readBoolean(); - } - - public MoveChapterGroupResponseMessage(long i, boolean u) { - id = i; - up = u; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, MoveChapterGroupResponseMessage::id, + ByteBufCodecs.BOOL, MoveChapterGroupResponseMessage::movingUp, + MoveChapterGroupResponseMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.MOVE_CHAPTER_GROUP_RESPONSE; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(id); - buffer.writeBoolean(up); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.moveChapterGroup(id, up); + public static void handle(MoveChapterGroupResponseMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.moveChapterGroup(message.id, message.movingUp)); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveChapterMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveChapterMessage.java index 92a56d74e..296e2b3bf 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveChapterMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveChapterMessage.java @@ -1,48 +1,41 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftblibrary.util.NetworkHelper; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.Chapter; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.util.NetUtils; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -public class MoveChapterMessage extends BaseC2SMessage { - private final long id; - private final boolean movingUp; +public record MoveChapterMessage(long id, boolean movingUp) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("move_chapter_message")); - public MoveChapterMessage(FriendlyByteBuf buffer) { - id = buffer.readLong(); - movingUp = buffer.readBoolean(); - } - - public MoveChapterMessage(long id, boolean movingUp) { - this.id = id; - this.movingUp = movingUp; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, MoveChapterMessage::id, + ByteBufCodecs.BOOL, MoveChapterMessage::movingUp, + MoveChapterMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.MOVE_CHAPTER; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(id); - buffer.writeBoolean(movingUp); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - if (NetUtils.canEdit(context)) { - Chapter chapter = ServerQuestFile.INSTANCE.getChapter(id); + public static void handle(MoveChapterMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + if (NetUtils.canEdit(context)) { + Chapter chapter = ServerQuestFile.INSTANCE.getChapter(message.id); - if (chapter != null && chapter.getGroup().moveChapterWithinGroup(chapter, movingUp)) { - chapter.file.clearCachedData(); - new MoveChapterResponseMessage(id, movingUp).sendToAll(ServerQuestFile.INSTANCE.server); - chapter.file.markDirty(); + if (chapter != null && chapter.getGroup().moveChapterWithinGroup(chapter, message.movingUp)) { + chapter.file.clearCachedData(); + NetworkHelper.sendToAll(ServerQuestFile.INSTANCE.server, new MoveChapterResponseMessage(message.id, message.movingUp)); + chapter.file.markDirty(); + } } - } + }); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveChapterResponseMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveChapterResponseMessage.java index 722bb18e4..2d440dff8 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveChapterResponseMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveChapterResponseMessage.java @@ -1,41 +1,28 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -/** - * @author LatvianModder - */ -public class MoveChapterResponseMessage extends BaseS2CMessage { - private final long id; - private final boolean up; +public record MoveChapterResponseMessage(long id, boolean movingUp) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("move_chapter_response_message")); - MoveChapterResponseMessage(FriendlyByteBuf buffer) { - id = buffer.readLong(); - up = buffer.readBoolean(); - } - - public MoveChapterResponseMessage(long i, boolean u) { - id = i; - up = u; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, MoveChapterResponseMessage::id, + ByteBufCodecs.BOOL, MoveChapterResponseMessage::movingUp, + MoveChapterResponseMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.MOVE_CHAPTER_RESPONSE; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(id); - buffer.writeBoolean(up); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.moveChapter(id, up); + public static void handle(MoveChapterResponseMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.moveChapter(message.id, message.movingUp)); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveMovableMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveMovableMessage.java index 7bcae6e9d..9eb5a0dac 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveMovableMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveMovableMessage.java @@ -1,53 +1,38 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftblibrary.util.NetworkHelper; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.Movable; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -/** - * @author LatvianModder - */ -public class MoveMovableMessage extends BaseC2SMessage { - private final long id; - private final long chapterID; - private final double x, y; +public record MoveMovableMessage(long id, long chapterID, double x, double y) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("move_movable_message")); - MoveMovableMessage(FriendlyByteBuf buffer) { - id = buffer.readLong(); - chapterID = buffer.readLong(); - x = buffer.readDouble(); - y = buffer.readDouble(); - } - - public MoveMovableMessage(Movable obj, long c, double _x, double _y) { - id = obj.getMovableID(); - chapterID = c; - x = _x; - y = _y; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, MoveMovableMessage::id, + ByteBufCodecs.VAR_LONG, MoveMovableMessage::chapterID, + ByteBufCodecs.DOUBLE, MoveMovableMessage::x, + ByteBufCodecs.DOUBLE, MoveMovableMessage::y, + MoveMovableMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.MOVE_QUEST; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(id); - buffer.writeLong(chapterID); - buffer.writeDouble(x); - buffer.writeDouble(y); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - if (ServerQuestFile.INSTANCE.get(id) instanceof Movable movable) { - movable.onMoved(x, y, chapterID); - ServerQuestFile.INSTANCE.markDirty(); - new MoveMovableResponseMessage(movable, chapterID, x, y).sendToAll(context.getPlayer().getServer()); - } + public static void handle(MoveMovableMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + if (ServerQuestFile.INSTANCE.get(message.id) instanceof Movable movable) { + movable.onMoved(message.x, message.y, message.chapterID); + ServerQuestFile.INSTANCE.markDirty(); + NetworkHelper.sendToAll(ServerQuestFile.INSTANCE.server, new MoveMovableResponseMessage(movable.getMovableID(), message.chapterID, message.x, message.y)); + } + }); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveMovableResponseMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveMovableResponseMessage.java index 6d7783871..1e5c75d3e 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveMovableResponseMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/MoveMovableResponseMessage.java @@ -1,49 +1,30 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; -import dev.ftb.mods.ftbquests.quest.Movable; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -/** - * @author LatvianModder - */ -public class MoveMovableResponseMessage extends BaseS2CMessage { - private final long id; - private final long chapter; - private final double x, y; +public record MoveMovableResponseMessage(long id, long chapterId, double x, double y) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("move_movable_response_message")); - MoveMovableResponseMessage(FriendlyByteBuf buffer) { - id = buffer.readLong(); - chapter = buffer.readLong(); - x = buffer.readDouble(); - y = buffer.readDouble(); - } - - public MoveMovableResponseMessage(Movable movable, long c, double _x, double _y) { - id = movable.getMovableID(); - chapter = c; - x = _x; - y = _y; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, MoveMovableResponseMessage::id, + ByteBufCodecs.VAR_LONG, MoveMovableResponseMessage::chapterId, + ByteBufCodecs.DOUBLE, MoveMovableResponseMessage::x, + ByteBufCodecs.DOUBLE, MoveMovableResponseMessage::y, + MoveMovableResponseMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.MOVE_QUEST_RESPONSE; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(id); - buffer.writeLong(chapter); - buffer.writeDouble(x); - buffer.writeDouble(y); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.moveQuest(id, chapter, x, y); + public static void handle(MoveMovableResponseMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.moveQuest(message.id, message.chapterId, message.x, message.y)); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/ObjectCompletedMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/ObjectCompletedMessage.java index c369c8374..0bf512e67 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/ObjectCompletedMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/ObjectCompletedMessage.java @@ -1,44 +1,32 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; +import net.minecraft.core.UUIDUtil; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import java.util.Date; import java.util.UUID; -/** - * @author LatvianModder - */ -public class ObjectCompletedMessage extends BaseS2CMessage { - private final UUID team; - private final long id; +public record ObjectCompletedMessage(UUID teamId, long id) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("object_completed_message")); - public ObjectCompletedMessage(FriendlyByteBuf buffer) { - team = buffer.readUUID(); - id = buffer.readLong(); - } - - public ObjectCompletedMessage(UUID t, long i) { - team = t; - id = i; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + UUIDUtil.STREAM_CODEC, ObjectCompletedMessage::teamId, + ByteBufCodecs.VAR_LONG, ObjectCompletedMessage::id, + ObjectCompletedMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.OBJECT_COMPLETED; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeUUID(team); - buffer.writeLong(id); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.objectCompleted(team, id, new Date()); + public static void handle(ObjectCompletedMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.objectCompleted(message.teamId, message.id, new Date())); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/ObjectCompletedResetMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/ObjectCompletedResetMessage.java index f29dee8d2..c89a6b2b7 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/ObjectCompletedResetMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/ObjectCompletedResetMessage.java @@ -1,43 +1,31 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; +import net.minecraft.core.UUIDUtil; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import java.util.UUID; -/** - * @author LatvianModder - */ -public class ObjectCompletedResetMessage extends BaseS2CMessage { - private final UUID team; - private final long id; +public record ObjectCompletedResetMessage(UUID teamId, long id) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("object_completed_reset_message")); - public ObjectCompletedResetMessage(FriendlyByteBuf buffer) { - team = buffer.readUUID(); - id = buffer.readLong(); - } - - public ObjectCompletedResetMessage(UUID t, long i) { - team = t; - id = i; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + UUIDUtil.STREAM_CODEC, ObjectCompletedResetMessage::teamId, + ByteBufCodecs.VAR_LONG, ObjectCompletedResetMessage::id, + ObjectCompletedResetMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.OBJECT_COMPLETED_RESET; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeUUID(team); - buffer.writeLong(id); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.objectCompleted(team, id, null); + public static void handle(ObjectCompletedResetMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.objectCompleted(message.teamId, message.id, null)); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/ObjectStartedMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/ObjectStartedMessage.java index 73ec39067..6fe22f7da 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/ObjectStartedMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/ObjectStartedMessage.java @@ -1,44 +1,33 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; +import net.minecraft.core.UUIDUtil; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import java.util.Date; import java.util.UUID; -/** - * @author LatvianModder - */ -public class ObjectStartedMessage extends BaseS2CMessage { - private final UUID team; - private final long id; +public record ObjectStartedMessage(UUID teamId, long id) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("object_started_message")); - public ObjectStartedMessage(FriendlyByteBuf buffer) { - team = buffer.readUUID(); - id = buffer.readLong(); - } - - public ObjectStartedMessage(UUID t, long i) { - team = t; - id = i; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + UUIDUtil.STREAM_CODEC, ObjectStartedMessage::teamId, + ByteBufCodecs.VAR_LONG, ObjectStartedMessage::id, + ObjectStartedMessage::new + ); - @Override - public MessageType getType() { - return FTBQuestsNetHandler.OBJECT_STARTED; - } @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeUUID(team); - buffer.writeLong(id); + public Type type() { + return TYPE; } - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.objectStarted(team, id, new Date()); + public static void handle(ObjectStartedMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.objectStarted(message.teamId, message.id, new Date())); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/ObjectStartedResetMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/ObjectStartedResetMessage.java index bbd9dbfc0..d864889c7 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/ObjectStartedResetMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/ObjectStartedResetMessage.java @@ -1,43 +1,31 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; +import net.minecraft.core.UUIDUtil; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import java.util.UUID; -/** - * @author LatvianModder - */ -public class ObjectStartedResetMessage extends BaseS2CMessage { - private final UUID team; - private final long id; +public record ObjectStartedResetMessage(UUID teamId, long id) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("object_started_reset_message")); - public ObjectStartedResetMessage(FriendlyByteBuf buffer) { - team = buffer.readUUID(); - id = buffer.readLong(); - } - - public ObjectStartedResetMessage(UUID t, long i) { - team = t; - id = i; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + UUIDUtil.STREAM_CODEC, ObjectStartedResetMessage::teamId, + ByteBufCodecs.VAR_LONG, ObjectStartedResetMessage::id, + ObjectStartedResetMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.OBJECT_STARTED_RESET; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeUUID(team); - buffer.writeLong(id); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.objectStarted(team, id, null); + public static void handle(ObjectStartedResetMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.objectStarted(message.teamId, message.id, null)); } } \ No newline at end of file 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 index 3d4f48795..af53ce9e3 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/OpenQuestBookMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/OpenQuestBookMessage.java @@ -1,34 +1,31 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.ClientQuestFile; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -public class OpenQuestBookMessage extends BaseS2CMessage { - private final long id; +public record OpenQuestBookMessage(long id) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("open_quest_book_message")); - public OpenQuestBookMessage(long id) { - this.id = id; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, OpenQuestBookMessage::id, + OpenQuestBookMessage::new + ); - OpenQuestBookMessage(FriendlyByteBuf buf) { - id = buf.readLong(); + public static OpenQuestBookMessage lastOpenedQuest() { + return new OpenQuestBookMessage(0L); } @Override - public MessageType getType() { - return FTBQuestsNetHandler.OPEN_QUEST_BOOK; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buf) { - buf.writeLong(id); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - ClientQuestFile.openBookToQuestObject(id); + public static void handle(OpenQuestBookMessage message, NetworkManager.PacketContext context) { + context.queue(() -> ClientQuestFile.openBookToQuestObject(message.id)); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/RequestTeamDataMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/RequestTeamDataMessage.java index 1d094a252..6d45f45a6 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/RequestTeamDataMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/RequestTeamDataMessage.java @@ -1,35 +1,30 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.TeamData; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.level.ServerPlayer; -public class RequestTeamDataMessage extends BaseC2SMessage { - public RequestTeamDataMessage(FriendlyByteBuf buf) { - } +public record RequestTeamDataMessage() implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("request_team_data_message")); - public RequestTeamDataMessage() { - } + public static final RequestTeamDataMessage INSTANCE = new RequestTeamDataMessage(); - @Override - public MessageType getType() { - return FTBQuestsNetHandler.REQUEST_TEAM_DATA; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.unit(INSTANCE); @Override - public void write(FriendlyByteBuf buf) { + public Type type() { + return TYPE; } - @Override - public void handle(NetworkManager.PacketContext context) { - if (context.getPlayer() instanceof ServerPlayer serverPlayer) { - TeamData data = TeamData.get(serverPlayer); - if (data != null) { - new SyncTeamDataMessage(data, true).sendTo(serverPlayer); + public static void handle(RequestTeamDataMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + if (context.getPlayer() instanceof ServerPlayer serverPlayer) { + NetworkManager.sendToPlayer(serverPlayer, new SyncTeamDataMessage(TeamData.get(serverPlayer))); } - } + }); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/RequestTranslationTableMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/RequestTranslationTableMessage.java new file mode 100644 index 000000000..7bba09788 --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/RequestTranslationTableMessage.java @@ -0,0 +1,39 @@ +package dev.ftb.mods.ftbquests.net; + +import dev.architectury.networking.NetworkManager; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; +import dev.ftb.mods.ftbquests.quest.ServerQuestFile; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.level.ServerPlayer; + +/** + * Received on: SERVER + *
+ * Sent by client when editing locale or auto-locale is changed in the GUI + * + * @param locale the player's editing locale (from config, not necessarily the same as their minecraft language) + */ +public record RequestTranslationTableMessage(String locale) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("request_translation_table")); + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, RequestTranslationTableMessage::locale, + RequestTranslationTableMessage::new + ); + + @Override + public Type type() { + return TYPE; + } + + public static void handle(RequestTranslationTableMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + if (ServerQuestFile.INSTANCE != null && context.getPlayer() instanceof ServerPlayer sp) { + ServerQuestFile.INSTANCE.getTranslationManager().sendTableToPlayer(sp, message.locale); + } + }); + } +} diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/ResetRewardMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/ResetRewardMessage.java index e6ec022b4..bbcfa9a6d 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/ResetRewardMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/ResetRewardMessage.java @@ -1,47 +1,32 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; +import net.minecraft.core.UUIDUtil; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import java.util.UUID; -/** - * @author LatvianModder - */ -public class ResetRewardMessage extends BaseS2CMessage { - private final UUID team; - private final UUID player; - private final long id; +public record ResetRewardMessage(UUID teamId, UUID playerId, long id) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("reset_reward_message")); - ResetRewardMessage(FriendlyByteBuf buffer) { - team = buffer.readUUID(); - player = buffer.readUUID(); - id = buffer.readLong(); - } - - public ResetRewardMessage(UUID t, UUID p, long i) { - team = t; - player = p; - id = i; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + UUIDUtil.STREAM_CODEC, ResetRewardMessage::teamId, + UUIDUtil.STREAM_CODEC, ResetRewardMessage::playerId, + ByteBufCodecs.VAR_LONG, ResetRewardMessage::id, + ResetRewardMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.RESET_REWARD; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeUUID(team); - buffer.writeUUID(player); - buffer.writeLong(id); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.resetReward(team, player, id); + public static void handle(ResetRewardMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.resetReward(message.teamId, message.playerId, message.id)); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/SetCustomImageMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/SetCustomImageMessage.java index b30cb85df..4876e6def 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/SetCustomImageMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/SetCustomImageMessage.java @@ -1,51 +1,34 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; -import dev.ftb.mods.ftblibrary.config.ImageResourceConfig; +import dev.ftb.mods.ftblibrary.util.NetworkHelper; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.item.CustomIconItem; -import net.minecraft.nbt.StringTag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionHand; -/** - * @author LatvianModder - */ -public class SetCustomImageMessage extends BaseC2SMessage { - private final InteractionHand hand; - private final ResourceLocation texture; +public record SetCustomImageMessage(InteractionHand hand, ResourceLocation texture) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("set_custom_image_message")); - SetCustomImageMessage(FriendlyByteBuf buffer) { - hand = buffer.readBoolean() ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; - texture = buffer.readResourceLocation(); - } - - public SetCustomImageMessage(InteractionHand h, ResourceLocation t) { - hand = h; - texture = t; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + NetworkHelper.enumStreamCodec(InteractionHand.class), SetCustomImageMessage::hand, + ResourceLocation.STREAM_CODEC, SetCustomImageMessage::texture, + SetCustomImageMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.SET_CUSTOM_IMAGE; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeBoolean(hand == InteractionHand.MAIN_HAND); - buffer.writeResourceLocation(texture); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - if (context.getPlayer().getItemInHand(hand).getItem() instanceof CustomIconItem) { - if (texture.equals(ImageResourceConfig.NONE)) { - context.getPlayer().getItemInHand(hand).removeTagKey("Icon"); - } else { - context.getPlayer().getItemInHand(hand).addTagElement("Icon", StringTag.valueOf(texture.toString())); + public static void handle(SetCustomImageMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + if (context.getPlayer().getItemInHand(message.hand).getItem() instanceof CustomIconItem) { + CustomIconItem.setIcon(context.getPlayer().getItemInHand(message.hand), message.texture); } - } + }); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/SubmitTaskMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/SubmitTaskMessage.java index 7aeb1bcbd..b46235b86 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/SubmitTaskMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/SubmitTaskMessage.java @@ -1,48 +1,40 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.quest.TeamData; import dev.ftb.mods.ftbquests.quest.task.Task; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.level.ServerPlayer; -/** - * @author LatvianModder - */ -public class SubmitTaskMessage extends BaseC2SMessage { - private final long taskId; +public record SubmitTaskMessage(long taskId) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("submit_task_message")); - SubmitTaskMessage(FriendlyByteBuf buffer) { - taskId = buffer.readLong(); - } - - public SubmitTaskMessage(long taskId) { - this.taskId = taskId; - } - - @Override - public MessageType getType() { - return FTBQuestsNetHandler.SUBMIT_TASK; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, SubmitTaskMessage::taskId, + SubmitTaskMessage::new + ); @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(taskId); + public Type type() { + return TYPE; } - @Override - public void handle(NetworkManager.PacketContext context) { - ServerPlayer player = (ServerPlayer) context.getPlayer(); - - TeamData data = TeamData.get(player); - if (!data.isLocked()) { - Task task = data.getFile().getTask(taskId); - if (task != null && data.getFile() instanceof ServerQuestFile sqf && data.canStartTasks(task.getQuest())) { - sqf.withPlayerContext(player, () -> task.submitTask(data, player)); - } + public static void handle(SubmitTaskMessage message, NetworkManager.PacketContext context) { + if (context.getPlayer() instanceof ServerPlayer player) { + context.queue(() -> { + TeamData data = TeamData.get(player); + if (!data.isLocked()) { + Task task = data.getFile().getTask(message.taskId); + if (task != null && data.getFile() instanceof ServerQuestFile sqf && data.canStartTasks(task.getQuest())) { + sqf.withPlayerContext(player, () -> task.submitTask(data, player)); + } + } + }); } } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncEditingModeMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncEditingModeMessage.java index d6c1d0557..e4340fe0f 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncEditingModeMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncEditingModeMessage.java @@ -1,43 +1,31 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; +import net.minecraft.core.UUIDUtil; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import java.util.UUID; -/** - * @author LatvianModder - */ -public class SyncEditingModeMessage extends BaseS2CMessage { - private final UUID uuid; - private final boolean editingMode; +public record SyncEditingModeMessage(UUID teamId, boolean editingMode) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("sync_editing_mode_message")); - public SyncEditingModeMessage(FriendlyByteBuf buffer) { - uuid = buffer.readUUID(); - editingMode = buffer.readBoolean(); - } - - public SyncEditingModeMessage(UUID id, boolean e) { - uuid = id; - editingMode = e; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + UUIDUtil.STREAM_CODEC, SyncEditingModeMessage::teamId, + ByteBufCodecs.BOOL, SyncEditingModeMessage::editingMode, + SyncEditingModeMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.SYNC_EDITING_MODE; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeUUID(uuid); - buffer.writeBoolean(editingMode); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.syncEditingMode(uuid, editingMode); + public static void handle(SyncEditingModeMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.syncEditingMode(message.teamId, message.editingMode)); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncEditorPermissionMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncEditorPermissionMessage.java index 7c3ea1d47..d442d01cc 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncEditorPermissionMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncEditorPermissionMessage.java @@ -1,34 +1,33 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; +import dev.ftb.mods.ftbquests.integration.PermissionsHelper; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.level.ServerPlayer; -public class SyncEditorPermissionMessage extends BaseS2CMessage { - private final boolean hasPermission; +public record SyncEditorPermissionMessage(boolean hasPermission) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("sync_editor_permission_message")); - public SyncEditorPermissionMessage(boolean hasPermission) { - this.hasPermission = hasPermission; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.BOOL, SyncEditorPermissionMessage::hasPermission, + SyncEditorPermissionMessage::new + ); - public SyncEditorPermissionMessage(FriendlyByteBuf buf) { - hasPermission = buf.readBoolean(); + public static SyncEditorPermissionMessage forPlayer(ServerPlayer p) { + return new SyncEditorPermissionMessage(PermissionsHelper.hasEditorPermission(p, false)); } @Override - public MessageType getType() { - return FTBQuestsNetHandler.SYNC_EDITOR_PERMISSION; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buf) { - buf.writeBoolean(hasPermission); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.setEditorPermission(hasPermission); + public static void handle(SyncEditorPermissionMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.setEditorPermission(message.hasPermission)); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncLockMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncLockMessage.java index 73eafd1e9..54cee648d 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncLockMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncLockMessage.java @@ -1,43 +1,31 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; +import net.minecraft.core.UUIDUtil; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import java.util.UUID; -/** - * @author LatvianModder - */ -public class SyncLockMessage extends BaseS2CMessage { - private final UUID id; - private final boolean lock; +public record SyncLockMessage(UUID teamId, boolean lock) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("sync_lock_message")); - public SyncLockMessage(FriendlyByteBuf buffer) { - id = buffer.readUUID(); - lock = buffer.readBoolean(); - } - - public SyncLockMessage(UUID i, boolean e) { - id = i; - lock = e; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + UUIDUtil.STREAM_CODEC, SyncLockMessage::teamId, + ByteBufCodecs.BOOL, SyncLockMessage::lock, + SyncLockMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.SYNC_LOCK; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeUUID(id); - buffer.writeBoolean(lock); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.syncLock(id, lock); + public static void handle(SyncLockMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.syncLock(message.teamId, message.lock)); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncQuestsMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncQuestsMessage.java index 46b2e1bd1..532e94f48 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncQuestsMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncQuestsMessage.java @@ -1,44 +1,33 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.ClientQuestFile; -import dev.ftb.mods.ftbquests.client.FTBQuestsClient; import dev.ftb.mods.ftbquests.quest.BaseQuestFile; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -/** - * @author LatvianModder - */ -public class SyncQuestsMessage extends BaseS2CMessage { - private final BaseQuestFile file; +public record SyncQuestsMessage(BaseQuestFile file) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("sync_quests_message")); - SyncQuestsMessage(FriendlyByteBuf buffer) { - file = FTBQuestsClient.createClientQuestFile(); - file.readNetDataFull(buffer); - } - - public SyncQuestsMessage(BaseQuestFile f) { - file = f; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + BaseQuestFile.STREAM_CODEC, SyncQuestsMessage::file, + SyncQuestsMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.SYNC_QUESTS; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - file.writeNetDataFull(buffer); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - ClientQuestFile.syncFromServer(file); + public static void handle(SyncQuestsMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + ClientQuestFile.syncFromServer(message.file); - ClientQuestFile.INSTANCE.updateLootCrates(); + ClientQuestFile.INSTANCE.updateLootCrates(); - new RequestTeamDataMessage().sendToServer(); + NetworkManager.sendToServer(RequestTeamDataMessage.INSTANCE); + }); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncRewardBlockingMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncRewardBlockingMessage.java index ca3bb58bb..4824ab958 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncRewardBlockingMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncRewardBlockingMessage.java @@ -1,40 +1,31 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; +import net.minecraft.core.UUIDUtil; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import java.util.UUID; -public class SyncRewardBlockingMessage extends BaseS2CMessage { - private final UUID uuid; - private final boolean rewardsBlocked; +public record SyncRewardBlockingMessage(UUID teamId, boolean rewardsBlocked) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("sync_reward_blocking_message")); - public SyncRewardBlockingMessage(UUID uuid, boolean rewardsBlocked) { - this.uuid = uuid; - this.rewardsBlocked = rewardsBlocked; - } - - public SyncRewardBlockingMessage(FriendlyByteBuf buf) { - this.uuid = buf.readUUID(); - this.rewardsBlocked = buf.readBoolean(); - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + UUIDUtil.STREAM_CODEC, SyncRewardBlockingMessage::teamId, + ByteBufCodecs.BOOL, SyncRewardBlockingMessage::rewardsBlocked, + SyncRewardBlockingMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.SYNC_REWARD_BLOCKING; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buf) { - buf.writeUUID(uuid); - buf.writeBoolean(rewardsBlocked); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.syncRewardBlocking(uuid, rewardsBlocked); + public static void handle(SyncRewardBlockingMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.syncRewardBlocking(message.teamId, message.rewardsBlocked)); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncStructuresRequestMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncStructuresRequestMessage.java index 9270f62f9..019a6e1b5 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncStructuresRequestMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncStructuresRequestMessage.java @@ -1,31 +1,29 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.level.ServerPlayer; -public class SyncStructuresRequestMessage extends BaseC2SMessage { - public SyncStructuresRequestMessage() { - } +public record SyncStructuresRequestMessage() implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("sync_structures_request_message")); - public SyncStructuresRequestMessage(FriendlyByteBuf buf) { - } + public static final SyncStructuresRequestMessage INSTANCE = new SyncStructuresRequestMessage(); - @Override - public MessageType getType() { - return FTBQuestsNetHandler.SYNC_STRUCTURES_REQUEST; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.unit(INSTANCE); @Override - public void write(FriendlyByteBuf buf) { + public Type type() { + return TYPE; } - @Override - public void handle(NetworkManager.PacketContext context) { - if (context.getPlayer() instanceof ServerPlayer sp && sp.getServer() != null) { - new SyncStructuresResponseMessage(sp.getServer()).sendTo(sp); - } + public static void handle(SyncStructuresRequestMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + if (context.getPlayer() instanceof ServerPlayer sp && sp.getServer() != null) { + NetworkManager.sendToPlayer(sp, SyncStructuresResponseMessage.create(sp.getServer())); + } + }); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncStructuresResponseMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncStructuresResponseMessage.java index 1baf53107..e0c437d59 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncStructuresResponseMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncStructuresResponseMessage.java @@ -1,20 +1,28 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.task.StructureTask; import net.minecraft.core.registries.Registries; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.MinecraftServer; import java.util.ArrayList; import java.util.List; -public class SyncStructuresResponseMessage extends BaseS2CMessage { - private final List data = new ArrayList<>(); +public record SyncStructuresResponseMessage(List data) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("sync_structures_response_message")); - public SyncStructuresResponseMessage(MinecraftServer server) { + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8.apply(ByteBufCodecs.list()), SyncStructuresResponseMessage::data, + SyncStructuresResponseMessage::new + ); + + public static SyncStructuresResponseMessage create(MinecraftServer server) { + List data = new ArrayList<>(); data.addAll(server.registryAccess() .registryOrThrow(Registries.STRUCTURE).registryKeySet().stream() .map(o -> o.location().toString()) @@ -27,28 +35,15 @@ public SyncStructuresResponseMessage(MinecraftServer server) { .sorted(String::compareTo) .toList() ); - } - - public SyncStructuresResponseMessage(FriendlyByteBuf buf) { - int size = buf.readVarInt(); - for (int i = 0; i < size; i++) { - data.add(buf.readUtf(Short.MAX_VALUE)); - } + return new SyncStructuresResponseMessage(data); } @Override - public MessageType getType() { - return FTBQuestsNetHandler.SYNC_STRUCTURES_RESPONSE; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buf) { - buf.writeVarInt(data.size()); - data.forEach(buf::writeUtf); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - StructureTask.syncKnownStructureList(data); + public static void handle(SyncStructuresResponseMessage message, NetworkManager.PacketContext context) { + context.queue(() -> StructureTask.syncKnownStructureList(message.data)); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncTeamDataMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncTeamDataMessage.java index 40b628502..4a76b5c74 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncTeamDataMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncTeamDataMessage.java @@ -1,45 +1,27 @@ 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 dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; import dev.ftb.mods.ftbquests.quest.TeamData; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -/** - * @author LatvianModder - */ -public class SyncTeamDataMessage extends BaseS2CMessage { - private final boolean self; - private final TeamData teamData; +public record SyncTeamDataMessage(TeamData teamData) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("sync_team_data_message")); - SyncTeamDataMessage(FriendlyByteBuf buffer) { - self = buffer.readBoolean(); - teamData = new TeamData(buffer.readUUID(), ClientQuestFile.INSTANCE); - teamData.read(buffer, self); - } - - public SyncTeamDataMessage(TeamData teamData, boolean self) { - this.self = self; - this.teamData = teamData; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + TeamData.STREAM_CODEC, SyncTeamDataMessage::teamData, + SyncTeamDataMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.SYNC_TEAM_DATA; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeBoolean(self); - buffer.writeUUID(teamData.getTeamId()); - teamData.write(buffer, self); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.syncTeamData(self, teamData); + public static void handle(SyncTeamDataMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.syncTeamData(message.teamData)); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncTranslationMessageToClient.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncTranslationMessageToClient.java new file mode 100644 index 000000000..afbe3f55d --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncTranslationMessageToClient.java @@ -0,0 +1,65 @@ +package dev.ftb.mods.ftbquests.net; + +import com.mojang.datafixers.util.Either; +import dev.architectury.networking.NetworkManager; +import dev.ftb.mods.ftblibrary.util.NetworkHelper; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; +import dev.ftb.mods.ftbquests.client.ClientQuestFile; +import dev.ftb.mods.ftbquests.quest.QuestObjectBase; +import dev.ftb.mods.ftbquests.quest.translation.TranslationKey; +import dev.ftb.mods.ftbquests.util.NetUtils; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; + +import java.util.ArrayList; +import java.util.List; + +/** + * Received on: CLIENT + * Sent by server when a new quest object has just been created, to update all clients of its translation(s) + * + * @param id the quest object id + * @param locale the current editing locale + * @param subKey identifies which translation in the quest object this is + * @param val the content; a string or list of string, depending on the subkey + */ +public record SyncTranslationMessageToClient(long id, String locale, TranslationKey subKey, Either> val) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("sync_translation_to_client")); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, SyncTranslationMessageToClient::id, + ByteBufCodecs.STRING_UTF8, SyncTranslationMessageToClient::locale, + NetworkHelper.enumStreamCodec(TranslationKey.class), SyncTranslationMessageToClient::subKey, + ByteBufCodecs.either(ByteBufCodecs.STRING_UTF8, ByteBufCodecs.STRING_UTF8.apply(ByteBufCodecs.collection(ArrayList::new))), SyncTranslationMessageToClient::val, + SyncTranslationMessageToClient::new + ); + + public static SyncTranslationMessageToClient create(QuestObjectBase obj, String locale, TranslationKey subKey, String text) { + return new SyncTranslationMessageToClient(obj.id, locale, subKey, Either.left(text)); + } + + public static SyncTranslationMessageToClient create(QuestObjectBase obj, String locale, TranslationKey subKey, List list) { + return new SyncTranslationMessageToClient(obj.id, locale, subKey, Either.right(list)); + } + + @Override + public Type type() { + return TYPE; + } + + public static void handle(SyncTranslationMessageToClient message, NetworkManager.PacketContext context) { + context.queue(() -> { + ClientQuestFile file = ClientQuestFile.INSTANCE; + if (file.isValid() && NetUtils.canEdit(context)) { + QuestObjectBase object = file.getBase(message.id); + if (object != null) { + message.val.ifLeft(str -> file.getTranslationManager().addTranslation(object, message.locale, message.subKey, str)) + .ifRight(list -> file.getTranslationManager().addTranslation(object, message.locale, message.subKey, list)); + object.clearCachedData(); + } + } + }); + } +} diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncTranslationMessageToServer.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncTranslationMessageToServer.java new file mode 100644 index 000000000..665e06a1e --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncTranslationMessageToServer.java @@ -0,0 +1,71 @@ +package dev.ftb.mods.ftbquests.net; + +import com.mojang.datafixers.util.Either; +import dev.architectury.networking.NetworkManager; +import dev.ftb.mods.ftblibrary.util.NetworkHelper; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; +import dev.ftb.mods.ftbquests.quest.QuestObjectBase; +import dev.ftb.mods.ftbquests.quest.ServerQuestFile; +import dev.ftb.mods.ftbquests.quest.translation.TranslationKey; +import dev.ftb.mods.ftbquests.util.NetUtils; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; + +import java.util.ArrayList; +import java.util.List; + +/** + * Received on: SERVER + * Sent by client when any translatable text is updated via GUI for an existing object + * + * @param id the quest object id + * @param locale the current editing locale + * @param subKey identifies which translation in the quest object this is + * @param val the content; a string or list of string, depending on the subkey + */ +public record SyncTranslationMessageToServer(long id, String locale, TranslationKey subKey, Either> val) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("sync_translation_to_server")); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, SyncTranslationMessageToServer::id, + ByteBufCodecs.STRING_UTF8, SyncTranslationMessageToServer::locale, + NetworkHelper.enumStreamCodec(TranslationKey.class), SyncTranslationMessageToServer::subKey, + ByteBufCodecs.either(ByteBufCodecs.STRING_UTF8, ByteBufCodecs.STRING_UTF8.apply(ByteBufCodecs.collection(ArrayList::new))), SyncTranslationMessageToServer::val, + SyncTranslationMessageToServer::new + ); + + public static SyncTranslationMessageToServer create(QuestObjectBase obj, String locale, TranslationKey subKey, String text) { + return new SyncTranslationMessageToServer(obj.id, locale, subKey, subKey.validate(Either.left(text))); + } + + public static SyncTranslationMessageToServer create(QuestObjectBase obj, String locale, TranslationKey subKey, List list) { + return new SyncTranslationMessageToServer(obj.id, locale, subKey, subKey.validate(Either.right(list))); + } + + public SyncTranslationMessageToClient createResponse() { + return new SyncTranslationMessageToClient(id, locale, subKey, val); + } + + @Override + public Type type() { + return TYPE; + } + + public static void handle(SyncTranslationMessageToServer message, NetworkManager.PacketContext context) { + context.queue(() -> { + if (NetUtils.canEdit(context)) { + ServerQuestFile file = ServerQuestFile.INSTANCE; + if (file.isValid()) { + QuestObjectBase object = file.getBase(message.id); + if (object != null) { + message.val.ifLeft(str -> file.getTranslationManager().addTranslation(object, message.locale, message.subKey, str)) + .ifRight(list -> file.getTranslationManager().addTranslation(object, message.locale, message.subKey, list)); + NetworkHelper.sendToAll(file.server, message.createResponse()); + } + } + } + }); + } +} diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncTranslationTableMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncTranslationTableMessage.java new file mode 100644 index 000000000..6dadadf31 --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/SyncTranslationTableMessage.java @@ -0,0 +1,42 @@ +package dev.ftb.mods.ftbquests.net; + +import dev.architectury.networking.NetworkManager; +import dev.ftb.mods.ftbquests.FTBQuests; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; +import dev.ftb.mods.ftbquests.client.ClientQuestFile; +import dev.ftb.mods.ftbquests.quest.translation.TranslationTable; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; + +/** + * Received on: CLIENT + * Sent by server to sync the translations for one locale, when player logs in or changes their client language + * + * @param locale the locale this table is for + * @param table the translation table itself + */ +public record SyncTranslationTableMessage(String locale, TranslationTable table) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("sync_translation_table")); + + public static StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, SyncTranslationTableMessage::locale, + TranslationTable.STREAM_CODEC, SyncTranslationTableMessage::table, + SyncTranslationTableMessage::new + ); + + @Override + public Type type() { + return TYPE; + } + + public static void handle(SyncTranslationTableMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + ClientQuestFile.INSTANCE.getTranslationManager().syncTableFromServer(message.locale, message.table); + ClientQuestFile.INSTANCE.clearCachedData(); + ClientQuestFile.INSTANCE.refreshGui(); + FTBQuests.LOGGER.info("received translation table {} (with {} entries) from server", message.locale, message.table.size()); + }); + } +} diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/TaskScreenConfigRequest.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/TaskScreenConfigRequest.java deleted file mode 100644 index 5b4b4cdf9..000000000 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/TaskScreenConfigRequest.java +++ /dev/null @@ -1,35 +0,0 @@ -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.FTBQuestsClient; -import net.minecraft.core.BlockPos; -import net.minecraft.network.FriendlyByteBuf; - -public class TaskScreenConfigRequest extends BaseS2CMessage { - private final BlockPos pos; - - public TaskScreenConfigRequest(BlockPos pos) { - this.pos = pos; - } - - public TaskScreenConfigRequest(FriendlyByteBuf buf) { - this.pos = buf.readBlockPos(); - } - - @Override - public MessageType getType() { - return FTBQuestsNetHandler.TASK_SCREEN_CONFIG_REQ; - } - - @Override - public void write(FriendlyByteBuf buf) { - buf.writeBlockPos(pos); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsClient.openScreenConfigGui(pos); - } -} diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/TaskScreenConfigRequestMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/TaskScreenConfigRequestMessage.java new file mode 100644 index 000000000..882afe574 --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/TaskScreenConfigRequestMessage.java @@ -0,0 +1,27 @@ +package dev.ftb.mods.ftbquests.net; + +import dev.architectury.networking.NetworkManager; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; +import dev.ftb.mods.ftbquests.client.FTBQuestsClient; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; + +public record TaskScreenConfigRequestMessage(BlockPos pos) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("task_screen_config_request_message")); + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + BlockPos.STREAM_CODEC, TaskScreenConfigRequestMessage::pos, + TaskScreenConfigRequestMessage::new + ); + + @Override + public Type type() { + return TYPE; + } + + public static void handle(TaskScreenConfigRequestMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsClient.openScreenConfigGui(message.pos)); + } +} diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/TaskScreenConfigResponse.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/TaskScreenConfigResponse.java deleted file mode 100644 index 70005d8af..000000000 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/TaskScreenConfigResponse.java +++ /dev/null @@ -1,49 +0,0 @@ -package dev.ftb.mods.ftbquests.net; - -import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; -import dev.ftb.mods.ftbquests.block.TaskScreenBlock; -import dev.ftb.mods.ftbquests.block.entity.TaskScreenBlockEntity; -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.block.Block; - -public class TaskScreenConfigResponse extends BaseC2SMessage { - private final BlockPos pos; - private final CompoundTag payload; - - public TaskScreenConfigResponse(TaskScreenBlockEntity taskScreenBlockEntity) { - this.pos = taskScreenBlockEntity.getBlockPos(); - this.payload = taskScreenBlockEntity.saveWithoutMetadata(); - } - - public TaskScreenConfigResponse(FriendlyByteBuf buf) { - this.pos = buf.readBlockPos(); - this.payload = buf.readNbt(); - } - - @Override - public MessageType getType() { - return FTBQuestsNetHandler.TASK_SCREEN_CONFIG_RESP; - } - - @Override - public void write(FriendlyByteBuf buf) { - buf.writeBlockPos(pos); - buf.writeNbt(payload); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - if (context.getPlayer() instanceof ServerPlayer serverPlayer - && serverPlayer.level().getBlockEntity(pos) instanceof TaskScreenBlockEntity taskScreen - && TaskScreenBlock.hasPermissionToEdit(serverPlayer, taskScreen)) { - taskScreen.load(payload); - serverPlayer.level().sendBlockUpdated(taskScreen.getBlockPos(), taskScreen.getBlockState(), taskScreen.getBlockState(), Block.UPDATE_ALL); - taskScreen.setChanged(); - } - } -} diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/TaskScreenConfigResponseMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/TaskScreenConfigResponseMessage.java new file mode 100644 index 000000000..f78a82ffa --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/TaskScreenConfigResponseMessage.java @@ -0,0 +1,41 @@ +package dev.ftb.mods.ftbquests.net; + +import dev.architectury.networking.NetworkManager; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; +import dev.ftb.mods.ftbquests.block.TaskScreenBlock; +import dev.ftb.mods.ftbquests.block.entity.TaskScreenBlockEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.block.Block; + +public record TaskScreenConfigResponseMessage(BlockPos pos, CompoundTag payload) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("task_screen_config_response_message")); + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + BlockPos.STREAM_CODEC, TaskScreenConfigResponseMessage::pos, + ByteBufCodecs.COMPOUND_TAG, TaskScreenConfigResponseMessage::payload, + TaskScreenConfigResponseMessage::new + ); + + @Override + public Type type() { + return TYPE; + } + + public static void handle(TaskScreenConfigResponseMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + if (context.getPlayer() instanceof ServerPlayer serverPlayer + && serverPlayer.level().getBlockEntity(message.pos) instanceof TaskScreenBlockEntity taskScreen + && TaskScreenBlock.hasPermissionToEdit(serverPlayer, taskScreen)) { + taskScreen.loadAdditional(message.payload, serverPlayer.registryAccess()); + serverPlayer.level().sendBlockUpdated(taskScreen.getBlockPos(), taskScreen.getBlockState(), taskScreen.getBlockState(), Block.UPDATE_ALL); + taskScreen.setChanged(); + } + }); + } +} diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/TeamDataChangedMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/TeamDataChangedMessage.java index 1ba65fcc6..c64add0e2 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/TeamDataChangedMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/TeamDataChangedMessage.java @@ -1,41 +1,27 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -/** - * @author LatvianModder - */ -public class TeamDataChangedMessage extends BaseS2CMessage { - private final TeamDataUpdate oldDataUpdate; - private final TeamDataUpdate newDataUpdate; +public record TeamDataChangedMessage(TeamDataUpdate oldDataUpdate, TeamDataUpdate newDataUpdate) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("team_data_changed_message")); - TeamDataChangedMessage(FriendlyByteBuf buffer) { - oldDataUpdate = new TeamDataUpdate(buffer); - newDataUpdate = new TeamDataUpdate(buffer); - } - - public TeamDataChangedMessage(TeamDataUpdate oldData, TeamDataUpdate newData) { - oldDataUpdate = oldData; - newDataUpdate = newData; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + TeamDataUpdate.STREAM_CODEC, TeamDataChangedMessage::oldDataUpdate, + TeamDataUpdate.STREAM_CODEC, TeamDataChangedMessage::newDataUpdate, + TeamDataChangedMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.TEAM_DATA_CHANGED; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - oldDataUpdate.write(buffer); - newDataUpdate.write(buffer); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.teamDataChanged(oldDataUpdate, newDataUpdate); + public static void handle(TeamDataChangedMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.teamDataChanged(message.oldDataUpdate, message.newDataUpdate)); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/TeamDataUpdate.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/TeamDataUpdate.java index 4aaefc369..258a9b73c 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/TeamDataUpdate.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/TeamDataUpdate.java @@ -1,26 +1,21 @@ package dev.ftb.mods.ftbquests.net; import dev.ftb.mods.ftbquests.quest.TeamData; +import net.minecraft.core.UUIDUtil; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import java.util.UUID; -public class TeamDataUpdate { - public final UUID uuid; - public final String name; +public record TeamDataUpdate(UUID uuid, String name) { + public static StreamCodec STREAM_CODEC = StreamCodec.composite( + UUIDUtil.STREAM_CODEC, TeamDataUpdate::uuid, + ByteBufCodecs.STRING_UTF8, TeamDataUpdate::name, + TeamDataUpdate::new + ); - public TeamDataUpdate(FriendlyByteBuf buffer) { - uuid = buffer.readUUID(); - name = buffer.readUtf(Short.MAX_VALUE); - } - - public TeamDataUpdate(TeamData data) { - uuid = data.getTeamId(); - name = data.getName(); - } - - public void write(FriendlyByteBuf buffer) { - buffer.writeUUID(uuid); - buffer.writeUtf(name, Short.MAX_VALUE); + public static TeamDataUpdate forTeamData(TeamData data) { + return new TeamDataUpdate(data.getTeamId(), data.getName()); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/ToggleChapterPinnedMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/ToggleChapterPinnedMessage.java index d22703a34..62d37f59b 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/ToggleChapterPinnedMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/ToggleChapterPinnedMessage.java @@ -1,35 +1,33 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.quest.TeamData; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.level.ServerPlayer; -public class ToggleChapterPinnedMessage extends BaseC2SMessage { - public ToggleChapterPinnedMessage() { - } +public record ToggleChapterPinnedMessage() implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("toggle_chapter_pinned_message")); - public ToggleChapterPinnedMessage(FriendlyByteBuf buf) { - } + public static final ToggleChapterPinnedMessage INSTANCE = new ToggleChapterPinnedMessage(); - @Override - public MessageType getType() { - return FTBQuestsNetHandler.TOGGLE_CHAPTER_PINNED; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.unit(INSTANCE); @Override - public void write(FriendlyByteBuf buf) { + public Type type() { + return TYPE; } - @Override - public void handle(NetworkManager.PacketContext context) { - ServerPlayer player = (ServerPlayer) context.getPlayer(); - TeamData data = ServerQuestFile.INSTANCE.getOrCreateTeamData(player); - boolean newPinned = !data.isChapterPinned(player); - data.setChapterPinned(player, newPinned); - new ToggleChapterPinnedResponseMessage(newPinned).sendTo(player); + public static void handle(ToggleChapterPinnedMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + ServerPlayer player = (ServerPlayer) context.getPlayer(); + TeamData data = ServerQuestFile.INSTANCE.getOrCreateTeamData(player); + boolean newPinned = !data.isChapterPinned(player); + data.setChapterPinned(player, newPinned); + NetworkManager.sendToPlayer(player, new ToggleChapterPinnedResponseMessage(newPinned)); + }); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/ToggleChapterPinnedResponseMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/ToggleChapterPinnedResponseMessage.java index 8de09a11f..bda9e23fd 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/ToggleChapterPinnedResponseMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/ToggleChapterPinnedResponseMessage.java @@ -1,34 +1,27 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -public class ToggleChapterPinnedResponseMessage extends BaseS2CMessage { - private final boolean pinned; +public record ToggleChapterPinnedResponseMessage(boolean pinned) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("toggle_chapter_pinned_response_message")); - public ToggleChapterPinnedResponseMessage(boolean pinned) { - this.pinned = pinned; - } - - ToggleChapterPinnedResponseMessage(FriendlyByteBuf buffer) { - pinned = buffer.readBoolean(); - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.BOOL, ToggleChapterPinnedResponseMessage::pinned, + ToggleChapterPinnedResponseMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.TOGGLE_CHAPTER_PINNED_RESPONSE; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buf) { - buf.writeBoolean(pinned); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.toggleChapterPinned(pinned); + public static void handle(ToggleChapterPinnedResponseMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.toggleChapterPinned(message.pinned)); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/ToggleEditingModeMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/ToggleEditingModeMessage.java index a6cd1ebc7..0d7342fd5 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/ToggleEditingModeMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/ToggleEditingModeMessage.java @@ -1,38 +1,36 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.integration.PermissionsHelper; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.quest.TeamData; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.level.ServerPlayer; -public class ToggleEditingModeMessage extends BaseC2SMessage { - public ToggleEditingModeMessage() { - } +public record ToggleEditingModeMessage() implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("toggle_editing_mode_message")); - public ToggleEditingModeMessage(@SuppressWarnings("unused") FriendlyByteBuf friendlyByteBuf) { - } + public static final ToggleEditingModeMessage INSTANCE = new ToggleEditingModeMessage(); - @Override - public MessageType getType() { - return FTBQuestsNetHandler.TOGGLE_EDITING_MODE; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.unit(INSTANCE); @Override - public void write(FriendlyByteBuf buf) { + public Type type() { + return TYPE; } - @Override - public void handle(NetworkManager.PacketContext context) { - ServerPlayer player = (ServerPlayer) context.getPlayer(); - if (PermissionsHelper.hasEditorPermission(player, false) - || player.getServer() != null && player.getServer().isSingleplayerOwner(player.getGameProfile())) - { - TeamData data = ServerQuestFile.INSTANCE.getOrCreateTeamData(player); - data.setCanEdit(player, !data.getCanEdit(player)); // will send a response to the client, causing GUI refresh - } + public static void handle(ToggleEditingModeMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + ServerPlayer player = (ServerPlayer) context.getPlayer(); + if (PermissionsHelper.hasEditorPermission(player, false) + || player.getServer() != null && player.getServer().isSingleplayerOwner(player.getGameProfile())) + { + TeamData data = ServerQuestFile.INSTANCE.getOrCreateTeamData(player); + data.setCanEdit(player, !data.getCanEdit(player)); // will send a response to the client, causing GUI refresh + } + }); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/TogglePinnedMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/TogglePinnedMessage.java index 20737222d..ed6cb9ac5 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/TogglePinnedMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/TogglePinnedMessage.java @@ -1,43 +1,35 @@ package dev.ftb.mods.ftbquests.net; import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.simple.BaseC2SMessage; -import dev.architectury.networking.simple.MessageType; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.quest.TeamData; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.level.ServerPlayer; -/** - * @author LatvianModder - */ -public class TogglePinnedMessage extends BaseC2SMessage { - private final long id; +public record TogglePinnedMessage(long id) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("toggle_pinned_message")); - TogglePinnedMessage(FriendlyByteBuf buffer) { - id = buffer.readLong(); - } - - public TogglePinnedMessage(long i) { - id = i; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, TogglePinnedMessage::id, + TogglePinnedMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.TOGGLE_PINNED; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(id); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - ServerPlayer player = (ServerPlayer) context.getPlayer(); - TeamData data = ServerQuestFile.INSTANCE.getOrCreateTeamData(player); - boolean newPinned = !data.isQuestPinned(player, id); - data.setQuestPinned(player, id, newPinned); - new TogglePinnedResponseMessage(id, newPinned).sendTo(player); + public static void handle(TogglePinnedMessage message, NetworkManager.PacketContext context) { + context.queue(() -> { + ServerPlayer player = (ServerPlayer) context.getPlayer(); + TeamData data = ServerQuestFile.INSTANCE.getOrCreateTeamData(player); + boolean newPinned = !data.isQuestPinned(player, message.id); + data.setQuestPinned(player, message.id, newPinned); + NetworkManager.sendToPlayer(player, new TogglePinnedResponseMessage(message.id, newPinned)); + }); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/TogglePinnedResponseMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/TogglePinnedResponseMessage.java index 4bbc3fa9f..c822e86d5 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/TogglePinnedResponseMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/TogglePinnedResponseMessage.java @@ -1,41 +1,28 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -/** - * @author LatvianModder - */ -public class TogglePinnedResponseMessage extends BaseS2CMessage { - private final long id; - private final boolean pinned; +public record TogglePinnedResponseMessage(long id, boolean pinned) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("toggle_pinned_response_message")); - TogglePinnedResponseMessage(FriendlyByteBuf buffer) { - id = buffer.readLong(); - pinned = buffer.readBoolean(); - } - - public TogglePinnedResponseMessage(long i, boolean p) { - id = i; - pinned = p; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, TogglePinnedResponseMessage::id, + ByteBufCodecs.BOOL, TogglePinnedResponseMessage::pinned, + TogglePinnedResponseMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.TOGGLE_PINNED_RESPONSE; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(id); - buffer.writeBoolean(pinned); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.togglePinned(id, pinned); + public static void handle(TogglePinnedResponseMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.togglePinned(message.id, message.pinned)); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/UpdateTaskProgressMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/UpdateTaskProgressMessage.java index 8c4bee099..6467bfabe 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/UpdateTaskProgressMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/UpdateTaskProgressMessage.java @@ -1,48 +1,32 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; -import dev.ftb.mods.ftbquests.quest.TeamData; +import net.minecraft.core.UUIDUtil; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import java.util.UUID; -/** - * @author LatvianModder - */ -public class UpdateTaskProgressMessage extends BaseS2CMessage { - private final UUID teamId; - private final long task; - private final long progress; +public record UpdateTaskProgressMessage(UUID teamId, long task, long progress) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("update_task_progress_message")); - public UpdateTaskProgressMessage(FriendlyByteBuf buffer) { - teamId = buffer.readUUID(); - task = buffer.readLong(); - progress = buffer.readVarLong(); - } - - public UpdateTaskProgressMessage(TeamData teamData, long task, long progress) { - teamId = teamData.getTeamId(); - this.task = task; - this.progress = progress; - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + UUIDUtil.STREAM_CODEC, UpdateTaskProgressMessage::teamId, + ByteBufCodecs.VAR_LONG, UpdateTaskProgressMessage::task, + ByteBufCodecs.VAR_LONG, UpdateTaskProgressMessage::progress, + UpdateTaskProgressMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.UPDATE_TASK_PROGRESS; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeUUID(teamId); - buffer.writeLong(task); - buffer.writeVarLong(progress); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.updateTaskProgress(teamId, task, progress); + public static void handle(UpdateTaskProgressMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.updateTaskProgress(message.teamId, message.task, message.progress)); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/net/UpdateTeamDataMessage.java b/common/src/main/java/dev/ftb/mods/ftbquests/net/UpdateTeamDataMessage.java index b0eb03e98..759843cbf 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/net/UpdateTeamDataMessage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/net/UpdateTeamDataMessage.java @@ -1,44 +1,31 @@ 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.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.FTBQuestsNetClient; -import dev.ftb.mods.ftbquests.quest.TeamData; +import net.minecraft.core.UUIDUtil; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import java.util.UUID; -/** - * @author LatvianModder - */ -public class UpdateTeamDataMessage extends BaseS2CMessage { - private final UUID team; - private final String name; +public record UpdateTeamDataMessage(UUID teamId, String name) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(FTBQuestsAPI.rl("update_team_data_message")); - UpdateTeamDataMessage(FriendlyByteBuf buffer) { - team = buffer.readUUID(); - name = buffer.readUtf(Short.MAX_VALUE); - } - - public UpdateTeamDataMessage(TeamData data) { - team = data.getTeamId(); - name = data.getName(); - } + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + UUIDUtil.STREAM_CODEC, UpdateTeamDataMessage::teamId, + ByteBufCodecs.STRING_UTF8, UpdateTeamDataMessage::name, + UpdateTeamDataMessage::new + ); @Override - public MessageType getType() { - return FTBQuestsNetHandler.UPDATE_TEAM_DATA; + public Type type() { + return TYPE; } - @Override - public void write(FriendlyByteBuf buffer) { - buffer.writeUUID(team); - buffer.writeUtf(name, Short.MAX_VALUE); - } - - @Override - public void handle(NetworkManager.PacketContext context) { - FTBQuestsNetClient.updateTeamData(team, name); + public static void handle(UpdateTeamDataMessage message, NetworkManager.PacketContext context) { + context.queue(() -> FTBQuestsNetClient.updateTeamData(message.teamId, message.name)); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/BaseQuestFile.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/BaseQuestFile.java index 991e358c4..f43e96bae 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/BaseQuestFile.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/BaseQuestFile.java @@ -7,22 +7,21 @@ import dev.ftb.mods.ftblibrary.math.MathUtils; import dev.ftb.mods.ftblibrary.snbt.SNBT; import dev.ftb.mods.ftblibrary.snbt.SNBTCompoundTag; +import dev.ftb.mods.ftblibrary.util.NetworkHelper; import dev.ftb.mods.ftbquests.FTBQuests; import dev.ftb.mods.ftbquests.api.QuestFile; import dev.ftb.mods.ftbquests.client.FTBQuestsClient; import dev.ftb.mods.ftbquests.events.*; import dev.ftb.mods.ftbquests.integration.RecipeModHelper; -import dev.ftb.mods.ftbquests.item.MissingItem; import dev.ftb.mods.ftbquests.net.DeleteObjectResponseMessage; -import dev.ftb.mods.ftbquests.net.FTBQuestsNetHandler; import dev.ftb.mods.ftbquests.quest.loot.EntityWeight; import dev.ftb.mods.ftbquests.quest.loot.LootCrate; import dev.ftb.mods.ftbquests.quest.loot.RewardTable; import dev.ftb.mods.ftbquests.quest.reward.*; import dev.ftb.mods.ftbquests.quest.task.*; import dev.ftb.mods.ftbquests.quest.theme.property.ThemeProperties; +import dev.ftb.mods.ftbquests.quest.translation.TranslationManager; import dev.ftb.mods.ftbquests.util.FileUtils; -import dev.ftb.mods.ftbquests.util.NetUtils; import dev.ftb.mods.ftbteams.api.FTBTeamsAPI; import dev.ftb.mods.ftbteams.api.Team; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; @@ -30,11 +29,15 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.Util; import net.minecraft.commands.CommandSourceStack; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.*; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.util.RandomSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; @@ -49,12 +52,23 @@ import java.util.*; import java.util.function.Consumer; import java.util.function.Predicate; -import java.util.stream.Collectors; import java.util.stream.Stream; public abstract class BaseQuestFile extends QuestObject implements QuestFile { public static int VERSION = 13; + public static final StreamCodec STREAM_CODEC = new StreamCodec<>() { + @Override + public BaseQuestFile decode(RegistryFriendlyByteBuf buf) { + return Util.make(FTBQuestsClient.createClientQuestFile(), file -> file.readNetDataFull(buf)); + } + + @Override + public void encode(RegistryFriendlyByteBuf buf, BaseQuestFile file) { + file.writeNetDataFull(buf); + } + }; + private final DefaultChapterGroup defaultChapterGroup; final List chapterGroups; private final List rewardTables; @@ -65,6 +79,8 @@ public abstract class BaseQuestFile extends QuestObject implements QuestFile { protected final Int2ObjectOpenHashMap taskTypeIds; protected final Int2ObjectOpenHashMap rewardTypeIds; + private final TranslationManager translationManager; + private final List emergencyItems; private int emergencyItemsCooldown; private int fileVersion; @@ -123,10 +139,14 @@ public BaseQuestFile() { detectionDelay = 20; allTasks = null; + + translationManager = new TranslationManager(); } public abstract Env getSide(); + public abstract HolderLookup.Provider holderLookup(); + public boolean isServerSide() { return getSide() == Env.SERVER; } @@ -154,6 +174,10 @@ public Path getFolder() { throw new IllegalStateException("This quest file doesn't have a folder!"); } + public TranslationManager getTranslationManager() { + return translationManager; + } + @Override public int getRelativeProgressFromChildren(TeamData data) { MutableInt progress = new MutableInt(0); @@ -369,8 +393,8 @@ public QuestObjectBase create(long id, QuestObjectType type, long parent, Compou } @Override - public final void writeData(CompoundTag nbt) { - super.writeData(nbt); + public final void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putBoolean("default_reward_team", defaultPerTeamReward); nbt.putBoolean("default_consume_items", defaultTeamConsumeItems); nbt.putString("default_autoclaim_rewards", defaultRewardAutoClaim.id); @@ -378,13 +402,11 @@ public final void writeData(CompoundTag nbt) { nbt.putBoolean("default_quest_disable_jei", defaultQuestDisableJEI); if (!emergencyItems.isEmpty()) { - ListTag list = new ListTag(); - - for (ItemStack stack : emergencyItems) { - list.add(MissingItem.writeItem(stack)); - } - - nbt.put("emergency_items", list); + nbt.put("emergency_items", Util.make(new ListTag(), l -> { + for (ItemStack stack : emergencyItems) { + l.add(stack.save(provider)); + } + })); } nbt.putInt("emergency_items_cooldown", emergencyItemsCooldown); @@ -402,8 +424,8 @@ public final void writeData(CompoundTag nbt) { } @Override - public final void readData(CompoundTag nbt) { - super.readData(nbt); + public final void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); defaultPerTeamReward = nbt.getBoolean("default_reward_team"); defaultTeamConsumeItems = nbt.getBoolean("default_consume_items"); defaultRewardAutoClaim = RewardAutoClaim.NAME_MAP_NO_DEFAULT.get(nbt.getString("default_autoclaim_rewards")); @@ -417,13 +439,8 @@ public final void readData(CompoundTag nbt) { emergencyItems.clear(); ListTag emergencyItemsTag = nbt.getList("emergency_items", Tag.TAG_COMPOUND); - for (int i = 0; i < emergencyItemsTag.size(); i++) { - ItemStack stack = MissingItem.readItem(emergencyItemsTag.getCompound(i)); - - if (!stack.isEmpty()) { - emergencyItems.add(stack); - } + emergencyItems.add(itemOrMissingFromNBT(emergencyItemsTag.getCompound(i), provider)); } emergencyItemsCooldown = nbt.getInt("emergency_items_cooldown"); @@ -443,7 +460,7 @@ public final void readData(CompoundTag nbt) { } } - public final void writeDataFull(Path folder) { + public final void writeDataFull(Path folder, HolderLookup.Provider provider) { boolean prev = false; try { // Sorting keys ensure consistent sort order in the saved quest file @@ -453,7 +470,7 @@ public final void writeDataFull(Path folder) { SNBTCompoundTag fileNBT = new SNBTCompoundTag(); fileNBT.putInt("version", VERSION); - writeData(fileNBT); + writeData(fileNBT, provider); SNBT.write(folder.resolve("data.snbt"), fileNBT); for (ChapterGroup group : chapterGroups) { @@ -463,19 +480,19 @@ public final void writeDataFull(Path folder) { chapterNBT.putString("id", chapter.getCodeString()); chapterNBT.putString("group", group.isDefaultGroup() ? "" : group.getCodeString()); chapterNBT.putInt("order_index", ci); - chapter.writeData(chapterNBT); + chapter.writeData(chapterNBT, provider); ListTag questList = new ListTag(); for (Quest quest : chapter.getQuests()) { if (quest.isValid()) { SNBTCompoundTag questNBT = new SNBTCompoundTag(); - quest.writeData(questNBT); + quest.writeData(questNBT, provider); questNBT.putString("id", quest.getCodeString()); if (!quest.getTasks().isEmpty()) { - quest.writeTasks(questNBT); + quest.writeTasks(questNBT, provider); } if (!quest.getRewards().isEmpty()) { - quest.writeRewards(questNBT); + quest.writeRewards(questNBT, provider); } questList.add(questNBT); } @@ -486,7 +503,7 @@ public final void writeDataFull(Path folder) { for (QuestLink link : chapter.getQuestLinks()) { if (link.getQuest().isPresent()) { SNBTCompoundTag linkNBT = new SNBTCompoundTag(); - link.writeData(linkNBT); + link.writeData(linkNBT, provider); linkNBT.putString("id", link.getCodeString()); linkList.add(linkNBT); } @@ -502,7 +519,7 @@ public final void writeDataFull(Path folder) { SNBTCompoundTag tableNBT = new SNBTCompoundTag(); tableNBT.putString("id", table.getCodeString()); tableNBT.putInt("order_index", ri); - table.writeData(tableNBT); + table.writeData(tableNBT, provider); SNBT.write(folder.resolve("reward_tables/" + table.getFilename() + ".snbt"), tableNBT); } @@ -513,7 +530,7 @@ public final void writeDataFull(Path folder) { SNBTCompoundTag groupTag = new SNBTCompoundTag(); groupTag.singleLine(); groupTag.putString("id", group.getCodeString()); - group.writeData(groupTag); + group.writeData(groupTag, provider); chapterGroupTag.add(groupTag); } } @@ -526,7 +543,7 @@ public final void writeDataFull(Path folder) { } } - public final void readDataFull(Path folder) { + public final void readDataFull(Path folder, HolderLookup.Provider provider) { clearCachedData(); questObjectMap.clear(); defaultChapterGroup.clearChapters(); @@ -543,11 +560,12 @@ public final void readDataFull(Path folder) { if (fileNBT != null) { fileVersion = fileNBT.getInt("version"); questObjectMap.put(1, this); - readData(fileNBT); + readData(fileNBT, provider); } - Path groupsFile = folder.resolve("chapter_groups.snbt"); + translationManager.loadFromNBT(folder.resolve("lang")); + Path groupsFile = folder.resolve("chapter_groups.snbt"); if (Files.exists(groupsFile)) { CompoundTag chapterGroupsTag = SNBT.read(groupsFile); @@ -601,7 +619,7 @@ public final void readDataFull(Path folder) { Task task = TaskType.createTask(taskId, quest, taskNBT.getString("type")); if (task == null) { task = new CustomTask(taskId, quest); - task.rawTitle = "Unknown type: " + taskNBT.getString("type"); + task.setRawTitle("Unknown type: " + taskNBT.getString("type")); } questObjectMap.put(task.id, task); @@ -617,7 +635,7 @@ public final void readDataFull(Path folder) { Reward reward = RewardType.createReward(rewardId, quest, rewardNBT.getString("type")); if (reward == null) { reward = new CustomReward(rewardId, quest); - reward.rawTitle = "Unknown type: " + rewardNBT.getString("type"); + reward.setRawTitle("Unknown type: " + rewardNBT.getString("type")); } questObjectMap.put(reward.id, reward); @@ -670,7 +688,7 @@ public final void readDataFull(Path folder) { CompoundTag data = dataCache.get(object.id); if (data != null) { - object.readData(data); + object.readData(data, provider); } } @@ -707,7 +725,7 @@ public final void readDataFull(Path folder) { markDirty(); } - FTBQuests.LOGGER.info("Loaded " + chapterGroups.size() + " chapter groups, " + chapterCounter + " chapters, " + questCounter + " quests, " + rewardTables.size() + " reward tables"); + FTBQuests.LOGGER.info("Loaded {} chapter groups, {} chapters, {} quests, {} reward tables", chapterGroups.size(), chapterCounter, questCounter, rewardTables.size()); } public void updateLootCrates() { @@ -733,9 +751,9 @@ public void markDirty() { } @Override - public final void writeNetData(FriendlyByteBuf buffer) { + public final void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); - NetUtils.write(buffer, emergencyItems, FTBQuestsNetHandler::writeItemType); + ItemStack.OPTIONAL_STREAM_CODEC.apply(ByteBufCodecs.list()).encode(buffer, emergencyItems); buffer.writeVarInt(emergencyItemsCooldown); buffer.writeBoolean(defaultPerTeamReward); buffer.writeBoolean(defaultTeamConsumeItems); @@ -753,9 +771,10 @@ public final void writeNetData(FriendlyByteBuf buffer) { } @Override - public final void readNetData(FriendlyByteBuf buffer) { + public final void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); - NetUtils.read(buffer, emergencyItems, FTBQuestsNetHandler::readItemType); + + emergencyItems.retainAll(ItemStack.OPTIONAL_STREAM_CODEC.apply(ByteBufCodecs.list()).decode(buffer)); emergencyItemsCooldown = buffer.readVarInt(); defaultPerTeamReward = buffer.readBoolean(); defaultTeamConsumeItems = buffer.readBoolean(); @@ -772,7 +791,7 @@ public final void readNetData(FriendlyByteBuf buffer) { detectionDelay = buffer.readVarInt(); } - public final void writeNetDataFull(FriendlyByteBuf buffer) { + public final void writeNetDataFull(RegistryFriendlyByteBuf buffer) { int pos = buffer.writerIndex(); buffer.writeVarInt(TaskTypes.TYPES.size()); @@ -855,10 +874,10 @@ public final void writeNetDataFull(FriendlyByteBuf buffer) { } } - FTBQuests.LOGGER.debug("Wrote " + (buffer.writerIndex() - pos) + " bytes, " + questObjectMap.size() + " objects"); + FTBQuests.LOGGER.debug("Wrote {} bytes, {} objects", buffer.writerIndex() - pos, questObjectMap.size()); } - public final void readNetDataFull(FriendlyByteBuf buffer) { + public final void readNetDataFull(RegistryFriendlyByteBuf buffer) { int pos = buffer.readerIndex(); taskTypeIds.clear(); @@ -973,7 +992,7 @@ public final void readNetDataFull(FriendlyByteBuf buffer) { } } - FTBQuests.LOGGER.info("Read " + (buffer.readerIndex() - pos) + " bytes, " + questObjectMap.size() + " objects"); + FTBQuests.LOGGER.info("Read {} bytes, {} objects", buffer.readerIndex() - pos, questObjectMap.size()); } @Override @@ -1100,15 +1119,22 @@ public long readID(@Nullable Tag tag) { } public long getID(@Nullable Object obj) { - if (obj == null) { - return 0L; - } else if (obj instanceof Number n) { - return n.longValue(); - } else if (obj instanceof NumericTag nt) { - return nt.getAsLong(); - } else if (obj instanceof StringTag st) { - return getID(st.getAsString()); - } + switch (obj) { + case null -> { + return 0L; + } + case Number n -> { + return n.longValue(); + } + case NumericTag nt -> { + return nt.getAsLong(); + } + case StringTag st -> { + return getID(st.getAsString()); + } + default -> { + } + } String idStr = obj.toString(); long id = parseCodeString(idStr); @@ -1357,7 +1383,7 @@ public int removeEmptyRewardTables(CommandSourceStack source) { del.increment(); table.invalid = true; FileUtils.delete(ServerQuestFile.INSTANCE.getFolder().resolve(table.getPath().orElseThrow()).toFile()); - new DeleteObjectResponseMessage(table.id).sendToAll(source.getServer()); + NetworkHelper.sendToAll(source.getServer(), new DeleteObjectResponseMessage(table.id)); } } @@ -1369,20 +1395,20 @@ public int removeEmptyRewardTables(CommandSourceStack source) { return del.intValue(); } - public String generateRewardTableName(String basename) { - String s = titleToID(basename).orElse(toString()); - String filename = s; - - Set existingNames = rewardTables.stream().map(RewardTable::getFilename).collect(Collectors.toSet()); - int i = 2; - - while (existingNames.contains(filename)) { - filename = s + "_" + i; - i++; - } - - return filename; - } +// public String generateRewardTableName(String basename) { +// String s = titleToID(basename).orElse(toString()); +// String filename = s; +// +// Set existingNames = rewardTables.stream().map(RewardTable::getFilename).collect(Collectors.toSet()); +// int i = 2; +// +// while (existingNames.contains(filename)) { +// filename = s + "_" + i; +// i++; +// } +// +// return filename; +// } public List getChapterGroups() { return Collections.unmodifiableList(chapterGroups); @@ -1424,4 +1450,6 @@ public boolean moveChapterGroup(long id, boolean movingUp) { public EntityWeight getLootCrateNoDrop() { return lootCrateNoDrop; } + + public abstract String getLocale(); } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/Chapter.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/Chapter.java index b46d88f3c..da1fd729d 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/Chapter.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/Chapter.java @@ -10,14 +10,15 @@ import dev.ftb.mods.ftbquests.events.ObjectCompletedEvent; import dev.ftb.mods.ftbquests.events.ObjectStartedEvent; import dev.ftb.mods.ftbquests.events.QuestProgressEventData; +import dev.ftb.mods.ftbquests.quest.translation.TranslationKey; import dev.ftb.mods.ftbquests.util.NetUtils; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.StringTag; import net.minecraft.nbt.Tag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; @@ -33,7 +34,6 @@ public final class Chapter extends QuestObject { private String filename; private final List quests; private final List questLinks; - private final List rawSubtitle; private boolean alwaysInvisible; private String defaultQuestShape; private double defaultQuestSize; @@ -60,7 +60,6 @@ public Chapter(long id, BaseQuestFile file, ChapterGroup group, String filename) this.filename = filename; quests = new ArrayList<>(); questLinks = new ArrayList<>(); - rawSubtitle = new ArrayList<>(0); alwaysInvisible = false; defaultQuestShape = ""; defaultQuestSize = 1D; @@ -139,19 +138,9 @@ public void removeQuest(Quest quest) { } @Override - public void writeData(CompoundTag nbt) { + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { nbt.putString("filename", filename); - super.writeData(nbt); - - if (!rawSubtitle.isEmpty()) { - ListTag list = new ListTag(); - - for (String v : rawSubtitle) { - list.add(StringTag.valueOf(v)); - } - - nbt.put("subtitle", list); - } + super.writeData(nbt, provider); if (alwaysInvisible) { nbt.putBoolean("always_invisible", true); @@ -194,16 +183,9 @@ public void writeData(CompoundTag nbt) { } @Override - public void readData(CompoundTag nbt) { + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { filename = nbt.getString("filename"); - super.readData(nbt); - rawSubtitle.clear(); - - ListTag subtitleNBT = nbt.getList("subtitle", Tag.TAG_STRING); - - for (int i = 0; i < subtitleNBT.size(); i++) { - rawSubtitle.add(subtitleNBT.getString(i)); - } + super.readData(nbt, provider); alwaysInvisible = nbt.getBoolean("always_invisible"); defaultQuestShape = nbt.getString("default_quest_shape"); @@ -239,13 +221,12 @@ public void readData(CompoundTag nbt) { } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeUtf(filename, Short.MAX_VALUE); - NetUtils.writeStrings(buffer, rawSubtitle); buffer.writeUtf(defaultQuestShape, Short.MAX_VALUE); buffer.writeDouble(defaultQuestSize); - NetUtils.write(buffer, images, (d, img) -> img.writeNetData(d)); + buffer.writeCollection(images, (buf, img) -> img.writeNetData(buf)); buffer.writeInt(defaultMinWidth); ProgressionMode.NAME_MAP.write(buffer, progressionMode); @@ -265,17 +246,12 @@ public void writeNetData(FriendlyByteBuf buffer) { } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); filename = buffer.readUtf(Short.MAX_VALUE); - NetUtils.readStrings(buffer, rawSubtitle); defaultQuestShape = buffer.readUtf(Short.MAX_VALUE); defaultQuestSize = buffer.readDouble(); - NetUtils.read(buffer, images, d -> { - ChapterImage image = new ChapterImage(this); - image.readNetData(d); - return image; - }); + NetUtils.read(buffer, images, buf -> ChapterImage.fromNet(this, buf)); defaultMinWidth = buffer.readInt(); progressionMode = ProgressionMode.NAME_MAP.read(buffer); @@ -389,7 +365,7 @@ public void deleteChildren() { @Override public void onCreated() { if (filename.isEmpty()) { - String basename = titleToID(rawTitle).orElse(toString()); + String basename = titleToID(getRawTitle()).orElse(toString()); filename = basename; Set existingNames = new HashSet<>(); @@ -429,7 +405,7 @@ public Optional getPath() { public void fillConfigGroup(ConfigGroup config) { super.fillConfigGroup(config); - config.addList("subtitle", rawSubtitle, new StringConfig(null), ""); + config.addList("subtitle", getRawSubtitle(), new StringConfig(), this::setRawSubtitle, ""); ConfigGroup appearance = config.getOrCreateSubgroup("appearance").setNameKey("ftbquests.quest.appearance"); appearance.addEnum("default_quest_shape", defaultQuestShape.isEmpty() ? "default" : defaultQuestShape, v -> defaultQuestShape = v.equals("default") ? "" : v, QuestShape.idMapWithDefault); @@ -534,7 +510,12 @@ public void removeQuestLink(QuestLink link) { } public List getRawSubtitle() { - return Collections.unmodifiableList(rawSubtitle); + return file.getTranslationManager().getStringListTranslation(this, file.getLocale(), TranslationKey.CHAPTER_SUBTITLE) + .orElse(List.of()); + } + + public void setRawSubtitle(List rawSubtitle) { + setTranslatableValue(TranslationKey.CHAPTER_SUBTITLE, rawSubtitle); } public boolean consumeItems() { diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/ChapterGroup.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/ChapterGroup.java index 755761ca3..df7a044fb 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/ChapterGroup.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/ChapterGroup.java @@ -12,7 +12,6 @@ import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.stream.Collectors; /** * @author LatvianModder @@ -106,7 +105,7 @@ public void deleteSelf() { @Override @Environment(EnvType.CLIENT) public void fillConfigGroup(ConfigGroup config) { - config.addString("title", rawTitle, v -> rawTitle = v, "").setNameKey("ftbquests.title").setOrder(-127); + config.addString("title", getRawTitle(), this::setRawTitle, "").setNameKey("ftbquests.title").setOrder(-127); } @Override diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/ChapterImage.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/ChapterImage.java index f5964264c..7b778fc2b 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/ChapterImage.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/ChapterImage.java @@ -2,6 +2,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.ConfigGroup; import dev.ftb.mods.ftblibrary.config.ImageResourceConfig; import dev.ftb.mods.ftblibrary.config.StringConfig; @@ -23,6 +24,7 @@ import net.minecraft.nbt.Tag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; @@ -37,6 +39,22 @@ public final class ChapterImage implements Movable { public static WeakReference clipboard = new WeakReference<>(null); + public static StreamCodec STREAM_CODEC = new StreamCodec<>() { + @Override + public ChapterImage decode(FriendlyByteBuf buf) { + long chapterId = buf.readLong(); + ChapterImage img = new ChapterImage(ServerQuestFile.INSTANCE.getChapter(chapterId)); + img.readNetData(buf); + return null; + } + + @Override + public void encode(FriendlyByteBuf buf, ChapterImage chapterImage) { + buf.writeLong(chapterImage.getChapter().id); + chapterImage.writeNetData(buf); + } + }; + private Chapter chapter; private double x, y; private double width, height; @@ -87,6 +105,10 @@ public ChapterImage setPosition(double x, double y) { return this; } + public static ChapterImage fromNet(Chapter parent, FriendlyByteBuf buf) { + return Util.make(new ChapterImage(parent), img -> img.readNetData(buf)); + } + public Color4I getColor() { return color; } @@ -251,20 +273,19 @@ public String getShape() { } @Override - @Environment(EnvType.CLIENT) - public void move(Chapter to, double _x, double _y) { + public void initiateMoveClientSide(Chapter to, double _x, double _y) { x = _x; y = _y; if (to != chapter) { chapter.removeImage(this); - new EditObjectMessage(chapter).sendToServer(); + NetworkManager.sendToServer(EditObjectMessage.forQuestObject(chapter)); chapter = to; chapter.addImage(this); } - new EditObjectMessage(chapter).sendToServer(); + NetworkManager.sendToServer(EditObjectMessage.forQuestObject(chapter)); } @Override @@ -318,7 +339,7 @@ public void fixupAspectRatio(boolean adjustWidth) { } else { height = width / getAspectRatio(); } - new EditObjectMessage(chapter).sendToServer(); + NetworkManager.sendToServer(EditObjectMessage.forQuestObject(chapter)); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/Movable.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/Movable.java index 0becc36a1..a8e679730 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/Movable.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/Movable.java @@ -31,8 +31,7 @@ public interface Movable { * @param x new X pos * @param y new Y pos */ - @Environment(EnvType.CLIENT) - void move(Chapter to, double x, double y); + void initiateMoveClientSide(Chapter to, double x, double y); /** * Called on both server and client to actually update the object's position; must also update any related objects, diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/Quest.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/Quest.java index b66562651..69f8836f6 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/Quest.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/Quest.java @@ -1,6 +1,7 @@ package dev.ftb.mods.ftbquests.quest; import com.mojang.datafixers.util.Pair; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.*; import dev.ftb.mods.ftblibrary.icon.Icon; import dev.ftb.mods.ftblibrary.icon.IconAnimation; @@ -23,19 +24,20 @@ import dev.ftb.mods.ftbquests.quest.reward.RewardType; import dev.ftb.mods.ftbquests.quest.task.Task; import dev.ftb.mods.ftbquests.quest.task.TaskType; +import dev.ftb.mods.ftbquests.quest.translation.TranslationKey; import dev.ftb.mods.ftbquests.util.ConfigQuestObject; -import dev.ftb.mods.ftbquests.util.NetUtils; import dev.ftb.mods.ftbquests.util.ProgressChange; import dev.ftb.mods.ftbquests.util.TextUtils; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import it.unimi.dsi.fastutil.longs.LongSet; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.StringTag; import net.minecraft.nbt.Tag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import java.util.*; @@ -46,11 +48,9 @@ public final class Quest extends QuestObject implements Movable { public static final String PAGEBREAK_CODE = "{@pagebreak}"; private Chapter chapter; - private String rawSubtitle; private double x, y; private Tristate hideUntilDepsVisible; private String shape; - private final List rawDescription; private final List dependencies; private final List tasks; private final List rewards; @@ -82,11 +82,9 @@ public Quest(long id, Chapter chapter) { this.chapter = chapter; - rawSubtitle = ""; x = 0; y = 0; shape = ""; - rawDescription = new ArrayList<>(0); dependencies = new ArrayList<>(0); tasks = new ArrayList<>(1); rewards = new ArrayList<>(1); @@ -165,11 +163,13 @@ public boolean showInRecipeMod() { } public String getRawSubtitle() { - return rawSubtitle; + return getQuestFile().getTranslationManager().getStringTranslation(this, getQuestFile().getLocale(), TranslationKey.QUEST_SUBTITLE) + .orElse(""); } public void setRawSubtitle(String rawSubtitle) { - this.rawSubtitle = rawSubtitle; + setTranslatableValue(TranslationKey.QUEST_SUBTITLE, rawSubtitle); + cachedSubtitle = null; } public void setX(double x) { @@ -201,7 +201,13 @@ public boolean canBeRepeated() { } public List getRawDescription() { - return rawDescription; + return getQuestFile().getTranslationManager().getStringListTranslation(this, getQuestFile().getLocale(), TranslationKey.QUEST_DESC) + .orElse(List.of()); + } + + public void setRawDescription(List rawDescription) { + setTranslatableValue(TranslationKey.QUEST_DESC, rawDescription); + cachedDescription = null; } public double getIconScale() { @@ -218,8 +224,9 @@ public boolean getRequireSequentialTasks() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); + nbt.putDouble("x", x); nbt.putDouble("y", y); @@ -227,20 +234,6 @@ public void writeData(CompoundTag nbt) { nbt.putString("shape", shape); } - if (!rawSubtitle.isEmpty()) { - nbt.putString("subtitle", rawSubtitle); - } - - if (!rawDescription.isEmpty()) { - ListTag array = new ListTag(); - - for (String value : rawDescription) { - array.add(StringTag.valueOf(value)); - } - - nbt.put("description", array); - } - if (!guidePage.isEmpty()) { nbt.putString("guide_page", guidePage); } @@ -311,9 +304,9 @@ public void writeData(CompoundTag nbt) { } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); - rawSubtitle = nbt.getString("subtitle"); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); + x = nbt.getDouble("x"); y = nbt.getDouble("y"); shape = nbt.getString("shape"); @@ -322,14 +315,6 @@ public void readData(CompoundTag nbt) { shape = ""; } - rawDescription.clear(); - - ListTag list = nbt.getList("description", Tag.TAG_STRING); - - for (int k = 0; k < list.size(); k++) { - rawDescription.add(list.getString(k)); - } - guidePage = nbt.getString("guide_page"); hideDependencyLines = Tristate.read(nbt, "hide_dependency_lines"); hideDependentLines = nbt.getBoolean("hide_dependent_lines"); @@ -374,11 +359,9 @@ public void readData(CompoundTag nbt) { } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); int flags = 0; - flags = Bits.setFlag(flags, 0x01, !rawSubtitle.isEmpty()); - flags = Bits.setFlag(flags, 0x02, !rawDescription.isEmpty()); flags = Bits.setFlag(flags, 0x04, size != 0D); flags = Bits.setFlag(flags, 0x08, !guidePage.isEmpty()); flags = Bits.setFlag(flags, 0x10, ignoreRewardBlocking); @@ -402,18 +385,10 @@ public void writeNetData(FriendlyByteBuf buffer) { hideDependencyLines.write(buffer); hideTextUntilComplete.write(buffer); - if (!rawSubtitle.isEmpty()) { - buffer.writeUtf(rawSubtitle, Short.MAX_VALUE); - } - buffer.writeDouble(x); buffer.writeDouble(y); buffer.writeUtf(shape, Short.MAX_VALUE); - if (!rawDescription.isEmpty()) { - NetUtils.writeStrings(buffer, rawDescription); - } - if (!guidePage.isEmpty()) { buffer.writeUtf(guidePage, Short.MAX_VALUE); } @@ -446,24 +421,17 @@ public void writeNetData(FriendlyByteBuf buffer) { } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); int flags = buffer.readVarInt(); hideUntilDepsVisible = Tristate.read(buffer); hideDependencyLines = Tristate.read(buffer); hideTextUntilComplete = Tristate.read(buffer); - rawSubtitle = Bits.getFlag(flags, 0x01) ? buffer.readUtf(Short.MAX_VALUE) : ""; x = buffer.readDouble(); y = buffer.readDouble(); shape = buffer.readUtf(Short.MAX_VALUE); - if (Bits.getFlag(flags, 0x02)) { - NetUtils.readStrings(buffer, rawDescription); - } else { - rawDescription.clear(); - } - guidePage = Bits.getFlag(flags, 0x08) ? buffer.readUtf(Short.MAX_VALUE) : ""; minRequiredDependencies = buffer.readVarInt(); @@ -581,7 +549,7 @@ public void forceProgress(TeamData teamData, ProgressChange progressChange) { @Environment(EnvType.CLIENT) public Component getAltTitle() { if (!tasks.isEmpty()) { - return tasks.get(0).getTitle(); + return tasks.getFirst().getTitle(); } return Component.translatable("ftbquests.unnamed"); @@ -647,17 +615,14 @@ public void onCreated() { public void fillConfigGroup(ConfigGroup config) { super.fillConfigGroup(config); - config.addString("subtitle", rawSubtitle, v -> rawSubtitle = v, ""); + config.addString("subtitle", getRawSubtitle(), this::setRawSubtitle, ""); StringConfig descType = new StringConfig(); config.add("description", new ListConfig(descType) { @Override public void onClicked(Widget clicked, MouseButton button, ConfigCallback callback) { new MultilineTextEditorScreen(Component.translatable("ftbquests.gui.edit_description"), this, callback).openGui(); } - }, rawDescription, (t) -> { - rawDescription.clear(); - rawDescription.addAll(t); - }, Collections.emptyList()); + }, getRawDescription(), this::setRawDescription, Collections.emptyList()); ConfigGroup appearance = config.getOrCreateSubgroup("appearance"); appearance.addEnum("shape", shape.isEmpty() ? "default" : shape, v -> shape = v.equals("default") ? "" : v, QuestShape.idMapWithDefault); @@ -734,8 +699,8 @@ public String getShape() { @Override @Environment(EnvType.CLIENT) - public void move(Chapter to, double x, double y) { - new MoveMovableMessage(this, to.id, x, y).sendToServer(); + public void initiateMoveClientSide(Chapter to, double x, double y) { + NetworkManager.sendToServer(new MoveMovableMessage(id, to.id, x, y)); } @Override @@ -775,7 +740,7 @@ public void clearCachedData() { @Environment(EnvType.CLIENT) public Component getSubtitle() { if (cachedSubtitle == null) { - cachedSubtitle = TextUtils.parseRawText(rawSubtitle); + cachedSubtitle = TextUtils.parseRawText(getRawSubtitle(), holderLookup()); } return cachedSubtitle; } @@ -783,7 +748,7 @@ public Component getSubtitle() { @Environment(EnvType.CLIENT) public List getDescription() { if (cachedDescription == null) { - cachedDescription = rawDescription.stream().map(TextUtils::parseRawText).toList(); + cachedDescription = getRawDescription().stream().map(str -> TextUtils.parseRawText(str, holderLookup())).toList(); } return cachedDescription; } @@ -823,21 +788,21 @@ public boolean verifyDependencies(boolean autofix) { return true; } catch (DependencyDepthException ex) { if (autofix) { - FTBQuests.LOGGER.error("Too deep dependencies found in " + this + " (referenced in " + ex.object + ")! Deleting all dependencies..."); + FTBQuests.LOGGER.error("Too deep dependencies found in {} (referenced in {})! Deleting all dependencies...", this, ex.object); clearDependencies(); chapter.file.markDirty(); } else { - FTBQuests.LOGGER.error("Too deep dependencies found in " + this + " (referenced in " + ex.object + ")!"); + FTBQuests.LOGGER.error("Too deep dependencies found in {} (referenced in {})!", this, ex.object); } return false; } catch (DependencyLoopException ex) { if (autofix) { - FTBQuests.LOGGER.error("Looping dependencies found in " + this + " (referenced in " + ex.object + ")! Deleting all dependencies..."); + FTBQuests.LOGGER.error("Looping dependencies found in {} (referenced in {})! Deleting all dependencies...", this, ex.object); clearDependencies(); chapter.file.markDirty(); } else { - FTBQuests.LOGGER.error("Looping dependencies found in " + this + " (referenced in " + ex.object + ")!"); + FTBQuests.LOGGER.error("Looping dependencies found in {} (referenced in {})!", this, ex.object); } return false; @@ -918,7 +883,7 @@ public Collection getDependants() { public void checkRepeatable(TeamData data, UUID player) { if (canBeRepeated() && rewards.stream().allMatch(r -> data.isRewardClaimed(player, r))) { - forceProgress(data, new ProgressChange(data.getFile(), this, player)); + forceProgress(data, new ProgressChange(this, player)); } } @@ -949,27 +914,27 @@ public boolean ignoreRewardBlocking() { return ignoreRewardBlocking; } - public void writeTasks(CompoundTag tag) { + public void writeTasks(CompoundTag tag, HolderLookup.Provider provider) { ListTag t = new ListTag(); for (Task task : tasks) { TaskType type = task.getType(); SNBTCompoundTag nbt3 = new SNBTCompoundTag(); nbt3.putString("id", task.getCodeString()); nbt3.putString("type", type.getTypeForNBT()); - task.writeData(nbt3); + task.writeData(nbt3, provider); t.add(nbt3); } tag.put("tasks", t); } - public void writeRewards(CompoundTag tag) { + public void writeRewards(CompoundTag tag, HolderLookup.Provider provider) { ListTag r = new ListTag(); for (Reward reward : rewards) { RewardType type = reward.getType(); SNBTCompoundTag nbt3 = new SNBTCompoundTag(); nbt3.putString("id", reward.getCodeString()); nbt3.putString("type", type.getTypeForNBT()); - reward.writeData(nbt3); + reward.writeData(nbt3, provider); r.add(nbt3); } tag.put("rewards", r); @@ -1069,6 +1034,8 @@ public boolean areDependenciesComplete(TeamData teamData) { public List> buildDescriptionIndex() { List> index = new ArrayList<>(); + List rawDescription = getRawDescription(); + int l1 = 0; for (int l2 = l1; l2 < rawDescription.size(); l2++) { if (rawDescription.get(l2).equals(PAGEBREAK_CODE)) { diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/QuestLink.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/QuestLink.java index fa63570f4..137e0df16 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/QuestLink.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/QuestLink.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftbquests.quest; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.ConfigGroup; import dev.ftb.mods.ftblibrary.icon.Icon; import dev.ftb.mods.ftblibrary.util.client.ClientUtils; @@ -8,8 +9,9 @@ import dev.ftb.mods.ftbquests.net.MoveMovableMessage; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import java.util.Optional; @@ -104,8 +106,8 @@ public void editedFromGUI() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putString("linked_quest", getCodeString(linkId)); nbt.putDouble("x", x); @@ -119,8 +121,8 @@ public void writeData(CompoundTag nbt) { } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); linkId = Long.parseLong(nbt.getString("linked_quest"), 16); x = nbt.getDouble("x"); @@ -133,7 +135,7 @@ public void readData(CompoundTag nbt) { } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeLong(linkId); @@ -144,7 +146,7 @@ public void writeNetData(FriendlyByteBuf buffer) { } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); linkId = buffer.readLong(); @@ -195,8 +197,8 @@ public String getShape() { } @Override - public void move(Chapter to, double x, double y) { - new MoveMovableMessage(this, to.id, x, y).sendToServer(); + public void initiateMoveClientSide(Chapter to, double x, double y) { + NetworkManager.sendToServer(new MoveMovableMessage(id, to.id, x, y)); } @Override diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/QuestObject.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/QuestObject.java index 9eb2247d6..76fea128e 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/QuestObject.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/QuestObject.java @@ -7,8 +7,9 @@ import dev.ftb.mods.ftbquests.util.ProgressChange; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import java.util.Collection; import java.util.List; @@ -22,8 +23,8 @@ public QuestObject(long id) { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); if (disableToast) { nbt.putBoolean("disable_toast", true); @@ -31,19 +32,19 @@ public void writeData(CompoundTag nbt) { } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); disableToast = nbt.getBoolean("disable_toast"); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeBoolean(disableToast); } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); disableToast = buffer.readBoolean(); } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/QuestObjectBase.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/QuestObjectBase.java index b8985ac2a..1bf378778 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/QuestObjectBase.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/QuestObjectBase.java @@ -1,29 +1,33 @@ package dev.ftb.mods.ftbquests.quest; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.ConfigGroup; import dev.ftb.mods.ftblibrary.config.StringConfig; import dev.ftb.mods.ftblibrary.config.Tristate; import dev.ftb.mods.ftblibrary.config.ui.EditConfigScreen; import dev.ftb.mods.ftblibrary.icon.Icon; import dev.ftb.mods.ftblibrary.math.Bits; +import dev.ftb.mods.ftblibrary.snbt.SNBTCompoundTag; import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.client.ClientQuestFile; import dev.ftb.mods.ftbquests.client.ConfigIconItemStack; import dev.ftb.mods.ftbquests.integration.RecipeModHelper; import dev.ftb.mods.ftbquests.item.CustomIconItem; import dev.ftb.mods.ftbquests.net.EditObjectMessage; +import dev.ftb.mods.ftbquests.net.SyncTranslationMessageToServer; import dev.ftb.mods.ftbquests.quest.theme.property.ThemeProperties; -import dev.ftb.mods.ftbquests.util.NBTUtils; +import dev.ftb.mods.ftbquests.quest.translation.TranslationKey; +import dev.ftb.mods.ftbquests.registry.ModDataComponents; +import dev.ftb.mods.ftbquests.registry.ModItems; import dev.ftb.mods.ftbquests.util.NetUtils; import dev.ftb.mods.ftbquests.util.ProgressChange; import dev.ftb.mods.ftbquests.util.TextUtils; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.StringTag; -import net.minecraft.nbt.Tag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.Util; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.*; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.ItemStack; @@ -31,6 +35,7 @@ import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.function.Consumer; import java.util.function.Supplier; import java.util.regex.Pattern; @@ -41,7 +46,6 @@ public abstract class QuestObjectBase implements Comparable { public final long id; protected boolean invalid = false; - protected String rawTitle = ""; private ItemStack rawIcon = ItemStack.EMPTY; private List tags = new ArrayList<>(0); @@ -49,10 +53,17 @@ public abstract class QuestObjectBase implements Comparable { private Component cachedTitle = null; private Set cachedTags = null; + // stores translations in the client-side proto-quest-object before it's sent to server + protected EnumMap protoTranslations = new EnumMap<>(TranslationKey.class); + public QuestObjectBase(long id) { this.id = id; } + public long getId() { + return id; + } + public static boolean isNull(@Nullable QuestObjectBase object) { return object == null || object.invalid; } @@ -73,6 +84,27 @@ public static boolean shouldSendNotifications() { return sendNotifications.get(true); } + public static ItemStack itemOrMissingFromNBT(CompoundTag tag, HolderLookup.Provider provider) { + return tag.isEmpty() ? + ItemStack.EMPTY : + ItemStack.parse(provider, tag).orElse(createMissing(tag)); + } + + public static ItemStack singleItemOrMissingFromNBT(CompoundTag tag, HolderLookup.Provider provider) { + return tag.isEmpty() ? + ItemStack.EMPTY : + ItemStack.SINGLE_ITEM_CODEC.parse(provider.createSerializationContext(NbtOps.INSTANCE), tag).result().orElse(createMissing(tag)); + } + + private static ItemStack createMissing(CompoundTag tag) { + String id = tag.getString("id"); + int count = Math.max(1, tag.getInt("count")); + String text = count == 1 ? id : count + "x " + id; + + return Util.make(new ItemStack(ModItems.MISSING_ITEM.get()), + stack -> stack.set(ModDataComponents.MISSING_ITEM_DESC.get(), text)); + } + public final boolean isValid() { return !invalid; } @@ -81,12 +113,60 @@ public final void setRawIcon(ItemStack rawIcon) { this.rawIcon = rawIcon; } - public final String getRawTitle() { - return rawTitle; + public String getRawTitle() { + if (!getQuestFile().isServerSide() && protoTranslations.containsKey(TranslationKey.TITLE)) { + return protoTranslations.get(TranslationKey.TITLE); + } + return getQuestFile().getTranslationManager().getStringTranslation(this, getQuestFile().getLocale(), TranslationKey.TITLE) + .orElse(""); + } + + public void setRawTitle(String rawTitle) { + setTranslatableValue(TranslationKey.TITLE, rawTitle); + cachedTitle = null; + } + + protected final void setTranslatableValue(TranslationKey translationKey, String value) { + if (id != 0L) { + String locale = getQuestFile().getLocale(); + getQuestFile().getTranslationManager().addTranslation(this, locale, translationKey, value); + if (!getQuestFile().isServerSide()) { + NetworkManager.sendToServer(SyncTranslationMessageToServer.create(this, locale, translationKey, value)); + } + } else if (!getQuestFile().isServerSide()) { + protoTranslations.put(translationKey, value); + } } - public final void setRawTitle(String rawTitle) { - this.rawTitle = rawTitle; + protected final void setTranslatableValue(TranslationKey translationKey, List value) { + if (id != 0L) { + String locale = getQuestFile().getLocale(); + getQuestFile().getTranslationManager().addTranslation(this, locale, translationKey, value); + if (!getQuestFile().isServerSide()) { + NetworkManager.sendToServer(SyncTranslationMessageToServer.create(this, locale, translationKey, value)); + } + } + // proto-translations not handled here since there aren't any list values that need handling + } + + /** + * Only used client-side; get the translation for a proto-quest-object currently being built on the client before + * it's sent to the server. + * + * @param key the translation key type + * @return the raw translation string + */ + public final String getProtoTranslation(TranslationKey key) { + return protoTranslations.getOrDefault(key, ""); + } + + public final void modifyTranslatableListValue(TranslationKey translationKey, Consumer> setter) { + if (translationKey.isListVal()) { + List mutable = getQuestFile().getTranslationManager().getStringListTranslation(this, getQuestFile().getLocale(), translationKey) + .map(ArrayList::new).orElse(new ArrayList<>()); + setter.accept(mutable); + setTranslatableValue(translationKey, List.copyOf(mutable)); + } } public static long parseCodeString(String id) { @@ -182,27 +262,22 @@ public long getParentID() { return 1L; } - public void writeData(CompoundTag nbt) { - if (!rawTitle.isEmpty()) { - nbt.putString("title", rawTitle); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + if (!rawIcon.isEmpty()) { + ItemStack.SINGLE_ITEM_CODEC.encodeStart(NbtOps.INSTANCE, rawIcon).ifSuccess(t -> nbt.put("icon", t)); } - NBTUtils.write(nbt, "icon", rawIcon); - if (!tags.isEmpty()) { - ListTag tagList = new ListTag(); - - for (String s : tags) { - tagList.add(StringTag.valueOf(s)); - } - - nbt.put("tags", tagList); + nbt.put("tags", Util.make(new ListTag(), l -> { + for (String s : tags) { + l.add(StringTag.valueOf(s)); + } + })); } } - public void readData(CompoundTag nbt) { - rawTitle = nbt.getString("title"); - rawIcon = NBTUtils.read(nbt, "icon"); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + rawIcon = singleItemOrMissingFromNBT(nbt.getCompound("icon"), provider); ListTag tagsList = nbt.getList("tags", Tag.TAG_STRING); @@ -217,20 +292,15 @@ public void readData(CompoundTag nbt) { } } - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { int flags = 0; - flags = Bits.setFlag(flags, 1, !rawTitle.isEmpty()); flags = Bits.setFlag(flags, 2, !rawIcon.isEmpty()); flags = Bits.setFlag(flags, 4, !tags.isEmpty()); buffer.writeVarInt(flags); - if (!rawTitle.isEmpty()) { - buffer.writeUtf(rawTitle, Short.MAX_VALUE); - } - if (!rawIcon.isEmpty()) { - buffer.writeItem(rawIcon); + ItemStack.OPTIONAL_STREAM_CODEC.encode(buffer, rawIcon); } if (!tags.isEmpty()) { @@ -238,10 +308,9 @@ public void writeNetData(FriendlyByteBuf buffer) { } } - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { int flags = buffer.readVarInt(); - rawTitle = Bits.getFlag(flags, 1) ? buffer.readUtf(Short.MAX_VALUE) : ""; - rawIcon = Bits.getFlag(flags, 2) ? buffer.readItem() : ItemStack.EMPTY; + rawIcon = Bits.getFlag(flags, 2) ? ItemStack.OPTIONAL_STREAM_CODEC.decode(buffer) : ItemStack.EMPTY; tags = new ArrayList<>(0); if (Bits.getFlag(flags, 4)) { @@ -260,7 +329,7 @@ protected boolean hasIconConfig() { @Environment(EnvType.CLIENT) public void fillConfigGroup(ConfigGroup config) { if (hasTitleConfig()) { - config.addString("title", rawTitle, v -> rawTitle = v, "").setNameKey("ftbquests.title").setOrder(-127); + config.addString("title", getRawTitle(), this::setRawTitle, "").setNameKey("ftbquests.title").setOrder(-127); } if (hasIconConfig()) { @@ -282,8 +351,8 @@ public final Component getTitle() { return cachedTitle.copy(); } - if (!rawTitle.isEmpty()) { - cachedTitle = TextUtils.parseRawText(rawTitle); + if (!getRawTitle().isEmpty()) { + cachedTitle = TextUtils.parseRawText(getRawTitle(), holderLookup()); } else { cachedTitle = getAltTitle(); } @@ -350,7 +419,7 @@ public void onEditButtonClicked(Runnable gui) { ConfigGroup group = new ConfigGroup(FTBQuestsAPI.MOD_ID, accepted -> { gui.run(); if (accepted && validateEditedConfig()) { - new EditObjectMessage(this).sendToServer(); + NetworkManager.sendToServer(EditObjectMessage.forQuestObject(this)); } }); fillConfigGroup(createSubGroup(group)); @@ -372,8 +441,8 @@ public static T copy(T orig, Supplier factory) { return null; } CompoundTag tag = new CompoundTag(); - orig.writeData(tag); - copied.readData(tag); + orig.writeData(tag, orig.holderLookup()); + copied.readData(tag, orig.holderLookup()); return copied; } @@ -384,4 +453,12 @@ public int compareTo(@NotNull QuestObjectBase other) { getTitle().getString().toLowerCase().compareTo(other.getTitle().getString().toLowerCase()) : typeCmp; } + + public HolderLookup.Provider holderLookup() { + return getQuestFile().holderLookup(); + } + + protected CompoundTag saveItemSingleLine(ItemStack stack) { + return Util.make(SNBTCompoundTag.of(stack.save(holderLookup())), SNBTCompoundTag::singleLine); + } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/QuestObjectType.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/QuestObjectType.java index 987f4eb07..925b5397d 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/QuestObjectType.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/QuestObjectType.java @@ -2,7 +2,9 @@ import dev.ftb.mods.ftblibrary.config.NameMap; import net.minecraft.ChatFormatting; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; import java.util.function.Predicate; @@ -19,6 +21,18 @@ public enum QuestObjectType implements Predicate { ; public static final NameMap NAME_MAP = NameMap.of(NULL, values()).id(v -> v.id).nameKey(v -> v.translationKey).create(); + public static StreamCodec STREAM_CODEC = new StreamCodec<>() { + @Override + public QuestObjectType decode(FriendlyByteBuf buf) { + return NAME_MAP.read(buf); + } + + @Override + public void encode(FriendlyByteBuf buf, QuestObjectType type) { + NAME_MAP.write(buf, type); + } + }; + public static final Predicate ALL_PROGRESSING = object -> object instanceof QuestObject; public static final Predicate ALL_PROGRESSING_OR_NULL = object -> object == null || object instanceof QuestObject; diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/ServerQuestFile.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/ServerQuestFile.java index 4834c6237..ab20e401e 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/ServerQuestFile.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/ServerQuestFile.java @@ -1,10 +1,12 @@ package dev.ftb.mods.ftbquests.quest; import com.mojang.util.UndashedUuid; +import dev.architectury.networking.NetworkManager; import dev.architectury.platform.Platform; import dev.architectury.utils.Env; import dev.ftb.mods.ftblibrary.snbt.SNBT; import dev.ftb.mods.ftblibrary.snbt.SNBTCompoundTag; +import dev.ftb.mods.ftblibrary.util.NetworkHelper; import dev.ftb.mods.ftbquests.FTBQuests; import dev.ftb.mods.ftbquests.events.QuestProgressEventData; import dev.ftb.mods.ftbquests.integration.PermissionsHelper; @@ -22,6 +24,7 @@ import dev.ftb.mods.ftbteams.api.event.PlayerLoggedInAfterTeamEvent; import dev.ftb.mods.ftbteams.api.event.TeamCreatedEvent; import dev.ftb.mods.ftbteams.data.PartyTeam; +import net.minecraft.core.HolderLookup; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; @@ -71,7 +74,7 @@ public void load() { if (Files.exists(folder)) { FTBQuests.LOGGER.info("Loading quests from " + folder); isLoading = true; - readDataFull(folder); + readDataFull(folder, server.registryAccess()); isLoading = false; } @@ -104,6 +107,11 @@ public Env getSide() { return Env.SERVER; } + @Override + public HolderLookup.Provider holderLookup() { + return server.registryAccess(); + } + @Override public boolean isLoading() { return isLoading; @@ -119,6 +127,7 @@ public void deleteObject(long id) { QuestObjectBase object = getBase(id); if (object != null) { + getTranslationManager().removeAllTranslations(object); object.deleteChildren(); object.deleteSelf(); refreshIDMap(); @@ -126,7 +135,7 @@ public void deleteObject(long id) { object.getPath().ifPresent(path -> FileUtils.delete(getFolder().resolve(path).toFile())); } - new DeleteObjectResponseMessage(id).sendToAll(server); + NetworkHelper.sendToAll(server, new DeleteObjectResponseMessage(id)); } @Override @@ -136,10 +145,12 @@ public void markDirty() { public void saveNow() { if (shouldSave) { - writeDataFull(getFolder()); + writeDataFull(getFolder(), server.registryAccess()); shouldSave = false; } + getTranslationManager().saveToNBT(getFolder().resolve("lang")); + getAllTeamData().forEach(TeamData::saveIfChanged); } @@ -169,9 +180,11 @@ public void playerLoggedIn(PlayerLoggedInAfterTeamEvent event) { // Sync the quest book data // - client will respond to this with a RequestTeamData message // - server will only then send a SyncTeamData message to the client - new SyncQuestsMessage(this).sendTo(player); + NetworkManager.sendToPlayer(player, new SyncQuestsMessage(this)); + + NetworkManager.sendToPlayer(player, new SyncEditorPermissionMessage(PermissionsHelper.hasEditorPermission(player, false))); - new SyncEditorPermissionMessage(PermissionsHelper.hasEditorPermission(player, false)).sendTo(player); + getTranslationManager().sendTranslationsToPlayer(player); player.inventoryMenu.addSlotListener(new FTBQuestsInventoryListener(player)); @@ -214,9 +227,7 @@ public void teamCreated(TeamCreatedEvent event) { }); } - TeamDataUpdate self = new TeamDataUpdate(data); - - new CreateOtherTeamDataMessage(self).sendToAll(server); + NetworkHelper.sendToAll(server, new CreateOtherTeamDataMessage(TeamDataUpdate.forTeamData(data))); } public void playerChangedTeam(PlayerChangedTeamEvent event) { @@ -234,8 +245,8 @@ public void playerChangedTeam(PlayerChangedTeamEvent event) { newTeamData.mergeClaimedRewards(oldTeamData); } - new TeamDataChangedMessage(new TeamDataUpdate(oldTeamData), new TeamDataUpdate(newTeamData)).sendToAll(server); - new SyncTeamDataMessage(newTeamData, true).sendTo(curTeam.getOnlineMembers()); + NetworkHelper.sendToAll(server, new TeamDataChangedMessage(TeamDataUpdate.forTeamData(oldTeamData), TeamDataUpdate.forTeamData(newTeamData))); + NetworkManager.sendToPlayers(curTeam.getOnlineMembers(), new SyncTeamDataMessage(newTeamData)); }); } @@ -251,9 +262,15 @@ public boolean moveChapterGroup(long id, boolean movingUp) { if (super.moveChapterGroup(id, movingUp)) { markDirty(); clearCachedData(); - new MoveChapterGroupResponseMessage(id, movingUp).sendToAll(server); + NetworkHelper.sendToAll(server, new MoveChapterGroupResponseMessage(id, movingUp)); return true; } return false; } + + @Override + public String getLocale() { + return "en_us"; + } + } 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 dcd0e0821..d201d1b38 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 @@ -1,10 +1,12 @@ package dev.ftb.mods.ftbquests.quest; import com.mojang.util.UndashedUuid; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.snbt.SNBT; import dev.ftb.mods.ftblibrary.snbt.SNBTCompoundTag; import dev.ftb.mods.ftbquests.FTBQuests; import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; +import dev.ftb.mods.ftbquests.client.ClientQuestFile; import dev.ftb.mods.ftbquests.events.QuestProgressEventData; import dev.ftb.mods.ftbquests.net.*; import dev.ftb.mods.ftbquests.quest.reward.Reward; @@ -26,9 +28,11 @@ import net.minecraft.nbt.StringTag; import net.minecraft.nbt.Tag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.nio.file.Path; @@ -46,6 +50,19 @@ public class TeamData { private static final Comparator LONG2LONG_COMPARATOR = (e1, e2) -> Long.compareUnsigned(e1.getLongValue(), e2.getLongValue()); private static final Comparator> OBJECT2LONG_COMPARATOR = (e1, e2) -> Long.compareUnsigned(e1.getLongValue(), e2.getLongValue()); + public static final StreamCodec STREAM_CODEC = new StreamCodec<>() { + @Override + public TeamData decode(FriendlyByteBuf buf) { + return Util.make(new TeamData(buf.readUUID(), ClientQuestFile.INSTANCE), d -> d.readNetData(buf)); + } + + @Override + public void encode(FriendlyByteBuf buf, TeamData data) { + buf.writeUUID(data.getTeamId()); + data.write(buf); + } + }; + private final UUID teamId; private final BaseQuestFile file; @@ -93,6 +110,7 @@ public BaseQuestFile getFile() { return file; } + @NotNull public static TeamData get(Player player) { return FTBQuestsAPI.api().getQuestFile(player.getCommandSenderWorld().isClientSide()).getOrCreateTeamData(player); } @@ -146,7 +164,7 @@ public boolean setStarted(long questId, @Nullable Date time) { markDirty(); if (file.isServerSide()) { - new ObjectStartedResetMessage(teamId, questId).sendTo(getOnlineMembers()); + NetworkManager.sendToPlayers(getOnlineMembers(), new ObjectStartedResetMessage(teamId, questId)); } return true; @@ -157,7 +175,7 @@ public boolean setStarted(long questId, @Nullable Date time) { markDirty(); if (file.isServerSide()) { - new ObjectStartedMessage(teamId, questId).sendTo(getOnlineMembers()); + NetworkManager.sendToPlayers(getOnlineMembers(), new ObjectStartedMessage(teamId, questId)); } return true; @@ -184,7 +202,7 @@ public boolean setCompleted(long id, @Nullable Date time) { markDirty(); if (file.isServerSide()) { - new ObjectCompletedResetMessage(teamId, id).sendTo(getOnlineMembers()); + NetworkManager.sendToPlayers(getOnlineMembers(), new ObjectCompletedResetMessage(teamId, id)); } return true; @@ -195,7 +213,7 @@ public boolean setCompleted(long id, @Nullable Date time) { markDirty(); if (file.isServerSide()) { - new ObjectCompletedMessage(teamId, id).sendTo(getOnlineMembers()); + NetworkManager.sendToPlayers(getOnlineMembers(), new ObjectCompletedMessage(teamId, id)); } return true; @@ -227,7 +245,7 @@ public boolean setRewardsBlocked(boolean rewardsBlocked) { clearCachedProgress(); markDirty(); if (file.isServerSide()) { - new SyncRewardBlockingMessage(teamId, rewardsBlocked).sendTo(getOnlineMembers()); + NetworkManager.sendToPlayers(getOnlineMembers(), new SyncRewardBlockingMessage(teamId, rewardsBlocked)); } return true; } @@ -268,7 +286,7 @@ public boolean claimReward(UUID player, Reward reward, long date) { markDirty(); if (file.isServerSide()) { - new ClaimRewardResponseMessage(teamId, player, reward.id).sendTo(getOnlineMembers()); + NetworkManager.sendToPlayers(getOnlineMembers(), new ClaimRewardResponseMessage(teamId, player, reward.id)); } reward.getQuest().checkRepeatable(this, player); @@ -292,7 +310,7 @@ public boolean resetReward(UUID player, Reward reward) { markDirty(); if (file.isServerSide()) { - new ResetRewardMessage(teamId, player, reward.id).sendTo(getOnlineMembers()); + NetworkManager.sendToPlayers(getOnlineMembers(), new ResetRewardMessage(teamId, player, reward.id)); } return true; @@ -399,7 +417,7 @@ public void deserializeNBT(SNBTCompoundTag nbt) { } } - public void write(FriendlyByteBuf buffer, boolean self) { + private void write(FriendlyByteBuf buffer) { buffer.writeUtf(name, Short.MAX_VALUE); buffer.writeVarInt(taskProgress.size()); @@ -427,23 +445,21 @@ public void write(FriendlyByteBuf buffer, boolean self) { buffer.writeBoolean(locked); buffer.writeBoolean(rewardsBlocked); - if (self) { - buffer.writeVarInt(claimedRewards.size()); - for (Object2LongMap.Entry entry : claimedRewards.object2LongEntrySet()) { - entry.getKey().toNetwork(buffer); - buffer.writeVarLong(now - entry.getLongValue()); - } + buffer.writeVarInt(claimedRewards.size()); + for (Object2LongMap.Entry entry : claimedRewards.object2LongEntrySet()) { + entry.getKey().toNetwork(buffer); + buffer.writeVarLong(now - entry.getLongValue()); + } - buffer.writeVarInt(perPlayerData.size()); - perPlayerData.forEach((id, ppd) -> { - buffer.writeUUID(id); - ppd.writeNet(buffer); - }); + buffer.writeVarInt(perPlayerData.size()); + perPlayerData.forEach((id, ppd) -> { + buffer.writeUUID(id); + ppd.writeNet(buffer); + }); - } } - public void read(FriendlyByteBuf buffer, boolean self) { + private void readNetData(FriendlyByteBuf buffer) { name = buffer.readUtf(Short.MAX_VALUE); taskProgress.clear(); @@ -472,19 +488,16 @@ public void read(FriendlyByteBuf buffer, boolean self) { claimedRewards.clear(); perPlayerData.clear(); - if (self) { - int claimedRewardCount = buffer.readVarInt(); - for (int i = 0; i < claimedRewardCount; i++) { - QuestKey key = QuestKey.fromNetwork(buffer); - claimedRewards.put(key, now - buffer.readVarLong()); - } - - int ppdCount = buffer.readVarInt(); - for (int i = 0; i < ppdCount; i++) { - UUID id = buffer.readUUID(); - perPlayerData.put(id, PerPlayerData.fromNet(buffer)); - } + int claimedRewardCount = buffer.readVarInt(); + for (int i = 0; i < claimedRewardCount; i++) { + QuestKey key = QuestKey.fromNetwork(buffer); + claimedRewards.put(key, now - buffer.readVarLong()); + } + int ppdCount = buffer.readVarInt(); + for (int i = 0; i < ppdCount; i++) { + UUID id = buffer.readUUID(); + perPlayerData.put(id, PerPlayerData.fromNet(buffer)); } } @@ -614,7 +627,7 @@ public final void setProgress(Task task, long progress) { Date now = new Date(); Collection onlineMembers = getOnlineMembers(); - new UpdateTaskProgressMessage(this, task.id, progress).sendTo(onlineMembers); + NetworkManager.sendToPlayers(getOnlineMembers(), new UpdateTaskProgressMessage(this.getTeamId(), task.id, progress)); if (prevProgress == 0L) { task.onStarted(new QuestProgressEventData<>(now, this, task, onlineMembers, Collections.emptyList())); @@ -649,7 +662,7 @@ public void markTaskCompleted(Task task) { if (isCompleted(task.getQuest())) { perPlayerData.values().forEach(data -> data.pinnedQuests.remove(task.getQuest().id)); markDirty(); - new TogglePinnedResponseMessage(task.getQuest().id, false).sendTo(onlineMembers); + NetworkManager.sendToPlayers(getOnlineMembers(), new TogglePinnedResponseMessage(task.getQuest().id, false)); } } @@ -668,7 +681,7 @@ public boolean setLocked(boolean newLocked) { markDirty(); if (file.isServerSide()) { - new SyncLockMessage(teamId, locked).sendTo(getOnlineMembers()); + NetworkManager.sendToPlayers(getOnlineMembers(), new SyncLockMessage(teamId, locked)); } return true; @@ -732,7 +745,7 @@ public boolean setCanEdit(Player player, boolean newCanEdit) { clearCachedProgress(); markDirty(); if (file.isServerSide() && player instanceof ServerPlayer sp) { - new SyncEditingModeMessage(teamId, newCanEdit).sendTo(sp); + NetworkManager.sendToPlayer(sp, new SyncEditingModeMessage(teamId, newCanEdit)); } return true; } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/loot/LootCrate.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/loot/LootCrate.java index 346397600..67ace2a54 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/loot/LootCrate.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/loot/LootCrate.java @@ -3,10 +3,10 @@ import dev.ftb.mods.ftblibrary.config.ConfigGroup; import dev.ftb.mods.ftblibrary.config.NameMap; import dev.ftb.mods.ftblibrary.icon.Color4I; -import dev.ftb.mods.ftbquests.item.FTBQuestsItems; import dev.ftb.mods.ftbquests.quest.QuestObjectBase; +import dev.ftb.mods.ftbquests.registry.ModDataComponents; +import dev.ftb.mods.ftbquests.registry.ModItems; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.StringTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.item.ItemStack; @@ -137,8 +137,8 @@ public String getStringID() { } public ItemStack createStack() { - ItemStack stack = new ItemStack(FTBQuestsItems.LOOTCRATE.get()); - stack.addTagElement("type", StringTag.valueOf(getStringID())); + ItemStack stack = new ItemStack(ModItems.LOOTCRATE.get()); + stack.set(ModDataComponents.LOOT_CRATE.get(), getStringID()); return stack; } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/loot/RewardTable.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/loot/RewardTable.java index 60324b0c2..976b066b5 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/loot/RewardTable.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/loot/RewardTable.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftbquests.quest.loot; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.ConfigGroup; import dev.ftb.mods.ftblibrary.icon.Icon; import dev.ftb.mods.ftblibrary.icon.IconAnimation; @@ -25,10 +26,11 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.RandomSource; @@ -38,7 +40,7 @@ import java.util.*; import java.util.stream.Collectors; -public final class RewardTable extends QuestObjectBase { +public class RewardTable extends QuestObjectBase { private final BaseQuestFile file; private final List weightedRewards; private final Quest fakeQuest; @@ -135,8 +137,8 @@ public Collection generateWeightedRandomRewards(RandomSource ran } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); if (emptyWeight > 0f) { nbt.putFloat("empty_weight", emptyWeight); @@ -156,17 +158,17 @@ public void writeData(CompoundTag nbt) { for (WeightedReward wr : weightedRewards) { SNBTCompoundTag nbt1 = new SNBTCompoundTag(); - wr.getReward().writeData(nbt1); + wr.getReward().writeData(nbt1, provider); if (wr.getReward().getType() != RewardTypes.ITEM) { nbt1.putString("type", wr.getReward().getType().getTypeForNBT()); - } else if (nbt1.getTagType("item") == Tag.TAG_STRING) { - nbt1.singleLine(); } - if (wr.getWeight() != 1f) { nbt1.putFloat("weight", wr.getWeight()); } + if (nbt1.size() < 3) { + nbt1.singleLine(); + } list.add(nbt1); } @@ -185,8 +187,8 @@ public void writeData(CompoundTag nbt) { } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); emptyWeight = nbt.getFloat("empty_weight"); lootSize = nbt.getInt("loot_size"); hideTooltip = nbt.getBoolean("hide_tooltip"); @@ -200,7 +202,7 @@ public void readData(CompoundTag nbt) { Reward reward = RewardType.createReward(0L, fakeQuest, nbt1.getString("type")); if (reward != null) { - reward.readData(nbt1); + reward.readData(nbt1, provider); weightedRewards.add(new WeightedReward(reward, nbt1.contains("weight") ? nbt1.getFloat("weight") : 1)); } } @@ -216,7 +218,7 @@ public void readData(CompoundTag nbt) { } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeUtf(filename, Short.MAX_VALUE); buffer.writeFloat(emptyWeight); @@ -245,7 +247,7 @@ public void writeNetData(FriendlyByteBuf buffer) { } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); filename = buffer.readUtf(Short.MAX_VALUE); emptyWeight = buffer.readFloat(); @@ -329,9 +331,9 @@ public void editedFromGUIOnServer() { @Override public void onCreated() { - if (filename.isEmpty()) { - filename = file.generateRewardTableName(titleToID(rawTitle).orElse(toString())); - } +// if (filename.isEmpty()) { +// filename = file.generateRewardTableName(titleToID(getRawTitle()).orElse(toString())); +// } file.addRewardTable(this); } @@ -377,7 +379,7 @@ public Icon getAltIcon() { @Environment(EnvType.CLIENT) public void onEditButtonClicked(Runnable gui) { new EditRewardTableScreen(gui, this, editedReward -> { - new EditObjectMessage(editedReward).sendToServer(); + NetworkManager.sendToServer(EditObjectMessage.forQuestObject(editedReward)); clearCachedData(); }).openGui(); } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/AdvancementReward.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/AdvancementReward.java index 2d7673c89..dd2e1a1bc 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/AdvancementReward.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/AdvancementReward.java @@ -10,8 +10,9 @@ import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.contents.PlainTextContents; import net.minecraft.resources.ResourceLocation; @@ -33,28 +34,28 @@ public RewardType getType() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putString("advancement", advancement.toString()); nbt.putString("criterion", criterion); } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); advancement = new ResourceLocation(nbt.getString("advancement")); criterion = nbt.getString("criterion"); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeResourceLocation(advancement); buffer.writeUtf(criterion, Short.MAX_VALUE); } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); advancement = buffer.readResourceLocation(); criterion = buffer.readUtf(Short.MAX_VALUE); @@ -65,11 +66,13 @@ public void readNetData(FriendlyByteBuf buffer) { public void fillConfigGroup(ConfigGroup config) { super.fillConfigGroup(config); - if (KnownServerRegistries.client != null && !KnownServerRegistries.client.advancements.isEmpty()) { - config.addEnum("advancement", advancement, v -> advancement = v, NameMap.of(KnownServerRegistries.client.advancements.keySet().iterator().next(), KnownServerRegistries.client.advancements.keySet().toArray(new ResourceLocation[0])) - .icon(resourceLocation -> ItemIcon.getItemIcon(KnownServerRegistries.client.advancements.get(resourceLocation).icon)) - .name(resourceLocation -> KnownServerRegistries.client.advancements.get(resourceLocation).name) - .create()).setNameKey("ftbquests.reward.ftbquests.advancement"); + if (KnownServerRegistries.client != null && !KnownServerRegistries.client.advancements().isEmpty()) { + var advancements = KnownServerRegistries.client.advancements(); + config.addEnum("advancement", advancement, v -> advancement = v, + NameMap.of(advancements.keySet().iterator().next(), advancements.keySet().toArray(new ResourceLocation[0])) + .icon(resourceLocation -> ItemIcon.getItemIcon(advancements.get(resourceLocation).icon())) + .name(resourceLocation -> advancements.get(resourceLocation).name()) + .create()).setNameKey("ftbquests.reward.ftbquests.advancement"); } else { config.addString("advancement", advancement.toString(), v -> advancement = new ResourceLocation(v), "minecraft:story/root").setNameKey("ftbquests.reward.ftbquests.advancement"); } @@ -95,10 +98,12 @@ public void claim(ServerPlayer player, boolean notify) { @Override @Environment(EnvType.CLIENT) public Component getAltTitle() { - KnownServerRegistries.AdvancementInfo info = KnownServerRegistries.client == null ? null : KnownServerRegistries.client.advancements.get(advancement); + KnownServerRegistries.AdvancementInfo info = KnownServerRegistries.client == null ? + null : + KnownServerRegistries.client.advancements().get(advancement); - if (info != null && info.name.getContents() != PlainTextContents.EMPTY) { - return Component.translatable("ftbquests.reward.ftbquests.advancement").append(": ").append(info.name.copy().withStyle(ChatFormatting.YELLOW)); + if (info != null && info.name().getContents() != PlainTextContents.EMPTY) { + return Component.translatable("ftbquests.reward.ftbquests.advancement").append(": ").append(info.name().copy().withStyle(ChatFormatting.YELLOW)); } return super.getAltTitle(); @@ -107,10 +112,12 @@ public Component getAltTitle() { @Override @Environment(EnvType.CLIENT) public Icon getAltIcon() { - KnownServerRegistries.AdvancementInfo info = KnownServerRegistries.client == null ? null : KnownServerRegistries.client.advancements.get(advancement); + KnownServerRegistries.AdvancementInfo info = KnownServerRegistries.client == null ? + null : + KnownServerRegistries.client.advancements().get(advancement); - if (info != null && !info.icon.isEmpty()) { - return ItemIcon.getItemIcon(info.icon); + if (info != null && !info.icon().isEmpty()) { + return ItemIcon.getItemIcon(info.icon()); } return super.getAltIcon(); 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 54e4fa520..880445976 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 @@ -7,8 +7,9 @@ import net.minecraft.ChatFormatting; import net.minecraft.commands.CommandSourceStack; import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerPlayer; @@ -32,8 +33,8 @@ public RewardType getType() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putString("command", command); if (elevatePerms) { nbt.putBoolean("elevate_perms", true); @@ -42,15 +43,15 @@ public void writeData(CompoundTag nbt) { } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); command = nbt.getString("command"); elevatePerms = nbt.getBoolean("elevate_perms"); silent = nbt.getBoolean("silent"); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeUtf(command, Short.MAX_VALUE); buffer.writeBoolean(elevatePerms); @@ -58,7 +59,7 @@ public void writeNetData(FriendlyByteBuf buffer) { } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); command = buffer.readUtf(Short.MAX_VALUE); elevatePerms = buffer.readBoolean(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/ItemReward.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/ItemReward.java index e9f28dcf2..660c45638 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/ItemReward.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/ItemReward.java @@ -1,19 +1,19 @@ package dev.ftb.mods.ftbquests.quest.reward; import dev.architectury.hooks.item.ItemStackHooks; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.ConfigGroup; import dev.ftb.mods.ftblibrary.icon.Icon; import dev.ftb.mods.ftblibrary.icon.ItemIcon; import dev.ftb.mods.ftblibrary.ui.Widget; import dev.ftb.mods.ftblibrary.util.client.PositionedIngredient; import dev.ftb.mods.ftbquests.net.DisplayItemRewardToastMessage; -import dev.ftb.mods.ftbquests.net.FTBQuestsNetHandler; import dev.ftb.mods.ftbquests.quest.Quest; -import dev.ftb.mods.ftbquests.util.NBTUtils; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerPlayer; @@ -63,9 +63,12 @@ public RewardType getType() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); - NBTUtils.write(nbt, "item", item); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); + + if (!item.isEmpty()) { + nbt.put("item", item.save(provider)); + } if (count > 1) { nbt.putInt("count", count); @@ -79,9 +82,10 @@ public void writeData(CompoundTag nbt) { } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); - item = NBTUtils.read(nbt, "item"); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); + + item = itemOrMissingFromNBT(nbt.getCompound("item"), provider); count = nbt.getInt("count"); if (count == 0) { @@ -94,18 +98,20 @@ public void readData(CompoundTag nbt) { } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); - FTBQuestsNetHandler.writeItemType(buffer, item); + + ItemStack.OPTIONAL_STREAM_CODEC.encode(buffer, item); buffer.writeVarInt(count); buffer.writeVarInt(randomBonus); buffer.writeBoolean(onlyOne); } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); - item = FTBQuestsNetHandler.readItemType(buffer); + + item = ItemStack.OPTIONAL_STREAM_CODEC.decode(buffer); count = buffer.readVarInt(); randomBonus = buffer.readVarInt(); onlyOne = buffer.readBoolean(); @@ -136,7 +142,7 @@ public void claim(ServerPlayer player, boolean notify) { } if (notify) { - new DisplayItemRewardToastMessage(item, size).sendTo(player); + NetworkManager.sendToPlayer(player, new DisplayItemRewardToastMessage(item, size)); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/RandomReward.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/RandomReward.java index 03707131a..afe823919 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/RandomReward.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/RandomReward.java @@ -14,8 +14,9 @@ import dev.ftb.mods.ftbquests.util.ConfigQuestObject; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.RandomSource; @@ -41,23 +42,23 @@ public RewardType getType() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); if (getTable() != null) { nbt.putLong("table_id", table.id); if (table.id == -1L) { SNBTCompoundTag tag = new SNBTCompoundTag(); - table.writeData(tag); + table.writeData(tag, provider); nbt.put("table_data", tag); } } } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); table = null; BaseQuestFile file = getQuestFile(); @@ -68,7 +69,7 @@ public void readData(CompoundTag nbt) { if (table == null && nbt.contains("table_data")) { table = new RewardTable(-1L, file); - table.readData(nbt.getCompound("table_data")); + table.readData(nbt.getCompound("table_data"), provider); table.setRawTitle("Internal"); } } @@ -87,7 +88,7 @@ public void setTable(RewardTable table) { } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); RewardTable table = getTable(); @@ -99,7 +100,7 @@ public void writeNetData(FriendlyByteBuf buffer) { } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); BaseQuestFile file = getQuestFile(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/Reward.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/Reward.java index 8ef1d5c78..11a697cf1 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/Reward.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/Reward.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftbquests.quest.reward; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.ConfigGroup; import dev.ftb.mods.ftblibrary.config.Tristate; import dev.ftb.mods.ftblibrary.icon.Icon; @@ -15,8 +16,9 @@ import dev.ftb.mods.ftbquests.util.ProgressChange; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.RandomSource; @@ -75,8 +77,8 @@ public final long getParentID() { public abstract RewardType getType(); @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); if (team != Tristate.DEFAULT) { team.write(nbt, "team_reward"); @@ -91,8 +93,8 @@ public void writeData(CompoundTag nbt) { } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); team = Tristate.read(nbt, "team_reward"); autoclaim = RewardAutoClaim.NAME_MAP.get(nbt.getString("auto")); excludeFromClaimAll = nbt.getBoolean("exclude_from_claim_all"); @@ -100,7 +102,7 @@ public void readData(CompoundTag nbt) { } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); Tristate.NAME_MAP.write(buffer, team); RewardAutoClaim.NAME_MAP.write(buffer, autoclaim); @@ -109,7 +111,7 @@ public void writeNetData(FriendlyByteBuf buffer) { } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); team = Tristate.NAME_MAP.read(buffer); autoclaim = RewardAutoClaim.NAME_MAP.read(buffer); @@ -259,7 +261,7 @@ public boolean addTitleInMouseOverText() { public void onButtonClicked(Button button, boolean canClick) { if (canClick) { button.playClickSound(); - new ClaimRewardMessage(id, true).sendToServer(); + NetworkManager.sendToServer(new ClaimRewardMessage(id, true)); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/RewardType.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/RewardType.java index c30e50633..3ef76d1f1 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/RewardType.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/RewardType.java @@ -7,6 +7,8 @@ import dev.ftb.mods.ftbquests.quest.Quest; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.Util; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; @@ -57,6 +59,10 @@ public String getTypeForNBT() { return typeId.getNamespace().equals(FTBQuestsAPI.MOD_ID) ? typeId.getPath() : typeId.toString(); } + public CompoundTag makeExtraNBT() { + return Util.make(new CompoundTag(), t -> t.putString("type", getTypeForNBT())); + } + public RewardType setDisplayName(Component name) { displayName = name; return this; diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/StageReward.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/StageReward.java index a3a3d395d..efddf88f6 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/StageReward.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/StageReward.java @@ -6,8 +6,9 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerPlayer; @@ -27,8 +28,8 @@ public RewardType getType() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putString("stage", stage); if (remove) { @@ -37,21 +38,21 @@ public void writeData(CompoundTag nbt) { } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); stage = nbt.getString("stage"); remove = nbt.getBoolean("remove"); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeUtf(stage, Short.MAX_VALUE); buffer.writeBoolean(remove); } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); stage = buffer.readUtf(Short.MAX_VALUE); remove = buffer.readBoolean(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/ToastReward.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/ToastReward.java index e6e4f444d..84d89146c 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/ToastReward.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/ToastReward.java @@ -4,8 +4,9 @@ import dev.ftb.mods.ftbquests.quest.Quest; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; public class ToastReward extends Reward { @@ -22,25 +23,25 @@ public RewardType getType() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putString("description", description); } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); description = nbt.getString("description"); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeUtf(description, Short.MAX_VALUE); } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); description = buffer.readUtf(Short.MAX_VALUE); } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/XPLevelsReward.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/XPLevelsReward.java index e86897c79..4325fb51c 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/XPLevelsReward.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/XPLevelsReward.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftbquests.quest.reward; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.ConfigGroup; import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftbquests.net.DisplayRewardToastMessage; @@ -7,8 +8,9 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerPlayer; @@ -31,25 +33,25 @@ public RewardType getType() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putInt("xp_levels", xpLevels); } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); xpLevels = nbt.getInt("xp_levels"); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeVarInt(xpLevels); } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); xpLevels = buffer.readVarInt(); } @@ -66,7 +68,9 @@ public void claim(ServerPlayer player, boolean notify) { player.giveExperienceLevels(xpLevels); if (notify) { - new DisplayRewardToastMessage(id, Component.translatable("ftbquests.reward.ftbquests.xp_levels").append(": ").append(Component.literal("+" + xpLevels).withStyle(ChatFormatting.GREEN)), Color4I.empty()).sendTo(player); + Component text = Component.translatable("ftbquests.reward.ftbquests.xp_levels").append(": ") + .append(Component.literal("+" + xpLevels).withStyle(ChatFormatting.GREEN)); + NetworkManager.sendToPlayer(player, new DisplayRewardToastMessage(id, text, Color4I.empty())); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/XPReward.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/XPReward.java index 0dc0cc36f..e08d6038e 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/XPReward.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/reward/XPReward.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftbquests.quest.reward; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.ConfigGroup; import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftbquests.net.DisplayRewardToastMessage; @@ -7,8 +8,9 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerPlayer; @@ -31,25 +33,25 @@ public RewardType getType() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putInt("xp", xp); } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); xp = nbt.getInt("xp"); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeVarInt(xp); } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); xp = buffer.readVarInt(); } @@ -66,7 +68,9 @@ public void claim(ServerPlayer player, boolean notify) { player.giveExperiencePoints(xp); if (notify) { - new DisplayRewardToastMessage(id, Component.translatable("ftbquests.reward.ftbquests.xp").append(": ").append(Component.literal("+" + xp).withStyle(ChatFormatting.GREEN)), Color4I.empty()).sendTo(player); + Component text = Component.translatable("ftbquests.reward.ftbquests.xp").append(": ") + .append(Component.literal("+" + xp).withStyle(ChatFormatting.GREEN)); + NetworkManager.sendToPlayer(player, new DisplayRewardToastMessage(id, text, Color4I.empty())); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/AdvancementTask.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/AdvancementTask.java index 9ca80be03..1aa13f387 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/AdvancementTask.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/AdvancementTask.java @@ -13,15 +13,14 @@ import net.minecraft.advancements.AdvancementHolder; import net.minecraft.advancements.AdvancementProgress; import net.minecraft.advancements.CriterionProgress; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.contents.PlainTextContents; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; -import java.util.Map; - public class AdvancementTask extends AbstractBooleanTask { private ResourceLocation advancement = new ResourceLocation("minecraft:story/root"); private String criterion = ""; @@ -36,28 +35,28 @@ public TaskType getType() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putString("advancement", advancement.toString()); nbt.putString("criterion", criterion); } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); advancement = new ResourceLocation(nbt.getString("advancement")); criterion = nbt.getString("criterion"); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeResourceLocation(advancement); buffer.writeUtf(criterion, Short.MAX_VALUE); } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); advancement = buffer.readResourceLocation(); criterion = buffer.readUtf(Short.MAX_VALUE); @@ -68,13 +67,14 @@ public void readNetData(FriendlyByteBuf buffer) { public void fillConfigGroup(ConfigGroup config) { super.fillConfigGroup(config); - if (KnownServerRegistries.client != null && !KnownServerRegistries.client.advancements.isEmpty()) { - Map advancements = KnownServerRegistries.client.advancements; + if (KnownServerRegistries.client != null && !KnownServerRegistries.client.advancements().isEmpty()) { + var advancements = KnownServerRegistries.client.advancements(); KnownServerRegistries.AdvancementInfo def = advancements.values().iterator().next(); - config.addEnum("advancement", advancement, v -> advancement = v, NameMap.of(def.id, advancements.keySet().toArray(new ResourceLocation[0])) - .icon(id -> ItemIcon.getItemIcon(KnownServerRegistries.client.advancements.getOrDefault(id, def).icon)) - .name(id -> KnownServerRegistries.client.advancements.getOrDefault(id, def).name) - .create()).setNameKey("ftbquests.task.ftbquests.advancement"); + config.addEnum("advancement", advancement, v -> advancement = v, + NameMap.of(def.id(), advancements.keySet().toArray(new ResourceLocation[0])) + .icon(id -> ItemIcon.getItemIcon(advancements.getOrDefault(id, def).icon())) + .name(id -> advancements.getOrDefault(id, def).name()) + .create()).setNameKey("ftbquests.task.ftbquests.advancement"); } else { config.addString("advancement", advancement.toString(), v -> advancement = new ResourceLocation(v), "minecraft:story/root").setNameKey("ftbquests.task.ftbquests.advancement"); } @@ -85,10 +85,12 @@ public void fillConfigGroup(ConfigGroup config) { @Override @Environment(EnvType.CLIENT) public Component getAltTitle() { - KnownServerRegistries.AdvancementInfo info = KnownServerRegistries.client == null ? null : KnownServerRegistries.client.advancements.get(advancement); + KnownServerRegistries.AdvancementInfo info = KnownServerRegistries.client == null ? + null : + KnownServerRegistries.client.advancements().get(advancement); - if (info != null && info.name.getContents() != PlainTextContents.EMPTY) { - return Component.translatable("ftbquests.task.ftbquests.advancement").append(": ").append(Component.literal("").append(info.name).withStyle(ChatFormatting.YELLOW)); + if (info != null && info.name().getContents() != PlainTextContents.EMPTY) { + return Component.translatable("ftbquests.task.ftbquests.advancement").append(": ").append(Component.literal("").append(info.name()).withStyle(ChatFormatting.YELLOW)); } return super.getAltTitle(); @@ -97,10 +99,12 @@ public Component getAltTitle() { @Override @Environment(EnvType.CLIENT) public Icon getAltIcon() { - KnownServerRegistries.AdvancementInfo info = KnownServerRegistries.client == null ? null : KnownServerRegistries.client.advancements.get(advancement); + KnownServerRegistries.AdvancementInfo info = KnownServerRegistries.client == null ? + null : + KnownServerRegistries.client.advancements().get(advancement); - if (info != null && !info.icon.isEmpty()) { - return ItemIcon.getItemIcon(info.icon); + if (info != null && !info.icon().isEmpty()) { + return ItemIcon.getItemIcon(info.icon()); } return super.getAltIcon(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/BiomeTask.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/BiomeTask.java index 65a08260d..c25c356f9 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/BiomeTask.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/BiomeTask.java @@ -10,10 +10,11 @@ import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; import net.minecraft.core.Holder; +import net.minecraft.core.HolderLookup; import net.minecraft.core.RegistryAccess; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceKey; @@ -43,25 +44,25 @@ public TaskType getType() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putString("biome", getBiome()); } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); setBiome(nbt.getString("biome")); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeUtf(getBiome()); } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); setBiome(buffer.readUtf(Short.MAX_VALUE)); } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/CustomTask.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/CustomTask.java index c7b08e608..3e08bf326 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/CustomTask.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/CustomTask.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftbquests.quest.task; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.ui.Button; import dev.ftb.mods.ftbquests.net.SubmitTaskMessage; import dev.ftb.mods.ftbquests.quest.Quest; @@ -7,7 +8,7 @@ import dev.ftb.mods.ftbquests.quest.TeamData; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; @@ -61,7 +62,7 @@ public void setEnableButton(boolean enableButton) { public void onButtonClicked(Button button, boolean canClick) { if (enableButton && canClick) { button.playClickSound(); - new SubmitTaskMessage(id).sendToServer(); + NetworkManager.sendToServer(new SubmitTaskMessage(id)); } } @@ -71,7 +72,7 @@ public int autoSubmitOnPlayerTick() { } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeVarInt(checkTimer); buffer.writeVarLong(maxProgress); @@ -79,7 +80,7 @@ public void writeNetData(FriendlyByteBuf buffer) { } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); checkTimer = buffer.readVarInt(); maxProgress = buffer.readVarLong(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/DimensionTask.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/DimensionTask.java index 3f880cdea..ee4b6083b 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/DimensionTask.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/DimensionTask.java @@ -8,9 +8,10 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; +import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceKey; @@ -18,6 +19,8 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; +import java.util.List; + public class DimensionTask extends AbstractBooleanTask { private ResourceKey dimension; @@ -38,25 +41,25 @@ public TaskType getType() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putString("dimension", dimension.location().toString()); } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); dimension = ResourceKey.create(Registries.DIMENSION, new ResourceLocation(nbt.getString("dimension"))); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeResourceLocation(dimension.location()); } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); dimension = ResourceKey.create(Registries.DIMENSION, buffer.readResourceLocation()); } @@ -66,8 +69,11 @@ public void readNetData(FriendlyByteBuf buffer) { public void fillConfigGroup(ConfigGroup config) { super.fillConfigGroup(config); - if (KnownServerRegistries.client != null && !KnownServerRegistries.client.dimensions.isEmpty()) { - config.addEnum("dim", dimension.location(), v -> dimension = ResourceKey.create(Registries.DIMENSION, v), NameMap.of(KnownServerRegistries.client.dimensions.iterator().next(), KnownServerRegistries.client.dimensions.toArray(new ResourceLocation[0])).create()); + if (KnownServerRegistries.client != null && !KnownServerRegistries.client.dimension().isEmpty()) { + List dimensions = KnownServerRegistries.client.dimension(); + config.addEnum("dim", dimension.location(), v -> dimension = ResourceKey.create(Registries.DIMENSION, v), + NameMap.of(dimensions.getFirst(), dimensions.toArray(new ResourceLocation[0])).create() + ); } else { config.addString("dim", dimension.location().toString(), v -> dimension = ResourceKey.create(Registries.DIMENSION, new ResourceLocation(v)), "minecraft:the_nether"); } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/EnergyTask.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/EnergyTask.java index a163e47cb..4a2ccd736 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/EnergyTask.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/EnergyTask.java @@ -6,8 +6,9 @@ import dev.ftb.mods.ftbquests.quest.Quest; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; @@ -25,8 +26,8 @@ public long getMaxProgress() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putLong("value", value); if (maxInput > 0L) { @@ -35,8 +36,8 @@ public void writeData(CompoundTag nbt) { } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); value = nbt.getLong("value"); if (value < 1L) { @@ -47,14 +48,14 @@ public void readData(CompoundTag nbt) { } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeVarLong(value); buffer.writeVarLong(maxInput); } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); value = buffer.readVarLong(); maxInput = buffer.readVarLong(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/FluidTask.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/FluidTask.java index 01468cb0d..215084872 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/FluidTask.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/FluidTask.java @@ -11,8 +11,11 @@ import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.quest.Quest; import dev.ftb.mods.ftbquests.quest.TeamData; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponentMap; +import net.minecraft.core.component.DataComponentPatch; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; @@ -41,8 +44,12 @@ public FluidTask setFluid(FluidStack fluidStack) { return this; } - public CompoundTag getFluidNBT() { - return fluidStack.getTag(); + public DataComponentMap getFluidDataComponents() { + return fluidStack.getComponents(); + } + + public DataComponentPatch getFluidDataComponentPatch() { + return fluidStack.getComponents().asPatch(); } @Override @@ -71,28 +78,28 @@ public boolean consumesResources() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); - fluidStack.write(nbt); + nbt.put("fluid", fluidStack.write(provider, new CompoundTag())); } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); - fluidStack = FluidStack.read(nbt); + fluidStack = FluidStack.read(provider, nbt.getCompound("fluid")).orElse(FluidStack.empty()); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); fluidStack.write(buffer); } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); fluidStack = FluidStack.read(buffer); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/ItemTask.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/ItemTask.java index d180d67b2..8107e6cc3 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/ItemTask.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/ItemTask.java @@ -9,24 +9,22 @@ import dev.ftb.mods.ftblibrary.ui.Button; import dev.ftb.mods.ftblibrary.util.TooltipList; import dev.ftb.mods.ftbquests.FTBQuests; -import dev.ftb.mods.ftbquests.api.FTBQuestsTags; import dev.ftb.mods.ftbquests.client.FTBQuestsClient; import dev.ftb.mods.ftbquests.client.gui.CustomToast; import dev.ftb.mods.ftbquests.client.gui.quests.ValidItemsScreen; import dev.ftb.mods.ftbquests.integration.item_filtering.ItemMatchingSystem; -import dev.ftb.mods.ftbquests.item.FTBQuestsItems; +import dev.ftb.mods.ftbquests.integration.item_filtering.ItemMatchingSystem.ComponentMatchType; import dev.ftb.mods.ftbquests.item.MissingItem; -import dev.ftb.mods.ftbquests.net.FTBQuestsNetHandler; import dev.ftb.mods.ftbquests.quest.Quest; import dev.ftb.mods.ftbquests.quest.TeamData; -import dev.ftb.mods.ftbquests.util.NBTUtils; +import dev.ftb.mods.ftbquests.registry.ModItems; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; -import net.minecraft.core.Holder; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerPlayer; @@ -43,8 +41,7 @@ public class ItemTask extends Task implements Predicate { private long count; private Tristate consumeItems; private Tristate onlyFromCrafting; - private Tristate matchNBT; - private boolean weakNBTmatch; + private ComponentMatchType matchComponents; private boolean taskScreenOnly; public ItemTask(long id, Quest quest) { @@ -53,8 +50,7 @@ public ItemTask(long id, Quest quest) { count = 1; consumeItems = Tristate.DEFAULT; onlyFromCrafting = Tristate.DEFAULT; - matchNBT = Tristate.DEFAULT; - weakNBTmatch = false; + matchComponents = ComponentMatchType.NONE; taskScreenOnly = false; } @@ -83,9 +79,10 @@ public void setConsumeItems(Tristate consumeItems) { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); - NBTUtils.write(nbt, "item", itemStack); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); + + nbt.put("item", saveItemSingleLine(itemStack)); if (count > 1) { nbt.putLong("count", count); @@ -93,29 +90,28 @@ public void writeData(CompoundTag nbt) { consumeItems.write(nbt, "consume_items"); onlyFromCrafting.write(nbt, "only_from_crafting"); - matchNBT.write(nbt, "match_nbt"); - if (weakNBTmatch) { - nbt.putBoolean("weak_nbt_match", true); + if (matchComponents != ComponentMatchType.NONE) { + nbt.putString("match_components", ComponentMatchType.NAME_MAP.getName(matchComponents)); } + if (taskScreenOnly) { nbt.putBoolean("task_screen_only", true); } } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); - itemStack = NBTUtils.read(nbt, "item"); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); + itemStack = itemOrMissingFromNBT(nbt.getCompound("item"), provider); count = Math.max(nbt.getLong("count"), 1L); consumeItems = Tristate.read(nbt, "consume_items"); onlyFromCrafting = Tristate.read(nbt, "only_from_crafting"); - matchNBT = Tristate.read(nbt, "match_nbt"); - weakNBTmatch = nbt.getBoolean("weak_nbt_match"); + matchComponents = ComponentMatchType.NAME_MAP.get(nbt.getString("match_components")); taskScreenOnly = nbt.getBoolean("task_screen_only"); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); int flags = 0; flags = Bits.setFlag(flags, 0x01, count > 1L); @@ -123,13 +119,12 @@ public void writeNetData(FriendlyByteBuf buffer) { flags = Bits.setFlag(flags, 0x04, consumeItems == Tristate.TRUE); flags = Bits.setFlag(flags, 0x08, onlyFromCrafting != Tristate.DEFAULT); flags = Bits.setFlag(flags, 0x10, onlyFromCrafting == Tristate.TRUE); - flags = Bits.setFlag(flags, 0x20, matchNBT != Tristate.DEFAULT); - flags = Bits.setFlag(flags, 0x40, matchNBT == Tristate.TRUE); - flags = Bits.setFlag(flags, 0x80, weakNBTmatch); + flags = Bits.setFlag(flags, 0x20, matchComponents != ComponentMatchType.NONE); + flags = Bits.setFlag(flags, 0x40, matchComponents == ComponentMatchType.STRICT); flags = Bits.setFlag(flags, 0x100, taskScreenOnly); buffer.writeVarInt(flags); - FTBQuestsNetHandler.writeItemType(buffer, itemStack); + ItemStack.OPTIONAL_STREAM_CODEC.encode(buffer, itemStack); if (count > 1L) { buffer.writeVarLong(count); @@ -137,16 +132,15 @@ public void writeNetData(FriendlyByteBuf buffer) { } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); int flags = buffer.readVarInt(); - itemStack = FTBQuestsNetHandler.readItemType(buffer); + itemStack = ItemStack.OPTIONAL_STREAM_CODEC.decode(buffer); count = Bits.getFlag(flags, 0x01) ? buffer.readVarLong() : 1L; consumeItems = Bits.getFlag(flags, 0x02) ? Bits.getFlag(flags, 0x04) ? Tristate.TRUE : Tristate.FALSE : Tristate.DEFAULT; onlyFromCrafting = Bits.getFlag(flags, 0x08) ? Bits.getFlag(flags, 0x10) ? Tristate.TRUE : Tristate.FALSE : Tristate.DEFAULT; - matchNBT = Bits.getFlag(flags, 0x20) ? Bits.getFlag(flags, 0x40) ? Tristate.TRUE : Tristate.FALSE : Tristate.DEFAULT; - weakNBTmatch = Bits.getFlag(flags, 0x80); + matchComponents = Bits.getFlag(flags, 0x20) ? Bits.getFlag(flags, 0x40) ? ComponentMatchType.STRICT : ComponentMatchType.FUZZY : ComponentMatchType.NONE; taskScreenOnly = Bits.getFlag(flags, 0x100); } @@ -180,7 +174,7 @@ public Icon getAltIcon() { } if (icons.isEmpty()) { - return ItemIcon.getItemIcon(FTBQuestsItems.MISSING_ITEM.get()); + return ItemIcon.getItemIcon(ModItems.MISSING_ITEM.get()); } return IconAnimation.fromList(icons, false); @@ -192,20 +186,7 @@ public boolean test(ItemStack stack) { return true; } - return ItemMatchingSystem.INSTANCE.doesItemMatch(itemStack, stack, shouldMatchNBT(), weakNBTmatch); - } - - private boolean shouldMatchNBT() { - return switch (matchNBT) { - case TRUE -> true; - case FALSE -> false; - case DEFAULT -> hasNBTCheckTag(); - }; - } - - private boolean hasNBTCheckTag() { - Holder.Reference itemReference = itemStack.getItem().builtInRegistryHolder(); - return itemReference.is(FTBQuestsTags.Items.CHECK_NBT); + return ItemMatchingSystem.INSTANCE.doesItemMatch(itemStack, stack, matchComponents); } @Override @@ -216,8 +197,7 @@ public void fillConfigGroup(ConfigGroup config) { config.addLong("count", count, v -> count = v, 1, 1, Long.MAX_VALUE); config.addEnum("consume_items", consumeItems, v -> consumeItems = v, Tristate.NAME_MAP); config.addEnum("only_from_crafting", onlyFromCrafting, v -> onlyFromCrafting = v, Tristate.NAME_MAP); - config.addEnum("match_nbt", matchNBT, v -> matchNBT = v, Tristate.NAME_MAP); - config.addBool("weak_nbt_match", weakNBTmatch, v -> weakNBTmatch = v, false); + config.addEnum("match_components", matchComponents, v -> matchComponents = v, ComponentMatchType.NAME_MAP); config.addBool("task_screen_only", taskScreenOnly, v -> taskScreenOnly = v, false); } @@ -246,7 +226,7 @@ public void onButtonClicked(Button button, boolean canClick) { if (!consumesResources() && validItems.size() == 1 && FTBQuests.getRecipeModHelper().isRecipeModAvailable()) { FTBQuests.getRecipeModHelper().showRecipes(validItems.get(0)); } else if (validItems.isEmpty()) { - Minecraft.getInstance().getToasts().addToast(new CustomToast(Component.literal("No valid items!"), ItemIcon.getItemIcon(FTBQuestsItems.MISSING_ITEM.get()), Component.literal("Report this bug to modpack author!"))); + Minecraft.getInstance().getToasts().addToast(new CustomToast(Component.literal("No valid items!"), ItemIcon.getItemIcon(ModItems.MISSING_ITEM.get()), Component.literal("Report this bug to modpack author!"))); } else { new ValidItemsScreen(this, validItems, canClick).openGui(); } @@ -254,13 +234,17 @@ public void onButtonClicked(Button button, boolean canClick) { @Override public void addMouseOverHeader(TooltipList list, TeamData teamData, boolean advanced) { - if (!rawTitle.isEmpty()) { + if (!getRawTitle().isEmpty()) { // task has had a custom title set, use that in preference to the item's tooltip list.add(getTitle()); } else { // use item's tooltip, but include a count with the item name (e.g. "3 x Stick") if appropriate ItemStack stack = getIcon() instanceof ItemIcon i ? i.getStack() : itemStack; - List lines = stack.getTooltipLines(FTBQuestsClient.getClientPlayer(), advanced ? TooltipFlag.Default.ADVANCED : TooltipFlag.Default.NORMAL); + List lines = stack.getTooltipLines(Item.TooltipContext.of( + FTBQuestsClient.getClientLevel()), + FTBQuestsClient.getClientPlayer(), + advanced ? TooltipFlag.Default.ADVANCED : TooltipFlag.Default.NORMAL + ); if (!lines.isEmpty()) { lines.set(0, getTitle()); } else { @@ -350,4 +334,5 @@ public boolean isTaskScreenOnly() { public boolean isOnlyFromCrafting() { return onlyFromCrafting.get(false); } + } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/KillTask.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/KillTask.java index be2a12ed4..d5e4e6925 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/KillTask.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/KillTask.java @@ -10,10 +10,11 @@ import dev.ftb.mods.ftbquests.quest.TeamData; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; @@ -45,28 +46,28 @@ public long getMaxProgress() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putString("entity", entity.toString()); nbt.putLong("value", value); } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); entity = new ResourceLocation(nbt.getString("entity")); value = nbt.getLong("value"); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeUtf(entity.toString(), Short.MAX_VALUE); buffer.writeVarLong(value); } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); entity = new ResourceLocation(buffer.readUtf(Short.MAX_VALUE)); value = buffer.readVarInt(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/LocationTask.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/LocationTask.java index b239c7397..7ca9a07b3 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/LocationTask.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/LocationTask.java @@ -5,9 +5,10 @@ import dev.ftb.mods.ftbquests.quest.TeamData; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; @@ -51,8 +52,8 @@ public TaskType getType() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putString("dimension", dimension.location().toString()); nbt.putBoolean("ignore_dimension", ignoreDimension); nbt.putIntArray("position", new int[]{x, y, z}); @@ -60,8 +61,8 @@ public void writeData(CompoundTag nbt) { } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); dimension = ResourceKey.create(Registries.DIMENSION, new ResourceLocation(nbt.getString("dimension"))); ignoreDimension = nbt.getBoolean("ignore_dimension"); @@ -83,7 +84,7 @@ public void readData(CompoundTag nbt) { } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeResourceLocation(dimension.location()); buffer.writeBoolean(ignoreDimension); @@ -96,7 +97,7 @@ public void writeNetData(FriendlyByteBuf buffer) { } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); dimension = ResourceKey.create(Registries.DIMENSION, buffer.readResourceLocation()); ignoreDimension = buffer.readBoolean(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/ObservationTask.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/ObservationTask.java index 7d34f1cd4..aaeb9b12c 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/ObservationTask.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/ObservationTask.java @@ -13,10 +13,11 @@ import net.minecraft.ResourceLocationException; import net.minecraft.commands.arguments.blocks.BlockInput; import net.minecraft.commands.arguments.blocks.BlockStateParser; +import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; @@ -62,23 +63,23 @@ public TaskType getType() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putLong("timer", timer); nbt.putInt("observe_type", observeType.ordinal()); nbt.putString("to_observe", toObserve); } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); timer = nbt.getLong("timer"); observeType = ObserveType.values()[nbt.getInt("observe_type")]; toObserve = nbt.getString("to_observe"); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeVarLong(timer); buffer.writeEnum(observeType); @@ -86,7 +87,7 @@ public void writeNetData(FriendlyByteBuf buffer) { } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); timer = buffer.readVarLong(); observeType = buffer.readEnum(ObserveType.class); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/StageTask.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/StageTask.java index 6cc445cc0..8e2c31b99 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/StageTask.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/StageTask.java @@ -9,15 +9,13 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerPlayer; -/** - * @author LatvianModder - */ public class StageTask extends AbstractBooleanTask { private String stage = ""; @@ -31,25 +29,25 @@ public TaskType getType() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putString("stage", stage); } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); stage = nbt.getString("stage"); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeUtf(stage, Short.MAX_VALUE); } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); stage = buffer.readUtf(Short.MAX_VALUE); } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/StatTask.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/StatTask.java index 0f1e75736..0f2f3940c 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/StatTask.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/StatTask.java @@ -6,9 +6,10 @@ import dev.ftb.mods.ftbquests.quest.TeamData; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; @@ -52,28 +53,28 @@ public String formatProgress(TeamData teamData, long progress) { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putString("stat", stat.toString()); nbt.putInt("value", value); } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); stat = new ResourceLocation(nbt.getString("stat")); value = nbt.getInt("value"); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeResourceLocation(stat); buffer.writeVarInt(value); } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); stat = buffer.readResourceLocation(); value = buffer.readVarInt(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/StructureTask.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/StructureTask.java index c1d34d809..8b696ccab 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/StructureTask.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/StructureTask.java @@ -1,6 +1,7 @@ package dev.ftb.mods.ftbquests.quest.task; import com.mojang.datafixers.util.Either; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.ConfigGroup; import dev.ftb.mods.ftblibrary.config.NameMap; import dev.ftb.mods.ftbquests.net.SyncStructuresRequestMessage; @@ -9,9 +10,10 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; +import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceKey; @@ -19,6 +21,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.tags.TagKey; +import net.minecraft.world.level.StructureManager; import net.minecraft.world.level.levelgen.structure.Structure; import java.util.ArrayList; @@ -51,25 +54,25 @@ public TaskType getType() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putString("structure", getStructure()); } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); setStructure(nbt.getString("structure")); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeUtf(getStructure()); } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); setStructure(buffer.readUtf(1024)); } @@ -109,9 +112,13 @@ public boolean canSubmit(TeamData teamData, ServerPlayer player) { if (player.isSpectator()) return false; ServerLevel level = (ServerLevel) player.level(); + StructureManager mgr = level.structureManager(); return structure.map( - key -> level.structureManager().getStructureWithPieceAt(player.blockPosition(), key).isValid(), - tag -> level.structureManager().getStructureWithPieceAt(player.blockPosition(), tag).isValid() + key -> { + Structure structure = mgr.registryAccess().registryOrThrow(Registries.STRUCTURE).get(key); + return structure != null && mgr.getStructureWithPieceAt(player.blockPosition(), structure).isValid(); + }, + tag -> mgr.getStructureWithPieceAt(player.blockPosition(), tag).isValid() ); } @@ -130,7 +137,7 @@ private String getStructure() { public static void maybeRequestStructureSync() { if (KNOWN_STRUCTURES.isEmpty()) { - new SyncStructuresRequestMessage().sendToServer(); + NetworkManager.sendToServer(SyncStructuresRequestMessage.INSTANCE); } } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/Task.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/Task.java index d19d14f44..fff809318 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/Task.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/Task.java @@ -1,5 +1,6 @@ package dev.ftb.mods.ftbquests.quest.task; +import dev.architectury.networking.NetworkManager; import dev.ftb.mods.ftblibrary.config.ConfigGroup; import dev.ftb.mods.ftblibrary.icon.Icon; import dev.ftb.mods.ftblibrary.ui.Button; @@ -24,8 +25,9 @@ import net.minecraft.ChatFormatting; import net.minecraft.ResourceLocationException; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; @@ -247,7 +249,7 @@ public boolean addTitleInMouseOverText() { public void onButtonClicked(Button button, boolean canClick) { if (canClick && autoSubmitOnPlayerTick() <= 0) { button.playClickSound(); - new SubmitTaskMessage(id).sendToServer(); + NetworkManager.sendToServer(new SubmitTaskMessage(id)); } } @@ -304,27 +306,27 @@ public boolean checkOnLogin() { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); if (optionalTask) nbt.putBoolean("optional_task", true); } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); optionalTask = nbt.getBoolean("optional_task"); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeBoolean(optionalTask); } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); optionalTask = buffer.readBoolean(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/TaskType.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/TaskType.java index 805804da9..7ec5e1bc5 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/TaskType.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/TaskType.java @@ -7,11 +7,13 @@ import dev.ftb.mods.ftbquests.quest.Quest; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.Util; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; -import java.util.function.Consumer; +import java.util.function.BiConsumer; import java.util.function.Supplier; public final class TaskType { @@ -60,6 +62,10 @@ public String getTypeForNBT() { return typeId.getNamespace().equals(FTBQuestsAPI.MOD_ID) ? typeId.getPath() : typeId.toString(); } + public CompoundTag makeExtraNBT() { + return Util.make(new CompoundTag(), t -> t.putString("type", getTypeForNBT())); + } + public TaskType setDisplayName(Component name) { displayName = name; return this; @@ -94,7 +100,7 @@ public interface Provider { @FunctionalInterface public interface GuiProvider { @Environment(EnvType.CLIENT) - void openCreationGui(Panel panel, Quest quest, Consumer callback); + void openCreationGui(Panel panel, Quest quest, BiConsumer callback); } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/TaskTypes.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/TaskTypes.java index 140f14c93..a1d62d169 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/TaskTypes.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/TaskTypes.java @@ -1,13 +1,11 @@ package dev.ftb.mods.ftbquests.quest.task; import dev.architectury.fluid.FluidStack; -import dev.architectury.hooks.fluid.FluidStackHooks; import dev.ftb.mods.ftblibrary.icon.Color4I; import dev.ftb.mods.ftblibrary.icon.Icon; import dev.ftb.mods.ftblibrary.icon.Icons; import dev.ftb.mods.ftblibrary.util.client.ClientUtils; import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.material.Fluids; diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/XPTask.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/XPTask.java index f01605090..a91219998 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/XPTask.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/task/XPTask.java @@ -6,8 +6,9 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.server.level.ServerPlayer; @@ -43,28 +44,28 @@ public String formatProgress(TeamData teamData, long progress) { } @Override - public void writeData(CompoundTag nbt) { - super.writeData(nbt); + public void writeData(CompoundTag nbt, HolderLookup.Provider provider) { + super.writeData(nbt, provider); nbt.putLong("value", value); nbt.putBoolean("points", points); } @Override - public void readData(CompoundTag nbt) { - super.readData(nbt); + public void readData(CompoundTag nbt, HolderLookup.Provider provider) { + super.readData(nbt, provider); value = nbt.getLong("value"); points = nbt.getBoolean("points"); } @Override - public void writeNetData(FriendlyByteBuf buffer) { + public void writeNetData(RegistryFriendlyByteBuf buffer) { super.writeNetData(buffer); buffer.writeVarLong(value); buffer.writeBoolean(points); } @Override - public void readNetData(FriendlyByteBuf buffer) { + public void readNetData(RegistryFriendlyByteBuf buffer) { super.readNetData(buffer); value = buffer.readVarLong(); points = buffer.readBoolean(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/translation/TranslationKey.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/translation/TranslationKey.java new file mode 100644 index 000000000..510ec656c --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/translation/TranslationKey.java @@ -0,0 +1,45 @@ +package dev.ftb.mods.ftbquests.quest.translation; + +import com.mojang.datafixers.util.Either; +import dev.ftb.mods.ftblibrary.config.NameMap; + +import java.util.List; + +public enum TranslationKey { + TITLE("title", false), + QUEST_SUBTITLE("quest_subtitle", false), + QUEST_DESC("quest_desc", true), + CHAPTER_SUBTITLE("chapter_subtitle", true), + ; + + public static final NameMap NAME_MAP = NameMap.of(TITLE, values()).id(v -> v.name).create(); + + private final String name; + private final boolean isListVal; + + TranslationKey(String name, boolean isListVal) { + this.name = name; + this.isListVal = isListVal; + } + + public String getName() { + return name; + } + + public boolean isListVal() { + return isListVal; + } + + public Either> validate(Either> either) { + either.ifLeft(s -> { + if (isListVal) throw new IllegalArgumentException("expected a list value!"); + }).ifRight(l -> { + if (!isListVal) throw new IllegalArgumentException("expected a string value!"); + }); + return either; + } + + public String getTranslationKey() { + return "ftbquests.translation_key." + name; + } +} diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/translation/TranslationManager.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/translation/TranslationManager.java new file mode 100644 index 000000000..082d05543 --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/translation/TranslationManager.java @@ -0,0 +1,195 @@ +package dev.ftb.mods.ftbquests.quest.translation; + +import dev.architectury.networking.NetworkManager; +import dev.ftb.mods.ftblibrary.snbt.SNBT; +import dev.ftb.mods.ftbquests.FTBQuests; +import dev.ftb.mods.ftbquests.client.FTBQuestsClientConfig; +import dev.ftb.mods.ftbquests.net.SyncTranslationTableMessage; +import dev.ftb.mods.ftbquests.quest.QuestObjectBase; +import dev.ftb.mods.ftbquests.quest.ServerQuestFile; +import net.minecraft.Util; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerPlayer; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +public class TranslationManager { + private static final Pattern LANG_FILE_PAT = Pattern.compile("^\\w+\\.snbt$"); + + private final Map map = new HashMap<>(); + + private final String fallbackLocale = "en_us"; + + public TranslationManager() { + map.put(fallbackLocale, new TranslationTable()); + } + + public static void syncTable(ServerPlayer player, String language) { + ServerQuestFile file = ServerQuestFile.INSTANCE; + if (file != null && file.isValid()) { + file.getTranslationManager().sendTableToPlayer(player, language); + } + } + + public void loadFromNBT(Path langFolder) { + map.clear(); + + if (!Files.exists(langFolder)) { + // the first run, hopefully... + try { + Files.createDirectory(langFolder); + } catch (IOException e) { + FTBQuests.LOGGER.error("can't create lang folder {}: {}", langFolder, e.getMessage()); + return; + } + } + + try (Stream s = Files.list(langFolder)) { + s.filter(TranslationManager::isValidLangFile).forEach(path -> { + CompoundTag langNBT = SNBT.read(path); + if (langNBT != null) { + String locale = (path.getFileName().toString().split("\\.", 2))[0].toLowerCase(Locale.ROOT); + map.put(locale, TranslationTable.fromNBT(langNBT)); + } else { + FTBQuests.LOGGER.error("can't read lang file {}", path); + } + }); + if (!map.containsKey(fallbackLocale)) { + map.put(fallbackLocale, new TranslationTable()); + } + FTBQuests.LOGGER.info("loaded translation tables for {} language(s)", map.size()); + } catch (IOException e) { + FTBQuests.LOGGER.error("can't scan lang folder {}: {}", langFolder, e.getMessage()); + } + } + + public void saveToNBT(Path langFolder) { + map.forEach((locale, table) -> { + if (table.isSaveNeeded()) { + boolean prevSort = SNBT.setShouldSortKeysOnWrite(true); + Path savePath = langFolder.resolve(locale + ".snbt"); + if (!SNBT.write(savePath, table.saveToNBT())) { + FTBQuests.LOGGER.error("can't write lang file {}", savePath); + } + table.setSaveNeeded(false); + SNBT.setShouldSortKeysOnWrite(prevSort); + } + }); + } + + private static boolean isValidLangFile(Path p) { + return LANG_FILE_PAT.matcher(p.getFileName().toString()).matches(); + } + + public Optional getStringTranslation(QuestObjectBase object, String locale, TranslationKey subKey) { + String key = makeKey(object, subKey); + TranslationTable table = map.get(locale); + if (table != null && table.contains(key)) { + return table.getStringTranslation(key); + } else { + return map.get(fallbackLocale).getStringTranslation(key); + } + } + + public Optional> getStringListTranslation(QuestObjectBase object, String locale, TranslationKey subKey) { + String key = makeKey(object, subKey); + TranslationTable table = map.get(locale); + if (table != null && table.contains(key)) { + return table.getStringListTranslation(key); + } else { + return map.get(fallbackLocale).getStringListTranslation(key); + } + } + + private Optional getTable(String locale) { + return Optional.ofNullable(map.get(locale)) + .or(() -> Optional.ofNullable(map.get(fallbackLocale))); + } + + private boolean hasTranslationForLocale(QuestObjectBase object, String locale, TranslationKey subKey) { + return map.containsKey(locale) ? getTable(locale).map(t -> t.contains(makeKey(object, subKey))).orElse(false) : false; + } + + public boolean hasMissingTranslation(QuestObjectBase object, TranslationKey key) { + String locale = object.getQuestFile().getLocale(); + return object.getQuestFile().canEdit() + && FTBQuestsClientConfig.HILITE_MISSING.get() + && !locale.equals("en_us") + && hasTranslationForLocale(object, "en_us", key) + && !hasTranslationForLocale(object, locale, key); + } + + public void addTranslation(QuestObjectBase object, String locale, TranslationKey subKey, String message) { + addTranslation(locale, makeKey(object, subKey), message); + } + + public void addTranslation(QuestObjectBase object, String locale, TranslationKey subKey, List message) { + addTranslation(locale, makeKey(object, subKey), message); + } + + private void addTranslation(String locale, String key, List message) { + map.computeIfAbsent(locale, k -> new TranslationTable()).put(key, message); + } + + private void addTranslation(String locale, String key, String message) { + map.computeIfAbsent(locale, k -> new TranslationTable()).put(key, message); + } + + public void removeAllTranslations(QuestObjectBase obj) { + map.values().forEach(table -> { + for (TranslationKey key : TranslationKey.values()) { + table.remove(makeKey(obj, key)); + } + table.setSaveNeeded(true); + }); + } + + private static @NotNull String makeKey(QuestObjectBase object, TranslationKey subKey) { + return String.format("%s.%s.%s", object.getObjectType().getId(), QuestObjectBase.getCodeString(object), subKey.getName()); + } + + public void syncTableFromServer(String locale, TranslationTable table) { + map.put(locale, table); + } + + public void sendTranslationsToPlayer(ServerPlayer player) { + // make sure player always has the fallback en_us translations + sendTableToPlayer(player, "en_us"); + + String lang = player.clientInformation().language(); + if (!lang.equals("en_us")) { + sendTableToPlayer(player, lang); + } + } + + public void sendTableToPlayer(ServerPlayer player, String locale) { + if (map.containsKey(locale)) { + NetworkManager.sendToPlayer(player, new SyncTranslationTableMessage(locale, map.getOrDefault(locale, new TranslationTable()))); + } + } + + public void addInitialTranslation(CompoundTag extra, String locale, TranslationKey translationKey, String value) { + extra.putString("locale", locale); + extra.put("translate", Util.make(new CompoundTag(), t -> t.putString(TranslationKey.NAME_MAP.getName(translationKey), value))); + } + + public void processInitialTranslation(CompoundTag extra, QuestObjectBase object) { + if (extra.contains("locale") && extra.contains("translate")) { + String locale = extra.getString("locale"); + TranslationTable table = map.computeIfAbsent(locale, k -> new TranslationTable()); + CompoundTag tag = extra.getCompound("translate"); + for (String keyStr : tag.getAllKeys()) { + TranslationKey key = TranslationKey.NAME_MAP.getNullable(keyStr); + if (key != null) { + table.put(makeKey(object, key), tag.getString(keyStr)); + } + } + } + } +} diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/quest/translation/TranslationTable.java b/common/src/main/java/dev/ftb/mods/ftbquests/quest/translation/TranslationTable.java new file mode 100644 index 000000000..8bf150787 --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbquests/quest/translation/TranslationTable.java @@ -0,0 +1,107 @@ +package dev.ftb.mods.ftbquests.quest.translation; + +import com.google.common.collect.Maps; +import com.mojang.datafixers.util.Either; +import net.minecraft.Util; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class TranslationTable { + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.map( + Maps::newHashMapWithExpectedSize, + ByteBufCodecs.STRING_UTF8, + ByteBufCodecs.either(ByteBufCodecs.STRING_UTF8, ByteBufCodecs.STRING_UTF8.apply(ByteBufCodecs.list())) + ), t -> t.map, + TranslationTable::new + ); + + private final Map>> map; + private boolean saveNeeded; + + public TranslationTable() { + this.map = new HashMap<>(); + } + + public static TranslationTable fromNBT(CompoundTag tag) { + Map>> map = new HashMap<>(); + tag.getAllKeys().forEach(k -> { + switch (tag.get(k)) { + case StringTag str -> map.put(k, Either.left(str.getAsString())); + case ListTag list -> map.put(k, Either.right(list.stream().map(Tag::getAsString).toList())); + case null, default -> { } + } + }); + return new TranslationTable(map); + } + + private TranslationTable(Map>> map) { + this.map = map; + } + + boolean isSaveNeeded() { + return saveNeeded; + } + + void setSaveNeeded(boolean saveNeeded) { + this.saveNeeded = saveNeeded; + } + + public Optional getStringTranslation(String key) { + return Optional.ofNullable(map.get(key)).flatMap(e -> e.left()); + } + + public Optional> getStringListTranslation(String key) { + return Optional.ofNullable(map.get(key)).flatMap(e -> e.right()); + } + + public void put(String key, String message) { + map.put(key, Either.left(message)); + setSaveNeeded(true); + } + + public void put(String key, List message) { + map.put(key, Either.right(message)); + setSaveNeeded(true); + } + + public void remove(String key) { + if (map.remove(key) != null) { + setSaveNeeded(true); + } + } + + public CompoundTag saveToNBT() { + return Util.make(new CompoundTag(), tag -> + map.forEach((key, val) -> val + .ifLeft(str -> { + if (!str.isEmpty()) tag.putString(key, str); + }) + .ifRight(list -> { + if (!list.isEmpty()) tag.put(key, listOfStr(list)); + }) + )); + } + + static ListTag listOfStr(List l) { + return Util.make(new ListTag(), t -> l.forEach(s -> t.add(StringTag.valueOf(s)))); + } + + public int size() { + return map.size(); + } + + public boolean contains(String key) { + return map.containsKey(key); + } +} diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/FTBQuestsBlockEntities.java b/common/src/main/java/dev/ftb/mods/ftbquests/registry/ModBlockEntityTypes.java similarity index 77% rename from common/src/main/java/dev/ftb/mods/ftbquests/block/entity/FTBQuestsBlockEntities.java rename to common/src/main/java/dev/ftb/mods/ftbquests/registry/ModBlockEntityTypes.java index 8bc7d195e..7413232ae 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/block/entity/FTBQuestsBlockEntities.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/registry/ModBlockEntityTypes.java @@ -1,11 +1,11 @@ -package dev.ftb.mods.ftbquests.block.entity; +package dev.ftb.mods.ftbquests.registry; import dev.architectury.registry.registries.DeferredRegister; import dev.architectury.registry.registries.RegistrySupplier; import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; -import dev.ftb.mods.ftbquests.block.FTBQuestsBlocks; import dev.ftb.mods.ftbquests.block.LootCrateOpenerBlock; import dev.ftb.mods.ftbquests.block.TaskScreenBlock; +import dev.ftb.mods.ftbquests.block.entity.*; import net.minecraft.core.registries.Registries; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -15,10 +15,7 @@ import java.util.Set; import java.util.function.Supplier; -/** - * @author LatvianModder - */ -public class FTBQuestsBlockEntities { +public class ModBlockEntityTypes { public static final DeferredRegister> BLOCK_ENTITIES = DeferredRegister.create(FTBQuestsAPI.MOD_ID, Registries.BLOCK_ENTITY_TYPE); public static RegistrySupplier> register(String id, BlockEntityType.BlockEntitySupplier factory, Collection> blocks) { @@ -30,20 +27,20 @@ public static RegistrySupplier> regis } public static final RegistrySupplier> BARRIER - = register("barrier", QuestBarrierBlockEntity::new, FTBQuestsBlocks.BARRIER); + = register("barrier", QuestBarrierBlockEntity::new, ModBlocks.BARRIER); public static final RegistrySupplier> STAGE_BARRIER - = register("stage_barrier", StageBarrierBlockEntity::new, FTBQuestsBlocks.STAGE_BARRIER); + = register("stage_barrier", StageBarrierBlockEntity::new, ModBlocks.STAGE_BARRIER); public static final RegistrySupplier> DETECTOR - = register("detector", DetectorBlockEntity::new, FTBQuestsBlocks.DETECTOR); + = register("detector", DetectorBlockEntity::new, ModBlocks.DETECTOR); public static final RegistrySupplier> LOOT_CRATE_OPENER - = register("loot_crate_opener", LootCrateOpenerBlock.blockEntityProvider(), FTBQuestsBlocks.LOOT_CRATE_OPENER); + = register("loot_crate_opener", LootCrateOpenerBlock.blockEntityProvider(), ModBlocks.LOOT_CRATE_OPENER); public static final RegistrySupplier> CORE_TASK_SCREEN = register("core_task_screen", TaskScreenBlock.blockEntityProvider(), - Set.of(FTBQuestsBlocks.TASK_SCREEN_1, FTBQuestsBlocks.TASK_SCREEN_3, FTBQuestsBlocks.TASK_SCREEN_5, FTBQuestsBlocks.TASK_SCREEN_7)); + Set.of(ModBlocks.TASK_SCREEN_1, ModBlocks.TASK_SCREEN_3, ModBlocks.TASK_SCREEN_5, ModBlocks.TASK_SCREEN_7)); public static final RegistrySupplier> AUX_TASK_SCREEN - = register("aux_task_screen", TaskScreenBlock.blockEntityAuxProvider(), FTBQuestsBlocks.AUX_SCREEN); + = register("aux_task_screen", TaskScreenBlock.blockEntityAuxProvider(), ModBlocks.AUX_SCREEN); public static void register() { BLOCK_ENTITIES.register(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/block/FTBQuestsBlocks.java b/common/src/main/java/dev/ftb/mods/ftbquests/registry/ModBlocks.java similarity index 94% rename from common/src/main/java/dev/ftb/mods/ftbquests/block/FTBQuestsBlocks.java rename to common/src/main/java/dev/ftb/mods/ftbquests/registry/ModBlocks.java index b45652d6f..8916a4330 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/block/FTBQuestsBlocks.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/registry/ModBlocks.java @@ -1,15 +1,13 @@ -package dev.ftb.mods.ftbquests.block; +package dev.ftb.mods.ftbquests.registry; import dev.architectury.registry.registries.DeferredRegister; import dev.architectury.registry.registries.RegistrySupplier; import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; +import dev.ftb.mods.ftbquests.block.*; import net.minecraft.core.registries.Registries; import net.minecraft.world.level.block.Block; -/** - * @author LatvianModder - */ -public class FTBQuestsBlocks { +public class ModBlocks { public static final DeferredRegister BLOCKS = DeferredRegister.create(FTBQuestsAPI.MOD_ID, Registries.BLOCK); public static final RegistrySupplier BARRIER diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/registry/ModDataComponents.java b/common/src/main/java/dev/ftb/mods/ftbquests/registry/ModDataComponents.java new file mode 100644 index 000000000..9ce5ac9b7 --- /dev/null +++ b/common/src/main/java/dev/ftb/mods/ftbquests/registry/ModDataComponents.java @@ -0,0 +1,58 @@ +package dev.ftb.mods.ftbquests.registry; + +import com.mojang.serialization.Codec; +import dev.architectury.registry.registries.DeferredRegister; +import dev.architectury.registry.registries.RegistrySupplier; +import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; +import dev.ftb.mods.ftbquests.block.entity.TaskScreenBlockEntity.TaskScreenSaveData; +import net.minecraft.core.GlobalPos; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.component.ItemContainerContents; + +public class ModDataComponents { + public static final DeferredRegister> COMPONENT_TYPES + = DeferredRegister.create(FTBQuestsAPI.MOD_ID, Registries.DATA_COMPONENT_TYPE); + + public static RegistrySupplier> CUSTOM_ICON + = COMPONENT_TYPES.register("icon", () -> new DataComponentType.Builder() + .persistent(ResourceLocation.CODEC) + .networkSynchronized(ResourceLocation.STREAM_CODEC) + .build()); + + public static RegistrySupplier> LOOT_CRATE + = COMPONENT_TYPES.register("loot_crate", () -> new DataComponentType.Builder() + .persistent(Codec.STRING) + .networkSynchronized(ByteBufCodecs.STRING_UTF8) + .build()); + + public static RegistrySupplier> LOOT_CRATE_ITEMS + = COMPONENT_TYPES.register("loot_crate_items", () -> new DataComponentType.Builder() + .persistent(ItemContainerContents.CODEC) + .networkSynchronized(ItemContainerContents.STREAM_CODEC) + .build()); + + public static RegistrySupplier> SCREEN_POS + = COMPONENT_TYPES.register("screen_pos", () -> new DataComponentType.Builder() + .persistent(GlobalPos.CODEC) + .networkSynchronized(GlobalPos.STREAM_CODEC) + .build()); + + public static RegistrySupplier> MISSING_ITEM_DESC + = COMPONENT_TYPES.register("missing_item", () -> new DataComponentType.Builder() + .persistent(Codec.STRING) + .networkSynchronized(ByteBufCodecs.STRING_UTF8) + .build()); + + public static RegistrySupplier> TASK_SCREEN_SAVED + = COMPONENT_TYPES.register("task_screen_saved", () -> new DataComponentType.Builder() + .persistent(TaskScreenSaveData.CODEC) + .networkSynchronized(TaskScreenSaveData.STREAM_CODEC) + .build()); + + public static void register() { + COMPONENT_TYPES.register(); + } +} diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/item/FTBQuestsItems.java b/common/src/main/java/dev/ftb/mods/ftbquests/registry/ModItems.java similarity index 85% rename from common/src/main/java/dev/ftb/mods/ftbquests/item/FTBQuestsItems.java rename to common/src/main/java/dev/ftb/mods/ftbquests/registry/ModItems.java index f067e0c98..5bcb0ee2f 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/item/FTBQuestsItems.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/registry/ModItems.java @@ -1,4 +1,4 @@ -package dev.ftb.mods.ftbquests.item; +package dev.ftb.mods.ftbquests.registry; import dev.architectury.registry.CreativeTabRegistry; import dev.architectury.registry.registries.DeferredRegister; @@ -6,7 +6,7 @@ import dev.architectury.registry.registries.RegistrySupplier; import dev.ftb.mods.ftbquests.FTBQuests; import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; -import dev.ftb.mods.ftbquests.block.FTBQuestsBlocks; +import dev.ftb.mods.ftbquests.item.*; import dev.ftb.mods.ftbquests.item.ScreenBlockItem.ScreenSize; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; @@ -20,7 +20,7 @@ import java.util.List; import java.util.function.Supplier; -public class FTBQuestsItems { +public class ModItems { public static final DeferredRegister ITEMS = DeferredRegister.create(FTBQuestsAPI.MOD_ID, Registries.ITEM); private static RegistrySupplier blockItem(String id, Supplier b) { @@ -40,17 +40,17 @@ private static RegistrySupplier blockItemFor(String id, Supplier BARRIER = blockItemFor("barrier", QuestBarrierBlockItem::new); public static final RegistrySupplier STAGE_BARRIER = blockItemFor("stage_barrier", StageBarrierBlockItem::new); - public static final RegistrySupplier DETECTOR = blockItem("detector", FTBQuestsBlocks.DETECTOR); - public static final RegistrySupplier LOOT_CRATE_OPENER = blockItem("loot_crate_opener", FTBQuestsBlocks.LOOT_CRATE_OPENER); + public static final RegistrySupplier DETECTOR = blockItem("detector", ModBlocks.DETECTOR); + public static final RegistrySupplier LOOT_CRATE_OPENER = blockItem("loot_crate_opener", ModBlocks.LOOT_CRATE_OPENER); public static final RegistrySupplier TASK_SCREEN_1 = blockItemFor("screen_1", - () -> new ScreenBlockItem(FTBQuestsBlocks.TASK_SCREEN_1.get(), ScreenSize.ONE_X_ONE)); + () -> new ScreenBlockItem(ModBlocks.TASK_SCREEN_1.get(), ScreenSize.ONE_X_ONE)); public static final RegistrySupplier TASK_SCREEN_3 = blockItemFor("screen_3", - () -> new ScreenBlockItem(FTBQuestsBlocks.TASK_SCREEN_3.get(), ScreenSize.THREE_X_THREE)); + () -> new ScreenBlockItem(ModBlocks.TASK_SCREEN_3.get(), ScreenSize.THREE_X_THREE)); public static final RegistrySupplier TASK_SCREEN_5 = blockItemFor("screen_5", - () -> new ScreenBlockItem(FTBQuestsBlocks.TASK_SCREEN_5.get(), ScreenSize.FIVE_X_FIVE)); + () -> new ScreenBlockItem(ModBlocks.TASK_SCREEN_5.get(), ScreenSize.FIVE_X_FIVE)); public static final RegistrySupplier TASK_SCREEN_7 = blockItemFor("screen_7", - () -> new ScreenBlockItem(FTBQuestsBlocks.TASK_SCREEN_7.get(), ScreenSize.SEVEN_X_SEVEN)); + () -> new ScreenBlockItem(ModBlocks.TASK_SCREEN_7.get(), ScreenSize.SEVEN_X_SEVEN)); public static final List> BASE_ITEMS = List.of( BOOK, @@ -71,7 +71,7 @@ public static void register() { public static final RegistrySupplier CREATIVE_TAB = RegistrarManager.get(FTBQuestsAPI.MOD_ID) .get(Registries.CREATIVE_MODE_TAB) - .register(new ResourceLocation(FTBQuestsAPI.MOD_ID, "default"), FTBQuestsItems::buildDefaultTab); + .register(new ResourceLocation(FTBQuestsAPI.MOD_ID, "default"), ModItems::buildDefaultTab); public static Item.Properties defaultProps() { return new Item.Properties(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/util/FTBQuestsInventoryListener.java b/common/src/main/java/dev/ftb/mods/ftbquests/util/FTBQuestsInventoryListener.java index 71261e2c7..b1730b7bc 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/util/FTBQuestsInventoryListener.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/util/FTBQuestsInventoryListener.java @@ -13,9 +13,6 @@ import java.util.List; -/** - * @author LatvianModder - */ public class FTBQuestsInventoryListener implements ContainerListener { public final ServerPlayer player; diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/util/FileUtils.java b/common/src/main/java/dev/ftb/mods/ftbquests/util/FileUtils.java index 970e080df..75b934ba5 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/util/FileUtils.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/util/FileUtils.java @@ -5,9 +5,6 @@ import java.util.Collections; import java.util.List; -/** - * @author LatvianModder - */ public class FileUtils { public static List read(InputStream in) throws IOException { List list = new ArrayList<>(); diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/util/NBTUtils.java b/common/src/main/java/dev/ftb/mods/ftbquests/util/NBTUtils.java deleted file mode 100644 index 71223e65a..000000000 --- a/common/src/main/java/dev/ftb/mods/ftbquests/util/NBTUtils.java +++ /dev/null @@ -1,88 +0,0 @@ -package dev.ftb.mods.ftbquests.util; - -import com.google.common.collect.Sets; -import dev.ftb.mods.ftbquests.item.MissingItem; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.StringTag; -import net.minecraft.nbt.Tag; -import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.Nullable; - -import java.util.Set; -import java.util.stream.IntStream; - -/** - * @author LatvianModder - */ -public class NBTUtils { - public static ItemStack read(CompoundTag nbt, String key) { - Tag nbt1 = nbt.get(key); - - if (nbt1 instanceof CompoundTag) { - return MissingItem.readItem((CompoundTag) nbt1); - } else if (nbt1 instanceof StringTag) { - CompoundTag nbt2 = new CompoundTag(); - nbt2.putString("id", nbt1.getAsString()); - nbt2.putByte("Count", (byte) 1); - return MissingItem.readItem(nbt2); - } - - return ItemStack.EMPTY; - } - - public static void write(CompoundTag nbt, String key, ItemStack stack) { - if (!stack.isEmpty()) { - CompoundTag nbt1 = MissingItem.writeItem(stack); - - if (nbt1.size() == 2 && nbt1.getInt("Count") == 1) { - nbt.putString(key, nbt1.getString("id")); - } else { - nbt.put(key, nbt1); - } - } - } - - /** - * Quite like the vanilla {@link net.minecraft.nbt.NbtUtils#compareNbt(Tag, Tag, boolean)} but also has the option - * for fuzzy checking. Order of the tags matters! Supply the tag being checked against first (e.g. the filter), - * and the tag being checked (e.g. the actual item's NBT) second. - * - * @param tagA tag to compare against - * @param tagB tag being tested - * @param fuzzy if true, fuzzy match for compound tags: fields in compoundTagB but not in compoundTagA don't cause a - * match failure - * @param compareLists if true, recursively deep-compare lists (otherwise simple .equals() check) - * @return true if there's a match, false otherwise - */ - public static boolean compareNbt(@Nullable Tag tagA, @Nullable Tag tagB, boolean fuzzy, boolean compareLists) { - if (tagA == tagB) { - return true; - } else if (tagA == null) { - return true; - } else if (tagB == null) { - return false; - } else if (!tagA.getType().equals(tagB.getType())) { - return false; - } else if (tagA instanceof CompoundTag compoundA && tagB instanceof CompoundTag compoundB) { - Set keysA = compoundA.getAllKeys(); - Set keysB = compoundB.getAllKeys(); - if (!fuzzy) { - if (keysA.size() != keysB.size() || Sets.intersection(keysA, keysB).size() != keysA.size()) { - return false; - } - } - return keysA.stream().allMatch(key -> compareNbt(compoundA.get(key), compoundB.get(key), fuzzy, compareLists)); - } else if (compareLists && tagA instanceof ListTag listA && tagB instanceof ListTag listB) { - if (listA.isEmpty()) { - return listB.isEmpty(); - } else if (listA.size() != listB.size()) { - return false; - } else { - return IntStream.range(0, listA.size()).allMatch(i -> compareNbt(listA.get(i), listB.get(i), fuzzy, true)); - } - } else { - return tagA.equals(tagB); - } - } -} \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/util/NetUtils.java b/common/src/main/java/dev/ftb/mods/ftbquests/util/NetUtils.java index 1e1bcd958..5bcc7a0b6 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/util/NetUtils.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/util/NetUtils.java @@ -7,14 +7,9 @@ import net.minecraft.world.entity.player.Player; import java.util.Collection; -import java.util.Map; import java.util.function.BiConsumer; -import java.util.function.BiFunction; import java.util.function.Function; -/** - * @author LatvianModder - */ public class NetUtils { public static boolean canEdit(NetworkManager.PacketContext context) { Player player = context.getPlayer(); @@ -22,45 +17,15 @@ public static boolean canEdit(NetworkManager.PacketContext context) { } public static void write(FriendlyByteBuf buffer, Collection list, BiConsumer writer) { - buffer.writeVarInt(list.size()); - - for (T value : list) { - writer.accept(buffer, value); - } - } - - public static void write(FriendlyByteBuf buffer, Map map, BiConsumer keyWriter, BiConsumer valueWriter) { - buffer.writeVarInt(map.size()); - - for (Map.Entry entry : map.entrySet()) { - keyWriter.accept(buffer, entry.getKey()); - valueWriter.accept(buffer, entry.getValue()); - } - } - - public static void writeStrings(FriendlyByteBuf buffer, Collection list) { - write(buffer, list, (b, s) -> b.writeUtf(s, Short.MAX_VALUE)); + buffer.writeCollection(list, writer::accept); } public static void read(FriendlyByteBuf buffer, Collection list, Function reader) { - list.clear(); - - int s = buffer.readVarInt(); - - for (int i = 0; i < s; i++) { - list.add(reader.apply(buffer)); - } + list.retainAll(buffer.readList(reader::apply)); } - public static void read(FriendlyByteBuf buffer, Map map, Function keyReader, BiFunction valueReader) { - map.clear(); - - int s = buffer.readVarInt(); - - for (int i = 0; i < s; i++) { - K key = keyReader.apply(buffer); - map.put(key, valueReader.apply(key, buffer)); - } + public static void writeStrings(FriendlyByteBuf buffer, Collection list) { + write(buffer, list, FriendlyByteBuf::writeUtf); } public static void readStrings(FriendlyByteBuf buffer, Collection list) { @@ -68,10 +33,10 @@ public static void readStrings(FriendlyByteBuf buffer, Collection list) } public static void writeIcon(FriendlyByteBuf buffer, Icon icon) { - buffer.writeUtf(icon.toString(), Short.MAX_VALUE); + buffer.writeUtf(icon.toString()); } public static Icon readIcon(FriendlyByteBuf buffer) { - return Icon.getIcon(buffer.readUtf(Short.MAX_VALUE)); + return Icon.getIcon(buffer.readUtf()); } } \ No newline at end of file diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/util/ProgressChange.java b/common/src/main/java/dev/ftb/mods/ftbquests/util/ProgressChange.java index 24b54ac59..24571b5fc 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/util/ProgressChange.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/util/ProgressChange.java @@ -1,24 +1,32 @@ package dev.ftb.mods.ftbquests.util; -import dev.ftb.mods.ftbquests.quest.BaseQuestFile; import dev.ftb.mods.ftbquests.quest.QuestObjectBase; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.quest.TeamData; +import net.minecraft.core.UUIDUtil; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import java.util.Date; import java.util.UUID; public class ProgressChange { - private final BaseQuestFile file; + public static StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_LONG, ProgressChange::getOriginId, + ByteBufCodecs.BOOL, ProgressChange::shouldReset, + UUIDUtil.STREAM_CODEC, ProgressChange::getPlayerId, + ByteBufCodecs.BOOL, ProgressChange::shouldNotify, + ProgressChange::createServerSide + ); + private final Date date; private final QuestObjectBase origin; private final UUID playerId; private boolean reset; private boolean notifications; - public ProgressChange(BaseQuestFile file, QuestObjectBase origin, UUID playerId) { - this.file = file; + public ProgressChange(QuestObjectBase origin, UUID playerId) { this.origin = origin; this.playerId = playerId; this.date = new Date(); @@ -27,20 +35,11 @@ public ProgressChange(BaseQuestFile file, QuestObjectBase origin, UUID playerId) notifications = false; } - public ProgressChange(BaseQuestFile f, FriendlyByteBuf buffer) { - file = f; - date = new Date(); - origin = file.getBase(buffer.readLong()); - reset = buffer.readBoolean(); - playerId = buffer.readUUID(); - notifications = buffer.readBoolean(); - } - - public void write(FriendlyByteBuf buffer) { - buffer.writeLong(origin == null ? 0L : origin.id); - buffer.writeBoolean(reset); - buffer.writeUUID(playerId); - buffer.writeBoolean(notifications); + public static ProgressChange createServerSide(long origin, boolean reset, UUID playerId, boolean notifications) { + ProgressChange pc = new ProgressChange(ServerQuestFile.INSTANCE.getBase(origin), playerId); + pc.reset = reset; + pc.notifications = notifications; + return pc; } public void maybeForceProgress(UUID teamId) { @@ -75,4 +74,8 @@ public ProgressChange withNotifications() { public boolean shouldNotify() { return notifications; } + + private long getOriginId() { + return origin == null ? 0L : origin.id; + } } diff --git a/common/src/main/java/dev/ftb/mods/ftbquests/util/TextUtils.java b/common/src/main/java/dev/ftb/mods/ftbquests/util/TextUtils.java index e13532c52..9ba268f3d 100644 --- a/common/src/main/java/dev/ftb/mods/ftbquests/util/TextUtils.java +++ b/common/src/main/java/dev/ftb/mods/ftbquests/util/TextUtils.java @@ -3,6 +3,7 @@ import com.google.gson.JsonParseException; import dev.ftb.mods.ftblibrary.util.client.ClientTextComponentUtils; import net.minecraft.ChatFormatting; +import net.minecraft.core.HolderLookup; import net.minecraft.network.chat.Component; import java.util.regex.Pattern; @@ -17,15 +18,15 @@ public class TextUtils { * @param str the raw string to parse * @return a component, which could be the error message if parsing failed */ - public static Component parseRawText(String str) { + public static Component parseRawText(String str, HolderLookup.Provider provider) { return JSON_TEXT_PATTERN.matcher(str).find() ? - deserializeRawJsonText(str) : + deserializeRawJsonText(str, provider) : ClientTextComponentUtils.parse(str); } - private static Component deserializeRawJsonText(String raw) { + private static Component deserializeRawJsonText(String raw, HolderLookup.Provider provider) { try { - return Component.Serializer.fromJson(raw); + return Component.Serializer.fromJson(raw, provider); } catch (JsonParseException e) { return Component.literal("ERROR: " + e.getMessage()).withStyle(ChatFormatting.RED); } 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 ed628f694..944b91c3e 100644 --- a/common/src/main/resources/assets/ftbquests/lang/en_us.json +++ b/common/src/main/resources/assets/ftbquests/lang/en_us.json @@ -79,7 +79,7 @@ "ftbquests.task_title": "Task Title", "ftbquests.title.tooltip": "Custom title", "ftbquests.icon": "Icon", - "ftbquests.icon.tooltip": "Custom icon", + "ftbquests.icon.tooltip": "Custom icon\nLeft-click: select an item\nRight-click: select a texture", "ftbquests.tags": "Tags", "ftbquests.tags.tooltip": "Used for themes and KubeJS events", "ftbquests.completion_command": "Completion Command", @@ -334,12 +334,10 @@ "ftbquests.task.ftbquests.item.convert_tag": "Convert to '%s' Tag Filter", "ftbquests.task.ftbquests.item.select_tag": "Select an Item Tag", "ftbquests.task.ftbquests.item.only_from_crafting": "Only Detect From Crafting", - "ftbquests.task.ftbquests.item.match_nbt": "Match NBT", - "ftbquests.task.ftbquests.item.match_nbt.tooltip": "Default: item must be in 'itemfilters:check_nbt' item tag\nFalse: never check NBT\nTrue: always check NBT", + "ftbquests.task.ftbquests.item.match_components": "Match Data Components", + "ftbquests.task.ftbquests.item.match_components.tooltip": "None: ignore item component data\nFuzzy: only check data components present in the filter stack\nStrict: filter stack data components must match the checked item exactly", "ftbquests.task.ftbquests.item.task_screen_only": "Only From Task Screen", "ftbquests.task.ftbquests.item.task_screen_only.tooltip": "When true, items may only be submitted by piping into a Task Screen\nOnly applies when Consume Items is true for this task.", - "ftbquests.task.ftbquests.item.weak_nbt_match": "Weak NBT Match", - "ftbquests.task.ftbquests.item.weak_nbt_match.tooltip": "False: exact NBT match required\nTrue: NBT fields in the checked item but not in the filter item won't cause a match failure", "ftbquests.task.ftbquests.fluid": "Fluid", "ftbquests.task.ftbquests.fluid.fluid": "Fluid", "ftbquests.task.ftbquests.fluid.fluid_nbt": "Fluid NBT", @@ -524,6 +522,7 @@ "commands.ftbquests.weigh_from_emc.text": "Changed item reward weight based on EMC in %s", "commands.ftbquests.export_rewards_to_chest.usage": "/ftbquests export_rewards_to_chest ", "commands.ftbquests.export_rewards_to_chest.text": "Exported %s / %s items from '%s'", + "ftbquests.ui": "User Interface", "ftbquests.ui.old_scroll_wheel": "Old-style Scroll Wheel Behavior", "ftbquests.ui.old_scroll_wheel.tooltip": "When false, scroll wheel scrolls up & down: hold Shift to pan, Ctrl to zoom\nWhen true, scroll wheel only zooms (1.19 and earlier behavior)", "ftbquests.ui.pinned_quests_pos": "Pinned Quests Panel Position", @@ -531,8 +530,20 @@ "ftbquests.ui.pinned_quests_inset_x.tooltip": "Inset is toward center of screen.\nIgnored if X pos is center.", "ftbquests.ui.pinned_quests_inset_y": "Pinned Quests Panel Y Inset", "ftbquests.ui.pinned_quests_inset_y.tooltip": "Inset is toward center of screen.\nIgnored if Y pos is center.", + "ftbquests.xlate": "Translations", + "ftbquests.xlate.editing_locale": "Locale Override", + "ftbquests.xlate.editing_locale.tooltip": "The language used for editing FTB Quests text: title text for chapters, quests, tasks and reward tables, subtitles for chapters and quests, and quest description text.\nIf empty, use the current Minecraft language setting.", + "ftbquests.xlate.hilite_missing": "Highlight missing translations", + "ftbquests.xlate.hilite_missing.tooltip": "If true, quest text with no translation in the current locale is highlighted when in edit mode and an Editing Locale other than 'en_us'", "ftbquests.objects": "%d object(s)", "ftbquests.message.configurator_bound": "Configurator Bound: %s", "ftbquests.message.task_screen_inaccessible": "Task Screen is not accessible from here!", - "ftbquests.message.missing_task_screen": "Task Screen is missing!" + "ftbquests.message.missing_task_screen": "Task Screen is missing!", + "ftbquests.message.missing_xlate_1": "No translation for %s in current locale '%s'", + "ftbquests.message.missing_xlate_2": "Falling back to 'en_us'", + "ftbquests.translation_key.title": "title", + "ftbquests.translation_key.quest_subtitle": "quest subtitle", + "ftbquests.translation_key.chapter_subtitle": "chapter subtitle", + "ftbquests.translation_key.quest_desc": "quest description", + "ftbquests.gui.use_default_lang": "[Use Default Language]" } diff --git a/common/src/main/resources/data/ftbquests/loot_tables/blocks/loot_crate_opener.json b/common/src/main/resources/data/ftbquests/loot_tables/blocks/loot_crate_opener.json index 341a1f02a..0a015b1ff 100644 --- a/common/src/main/resources/data/ftbquests/loot_tables/blocks/loot_crate_opener.json +++ b/common/src/main/resources/data/ftbquests/loot_tables/blocks/loot_crate_opener.json @@ -10,15 +10,11 @@ "name": "ftbquests:loot_crate_opener", "functions": [ { - "function": "minecraft:copy_nbt", - "source": "block_entity", - "ops": [ - { - "source": "Items", - "target": "BlockEntityTag.Items", - "op": "replace" - } - ] + "function": "minecraft:copy_components", + "include": [ + "ftbquests:loot_crate_items" + ], + "source": "block_entity" } ] } diff --git a/common/src/main/resources/data/ftbquests/loot_tables/blocks/screen_1.json b/common/src/main/resources/data/ftbquests/loot_tables/blocks/screen_1.json index 85bad9749..7702f458a 100644 --- a/common/src/main/resources/data/ftbquests/loot_tables/blocks/screen_1.json +++ b/common/src/main/resources/data/ftbquests/loot_tables/blocks/screen_1.json @@ -11,40 +11,11 @@ "name": "ftbquests:screen_1", "functions": [ { - "function": "minecraft:copy_nbt", - "source": "block_entity", - "ops": [ - { - "source": "TaskID", - "target": "BlockEntityTag.TaskID", - "op": "replace" - }, - { - "source": "Skin", - "target": "BlockEntityTag.Skin", - "op": "replace" - }, - { - "source": "Indestructible", - "target": "BlockEntityTag.Indestructible", - "op": "replace" - }, - { - "source": "InputOnly", - "target": "BlockEntityTag.InputOnly", - "op": "replace" - }, - { - "source": "InputModeIcon", - "target": "BlockEntityTag.InputModeIcon", - "op": "replace" - }, - { - "source": "TextShadow", - "target": "BlockEntityTag.TextShadow", - "op": "replace" - } - ] + "function": "minecraft:copy_components", + "include": [ + "ftbquests:task_screen_saved" + ], + "source": "block_entity" } ] } diff --git a/common/src/main/resources/data/ftbquests/loot_tables/blocks/screen_3.json b/common/src/main/resources/data/ftbquests/loot_tables/blocks/screen_3.json index 705d7f67e..68577189b 100644 --- a/common/src/main/resources/data/ftbquests/loot_tables/blocks/screen_3.json +++ b/common/src/main/resources/data/ftbquests/loot_tables/blocks/screen_3.json @@ -11,40 +11,11 @@ "name": "ftbquests:screen_3", "functions": [ { - "function": "minecraft:copy_nbt", - "source": "block_entity", - "ops": [ - { - "source": "TaskID", - "target": "BlockEntityTag.TaskID", - "op": "replace" - }, - { - "source": "Skin", - "target": "BlockEntityTag.Skin", - "op": "replace" - }, - { - "source": "Indestructible", - "target": "BlockEntityTag.Indestructible", - "op": "replace" - }, - { - "source": "InputOnly", - "target": "BlockEntityTag.InputOnly", - "op": "replace" - }, - { - "source": "InputModeIcon", - "target": "BlockEntityTag.InputModeIcon", - "op": "replace" - }, - { - "source": "TextShadow", - "target": "BlockEntityTag.TextShadow", - "op": "replace" - } - ] + "function": "minecraft:copy_components", + "include": [ + "ftbquests:task_screen_saved" + ], + "source": "block_entity" } ] } diff --git a/common/src/main/resources/data/ftbquests/loot_tables/blocks/screen_5.json b/common/src/main/resources/data/ftbquests/loot_tables/blocks/screen_5.json index 6840e13c9..2f30ee38a 100644 --- a/common/src/main/resources/data/ftbquests/loot_tables/blocks/screen_5.json +++ b/common/src/main/resources/data/ftbquests/loot_tables/blocks/screen_5.json @@ -11,40 +11,11 @@ "name": "ftbquests:screen_5", "functions": [ { - "function": "minecraft:copy_nbt", - "source": "block_entity", - "ops": [ - { - "source": "TaskID", - "target": "BlockEntityTag.TaskID", - "op": "replace" - }, - { - "source": "Skin", - "target": "BlockEntityTag.Skin", - "op": "replace" - }, - { - "source": "Indestructible", - "target": "BlockEntityTag.Indestructible", - "op": "replace" - }, - { - "source": "InputOnly", - "target": "BlockEntityTag.InputOnly", - "op": "replace" - }, - { - "source": "InputModeIcon", - "target": "BlockEntityTag.InputModeIcon", - "op": "replace" - }, - { - "source": "TextShadow", - "target": "BlockEntityTag.TextShadow", - "op": "replace" - } - ] + "function": "minecraft:copy_components", + "include": [ + "ftbquests:task_screen_saved" + ], + "source": "block_entity" } ] } diff --git a/common/src/main/resources/data/ftbquests/loot_tables/blocks/screen_7.json b/common/src/main/resources/data/ftbquests/loot_tables/blocks/screen_7.json index d4fa8d9e8..034ad25d9 100644 --- a/common/src/main/resources/data/ftbquests/loot_tables/blocks/screen_7.json +++ b/common/src/main/resources/data/ftbquests/loot_tables/blocks/screen_7.json @@ -11,40 +11,11 @@ "name": "ftbquests:screen_7", "functions": [ { - "function": "minecraft:copy_nbt", - "source": "block_entity", - "ops": [ - { - "source": "TaskID", - "target": "BlockEntityTag.TaskID", - "op": "replace" - }, - { - "source": "Skin", - "target": "BlockEntityTag.Skin", - "op": "replace" - }, - { - "source": "Indestructible", - "target": "BlockEntityTag.Indestructible", - "op": "replace" - }, - { - "source": "InputOnly", - "target": "BlockEntityTag.InputOnly", - "op": "replace" - }, - { - "source": "InputModeIcon", - "target": "BlockEntityTag.InputModeIcon", - "op": "replace" - }, - { - "source": "TextShadow", - "target": "BlockEntityTag.TextShadow", - "op": "replace" - } - ] + "function": "minecraft:copy_components", + "include": [ + "ftbquests:task_screen_saved" + ], + "source": "block_entity" } ] } diff --git a/common/src/main/resources/data/ftbquests/recipes/book.json b/common/src/main/resources/data/ftbquests/recipes/book.json index 5edcf6594..f0637ed46 100644 --- a/common/src/main/resources/data/ftbquests/recipes/book.json +++ b/common/src/main/resources/data/ftbquests/recipes/book.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shapeless", "group": "ftbquests:book", "result": { - "item": "ftbquests:book", + "id": "ftbquests:book", "count": 1 }, "ingredients": [ @@ -10,7 +10,7 @@ "item": "minecraft:book" }, { - "tag": "forge:stone" + "tag": "c:stones" } ] } \ No newline at end of file diff --git a/common/src/main/resources/data/ftbquests/recipes/loot_crate_opener.json b/common/src/main/resources/data/ftbquests/recipes/loot_crate_opener.json index 8d643d0c7..fe2778020 100644 --- a/common/src/main/resources/data/ftbquests/recipes/loot_crate_opener.json +++ b/common/src/main/resources/data/ftbquests/recipes/loot_crate_opener.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "group": "ftbquests:loot_crate_opener", "result": { - "item": "ftbquests:loot_crate_opener", + "id": "ftbquests:loot_crate_opener", "count": 1 }, "pattern": [ diff --git a/common/src/main/resources/data/ftbquests/recipes/screen_1.json b/common/src/main/resources/data/ftbquests/recipes/screen_1.json index 4ed43287e..acf779394 100644 --- a/common/src/main/resources/data/ftbquests/recipes/screen_1.json +++ b/common/src/main/resources/data/ftbquests/recipes/screen_1.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "group": "ftbquests:screen", "result": { - "item": "ftbquests:screen_1" + "id": "ftbquests:screen_1" }, "pattern": [ "CCC", diff --git a/common/src/main/resources/data/ftbquests/recipes/screen_3.json b/common/src/main/resources/data/ftbquests/recipes/screen_3.json index 299e23d8d..ada95df48 100644 --- a/common/src/main/resources/data/ftbquests/recipes/screen_3.json +++ b/common/src/main/resources/data/ftbquests/recipes/screen_3.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "group": "ftbquests:screen", "result": { - "item": "ftbquests:screen_3" + "id": "ftbquests:screen_3" }, "pattern": [ "CCC", diff --git a/common/src/main/resources/data/ftbquests/recipes/screen_5.json b/common/src/main/resources/data/ftbquests/recipes/screen_5.json index b8df8aeed..f85b76c8f 100644 --- a/common/src/main/resources/data/ftbquests/recipes/screen_5.json +++ b/common/src/main/resources/data/ftbquests/recipes/screen_5.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "group": "ftbquests:screen", "result": { - "item": "ftbquests:screen_5" + "id": "ftbquests:screen_5" }, "pattern": [ "3C3", diff --git a/common/src/main/resources/data/ftbquests/recipes/screen_7.json b/common/src/main/resources/data/ftbquests/recipes/screen_7.json index 78b2fe295..bc11b50b9 100644 --- a/common/src/main/resources/data/ftbquests/recipes/screen_7.json +++ b/common/src/main/resources/data/ftbquests/recipes/screen_7.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "group": "ftbquests:screen", "result": { - "item": "ftbquests:screen_7" + "id": "ftbquests:screen_7" }, "pattern": [ "353", diff --git a/common/src/main/resources/data/ftbquests/recipes/task_screen_configurator.json b/common/src/main/resources/data/ftbquests/recipes/task_screen_configurator.json index dc946f4c6..9ad3d7277 100644 --- a/common/src/main/resources/data/ftbquests/recipes/task_screen_configurator.json +++ b/common/src/main/resources/data/ftbquests/recipes/task_screen_configurator.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "group": "ftbquests:screen", "result": { - "item": "ftbquests:task_screen_configurator" + "id": "ftbquests:task_screen_configurator" }, "pattern": [ " S", diff --git a/common/src/main/resources/ftbquests-common.mixins.json b/common/src/main/resources/ftbquests-common.mixins.json new file mode 100644 index 000000000..35b18c60d --- /dev/null +++ b/common/src/main/resources/ftbquests-common.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "package": "dev.ftb.mods.ftbquests.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "ServerGamePacketListenerImplMixin" + ], + "client": [ + ], + "injectors": { + "defaultRequire": 1 + }, + "minVersion": "0.8" +} \ No newline at end of file diff --git a/fabric/src/main/java/dev/ftb/mods/ftbquests/block/fabric/FabricTaskScreenBlockEntity.java b/fabric/src/main/java/dev/ftb/mods/ftbquests/block/fabric/FabricTaskScreenBlockEntity.java index 50be7ab3b..4d8cf0bd9 100644 --- a/fabric/src/main/java/dev/ftb/mods/ftbquests/block/fabric/FabricTaskScreenBlockEntity.java +++ b/fabric/src/main/java/dev/ftb/mods/ftbquests/block/fabric/FabricTaskScreenBlockEntity.java @@ -166,7 +166,9 @@ public boolean isResourceBlank() { @Override public FluidVariant getResource() { - return getTask() instanceof FluidTask fluidTask ? FluidVariant.of(fluidTask.getFluid(), fluidTask.getFluidNBT()) : getBlankVariant(); + return getTask() instanceof FluidTask fluidTask ? + FluidVariant.of(fluidTask.getFluid(), fluidTask.getFluidDataComponentPatch()) : + getBlankVariant(); } @Override diff --git a/fabric/src/main/java/dev/ftb/mods/ftbquests/fabric/FTBQuestsFabric.java b/fabric/src/main/java/dev/ftb/mods/ftbquests/fabric/FTBQuestsFabric.java index 21a25361c..5dd87276c 100644 --- a/fabric/src/main/java/dev/ftb/mods/ftbquests/fabric/FTBQuestsFabric.java +++ b/fabric/src/main/java/dev/ftb/mods/ftbquests/fabric/FTBQuestsFabric.java @@ -3,7 +3,6 @@ import dev.ftb.mods.ftblibrary.icon.Icon; import dev.ftb.mods.ftbquests.FTBQuests; import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; -import dev.ftb.mods.ftbquests.block.entity.FTBQuestsBlockEntities; import dev.ftb.mods.ftbquests.block.fabric.FabricLootCrateOpenerBlockEntity; import dev.ftb.mods.ftbquests.block.fabric.FabricTaskScreenAuxBlockEntity; import dev.ftb.mods.ftbquests.block.fabric.FabricTaskScreenBlockEntity; @@ -11,6 +10,7 @@ import dev.ftb.mods.ftbquests.command.QuestObjectArgument; import dev.ftb.mods.ftbquests.quest.task.TaskTypes; import dev.ftb.mods.ftbquests.quest.task.TechRebornEnergyTask; +import dev.ftb.mods.ftbquests.registry.ModBlockEntityTypes; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v2.ArgumentTypeRegistry; import net.fabricmc.fabric.api.transfer.v1.fluid.FluidStorage; @@ -31,28 +31,28 @@ public void onInitialize() { TechRebornEnergyTask.TYPE = TaskTypes.register(new ResourceLocation(FTBQuestsAPI.MOD_ID, "tech_reborn_energy"), TechRebornEnergyTask::new, () -> Icon.getIcon(TechRebornEnergyTask.EMPTY_TEXTURE.toString()).combineWith(Icon.getIcon(TechRebornEnergyTask.FULL_TEXTURE.toString()))); ItemStorage.SIDED.registerForBlockEntity( - ((blockEntity, direction) -> ((FabricTaskScreenBlockEntity) blockEntity).getItemStorage()), FTBQuestsBlockEntities.CORE_TASK_SCREEN.get() + ((blockEntity, direction) -> ((FabricTaskScreenBlockEntity) blockEntity).getItemStorage()), ModBlockEntityTypes.CORE_TASK_SCREEN.get() ); ItemStorage.SIDED.registerForBlockEntity( - ((blockEntity, direction) -> ((FabricTaskScreenAuxBlockEntity) blockEntity).getItemStorage()), FTBQuestsBlockEntities.AUX_TASK_SCREEN.get() + ((blockEntity, direction) -> ((FabricTaskScreenAuxBlockEntity) blockEntity).getItemStorage()), ModBlockEntityTypes.AUX_TASK_SCREEN.get() ); FluidStorage.SIDED.registerForBlockEntity( - ((blockEntity, direction) -> ((FabricTaskScreenBlockEntity) blockEntity).getFluidStorage()), FTBQuestsBlockEntities.CORE_TASK_SCREEN.get() + ((blockEntity, direction) -> ((FabricTaskScreenBlockEntity) blockEntity).getFluidStorage()), ModBlockEntityTypes.CORE_TASK_SCREEN.get() ); FluidStorage.SIDED.registerForBlockEntity( - ((blockEntity, direction) -> ((FabricTaskScreenAuxBlockEntity) blockEntity).getFluidStorage()), FTBQuestsBlockEntities.AUX_TASK_SCREEN.get() + ((blockEntity, direction) -> ((FabricTaskScreenAuxBlockEntity) blockEntity).getFluidStorage()), ModBlockEntityTypes.AUX_TASK_SCREEN.get() ); EnergyStorage.SIDED.registerForBlockEntity( - ((blockEntity, direction) -> ((FabricTaskScreenBlockEntity) blockEntity).getEnergyStorage()), FTBQuestsBlockEntities.CORE_TASK_SCREEN.get() + ((blockEntity, direction) -> ((FabricTaskScreenBlockEntity) blockEntity).getEnergyStorage()), ModBlockEntityTypes.CORE_TASK_SCREEN.get() ); EnergyStorage.SIDED.registerForBlockEntity( - ((blockEntity, direction) -> ((FabricTaskScreenAuxBlockEntity) blockEntity).getEnergyStorage()), FTBQuestsBlockEntities.AUX_TASK_SCREEN.get() + ((blockEntity, direction) -> ((FabricTaskScreenAuxBlockEntity) blockEntity).getEnergyStorage()), ModBlockEntityTypes.AUX_TASK_SCREEN.get() ); ItemStorage.SIDED.registerForBlockEntity( - ((blockEntity, direction) -> ((FabricLootCrateOpenerBlockEntity) blockEntity).getItemStorage()), FTBQuestsBlockEntities.LOOT_CRATE_OPENER.get() + ((blockEntity, direction) -> ((FabricLootCrateOpenerBlockEntity) blockEntity).getItemStorage()), ModBlockEntityTypes.LOOT_CRATE_OPENER.get() ); } } diff --git a/fabric/src/main/java/dev/ftb/mods/ftbquests/net/fabric/FTBQuestsNetHandlerImpl.java b/fabric/src/main/java/dev/ftb/mods/ftbquests/net/fabric/FTBQuestsNetHandlerImpl.java deleted file mode 100644 index 51f05eeb0..000000000 --- a/fabric/src/main/java/dev/ftb/mods/ftbquests/net/fabric/FTBQuestsNetHandlerImpl.java +++ /dev/null @@ -1,16 +0,0 @@ -package dev.ftb.mods.ftbquests.net.fabric; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Internal -public class FTBQuestsNetHandlerImpl { - public static void writeItemType(FriendlyByteBuf buffer, ItemStack stack) { - buffer.writeItem(stack); - } - - public static ItemStack readItemType(FriendlyByteBuf buffer) { - return buffer.readItem(); - } -} diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 9dba08979..9b40eb1cf 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -20,6 +20,7 @@ ] }, "mixins": [ + "ftbquests-common.mixins.json", "ftbquests-fabric.mixins.json" ], "depends": { diff --git a/gradle.properties b/gradle.properties index 93d3c3754..bdfb619f2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,10 +4,10 @@ org.gradle.daemon=false # Mod mod_id=ftbquests archives_base_name=ftb-quests -minecraft_version=1.20.4 +minecraft_version=1.20.6 # Build time -mod_version=2004.2.1 +mod_version=2006.1.0 maven_group=dev.ftb.mods mod_author=FTB Team @@ -17,16 +17,16 @@ curseforge_id_fabric=438496 curseforge_type=release # Cross env -forge_version=49.0.31 +forge_version=50.0.9 forge_loader_version=49 -neoforge_version=20.4.196 +neoforge_version=20.6.116 neoforge_loader_version=1 -fabric_api_version=0.96.4+1.20.4 -fabric_loader_version=0.15.7 -architectury_version=11.1.17 +fabric_api_version=0.99.0+1.20.6 +fabric_loader_version=0.15.10 +architectury_version=12.1.3 -ftb_library_version=2004.2.2 -ftb_teams_version=2004.1.2 +ftb_library_version=2006.1.2 +ftb_teams_version=2006.1.0 # Optional deps teamreborn_energy_version=3.0.0 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e411586a5..48c0a02ca 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 9c1491ec6..18e60fd84 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -44,7 +44,7 @@ apply from: "https://raw.githubusercontent.com/FTBTeam/mods-meta/main/gradle/ext processResources { inputs.property "version", project.version - filesMatching("META-INF/mods.toml") { + filesMatching("META-INF/neoforge.mods.toml") { expand "version": project.version, "archversion": project.architectury_version, "neoforgeversion": project.neoforge_version, diff --git a/neoforge/src/main/java/dev/ftb/mods/ftbquests/block/neoforge/NeoForgeTaskScreenBlockEntity.java b/neoforge/src/main/java/dev/ftb/mods/ftbquests/block/neoforge/NeoForgeTaskScreenBlockEntity.java index 1a9ae0c74..fce85dc88 100644 --- a/neoforge/src/main/java/dev/ftb/mods/ftbquests/block/neoforge/NeoForgeTaskScreenBlockEntity.java +++ b/neoforge/src/main/java/dev/ftb/mods/ftbquests/block/neoforge/NeoForgeTaskScreenBlockEntity.java @@ -8,6 +8,7 @@ import dev.ftb.mods.ftbquests.quest.task.ItemTask; import dev.ftb.mods.ftbquests.quest.task.neoforge.ForgeEnergyTask; import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; @@ -15,7 +16,6 @@ import net.neoforged.neoforge.fluids.FluidStack; import net.neoforged.neoforge.fluids.capability.IFluidHandler; import net.neoforged.neoforge.items.IItemHandler; -import net.neoforged.neoforge.items.ItemHandlerHelper; import org.jetbrains.annotations.NotNull; public class NeoForgeTaskScreenBlockEntity extends TaskScreenBlockEntity { @@ -66,7 +66,7 @@ public int getSlots() { public ItemStack getStackInSlot(int slot) { // slot 1 is always empty - see above return getTask() instanceof ItemTask itemTask && slot == 0 ? - ItemHandlerHelper.copyStackWithSize(itemTask.getItemStack(), (int) Math.min(getCachedTeamData().getProgress(itemTask), itemTask.getItemStack().getMaxStackSize())) : + itemTask.getItemStack().copyWithCount((int) Math.min(getCachedTeamData().getProgress(itemTask), itemTask.getItemStack().getMaxStackSize())) : ItemStack.EMPTY; } @@ -91,7 +91,7 @@ public ItemStack extractItem(int slot, int count, boolean simulate) { if (!simulate) { data.addProgress(itemTask, -itemsRemoved); } - return ItemHandlerHelper.copyStackWithSize(itemTask.getItemStack(), itemsRemoved); + return itemTask.getItemStack().copyWithCount(itemsRemoved); } } return ItemStack.EMPTY; @@ -131,9 +131,12 @@ public int getTankCapacity(int tank) { @Override public boolean isFluidValid(int tank, @NotNull FluidStack fluidStack) { - return tank == 0 && getTask() instanceof FluidTask fluidTask - && fluidTask.getFluid() == fluidStack.getFluid() - && (fluidTask.getFluidNBT() == null || fluidTask.getFluidNBT().equals(fluidStack.getTag())); + if (tank != 0 || !(getTask() instanceof FluidTask fluidTask)) { + return false; + } + // amount is not important here + FluidStack taskFluidStack = new FluidStack(Holder.direct(fluidTask.getFluid()), 1000, fluidTask.getFluidDataComponentPatch()); + return FluidStack.isSameFluidSameComponents(taskFluidStack, fluidStack); } @Override @@ -171,7 +174,8 @@ public FluidStack drain(int maxDrain, FluidAction fluidAction) { data.addProgress(task, -toTake); } FluidStack result = new FluidStack(task.getFluid(), (int) toTake); - if (task.getFluidNBT() != null) result.setTag(task.getFluidNBT().copy()); + result.applyComponents(task.getFluidDataComponents()); +// if (task.getFluidDataComponents() != null) result.setTag(task.getFluidDataComponents().copy()); return result; } } diff --git a/neoforge/src/main/java/dev/ftb/mods/ftbquests/neoforge/FTBQuestsNeoForge.java b/neoforge/src/main/java/dev/ftb/mods/ftbquests/neoforge/FTBQuestsNeoForge.java index b7124e367..5d5576cfb 100644 --- a/neoforge/src/main/java/dev/ftb/mods/ftbquests/neoforge/FTBQuestsNeoForge.java +++ b/neoforge/src/main/java/dev/ftb/mods/ftbquests/neoforge/FTBQuestsNeoForge.java @@ -4,15 +4,14 @@ import dev.ftb.mods.ftbquests.FTBQuests; import dev.ftb.mods.ftbquests.api.FTBQuestsAPI; import dev.ftb.mods.ftbquests.api.FTBQuestsTags; -import dev.ftb.mods.ftbquests.block.entity.FTBQuestsBlockEntities; import dev.ftb.mods.ftbquests.block.neoforge.NeoForgeLootCrateOpenerBlockEntity; import dev.ftb.mods.ftbquests.block.neoforge.NeoForgeTaskScreenAuxBlockEntity; import dev.ftb.mods.ftbquests.block.neoforge.NeoForgeTaskScreenBlockEntity; -import dev.ftb.mods.ftbquests.item.FTBQuestsItems; import dev.ftb.mods.ftbquests.quest.ServerQuestFile; import dev.ftb.mods.ftbquests.quest.task.TaskTypes; import dev.ftb.mods.ftbquests.quest.task.neoforge.ForgeEnergyTask; -import net.minecraft.resources.ResourceLocation; +import dev.ftb.mods.ftbquests.registry.ModBlockEntityTypes; +import dev.ftb.mods.ftbquests.registry.ModItems; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.item.ItemEntity; @@ -28,6 +27,7 @@ import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.common.util.FakePlayer; import net.neoforged.neoforge.event.entity.living.LivingDropsEvent; import java.util.Iterator; @@ -39,7 +39,7 @@ public FTBQuestsNeoForge(IEventBus modEventBus) { FTBQuests quests = new FTBQuests(); - ForgeEnergyTask.TYPE = TaskTypes.register(new ResourceLocation(FTBQuestsAPI.MOD_ID, "forge_energy"), ForgeEnergyTask::new, + ForgeEnergyTask.TYPE = TaskTypes.register(FTBQuestsAPI.rl("forge_energy"), ForgeEnergyTask::new, () -> Icon.getIcon(ForgeEnergyTask.EMPTY_TEXTURE.toString()).combineWith(Icon.getIcon(ForgeEnergyTask.FULL_TEXTURE.toString()))); modEventBus.addListener(event -> quests.setup()); @@ -72,43 +72,40 @@ private static void livingDrops(LivingDropsEvent event) { } private static void dropsEvent(LivingDropsEvent event) { - if (!(event.getEntity() instanceof ServerPlayer player)) { - return; - } - - // FakePlayers no longer exist in forge? Cool, moving on. There used to be a player instanceof FakePlayer check here. - if (player.level().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY)) { - return; - } + if (!(event.getEntity() instanceof ServerPlayer player) + || player instanceof FakePlayer + || player.level().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY)) { + return; + } - Iterator iterator = event.getDrops().iterator(); + Iterator iterator = event.getDrops().iterator(); while (iterator.hasNext()) { ItemEntity drop = iterator.next(); ItemStack stack = drop.getItem(); - if (stack.getItem() == FTBQuestsItems.BOOK.get() && player.addItem(stack)) { + if (stack.getItem() == ModItems.BOOK.get() && player.addItem(stack)) { iterator.remove(); } } } public static void registerCaps(RegisterCapabilitiesEvent event) { - event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, FTBQuestsBlockEntities.CORE_TASK_SCREEN.get(), + event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntityTypes.CORE_TASK_SCREEN.get(), (be, side) -> ((NeoForgeTaskScreenBlockEntity) be).getItemHandler()); - event.registerBlockEntity(Capabilities.FluidHandler.BLOCK, FTBQuestsBlockEntities.CORE_TASK_SCREEN.get(), + event.registerBlockEntity(Capabilities.FluidHandler.BLOCK, ModBlockEntityTypes.CORE_TASK_SCREEN.get(), (be, side) -> ((NeoForgeTaskScreenBlockEntity) be).getFluidHandler()); - event.registerBlockEntity(Capabilities.EnergyStorage.BLOCK, FTBQuestsBlockEntities.CORE_TASK_SCREEN.get(), + event.registerBlockEntity(Capabilities.EnergyStorage.BLOCK, ModBlockEntityTypes.CORE_TASK_SCREEN.get(), (be, side) -> ((NeoForgeTaskScreenBlockEntity) be).getEnergyHandler()); - event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, FTBQuestsBlockEntities.AUX_TASK_SCREEN.get(), + event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntityTypes.AUX_TASK_SCREEN.get(), (be, side) -> ((NeoForgeTaskScreenAuxBlockEntity) be).getItemHandler()); - event.registerBlockEntity(Capabilities.FluidHandler.BLOCK, FTBQuestsBlockEntities.AUX_TASK_SCREEN.get(), + event.registerBlockEntity(Capabilities.FluidHandler.BLOCK, ModBlockEntityTypes.AUX_TASK_SCREEN.get(), (be, side) -> ((NeoForgeTaskScreenAuxBlockEntity) be).getFluidHandler()); - event.registerBlockEntity(Capabilities.EnergyStorage.BLOCK, FTBQuestsBlockEntities.AUX_TASK_SCREEN.get(), + event.registerBlockEntity(Capabilities.EnergyStorage.BLOCK, ModBlockEntityTypes.AUX_TASK_SCREEN.get(), (be, side) -> ((NeoForgeTaskScreenAuxBlockEntity) be).getEnergyHandler()); - event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, FTBQuestsBlockEntities.LOOT_CRATE_OPENER.get(), + event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntityTypes.LOOT_CRATE_OPENER.get(), (be, side) -> ((NeoForgeLootCrateOpenerBlockEntity) be).getLootCrateHandler()); } } diff --git a/neoforge/src/main/java/dev/ftb/mods/ftbquests/net/neoforge/FTBQuestsNetHandlerImpl.java b/neoforge/src/main/java/dev/ftb/mods/ftbquests/net/neoforge/FTBQuestsNetHandlerImpl.java deleted file mode 100644 index 92d80d0db..000000000 --- a/neoforge/src/main/java/dev/ftb/mods/ftbquests/net/neoforge/FTBQuestsNetHandlerImpl.java +++ /dev/null @@ -1,16 +0,0 @@ -package dev.ftb.mods.ftbquests.net.neoforge; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Internal -public class FTBQuestsNetHandlerImpl { - public static void writeItemType(FriendlyByteBuf buffer, ItemStack stack) { - buffer.writeItem(stack); - } - - public static ItemStack readItemType(FriendlyByteBuf buffer) { - return buffer.readItem(); - } -} diff --git a/neoforge/src/main/resources/META-INF/mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml similarity index 95% rename from neoforge/src/main/resources/META-INF/mods.toml rename to neoforge/src/main/resources/META-INF/neoforge.mods.toml index 99f2bff7b..e41f6fed7 100644 --- a/neoforge/src/main/resources/META-INF/mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -3,6 +3,9 @@ loaderVersion = "[${neoforgeloaderversion},)" issueTrackerURL = "https://github.com/FTBTeam/FTB-Mods-Issues/issues" license = "All Rights Reserved" +[[mixins]] +config = "ftbquests-common.mixins.json" + [[mods]] modId = "ftbquests" version = "${version}" diff --git a/settings.gradle b/settings.gradle index c80d0e1df..bc8050a75 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,11 +1,11 @@ pluginManagement { repositories { - maven { url "https://maven.creeperhost.net/" } maven { url "https://maven.architectury.dev/" } + maven { url "https://maven.creeperhost.net/" } gradlePluginPortal() } } -include "common", "fabric", "forge", "neoforge" +include "common", "fabric", /*"forge",*/ "neoforge" -rootProject.name = 'FTB-Quests-1.20.4' +rootProject.name = 'FTB-Quests-1.20.6'